ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDEwYzIxNGQuLjgzMjQzNmUgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtOTY2LDYgKzk2Niw3IEBACiBFOiBwZW5iZXJnQGNzLmhlbHNpbmtpLmZpCiBXOiBodHRwOi8vd3d3LmNzLmhlbHNpbmtpLmZpL3UvcGVuYmVyZy8KIEQ6IFZhcmlvdXMga2VybmVsIGhhY2tzLCBmaXhlcywgYW5kIGNsZWFudXBzLgorRDogU2xhYiBhbGxvY2F0b3JzCiBTOiBGaW5sYW5kCiAKIE46IERhdmlkIEVuZ2VicmV0c2VuCkBAIC0xOTM5LDggKzE5NDAsOCBAQAogTjogQ2hyaXN0b3BoIExhbWV0ZXIKIEU6IGNocmlzdG9waEBsYW1ldGVyLmNvbQogRDogRGlnaWJvYXJkIFBDL1hlIGFuZCBQQy9YaSwgRGlnaWJvYXJkIEVQQ0EKLUQ6IEVhcmx5IHByb3RvY29sIGZpbHRlciBmb3IgYnJpZGdpbmcgY29kZQotRDogQnVnIGZpeGVzCitEOiBOVU1BIHN1cHBvcnQsIFNsYWIgYWxsb2NhdG9ycywgUGFnZSBtaWdyYXRpb24KK0Q6IFNjYWxhYmlsaXR5LCBUaW1lIHN1YnN5c3RlbQogCiBOOiBQYXVsIExhdWZlcgogRTogcGF1bEBsYXVmZXJuZXQuY29tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbAppbmRleCBlYjQyYmY5Li5lYzdjNDk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKQEAgLTcwNCwxNCArNzA0LDIzIEBACiAKICAgPGNoYXB0ZXIgaWQ9InNwbGljZSI+CiAgICAgICA8dGl0bGU+c3BsaWNlIEFQSTwvdGl0bGU+Ci0gIDxwYXJhPikKKyAgPHBhcmE+CiAJc3BsaWNlIGlzIGEgbWV0aG9kIGZvciBtb3ZpbmcgYmxvY2tzIG9mIGRhdGEgYXJvdW5kIGluc2lkZSB0aGUKLQlrZXJuZWwsIHdpdGhvdXQgY29udGludWFsbHkgdHJhbnNmZXJyaW5nIGl0IGJldHdlZW4gdGhlIGtlcm5lbAorCWtlcm5lbCwgd2l0aG91dCBjb250aW51YWxseSB0cmFuc2ZlcnJpbmcgdGhlbSBiZXR3ZWVuIHRoZSBrZXJuZWwKIAlhbmQgdXNlciBzcGFjZS4KICAgPC9wYXJhPgogIUlpbmNsdWRlL2xpbnV4L3NwbGljZS5oCiAhRmZzL3NwbGljZS5jCiAgIDwvY2hhcHRlcj4KIAorICA8Y2hhcHRlciBpZD0icGlwZXMiPgorICAgICAgPHRpdGxlPnBpcGVzIEFQSTwvdGl0bGU+CisgIDxwYXJhPgorCVBpcGUgaW50ZXJmYWNlcyBhcmUgYWxsIGZvciBpbi1rZXJuZWwgKGJ1aWx0aW4gaW1hZ2UpIHVzZS4KKwlUaGV5IGFyZSBub3QgZXhwb3J0ZWQgZm9yIHVzZSBieSBtb2R1bGVzLgorICA8L3BhcmE+CishSWluY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKKyFGZnMvcGlwZS5jCisgIDwvY2hhcHRlcj4KIAogPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9iYXJyaWVyLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svYmFycmllci50eHQKaW5kZXggN2QyNzlmMi4uMmMyZjI0ZjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svYmFycmllci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iYXJyaWVyLnR4dApAQCAtNzksOSArNzksOSBAQAogdXNlZCB0byBpbmRpY2F0ZSB0aGUgd2hvbGUgc2VxdWVuY2Ugb2YgcGVyZm9ybWluZyBiYXJyaWVyIHJlcXVlc3RzCiBpbmNsdWRpbmcgZHJhaW5pbmcgYW5kIGZsdXNoaW5nLgogCi10eXBlZGVmIHZvaWQgKHByZXBhcmVfZmx1c2hfZm4pKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKTsKK3R5cGVkZWYgdm9pZCAocHJlcGFyZV9mbHVzaF9mbikoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSk7CiAKLWludCBibGtfcXVldWVfb3JkZXJlZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHVuc2lnbmVkIG9yZGVyZWQsCitpbnQgYmxrX3F1ZXVlX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIG9yZGVyZWQsCiAJCSAgICAgIHByZXBhcmVfZmx1c2hfZm4gKnByZXBhcmVfZmx1c2hfZm4pOwogCiBAcQkJCTogdGhlIHF1ZXVlIGluIHF1ZXN0aW9uCkBAIC05Miw3ICs5Miw3IEBACiBGb3IgZXhhbXBsZSwgU0NTSSBkaXNrIGRyaXZlcidzIHByZXBhcmVfZmx1c2hfZm4gbG9va3MgbGlrZSB0aGUKIGZvbGxvd2luZy4KIAotc3RhdGljIHZvaWQgc2RfcHJlcGFyZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIHNkX3ByZXBhcmVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKIAlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAppbmRleCAzYWRhYWNlLi44YWYzOTJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CkBAIC03NDAsMTIgKzc0MCwxMiBAQAogcXVldWVpbmcgKHR5cGljYWxseSBrbm93biBhcyB0YWdnZWQgY29tbWFuZCBxdWV1ZWluZyksIGllIG1hbmFnZSBtb3JlIHRoYW4KIG9uZSBvdXRzdGFuZGluZyBjb21tYW5kIG9uIGEgcXVldWUgYXQgYW55IGdpdmVuIHRpbWUuCiAKLQlibGtfcXVldWVfaW5pdF90YWdzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGRlcHRoKQorCWJsa19xdWV1ZV9pbml0X3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBkZXB0aCkKIAogCUluaXRpYWxpemUgaW50ZXJuYWwgY29tbWFuZCB0YWdnaW5nIHN0cnVjdHVyZXMgZm9yIGEgbWF4aW11bQogCWRlcHRoIG9mICdkZXB0aCcuCiAKLQlibGtfcXVldWVfZnJlZV90YWdzKChyZXF1ZXN0X3F1ZXVlX3QgKnEpCisJYmxrX3F1ZXVlX2ZyZWVfdGFncygoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiAKIAlUZWFyZG93biB0YWcgaW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlIHF1ZXVlLiBUaGlzIHdpbGwgYmUgZG9uZQogCWF1dG9tYXRpY2FsbHkgYnkgYmxvY2sgaWYgYmxrX3F1ZXVlX2NsZWFudXAoKSBpcyBjYWxsZWQgb24gYSBxdWV1ZQpAQCAtNzU0LDcgKzc1NCw3IEBACiBUaGUgYWJvdmUgYXJlIGluaXRpYWxpemF0aW9uIGFuZCBleGl0IG1hbmFnZW1lbnQsIHRoZSBtYWluIGhlbHBlcnMgZHVyaW5nCiBub3JtYWwgb3BlcmF0aW9ucyBhcmU6CiAKLQlibGtfcXVldWVfc3RhcnRfdGFnKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorCWJsa19xdWV1ZV9zdGFydF90YWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIAogCVN0YXJ0IHRhZ2dlZCBvcGVyYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4gQSBmcmVlIHRhZyBudW1iZXIgYmV0d2VlbgogCTAgYW5kICdkZXB0aCcgaXMgYXNzaWduZWQgdG8gdGhlIHJlcXVlc3QgKHJxLT50YWcgaG9sZHMgdGhpcyBudW1iZXIpLApAQCAtNzYyLDcgKzc2Miw3IEBACiAJZm9yIHRoaXMgcXVldWUgaXMgYWxyZWFkeSBhY2hpZXZlZCAob3IgaWYgdGhlIHRhZyB3YXNuJ3Qgc3RhcnRlZCBmb3IKIAlzb21lIG90aGVyIHJlYXNvbiksIDEgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSAwIGlzIHJldHVybmVkLgogCi0JYmxrX3F1ZXVlX2VuZF90YWcocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCisJYmxrX3F1ZXVlX2VuZF90YWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIAogCUVuZCB0YWdnZWQgb3BlcmF0aW9uIG9uIHRoaXMgcmVxdWVzdC4gJ3JxJyBpcyByZW1vdmVkIGZyb20gdGhlIGludGVybmFsCiAJYm9vayBrZWVwaW5nIHN0cnVjdHVyZXMuCkBAIC03ODEsNyArNzgxLDcgQEAKIHRoZSBoYXJkd2FyZSBhbmQgc29mdHdhcmUgYmxvY2sgcXVldWUgYW5kIGVuYWJsZSB0aGUgZHJpdmVyIHRvIHNhbmVseSByZXN0YXJ0CiBhbGwgdGhlIG91dHN0YW5kaW5nIHJlcXVlc3RzLiBUaGVyZSdzIGEgdGhpcmQgaGVscGVyIHRvIGRvIHRoYXQ6CiAKLQlibGtfcXVldWVfaW52YWxpZGF0ZV90YWdzKHJlcXVlc3RfcXVldWVfdCAqcSkKKwlibGtfcXVldWVfaW52YWxpZGF0ZV90YWdzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogCiAJQ2xlYXIgdGhlIGludGVybmFsIGJsb2NrIHRhZyBxdWV1ZSBhbmQgcmUtYWRkIGFsbCB0aGUgcGVuZGluZyByZXF1ZXN0cwogCXRvIHRoZSByZXF1ZXN0IHF1ZXVlLiBUaGUgZHJpdmVyIHdpbGwgcmVjZWl2ZSB0aGVtIGFnYWluIG9uIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9yZXF1ZXN0LnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svcmVxdWVzdC50eHQKaW5kZXggNzU5MjRlMi4uZmZmNThhY2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svcmVxdWVzdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ibG9jay9yZXF1ZXN0LnR4dApAQCAtODMsNiArODMsNiBAQAogCiBzdHJ1Y3QgYmlvICpiaW90YWlsCQlEQkkJTGFzdCBiaW8gaW4gcmVxdWVzdAogCi1yZXF1ZXN0X3F1ZXVlX3QgKnEJCURCCVJlcXVlc3QgcXVldWUgdGhpcyByZXF1ZXN0IGJlbG9uZ3MgdG8KK3N0cnVjdCByZXF1ZXN0X3F1ZXVlICpxCQlEQglSZXF1ZXN0IHF1ZXVlIHRoaXMgcmVxdWVzdCBiZWxvbmdzIHRvCiAKIHN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsCQlCCVJlcXVlc3QgbGlzdCB0aGlzIHJlcXVlc3QgY2FtZSBmcm9tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggYzE3NWVlZC4uYTQzZDI4NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMjExLDIyICsyMTEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJcmVhZF9kZXZfY2hhcnMoKSwgcmVhZF9jb25mX2RhdGF7LF9scG19KCkgKHMzOTAgY29tbW9uIEkvTyBsYXllcikKLVdoZW46CURlY2VtYmVyIDIwMDcKLVdoeToJVGhlc2UgZnVuY3Rpb25zIGFyZSBhIGxlZnRvdmVyIGZyb20gMi40IHRpbWVzLiBUaGV5IGhhdmUgc2V2ZXJhbAotCXByb2JsZW1zOgotCS0gRHVwbGljYXRpb24gb2YgY2hlY2tzIHRoYXQgYXJlIGRvbmUgaW4gdGhlIGRldmljZSBkcml2ZXIncwotCSAgaW50ZXJydXB0IGhhbmRsZXIKLQktIGNvbW1vbiBJL08gbGF5ZXIgY2FuJ3QgZG8gZGV2aWNlIHNwZWNpZmljIGVycm9yIHJlY292ZXJ5Ci0JLSBkZXZpY2UgZHJpdmVyIGNhbid0IGJlIG5vdGlmaWVkIGZvciBjb25kaXRpb25zIGhhcHBlbmluZyBkdXJpbmcKLQkgIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24KLQlEZXZpY2UgZHJpdmVycyBzaG91bGQgaXNzdWUgdGhlIHJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBhbmQgcmVhZAotCWNvbmZpZ3VyYXRpb24gZGF0YSBjY3dzIGFuZCBkbyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgaGFuZGxpbmcKLQl0aGVtc2VsdmVzLgotV2hvOglDb3JuZWxpYSBIdWNrIDxjb3JuZWxpYS5odWNrQGRlLmlibS5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglpMmMtaXhwMjAwMCwgaTJjLWl4cDR4eCBhbmQgc2N4MjAwX2kyYyBkcml2ZXJzCiBXaGVuOglTZXB0ZW1iZXIgMjAwNwogV2h5OglPYnNvbGV0ZS4gVGhlIG5ldyBpMmMtZ3BpbyBkcml2ZXIgcmVwbGFjZXMgYWxsIGhhcmR3YXJlLXNwZWNpZmljCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dAppbmRleCAyMThhODY1Li42YmMyYmEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKQEAgLTE0OCw3ICsxNDgsNyBAQAogaXNzdWVzIGluY2x1ZGluZyB3aXJlLU9SIGFuZCBvdXRwdXQgbGF0ZW5jaWVzLgogCiBUaGUgZ2V0L3NldCBjYWxscyBoYXZlIG5vIGVycm9yIHJldHVybnMgYmVjYXVzZSAiaW52YWxpZCBHUElPIiBzaG91bGQgaGF2ZQotYmVlbiByZXBvcnRlZCBlYXJsaWVyIGluIGdwaW9fc2V0X2RpcmVjdGlvbigpLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdCBhbGwKK2JlZW4gcmVwb3J0ZWQgZWFybGllciBmcm9tIGdwaW9fZGlyZWN0aW9uXyooKS4gIEhvd2V2ZXIsIG5vdGUgdGhhdCBub3QgYWxsCiBwbGF0Zm9ybXMgY2FuIHJlYWQgdGhlIHZhbHVlIG9mIG91dHB1dCBwaW5zOyB0aG9zZSB0aGF0IGNhbid0IHNob3VsZCBhbHdheXMKIHJldHVybiB6ZXJvLiAgQWxzbywgdXNpbmcgdGhlc2UgY2FsbHMgZm9yIEdQSU9zIHRoYXQgY2FuJ3Qgc2FmZWx5IGJlIGFjY2Vzc2VkCiB3aXRob3V0IHNsZWVwaW5nIChzZWUgYmVsb3cpIGlzIGFuIGVycm9yLgpAQCAtMjM5LDcgKzIzOSw3IEBACiBUaG9zZSByZXR1cm4gZWl0aGVyIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBpbiB0aGUgb3RoZXIgbmFtZXNwYWNlLCBvcgogZWxzZSBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgaWYgdGhlIG1hcHBpbmcgY2FuJ3QgYmUgZG9uZS4gIChGb3IgZXhhbXBsZSwKIHNvbWUgR1BJT3MgY2FuJ3QgdXNlZCBhcyBJUlFzLikgIEl0IGlzIGFuIHVuY2hlY2tlZCBlcnJvciB0byB1c2UgYSBHUElPCi1udW1iZXIgdGhhdCBoYXNuJ3QgYmVlbiBtYXJrZWQgYXMgYW4gaW5wdXQgdXNpbmcgZ3Bpb19zZXRfZGlyZWN0aW9uKCksIG9yCitudW1iZXIgdGhhdCB3YXNuJ3Qgc2V0IHVwIGFzIGFuIGlucHV0IHVzaW5nIGdwaW9fZGlyZWN0aW9uX2lucHV0KCksIG9yCiB0byB1c2UgYW4gSVJRIG51bWJlciB0aGF0IGRpZG4ndCBvcmlnaW5hbGx5IGNvbWUgZnJvbSBncGlvX3RvX2lycSgpLgogCiBUaGVzZSB0d28gbWFwcGluZyBjYWxscyBhcmUgZXhwZWN0ZWQgdG8gY29zdCBvbiB0aGUgb3JkZXIgb2YgYSBzaW5nbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9zdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2lvc3RhdHMudHh0CmluZGV4IDA5YTFiYWYuLmI5NjNjM2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9zdGF0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dApAQCAtNzksNyArNzksNyBAQAogICAgIG1lYXN1cmVkIGZyb20gX19tYWtlX3JlcXVlc3QoKSB0byBlbmRfdGhhdF9yZXF1ZXN0X2xhc3QoKSkuCiBGaWVsZCAgOSAtLSAjIG9mIEkvT3MgY3VycmVudGx5IGluIHByb2dyZXNzCiAgICAgVGhlIG9ubHkgZmllbGQgdGhhdCBzaG91bGQgZ28gdG8gemVyby4gSW5jcmVtZW50ZWQgYXMgcmVxdWVzdHMgYXJlCi0gICAgZ2l2ZW4gdG8gYXBwcm9wcmlhdGUgcmVxdWVzdF9xdWV1ZV90IGFuZCBkZWNyZW1lbnRlZCBhcyB0aGV5IGZpbmlzaC4KKyAgICBnaXZlbiB0byBhcHByb3ByaWF0ZSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSBhbmQgZGVjcmVtZW50ZWQgYXMgdGhleSBmaW5pc2guCiBGaWVsZCAxMCAtLSAjIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBkb2luZyBJL09zCiAgICAgVGhpcyBmaWVsZCBpcyBpbmNyZWFzZXMgc28gbG9uZyBhcyBmaWVsZCA5IGlzIG5vbnplcm8uCiBGaWVsZCAxMSAtLSB3ZWlnaHRlZCAjIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBkb2luZyBJL09zCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2phX0pQL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi9qYV9KUC9IT1dUTwppbmRleCBiMjQ0NmEwLi45ZjA4ZGFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2phX0pQL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vamFfSlAvSE9XVE8KQEAgLTEsMjMgKzEsMjQgQEAKLU5PVEU6Ci1UaGlzIGlzIEphcGFuZXNlIHRyYW5zbGF0ZWQgdmVyc2lvbiBvZiAiRG9jdW1lbnRhdGlvbi9IT1dUTyIuCi1UaGlzIG9uZSBpcyBtYWludGFpbmVkIGJ5IFRzdWdpa2F6dSBTaGliYXRhIDx0c2hpYmF0YUBhYi5qcC5uZWMuY29tPgotYW5kIEpGIFByb2plY3QgdGVhbSA8d3d3LmxpbnV4Lm9yLmpwL0pGPi4KLUlmIHlvdSBmaW5kIGRpZmZlcmVuY2Ugd2l0aCBvcmlnaW5hbCBmaWxlIG9yIHByb2JsZW0gaW4gdHJhbnNsYXRpb24sCi1wbGVhc2UgY29udGFjdCBtYWludGFpbmVyIG9mIHRoaXMgZmlsZSBvciBKRiBwcm9qZWN0Lgor77u/Tk9URToKK1RoaXMgaXMgYSB2ZXJzaW9uIG9mIERvY3VtZW50YXRpb24vSE9XVE8gdHJhbnNsYXRlZCBpbnRvIEphcGFuZXNlLgorVGhpcyBkb2N1bWVudCBpcyBtYWludGFpbmVkIGJ5IFRzdWdpa2F6dSBTaGliYXRhIDx0c2hpYmF0YUBhYi5qcC5uZWMuY29tPgorYW5kIHRoZSBKRiBQcm9qZWN0IHRlYW0gPHd3dy5saW51eC5vci5qcC9KRj4uCitJZiB5b3UgZmluZCBhbnkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZG9jdW1lbnQgYW5kIHRoZSBvcmlnaW5hbCBmaWxlCitvciBhIHByb2JsZW0gd2l0aCB0aGUgdHJhbnNsYXRpb24sCitwbGVhc2UgY29udGFjdCB0aGUgbWFpbnRhaW5lciBvZiB0aGlzIGZpbGUgb3IgSkYgcHJvamVjdC4KIAotUGxlYXNlIGFsc28gbm90ZSB0aGF0IHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIGVhc2llciB0byByZWFkIGZvciBub24KLUVuZ2xpc2ggbmF0aXZlcyBhbmQgbm90IHRvIGJlIGludGVuZGVkIHRvIGZvcmsuIFNvLCBpZiB5b3UgaGF2ZSBhbnkKLWNvbW1lbnRzIG9yIHVwZGF0ZXMgb2YgdGhpcyBmaWxlLCBwbGVhc2UgdHJ5IHRvIHVwZGF0ZSBPcmlnaW5hbChFbmdsaXNoKQotZmlsZSBhdCBmaXJzdC4KK1BsZWFzZSBhbHNvIG5vdGUgdGhhdCB0aGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gYmUgZWFzaWVyIHRvIHJlYWQKK2ZvciBub24gRW5nbGlzaCAocmVhZDogSmFwYW5lc2UpIHNwZWFrZXJzIGFuZCBpcyBub3QgaW50ZW5kZWQgYXMgYQorZm9yay4gU28gaWYgeW91IGhhdmUgYW55IGNvbW1lbnRzIG9yIHVwZGF0ZXMgZm9yIHRoaXMgZmlsZSwgcGxlYXNlIHRyeQordG8gdXBkYXRlIHRoZSBvcmlnaW5hbCBFbmdsaXNoIGZpbGUgZmlyc3QuCiAKLUxhc3QgVXBkYXRlZDogMjAwNy8wNi8wNAorTGFzdCBVcGRhdGVkOiAyMDA3LzA3LzE4CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiDjgZPjgozjga/jgIEKLWxpbnV4LTIuNi4yMS9Eb2N1bWVudGF0aW9uL0hPV1RPCitsaW51eC0yLjYuMjIvRG9jdW1lbnRhdGlvbi9IT1dUTwog44Gu5ZKM6Kiz44Gn44GZ44CCCiAKIOe/u+ios+Wbo+S9k++8miBKRiDjg5fjg63jgrjjgqfjgq/jg4ggPCBodHRwOi8vd3d3LmxpbnV4Lm9yLmpwL0pGLyA+Ci3nv7voqLPml6XvvJogMjAwNy8wNi8wNAor57+76Kiz5pel77yaIDIwMDcvMDcvMTYKIOe/u+ios+iAhe+8miBUc3VnaWthenUgU2hpYmF0YSA8dHNoaWJhdGEgYXQgYWIgZG90IGpwIGRvdCBuZWMgZG90IGNvbT4KIOagoeato+iAhe+8miDmnb7lgInjgZXjgpMgPG5iaC0tbWF0cyBhdCBuaWZ0eSBkb3QgY29tPgogICAgICAgICAg5bCP5p6XIOmbheWFuOOBleOCkyAoTWFzYW5vcmkgS29iYXlhc2kpIDx6YXAwMzIxNiBhdCBuaWZ0eSBkb3QgbmUgZG90IGpwPgpAQCAtNTIsNiArNTMsNyBAQAog44G+44Gf44CB44GT44Gu44Kz44Of44Ol44OL44OG44Kj44GM44Gq44Gc5LuK44GG44G+44GP44G+44KP44Gj44Gm44GE44KL44Gu44GL44Go44GE44GG55CG55Sx44Gu5LiA6YOo44KCCiDoqqzmmI7jgZfjgojjgYbjgajoqabjgb/jgabjgYTjgb7jgZnjgIIKIAorCiDjgqvjg7zjg43jg6vjga8g5bCR6YeP44Gu44Ki44O844Kt44OG44Kv44OB44Oj5L6d5a2Y6YOo5YiG44GM44Ki44K744Oz44OW44Oq6KiA6Kqe44Gn5pu444GL44KM44Gm44GE44KLCiDku6XlpJbjga/lpKfpg6jliIbjga8gQyDoqIDoqp7jgafmm7jjgYvjgozjgabjgYTjgb7jgZnjgIJD6KiA6Kqe44KS44KI44GP55CG6Kej44GX44Gm44GE44KL44GT44Go44Gv44Kr44O8CiDjg43jg6vplovnmbrogIXjgavjga/lv4XopoHjgafjgZnjgILjgqLjg7zjgq3jg4bjgq/jg4Hjg6PlkJHjgZHjga7kvY7jg6zjg5njg6vpg6jliIbjga7plovnmbrjgpLjgZnjgovjga4KQEAgLTE0MSw2ICsxNDMsNyBAQAogICAgICDjgZPjgozjgonjga7jg6vjg7zjg6vjgavlvpPjgYjjgbDjgYbjgb7jgY/jgYTjgY/jgZPjgajjgpLkv53oqLzjgZnjgovjgZPjgajjgafjga/jgYLjgorjgb7jgZvjgpMKICAgICAg44GMICjjgZnjgbnjgabjga7jg5Hjg4Pjg4Hjga/lhoXlrrnjgajjgrnjgr/jgqTjg6vjgavjgaTjgYTjgabnsr7mn7vjgpLlj5fjgZHjgovjga7jgacp44CBCiAgICAgIOODq+ODvOODq+OBq+W+k+OCj+OBquOBkeOCjOOBsOmWk+mBleOBhOOBquOBj+OBhuOBvuOBj+OBhOOBi+OBquOBhOOBp+OBl+OCh+OBhuOAggorCiAgICAgIOOBk+OBruS7luOBq+ODkeODg+ODgeOCkuS9nOOCi+aWueazleOBq+OBpOOBhOOBpuOBruOCiOOBj+OBp+OBjeOBn+iomOi/sOOBry0KIAogCSJUaGUgUGVyZmVjdCBQYXRjaCIKQEAgLTM2MCw0NCArMzYzLDQyIEBACiAKICAgZ2l0IOODhOODquODvC0KICAgICAtIEtidWlsZCDjga7plovnmbrjg4Tjg6rjg7zjgIFTYW0gUmF2bmJvcmcgPHNhbUByYXZuYm9yZy5vcmc+Ci0Ja2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3NhbS9rYnVpbGQuZ2l0CisJZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zYW0va2J1aWxkLmdpdAogCiAgICAgLSBBQ1BJIOOBrumWi+eZuuODhOODquODvOOAgSBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+Ci0Ja2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2xlbmIvbGludXgtYWNwaS0yLjYuZ2l0CisJZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9sZW5iL2xpbnV4LWFjcGktMi42LmdpdAogCiAgICAgLSBCbG9jayDjga7plovnmbrjg4Tjg6rjg7zjgIFKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgotCWtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9heGJvZS9saW51eC0yLjYtYmxvY2suZ2l0CisJZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9heGJvZS9saW51eC0yLjYtYmxvY2suZ2l0CiAKICAgICAtIERSTSDjga7plovnmbrjg4Tjg6rjg7zjgIFEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYWlybGllZC9kcm0tMi42LmdpdAorCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYWlybGllZC9kcm0tMi42LmdpdAogCiAgICAgLSBpYTY0IOOBrumWi+eZuuODhOODquODvOOAgVRvbnkgTHVjayA8dG9ueS5sdWNrQGludGVsLmNvbT4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYWVnbC9saW51eC0yLjYuZ2l0Ci0KLSAgICAtIGllZWUxMzk0IOOBrumWi+eZuuODhOODquODvOOAgUpvZHkgTWNJbnR5cmUgPHNjam9keUBtb2Rlcm5kdWNrLmNvbT4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc2Nqb2R5L2llZWUxMzk0LmdpdAorCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYWVnbC9saW51eC0yLjYuZ2l0CiAKICAgICAtIGluZmluaWJhbmQsIFJvbGFuZCBEcmVpZXIgPHJvbGFuZGRAY2lzY28uY29tPgotCWtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9yb2xhbmQvaW5maW5pYmFuZC5naXQKKwlnaXQua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3JvbGFuZC9pbmZpbmliYW5kLmdpdAogCiAgICAgLSBsaWJhdGEsIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamdhcnppay9saWJhdGEtZGV2LmdpdAorCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamdhcnppay9saWJhdGEtZGV2LmdpdAogCiAgICAgLSDjg43jg4Pjg4jjg6/jg7zjgq/jg4njg6njgqTjg5AsIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamdhcnppay9uZXRkZXYtMi42LmdpdAorCWdpdC5rZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamdhcnppay9uZXRkZXYtMi42LmdpdAogCiAgICAgLSBwY21jaWEsIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLm5ldD4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvYnJvZG8vcGNtY2lhLTIuNi5naXQKKwlnaXQua2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2Jyb2RvL3BjbWNpYS0yLjYuZ2l0CiAKICAgICAtIFNDU0ksIEphbWVzIEJvdHRvbWxleSA8SmFtZXMuQm90dG9tbGV5QFN0ZWVsRXllLmNvbT4KLQlrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamVqYi9zY3NpLW1pc2MtMi42LmdpdAotCi0gIOOBneOBruS7luOBriBnaXQg44Kr44O844ON44Or44OE44Oq44O844GvIGh0dHA6Ly9rZXJuZWwub3JnL2dpdCDjgavkuIDopqfooajjgYzjgYLjgorjgb4KLSAg44GZ44CCCisJZ2l0Lmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qZWpiL3Njc2ktbWlzYy0yLjYuZ2l0CiAKICAgcXVpbHQg44OE44Oq44O8LQogICAgIC0gVVNCLCBQQ0kg44OJ44Op44Kk44OQ44Kz44Ki44GoIEkyQywgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KIAlrZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2dyZWdraC9ncmVna2gtMi42LworICAgIC0geDg2LTY0IOOBqCBpMzg2IOOBruS7sumWkyBBbmRpIEtsZWVuIDxha0BzdXNlLmRlPgorCisgIOOBneOBruS7luOBruOCq+ODvOODjeODq+ODhOODquODvOOBryBodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvIOOBqCBNQUlOVEFJTkVSUyDjg5XjgqEKKyAg44Kk44Or44Gr5LiA6Kan6KGo44GM44GC44KK44G+44GZ44CCCiAKIOODkOOCsOODrOODneODvOODiAogLS0tLS0tLS0tLS0tLQpAQCAtNTA4LDYgKzUwOSw3IEBACiDjgZvjgpMq44CC5Y2Y44Gr6Ieq5YiG44Gu44OR44OD44OB44Gr5a++44GX44Gm5oyH5pGY44GV44KM44Gf5ZWP6aGM44KS5YWo44Gm5L+u5q2j44GX44Gm5YaN6YCB44GZ44KM44GwCiDjgYTjgYTjga7jgafjgZnjgIIKIAorCiDjgqvjg7zjg43jg6vjgrPjg5/jg6Xjg4vjg4bjgqPjgajkvIHmpa3ntYTnuZTjga7jgaHjgYzjgYQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTU3Nyw2ICs1NzksNyBAQAogICAg44GL44GX44CBNTAw6KGM44Gu44OR44OD44OB44Gv44CB5q2j44GX44GE44GT44Go44KS44Os44OT44Ol44O844GZ44KL44Gu44Gr5pWw5pmC6ZaT44GL44GL44KL44GL44KCCiAgICDjgZfjgozjgb7jgZvjgpMo5pmC6ZaT44Gv44OR44OD44OB44Gu44K144Kk44K644Gq44Gp44Gr44KI44KK5oyH5pWw6Zai5pWw44Gr5q+U5L6L44GX44Gm44GL44GL44KK44G+CiAgICDjgZkpCisKICAgIOWwj+OBleOBhOODkeODg+ODgeOBr+S9leOBi+OBguOBo+OBn+OBqOOBjeOBq+ODh+ODkOODg+OCsOOCguOBqOOBpuOCguewoeWNmOOBq+OBquOCiuOBvuOBmeOAguODkeODgwogICAg44OB44KSMeWAizHlgIvlj5bjgorpmaTjgY/jga7jga/jgIHjgajjgabjgoLlpKfjgY3jgarjg5Hjg4Pjg4HjgpLlvZPjgabjgZ/lvozjgaso44GL44Gk44CB5L2V44GL44GKCiAgICDjgYvjgZfjgY/jgarjgaPjgZ/lvozjgacp6Kej5YmW44GZ44KL44Gu44Gr5q+U44G544KM44Gw44Go44Gm44KC57Ch5Y2Y44Gn44GZ44CCCkBAIC01OTEsNiArNTk0LDcgQEAKICAgICAgICAg44GG44CC5YWI55Sf44Gv57Ch5r2U44Gq5pyA6auY44Gu6Kej44KS44G/44Gf44GE44Gu44Gn44GZ44CC6Imv44GE55Sf5b6S44Gv44GT44KM44KS55+l44Gj44GmCiAgICAgICAgIOOBiuOCiuOAgeOBneOBl+OBpuacgOe1guino+OBruWJjeOBruS4remWk+S9nOalreOCkuaPkOWHuuOBmeOCi+OBk+OBqOOBr+axuuOBl+OBpuOBquOBhOOBruOBpwogICAgICAgICDjgZkiCisKICAgICAgICAg44Kr44O844ON44Or6ZaL55m644Gn44KC44GT44KM44Gv5ZCM44GY44Gn44GZ44CC44Oh44Oz44OG44OK44O86YGU44Go44Os44OT44Ol44O844Ki6YGU44Gv44CBCiAgICAgICAgIOWVj+mhjOOCkuino+axuuOBmeOCi+ino+OBruiDjOW+jOOBq+OBquOCi+aAneiAg+ODl+ODreOCu+OCueOCkuOBv+OBn+OBhOOBqOOBr+aAneOBhOOBvuOBm+OCk+OAggogICAgICAgICDlvbzjgonjga/ljZjntJTjgafjgYLjgZbjgoTjgYvjgarop6Pmsbrmlrnms5XjgpLjgb/jgZ/jgYTjga7jgafjgZnjgIIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vamFfSlAvc3RhYmxlX2FwaV9ub25zZW5zZS50eHQgYi9Eb2N1bWVudGF0aW9uL2phX0pQL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CmluZGV4IGIzZjJiMjcuLjc2NTNiNWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vamFfSlAvc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9qYV9KUC9zdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMSwxNyArMSwxNyBAQAogTk9URToKLVRoaXMgaXMgYSBKYXBhbmVzZSB0cmFuc2xhdGVkIHZlcnNpb24gb2YKLSJEb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0Ii4KLVRoaXMgb25lIGlzIG1haW50YWluZWQgYnkKLUlLRURBLCBNdW5laGlybyA8bS1pa2VkYUBkcy5qcC5uZWMuY29tPgotYW5kIEpGIFByb2plY3QgdGVhbSA8aHR0cDovL3d3dy5saW51eC5vci5qcC9KRi8+LgotSWYgeW91IGZpbmQgZGlmZmVyZW5jZSB3aXRoIG9yaWdpbmFsIGZpbGUgb3IgcHJvYmxlbSBpbiB0cmFuc2xhdGlvbiwKK1RoaXMgaXMgYSB2ZXJzaW9uIG9mIERvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQgaW50byBKYXBhbmVzZS4KK1RoaXMgZG9jdW1lbnQgaXMgbWFpbnRhaW5lZCBieSBJS0VEQSwgTXVuZWhpcm8gPG0taWtlZGFAZHMuanAubmVjLmNvbT4KK2FuZCB0aGUgSkYgUHJvamVjdCB0ZWFtIDxodHRwOi8vd3d3LmxpbnV4Lm9yLmpwL0pGLz4uCitJZiB5b3UgZmluZCBhbnkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZG9jdW1lbnQgYW5kIHRoZSBvcmlnaW5hbCBmaWxlCitvciBhIHByb2JsZW0gd2l0aCB0aGUgdHJhbnNsYXRpb24sCiBwbGVhc2UgY29udGFjdCB0aGUgbWFpbnRhaW5lciBvZiB0aGlzIGZpbGUgb3IgSkYgcHJvamVjdC4KIAotUGxlYXNlIGFsc28gbm90ZSB0aGF0IHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIGVhc2llciB0byByZWFkIGZvciBub24KLUVuZ2xpc2ggbmF0aXZlcyBhbmQgbm90IHRvIGJlIGludGVuZGVkIHRvIGZvcmsuIFNvLCBpZiB5b3UgaGF2ZSBhbnkKLWNvbW1lbnRzIG9yIHVwZGF0ZXMgb2YgdGhpcyBmaWxlLCBwbGVhc2UgdHJ5IHRvIHVwZGF0ZQotT3JpZ2luYWwoRW5nbGlzaCkgZmlsZSBhdCBmaXJzdC4KK1BsZWFzZSBhbHNvIG5vdGUgdGhhdCB0aGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgdG8gYmUgZWFzaWVyIHRvIHJlYWQKK2ZvciBub24gRW5nbGlzaCAocmVhZDogSmFwYW5lc2UpIHNwZWFrZXJzIGFuZCBpcyBub3QgaW50ZW5kZWQgYXMgYQorZm9yay4gU28gaWYgeW91IGhhdmUgYW55IGNvbW1lbnRzIG9yIHVwZGF0ZXMgb2YgdGhpcyBmaWxlLCBwbGVhc2UgdHJ5Cit0byB1cGRhdGUgdGhlIG9yaWdpbmFsIEVuZ2xpc2ggZmlsZSBmaXJzdC4KIAorTGFzdCBVcGRhdGVkOiAyMDA3LzA3LzE4CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiDjgZPjgozjga/jgIEKIGxpbnV4LTIuNi4yMi1yYzQvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dCDjga7lkozoqLMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZmI4MGU5Zi4uMTE1NjY1MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTMwLDYgKzMwLDcgQEAKIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlOgogCiAJQUNQSQlBQ1BJIHN1cHBvcnQgaXMgZW5hYmxlZC4KKwlBR1AJQUdQIChBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0KSBpcyBlbmFibGVkLgogCUFMU0EJQUxTQSBzb3VuZCBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJQVBJQwlBUElDIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlBUE0JQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGlzIGVuYWJsZWQuCkBAIC0yMjcsNiArMjI4LDEyIEBACiAJCQl0byBhc3N1bWUgdGhhdCB0aGlzIG1hY2hpbmUncyBwbXRpbWVyIGxhdGNoZXMgaXRzIHZhbHVlCiAJCQlhbmQgYWx3YXlzIHJldHVybnMgZ29vZCB2YWx1ZXMuCiAKKwlhZ3A9CQlbQUdQXQorCQkJeyBvZmYgfCB0cnlfdW5zdXBwb3J0ZWQgfQorCQkJb2ZmOiBkaXNhYmxlIEFHUCBzdXBwb3J0CisJCQl0cnlfdW5zdXBwb3J0ZWQ6IHRyeSB0byBkcml2ZSB1bnN1cHBvcnRlZCBjaGlwc2V0cworCQkJCShtYXkgY3Jhc2ggY29tcHV0ZXIgb3IgY2F1c2UgZGF0YSBjb3JydXB0aW9uKQorCiAJZW5hYmxlX3RpbWVyX3Bpbl8xIFtpMzg2LHg4Ni02NF0KIAkJCUVuYWJsZSBQSU4gMSBvZiBBUElDIHRpbWVyCiAJCQlDYW4gYmUgdXNlZnVsIHRvIHdvcmsgYXJvdW5kIGNoaXBzZXQgYnVncwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24va29iamVjdC50eHQKaW5kZXggZTQ0ODU1NS4uOGVlNDllZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0CkBAIC0yNyw3ICsyNyw2IEBACiAtIGtvYmplY3RzCWEgc2ltcGxlIG9iamVjdC4KIC0ga3NldAkJYSBzZXQgb2Ygb2JqZWN0cyBvZiBhIGNlcnRhaW4gdHlwZS4KIC0ga3R5cGUJCWEgc2V0IG9mIGhlbHBlcnMgZm9yIG9iamVjdHMgb2YgYSBjb21tb24gdHlwZS4gCi0tIHN1YnN5c3RlbQlhIGNvbnRyb2xsaW5nIG9iamVjdCBmb3IgYSBudW1iZXIgb2Yga3NldHMuCiAKIAogVGhlIGtvYmplY3QgaW5mcmFzdHJ1Y3R1cmUgbWFpbnRhaW5zIGEgY2xvc2UgcmVsYXRpb25zaGlwIHdpdGggdGhlCkBAIC01NCwxMyArNTMsMTUgQEAKIDEuMiBEZWZpbml0aW9uCiAKIHN0cnVjdCBrb2JqZWN0IHsKKwljb25zdCBjaGFyCQkqIGtfbmFtZTsKIAljaGFyCQkJbmFtZVtLT0JKX05BTUVfTEVOXTsKLQlhdG9taWNfdAkJcmVmY291bnQ7CisJc3RydWN0IGtyZWYJCWtyZWY7CiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKIAlzdHJ1Y3Qga29iamVjdAkJKiBwYXJlbnQ7CiAJc3RydWN0IGtzZXQJCSoga3NldDsKIAlzdHJ1Y3Qga29ial90eXBlCSoga3R5cGU7Ci0Jc3RydWN0IGRlbnRyeQkJKiBkZW50cnk7CisJc3RydWN0IHN5c2ZzX2RpcmVudAkqIHNkOworCXdhaXRfcXVldWVfaGVhZF90CXBvbGw7CiB9OwogCiB2b2lkIGtvYmplY3RfaW5pdChzdHJ1Y3Qga29iamVjdCAqKTsKQEAgLTEzNyw4ICsxMzgsNyBAQAogYmVjb21lcyBpdHMgZG9taW5hbnQga3NldC4gCiAKIElmIGEga29iamVjdCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IG5vciBhIGRvbWluYW50IGtzZXQsIGl0cyBkaXJlY3RvcnkKLWlzIGNyZWF0ZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgc3lzZnMgcGFydGl0aW9uLiBUaGlzIHNob3VsZCBvbmx5Ci1oYXBwZW4gZm9yIGtvYmplY3RzIHRoYXQgYXJlIGVtYmVkZGVkIGluIGEgc3RydWN0IHN1YnN5c3RlbS4gCitpcyBjcmVhdGVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIHN5c2ZzIHBhcnRpdGlvbi4KIAogCiAKQEAgLTE1MCwxMCArMTUwLDEwIEBACiAKIAogc3RydWN0IGtzZXQgewotCXN0cnVjdCBzdWJzeXN0ZW0JKiBzdWJzeXM7CiAJc3RydWN0IGtvYmpfdHlwZQkqIGt0eXBlOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3Qga29iamVjdAkJa29iajsKKwlzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzCSogdWV2ZW50X29wczsKIH07CiAKIApAQCAtMTY5LDggKzE2OSw3IEBACiAKIAogVGhlIHR5cGUgdGhhdCB0aGUga29iamVjdHMgYXJlIGVtYmVkZGVkIGluIGlzIGRlc2NyaWJlZCBieSB0aGUga3R5cGUKLXBvaW50ZXIuIFRoZSBzdWJzeXN0ZW0gdGhhdCB0aGUga29iamVjdCBiZWxvbmdzIHRvIGlzIHBvaW50ZWQgdG8gYnkgdGhlCi1zdWJzeXMgcG9pbnRlci4gCitwb2ludGVyLgogCiBBIGtzZXQgY29udGFpbnMgYSBrb2JqZWN0IGl0c2VsZiwgbWVhbmluZyB0aGF0IGl0IG1heSBiZSByZWdpc3RlcmVkIGluCiB0aGUga29iamVjdCBoaWVyYXJjaHkgYW5kIGV4cG9ydGVkIHZpYSBzeXNmcy4gTW9yZSBpbXBvcnRhbnRseSwgdGhlCkBAIC0yMDksNiArMjA4LDU4IEBACiBrc2V0X2ZpbmRfb2JqKCkgbWF5IGJlIHVzZWQgdG8gbG9jYXRlIGEga29iamVjdCB3aXRoIGEgcGFydGljdWxhcgogbmFtZS4gVGhlIGtvYmplY3QsIGlmIGZvdW5kLCBpcyByZXR1cm5lZC4gCiAKK1RoZXJlIGFyZSBhbHNvIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCBuYW1lcyBwb2ludCB0byB0aGUgZm9ybWVybHkKK2V4aXN0aW5nICJzdHJ1Y3Qgc3Vic3lzdGVtIiwgd2hvc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiB0YWtlbiBvdmVyIGJ5Citrc2V0cy4KKworCitkZWNsX3N1YnN5cyhuYW1lLHR5cGUsdWV2ZW50X29wcykKKworRGVjbGFyZXMgYSBrc2V0IG5hbWVkICc8bmFtZT5fc3Vic3lzJyBvZiB0eXBlIDx0eXBlPiB3aXRoCit1ZXZlbnRfb3BzIDx1ZXZlbnRfb3BzPi4gRm9yIGV4YW1wbGUsCisKK2RlY2xfc3Vic3lzKGRldmljZXMsICZrdHlwZV9kZXZpY2UsICZkZXZpY2VfdWV2ZW50X29wcyk7CisKK2lzIGVxdWl2YWxlbnQgdG8gZG9pbmc6CisKK3N0cnVjdCBrc2V0IGRldmljZXNfc3Vic3lzID0geworICAgICAua29iaiA9IHsKKwkgICAubmFtZSA9ICJkZXZpY2VzIiwKKyAgICAgfSwKKyAgICAgLmt0eXBlID0gJmt0eXBlX2RldmljZXMsCisgICAgIC51ZXZlbnRfb3BzID0gJmRldmljZV91ZXZlbnRfb3BzLAorfTsKKworCitUaGUgb2JqZWN0cyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggYSBzdWJzeXN0ZW0gdGhhdCB1c2UgdGhlCitzdWJzeXN0ZW0ncyBkZWZhdWx0IGxpc3QgbXVzdCBoYXZlIHRoZWlyIGtzZXQgcHRyIHNldCBwcm9wZXJseS4gVGhlc2UKK29iamVjdHMgbWF5IGhhdmUgZW1iZWRkZWQga29iamVjdHMgb3Iga3NldHMuIFRoZQorZm9sbG93aW5nIGhlbHBlcnMgbWFrZSBzZXR0aW5nIHRoZSBrc2V0IGVhc2llcjoKKworCitrb2JqX3NldF9rc2V0X3Mob2JqLHN1YnN5cykKKworLSBBc3N1bWVzIHRoYXQgb2JqLT5rb2JqIGV4aXN0cywgYW5kIGlzIGEgc3RydWN0IGtvYmplY3QuCistIFNldHMgdGhlIGtzZXQgb2YgdGhhdCBrb2JqZWN0IHRvIHRoZSBrc2V0IDxzdWJzeXM+LgorCisKK2tzZXRfc2V0X2tzZXRfcyhvYmosc3Vic3lzKQorCistIEFzc3VtZXMgdGhhdCBvYmotPmtzZXQgZXhpc3RzLCBhbmQgaXMgYSBzdHJ1Y3Qga3NldC4KKy0gU2V0cyB0aGUga3NldCBvZiB0aGUgZW1iZWRkZWQga29iamVjdCB0byB0aGUga3NldCA8c3Vic3lzPi4KKworc3Vic3lzX3NldF9rc2V0KG9iaixzdWJzeXMpCisKKy0gQXNzdW1lcyBvYmotPnN1YnN5cyBleGlzdHMsIGFuZCBpcyBhIHN0cnVjdCBzdWJzeXN0ZW0uCistIFNldHMgb2JqLT5zdWJzeXMua3NldC5rb2JqLmtzZXQgdG8gdGhlIHN1YnN5c3RlbSdzIGVtYmVkZGVkIGtzZXQuCisKK3ZvaWQgc3Vic3lzdGVtX2luaXQoc3RydWN0IGtzZXQgKnMpOworaW50IHN1YnN5c3RlbV9yZWdpc3RlcihzdHJ1Y3Qga3NldCAqcyk7Cit2b2lkIHN1YnN5c3RlbV91bnJlZ2lzdGVyKHN0cnVjdCBrc2V0ICpzKTsKK3N0cnVjdCBrc2V0ICpzdWJzeXNfZ2V0KHN0cnVjdCBrc2V0ICpzKTsKK3ZvaWQga3NldF9wdXQoc3RydWN0IGtzZXQgKnMpOworCitUaGVzZSBhcmUganVzdCB3cmFwcGVycyBhcm91bmQgdGhlIHJlc3BlY3RpdmUga3NldF8qIGZ1bmN0aW9ucy4KIAogMi4zIHN5c2ZzCiAKQEAgLTI1NCwxMTQgKzMwNSwzIEBACiB0aGUga3NldC4gQSBrb2JqX3R5cGUgbWF5IGJlIHJlZmVyZW5jZWQgYnkgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgoga3NldHMsIGFzIHRoZXJlIG1heSBiZSBkaXNwYXJhdGUgc2V0cyBvZiBpZGVudGljYWwgb2JqZWN0cy4gCiAKLQotCi00LiBzdWJzeXN0ZW1zCi0KLTQuMSBEZXNjcmlwdGlvbgotCi1BIHN1YnN5c3RlbSByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgZW50aXR5IG9mIGNvZGUgdGhhdCBtYWludGFpbnMgYW4KLWFyYml0cmFyeSBudW1iZXIgb2Ygc2V0cyBvZiBvYmplY3RzIG9mIHZhcmlvdXMgdHlwZXMuIFNpbmNlIHRoZSBudW1iZXIKLW9mIGtzZXRzIGFuZCB0aGUgdHlwZSBvZiBvYmplY3RzIHRoZXkgY29udGFpbiBhcmUgdmFyaWFibGUsIGEKLWdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSBzdWJzeXN0ZW0gaXMgbWluaW1hbC4gCi0KLQotc3RydWN0IHN1YnN5c3RlbSB7Ci0Jc3RydWN0IGtzZXQJCWtzZXQ7Ci0Jc3RydWN0IHJ3X3NlbWFwaG9yZQlyd3NlbTsKLX07Ci0KLWludCBzdWJzeXN0ZW1fcmVnaXN0ZXIoc3RydWN0IHN1YnN5c3RlbSAqKTsKLXZvaWQgc3Vic3lzdGVtX3VucmVnaXN0ZXIoc3RydWN0IHN1YnN5c3RlbSAqKTsKLQotc3RydWN0IHN1YnN5c3RlbSAqIHN1YnN5c19nZXQoc3RydWN0IHN1YnN5c3RlbSAqIHMpOwotdm9pZCBzdWJzeXNfcHV0KHN0cnVjdCBzdWJzeXN0ZW0gKiBzKTsKLQotCi1BIHN1YnN5c3RlbSBjb250YWlucyBhbiBlbWJlZGRlZCBrc2V0IHNvOgotCi0tIEl0IGNhbiBiZSByZXByZXNlbnRlZCBpbiB0aGUgb2JqZWN0IGhpZXJhcmNoeSB2aWEgdGhlIGtzZXQncwotICBlbWJlZGRlZCBrb2JqZWN0LiAKLQotLSBJdCBjYW4gbWFpbnRhaW4gYSBkZWZhdWx0IGxpc3Qgb2Ygb2JqZWN0cyBvZiBvbmUgdHlwZS4gCi0KLUFkZGl0aW9uYWwga3NldHMgbWF5IGF0dGFjaCB0byB0aGUgc3Vic3lzdGVtIHNpbXBseSBieSByZWZlcmVuY2luZyB0aGUKLXN1YnN5c3RlbSBiZWZvcmUgdGhleSBhcmUgcmVnaXN0ZXJlZC4gKFRoaXMgb25lLXdheSByZWZlcmVuY2UgbWVhbnMKLXRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVybWluZSB0aGUga3NldHMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhlCi1zdWJzeXN0ZW0uKSAKLQotQWxsIGtzZXRzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGEgc3Vic3lzdGVtIHNoYXJlIHRoZSBzdWJzeXN0ZW0ncyBSL1cKLXNlbWFwaG9yZS4gCi0KLQotNC4yIHN1YnN5c3RlbSBQcm9ncmFtbWluZyBJbnRlcmZhY2UuCi0KLVRoZSBzdWJzeXN0ZW0gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGlzIHNpbXBsZSBhbmQgZG9lcyBub3Qgb2ZmZXIgdGhlCi1mbGV4aWJpbGl0eSB0aGF0IHRoZSBrc2V0IGFuZCBrb2JqZWN0IHByb2dyYW1taW5nIGludGVyZmFjZXMgZG8uIFRoZXkKLW1heSBiZSByZWdpc3RlcmVkIGFuZCB1bnJlZ2lzdGVyZWQsIGFzIHdlbGwgYXMgcmVmZXJlbmNlIGNvdW50ZWQuIEVhY2gKLWNhbGwgZm9yd2FyZHMgdGhlIGNhbGxzIHRvIHRoZWlyIGVtYmVkZGVkIGtzZXRzICh3aGljaCBmb3J3YXJkIHRoZQotY2FsbHMgdG8gdGhlaXIgZW1iZWRkZWQga29iamVjdHMpLgotCi0KLTQuMyBIZWxwZXJzCi0KLUEgbnVtYmVyIG9mIG1hY3JvcyBhcmUgYXZhaWxhYmxlIHRvIG1ha2UgZGVhbGluZyB3aXRoIHN1YnN5c3RlbXMgYW5kCi10aGVpciBlbWJlZGRlZCBvYmplY3RzIGVhc2llci4gCi0KLQotZGVjbF9zdWJzeXMobmFtZSx0eXBlKQotCi1EZWNsYXJlcyBhIHN1YnN5c3RlbSBuYW1lZCAnPG5hbWU+X3N1YnN5cycsIHdpdGggYW4gZW1iZWRkZWQga3NldCBvZgotdHlwZSA8dHlwZT4uIEZvciBleGFtcGxlLCAKLQotZGVjbF9zdWJzeXMoZGV2aWNlcywma3R5cGVfZGV2aWNlcyk7Ci0KLWlzIGVxdWl2YWxlbnQgdG8gZG9pbmc6Ci0KLXN0cnVjdCBzdWJzeXN0ZW0gZGV2aWNlX3N1YnN5cyA9IHsKLSAgICAgICAua3NldCA9IHsKLQkgICAgIC5rb2JqID0gewotCQkgICAubmFtZSA9ICJkZXZpY2VzIiwKLQkgICAgIH0sCi0JICAgICAua3R5cGUgPSAma3R5cGVfZGV2aWNlcywKLQl9Ci19OyAKLQotCi1UaGUgb2JqZWN0cyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggYSBzdWJzeXN0ZW0gdGhhdCB1c2UgdGhlCi1zdWJzeXN0ZW0ncyBkZWZhdWx0IGxpc3QgbXVzdCBoYXZlIHRoZWlyIGtzZXQgcHRyIHNldCBwcm9wZXJseS4gVGhlc2UKLW9iamVjdHMgbWF5IGhhdmUgZW1iZWRkZWQga29iamVjdHMsIGtzZXRzLCBvciBvdGhlciBzdWJzeXN0ZW1zLiBUaGUKLWZvbGxvd2luZyBoZWxwZXJzIG1ha2Ugc2V0dGluZyB0aGUga3NldCBlYXNpZXI6IAotCi0KLWtvYmpfc2V0X2tzZXRfcyhvYmosc3Vic3lzKQotCi0tIEFzc3VtZXMgdGhhdCBvYmotPmtvYmogZXhpc3RzLCBhbmQgaXMgYSBzdHJ1Y3Qga29iamVjdC4gCi0tIFNldHMgdGhlIGtzZXQgb2YgdGhhdCBrb2JqZWN0IHRvIHRoZSBzdWJzeXN0ZW0ncyBlbWJlZGRlZCBrc2V0LgotCi0KLWtzZXRfc2V0X2tzZXRfcyhvYmosc3Vic3lzKQotCi0tIEFzc3VtZXMgdGhhdCBvYmotPmtzZXQgZXhpc3RzLCBhbmQgaXMgYSBzdHJ1Y3Qga3NldC4KLS0gU2V0cyB0aGUga3NldCBvZiB0aGUgZW1iZWRkZWQga29iamVjdCB0byB0aGUgc3Vic3lzdGVtJ3MgCi0gIGVtYmVkZGVkIGtzZXQuIAotCi1zdWJzeXNfc2V0X2tzZXQob2JqLHN1YnN5cykKLQotLSBBc3N1bWVzIG9iai0+c3Vic3lzIGV4aXN0cywgYW5kIGlzIGEgc3RydWN0IHN1YnN5c3RlbS4KLS0gU2V0cyBvYmotPnN1YnN5cy5rc2V0LmtvYmoua3NldCB0byB0aGUgc3Vic3lzdGVtJ3MgZW1iZWRkZWQga3NldC4KLQotCi00LjQgc3lzZnMKLQotc3Vic3lzdGVtcyBhcmUgcmVwcmVzZW50ZWQgaW4gc3lzZnMgdmlhIHRoZWlyIGVtYmVkZGVkIGtvYmplY3RzLiBUaGV5Ci1mb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMgcHJldmlvdXNseSBtZW50aW9uZWQgd2l0aCBubyBleGNlcHRpb25zLiBUaGV5Ci10eXBpY2FsbHkgcmVjZWl2ZSBhIHRvcC1sZXZlbCBkaXJlY3RvcnkgaW4gc3lzZnMsIGV4Y2VwdCB3aGVuIHRoZWlyCi1lbWJlZGRlZCBrb2JqZWN0IGlzIHBhcnQgb2YgYW5vdGhlciBrc2V0LCBvciB0aGUgcGFyZW50IG9mIHRoZQotZW1iZWRkZWQga29iamVjdCBpcyBleHBsaWNpdGx5IHNldC4gCi0KLU5vdGUgdGhhdCB0aGUgc3Vic3lzdGVtJ3MgZW1iZWRkZWQga3NldCBtdXN0IGJlICdhdHRhY2hlZCcgdG8gdGhlCi1zdWJzeXN0ZW0gaXRzZWxmIGluIG9yZGVyIHRvIHVzZSBpdHMgcndzZW0uIFRoaXMgaXMgZG9uZSBhZnRlcgota3NldF9hZGQoKSBoYXMgYmVlbiBjYWxsZWQuIChOb3QgYmVmb3JlLCBiZWNhdXNlIGtzZXRfYWRkKCkgdXNlcyBpdHMKLXN1YnN5c3RlbSBmb3IgYSBkZWZhdWx0IHBhcmVudCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmUpLgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xndWVzdC9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vbGd1ZXN0L01ha2VmaWxlCmluZGV4IGI5Yjk0MjcuLjMxZTc5NGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGd1ZXN0L01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vbGd1ZXN0L01ha2VmaWxlCkBAIC0xMSw4ICsxMSw3IEBACiBpbmNsdWRlICQoS0JVSUxEX09VVFBVVCkvLmNvbmZpZwogTEdVRVNUX0dVRVNUX1RPUCA6PSAoJChDT05GSUdfUEFHRV9PRkZTRVQpIC0gMHgwODAwMDAwMCkKIAotQ0ZMQUdTOj0tV2FsbCAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbWlzc2luZy1wcm90b3R5cGVzIC1PMyBcCi0JLXN0YXRpYyAtRExHVUVTVF9HVUVTVF9UT1A9IiQoTEdVRVNUX0dVRVNUX1RPUCkiIC1XbCwtVCxsZ3Vlc3QubGRzCitDRkxBR1M6PS1XYWxsIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLU8zIC1XbCwtVCxsZ3Vlc3QubGRzCiBMRExJQlM6PS1segogCiBhbGw6IGxndWVzdC5sZHMgbGd1ZXN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xndWVzdC9leHRyYWN0IGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvZXh0cmFjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMwYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvZXh0cmFjdApAQCAtMCwwICsxLDU4IEBACisjISAvYmluL3NoCisKK3NldCAtZQorCitQUkVGSVg9JDEKK3NoaWZ0CisKK3RyYXAgJ3JtIC1yICRUTVBESVInIDAKK1RNUERJUj1gbWt0ZW1wIC1kYAorCitleGVjIDM+L2Rldi9udWxsCitmb3IgZjsgZG8KKyAgICB3aGlsZSBJRlM9IgorIiByZWFkIC1yIExJTkU7IGRvCisJY2FzZSAiJExJTkUiIGluCisJICAgICokUFJFRklYOlswLTldKjpcKiopCisJCU5VTT1gZWNobyAiJExJTkUiIHwgc2VkICJzLy4qJFBSRUZJWDpcKFswLTldKlwpLiovXDEvImAKKwkJaWYgWyAtZiAkVE1QRElSLyROVU0gXTsgdGhlbgorCQkgICAgZWNobyAiJFRNUERJUi8kTlVNIGFscmVhZHkgZXhpdHMgcHJpb3IgdG8gJGYiCisJCSAgICBleGl0IDEKKwkJZmkKKwkJZXhlYyAzPj4kVE1QRElSLyROVU0KKwkJZWNobyAkZiB8IHNlZCAncyxcLlwuLywsZycgPiAkVE1QRElSLy4kTlVNCisJCS9iaW4vZWNobyAiJExJTkUiIHwgc2VkIC1lICJzLyRQUkVGSVg6WzAtOV0qLy8iIC1lICJzLzpcKi8qLyIgPiYzCisJCTs7CisJICAgICokUFJFRklYOlswLTldKikKKwkJTlVNPWBlY2hvICIkTElORSIgfCBzZWQgInMvLiokUFJFRklYOlwoWzAtOV0qXCkuKi9cMS8iYAorCQlpZiBbIC1mICRUTVBESVIvJE5VTSBdOyB0aGVuCisJCSAgICBlY2hvICIkVE1QRElSLyROVU0gYWxyZWFkeSBleGl0cyBwcmlvciB0byAkZiIKKwkJICAgIGV4aXQgMQorCQlmaQorCQlleGVjIDM+PiRUTVBESVIvJE5VTQorCQllY2hvICRmIHwgc2VkICdzLFwuXC4vLCxnJyA+ICRUTVBESVIvLiROVU0KKwkJL2Jpbi9lY2hvICIkTElORSIgfCBzZWQgInMvJFBSRUZJWDpbMC05XSovLyIgPiYzCisJCTs7CisJICAgICo6XCoqKQorCQkvYmluL2VjaG8gIiRMSU5FIiB8IHNlZCAtZSAicy86XCovKi8iIC1lICJzLC9cKlwqLywsIiA+JjMKKwkJZWNobyA+JjMKKwkJZXhlYyAzPi9kZXYvbnVsbAorCQk7OworCSAgICAqKQorCQkvYmluL2VjaG8gIiRMSU5FIiA+JjMKKwkJOzsKKwllc2FjCisgICAgZG9uZSA8ICRmCisgICAgZWNobyA+JjMKKyAgICBleGVjIDM+L2Rldi9udWxsCitkb25lCisKK0xBU1RGSUxFPSIiCitmb3IgZiBpbiAkVE1QRElSLyo7IGRvCisgICAgaWYgWyAiJExBU1RGSUxFIiAhPSAkKGNhdCAkVE1QRElSLy4kKGJhc2VuYW1lICRmKSApIF07IHRoZW4KKwlMQVNURklMRT0kKGNhdCAkVE1QRElSLy4kKGJhc2VuYW1lICRmKSApCisJZWNobyAiWyAkTEFTVEZJTEUgXSIKKyAgICBmaQorICAgIGNhdCAkZgorZG9uZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QuYyBiL0RvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jCmluZGV4IDE0MzJiNTAuLmY3OTE4NDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jCisrKyBiL0RvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC5jCkBAIC0xLDUgKzEsMTAgQEAKLS8qIFNpbXBsZSBwcm9ncmFtIHRvIGxheW91dCAicGh5c2ljYWwiIG1lbW9yeSBmb3IgbmV3IGxndWVzdCBndWVzdC4KLSAqIExpbmtlZCBoaWdoIHRvIGF2b2lkIGxpa2VseSBwaHlzaWNhbCBtZW1vcnkuICAqLworLypQOjEwMCBUaGlzIGlzIHRoZSBMYXVuY2hlciBjb2RlLCBhIHNpbXBsZSBwcm9ncmFtIHdoaWNoIGxheXMgb3V0IHRoZQorICogInBoeXNpY2FsIiBtZW1vcnkgZm9yIHRoZSBuZXcgR3Vlc3QgYnkgbWFwcGluZyB0aGUga2VybmVsIGltYWdlIGFuZCB0aGUKKyAqIHZpcnR1YWwgZGV2aWNlcywgdGhlbiByZWFkcyByZXBlYXRlZGx5IGZyb20gL2Rldi9sZ3Vlc3QgdG8gcnVuIHRoZSBHdWVzdC4KKyAqCisgKiBUaGUgb25seSB0cmljazogdGhlIE1ha2VmaWxlIGxpbmtzIGl0IGF0IGEgaGlnaCBhZGRyZXNzIHNvIGl0IHdpbGwgYmUgY2xlYXIKKyAqIG9mIHRoZSBndWVzdCBtZW1vcnkgcmVnaW9uLiAgSXQgbWVhbnMgdGhhdCBlYWNoIEd1ZXN0IGNhbm5vdCBoYXZlIG1vcmUgdGhhbgorICogYWJvdXQgMi41RyBvZiBtZW1vcnkgb24gYSBub3JtYWxseSBjb25maWd1cmVkIEhvc3QuIDoqLwogI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCiAjZGVmaW5lIF9HTlVfU09VUkNFCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTI5LDEyICszNCwyMCBAQAogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDx6bGliLmg+CisvKkw6MTEwIFdlIGNhbiBpZ25vcmUgdGhlIDI4IGluY2x1ZGUgZmlsZXMgd2UgbmVlZCBmb3IgdGhpcyBwcm9ncmFtLCBidXQgSSBkbworICogd2FudCB0byBkcmF3IGF0dGVudGlvbiB0byB0aGUgdXNlIG9mIGtlcm5lbC1zdHlsZSB0eXBlcy4KKyAqCisgKiBBcyBMaW51cyBzYWlkLCAiQyBpcyBhIFNwYXJ0YW4gbGFuZ3VhZ2UsIGFuZCBzbyBzaG91bGQgeW91ciBuYW1pbmcgYmUuIiAgSQorICogbGlrZSB0aGVzZSBhYmJyZXZpYXRpb25zIGFuZCB0aGUgaGVhZGVyIHdlIG5lZWQgdXNlcyB0aGVtLCBzbyB3ZSBkZWZpbmUgdGhlbQorICogaGVyZS4KKyAqLwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OwogdHlwZWRlZiB1aW50MzJfdCB1MzI7CiB0eXBlZGVmIHVpbnQxNl90IHUxNjsKIHR5cGVkZWYgdWludDhfdCB1ODsKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xndWVzdF9sYXVuY2hlci5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oIgorLyo6Ki8KIAogI2RlZmluZSBQQUdFX1BSRVNFTlQgMHg3IAkvKiBQcmVzZW50LCBSVywgRXhlY3V0ZSAqLwogI2RlZmluZSBORVRfUEVFUk5VTSAxCkBAIC00MywzMSArNTYsNTIgQEAKICNkZWZpbmUgU0lPQ0JSQURESUYJMHg4OWEyCQkvKiBhZGQgaW50ZXJmYWNlIHRvIGJyaWRnZSAgICAgICovCiAjZW5kaWYKIAorLypMOjEyMCB2ZXJib3NlIGlzIGJvdGggYSBnbG9iYWwgZmxhZyBhbmQgYSBtYWNyby4gIFRoZSBDIHByZXByb2Nlc3NvciBhbGxvd3MKKyAqIHRoaXMsIGFuZCBhbHRob3VnaCBJIHdvdWxkbid0IHJlY29tbWVuZCBpdCwgaXQgd29ya3MgcXVpdGUgbmljZWx5IGhlcmUuICovCiBzdGF0aWMgYm9vbCB2ZXJib3NlOwogI2RlZmluZSB2ZXJib3NlKGFyZ3MuLi4pIFwKIAlkbyB7IGlmICh2ZXJib3NlKSBwcmludGYoYXJncyk7IH0gd2hpbGUoMCkKLXN0YXRpYyBpbnQgd2FrZXJfZmQ7CisvKjoqLwogCisvKiBUaGUgcGlwZSB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSB3YWtlciBwcm9jZXNzICovCitzdGF0aWMgaW50IHdha2VyX2ZkOworLyogVGhlIHRvcCBvZiBndWVzdCBwaHlzaWNhbCBtZW1vcnkuICovCitzdGF0aWMgdTMyIHRvcDsKKworLyogVGhpcyBpcyBvdXIgbGlzdCBvZiBkZXZpY2VzLiAqLwogc3RydWN0IGRldmljZV9saXN0CiB7CisJLyogU3VtbWFyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlcyBpbiBvdXIgbGlzdDogcmVhZHkgdG8gcGFzcyB0bworCSAqIHNlbGVjdCgpIHRvIGFzayB3aGljaCBuZWVkIHNlcnZpY2luZy4qLwogCWZkX3NldCBpbmZkczsKIAlpbnQgbWF4X2luZmQ7CiAKKwkvKiBUaGUgZGVzY3JpcHRvciBwYWdlIGZvciB0aGUgZGV2aWNlcy4gKi8KKwlzdHJ1Y3QgbGd1ZXN0X2RldmljZV9kZXNjICpkZXNjczsKKworCS8qIEEgc2luZ2xlIGxpbmtlZCBsaXN0IG9mIGRldmljZXMuICovCiAJc3RydWN0IGRldmljZSAqZGV2OworCS8qIC4uLiBBbmQgYW4gZW5kIHBvaW50ZXIgc28gd2UgY2FuIGVhc2lseSBhcHBlbmQgbmV3IGRldmljZXMgKi8KIAlzdHJ1Y3QgZGV2aWNlICoqbGFzdGRldjsKIH07CiAKKy8qIFRoZSBkZXZpY2Ugc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSBkZXZpY2UuICovCiBzdHJ1Y3QgZGV2aWNlCiB7CisJLyogVGhlIGxpbmtlZC1saXN0IHBvaW50ZXIuICovCiAJc3RydWN0IGRldmljZSAqbmV4dDsKKwkvKiBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBkZXZpY2UsIGFzIG1hcHBlZCBpbnRvIHRoZSBHdWVzdC4gKi8KIAlzdHJ1Y3QgbGd1ZXN0X2RldmljZV9kZXNjICpkZXNjOworCS8qIFRoZSBtZW1vcnkgcGFnZShzKSBvZiB0aGlzIGRldmljZSwgaWYgYW55LiAgQWxzbyBtYXBwZWQgaW4gR3Vlc3QuICovCiAJdm9pZCAqbWVtOwogCi0JLyogV2F0Y2ggdGhpcyBmZCBpZiBoYW5kbGVfaW5wdXQgbm9uLU5VTEwuICovCisJLyogSWYgaGFuZGxlX2lucHV0IGlzIHNldCwgaXQgd2FudHMgdG8gYmUgY2FsbGVkIHdoZW4gdGhpcyBmaWxlCisJICogZGVzY3JpcHRvciBpcyByZWFkeS4gKi8KIAlpbnQgZmQ7CiAJYm9vbCAoKmhhbmRsZV9pbnB1dCkoaW50IGZkLCBzdHJ1Y3QgZGV2aWNlICptZSk7CiAKLQkvKiBXYXRjaCBETUEgdG8gdGhpcyBrZXkgaWYgaGFuZGxlX2lucHV0IG5vbi1OVUxMLiAqLworCS8qIElmIGhhbmRsZV9vdXRwdXQgaXMgc2V0LCBpdCB3YW50cyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgR3Vlc3Qgc2VuZHMKKwkgKiBETUEgdG8gdGhpcyBrZXkuICovCiAJdW5zaWduZWQgbG9uZyB3YXRjaF9rZXk7CiAJdTMyICgqaGFuZGxlX291dHB1dCkoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCSAgICAgdW5zaWduZWQgaW50IG51bSwgc3RydWN0IGRldmljZSAqbWUpOwpAQCAtNzYsNiArMTEwLDExIEBACiAJdm9pZCAqcHJpdjsKIH07CiAKKy8qTDoxMzAKKyAqIExvYWRpbmcgdGhlIEtlcm5lbC4KKyAqCisgKiBXZSBzdGFydCB3aXRoIGNvdXBsZSBvZiBzaW1wbGUgaGVscGVyIHJvdXRpbmVzLiAgb3Blbl9vcl9kaWUoKSBhdm9pZHMKKyAqIGVycm9yLWNoZWNraW5nIGNvZGUgY2x1dHRlcmluZyB0aGUgY2FsbGVyczogKi8KIHN0YXRpYyBpbnQgb3Blbl9vcl9kaWUoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQogewogCWludCBmZCA9IG9wZW4obmFtZSwgZmxhZ3MpOwpAQCAtODQsMjYgKzEyMywzOCBAQAogCXJldHVybiBmZDsKIH0KIAorLyogbWFwX3plcm9lZF9wYWdlcygpIHRha2VzIGEgKHBhZ2UtYWxpZ25lZCkgYWRkcmVzcyBhbmQgYSBudW1iZXIgb2YgcGFnZXMuICovCiBzdGF0aWMgdm9pZCAqbWFwX3plcm9lZF9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBudW0pCiB7CisJLyogV2UgY2FjaGUgdGhlIC9kZXYvemVybyBmaWxlLWRlc2NyaXB0b3Igc28gd2Ugb25seSBvcGVuIGl0IG9uY2UuICovCiAJc3RhdGljIGludCBmZCA9IC0xOwogCiAJaWYgKGZkID09IC0xKQogCQlmZCA9IG9wZW5fb3JfZGllKCIvZGV2L3plcm8iLCBPX1JET05MWSk7CiAKKwkvKiBXZSB1c2UgYSBwcml2YXRlIG1hcHBpbmcgKGllLiBpZiB3ZSB3cml0ZSB0byB0aGUgcGFnZSwgaXQgd2lsbCBiZQorCSAqIGNvcGllZCksIGFuZCBvYnZpb3VzbHkgd2UgaW5zaXN0IHRoYXQgaXQgYmUgbWFwcGVkIHdoZXJlIHdlIGFzay4gKi8KIAlpZiAobW1hcCgodm9pZCAqKWFkZHIsIGdldHBhZ2VzaXplKCkgKiBudW0sCiAJCSBQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIE1BUF9GSVhFRHxNQVBfUFJJVkFURSwgZmQsIDApCiAJICAgICE9ICh2b2lkICopYWRkcikKIAkJZXJyKDEsICJNbWFwaW5nICV1IHBhZ2VzIG9mIC9kZXYvemVybyBAJXAiLCBudW0sICh2b2lkICopYWRkcik7CisKKwkvKiBSZXR1cm5pbmcgdGhlIGFkZHJlc3MgaXMganVzdCBhIGNvdXJ0ZXN5OiBjYW4gc2ltcGxpZnkgY2FsbGVycy4gKi8KIAlyZXR1cm4gKHZvaWQgKilhZGRyOwogfQogCi0vKiBGaW5kIG1hZ2ljIHN0cmluZyBtYXJraW5nIGVudHJ5IHBvaW50LCByZXR1cm4gZW50cnkgcG9pbnQuICovCisvKiBUbyBmaW5kIG91dCB3aGVyZSB0byBzdGFydCB3ZSBsb29rIGZvciB0aGUgbWFnaWMgR3Vlc3Qgc3RyaW5nLCB3aGljaCBtYXJrcworICogdGhlIGNvZGUgd2Ugc2VlIGluIGxndWVzdF9hc20uUy4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkKKyAqIHBsb3R0aW5nIHRvIHJlcGxhY2Ugd2l0aCB0aGUgbm9ybWFsIExpbnV4IGVudHJ5IHBvaW50LiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZW50cnlfcG9pbnQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCwKIAkJCQkgdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldCkKIHsKIAl2b2lkICpwOwogCisJLyogVGhlIHNjYW4gZ2l2ZXMgdXMgdGhlIHBoeXNpY2FsIHN0YXJ0aW5nIGFkZHJlc3MuICBXZSB3YW50IHRoZQorCSAqIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGlzIGNhc2UsIGFuZCBmb3J0dW5hdGVseSwgd2UgYWxyZWFkeSBmaWd1cmVkCisJICogb3V0IHRoZSBwaHlzaWNhbC12aXJ0dWFsIGRpZmZlcmVuY2UgYW5kIHBhc3NlZCBpdCBoZXJlIGluCisJICogInBhZ2Vfb2Zmc2V0Ii4gKi8KIAlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrKQogCQlpZiAobWVtY21wKHAsICJHZW51aW5lTGd1ZXN0Iiwgc3RybGVuKCJHZW51aW5lTGd1ZXN0IikpID09IDApCiAJCQlyZXR1cm4gKGxvbmcpcCArIHN0cmxlbigiR2VudWluZUxndWVzdCIpICsgcGFnZV9vZmZzZXQ7CkBAIC0xMTEsNyArMTYyLDE3IEBACiAJZXJyKDEsICJJcyB0aGlzIGltYWdlIGEgZ2VudWluZSBsZ3Vlc3Q/Iik7CiB9CiAKLS8qIFJldHVybnMgdGhlIGVudHJ5IHBvaW50ICovCisvKiBUaGlzIHJvdXRpbmUgdGFrZXMgYW4gb3BlbiB2bWxpbnV4IGltYWdlLCB3aGljaCBpcyBpbiBFTEYsIGFuZCBtYXBzIGl0IGludG8KKyAqIHRoZSBHdWVzdCBtZW1vcnkuICBFTEYgPSBFbWJlZGRlZCBMaW5raW5nIEZvcm1hdCwgd2hpY2ggaXMgdGhlIGZvcm1hdCB1c2VkCisgKiBieSBhbGwgbW9kZXJuIGJpbmFyaWVzIG9uIExpbnV4IGluY2x1ZGluZyB0aGUga2VybmVsLgorICoKKyAqIFRoZSBFTEYgaGVhZGVycyBnaXZlICp0d28qIGFkZHJlc3NlczogYSBwaHlzaWNhbCBhZGRyZXNzLCBhbmQgYSB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgVGhlIEd1ZXN0IGtlcm5lbCBleHBlY3RzIHRvIGJlIHBsYWNlZCBpbiBtZW1vcnkgYXQgdGhlIHBoeXNpY2FsCisgKiBhZGRyZXNzLCBhbmQgdGhlIHBhZ2UgdGFibGVzIHNldCB1cCBzbyBpdCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhhdCB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgV2UgcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZpcnR1YWwgYW5kIHBoeXNpY2FsCisgKiBhZGRyZXNzZXMgaW4gdGhlICJwYWdlX29mZnNldCIgcG9pbnRlci4KKyAqCisgKiBXZSByZXR1cm4gdGhlIHN0YXJ0aW5nIGFkZHJlc3MuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXBfZWxmKGludCBlbGZfZmQsIGNvbnN0IEVsZjMyX0VoZHIgKmVoZHIsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBhZ2Vfb2Zmc2V0KQogewpAQCAtMTIwLDQwICsxODEsNjEgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gLTFVTCwgZW5kID0gMDsKIAotCS8qIFNhbml0eSBjaGVja3MuICovCisJLyogU2FuaXR5IGNoZWNrcyBvbiB0aGUgbWFpbiBFTEYgaGVhZGVyOiBhbiB4ODYgZXhlY3V0YWJsZSB3aXRoIGEKKwkgKiByZWFzb25hYmxlIG51bWJlciBvZiBjb3JyZWN0bHktc2l6ZWQgcHJvZ3JhbSBoZWFkZXJzLiAqLwogCWlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQwogCSAgICB8fCBlaGRyLT5lX21hY2hpbmUgIT0gRU1fMzg2CiAJICAgIHx8IGVoZHItPmVfcGhlbnRzaXplICE9IHNpemVvZihFbGYzMl9QaGRyKQogCSAgICB8fCBlaGRyLT5lX3BobnVtIDwgMSB8fCBlaGRyLT5lX3BobnVtID4gNjU1MzZVL3NpemVvZihFbGYzMl9QaGRyKSkKIAkJZXJyeCgxLCAiTWFsZm9ybWVkIGVsZiBoZWFkZXIiKTsKIAorCS8qIEFuIEVMRiBleGVjdXRhYmxlIGNvbnRhaW5zIGFuIEVMRiBoZWFkZXIgYW5kIGEgbnVtYmVyIG9mICJwcm9ncmFtIgorCSAqIGhlYWRlcnMgd2hpY2ggaW5kaWNhdGUgd2hpY2ggcGFydHMgKCJzZWdtZW50cyIpIG9mIHRoZSBwcm9ncmFtIHRvCisJICogbG9hZCB3aGVyZS4gKi8KKworCS8qIFdlIHJlYWQgaW4gYWxsIHRoZSBwcm9ncmFtIGhlYWRlcnMgYXQgb25jZTogKi8KIAlpZiAobHNlZWsoZWxmX2ZkLCBlaGRyLT5lX3Bob2ZmLCBTRUVLX1NFVCkgPCAwKQogCQllcnIoMSwgIlNlZWtpbmcgdG8gcHJvZ3JhbSBoZWFkZXJzIik7CiAJaWYgKHJlYWQoZWxmX2ZkLCBwaGRyLCBzaXplb2YocGhkcikpICE9IHNpemVvZihwaGRyKSkKIAkJZXJyKDEsICJSZWFkaW5nIHByb2dyYW0gaGVhZGVycyIpOwogCisJLyogV2UgZG9uJ3Qga25vdyBwYWdlX29mZnNldCB5ZXQuICovCiAJKnBhZ2Vfb2Zmc2V0ID0gMDsKLQkvKiBXZSBtYXAgdGhlIGxvYWRhYmxlIHNlZ21lbnRzIGF0IHZpcnR1YWwgYWRkcmVzc2VzIGNvcnJlc3BvbmRpbmcKLQkgKiB0byB0aGVpciBwaHlzaWNhbCBhZGRyZXNzZXMgKG91ciB2aXJ0dWFsID09IGd1ZXN0IHBoeXNpY2FsKS4gKi8KKworCS8qIFRyeSBhbGwgdGhlIGhlYWRlcnM6IHRoZXJlIGFyZSB1c3VhbGx5IG9ubHkgdGhyZWUuICBBIHJlYWQtb25seSBvbmUsCisJICogYSByZWFkLXdyaXRlIG9uZSwgYW5kIGEgIm5vdGUiIHNlY3Rpb24gd2hpY2ggaXNuJ3QgbG9hZGFibGUuICovCiAJZm9yIChpID0gMDsgaSA8IGVoZHItPmVfcGhudW07IGkrKykgeworCQkvKiBJZiB0aGlzIGlzbid0IGEgbG9hZGFibGUgc2VnbWVudCwgd2UgaWdub3JlIGl0ICovCiAJCWlmIChwaGRyW2ldLnBfdHlwZSAhPSBQVF9MT0FEKQogCQkJY29udGludWU7CiAKIAkJdmVyYm9zZSgiU2VjdGlvbiAlaTogc2l6ZSAlaSBhZGRyICVwXG4iLAogCQkJaSwgcGhkcltpXS5wX21lbXN6LCAodm9pZCAqKXBoZHJbaV0ucF9wYWRkcik7CiAKLQkJLyogV2UgZXhwZWN0IGxpbmVhciBhZGRyZXNzIHNwYWNlLiAqLworCQkvKiBXZSBleHBlY3QgYSBzaW1wbGUgbGluZWFyIGFkZHJlc3Mgc3BhY2U6IGV2ZXJ5IHNlZ21lbnQgbXVzdAorCQkgKiBoYXZlIHRoZSBzYW1lIGRpZmZlcmVuY2UgYmV0d2VlbiB2aXJ0dWFsIChwX3ZhZGRyKSBhbmQKKwkJICogcGh5c2ljYWwgKHBfcGFkZHIpIGFkZHJlc3MuICovCiAJCWlmICghKnBhZ2Vfb2Zmc2V0KQogCQkJKnBhZ2Vfb2Zmc2V0ID0gcGhkcltpXS5wX3ZhZGRyIC0gcGhkcltpXS5wX3BhZGRyOwogCQllbHNlIGlmICgqcGFnZV9vZmZzZXQgIT0gcGhkcltpXS5wX3ZhZGRyIC0gcGhkcltpXS5wX3BhZGRyKQogCQkJZXJyeCgxLCAiUGFnZSBvZmZzZXQgb2Ygc2VjdGlvbiAlaSBkaWZmZXJlbnQiLCBpKTsKIAorCQkvKiBXZSB0cmFjayB0aGUgZmlyc3QgYW5kIGxhc3QgYWRkcmVzcyB3ZSBtYXBwZWQsIHNvIHdlIGNhbgorCQkgKiB0ZWxsIGVudHJ5X3BvaW50KCkgd2hlcmUgdG8gc2Nhbi4gKi8KIAkJaWYgKHBoZHJbaV0ucF9wYWRkciA8IHN0YXJ0KQogCQkJc3RhcnQgPSBwaGRyW2ldLnBfcGFkZHI7CiAJCWlmIChwaGRyW2ldLnBfcGFkZHIgKyBwaGRyW2ldLnBfZmlsZXN6ID4gZW5kKQogCQkJZW5kID0gcGhkcltpXS5wX3BhZGRyICsgcGhkcltpXS5wX2ZpbGVzejsKIAotCQkvKiBXZSBtYXAgZXZlcnl0aGluZyBwcml2YXRlLCB3cml0YWJsZS4gKi8KKwkJLyogV2UgbWFwIHRoaXMgc2VjdGlvbiBvZiB0aGUgZmlsZSBhdCBpdHMgcGh5c2ljYWwgYWRkcmVzcy4gIFdlCisJCSAqIG1hcCBpdCByZWFkICYgd3JpdGUgZXZlbiBpZiB0aGUgaGVhZGVyIHNheXMgdGhpcyBzZWdtZW50IGlzCisJCSAqIHJlYWQtb25seS4gIFRoZSBrZXJuZWwgcmVhbGx5IHdhbnRzIHRvIGJlIHdyaXRhYmxlOiBpdAorCQkgKiBwYXRjaGVzIGl0cyBvd24gaW5zdHJ1Y3Rpb25zIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlCisJCSAqIHJlYWQtb25seS4KKwkJICoKKwkJICogTUFQX1BSSVZBVEUgbWVhbnMgdGhhdCB0aGUgcGFnZSB3b24ndCBiZSBjb3BpZWQgdW50aWwgYQorCQkgKiB3cml0ZSBpcyBkb25lIHRvIGl0LiAgVGhpcyBhbGxvd3MgdXMgdG8gc2hhcmUgbXVjaCBvZiB0aGUKKwkJICoga2VybmVsIG1lbW9yeSBiZXR3ZWVuIEd1ZXN0cy4gKi8KIAkJYWRkciA9IG1tYXAoKHZvaWQgKilwaGRyW2ldLnBfcGFkZHIsCiAJCQkgICAgcGhkcltpXS5wX2ZpbGVzeiwKIAkJCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsCkBAIC0xNjcsNyArMjQ5LDMxIEBACiAJcmV0dXJuIGVudHJ5X3BvaW50KCh2b2lkICopc3RhcnQsICh2b2lkICopZW5kLCAqcGFnZV9vZmZzZXQpOwogfQogCi0vKiBUaGlzIGlzIGFtYXppbmdseSByZWxpYWJsZS4gKi8KKy8qTDoxNzAgUHJlcGFyZSB0byBiZSBTSE9DS0VEIGFuZCBBTUFaRUQuICBBbmQgcG9zc2libHkgYSB0cmlmbGUgbmF1c2VhdGVkLgorICoKKyAqIFdlIGtub3cgdGhhdCBDT05GSUdfUEFHRV9PRkZTRVQgc2V0cyB3aGF0IHZpcnR1YWwgYWRkcmVzcyB0aGUga2VybmVsIGV4cGVjdHMKKyAqIHRvIGJlLiAgV2UgZG9uJ3Qga25vdyB3aGF0IHRoYXQgb3B0aW9uIHdhcywgYnV0IHdlIGNhbiBmaWd1cmUgaXQgb3V0CisgKiBhcHByb3hpbWF0ZWx5IGJ5IGxvb2tpbmcgYXQgdGhlIGFkZHJlc3NlcyBpbiB0aGUgY29kZS4gIEkgY2hvc2UgdGhlIGNvbW1vbgorICogY2FzZSBvZiByZWFkaW5nIGEgbWVtb3J5IGxvY2F0aW9uIGludG8gdGhlICVlYXggcmVnaXN0ZXI6CisgKgorICogIG1vdmwgPHNvbWUtYWRkcmVzcz4sICVlYXgKKyAqCisgKiBUaGlzIGdldHMgZW5jb2RlZCBhcyBmaXZlIGJ5dGVzOiAiMHhBMSA8NC1ieXRlLWFkZHJlc3M+Ii4gIEZvciBleGFtcGxlLAorICogIjB4QTEgMHgxOCAweDYwIDB4NDcgMHhDMCIgcmVhZHMgdGhlIGFkZHJlc3MgMHhDMDQ3NjAxOCBpbnRvICVlYXguCisgKgorICogSW4gdGhpcyBleGFtcGxlIGNhbiBndWVzcyB0aGF0IHRoZSBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGgKKyAqIENPTkZJR19QQUdFX09GRlNFVCBzZXQgdG8gMHhDMDAwMDAwMCAoaXQncyBhbHdheXMgYSByb3VuZCBudW1iZXIpLiAgSWYgdGhlCisgKiBrZXJuZWwgd2VyZSBsYXJnZXIgdGhhbiAxNk1CLCB3ZSBtaWdodCBzZWUgMHhDMSBhZGRyZXNzZXMgc2hvdyB1cCwgYnV0IG91cgorICoga2VybmVsIGlzbid0IHRoYXQgYmxvYXRlZCB5ZXQuCisgKgorICogVW5mb3J0dW5hdGVseSwgeDg2IGhhcyB2YXJpYWJsZS1sZW5ndGggaW5zdHJ1Y3Rpb25zLCBzbyBmaW5kaW5nIHRoaXMKKyAqIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24gcHJvcGVybHkgaW52b2x2ZXMgd3JpdGluZyBhIGRpc2Fzc2VtYmxlci4gIEluc3RlYWQsCisgKiB3ZSByZWx5IG9uIHN0YXRpc3RpY3MuICBXZSBsb29rIGZvciAiMHhBMSIgYW5kIHRhbGx5IHRoZSBkaWZmZXJlbnQgYnl0ZXMKKyAqIHdoaWNoIG9jY3VyIDQgYnl0ZXMgbGF0ZXIgKHRoZSAiMHhDMCIgaW4gb3VyIGV4YW1wbGUgYWJvdmUpLiAgV2hlbiBvbmUgb2YKKyAqIHRob3NlIGJ5dGVzIGFwcGVhcnMgdGhyZWUgdGltZXMsIHdlIGNhbiBiZSByZWFzb25hYmx5IGNvbmZpZGVudCB0aGF0IGl0CisgKiBmb3JtcyB0aGUgc3RhcnQgb2YgQ09ORklHX1BBR0VfT0ZGU0VULgorICoKKyAqIFRoaXMgaXMgYW1hemluZ2x5IHJlbGlhYmxlLiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50dWl0X3BhZ2Vfb2Zmc2V0KHVuc2lnbmVkIGNoYXIgKmltZywgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgaW50IGksIHBvc3NpYmlsaXRpZXNbMjU2XSA9IHsgMCB9OwpAQCAtMTgwLDMwICsyODYsNTIgQEAKIAllcnJ4KDEsICJjb3VsZCBub3QgZGV0ZXJtaW5lIHBhZ2Ugb2Zmc2V0Iik7CiB9CiAKKy8qTDoxNjAgVW5mb3J0dW5hdGVseSB0aGUgZW50aXJlIEVMRiBpbWFnZSBpc24ndCBjb21wcmVzc2VkOiB0aGUgc2VnbWVudHMKKyAqIHdoaWNoIG5lZWQgbG9hZGluZyBhcmUgZXh0cmFjdGVkIGFuZCBjb21wcmVzc2VkIHJhdy4gIFRoaXMgZGVuaWVzIHVzIHRoZQorICogaW5mb3JtYXRpb24gd2UgbmVlZCB0byBtYWtlIGEgZnVsbHktZ2VuZXJhbCBsb2FkZXIuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB1bnBhY2tfYnppbWFnZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgKnBhZ2Vfb2Zmc2V0KQogewogCWd6RmlsZSBmOwogCWludCByZXQsIGxlbiA9IDA7CisJLyogQSBiekltYWdlIGFsd2F5cyBnZXRzIGxvYWRlZCBhdCBwaHlzaWNhbCBhZGRyZXNzIDFNLiAgVGhpcyBpcworCSAqIGFjdHVhbGx5IGNvbmZpZ3VyYWJsZSBhcyBDT05GSUdfUEhZU0lDQUxfU1RBUlQsIGJ1dCBhcyB0aGUgY29tbWVudAorCSAqIHRoZXJlIHNheXMsICJEb24ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIi4KKwkgKiBJbmRlZWQuICovCiAJdm9pZCAqaW1nID0gKHZvaWQgKikweDEwMDAwMDsKIAorCS8qIGd6ZG9wZW4gdGFrZXMgb3VyIGZpbGUgZGVzY3JpcHRvciAoY2FyZWZ1bGx5IHBsYWNlZCBhdCB0aGUgc3RhcnQgb2YKKwkgKiB0aGUgR1pJUCBoZWFkZXIgd2UgZm91bmQpIGFuZCByZXR1cm5zIGEgZ3pGaWxlLiAqLwogCWYgPSBnemRvcGVuKGZkLCAicmIiKTsKKwkvKiBXZSByZWFkIGl0IGludG8gbWVtb3J5IGluIDY0ayBjaHVua3MgdW50aWwgd2UgaGl0IHRoZSBlbmQuICovCiAJd2hpbGUgKChyZXQgPSBnenJlYWQoZiwgaW1nICsgbGVuLCA2NTUzNikpID4gMCkKIAkJbGVuICs9IHJldDsKIAlpZiAocmV0IDwgMCkKIAkJZXJyKDEsICJyZWFkaW5nIGltYWdlIGZyb20gYnpJbWFnZSIpOwogCiAJdmVyYm9zZSgiVW5wYWNrZWQgc2l6ZSAlaSBhZGRyICVwXG4iLCBsZW4sIGltZyk7CisKKwkvKiBXaXRob3V0IHRoZSBFTEYgaGVhZGVyLCB3ZSBjYW4ndCB0ZWxsIHZpcnR1YWwtcGh5c2ljYWwgZ2FwLiAgVGhpcyBpcworCSAqIENPTkZJR19QQUdFX09GRlNFVCwgYW5kIHBlb3BsZSBkbyBhY3R1YWxseSBjaGFuZ2UgaXQuICBGb3J0dW5hdGVseSwKKwkgKiBJIGhhdmUgYSBjbGV2ZXIgd2F5IG9mIGZpZ3VyaW5nIGl0IG91dCBmcm9tIHRoZSBjb2RlIGl0c2VsZi4gICovCiAJKnBhZ2Vfb2Zmc2V0ID0gaW50dWl0X3BhZ2Vfb2Zmc2V0KGltZywgbGVuKTsKIAogCXJldHVybiBlbnRyeV9wb2ludChpbWcsIGltZyArIGxlbiwgKnBhZ2Vfb2Zmc2V0KTsKIH0KIAorLypMOjE1MCBBIGJ6SW1hZ2UsIHVubGlrZSBhbiBFTEYgZmlsZSwgaXMgbm90IG1lYW50IHRvIGJlIGxvYWRlZC4gIFlvdSdyZQorICogc3VwcG9zZWQgdG8ganVtcCBpbnRvIGl0IGFuZCBpdCB3aWxsIHVucGFjayBpdHNlbGYuICBXZSBjYW4ndCBkbyB0aGF0CisgKiBiZWNhdXNlIHRoZSBHdWVzdCBjYW4ndCBydW4gdGhlIHVucGFja2luZyBjb2RlLCBhbmQgYWRkaW5nIGZlYXR1cmVzIHRvCisgKiBsZ3Vlc3Qga2lsbHMgcHVwcGllcywgc28gd2UgZG9uJ3Qgd2FudCB0by4KKyAqCisgKiBUaGUgYnpJbWFnZSBpcyBmb3JtZWQgYnkgcHV0dGluZyB0aGUgZGVjb21wcmVzc2luZyBjb2RlIGluIGZyb250IG9mIHRoZQorICogY29tcHJlc3NlZCBrZXJuZWwgY29kZS4gIFNvIHdlIGNhbiBzaW1wbGUgc2NhbiB0aHJvdWdoIGl0IGxvb2tpbmcgZm9yIHRoZQorICogZmlyc3QgImd6aXAiIGhlYWRlciwgYW5kIHN0YXJ0IGRlY29tcHJlc3NpbmcgZnJvbSB0aGVyZS4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfYnppbWFnZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgKnBhZ2Vfb2Zmc2V0KQogewogCXVuc2lnbmVkIGNoYXIgYzsKIAlpbnQgc3RhdGUgPSAwOwogCi0JLyogVWdseSBicnV0ZSBmb3JjZSBzZWFyY2ggZm9yIGd6aXAgaGVhZGVyLiAqLworCS8qIEdaSVAgaGVhZGVyIGlzIDB4MUYgMHg4QiA8bWV0aG9kPiA8ZmxhZ3M+Li4uIDxjb21wcmVzc2VkLWJ5Pi4gKi8KIAl3aGlsZSAocmVhZChmZCwgJmMsIDEpID09IDEpIHsKIAkJc3dpdGNoIChzdGF0ZSkgewogCQljYXNlIDA6CkBAIC0yMjAsOCArMzQ4LDEwIEBACiAJCQlzdGF0ZSsrOwogCQkJYnJlYWs7CiAJCWNhc2UgOToKKwkJCS8qIFNlZWsgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGd6aXAgaGVhZGVyLiAqLwogCQkJbHNlZWsoZmQsIC0xMCwgU0VFS19DVVIpOwotCQkJaWYgKGMgIT0gMHgwMykgLyogQ29tcHJlc3NlZCB1bmRlciBVTklYLiAqLworCQkJLyogT25lIGZpbmFsIGNoZWNrOiAiY29tcHJlc3NlZCB1bmRlciBVTklYIi4gKi8KKwkJCWlmIChjICE9IDB4MDMpCiAJCQkJc3RhdGUgPSAtMTsKIAkJCWVsc2UKIAkJCQlyZXR1cm4gdW5wYWNrX2J6aW1hZ2UoZmQsIHBhZ2Vfb2Zmc2V0KTsKQEAgLTIzMCwyNSArMzYwLDQzIEBACiAJZXJyeCgxLCAiQ291bGQgbm90IGZpbmQga2VybmVsIGluIGJ6SW1hZ2UiKTsKIH0KIAorLypMOjE0MCBMb2FkaW5nIHRoZSBrZXJuZWwgaXMgZWFzeSB3aGVuIGl0J3MgYSAidm1saW51eCIsIGJ1dCBtb3N0IGtlcm5lbHMKKyAqIGNvbWUgd3JhcHBlZCB1cCBpbiB0aGUgc2VsZi1kZWNvbXByZXNzaW5nICJiekltYWdlIiBmb3JtYXQuICBXaXRoIHNvbWUgZnVua3kKKyAqIGNvZGluZywgd2UgY2FuIGxvYWQgdGhvc2UsIHRvby4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfa2VybmVsKGludCBmZCwgdW5zaWduZWQgbG9uZyAqcGFnZV9vZmZzZXQpCiB7CiAJRWxmMzJfRWhkciBoZHI7CiAKKwkvKiBSZWFkIGluIHRoZSBmaXJzdCBmZXcgYnl0ZXMuICovCiAJaWYgKHJlYWQoZmQsICZoZHIsIHNpemVvZihoZHIpKSAhPSBzaXplb2YoaGRyKSkKIAkJZXJyKDEsICJSZWFkaW5nIGtlcm5lbCIpOwogCisJLyogSWYgaXQncyBhbiBFTEYgZmlsZSwgaXQgc3RhcnRzIHdpdGggIlwxNzdFTEYiICovCiAJaWYgKG1lbWNtcChoZHIuZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSA9PSAwKQogCQlyZXR1cm4gbWFwX2VsZihmZCwgJmhkciwgcGFnZV9vZmZzZXQpOwogCisJLyogT3RoZXJ3aXNlIHdlIGFzc3VtZSBpdCdzIGEgYnpJbWFnZSwgYW5kIHRyeSB0byB1bnBhY2sgaXQgKi8KIAlyZXR1cm4gbG9hZF9iemltYWdlKGZkLCBwYWdlX29mZnNldCk7CiB9CiAKKy8qIFRoaXMgaXMgYSB0cml2aWFsIGxpdHRsZSBoZWxwZXIgdG8gYWxpZ24gcGFnZXMuICBBbmRpIEtsZWVuIGhhdGVkIGl0IGJlY2F1c2UKKyAqIGl0IGNhbGxzIGdldHBhZ2VzaXplKCkgdHdpY2U6ICJpdCdzIGR1bWIgY29kZS4iCisgKgorICogS2VybmVsIGd1eXMgZ2V0IHJlYWxseSBoZXQgdXAgYWJvdXQgb3B0aW1pemF0aW9uLCBldmVuIHdoZW4gaXQncyBub3QKKyAqIG5lY2Vzc2FyeS4gIEkgbGVhdmUgdGhpcyBjb2RlIGFzIGEgcmVhY3Rpb24gYWdhaW5zdCB0aGF0LiAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBhZ2VfYWxpZ24odW5zaWduZWQgbG9uZyBhZGRyKQogeworCS8qIEFkZCB1cHdhcmRzIGFuZCB0cnVuY2F0ZSBkb3dud2FyZHMuICovCiAJcmV0dXJuICgoYWRkciArIGdldHBhZ2VzaXplKCktMSkgJiB+KGdldHBhZ2VzaXplKCktMSkpOwogfQogCi0vKiBpbml0cmQgZ2V0cyBsb2FkZWQgYXQgdG9wIG9mIG1lbW9yeTogcmV0dXJuIGxlbmd0aC4gKi8KKy8qTDoxODAgQW4gImluaXRpYWwgcmFtIGRpc2siIGlzIGEgZGlzayBpbWFnZSBsb2FkZWQgaW50byBtZW1vcnkgYWxvbmcgd2l0aAorICogdGhlIGtlcm5lbCB3aGljaCB0aGUga2VybmVsIGNhbiB1c2UgdG8gYm9vdCBmcm9tIHdpdGhvdXQgbmVlZGluZyBhbnkKKyAqIGRyaXZlcnMuICBNb3N0IGRpc3RyaWJ1dGlvbnMgbm93IHVzZSB0aGlzIGFzIHN0YW5kYXJkOiB0aGUgaW5pdHJkIGNvbnRhaW5zCisgKiB0aGUgY29kZSB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgbW9kdWxlcyBmb3IgdGhlIGN1cnJlbnQgbWFjaGluZS4KKyAqCisgKiBJbXBvcnRhbnRseSwgSmFtZXMgTW9ycmlzIHdvcmtzIGZvciBSZWRIYXQsIGFuZCBGZWRvcmEgdXNlcyBpbml0cmRzIGZvciBpdHMKKyAqIGtlcm5lbHMuICBIZSBzZW50IG1lIHRoaXMgKGFuZCB0ZWxscyBtZSB3aGVuIEkgYnJlYWsgaXQpLiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9hZF9pbml0cmQoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBtZW0pCiB7CiAJaW50IGlmZDsKQEAgLTI1NywyMSArNDA1LDM1IEBACiAJdm9pZCAqaWFkZHI7CiAKIAlpZmQgPSBvcGVuX29yX2RpZShuYW1lLCBPX1JET05MWSk7CisJLyogZnN0YXQoKSBpcyBuZWVkZWQgdG8gZ2V0IHRoZSBmaWxlIHNpemUuICovCiAJaWYgKGZzdGF0KGlmZCwgJnN0KSA8IDApCiAJCWVycigxLCAiZnN0YXQoKSBvbiBpbml0cmQgJyVzJyIsIG5hbWUpOwogCisJLyogVGhlIGxlbmd0aCBuZWVkcyB0byBiZSByb3VuZGVkIHVwIHRvIGEgcGFnZSBzaXplOiBtbWFwIG5lZWRzIHRoZQorCSAqIGFkZHJlc3MgdG8gYmUgcGFnZSBhbGlnbmVkLiAqLwogCWxlbiA9IHBhZ2VfYWxpZ24oc3Quc3Rfc2l6ZSk7CisJLyogV2UgbWFwIHRoZSBpbml0cmQgYXQgdGhlIHRvcCBvZiBtZW1vcnkuICovCiAJaWFkZHIgPSBtbWFwKCh2b2lkICopbWVtIC0gbGVuLCBzdC5zdF9zaXplLAogCQkgICAgIFBST1RfUkVBRHxQUk9UX0VYRUN8UFJPVF9XUklURSwKIAkJICAgICBNQVBfRklYRUR8TUFQX1BSSVZBVEUsIGlmZCwgMCk7CiAJaWYgKGlhZGRyICE9ICh2b2lkICopbWVtIC0gbGVuKQogCQllcnIoMSwgIk1tYXBpbmcgaW5pdHJkICclcycgcmV0dXJuZWQgJXAgbm90ICVwIiwKIAkJICAgIG5hbWUsIGlhZGRyLCAodm9pZCAqKW1lbSAtIGxlbik7CisJLyogT25jZSBhIGZpbGUgaXMgbWFwcGVkLCB5b3UgY2FuIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBJdCdzIGEKKwkgKiBsaXR0bGUgb2RkLCBidXQgcXVpdGUgdXNlZnVsLiAqLwogCWNsb3NlKGlmZCk7CiAJdmVyYm9zZSgibWFwcGVkIGluaXRyZCAlcyBzaXplPSVsdSBAICVwXG4iLCBuYW1lLCBzdC5zdF9zaXplLCBpYWRkcik7CisKKwkvKiBXZSByZXR1cm4gdGhlIGluaXRyZCBzaXplLiAqLwogCXJldHVybiBsZW47CiB9CiAKKy8qIE9uY2Ugd2Uga25vdyBob3cgbXVjaCBtZW1vcnkgd2UgaGF2ZSwgYW5kIHRoZSBhZGRyZXNzIHRoZSBHdWVzdCBrZXJuZWwKKyAqIGV4cGVjdHMsIHdlIGNhbiBjb25zdHJ1Y3Qgc2ltcGxlIGxpbmVhciBwYWdlIHRhYmxlcyB3aGljaCB3aWxsIGdldCB0aGUgR3Vlc3QKKyAqIGZhciBlbm91Z2ggaW50byB0aGUgYm9vdCB0byBjcmVhdGUgaXRzIG93bi4KKyAqCisgKiBXZSBsYXkgdGhlbSBvdXQgb2YgdGhlIHdheSwganVzdCBiZWxvdyB0aGUgaW5pdHJkICh3aGljaCBpcyB3aHkgd2UgbmVlZCB0bworICoga25vdyBpdHMgc2l6ZSkuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXR1cF9wYWdldGFibGVzKHVuc2lnbmVkIGxvbmcgbWVtLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3NpemUsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldCkKQEAgLTI4MCwyMyArNDQyLDMyIEBACiAJdW5zaWduZWQgaW50IG1hcHBlZF9wYWdlcywgaSwgbGluZWFyX3BhZ2VzOwogCXVuc2lnbmVkIGludCBwdGVzX3Blcl9wYWdlID0gZ2V0cGFnZXNpemUoKS9zaXplb2YodTMyKTsKIAotCS8qIElmIHdlIGNhbiBtYXAgYWxsIG9mIG1lbW9yeSBhYm92ZSBwYWdlX29mZnNldCwgd2UgZG8gc28uICovCisJLyogSWRlYWxseSB3ZSBtYXAgYWxsIHBoeXNpY2FsIG1lbW9yeSBzdGFydGluZyBhdCBwYWdlX29mZnNldC4KKwkgKiBIb3dldmVyLCBpZiBwYWdlX29mZnNldCBpcyAweEMwMDAwMDAwIHdlIGNhbiBvbmx5IG1hcCAxRyBvZiBwaHlzaWNhbAorCSAqICgweEMwMDAwMDAwICsgMUcgb3ZlcmZsb3dzKS4gKi8KIAlpZiAobWVtIDw9IC1wYWdlX29mZnNldCkKIAkJbWFwcGVkX3BhZ2VzID0gbWVtL2dldHBhZ2VzaXplKCk7CiAJZWxzZQogCQltYXBwZWRfcGFnZXMgPSAtcGFnZV9vZmZzZXQvZ2V0cGFnZXNpemUoKTsKIAotCS8qIEVhY2ggbGluZWFyIFBURSBwYWdlIGNhbiBtYXAgcHRlc19wZXJfcGFnZSBwYWdlcy4gKi8KKwkvKiBFYWNoIFBURSBwYWdlIGNhbiBtYXAgcHRlc19wZXJfcGFnZSBwYWdlczogaG93IG1hbnkgZG8gd2UgbmVlZD8gKi8KIAlsaW5lYXJfcGFnZXMgPSAobWFwcGVkX3BhZ2VzICsgcHRlc19wZXJfcGFnZS0xKS9wdGVzX3Blcl9wYWdlOwogCi0JLyogV2UgbGF5IG91dCB0b3AtbGV2ZWwgdGhlbiBsaW5lYXIgbWFwcGluZyBpbW1lZGlhdGVseSBiZWxvdyBpbml0cmQgKi8KKwkvKiBXZSBwdXQgdGhlIHRvcGxldmVsIHBhZ2UgZGlyZWN0b3J5IHBhZ2UgYXQgdGhlIHRvcCBvZiBtZW1vcnkuICovCiAJcGdkaXIgPSAodm9pZCAqKW1lbSAtIGluaXRyZF9zaXplIC0gZ2V0cGFnZXNpemUoKTsKKworCS8qIE5vdyB3ZSB1c2UgdGhlIG5leHQgbGluZWFyX3BhZ2VzIHBhZ2VzIGFzIHB0ZSBwYWdlcyAqLwogCWxpbmVhciA9ICh2b2lkICopcGdkaXIgLSBsaW5lYXJfcGFnZXMqZ2V0cGFnZXNpemUoKTsKIAorCS8qIExpbmVhciBtYXBwaW5nIGlzIGVhc3k6IHB1dCBldmVyeSBwYWdlJ3MgYWRkcmVzcyBpbnRvIHRoZSBtYXBwaW5nIGluCisJICogb3JkZXIuICBQQUdFX1BSRVNFTlQgY29udGFpbnMgdGhlIGZsYWdzIFByZXNlbnQsIFdyaXRhYmxlIGFuZAorCSAqIEV4ZWN1dGFibGUuICovCiAJZm9yIChpID0gMDsgaSA8IG1hcHBlZF9wYWdlczsgaSsrKQogCQlsaW5lYXJbaV0gPSAoKGkgKiBnZXRwYWdlc2l6ZSgpKSB8IFBBR0VfUFJFU0VOVCk7CiAKLQkvKiBOb3cgc2V0IHVwIHBnZCBzbyB0aGF0IHRoaXMgbWVtb3J5IGlzIGF0IHBhZ2Vfb2Zmc2V0ICovCisJLyogVGhlIHRvcCBsZXZlbCBwb2ludHMgdG8gdGhlIGxpbmVhciBwYWdlIHRhYmxlIHBhZ2VzIGFib3ZlLiAgVGhlCisJICogZW50cnkgcmVwcmVzZW50aW5nIHBhZ2Vfb2Zmc2V0IHBvaW50cyB0byB0aGUgZmlyc3Qgb25lLCBhbmQgdGhleQorCSAqIGNvbnRpbnVlIGZyb20gdGhlcmUuICovCiAJZm9yIChpID0gMDsgaSA8IG1hcHBlZF9wYWdlczsgaSArPSBwdGVzX3Blcl9wYWdlKSB7CiAJCXBnZGlyWyhpICsgcGFnZV9vZmZzZXQvZ2V0cGFnZXNpemUoKSkvcHRlc19wZXJfcGFnZV0KIAkJCT0gKCgodTMyKWxpbmVhciArIGkqc2l6ZW9mKHUzMikpIHwgUEFHRV9QUkVTRU5UKTsKQEAgLTMwNSw5ICs0NzYsMTMgQEAKIAl2ZXJib3NlKCJMaW5lYXIgbWFwcGluZyBvZiAldSBwYWdlcyBpbiAldSBwdGUgcGFnZXMgYXQgJXBcbiIsCiAJCW1hcHBlZF9wYWdlcywgbGluZWFyX3BhZ2VzLCBsaW5lYXIpOwogCisJLyogV2UgcmV0dXJuIHRoZSB0b3AgbGV2ZWwgKGd1ZXN0LXBoeXNpY2FsKSBhZGRyZXNzOiB0aGUga2VybmVsIG5lZWRzCisJICogdG8ga25vdyB3aGVyZSBpdCBpcy4gKi8KIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcGdkaXI7CiB9CiAKKy8qIFNpbXBsZSByb3V0aW5lIHRvIHJvbGwgYWxsIHRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMgdG9nZXRoZXIgd2l0aCBzcGFjZXMKKyAqIGJldHdlZW4gdGhlbS4gKi8KIHN0YXRpYyB2b2lkIGNvbmNhdChjaGFyICpkc3QsIGNoYXIgKmFyZ3NbXSkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgbGVuID0gMDsKQEAgLTMyMSwxOCArNDk2LDI0IEBACiAJZHN0W2xlbl0gPSAnXDAnOwogfQogCisvKiBUaGlzIGlzIHdoZXJlIHdlIGFjdHVhbGx5IHRlbGwgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZSBHdWVzdC4gIFdlIHNhdworICogdGhlIGFyZ3VtZW50cyBpdCBleHBlY3RzIHdoZW4gd2UgbG9va2VkIGF0IGluaXRpYWxpemUoKSBpbiBsZ3Vlc3RfdXNlci5jOgorICogdGhlIHRvcCBwaHlzaWNhbCBwYWdlIHRvIGFsbG93LCB0aGUgdG9wIGxldmVsIHBhZ2V0YWJsZSwgdGhlIGVudHJ5IHBvaW50IGFuZAorICogdGhlIHBhZ2Vfb2Zmc2V0IGNvbnN0YW50IGZvciB0aGUgR3Vlc3QuICovCiBzdGF0aWMgaW50IHRlbGxfa2VybmVsKHUzMiBwZ2RpciwgdTMyIHN0YXJ0LCB1MzIgcGFnZV9vZmZzZXQpCiB7CiAJdTMyIGFyZ3NbXSA9IHsgTEhSRVFfSU5JVElBTElaRSwKLQkJICAgICAgIExHVUVTVF9HVUVTVF9UT1AvZ2V0cGFnZXNpemUoKSwgLyogSnVzdCBiZWxvdyB1cyAqLwotCQkgICAgICAgcGdkaXIsIHN0YXJ0LCBwYWdlX29mZnNldCB9OworCQkgICAgICAgdG9wL2dldHBhZ2VzaXplKCksIHBnZGlyLCBzdGFydCwgcGFnZV9vZmZzZXQgfTsKIAlpbnQgZmQ7CiAKIAlmZCA9IG9wZW5fb3JfZGllKCIvZGV2L2xndWVzdCIsIE9fUkRXUik7CiAJaWYgKHdyaXRlKGZkLCBhcmdzLCBzaXplb2YoYXJncykpIDwgMCkKIAkJZXJyKDEsICJXcml0aW5nIHRvIC9kZXYvbGd1ZXN0Iik7CisKKwkvKiBXZSByZXR1cm4gdGhlIC9kZXYvbGd1ZXN0IGZpbGUgZGVzY3JpcHRvciB0byBjb250cm9sIHRoaXMgR3Vlc3QgKi8KIAlyZXR1cm4gZmQ7CiB9CisvKjoqLwogCiBzdGF0aWMgdm9pZCBzZXRfZmQoaW50IGZkLCBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCiB7CkBAIC0zNDEsNjEgKzUyMiwxMDggQEAKIAkJZGV2aWNlcy0+bWF4X2luZmQgPSBmZDsKIH0KIAotLyogV2hlbiBpbnB1dCBhcnJpdmVzLCB3ZSB0ZWxsIHRoZSBrZXJuZWwgdG8ga2ljayBsZ3Vlc3Qgb3V0IHdpdGggLUVBR0FJTi4gKi8KKy8qTDoyMDAKKyAqIFRoZSBXYWtlci4KKyAqCisgKiBXaXRoIGEgY29uc29sZSBhbmQgbmV0d29yayBkZXZpY2VzLCB3ZSBjYW4gaGF2ZSBsb3RzIG9mIGlucHV0IHdoaWNoIHdlIG5lZWQKKyAqIHRvIHByb2Nlc3MuICBXZSBjb3VsZCB0cnkgdG8gdGVsbCB0aGUga2VybmVsIHdoYXQgZmlsZSBkZXNjcmlwdG9ycyB0byB3YXRjaCwKKyAqIGJ1dCBoYW5kaW5nIGEgZmlsZSBkZXNjcmlwdG9yIG1hc2sgdGhyb3VnaCB0byB0aGUga2VybmVsIGlzIGZhaXJseSBpY2t5LgorICoKKyAqIEluc3RlYWQsIHdlIGZvcmsgb2ZmIGEgcHJvY2VzcyB3aGljaCB3YXRjaGVzIHRoZSBmaWxlIGRlc2NyaXB0b3JzIGFuZCB3cml0ZXMKKyAqIHRoZSBMSFJFUV9CUkVBSyBjb21tYW5kIHRvIHRoZSAvZGV2L2xndWVzdCBmaWxlZGVzY3JpcHRvciB0byB0ZWxsIHRoZSBIb3N0CisgKiBsb29wIHRvIHN0b3AgcnVubmluZyB0aGUgR3Vlc3QuICBUaGlzIGNhdXNlcyBpdCB0byByZXR1cm4gZnJvbSB0aGUKKyAqIC9kZXYvbGd1ZXN0IHJlYWQgd2l0aCAtRUFHQUlOLCB3aGVyZSBpdCB3aWxsIHdyaXRlIHRvIC9kZXYvbGd1ZXN0IHRvIHJlc2V0CisgKiB0aGUgTEhSRVFfQlJFQUsgYW5kIHdha2UgdXMgdXAgYWdhaW4uCisgKgorICogVGhpcywgb2YgY291cnNlLCBpcyBtZXJlbHkgYSBkaWZmZXJlbnQgKmtpbmQqIG9mIGlja3kuCisgKi8KIHN0YXRpYyB2b2lkIHdha2VfcGFyZW50KGludCBwaXBlZmQsIGludCBsZ3Vlc3RfZmQsIHN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2aWNlcykKIHsKKwkvKiBBZGQgdGhlIHBpcGUgZnJvbSB0aGUgTGF1bmNoZXIgdG8gdGhlIGZkc2V0IGluIHRoZSBkZXZpY2VfbGlzdCwgc28KKwkgKiB3ZSB3YXRjaCBpdCwgdG9vLiAqLwogCXNldF9mZChwaXBlZmQsIGRldmljZXMpOwogCiAJZm9yICg7OykgewogCQlmZF9zZXQgcmZkcyA9IGRldmljZXMtPmluZmRzOwogCQl1MzIgYXJnc1tdID0geyBMSFJFUV9CUkVBSywgMSB9OwogCisJCS8qIFdhaXQgdW50aWwgaW5wdXQgaXMgcmVhZHkgZnJvbSBvbmUgb2YgdGhlIGRldmljZXMuICovCiAJCXNlbGVjdChkZXZpY2VzLT5tYXhfaW5mZCsxLCAmcmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CisJCS8qIElzIGl0IGEgbWVzc2FnZSBmcm9tIHRoZSBMYXVuY2hlcj8gKi8KIAkJaWYgKEZEX0lTU0VUKHBpcGVmZCwgJnJmZHMpKSB7CiAJCQlpbnQgaWdub3JlZmQ7CisJCQkvKiBJZiByZWFkKCkgcmV0dXJucyAwLCBpdCBtZWFucyB0aGUgTGF1bmNoZXIgaGFzCisJCQkgKiBleGl0ZWQuICBXZSBzaWxlbnRseSBmb2xsb3cuICovCiAJCQlpZiAocmVhZChwaXBlZmQsICZpZ25vcmVmZCwgc2l6ZW9mKGlnbm9yZWZkKSkgPT0gMCkKIAkJCQlleGl0KDApOworCQkJLyogT3RoZXJ3aXNlIGl0J3MgdGVsbGluZyB1cyB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoIG9uZQorCQkJICogb2YgdGhlIGRldmljZXMsIGFuZCB3ZSBzaG91bGQgaWdub3JlIHRoYXQgZmlsZQorCQkJICogZGVzY3JpcHRvciBmcm9tIG5vdyBvbi4gKi8KIAkJCUZEX0NMUihpZ25vcmVmZCwgJmRldmljZXMtPmluZmRzKTsKLQkJfSBlbHNlCisJCX0gZWxzZSAvKiBTZW5kIExIUkVRX0JSRUFLIGNvbW1hbmQuICovCiAJCQl3cml0ZShsZ3Vlc3RfZmQsIGFyZ3MsIHNpemVvZihhcmdzKSk7CiAJfQogfQogCisvKiBUaGlzIHJvdXRpbmUganVzdCBzZXRzIHVwIGEgcGlwZSB0byB0aGUgV2FrZXIgcHJvY2Vzcy4gKi8KIHN0YXRpYyBpbnQgc2V0dXBfd2FrZXIoaW50IGxndWVzdF9mZCwgc3RydWN0IGRldmljZV9saXN0ICpkZXZpY2VfbGlzdCkKIHsKIAlpbnQgcGlwZWZkWzJdLCBjaGlsZDsKIAorCS8qIFdlIGNyZWF0ZSBhIHBpcGUgdG8gdGFsayB0byB0aGUgd2FrZXIsIGFuZCBhbHNvIHNvIGl0IGtub3dzIHdoZW4gdGhlCisJICogTGF1bmNoZXIgZGllcyAoYW5kIGNsb3NlcyBwaXBlKS4gKi8KIAlwaXBlKHBpcGVmZCk7CiAJY2hpbGQgPSBmb3JrKCk7CiAJaWYgKGNoaWxkID09IC0xKQogCQllcnIoMSwgImZvcmtpbmciKTsKIAogCWlmIChjaGlsZCA9PSAwKSB7CisJCS8qIENsb3NlIHRoZSAid3JpdGluZyIgZW5kIG9mIG91ciBjb3B5IG9mIHRoZSBwaXBlICovCiAJCWNsb3NlKHBpcGVmZFsxXSk7CiAJCXdha2VfcGFyZW50KHBpcGVmZFswXSwgbGd1ZXN0X2ZkLCBkZXZpY2VfbGlzdCk7CiAJfQorCS8qIENsb3NlIHRoZSByZWFkaW5nIGVuZCBvZiBvdXIgY29weSBvZiB0aGUgcGlwZS4gKi8KIAljbG9zZShwaXBlZmRbMF0pOwogCisJLyogSGVyZSBpcyB0aGUgZmQgdXNlZCB0byB0YWxrIHRvIHRoZSB3YWtlci4gKi8KIAlyZXR1cm4gcGlwZWZkWzFdOwogfQogCisvKkw6MjEwCisgKiBEZXZpY2UgSGFuZGxpbmcuCisgKgorICogV2hlbiB0aGUgR3Vlc3Qgc2VuZHMgRE1BIHRvIHVzLCBpdCBzZW5kcyB1cyBhbiBhcnJheSBvZiBhZGRyZXNzZXMgYW5kIHNpemVzLgorICogV2UgbmVlZCB0byBtYWtlIHN1cmUgaXQncyBub3QgdHJ5aW5nIHRvIHJlYWNoIGludG8gdGhlIExhdW5jaGVyIGl0c2VsZiwgc28KKyAqIHdlIGhhdmUgYSBjb252ZW5pZW50IHJvdXRpbmUgd2hpY2ggY2hlY2sgaXQgYW5kIGV4aXRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZQorICogaWYgc29tZXRoaW5nIGZ1bm55IGlzIGdvaW5nIG9uOgorICovCiBzdGF0aWMgdm9pZCAqX2NoZWNrX3BvaW50ZXIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbGluZSkKIHsKLQlpZiAoYWRkciA+PSBMR1VFU1RfR1VFU1RfVE9QIHx8IGFkZHIgKyBzaXplID49IExHVUVTVF9HVUVTVF9UT1ApCisJLyogV2UgaGF2ZSB0byBzZXBhcmF0ZWx5IGNoZWNrIGFkZHIgYW5kIGFkZHIrc2l6ZSwgYmVjYXVzZSBzaXplIGNvdWxkCisJICogYmUgaHVnZSBhbmQgYWRkciArIHNpemUgbWlnaHQgd3JhcCBhcm91bmQuICovCisJaWYgKGFkZHIgPj0gdG9wIHx8IGFkZHIgKyBzaXplID49IHRvcCkKIAkJZXJyeCgxLCAiJXM6JWk6IEludmFsaWQgYWRkcmVzcyAlbGkiLCBfX0ZJTEVfXywgbGluZSwgYWRkcik7CisJLyogV2UgcmV0dXJuIGEgcG9pbnRlciBmb3IgdGhlIGNhbGxlcidzIGNvbnZlbmllbmNlLCBub3cgd2Uga25vdyBpdCdzCisJICogc2FmZSB0byB1c2UuICovCiAJcmV0dXJuICh2b2lkICopYWRkcjsKIH0KKy8qIEEgbWFjcm8gd2hpY2ggdHJhbnNwYXJlbnRseSBoYW5kcyB0aGUgbGluZSBudW1iZXIgdG8gdGhlIHJlYWwgZnVuY3Rpb24uICovCiAjZGVmaW5lIGNoZWNrX3BvaW50ZXIoYWRkcixzaXplKSBfY2hlY2tfcG9pbnRlcihhZGRyLCBzaXplLCBfX0xJTkVfXykKIAotLyogUmV0dXJucyBwb2ludGVyIHRvIGRtYS0+dXNlZF9sZW4gKi8KKy8qIFRoZSBHdWVzdCBoYXMgZ2l2ZW4gdXMgdGhlIGFkZHJlc3Mgb2YgYSAic3RydWN0IGxndWVzdF9kbWEiLiAgV2UgY2hlY2sgaXQncworICogT0sgYW5kIGNvbnZlcnQgaXQgdG8gYW4gaW92ZWMgKHdoaWNoIGlzIGEgc2ltcGxlIGFycmF5IG9mIHB0ci9zaXplCisgKiBwYWlycykuICovCiBzdGF0aWMgdTMyICpkbWEyaW92KHVuc2lnbmVkIGxvbmcgZG1hLCBzdHJ1Y3QgaW92ZWMgaW92W10sIHVuc2lnbmVkICpudW0pCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IGxndWVzdF9kbWEgKnVkbWE7CiAKKwkvKiBGaXJzdCB3ZSBtYWtlIHN1cmUgdGhhdCB0aGUgYXJyYXkgbWVtb3J5IGl0c2VsZiBpcyB2YWxpZC4gKi8KIAl1ZG1hID0gY2hlY2tfcG9pbnRlcihkbWEsIHNpemVvZigqdWRtYSkpOworCS8qIE5vdyB3ZSBjaGVjayBlYWNoIGVsZW1lbnQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTEdVRVNUX01BWF9ETUFfU0VDVElPTlM7IGkrKykgeworCQkvKiBBIHplcm8gbGVuZ3RoIGVuZHMgdGhlIGFycmF5LiAqLwogCQlpZiAoIXVkbWEtPmxlbltpXSkKIAkJCWJyZWFrOwogCkBAIC00MDMsOSArNjMxLDE1IEBACiAJCWlvdltpXS5pb3ZfbGVuID0gdWRtYS0+bGVuW2ldOwogCX0KIAkqbnVtID0gaTsKKworCS8qIFdlIHJldHVybiB0aGUgcG9pbnRlciB0byB3aGVyZSB0aGUgY2FsbGVyIHNob3VsZCB3cml0ZSB0aGUgYW1vdW50IG9mCisJICogdGhlIGJ1ZmZlciB1c2VkLiAqLwogCXJldHVybiAmdWRtYS0+dXNlZF9sZW47CiB9CiAKKy8qIFRoaXMgcm91dGluZSBnZXRzIGEgRE1BIGJ1ZmZlciBmcm9tIHRoZSBHdWVzdCBmb3IgYSBnaXZlbiBrZXksIGFuZCBjb252ZXJ0cworICogaXQgdG8gYW4gaW92ZWMgYXJyYXkuICBJdCByZXR1cm5zIHRoZSBpbnRlcnJ1cHQgdGhlIEd1ZXN0IHdhbnRzIHdoZW4gd2UncmUKKyAqIGZpbmlzaGVkLCBhbmQgYSBwb2ludGVyIHRvIHRoZSAidXNlZF9sZW4iIGZpZWxkIHRvIGZpbGwgaW4uICovCiBzdGF0aWMgdTMyICpnZXRfZG1hX2J1ZmZlcihpbnQgZmQsIHZvaWQgKmtleSwKIAkJCSAgIHN0cnVjdCBpb3ZlYyBpb3ZbXSwgdW5zaWduZWQgaW50ICpudW0sIHUzMiAqaXJxKQogewpAQCAtNDEzLDE2ICs2NDcsMjEgQEAKIAl1bnNpZ25lZCBsb25nIHVkbWE7CiAJdTMyICpyZXM7CiAKKwkvKiBBc2sgdGhlIGtlcm5lbCBmb3IgYSBETUEgYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBrZXkuICovCiAJdWRtYSA9IHdyaXRlKGZkLCBidWYsIHNpemVvZihidWYpKTsKKwkvKiBUaGV5IGhhdmVuJ3QgcmVnaXN0ZXJlZCBhbnksIG9yIHRoZXkncmUgYWxsIHVzZWQ/ICovCiAJaWYgKHVkbWEgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCiAJCXJldHVybiBOVUxMOwogCi0JLyogS2VybmVsIHN0YXNoZXMgaXJxIGluIC0+dXNlZF9sZW4uICovCisJLyogQ29udmVydCBpdCBpbnRvIG91ciBpb3ZlYyBhcnJheSAqLwogCXJlcyA9IGRtYTJpb3YodWRtYSwgaW92LCBudW0pOworCS8qIFRoZSBrZXJuZWwgc3Rhc2hlcyBpcnEgaW4gLT51c2VkX2xlbiB0byBnZXQgaXQgb3V0IHRvIHVzLiAqLwogCSppcnEgPSAqcmVzOworCS8qIFJldHVybiBhIHBvaW50ZXIgdG8gKChzdHJ1Y3QgbGd1ZXN0X2RtYSAqKXVkbWEpLT51c2VkX2xlbi4gKi8KIAlyZXR1cm4gcmVzOwogfQogCisvKiBUaGlzIGlzIGEgY29udmVuaWVudCByb3V0aW5lIHRvIHNlbmQgdGhlIEd1ZXN0IGFuIGludGVycnVwdC4gKi8KIHN0YXRpYyB2b2lkIHRyaWdnZXJfaXJxKGludCBmZCwgdTMyIGlycSkKIHsKIAl1MzIgYnVmW10gPSB7IExIUkVRX0lSUSwgaXJxIH07CkBAIC00MzAsNiArNjY5LDEwIEBACiAJCWVycigxLCAiVHJpZ2dlcmluZyBpcnEgJWkiLCBpcnEpOwogfQogCisvKiBUaGlzIHNpbXBseSBzZXRzIHVwIGFuIGlvdmVjIGFycmF5IHdoZXJlIHdlIGNhbiBwdXQgZGF0YSB0byBiZSBkaXNjYXJkZWQuCisgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgR3Vlc3QgZG9lc24ndCB3YW50IG9yIGNhbid0IGhhbmRsZSB0aGUgaW5wdXQ6IHdlIGhhdmUKKyAqIHRvIGdldCByaWQgb2YgaXQgc29tZXdoZXJlLCBhbmQgaWYgd2UgYnVyeSBpdCBpbiB0aGUgY2VpbGluZyBzcGFjZSBpdCB3aWxsCisgKiBzdGFydCB0byBzbWVsbCBhZnRlciBhIHdlZWsuICovCiBzdGF0aWMgdm9pZCBkaXNjYXJkX2lvdmVjKHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgKm51bSkKIHsKIAlzdGF0aWMgY2hhciBkaXNjYXJkX2J1ZlsxMDI0XTsKQEAgLTQzOCwxOSArNjgxLDI0IEBACiAJaW92LT5pb3ZfbGVuID0gc2l6ZW9mKGRpc2NhcmRfYnVmKTsKIH0KIAorLyogSGVyZSBpcyB0aGUgaW5wdXQgdGVybWluYWwgc2V0dGluZyB3ZSBzYXZlLCBhbmQgdGhlIHJvdXRpbmUgdG8gcmVzdG9yZSB0aGVtCisgKiBvbiBleGl0IHNvIHRoZSB1c2VyIGNhbiBzZWUgd2hhdCB0aGV5IHR5cGUgbmV4dC4gKi8KIHN0YXRpYyBzdHJ1Y3QgdGVybWlvcyBvcmlnX3Rlcm07CiBzdGF0aWMgdm9pZCByZXN0b3JlX3Rlcm0odm9pZCkKIHsKIAl0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBTk9XLCAmb3JpZ190ZXJtKTsKIH0KIAorLyogV2UgYXNzb2NpYXRlIHNvbWUgZGF0YSB3aXRoIHRoZSBjb25zb2xlIGZvciBvdXIgZXhpdCBoYWNrLiAqLwogc3RydWN0IGNvbnNvbGVfYWJvcnQKIHsKKwkvKiBIb3cgbWFueSB0aW1lcyBoYXZlIHRoZXkgaGl0IF5DPyAqLwogCWludCBjb3VudDsKKwkvKiBXaGVuIGRpZCB0aGV5IHN0YXJ0PyAqLwogCXN0cnVjdCB0aW1ldmFsIHN0YXJ0OwogfTsKIAotLyogV2UgRE1BIGlucHV0IHRvIGJ1ZmZlciBib3VuZCBhdCBzdGFydCBvZiBjb25zb2xlIHBhZ2UuICovCisvKiBUaGlzIGlzIHRoZSByb3V0aW5lIHdoaWNoIGhhbmRsZXMgY29uc29sZSBpbnB1dCAoaWUuIHN0ZGluKS4gKi8KIHN0YXRpYyBib29sIGhhbmRsZV9jb25zb2xlX2lucHV0KGludCBmZCwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXUzMiBpcnEgPSAwLCAqbGVucDsKQEAgLTQ1OSwyNCArNzA3LDM4IEBACiAJc3RydWN0IGlvdmVjIGlvdltMR1VFU1RfTUFYX0RNQV9TRUNUSU9OU107CiAJc3RydWN0IGNvbnNvbGVfYWJvcnQgKmFib3J0ID0gZGV2LT5wcml2OwogCisJLyogRmlyc3Qgd2UgZ2V0IHRoZSBjb25zb2xlIGJ1ZmZlciBmcm9tIHRoZSBHdWVzdC4gIFRoZSBrZXkgaXMgZGV2LT5tZW0KKwkgKiB3aGljaCB3YXMgc2V0IHRvIDAgaW4gc2V0dXBfY29uc29sZSgpLiAqLwogCWxlbnAgPSBnZXRfZG1hX2J1ZmZlcihmZCwgZGV2LT5tZW0sIGlvdiwgJm51bSwgJmlycSk7CiAJaWYgKCFsZW5wKSB7CisJCS8qIElmIGl0J3Mgbm90IHJlYWR5IGZvciBpbnB1dCwgd2FybiBhbmQgc2V0IHVwIHRvIGRpc2NhcmQuICovCiAJCXdhcm4oImNvbnNvbGU6IG5vIGRtYSBidWZmZXIhIik7CiAJCWRpc2NhcmRfaW92ZWMoaW92LCAmbnVtKTsKIAl9CiAKKwkvKiBUaGlzIGlzIHdoeSB3ZSBjb252ZXJ0IHRvIGlvdmVjczogdGhlIHJlYWR2KCkgY2FsbCB1c2VzIHRoZW0sIGFuZCBzbworCSAqIGl0IHJlYWRzIHN0cmFpZ2h0IGludG8gdGhlIEd1ZXN0J3MgYnVmZmVyLiAqLwogCWxlbiA9IHJlYWR2KGRldi0+ZmQsIGlvdiwgbnVtKTsKIAlpZiAobGVuIDw9IDApIHsKKwkJLyogVGhpcyBpbXBsaWVzIHRoYXQgdGhlIGNvbnNvbGUgaXMgY2xvc2VkLCBpcyAvZGV2L251bGwsIG9yCisJCSAqIHNvbWV0aGluZyB3ZW50IHRlcnJpYmx5IHdyb25nLiAgV2Ugc3RpbGwgZ28gdGhyb3VnaCB0aGUgcmVzdAorCQkgKiBvZiB0aGUgbG9naWMsIHRob3VnaCwgZXNwZWNpYWxseSB0aGUgZXhpdCBoYW5kbGluZyBiZWxvdy4gKi8KIAkJd2FybngoIkZhaWxlZCB0byBnZXQgY29uc29sZSBpbnB1dCwgaWdub3JpbmcgY29uc29sZS4iKTsKIAkJbGVuID0gMDsKIAl9CiAKKwkvKiBJZiB3ZSByZWFkIHRoZSBkYXRhIGludG8gdGhlIEd1ZXN0LCBmaWxsIGluIHRoZSBsZW5ndGggYW5kIHNlbmQgdGhlCisJICogaW50ZXJydXB0LiAqLwogCWlmIChsZW5wKSB7CiAJCSpsZW5wID0gbGVuOwogCQl0cmlnZ2VyX2lycShmZCwgaXJxKTsKIAl9CiAKLQkvKiBUaHJlZSBeQyB3aXRoaW4gb25lIHNlY29uZD8gIEV4aXQuICovCisJLyogVGhyZWUgXkMgd2l0aGluIG9uZSBzZWNvbmQ/ICBFeGl0LgorCSAqCisJICogVGhpcyBpcyBzdWNoIGEgaGFjaywgYnV0IHdvcmtzIHN1cnByaXNpbmdseSB3ZWxsLiAgRWFjaCBeQyBoYXMgdG8gYmUKKwkgKiBpbiBhIGJ1ZmZlciBieSBpdHNlbGYsIHNvIHRoZXkgY2FuJ3QgYmUgdG9vIGZhc3QuICBCdXQgd2UgY2hlY2sgdGhhdAorCSAqIHdlIGdldCB0aHJlZSB3aXRoaW4gYWJvdXQgYSBzZWNvbmQsIHNvIHRoZXkgY2FuJ3QgYmUgdG9vIHNsb3cuICovCiAJaWYgKGxlbiA9PSAxICYmICgoY2hhciAqKWlvdlswXS5pb3ZfYmFzZSlbMF0gPT0gMykgewogCQlpZiAoIWFib3J0LT5jb3VudCsrKQogCQkJZ2V0dGltZW9mZGF5KCZhYm9ydC0+c3RhcnQsIE5VTEwpOwpAQCAtNDg0LDQzICs3NDYsNjAgQEAKIAkJCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAkJCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKIAkJCWlmIChub3cudHZfc2VjIDw9IGFib3J0LT5zdGFydC50dl9zZWMrMSkgewotCQkJCS8qIE1ha2Ugc3VyZSB3YWtlciBpcyBub3QgYmxvY2tlZCBpbiBCUkVBSyAqLwogCQkJCXUzMiBhcmdzW10gPSB7IExIUkVRX0JSRUFLLCAwIH07CisJCQkJLyogQ2xvc2UgdGhlIGZkIHNvIFdha2VyIHdpbGwga25vdyBpdCBoYXMgdG8KKwkJCQkgKiBleGl0LiAqLwogCQkJCWNsb3NlKHdha2VyX2ZkKTsKKwkJCQkvKiBKdXN0IGluIGNhc2Ugd2FrZXIgaXMgYmxvY2tlZCBpbiBCUkVBSywgc2VuZAorCQkJCSAqIHVuYnJlYWsgbm93LiAqLwogCQkJCXdyaXRlKGZkLCBhcmdzLCBzaXplb2YoYXJncykpOwogCQkJCWV4aXQoMik7CiAJCQl9CiAJCQlhYm9ydC0+Y291bnQgPSAwOwogCQl9CiAJfSBlbHNlCisJCS8qIEFueSBvdGhlciBrZXkgcmVzZXRzIHRoZSBhYm9ydCBjb3VudGVyLiAqLwogCQlhYm9ydC0+Y291bnQgPSAwOwogCisJLyogTm93LCBpZiB3ZSBkaWRuJ3QgcmVhZCBhbnl0aGluZywgcHV0IHRoZSBpbnB1dCB0ZXJtaW5hbCBiYWNrIGFuZAorCSAqIHJldHVybiBmYWlsdXJlIChtZWFuaW5nLCBkb24ndCBjYWxsIHVzIGFnYWluKS4gKi8KIAlpZiAoIWxlbikgewogCQlyZXN0b3JlX3Rlcm0oKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KKwkvKiBFdmVyeXRoaW5nIHdlbnQgT0shICovCiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qIEhhbmRsaW5nIGNvbnNvbGUgb3V0cHV0IGlzIG11Y2ggc2ltcGxlciB0aGFuIGlucHV0LiAqLwogc3RhdGljIHUzMiBoYW5kbGVfY29uc29sZV9vdXRwdXQoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQkgdW5zaWduZWQgbnVtLCBzdHJ1Y3QgZGV2aWNlKmRldikKIHsKKwkvKiBXaGF0ZXZlciB0aGUgR3Vlc3Qgc2VuZHMsIHdyaXRlIGl0IHRvIHN0YW5kYXJkIG91dHB1dC4gIFJldHVybiB0aGUKKwkgKiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gKi8KIAlyZXR1cm4gd3JpdGV2KFNURE9VVF9GSUxFTk8sIGlvdiwgbnVtKTsKIH0KIAorLyogR3Vlc3QtPkhvc3QgbmV0d29yayBvdXRwdXQgaXMgYWxzbyBwcmV0dHkgZWFzeS4gKi8KIHN0YXRpYyB1MzIgaGFuZGxlX3R1bl9vdXRwdXQoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCSAgICAgdW5zaWduZWQgbnVtLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JLyogTm93IHdlJ3ZlIHNlZW4gb3V0cHV0LCB3ZSBzaG91bGQgd2FybiBpZiB3ZSBjYW4ndCBnZXQgYnVmZmVycy4gKi8KKwkvKiBXZSBwdXQgYSBmbGFnIGluIHRoZSAicHJpdiIgcG9pbnRlciBvZiB0aGUgbmV0d29yayBkZXZpY2UsIGFuZCBzZXQKKwkgKiBpdCBhcyBzb29uIGFzIHdlIHNlZSBvdXRwdXQuICBXZSdsbCBzZWUgd2h5IGluIGhhbmRsZV90dW5faW5wdXQoKSAqLwogCSooYm9vbCAqKWRldi0+cHJpdiA9IHRydWU7CisJLyogV2hhdGV2ZXIgcGFja2V0IHRoZSBHdWVzdCBzZW50IHVzLCB3cml0ZSBpdCBvdXQgdG8gdGhlIHR1bgorCSAqIGRldmljZS4gKi8KIAlyZXR1cm4gd3JpdGV2KGRldi0+ZmQsIGlvdiwgbnVtKTsKIH0KIAorLyogVGhpcyBtYXRjaGVzIHRoZSBwZWVyX2tleSgpIGluIGxndWVzdF9uZXQuYy4gIFRoZSBrZXkgZm9yIGFueSBnaXZlbiBzbG90CisgKiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBkZXZpY2UncyBwYWdlIHBsdXMgNCAqIHRoZSBzbG90IG51bWJlci4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBlZXJfb2Zmc2V0KHVuc2lnbmVkIGludCBwZWVybnVtKQogewogCXJldHVybiA0ICogcGVlcm51bTsKIH0KIAorLyogVGhpcyBpcyB3aGVyZSB3ZSBoYW5kbGUgYSBwYWNrZXQgY29taW5nIGluIGZyb20gdGhlIHR1biBkZXZpY2UgKi8KIHN0YXRpYyBib29sIGhhbmRsZV90dW5faW5wdXQoaW50IGZkLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJdTMyIGlycSA9IDAsICpsZW5wOwpAQCAtNTI4LDE3ICs4MDcsMjggQEAKIAl1bnNpZ25lZCBudW07CiAJc3RydWN0IGlvdmVjIGlvdltMR1VFU1RfTUFYX0RNQV9TRUNUSU9OU107CiAKKwkvKiBGaXJzdCB3ZSBnZXQgYSBidWZmZXIgdGhlIEd1ZXN0IGhhcyBib3VuZCB0byBpdHMga2V5LiAqLwogCWxlbnAgPSBnZXRfZG1hX2J1ZmZlcihmZCwgZGV2LT5tZW0rcGVlcl9vZmZzZXQoTkVUX1BFRVJOVU0pLCBpb3YsICZudW0sCiAJCQkgICAgICAmaXJxKTsKIAlpZiAoIWxlbnApIHsKKwkJLyogTm93LCBpdCdzIGV4cGVjdGVkIHRoYXQgaWYgd2UgdHJ5IHRvIHNlbmQgYSBwYWNrZXQgdG9vCisJCSAqIGVhcmx5LCB0aGUgR3Vlc3Qgd29uJ3QgYmUgcmVhZHkgeWV0LiAgVGhpcyBpcyB3aHkgd2Ugc2V0IGEKKwkJICogZmxhZyB3aGVuIHRoZSBHdWVzdCBzZW5kcyBpdHMgZmlyc3QgcGFja2V0LiAgSWYgaXQncyBzZW50IGEKKwkJICogcGFja2V0IHdlIGFzc3VtZSBpdCBzaG91bGQgYmUgcmVhZHkgdG8gcmVjZWl2ZSB0aGVtLgorCQkgKgorCQkgKiBBY3R1YWxseSwgdGhpcyBpcyB3aGF0IHRoZSBzdGF0dXMgYml0cyBpbiB0aGUgZGVzY3JpcHRvciBhcmUKKwkJICogZm9yOiB3ZSBzaG91bGQgKnVzZSogdGhlbS4gIEZJWE1FISAqLwogCQlpZiAoKihib29sICopZGV2LT5wcml2KQogCQkJd2FybigibmV0d29yazogbm8gZG1hIGJ1ZmZlciEiKTsKIAkJZGlzY2FyZF9pb3ZlYyhpb3YsICZudW0pOwogCX0KIAorCS8qIFJlYWQgdGhlIHBhY2tldCBmcm9tIHRoZSBkZXZpY2UgZGlyZWN0bHkgaW50byB0aGUgR3Vlc3QncyBidWZmZXIuICovCiAJbGVuID0gcmVhZHYoZGV2LT5mZCwgaW92LCBudW0pOwogCWlmIChsZW4gPD0gMCkKIAkJZXJyKDEsICJyZWFkaW5nIG5ldHdvcmsiKTsKKworCS8qIFdyaXRlIHRoZSB1c2VkX2xlbiwgYW5kIHRyaWdnZXIgdGhlIGludGVycnVwdCBmb3IgdGhlIEd1ZXN0ICovCiAJaWYgKGxlbnApIHsKIAkJKmxlbnAgPSBsZW47CiAJCXRyaWdnZXJfaXJxKGZkLCBpcnEpOwpAQCAtNTQ2LDkgKzgzNiwxMyBAQAogCXZlcmJvc2UoInR1biBpbnB1dCBwYWNrZXQgbGVuICVpIFslMDJ4ICUwMnhdICglcylcbiIsIGxlbiwKIAkJKCh1OCAqKWlvdlswXS5pb3ZfYmFzZSlbMF0sICgodTggKilpb3ZbMF0uaW92X2Jhc2UpWzFdLAogCQlsZW5wID8gInNlbnQiIDogImRpc2NhcmRlZCIpOworCS8qIEFsbCBnb29kLiAqLwogCXJldHVybiB0cnVlOwogfQogCisvKiBUaGUgbGFzdCBkZXZpY2UgaGFuZGxpbmcgcm91dGluZSBpcyBibG9jayBvdXRwdXQ6IHRoZSBHdWVzdCBoYXMgc2VudCBhIERNQQorICogdG8gdGhlIGJsb2NrIGRldmljZS4gIEl0IHdpbGwgaGF2ZSBwbGFjZWQgdGhlIGNvbW1hbmQgaXQgd2FudHMgaW4gdGhlCisgKiAic3RydWN0IGxndWVzdF9ibG9ja19wYWdlIi4gKi8KIHN0YXRpYyB1MzIgaGFuZGxlX2Jsb2NrX291dHB1dChpbnQgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJICAgICAgIHVuc2lnbmVkIG51bSwgc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNTU4LDM2ICs4NTIsNjQgQEAKIAlzdHJ1Y3QgaW92ZWMgcmVwbHlbTEdVRVNUX01BWF9ETUFfU0VDVElPTlNdOwogCW9mZjY0X3QgZGV2aWNlX2xlbiwgb2ZmID0gKG9mZjY0X3QpcC0+c2VjdG9yICogNTEyOwogCisJLyogRmlyc3Qgd2UgZXh0cmFjdCB0aGUgZGV2aWNlIGxlbmd0aCBmcm9tIHRoZSBkZXYtPnByaXYgcG9pbnRlci4gKi8KIAlkZXZpY2VfbGVuID0gKihvZmY2NF90ICopZGV2LT5wcml2OwogCisJLyogV2UgZmlyc3QgY2hlY2sgdGhhdCB0aGUgcmVhZCBvciB3cml0ZSBpcyB3aXRoaW4gdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiBibG9jayBmaWxlLiAqLwogCWlmIChvZmYgPj0gZGV2aWNlX2xlbikKIAkJZXJyKDEsICJCYWQgb2Zmc2V0ICVsbHUgdnMgJWxsdSIsIG9mZiwgZGV2aWNlX2xlbik7CisJLyogTW92ZSB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIGJsb2NrIGZpbGUuICBUaGlzIHNob3VsZG4ndCBmYWlsLAorCSAqIGJ1dCBiZXN0IHRvIGNoZWNrLiAqLwogCWlmIChsc2VlazY0KGRldi0+ZmQsIG9mZiwgU0VFS19TRVQpICE9IG9mZikKIAkJZXJyKDEsICJCYWQgc2VlayB0byBzZWN0b3IgJWkiLCBwLT5zZWN0b3IpOwogCiAJdmVyYm9zZSgiQmxvY2s6ICVzIGF0IG9mZnNldCAlbGx1XG4iLCBwLT50eXBlID8gIldSSVRFIiA6ICJSRUFEIiwgb2ZmKTsKIAorCS8qIFRoZXkgd2VyZSBzdXBwb3NlZCB0byBiaW5kIGEgcmVwbHkgYnVmZmVyIGF0IGtleSBlcXVhbCB0byB0aGUgc3RhcnQKKwkgKiBvZiB0aGUgYmxvY2sgZGV2aWNlIG1lbW9yeS4gIFdlIG5lZWQgdGhpcyB0byB0ZWxsIHRoZW0gd2hlbiB0aGUKKwkgKiByZXF1ZXN0IGlzIGZpbmlzaGVkLiAqLwogCWxlbnAgPSBnZXRfZG1hX2J1ZmZlcihmZCwgZGV2LT5tZW0sIHJlcGx5LCAmcmVwbHlfbnVtLCAmaXJxKTsKIAlpZiAoIWxlbnApCiAJCWVycigxLCAiQmxvY2sgcmVxdWVzdCBkaWRuJ3QgZ2l2ZSB1cyBhIGRtYSBidWZmZXIiKTsKIAogCWlmIChwLT50eXBlKSB7CisJCS8qIEEgd3JpdGUgcmVxdWVzdC4gIFRoZSBETUEgdGhleSBzZW50IGNvbnRhaW5lZCB0aGUgZGF0YSwgc28KKwkJICogd3JpdGUgaXQgb3V0LiAqLwogCQlsZW4gPSB3cml0ZXYoZGV2LT5mZCwgaW92LCBudW0pOworCQkvKiBHcnIuLi4gTm93IHdlIGtub3cgaG93IGxvbmcgdGhlICJzdHJ1Y3QgbGd1ZXN0X2RtYSIgdGhleQorCQkgKiBzZW50IHdhcywgd2UgbWFrZSBzdXJlIHRoZXkgZGlkbid0IHRyeSB0byB3cml0ZSBvdmVyIHRoZSBlbmQKKwkJICogb2YgdGhlIGJsb2NrIGZpbGUgKHBvc3NpYmx5IGV4dGVuZGluZyBpdCkuICovCiAJCWlmIChvZmYgKyBsZW4gPiBkZXZpY2VfbGVuKSB7CisJCQkvKiBUcmltIGl0IGJhY2sgdG8gdGhlIGNvcnJlY3QgbGVuZ3RoICovCiAJCQlmdHJ1bmNhdGUoZGV2LT5mZCwgZGV2aWNlX2xlbik7CisJCQkvKiBEaWUsIGJhZCBHdWVzdCwgZGllLiAqLwogCQkJZXJyeCgxLCAiV3JpdGUgcGFzdCBlbmQgJWxsdSsldSIsIG9mZiwgbGVuKTsKIAkJfQorCQkvKiBUaGUgcmVwbHkgbGVuZ3RoIGlzIDA6IHdlIGp1c3Qgc2VuZCBiYWNrIGFuIGVtcHR5IERNQSB0bworCQkgKiBpbnRlcnJ1cHQgdGhlbSBhbmQgdGVsbCB0aGVtIHRoZSB3cml0ZSBpcyBmaW5pc2hlZC4gKi8KIAkJKmxlbnAgPSAwOwogCX0gZWxzZSB7CisJCS8qIEEgcmVhZCByZXF1ZXN0LiAgVGhleSBzZW50IGFuIGVtcHR5IERNQSB0byBzdGFydCB0aGUKKwkJICogcmVxdWVzdCwgYW5kIHdlIHB1dCB0aGUgcmVhZCBjb250ZW50cyBpbnRvIHRoZSByZXBseQorCQkgKiBidWZmZXIuICovCiAJCWxlbiA9IHJlYWR2KGRldi0+ZmQsIHJlcGx5LCByZXBseV9udW0pOwogCQkqbGVucCA9IGxlbjsKIAl9CiAKKwkvKiBUaGUgcmVzdWx0IGlzIDEgKGRvbmUpLCAyIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAoc2hvcnQgcmVhZCBvcgorCSAqIHdyaXRlKS4gKi8KIAlwLT5yZXN1bHQgPSAxICsgKHAtPmJ5dGVzICE9IGxlbik7CisJLyogTm93IHRlbGwgdGhlbSB3ZSd2ZSB1c2VkIHRoZWlyIHJlcGx5IGJ1ZmZlci4gKi8KIAl0cmlnZ2VyX2lycShmZCwgaXJxKTsKKworCS8qIFdlJ3JlIHN1cHBvc2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIHdlCisJICogdXNlZC4gIEJ1dCB0aGUgYmxvY2sgZGV2aWNlIHVzZXMgdGhlICJyZXN1bHQiIGZpZWxkIGluc3RlYWQsIHNvIHdlCisJICogZG9uJ3QgYm90aGVyLiAqLwogCXJldHVybiAwOwogfQogCisvKiBUaGlzIGlzIHRoZSBnZW5lcmljIHJvdXRpbmUgd2UgY2FsbCB3aGVuIHRoZSBHdWVzdCBzZW5kcyBzb21lIERNQSBvdXQuICovCiBzdGF0aWMgdm9pZCBoYW5kbGVfb3V0cHV0KGludCBmZCwgdW5zaWduZWQgbG9uZyBkbWEsIHVuc2lnbmVkIGxvbmcga2V5LAogCQkJICBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCiB7CkBAIC01OTYsMzAgKzkxOCw1MyBAQAogCXN0cnVjdCBpb3ZlYyBpb3ZbTEdVRVNUX01BWF9ETUFfU0VDVElPTlNdOwogCXVuc2lnbmVkIG51bSA9IDA7CiAKKwkvKiBDb252ZXJ0IHRoZSAic3RydWN0IGxndWVzdF9kbWEiIHRoZXkncmUgc2VuZGluZyB0byBhICJzdHJ1Y3QKKwkgKiBpb3ZlYyIuICovCiAJbGVucCA9IGRtYTJpb3YoZG1hLCBpb3YsICZudW0pOworCisJLyogQ2hlY2sgZWFjaCBkZXZpY2U6IGlmIHRoZXkgZXhwZWN0IG91dHB1dCB0byB0aGlzIGtleSwgdGVsbCB0aGVtIHRvCisJICogaGFuZGxlIGl0LiAqLwogCWZvciAoaSA9IGRldmljZXMtPmRldjsgaTsgaSA9IGktPm5leHQpIHsKIAkJaWYgKGktPmhhbmRsZV9vdXRwdXQgJiYga2V5ID09IGktPndhdGNoX2tleSkgeworCQkJLyogV2Ugd3JpdGUgdGhlIHJlc3VsdCBzdHJhaWdodCBpbnRvIHRoZSB1c2VkX2xlbiBmaWVsZAorCQkJICogZm9yIHRoZW0uICovCiAJCQkqbGVucCA9IGktPmhhbmRsZV9vdXRwdXQoZmQsIGlvdiwgbnVtLCBpKTsKIAkJCXJldHVybjsKIAkJfQogCX0KKworCS8qIFRoaXMgY2FuIGhhcHBlbjogdGhlIGtlcm5lbCBzZW5kcyBhbnkgU0VORF9ETUEgd2hpY2ggZG9lc24ndCBtYXRjaAorCSAqIGFub3RoZXIgR3Vlc3QgdG8gdXMuICBJdCBjb3VsZCBiZSB0aGF0IGFub3RoZXIgR3Vlc3QganVzdCBsZWZ0IGEKKwkgKiBuZXR3b3JrLCBmb3IgZXhhbXBsZS4gIEJ1dCBpdCdzIHVudXN1YWwuICovCiAJd2FybngoIlBlbmRpbmcgZG1hICVwLCBrZXkgJXAiLCAodm9pZCAqKWRtYSwgKHZvaWQgKilrZXkpOwogfQogCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSB3YWtlciB3YWtlcyB1cyB1cDogY2hlY2sgZm9yIGluY29taW5nIGZpbGUKKyAqIGRlc2NyaXB0b3JzLiAqLwogc3RhdGljIHZvaWQgaGFuZGxlX2lucHV0KGludCBmZCwgc3RydWN0IGRldmljZV9saXN0ICpkZXZpY2VzKQogeworCS8qIHNlbGVjdCgpIHdhbnRzIGEgemVyb2VkIHRpbWV2YWwgdG8gbWVhbiAiZG9uJ3Qgd2FpdCIuICovCiAJc3RydWN0IHRpbWV2YWwgcG9sbCA9IHsgLnR2X3NlYyA9IDAsIC50dl91c2VjID0gMCB9OwogCiAJZm9yICg7OykgewogCQlzdHJ1Y3QgZGV2aWNlICppOwogCQlmZF9zZXQgZmRzID0gZGV2aWNlcy0+aW5mZHM7CiAKKwkJLyogSWYgbm90aGluZyBpcyByZWFkeSwgd2UncmUgZG9uZS4gKi8KIAkJaWYgKHNlbGVjdChkZXZpY2VzLT5tYXhfaW5mZCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmcG9sbCkgPT0gMCkKIAkJCWJyZWFrOwogCisJCS8qIE90aGVyd2lzZSwgY2FsbCB0aGUgZGV2aWNlKHMpIHdoaWNoIGhhdmUgcmVhZGFibGUKKwkJICogZmlsZSBkZXNjcmlwdG9ycyBhbmQgYSBtZXRob2Qgb2YgaGFuZGxpbmcgdGhlbS4gICovCiAJCWZvciAoaSA9IGRldmljZXMtPmRldjsgaTsgaSA9IGktPm5leHQpIHsKIAkJCWlmIChpLT5oYW5kbGVfaW5wdXQgJiYgRkRfSVNTRVQoaS0+ZmQsICZmZHMpKSB7CisJCQkJLyogSWYgaGFuZGxlX2lucHV0KCkgcmV0dXJucyBmYWxzZSwgaXQgbWVhbnMgd2UKKwkJCQkgKiBzaG91bGQgbm8gbG9uZ2VyIHNlcnZpY2UgaXQuCisJCQkJICogaGFuZGxlX2NvbnNvbGVfaW5wdXQoKSBkb2VzIHRoaXMuICovCiAJCQkJaWYgKCFpLT5oYW5kbGVfaW5wdXQoZmQsIGkpKSB7CisJCQkJCS8qIENsZWFyIGl0IGZyb20gdGhlIHNldCBvZiBpbnB1dCBmaWxlCisJCQkJCSAqIGRlc2NyaXB0b3JzIGtlcHQgYXQgdGhlIGhlYWQgb2YgdGhlCisJCQkJCSAqIGRldmljZSBsaXN0LiAqLwogCQkJCQlGRF9DTFIoaS0+ZmQsICZkZXZpY2VzLT5pbmZkcyk7CiAJCQkJCS8qIFRlbGwgd2FrZXIgdG8gaWdub3JlIGl0IHRvby4uLiAqLwogCQkJCQl3cml0ZSh3YWtlcl9mZCwgJmktPmZkLCBzaXplb2YoaS0+ZmQpKTsKQEAgLTYyOSwyNiArOTc0LDQyIEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyAqbmV3X2Rldl9kZXNjKHUxNiB0eXBlLCB1MTYgZmVhdHVyZXMsCi0JCQkJCSAgICAgICB1MTYgbnVtX3BhZ2VzKQorLypMOjE5MAorICogRGV2aWNlIFNldHVwCisgKgorICogQWxsIGRldmljZXMgbmVlZCBhIGRlc2NyaXB0b3Igc28gdGhlIEd1ZXN0IGtub3dzIGl0IGV4aXN0cywgYW5kIGEgInN0cnVjdAorICogZGV2aWNlIiBzbyB0aGUgTGF1bmNoZXIgY2FuIGtlZXAgdHJhY2sgb2YgaXQuICBXZSBoYXZlIGNvbW1vbiBoZWxwZXIKKyAqIHJvdXRpbmVzIHRvIGFsbG9jYXRlIHRoZW0uCisgKgorICogVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBhIG5ldyAic3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyIgZnJvbSBkZXNjcmlwdG9yCisgKiB0YWJsZSBpbiB0aGUgZGV2aWNlcyBhcnJheSBqdXN0IGFib3ZlIHRoZSBHdWVzdCdzIG5vcm1hbCBtZW1vcnkuICovCitzdGF0aWMgc3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyAqCituZXdfZGV2X2Rlc2Moc3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyAqZGVzY3MsCisJICAgICB1MTYgdHlwZSwgdTE2IGZlYXR1cmVzLCB1MTYgbnVtX3BhZ2VzKQogewotCXN0YXRpYyB1bnNpZ25lZCBsb25nIHRvcCA9IExHVUVTVF9HVUVTVF9UT1A7Ci0Jc3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWRlc2MgPSBtYWxsb2Moc2l6ZW9mKCpkZXNjKSk7Ci0JZGVzYy0+dHlwZSA9IHR5cGU7Ci0JZGVzYy0+bnVtX3BhZ2VzID0gbnVtX3BhZ2VzOwotCWRlc2MtPmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JZGVzYy0+c3RhdHVzID0gMDsKLQlpZiAobnVtX3BhZ2VzKSB7Ci0JCXRvcCAtPSBudW1fcGFnZXMqZ2V0cGFnZXNpemUoKTsKLQkJbWFwX3plcm9lZF9wYWdlcyh0b3AsIG51bV9wYWdlcyk7Ci0JCWRlc2MtPnBmbiA9IHRvcCAvIGdldHBhZ2VzaXplKCk7Ci0JfSBlbHNlCi0JCWRlc2MtPnBmbiA9IDA7Ci0JcmV0dXJuIGRlc2M7CisJZm9yIChpID0gMDsgaSA8IExHVUVTVF9NQVhfREVWSUNFUzsgaSsrKSB7CisJCWlmICghZGVzY3NbaV0udHlwZSkgeworCQkJZGVzY3NbaV0udHlwZSA9IHR5cGU7CisJCQlkZXNjc1tpXS5mZWF0dXJlcyA9IGZlYXR1cmVzOworCQkJZGVzY3NbaV0ubnVtX3BhZ2VzID0gbnVtX3BhZ2VzOworCQkJLyogSWYgdGhleSBzYWlkIHRoZSBkZXZpY2UgbmVlZHMgbWVtb3J5LCB3ZSBhbGxvY2F0ZQorCQkJICogdGhhdCBub3csIGJ1bXBpbmcgdXAgdGhlIHRvcCBvZiBHdWVzdCBtZW1vcnkuICovCisJCQlpZiAobnVtX3BhZ2VzKSB7CisJCQkJbWFwX3plcm9lZF9wYWdlcyh0b3AsIG51bV9wYWdlcyk7CisJCQkJZGVzY3NbaV0ucGZuID0gdG9wL2dldHBhZ2VzaXplKCk7CisJCQkJdG9wICs9IG51bV9wYWdlcypnZXRwYWdlc2l6ZSgpOworCQkJfQorCQkJcmV0dXJuICZkZXNjc1tpXTsKKwkJfQorCX0KKwllcnJ4KDEsICJ0b28gbWFueSBkZXZpY2VzIik7CiB9CiAKKy8qIFRoaXMgbW9uc3RlciByb3V0aW5lIGRvZXMgYWxsIHRoZSBjcmVhdGlvbiBhbmQgc2V0dXAgb2YgYSBuZXcgZGV2aWNlLAorICogaW5jbHVkaW5nIGNhbGluZyBuZXdfZGV2X2Rlc2MoKSB0byBhbGxvY2F0ZSB0aGUgZGVzY3JpcHRvciBhbmQgZGV2aWNlCisgKiBtZW1vcnkuICovCiBzdGF0aWMgc3RydWN0IGRldmljZSAqbmV3X2RldmljZShzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMsCiAJCQkJIHUxNiB0eXBlLCB1MTYgbnVtX3BhZ2VzLCB1MTYgZmVhdHVyZXMsCiAJCQkJIGludCBmZCwKQEAgLTY2MSwxNSArMTAyMiwyMSBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1hbGxvYyhzaXplb2YoKmRldikpOwogCi0JLyogQXBwZW5kIHRvIGRldmljZSBsaXN0LiAqLworCS8qIEFwcGVuZCB0byBkZXZpY2UgbGlzdC4gIFByZXBlbmRpbmcgdG8gYSBzaW5nbGUtbGlua2VkIGxpc3QgaXMKKwkgKiBlYXNpZXIsIGJ1dCB0aGUgdXNlciBleHBlY3RzIHRoZSBkZXZpY2VzIHRvIGJlIGFycmFuZ2VkIG9uIHRoZSBidXMKKwkgKiBpbiBjb21tYW5kLWxpbmUgb3JkZXIuICBUaGUgZmlyc3QgbmV0d29yayBkZXZpY2Ugb24gdGhlIGNvbW1hbmQgbGluZQorCSAqIGlzIGV0aDAsIHRoZSBmaXJzdCBibG9jayBkZXZpY2UgL2Rldi9sZ2JhLCBldGMuICovCiAJKmRldmljZXMtPmxhc3RkZXYgPSBkZXY7CiAJZGV2LT5uZXh0ID0gTlVMTDsKIAlkZXZpY2VzLT5sYXN0ZGV2ID0gJmRldi0+bmV4dDsKIAorCS8qIE5vdyB3ZSBwb3B1bGF0ZSB0aGUgZmllbGRzIG9uZSBhdCBhIHRpbWUuICovCiAJZGV2LT5mZCA9IGZkOworCS8qIElmIHdlIGhhdmUgYW4gaW5wdXQgaGFuZGxlciBmb3IgdGhpcyBmaWxlIGRlc2NyaXB0b3IsIHRoZW4gd2UgYWRkIGl0CisJICogdG8gdGhlIGRldmljZV9saXN0J3MgZmRzZXQgYW5kIG1heGZkLiAqLwogCWlmIChoYW5kbGVfaW5wdXQpCiAJCXNldF9mZChkZXYtPmZkLCBkZXZpY2VzKTsKLQlkZXYtPmRlc2MgPSBuZXdfZGV2X2Rlc2ModHlwZSwgZmVhdHVyZXMsIG51bV9wYWdlcyk7CisJZGV2LT5kZXNjID0gbmV3X2Rldl9kZXNjKGRldmljZXMtPmRlc2NzLCB0eXBlLCBmZWF0dXJlcywgbnVtX3BhZ2VzKTsKIAlkZXYtPm1lbSA9ICh2b2lkICopKGRldi0+ZGVzYy0+cGZuICogZ2V0cGFnZXNpemUoKSk7CiAJZGV2LT5oYW5kbGVfaW5wdXQgPSBoYW5kbGVfaW5wdXQ7CiAJZGV2LT53YXRjaF9rZXkgPSAodW5zaWduZWQgbG9uZylkZXYtPm1lbSArIHdhdGNoX29mZjsKQEAgLTY3NywyNyArMTA0NCwzNyBAQAogCXJldHVybiBkZXY7CiB9CiAKKy8qIE91ciBmaXJzdCBzZXR1cCByb3V0aW5lIGlzIHRoZSBjb25zb2xlLiAgSXQncyBhIGZhaXJseSBzaW1wbGUgZGV2aWNlLCBidXQKKyAqIFVOSVggdHR5IGhhbmRsaW5nIG1ha2VzIGl0IHVnbGllciB0aGFuIGl0IGNvdWxkIGJlLiAqLwogc3RhdGljIHZvaWQgc2V0dXBfY29uc29sZShzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCisJLyogSWYgd2UgY2FuIHNhdmUgdGhlIGluaXRpYWwgc3RhbmRhcmQgaW5wdXQgc2V0dGluZ3MuLi4gKi8KIAlpZiAodGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJm9yaWdfdGVybSkgPT0gMCkgewogCQlzdHJ1Y3QgdGVybWlvcyB0ZXJtID0gb3JpZ190ZXJtOworCQkvKiBUaGVuIHdlIHR1cm4gb2ZmIGVjaG8sIGxpbmUgYnVmZmVyaW5nIGFuZCBeQyBldGMuICBXZSB3YW50IGEKKwkJICogcmF3IGlucHV0IHN0cmVhbSB0byB0aGUgR3Vlc3QuICovCiAJCXRlcm0uY19sZmxhZyAmPSB+KElTSUd8SUNBTk9OfEVDSE8pOwogCQl0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBTk9XLCAmdGVybSk7CisJCS8qIElmIHdlIGV4aXQgZ3JhY2VmdWxseSwgdGhlIG9yaWdpbmFsIHNldHRpbmdzIHdpbGwgYmUKKwkJICogcmVzdG9yZWQgc28gdGhlIHVzZXIgY2FuIHNlZSB3aGF0IHRoZXkncmUgdHlwaW5nLiAqLwogCQlhdGV4aXQocmVzdG9yZV90ZXJtKTsKIAl9CiAKLQkvKiBXZSBkb24ndCBjdXJyZW50bHkgcmVxdWlyZSBhIHBhZ2UgZm9yIHRoZSBjb25zb2xlLiAqLworCS8qIFdlIGRvbid0IGN1cnJlbnRseSByZXF1aXJlIGFueSBtZW1vcnkgZm9yIHRoZSBjb25zb2xlLCBzbyB3ZSBhc2sgZm9yCisJICogMCBwYWdlcy4gKi8KIAlkZXYgPSBuZXdfZGV2aWNlKGRldmljZXMsIExHVUVTVF9ERVZJQ0VfVF9DT05TT0xFLCAwLCAwLAogCQkJIFNURElOX0ZJTEVOTywgaGFuZGxlX2NvbnNvbGVfaW5wdXQsCiAJCQkgTEdVRVNUX0NPTlNPTEVfRE1BX0tFWSwgaGFuZGxlX2NvbnNvbGVfb3V0cHV0KTsKKwkvKiBXZSBzdG9yZSB0aGUgY29uc29sZSBzdGF0ZSBpbiBkZXYtPnByaXYsIGFuZCBpbml0aWFsaXplIGl0LiAqLwogCWRldi0+cHJpdiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbnNvbGVfYWJvcnQpKTsKIAkoKHN0cnVjdCBjb25zb2xlX2Fib3J0ICopZGV2LT5wcml2KS0+Y291bnQgPSAwOwogCXZlcmJvc2UoImRldmljZSAlcDogY29uc29sZVxuIiwKIAkJKHZvaWQgKikoZGV2LT5kZXNjLT5wZm4gKiBnZXRwYWdlc2l6ZSgpKSk7CiB9CiAKKy8qIFNldHRpbmcgdXAgYSBibG9jayBmaWxlIGlzIGFsc28gZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZC4gKi8KIHN0YXRpYyB2b2lkIHNldHVwX2Jsb2NrX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2aWNlcykKIHsKIAlpbnQgZmQ7CkBAIC03MDUsMjAgKzEwODIsNDcgQEAKIAlvZmY2NF90ICpkZXZpY2VfbGVuOwogCXN0cnVjdCBsZ3Vlc3RfYmxvY2tfcGFnZSAqcDsKIAorCS8qIFdlIG9wZW4gd2l0aCBPX0xBUkdFRklMRSBiZWNhdXNlIG90aGVyd2lzZSB3ZSBnZXQgc3R1Y2sgYXQgMkcuICBXZQorCSAqIG9wZW4gd2l0aCBPX0RJUkVDVCBiZWNhdXNlIG90aGVyd2lzZSBvdXIgYmVuY2htYXJrcyBnbyBtdWNoIHRvbworCSAqIGZhc3QuICovCiAJZmQgPSBvcGVuX29yX2RpZShmaWxlbmFtZSwgT19SRFdSfE9fTEFSR0VGSUxFfE9fRElSRUNUKTsKKworCS8qIFdlIHdhbnQgb25lIHBhZ2UsIGFuZCBoYXZlIG5vIGlucHV0IGhhbmRsZXIgKHRoZSBibG9jayBmaWxlIG5ldmVyCisJICogaGFzIGFueXRoaW5nIGludGVyZXN0aW5nIHRvIHNheSB0byB1cykuICBPdXIgdGltaW5nIHdpbGwgYmUgcXVpdGUKKwkgKiByYW5kb20sIHNvIGl0IHNob3VsZCBiZSBhIHJlYXNvbmFibGUgcmFuZG9tbmVzcyBzb3VyY2UuICovCiAJZGV2ID0gbmV3X2RldmljZShkZXZpY2VzLCBMR1VFU1RfREVWSUNFX1RfQkxPQ0ssIDEsCiAJCQkgTEdVRVNUX0RFVklDRV9GX1JBTkRPTU5FU1MsCiAJCQkgZmQsIE5VTEwsIDAsIGhhbmRsZV9ibG9ja19vdXRwdXQpOwotCWRldmljZV9sZW4gPSBkZXYtPnByaXYgPSBtYWxsb2Moc2l6ZW9mKCpkZXZpY2VfbGVuKSk7Ci0JKmRldmljZV9sZW4gPSBsc2VlazY0KGZkLCAwLCBTRUVLX0VORCk7Ci0JcCA9IGRldi0+bWVtOwogCisJLyogV2Ugc3RvcmUgdGhlIGRldmljZSBzaXplIGluIHRoZSBwcml2YXRlIGFyZWEgKi8KKwlkZXZpY2VfbGVuID0gZGV2LT5wcml2ID0gbWFsbG9jKHNpemVvZigqZGV2aWNlX2xlbikpOworCS8qIFRoaXMgaXMgdGhlIHNhZmUgd2F5IG9mIGVzdGFibGlzaGluZyB0aGUgc2l6ZSBvZiBvdXIgZGV2aWNlOiBpdAorCSAqIG1pZ2h0IGJlIGEgbm9ybWFsIGZpbGUgb3IgYW4gYWN0dWFsIGJsb2NrIGRldmljZSBsaWtlIC9kZXYvaGRiLiAqLworCSpkZXZpY2VfbGVuID0gbHNlZWs2NChmZCwgMCwgU0VFS19FTkQpOworCisJLyogVGhlIGRldmljZSBtZW1vcnkgaXMgYSAic3RydWN0IGxndWVzdF9ibG9ja19wYWdlIi4gIEl0J3MgemVyb2VkCisJICogYWxyZWFkeSwgd2UganVzdCBuZWVkIHRvIHB1dCBpbiB0aGUgZGV2aWNlIHNpemUuICBCbG9jayBkZXZpY2VzCisJICogdGhpbmsgaW4gc2VjdG9ycyAoaWUuIDUxMiBieXRlIGNodW5rcyksIHNvIHdlIHRyYW5zbGF0ZSBoZXJlLiAqLworCXAgPSBkZXYtPm1lbTsKIAlwLT5udW1fc2VjdG9ycyA9ICpkZXZpY2VfbGVuLzUxMjsKIAl2ZXJib3NlKCJkZXZpY2UgJXA6IGJsb2NrICVpIHNlY3RvcnNcbiIsCiAJCSh2b2lkICopKGRldi0+ZGVzYy0+cGZuICogZ2V0cGFnZXNpemUoKSksIHAtPm51bV9zZWN0b3JzKTsKIH0KIAotLyogV2UgdXNlIGZuY3RsIGxvY2tzIHRvIHJlc2VydmUgbmV0d29yayBzbG90cyAoYXV0b2NsZWFudXAhKSAqLworLyoKKyAqIE5ldHdvcmsgRGV2aWNlcy4KKyAqCisgKiBTZXR0aW5nIHVwIG5ldHdvcmsgZGV2aWNlcyBpcyBxdWl0ZSBhIHBhaW4sIGJlY2F1c2Ugd2UgaGF2ZSB0aHJlZSB0eXBlcy4KKyAqIEZpcnN0LCB3ZSBoYXZlIHRoZSBpbnRlci1HdWVzdCBuZXR3b3JrLiAgVGhpcyBpcyBhIGZpbGUgd2hpY2ggaXMgbWFwcGVkIGludG8KKyAqIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBHdWVzdHMgd2hvIGFyZSBvbiB0aGUgbmV0d29yay4gIEJlY2F1c2UgaXQgaXMgYQorICogc2hhcmVkIG1hcHBpbmcsIHRoZSBzYW1lIHBhZ2UgdW5kZXJsaWVzIGFsbCB0aGUgZGV2aWNlcywgYW5kIHRoZXkgY2FuIHNlbmQKKyAqIERNQSB0byBlYWNoIG90aGVyLgorICoKKyAqIFJlbWVtYmVyIGZyb20gb3VyIG5ldHdvcmsgZHJpdmVyLCB0aGUgR3Vlc3QgaXMgdG9sZCB3aGF0IHNsb3QgaW4gdGhlIHBhZ2UgaXQKKyAqIGlzIHRvIHVzZS4gIFdlIHVzZSBleGNsdXNpdmUgZm5jdGwgbG9ja3MgdG8gcmVzZXJ2ZSBhIHNsb3QuICBJZiBhbm90aGVyCisgKiBHdWVzdCBpcyB1c2luZyBhIHNsb3QsIHRoZSBsb2NrIHdpbGwgZmFpbCBhbmQgd2UgdHJ5IGFub3RoZXIuICBCZWNhdXNlIGZuY3RsCisgKiBsb2NrcyBhcmUgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gd2UgZGllLCB0aGlzIGNsZXZlcmx5IG1lYW5zIHRoYXQgb3VyCisgKiByZXNlcnZhdGlvbiBvbiB0aGUgc2xvdCB3aWxsIHZhbmlzaCBpZiB3ZSBjcmFzaC4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmluZF9zbG90KGludCBuZXRmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAJc3RydWN0IGZsb2NrIGZsOwpAQCAtNzI2LDI2ICsxMTMwLDMzIEBACiAJZmwubF90eXBlID0gRl9XUkxDSzsKIAlmbC5sX3doZW5jZSA9IFNFRUtfU0VUOwogCWZsLmxfbGVuID0gMTsKKwkvKiBUcnkgYSAxIGJ5dGUgbG9jayBpbiBlYWNoIHBvc3NpYmxlIHBvc2l0aW9uIG51bWJlciAqLwogCWZvciAoZmwubF9zdGFydCA9IDA7CiAJICAgICBmbC5sX3N0YXJ0IDwgZ2V0cGFnZXNpemUoKS9zaXplb2Yoc3RydWN0IGxndWVzdF9uZXQpOwogCSAgICAgZmwubF9zdGFydCsrKSB7CisJCS8qIElmIHdlIHN1Y2NlZWQsIHJldHVybiB0aGUgc2xvdCBudW1iZXIuICovCiAJCWlmIChmY250bChuZXRmZCwgRl9TRVRMSywgJmZsKSA9PSAwKQogCQkJcmV0dXJuIGZsLmxfc3RhcnQ7CiAJfQogCWVycngoMSwgIk5vIGZyZWUgc2xvdHMgaW4gbmV0d29yayBmaWxlICVzIiwgZmlsZW5hbWUpOwogfQogCisvKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIG5ldHdvcmsgZmlsZSAqLwogc3RhdGljIHZvaWQgc2V0dXBfbmV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCiB7CiAJaW50IG5ldGZkOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAorCS8qIFdlIGRvbid0IHVzZSBvcGVuX29yX2RpZSgpIGhlcmU6IGZvciBmcmllbmRsaW5lc3Mgd2UgY3JlYXRlIHRoZSBmaWxlCisJICogaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LiAqLwogCW5ldGZkID0gb3BlbihmaWxlbmFtZSwgT19SRFdSLCAwKTsKIAlpZiAobmV0ZmQgPCAwKSB7CiAJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKIAkJCW5ldGZkID0gb3BlbihmaWxlbmFtZSwgT19SRFdSfE9fQ1JFQVQsIDA2MDApOwogCQkJaWYgKG5ldGZkID49IDApIHsKKwkJCQkvKiBJZiB3ZSBzdWNjZWVkZWQsIGluaXRpYWxpemUgdGhlIGZpbGUgd2l0aCBhCisJCQkJICogYmxhbmsgcGFnZS4gKi8KIAkJCQljaGFyIHBhZ2VbZ2V0cGFnZXNpemUoKV07CiAJCQkJbWVtc2V0KHBhZ2UsIDAsIHNpemVvZihwYWdlKSk7CiAJCQkJd3JpdGUobmV0ZmQsIHBhZ2UsIHNpemVvZihwYWdlKSk7CkBAIC03NTUsMTEgKzExNjYsMTUgQEAKIAkJCWVycigxLCAiY2Fubm90IG9wZW4gbmV0IGZpbGUgJyVzJyIsIGZpbGVuYW1lKTsKIAl9CiAKKwkvKiBXZSBuZWVkIDEgcGFnZSwgYW5kIHRoZSBmZWF0dXJlcyBpbmRpY2F0ZSB0aGUgc2xvdCB0byB1c2UgYW5kIHRoYXQKKwkgKiBubyBjaGVja3N1bSBpcyBuZWVkZWQuICBXZSBuZXZlciB0b3VjaCB0aGlzIGRldmljZSBhZ2FpbjsgaXQncworCSAqIGJldHdlZW4gdGhlIEd1ZXN0cyBvbiB0aGUgbmV0d29yaywgc28gd2UgZG9uJ3QgcmVnaXN0ZXIgaW5wdXQgb3IKKwkgKiBvdXRwdXQgaGFuZGxlcnMuICovCiAJZGV2ID0gbmV3X2RldmljZShkZXZpY2VzLCBMR1VFU1RfREVWSUNFX1RfTkVULCAxLAogCQkJIGZpbmRfc2xvdChuZXRmZCwgZmlsZW5hbWUpfExHVUVTVF9ORVRfRl9OT0NTVU0sCiAJCQkgLTEsIE5VTEwsIDAsIE5VTEwpOwogCi0JLyogV2Ugb3ZlcndyaXRlIHRoZSAvZGV2L3plcm8gbWFwcGluZyB3aXRoIHRoZSBhY3R1YWwgZmlsZS4gKi8KKwkvKiBNYXAgdGhlIHNoYXJlZCBmaWxlLiAqLwogCWlmIChtbWFwKGRldi0+bWVtLCBnZXRwYWdlc2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwKIAkJCSBNQVBfRklYRUR8TUFQX1NIQVJFRCwgbmV0ZmQsIDApICE9IGRldi0+bWVtKQogCQkJZXJyKDEsICJjb3VsZCBub3QgbW1hcCAnJXMnIiwgZmlsZW5hbWUpOwpAQCAtNzY3LDYgKzExODIsNyBAQAogCQkodm9pZCAqKShkZXYtPmRlc2MtPnBmbiAqIGdldHBhZ2VzaXplKCkpLCBmaWxlbmFtZSwKIAkJZGV2LT5kZXNjLT5mZWF0dXJlcyAmIH5MR1VFU1RfTkVUX0ZfTk9DU1VNKTsKIH0KKy8qOiovCiAKIHN0YXRpYyB1MzIgc3RyMmlwKGNvbnN0IGNoYXIgKmlwYWRkcikKIHsKQEAgLTc3Niw3ICsxMTkyLDExIEBACiAJcmV0dXJuIChieXRlWzBdIDw8IDI0KSB8IChieXRlWzFdIDw8IDE2KSB8IChieXRlWzJdIDw8IDgpIHwgYnl0ZVszXTsKIH0KIAotLyogYWRhcHRlZCBmcm9tIGxpYmJyaWRnZSAqLworLyogVGhpcyBjb2RlIGlzICJhZGFwdGVkIiBmcm9tIGxpYmJyaWRnZTogaXQgYXR0YWNoZXMgdGhlIEhvc3QgZW5kIG9mIHRoZQorICogbmV0d29yayBkZXZpY2UgdG8gdGhlIGJyaWRnZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IHRoZSBjb21tYW5kIGxpbmUuCisgKgorICogVGhpcyBpcyB5ZXQgYW5vdGhlciBKYW1lcyBNb3JyaXMgY29udHJpYnV0aW9uIChJJ20gYW4gSVAtbGV2ZWwgZ3V5LCBzbyBJCisgKiBkaXNsaWtlIGJyaWRnaW5nKSwgYW5kIEkganVzdCB0cnkgbm90IHRvIGJyZWFrIGl0LiAqLwogc3RhdGljIHZvaWQgYWRkX3RvX2JyaWRnZShpbnQgZmQsIGNvbnN0IGNoYXIgKmlmX25hbWUsIGNvbnN0IGNoYXIgKmJyX25hbWUpCiB7CiAJaW50IGlmaWR4OwpAQCAtNzk1LDEyICsxMjE1LDE2IEBACiAJCWVycigxLCAiY2FuJ3QgYWRkICVzIHRvIGJyaWRnZSAlcyIsIGlmX25hbWUsIGJyX25hbWUpOwogfQogCisvKiBUaGlzIHNldHMgdXAgdGhlIEhvc3QgZW5kIG9mIHRoZSBuZXR3b3JrIGRldmljZSB3aXRoIGFuIElQIGFkZHJlc3MsIGJyaW5ncworICogaXQgdXAgc28gcGFja2V0cyB3aWxsIGZsb3csIHRoZSBjb3BpZXMgdGhlIE1BQyBhZGRyZXNzIGludG8gdGhlIGh3YWRkcgorICogcG9pbnRlciAoaW4gcHJhY3RpY2UsIHRoZSBIb3N0J3Mgc2xvdCBpbiB0aGUgbmV0d29yayBkZXZpY2UncyBtZW1vcnkpLiAqLwogc3RhdGljIHZvaWQgY29uZmlndXJlX2RldmljZShpbnQgZmQsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHUzMiBpcGFkZHIsCiAJCQkgICAgIHVuc2lnbmVkIGNoYXIgaHdhZGRyWzZdKQogewogCXN0cnVjdCBpZnJlcSBpZnI7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmci5pZnJfYWRkcjsKIAorCS8qIERvbid0IHJlYWQgdGhlc2UgaW5jYW50YXRpb25zLiAgSnVzdCBjdXQgJiBwYXN0ZSB0aGVtIGxpa2UgSSBkaWQhICovCiAJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKIAlzdHJjcHkoaWZyLmlmcl9uYW1lLCBkZXZuYW1lKTsKIAlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtODExLDEyICsxMjM1LDE5IEBACiAJaWYgKGlvY3RsKGZkLCBTSU9DU0lGRkxBR1MsICZpZnIpICE9IDApCiAJCWVycigxLCAiQnJpbmdpbmcgaW50ZXJmYWNlICVzIHVwIiwgZGV2bmFtZSk7CiAKKwkvKiBTSU9DIHN0YW5kcyBmb3IgU29ja2V0IEkvTyBDb250cm9sLiAgRyBtZWFucyBHZXQgKHZzIFMgZm9yIFNldAorCSAqIGFib3ZlKS4gIElGIG1lYW5zIEludGVyZmFjZSwgYW5kIEhXQUREUiBpcyBoYXJkd2FyZSBhZGRyZXNzLgorCSAqIFNpbXBsZSEgKi8KIAlpZiAoaW9jdGwoZmQsIFNJT0NHSUZIV0FERFIsICZpZnIpICE9IDApCiAJCWVycigxLCAiZ2V0dGluZyBodyBhZGRyZXNzIGZvciAlcyIsIGRldm5hbWUpOwotCiAJbWVtY3B5KGh3YWRkciwgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgNik7CiB9CiAKKy8qTDoxOTUgVGhlIG90aGVyIGtpbmQgb2YgbmV0d29yayBpcyBhIEhvc3Q8LT5HdWVzdCBuZXR3b3JrLiAgVGhpcyBjYW4gZWl0aGVyCisgKiB1c2UgYnJpZGluZyBvciByb3V0aW5nLCBidXQgdGhlIHByaW5jaXBsZSBpcyB0aGUgc2FtZTogaXQgdXNlcyB0aGUgInR1biIKKyAqIGRldmljZSB0byBpbmplY3QgcGFja2V0cyBpbnRvIHRoZSBIb3N0IGFzIGlmIHRoZXkgY2FtZSBpbiBmcm9tIGEgbm9ybWFsCisgKiBuZXR3b3JrIGNhcmQuICBXZSBqdXN0IHNodW50IHBhY2tldHMgYmV0d2VlbiB0aGUgR3Vlc3QgYW5kIHRoZSB0dW4KKyAqIGRldmljZS4gKi8KIHN0YXRpYyB2b2lkIHNldHVwX3R1bl9uZXQoY29uc3QgY2hhciAqYXJnLCBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZXMpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtODI1LDM2ICsxMjU2LDU2IEBACiAJdTMyIGlwOwogCWNvbnN0IGNoYXIgKmJyX25hbWUgPSBOVUxMOwogCisJLyogV2Ugb3BlbiB0aGUgL2Rldi9uZXQvdHVuIGRldmljZSBhbmQgdGVsbCBpdCB3ZSB3YW50IGEgdGFwIGRldmljZS4gIEEKKwkgKiB0YXAgZGV2aWNlIGlzIGxpa2UgYSB0dW4gZGV2aWNlLCBvbmx5IHNvbWVob3cgZGlmZmVyZW50LiAgVG8gdGVsbAorCSAqIHRoZSB0cnV0aCwgSSBjb21wbGV0ZWx5IGJsdW5kZXJlZCBteSB3YXkgdGhyb3VnaCB0aGlzIGNvZGUsIGJ1dCBpdAorCSAqIHdvcmtzIG5vdyEgKi8KIAluZXRmZCA9IG9wZW5fb3JfZGllKCIvZGV2L25ldC90dW4iLCBPX1JEV1IpOwogCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CiAJaWZyLmlmcl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7CiAJc3RyY3B5KGlmci5pZnJfbmFtZSwgInRhcCVkIik7CiAJaWYgKGlvY3RsKG5ldGZkLCBUVU5TRVRJRkYsICZpZnIpICE9IDApCiAJCWVycigxLCAiY29uZmlndXJpbmcgL2Rldi9uZXQvdHVuIik7CisJLyogV2UgZG9uJ3QgbmVlZCBjaGVja3N1bXMgY2FsY3VsYXRlZCBmb3IgcGFja2V0cyBjb21pbmcgaW4gdGhpcworCSAqIGRldmljZTogdHJ1c3QgdXMhICovCiAJaW9jdGwobmV0ZmQsIFRVTlNFVE5PQ1NVTSwgMSk7CiAKLQkvKiBZb3Ugd2lsbCBiZSBwZWVyIDE6IHdlIHNob3VsZCBjcmVhdGUgZW5vdWdoIGppdHRlciB0byByYW5kb21pemUgKi8KKwkvKiBXZSBjcmVhdGUgdGhlIG5ldCBkZXZpY2Ugd2l0aCAxIHBhZ2UsIHVzaW5nIHRoZSBmZWF0dXJlcyBmaWVsZCBvZgorCSAqIHRoZSBkZXNjcmlwdG9yIHRvIHRlbGwgdGhlIEd1ZXN0IGl0IGlzIGluIHNsb3QgMSAoTkVUX1BFRVJOVU0pLCBhbmQKKwkgKiB0aGF0IHRoZSBkZXZpY2UgaGFzIGZhaXJseSByYW5kb20gdGltaW5nLiAgV2UgZG8gKm5vdCogc3BlY2lmeQorCSAqIExHVUVTVF9ORVRfRl9OT0NTVU06IHRoZXNlIHBhY2tldHMgY2FuIHJlYWNoIHRoZSByZWFsIHdvcmxkLgorCSAqCisJICogV2Ugd2lsbCBwdXQgb3VyIE1BQyBhZGRyZXNzIGlzIHNsb3QgMCBmb3IgdGhlIEd1ZXN0IHRvIHNlZSwgc28KKwkgKiBpdCB3aWxsIHNlbmQgcGFja2V0cyB0byB1cyB1c2luZyB0aGUga2V5ICJwZWVyX29mZnNldCgwKSI6ICovCiAJZGV2ID0gbmV3X2RldmljZShkZXZpY2VzLCBMR1VFU1RfREVWSUNFX1RfTkVULCAxLAogCQkJIE5FVF9QRUVSTlVNfExHVUVTVF9ERVZJQ0VfRl9SQU5ET01ORVNTLCBuZXRmZCwKIAkJCSBoYW5kbGVfdHVuX2lucHV0LCBwZWVyX29mZnNldCgwKSwgaGFuZGxlX3R1bl9vdXRwdXQpOworCisJLyogV2Uga2VlcCBhIGZsYWcgd2hpY2ggc2F5cyB3aGV0aGVyIHdlJ3ZlIHNlZW4gcGFja2V0cyBjb21lIG91dCBmcm9tCisJICogdGhpcyBuZXR3b3JrIGRldmljZS4gKi8KIAlkZXYtPnByaXYgPSBtYWxsb2Moc2l6ZW9mKGJvb2wpKTsKIAkqKGJvb2wgKilkZXYtPnByaXYgPSBmYWxzZTsKIAorCS8qIFdlIG5lZWQgYSBzb2NrZXQgdG8gcGVyZm9ybSB0aGUgbWFnaWMgbmV0d29yayBpb2N0bHMgdG8gYnJpbmcgdXAgdGhlCisJICogdGFwIGludGVyZmFjZSwgY29ubmVjdCB0byB0aGUgYnJpZGdlIGV0Yy4gIEFueSBzb2NrZXQgd2lsbCBkbyEgKi8KIAlpcGZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fSVApOwogCWlmIChpcGZkIDwgMCkKIAkJZXJyKDEsICJvcGVuaW5nIElQIHNvY2tldCIpOwogCisJLyogSWYgdGhlIGNvbW1hbmQgbGluZSB3YXMgLS10dW5uZXQ9YnJpZGdlOjxuYW1lPiBkbyBicmlkZ2luZy4gKi8KIAlpZiAoIXN0cm5jbXAoQlJJREdFX1BGWCwgYXJnLCBzdHJsZW4oQlJJREdFX1BGWCkpKSB7CiAJCWlwID0gSU5BRERSX0FOWTsKIAkJYnJfbmFtZSA9IGFyZyArIHN0cmxlbihCUklER0VfUEZYKTsKIAkJYWRkX3RvX2JyaWRnZShpcGZkLCBpZnIuaWZyX25hbWUsIGJyX25hbWUpOwotCX0gZWxzZQorCX0gZWxzZSAvKiBJdCBpcyBhbiBJUCBhZGRyZXNzIHRvIHNldCB1cCB0aGUgZGV2aWNlIHdpdGggKi8KIAkJaXAgPSBzdHIyaXAoYXJnKTsKIAotCS8qIFdlIGFyZSBwZWVyIDAsIGllLiBmaXJzdCBzbG90LiAqLworCS8qIFdlIGFyZSBwZWVyIDAsIGllLiBmaXJzdCBzbG90LCBzbyB3ZSBoYW5kIGRldi0+bWVtIHRvIHRoaXMgcm91dGluZQorCSAqIHRvIHdyaXRlIHRoZSBNQUMgYWRkcmVzcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBtZW1vcnkuICAqLwogCWNvbmZpZ3VyZV9kZXZpY2UoaXBmZCwgaWZyLmlmcl9uYW1lLCBpcCwgZGV2LT5tZW0pOwogCi0JLyogU2V0ICJwcm9taXNjIiBiaXQ6IHdlIHdhbnQgZXZlcnkgc2luZ2xlIHBhY2tldC4gKi8KKwkvKiBTZXQgInByb21pc2MiIGJpdDogd2Ugd2FudCBldmVyeSBzaW5nbGUgcGFja2V0IGlmIHdlJ3JlIGdvaW5nIHRvCisJICogYnJpZGdlIHRvIG90aGVyIG1hY2hpbmVzIChhbmQgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWF0dGVyKS4gKi8KIAkqKCh1OCAqKWRldi0+bWVtKSB8PSAweDE7CiAKIAljbG9zZShpcGZkKTsKQEAgLTg2NSwzMSArMTMxNiwxMCBAQAogCWlmIChicl9uYW1lKQogCQl2ZXJib3NlKCJhdHRhY2hlZCB0byBicmlkZ2U6ICVzXG4iLCBicl9uYW1lKTsKIH0KKy8qIFRoYXQncyB0aGUgZW5kIG9mIGRldmljZSBzZXR1cC4gKi8KIAotLyogTm93IHdlIGtub3cgaG93IG11Y2ggbWVtb3J5IHdlIGhhdmUsIHdlIGNvcHkgaW4gZGV2aWNlIGRlc2NyaXB0b3JzICovCi1zdGF0aWMgdm9pZCBtYXBfZGV2aWNlX2Rlc2NyaXB0b3JzKHN0cnVjdCBkZXZpY2VfbGlzdCAqZGV2cywgdW5zaWduZWQgbG9uZyBtZW0pCi17Ci0Jc3RydWN0IGRldmljZSAqaTsKLQl1bnNpZ25lZCBpbnQgbnVtOwotCXN0cnVjdCBsZ3Vlc3RfZGV2aWNlX2Rlc2MgKmRlc2NzOwotCi0JLyogRGV2aWNlIGRlc2NyaXB0b3IgYXJyYXkgc2l0cyBqdXN0IGFib3ZlIHRvcCBvZiBub3JtYWwgbWVtb3J5ICovCi0JZGVzY3MgPSBtYXBfemVyb2VkX3BhZ2VzKG1lbSwgMSk7Ci0KLQlmb3IgKGkgPSBkZXZzLT5kZXYsIG51bSA9IDA7IGk7IGkgPSBpLT5uZXh0LCBudW0rKykgewotCQlpZiAobnVtID09IExHVUVTVF9NQVhfREVWSUNFUykKLQkJCWVycngoMSwgInRvbyBtYW55IGRldmljZXMiKTsKLQkJdmVyYm9zZSgiRGV2aWNlICVpOiAlc1xuIiwgbnVtLAotCQkJaS0+ZGVzYy0+dHlwZSA9PSBMR1VFU1RfREVWSUNFX1RfTkVUID8gIm5ldCIKLQkJCTogaS0+ZGVzYy0+dHlwZSA9PSBMR1VFU1RfREVWSUNFX1RfQ09OU09MRSA/ICJjb25zb2xlIgotCQkJOiBpLT5kZXNjLT50eXBlID09IExHVUVTVF9ERVZJQ0VfVF9CTE9DSyA/ICJibG9jayIKLQkJCTogInVua25vd24iKTsKLQkJZGVzY3NbbnVtXSA9ICppLT5kZXNjOwotCQlmcmVlKGktPmRlc2MpOwotCQlpLT5kZXNjID0gJmRlc2NzW251bV07Ci0JfQotfQotCisvKkw6MjIwIEZpbmFsbHkgd2UgcmVhY2ggdGhlIGNvcmUgb2YgdGhlIExhdW5jaGVyLCB3aGljaCBydW5zIHRoZSBHdWVzdCwgc2VydmVzCisgKiBpdHMgaW5wdXQgYW5kIG91dHB1dCwgYW5kIGZpbmFsbHksIGxheXMgaXQgdG8gcmVzdC4gKi8KIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKIHJ1bl9ndWVzdChpbnQgbGd1ZXN0X2ZkLCBzdHJ1Y3QgZGV2aWNlX2xpc3QgKmRldmljZV9saXN0KQogewpAQCAtOTAxLDIwICsxMzMxLDM3IEBACiAJCS8qIFdlIHJlYWQgZnJvbSB0aGUgL2Rldi9sZ3Vlc3QgZGV2aWNlIHRvIHJ1biB0aGUgR3Vlc3QuICovCiAJCXJlYWR2YWwgPSByZWFkKGxndWVzdF9mZCwgYXJyLCBzaXplb2YoYXJyKSk7CiAKKwkJLyogVGhlIHJlYWQgY2FuIG9ubHkgcmVhbGx5IHJldHVybiBzaXplb2YoYXJyKSAodGhlIEd1ZXN0IGRpZCBhCisJCSAqIFNFTkRfRE1BIHRvIHVzKSwgb3IgYW4gZXJyb3IuICovCisKKwkJLyogRm9yIGEgc3VjY2Vzc2Z1bCByZWFkLCBhcnJbMF0gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlICJzdHJ1Y3QKKwkJICogbGd1ZXN0X2RtYSIsIGFuZCBhcnJbMV0gaXMgdGhlIGtleSB0aGUgR3Vlc3Qgc2VudCB0by4gKi8KIAkJaWYgKHJlYWR2YWwgPT0gc2l6ZW9mKGFycikpIHsKIAkJCWhhbmRsZV9vdXRwdXQobGd1ZXN0X2ZkLCBhcnJbMF0sIGFyclsxXSwgZGV2aWNlX2xpc3QpOwogCQkJY29udGludWU7CisJCS8qIEVOT0VOVCBtZWFucyB0aGUgR3Vlc3QgZGllZC4gIFJlYWRpbmcgdGVsbHMgdXMgd2h5LiAqLwogCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCkgewogCQkJY2hhciByZWFzb25bMTAyNF0gPSB7IDAgfTsKIAkJCXJlYWQobGd1ZXN0X2ZkLCByZWFzb24sIHNpemVvZihyZWFzb24pLTEpOwogCQkJZXJyeCgxLCAiJXMiLCByZWFzb24pOworCQkvKiBFQUdBSU4gbWVhbnMgdGhlIHdha2VyIHdhbnRlZCB1cyB0byBsb29rIGF0IHNvbWUgaW5wdXQuCisJCSAqIEFueXRoaW5nIGVsc2UgbWVhbnMgYSBidWcgb3IgaW5jb21wYXRpYmxlIGNoYW5nZS4gKi8KIAkJfSBlbHNlIGlmIChlcnJubyAhPSBFQUdBSU4pCiAJCQllcnIoMSwgIlJ1bm5pbmcgZ3Vlc3QgZmFpbGVkIik7CisKKwkJLyogU2VydmljZSBpbnB1dCwgdGhlbiB1bnNldCB0aGUgQlJFQUsgd2hpY2ggcmVsZWFzZXMKKwkJICogdGhlIFdha2VyLiAqLwogCQloYW5kbGVfaW5wdXQobGd1ZXN0X2ZkLCBkZXZpY2VfbGlzdCk7CiAJCWlmICh3cml0ZShsZ3Vlc3RfZmQsIGFyZ3MsIHNpemVvZihhcmdzKSkgPCAwKQogCQkJZXJyKDEsICJSZXNldHRpbmcgYnJlYWsiKTsKIAl9CiB9CisvKgorICogVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBMYXVuY2hlci4KKyAqCisgKiBCdXQgd2FpdCEgIFdlJ3ZlIHNlZW4gSS9PIGZyb20gdGhlIExhdW5jaGVyLCBhbmQgd2UndmUgc2VlbiBJL08gZnJvbSB0aGUKKyAqIERyaXZlcnMuICBJZiB3ZSB3ZXJlIHRvIHNlZSB0aGUgSG9zdCBrZXJuZWwgSS9PIGNvZGUsIG91ciB1bmRlcnN0YW5kaW5nCisgKiB3b3VsZCBiZSBjb21wbGV0ZS4uLiA6Ki8KIAogc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0gewogCXsgInZlcmJvc2UiLCAwLCBOVUxMLCAndicgfSwKQEAgLTkzMiwxOSArMTM3OSw1OSBAQAogCSAgICAgIjxtZW0taW4tbWI+IHZtbGludXggW2FyZ3MuLi5dIik7CiB9CiAKKy8qTDoxMDAgVGhlIExhdW5jaGVyIGNvZGUgaXRzZWxmIHRha2VzIHVzIG91dCBpbnRvIHVzZXJzcGFjZSwgdGhhdCBzY2FyeSBwbGFjZQorICogd2hlcmUgcG9pbnRlcnMgcnVuIHdpbGQgYW5kIGZyZWUhICBVbmZvcnR1bmF0ZWx5LCBsaWtlIG1vc3QgdXNlcnNwYWNlCisgKiBwcm9ncmFtcywgaXQncyBxdWl0ZSBib3JpbmcgKHdoaWNoIGlzIHdoeSBldmVyeW9uZSBsaWtlIHRvIGhhY2sgb24gdGhlCisgKiBrZXJuZWwhKS4gIFBlcmhhcHMgaWYgeW91IG1ha2UgdXAgYW4gTGd1ZXN0IERyaW5raW5nIEdhbWUgYXQgdGhpcyBwb2ludCwgaXQKKyAqIHdpbGwgZ2V0IHlvdSB0aHJvdWdoIHRoaXMgc2VjdGlvbi4gIE9yLCBtYXliZSBub3QuCisgKgorICogVGhlIExhdW5jaGVyIGJpbmFyeSBzaXRzIHVwIGhpZ2gsIHVzdWFsbHkgc3RhcnRpbmcgYXQgYWRkcmVzcyAweEI4MDAwMDAwLgorICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIGlzIHRoZSAicGh5c2ljYWwiIG1lbW9yeSBmb3IgdGhlIEd1ZXN0LiAgRm9yIGV4YW1wbGUsCisgKiBpZiB0aGUgR3Vlc3Qgd2VyZSB0byB3cml0ZSBhICIxIiBhdCBwaHlzaWNhbCBhZGRyZXNzIDAsIHdlIHdvdWxkIHNlZSBhICIxIgorICogaW4gdGhlIExhdW5jaGVyIGF0ICIoaW50ICopMCIuICBHdWVzdCBwaHlzaWNhbCA9PSBMYXVuY2hlciB2aXJ0dWFsLgorICoKKyAqIFRoaXMgY2FuIGJlIHRvdWdoIHRvIGdldCB5b3VyIGhlYWQgYXJvdW5kLCBidXQgdXN1YWxseSBpdCBqdXN0IG1lYW5zIHRoYXQgd2UKKyAqIGRvbid0IG5lZWQgdG8gZG8gYW55IGNvbnZlcnNpb24gd2hlbiB0aGUgR3Vlc3QgZ2l2ZXMgdXMgaXQncyAicGh5c2ljYWwiCisgKiBhZGRyZXNzZXMuCisgKi8KIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0JdW5zaWduZWQgbG9uZyBtZW0sIHBnZGlyLCBzdGFydCwgcGFnZV9vZmZzZXQsIGluaXRyZF9zaXplID0gMDsKLQlpbnQgYywgbGd1ZXN0X2ZkOworCS8qIE1lbW9yeSwgdG9wLWxldmVsIHBhZ2V0YWJsZSwgY29kZSBzdGFydHBvaW50LCBQQUdFX09GRlNFVCBhbmQgc2l6ZQorCSAqIG9mIHRoZSAob3B0aW9uYWwpIGluaXRyZC4gKi8KKwl1bnNpZ25lZCBsb25nIG1lbSA9IDAsIHBnZGlyLCBzdGFydCwgcGFnZV9vZmZzZXQsIGluaXRyZF9zaXplID0gMDsKKwkvKiBBIHRlbXBvcmFyeSBhbmQgdGhlIC9kZXYvbGd1ZXN0IGZpbGUgZGVzY3JpcHRvci4gKi8KKwlpbnQgaSwgYywgbGd1ZXN0X2ZkOworCS8qIFRoZSBsaXN0IG9mIEd1ZXN0IGRldmljZXMsIGJhc2VkIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICovCiAJc3RydWN0IGRldmljZV9saXN0IGRldmljZV9saXN0OworCS8qIFRoZSBib290IGluZm9ybWF0aW9uIGZvciB0aGUgR3Vlc3Q6IGF0IGd1ZXN0LXBoeXNpY2FsIGFkZHJlc3MgMC4gKi8KIAl2b2lkICpib290ID0gKHZvaWQgKikwOworCS8qIElmIHRoZXkgc3BlY2lmeSBhbiBpbml0cmQgZmlsZSB0byBsb2FkLiAqLwogCWNvbnN0IGNoYXIgKmluaXRyZF9uYW1lID0gTlVMTDsKIAorCS8qIEZpcnN0IHdlIGluaXRpYWxpemUgdGhlIGRldmljZSBsaXN0LiAgU2luY2UgY29uc29sZSBhbmQgbmV0d29yaworCSAqIGRldmljZSByZWNlaXZlIGlucHV0IGZyb20gYSBmaWxlIGRlc2NyaXB0b3IsIHdlIGtlZXAgYW4gZmRzZXQKKwkgKiAoaW5mZHMpIGFuZCB0aGUgbWF4aW11bSBmZCBudW1iZXIgKG1heF9pbmZkKSB3aXRoIHRoZSBoZWFkIG9mIHRoZQorCSAqIGxpc3QuICBXZSBhbHNvIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBsYXN0IGRldmljZSwgZm9yIGVhc3kgYXBwZW5kaW5nCisJICogdG8gdGhlIGxpc3QuICovCiAJZGV2aWNlX2xpc3QubWF4X2luZmQgPSAtMTsKIAlkZXZpY2VfbGlzdC5kZXYgPSBOVUxMOwogCWRldmljZV9saXN0Lmxhc3RkZXYgPSAmZGV2aWNlX2xpc3QuZGV2OwogCUZEX1pFUk8oJmRldmljZV9saXN0LmluZmRzKTsKIAorCS8qIFdlIG5lZWQgdG8ga25vdyBob3cgbXVjaCBtZW1vcnkgc28gd2UgY2FuIHNldCB1cCB0aGUgZGV2aWNlCisJICogZGVzY3JpcHRvciBhbmQgbWVtb3J5IHBhZ2VzIGZvciB0aGUgZGV2aWNlcyBhcyB3ZSBwYXJzZSB0aGUgY29tbWFuZAorCSAqIGxpbmUuICBTbyB3ZSBxdWlja2x5IGxvb2sgdGhyb3VnaCB0aGUgYXJndW1lbnRzIHRvIGZpbmQgdGhlIGFtb3VudAorCSAqIG9mIG1lbW9yeSBub3cuICovCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlpZiAoYXJndltpXVswXSAhPSAnLScpIHsKKwkJCW1lbSA9IHRvcCA9IGF0b2koYXJndltpXSkgKiAxMDI0ICogMTAyNDsKKwkJCWRldmljZV9saXN0LmRlc2NzID0gbWFwX3plcm9lZF9wYWdlcyh0b3AsIDEpOworCQkJdG9wICs9IGdldHBhZ2VzaXplKCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFRoZSBvcHRpb25zIGFyZSBmYWlybHkgc3RyYWlnaHQtZm9yd2FyZCAqLwogCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJ2Iiwgb3B0cywgTlVMTCkpICE9IEVPRikgewogCQlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAndic6CkBAIC05NjcsNDYgKzE0NTQsNzEgQEAKIAkJCXVzYWdlKCk7CiAJCX0KIAl9CisJLyogQWZ0ZXIgdGhlIG90aGVyIGFyZ3VtZW50cyB3ZSBleHBlY3QgbWVtb3J5IGFuZCBrZXJuZWwgaW1hZ2UgbmFtZSwKKwkgKiBmb2xsb3dlZCBieSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUga2VybmVsLiAqLwogCWlmIChvcHRpbmQgKyAyID4gYXJnYykKIAkJdXNhZ2UoKTsKIAotCS8qIFdlIG5lZWQgYSBjb25zb2xlIGRldmljZSAqLworCS8qIFdlIGFsd2F5cyBoYXZlIGEgY29uc29sZSBkZXZpY2UgKi8KIAlzZXR1cF9jb25zb2xlKCZkZXZpY2VfbGlzdCk7CiAKLQkvKiBGaXJzdCB3ZSBtYXAgL2Rldi96ZXJvIG92ZXIgYWxsIG9mIGd1ZXN0LXBoeXNpY2FsIG1lbW9yeS4gKi8KLQltZW0gPSBhdG9pKGFyZ3Zbb3B0aW5kXSkgKiAxMDI0ICogMTAyNDsKKwkvKiBXZSBzdGFydCBieSBtYXBwaW5nIGFub255bW91cyBwYWdlcyBvdmVyIGFsbCBvZiBndWVzdC1waHlzaWNhbAorCSAqIG1lbW9yeSByYW5nZS4gIFRoaXMgZmlsbHMgaXQgd2l0aCAwLCBhbmQgZW5zdXJlcyB0aGF0IHRoZSBHdWVzdAorCSAqIHdvbid0IGJlIGtpbGxlZCB3aGVuIGl0IHRyaWVzIHRvIGFjY2VzcyBpdC4gKi8KIAltYXBfemVyb2VkX3BhZ2VzKDAsIG1lbSAvIGdldHBhZ2VzaXplKCkpOwogCiAJLyogTm93IHdlIGxvYWQgdGhlIGtlcm5lbCAqLwogCXN0YXJ0ID0gbG9hZF9rZXJuZWwob3Blbl9vcl9kaWUoYXJndltvcHRpbmQrMV0sIE9fUkRPTkxZKSwKIAkJCSAgICAmcGFnZV9vZmZzZXQpOwogCi0JLyogV3JpdGUgdGhlIGRldmljZSBkZXNjcmlwdG9ycyBpbnRvIG1lbW9yeS4gKi8KLQltYXBfZGV2aWNlX2Rlc2NyaXB0b3JzKCZkZXZpY2VfbGlzdCwgbWVtKTsKLQotCS8qIE1hcCB0aGUgaW5pdHJkIGltYWdlIGlmIHJlcXVlc3RlZCAqLworCS8qIE1hcCB0aGUgaW5pdHJkIGltYWdlIGlmIHJlcXVlc3RlZCAoYXQgdG9wIG9mIHBoeXNpY2FsIG1lbW9yeSkgKi8KIAlpZiAoaW5pdHJkX25hbWUpIHsKIAkJaW5pdHJkX3NpemUgPSBsb2FkX2luaXRyZChpbml0cmRfbmFtZSwgbWVtKTsKKwkJLyogVGhlc2UgYXJlIHRoZSBsb2NhdGlvbiBpbiB0aGUgTGludXggYm9vdCBoZWFkZXIgd2hlcmUgdGhlCisJCSAqIHN0YXJ0IGFuZCBzaXplIG9mIHRoZSBpbml0cmQgYXJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kLiAqLwogCQkqKHVuc2lnbmVkIGxvbmcgKikoYm9vdCsweDIxOCkgPSBtZW0gLSBpbml0cmRfc2l6ZTsKIAkJKih1bnNpZ25lZCBsb25nICopKGJvb3QrMHgyMWMpID0gaW5pdHJkX3NpemU7CisJCS8qIFRoZSBib290bG9hZGVyIHR5cGUgMHhGRiBtZWFucyAidW5rbm93biI7IHRoYXQncyBPSy4gKi8KIAkJKih1bnNpZ25lZCBjaGFyICopKGJvb3QrMHgyMTApID0gMHhGRjsKIAl9CiAKLQkvKiBTZXQgdXAgdGhlIGluaXRpYWwgbGluYXIgcGFnZXRhYmxlcy4gKi8KKwkvKiBTZXQgdXAgdGhlIGluaXRpYWwgbGluZWFyIHBhZ2V0YWJsZXMsIHN0YXJ0aW5nIGJlbG93IHRoZSBpbml0cmQuICovCiAJcGdkaXIgPSBzZXR1cF9wYWdldGFibGVzKG1lbSwgaW5pdHJkX3NpemUsIHBhZ2Vfb2Zmc2V0KTsKIAotCS8qIEU4MjAgbWVtb3J5IG1hcDogb3VycyBpcyBhIHNpbXBsZSwgc2luZ2xlIHJlZ2lvbi4gKi8KKwkvKiBUaGUgTGludXggYm9vdCBoZWFkZXIgY29udGFpbnMgYW4gIkU4MjAiIG1lbW9yeSBtYXA6IG91cnMgaXMgYQorCSAqIHNpbXBsZSwgc2luZ2xlIHJlZ2lvbi4gKi8KIAkqKGNoYXIqKShib290K0U4MjBOUikgPSAxOwogCSooKHN0cnVjdCBlODIwZW50cnkgKikoYm9vdCtFODIwTUFQKSkKIAkJPSAoKHN0cnVjdCBlODIwZW50cnkpIHsgMCwgbWVtLCBFODIwX1JBTSB9KTsKLQkvKiBDb21tYW5kIGxpbmUgcG9pbnRlciBhbmQgY29tbWFuZCBsaW5lIChhdCA0MDk2KSAqLworCS8qIFRoZSBib290IGhlYWRlciBjb250YWlucyBhIGNvbW1hbmQgbGluZSBwb2ludGVyOiB3ZSBwdXQgdGhlIGNvbW1hbmQKKwkgKiBsaW5lIGFmdGVyIHRoZSBib290IGhlYWRlciAoYXQgYWRkcmVzcyA0MDk2KSAqLwogCSoodm9pZCAqKikoYm9vdCArIDB4MjI4KSA9IGJvb3QgKyA0MDk2OwogCWNvbmNhdChib290ICsgNDA5NiwgYXJnditvcHRpbmQrMik7Ci0JLyogUGFyYXZpcnQgdHlwZTogMSA9PSBsZ3Vlc3QgKi8KKworCS8qIFRoZSBndWVzdCB0eXBlIHZhbHVlIG9mICIxIiB0ZWxscyB0aGUgR3Vlc3QgaXQncyB1bmRlciBsZ3Vlc3QuICovCiAJKihpbnQgKikoYm9vdCArIDB4MjNjKSA9IDE7CiAKKwkvKiBXZSB0ZWxsIHRoZSBrZXJuZWwgdG8gaW5pdGlhbGl6ZSB0aGUgR3Vlc3Q6IHRoaXMgcmV0dXJucyB0aGUgb3BlbgorCSAqIC9kZXYvbGd1ZXN0IGZpbGUgZGVzY3JpcHRvci4gKi8KIAlsZ3Vlc3RfZmQgPSB0ZWxsX2tlcm5lbChwZ2Rpciwgc3RhcnQsIHBhZ2Vfb2Zmc2V0KTsKKworCS8qIFdlIGZvcmsgb2ZmIGEgY2hpbGQgcHJvY2Vzcywgd2hpY2ggd2FrZXMgdGhlIExhdW5jaGVyIHdoZW5ldmVyIG9uZQorCSAqIG9mIHRoZSBpbnB1dCBmaWxlIGRlc2NyaXB0b3JzIG5lZWRzIGF0dGVudGlvbi4gIE90aGVyd2lzZSB3ZSB3b3VsZAorCSAqIHJ1biB0aGUgR3Vlc3QgdW50aWwgaXQgdHJpZXMgdG8gb3V0cHV0IHNvbWV0aGluZy4gKi8KIAl3YWtlcl9mZCA9IHNldHVwX3dha2VyKGxndWVzdF9mZCwgJmRldmljZV9saXN0KTsKIAorCS8qIEZpbmFsbHksIHJ1biB0aGUgR3Vlc3QuICBUaGlzIGRvZXNuJ3QgcmV0dXJuLiAqLwogCXJ1bl9ndWVzdChsZ3Vlc3RfZmQsICZkZXZpY2VfbGlzdCk7CiB9CisvKjoqLworCisvKk06OTk5CisgKiBNYXN0ZXJ5IGlzIGRvbmU6IHlvdSBub3cga25vdyBldmVyeXRoaW5nIEkgZG8uCisgKgorICogQnV0IHN1cmVseSB5b3UgaGF2ZSBzZWVuIGNvZGUsIGZlYXR1cmVzIGFuZCBidWdzIGluIHlvdXIgd2FuZGVyaW5ncyB3aGljaAorICogeW91IG5vdyB5ZWFybiB0byBhdHRhY2s/ICBUaGF0IGlzIHRoZSByZWFsIGdhbWUsIGFuZCBJIGxvb2sgZm9yd2FyZCB0byB5b3UKKyAqIHBhdGNoaW5nIGFuZCBmb3JraW5nIGxndWVzdCBpbnRvIHRoZSBZb3VyLU5hbWUtSGVyZS12aXNvci4KKyAqCisgKiBGYXJld2VsbCwgYW5kIGdvb2QgY29kaW5nIQorICogUnVzdHkgUnVzc2VsbC4KKyAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZC1zdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkLXN0YXRzLnR4dAppbmRleCA2ZjcyMDIxLi40NDJlMTRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkLXN0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkLXN0YXRzLnR4dApAQCAtMSwxMCArMSwxMSBAQAotVmVyc2lvbiAxMCBvZiBzY2hlZHN0YXRzIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHNjaGVkX2RvbWFpbnMsIHdoaWNoCi1oaXQgdGhlIG1haW5saW5lIGtlcm5lbCBpbiAyLjYuNy4gIFNvbWUgY291bnRlcnMgbWFrZSBtb3JlIHNlbnNlIHRvIGJlCi1wZXItcnVucXVldWU7IG90aGVyIHRvIGJlIHBlci1kb21haW4uICBOb3RlIHRoYXQgZG9tYWlucyAoYW5kIHRoZWlyIGFzc29jaWF0ZWQKLWluZm9ybWF0aW9uKSB3aWxsIG9ubHkgYmUgcGVydGluZW50IGFuZCBhdmFpbGFibGUgb24gbWFjaGluZXMgdXRpbGl6aW5nCi1DT05GSUdfU01QLgorVmVyc2lvbiAxNCBvZiBzY2hlZHN0YXRzIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHNjaGVkX2RvbWFpbnMsIHdoaWNoIGhpdCB0aGUKK21haW5saW5lIGtlcm5lbCBpbiAyLjYuMjAgYWx0aG91Z2ggaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBzdGF0cyBmcm9tIHZlcnNpb24KKzEyIHdoaWNoIHdhcyBpbiB0aGUga2VybmVsIGZyb20gMi42LjEzLTIuNi4xOSAodmVyc2lvbiAxMyBuZXZlciBzYXcgYSBrZXJuZWwKK3JlbGVhc2UpLiAgU29tZSBjb3VudGVycyBtYWtlIG1vcmUgc2Vuc2UgdG8gYmUgcGVyLXJ1bnF1ZXVlOyBvdGhlciB0byBiZQorcGVyLWRvbWFpbi4gIE5vdGUgdGhhdCBkb21haW5zIChhbmQgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbikgd2lsbCBvbmx5CitiZSBwZXJ0aW5lbnQgYW5kIGF2YWlsYWJsZSBvbiBtYWNoaW5lcyB1dGlsaXppbmcgQ09ORklHX1NNUC4KIAotSW4gdmVyc2lvbiAxMCBvZiBzY2hlZHN0YXQsIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBsZXZlbCBvZiBkb21haW4KK0luIHZlcnNpb24gMTQgb2Ygc2NoZWRzdGF0LCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbGV2ZWwgb2YgZG9tYWluCiBzdGF0aXN0aWNzIGZvciBlYWNoIGNwdSBsaXN0ZWQsIGFuZCB0aGVyZSBtYXkgd2VsbCBiZSBtb3JlIHRoYW4gb25lCiBkb21haW4uICBEb21haW5zIGhhdmUgbm8gcGFydGljdWxhciBuYW1lcyBpbiB0aGlzIGltcGxlbWVudGF0aW9uLCBidXQKIHRoZSBoaWdoZXN0IG51bWJlcmVkIG9uZSB0eXBpY2FsbHkgYXJiaXRyYXRlcyBiYWxhbmNpbmcgYWNyb3NzIGFsbCB0aGUKQEAgLTI3LDcgKzI4LDcgQEAKIAogQ1BVIHN0YXRpc3RpY3MKIC0tLS0tLS0tLS0tLS0tCi1jcHU8Tj4gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjgKK2NwdTxOPiAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMgogCiBOT1RFOiBJbiB0aGUgc2NoZWRfeWllbGQoKSBzdGF0aXN0aWNzLCB0aGUgYWN0aXZlIHF1ZXVlIGlzIGNvbnNpZGVyZWQgZW1wdHkKICAgICBpZiBpdCBoYXMgb25seSBvbmUgcHJvY2VzcyBpbiBpdCwgc2luY2Ugb2J2aW91c2x5IHRoZSBwcm9jZXNzIGNhbGxpbmcKQEAgLTM5LDQ4ICs0MCwyMCBAQAogICAgICAzKSAjIG9mIHRpbWVzIGp1c3QgdGhlIGV4cGlyZWQgcXVldWUgd2FzIGVtcHR5CiAgICAgIDQpICMgb2YgdGltZXMgc2NoZWRfeWllbGQoKSB3YXMgY2FsbGVkCiAKLU5leHQgZm91ciBhcmUgc2NoZWR1bGUoKSBzdGF0aXN0aWNzOgotICAgICA1KSAjIG9mIHRpbWVzIHRoZSBhY3RpdmUgcXVldWUgaGFkIGF0IGxlYXN0IG9uZSBvdGhlciBwcm9jZXNzIG9uIGl0Ci0gICAgIDYpICMgb2YgdGltZXMgd2Ugc3dpdGNoZWQgdG8gdGhlIGV4cGlyZWQgcXVldWUgYW5kIHJldXNlZCBpdAotICAgICA3KSAjIG9mIHRpbWVzIHNjaGVkdWxlKCkgd2FzIGNhbGxlZAotICAgICA4KSAjIG9mIHRpbWVzIHNjaGVkdWxlKCkgbGVmdCB0aGUgcHJvY2Vzc29yIGlkbGUKK05leHQgdGhyZWUgYXJlIHNjaGVkdWxlKCkgc3RhdGlzdGljczoKKyAgICAgNSkgIyBvZiB0aW1lcyB3ZSBzd2l0Y2hlZCB0byB0aGUgZXhwaXJlZCBxdWV1ZSBhbmQgcmV1c2VkIGl0CisgICAgIDYpICMgb2YgdGltZXMgc2NoZWR1bGUoKSB3YXMgY2FsbGVkCisgICAgIDcpICMgb2YgdGltZXMgc2NoZWR1bGUoKSBsZWZ0IHRoZSBwcm9jZXNzb3IgaWRsZQogCi1OZXh0IGZvdXIgYXJlIGFjdGl2ZV9sb2FkX2JhbGFuY2UoKSBzdGF0aXN0aWNzOgotICAgICA5KSAjIG9mIHRpbWVzIGFjdGl2ZV9sb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkCi0gICAgMTApICMgb2YgdGltZXMgYWN0aXZlX2xvYWRfYmFsYW5jZSgpIGNhdXNlZCB0aGlzIGNwdSB0byBnYWluIGEgdGFzawotICAgIDExKSAjIG9mIHRpbWVzIGFjdGl2ZV9sb2FkX2JhbGFuY2UoKSBjYXVzZWQgdGhpcyBjcHUgdG8gbG9zZSBhIHRhc2sKLSAgICAxMikgIyBvZiB0aW1lcyBhY3RpdmVfbG9hZF9iYWxhbmNlKCkgdHJpZWQgdG8gbW92ZSBhIHRhc2sgYW5kIGZhaWxlZAotCi1OZXh0IHRocmVlIGFyZSB0cnlfdG9fd2FrZV91cCgpIHN0YXRpc3RpY3M6Ci0gICAgMTMpICMgb2YgdGltZXMgdHJ5X3RvX3dha2VfdXAoKSB3YXMgY2FsbGVkCi0gICAgMTQpICMgb2YgdGltZXMgdHJ5X3RvX3dha2VfdXAoKSBzdWNjZXNzZnVsbHkgbW92ZWQgdGhlIGF3YWtlbmluZyB0YXNrCi0gICAgMTUpICMgb2YgdGltZXMgdHJ5X3RvX3dha2VfdXAoKSBhdHRlbXB0ZWQgdG8gbW92ZSB0aGUgYXdha2VuaW5nIHRhc2sKLQotTmV4dCB0d28gYXJlIHdha2VfdXBfbmV3X3Rhc2soKSBzdGF0aXN0aWNzOgotICAgIDE2KSAjIG9mIHRpbWVzIHdha2VfdXBfbmV3X3Rhc2soKSB3YXMgY2FsbGVkCi0gICAgMTcpICMgb2YgdGltZXMgd2FrZV91cF9uZXdfdGFzaygpIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0aGUgbmV3IHRhc2sKLQotTmV4dCBvbmUgaXMgYSBzY2hlZF9taWdyYXRlX3Rhc2soKSBzdGF0aXN0aWM6Ci0gICAgMTgpICMgb2YgdGltZXMgc2NoZWRfbWlncmF0ZV90YXNrKCkgd2FzIGNhbGxlZAotCi1OZXh0IG9uZSBpcyBhIHNjaGVkX2JhbGFuY2VfZXhlYygpIHN0YXRpc3RpYzoKLSAgICAxOSkgIyBvZiB0aW1lcyBzY2hlZF9iYWxhbmNlX2V4ZWMoKSB3YXMgY2FsbGVkCitOZXh0IHR3byBhcmUgdHJ5X3RvX3dha2VfdXAoKSBzdGF0aXN0aWNzOgorICAgICA4KSAjIG9mIHRpbWVzIHRyeV90b193YWtlX3VwKCkgd2FzIGNhbGxlZAorICAgICA5KSAjIG9mIHRpbWVzIHRyeV90b193YWtlX3VwKCkgd2FzIGNhbGxlZCB0byB3YWtlIHVwIHRoZSBsb2NhbCBjcHUKIAogTmV4dCB0aHJlZSBhcmUgc3RhdGlzdGljcyBkZXNjcmliaW5nIHNjaGVkdWxpbmcgbGF0ZW5jeToKLSAgICAyMCkgc3VtIG9mIGFsbCB0aW1lIHNwZW50IHJ1bm5pbmcgYnkgdGFza3Mgb24gdGhpcyBwcm9jZXNzb3IgKGluIG1zKQotICAgIDIxKSBzdW0gb2YgYWxsIHRpbWUgc3BlbnQgd2FpdGluZyB0byBydW4gYnkgdGFza3Mgb24gdGhpcyBwcm9jZXNzb3IgKGluIG1zKQotICAgIDIyKSAjIG9mIHRhc2tzIChub3QgbmVjZXNzYXJpbHkgdW5pcXVlKSBnaXZlbiB0byB0aGUgcHJvY2Vzc29yCi0KLVRoZSBsYXN0IHNpeCBhcmUgc3RhdGlzdGljcyBkZWFsaW5nIHdpdGggcHVsbF90YXNrKCk6Ci0gICAgMjMpICMgb2YgdGltZXMgcHVsbF90YXNrKCkgbW92ZWQgYSB0YXNrIHRvIHRoaXMgY3B1IHdoZW4gbmV3bHkgaWRsZQotICAgIDI0KSAjIG9mIHRpbWVzIHB1bGxfdGFzaygpIHN0b2xlIGEgdGFzayBmcm9tIHRoaXMgY3B1IHdoZW4gYW5vdGhlciBjcHUKLQl3YXMgbmV3bHkgaWRsZQotICAgIDI1KSAjIG9mIHRpbWVzIHB1bGxfdGFzaygpIG1vdmVkIGEgdGFzayB0byB0aGlzIGNwdSB3aGVuIGlkbGUKLSAgICAyNikgIyBvZiB0aW1lcyBwdWxsX3Rhc2soKSBzdG9sZSBhIHRhc2sgZnJvbSB0aGlzIGNwdSB3aGVuIGFub3RoZXIgY3B1Ci0Jd2FzIGlkbGUKLSAgICAyNykgIyBvZiB0aW1lcyBwdWxsX3Rhc2soKSBtb3ZlZCBhIHRhc2sgdG8gdGhpcyBjcHUgd2hlbiBidXN5Ci0gICAgMjgpICMgb2YgdGltZXMgcHVsbF90YXNrKCkgc3RvbGUgYSB0YXNrIGZyb20gdGhpcyBjcHUgd2hlbiBhbm90aGVyIGNwdQotCXdhcyBidXN5CisgICAgMTApIHN1bSBvZiBhbGwgdGltZSBzcGVudCBydW5uaW5nIGJ5IHRhc2tzIG9uIHRoaXMgcHJvY2Vzc29yIChpbiBqaWZmaWVzKQorICAgIDExKSBzdW0gb2YgYWxsIHRpbWUgc3BlbnQgd2FpdGluZyB0byBydW4gYnkgdGFza3Mgb24gdGhpcyBwcm9jZXNzb3IgKGluCisgICAgICAgIGppZmZpZXMpCisgICAgMTIpICMgb2YgdGltZXNsaWNlcyBydW4gb24gdGhpcyBjcHUKIAogCiBEb21haW4gc3RhdGlzdGljcwpAQCAtODksNjUgKzYyLDk1IEBACiBDT05GSUdfU01QIGlzIG5vdCBkZWZpbmVkLCAqbm8qIGRvbWFpbnMgYXJlIHV0aWxpemVkIGFuZCB0aGVzZSBsaW5lcwogd2lsbCBub3QgYXBwZWFyIGluIHRoZSBvdXRwdXQuKQogCi1kb21haW48Tj4gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAKK2RvbWFpbjxOPiA8Y3B1bWFzaz4gMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYKIAogVGhlIGZpcnN0IGZpZWxkIGlzIGEgYml0IG1hc2sgaW5kaWNhdGluZyB3aGF0IGNwdXMgdGhpcyBkb21haW4gb3BlcmF0ZXMgb3Zlci4KIAotVGhlIG5leHQgZmlmdGVlbiBhcmUgYSB2YXJpZXR5IG9mIGxvYWRfYmFsYW5jZSgpIHN0YXRpc3RpY3M6CitUaGUgbmV4dCAyNCBhcmUgYSB2YXJpZXR5IG9mIGxvYWRfYmFsYW5jZSgpIHN0YXRpc3RpY3MgaW4gZ3JvdXBlZCBpbnRvIHR5cGVzCitvZiBpZGxlbmVzcyAoaWRsZSwgYnVzeSwgYW5kIG5ld2x5IGlkbGUpOgogCi0gICAgIDEpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gbG9hZF9iYWxhbmNlKCkgd2FzIGNhbGxlZCB3aGVuIHRoZSBjcHUKLQl3YXMgaWRsZQotICAgICAyKSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHdhcyBjYWxsZWQgd2hlbiB0aGUgY3B1Ci0Jd2FzIGJ1c3kKLSAgICAgMykgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkIHdoZW4gdGhlIGNwdQotCXdhcyBqdXN0IGJlY29taW5nIGlkbGUKLSAgICAgNCkgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB0cmllZCB0byBtb3ZlIG9uZSBvciBtb3JlCi0JdGFza3MgYW5kIGZhaWxlZCwgd2hlbiB0aGUgY3B1IHdhcyBpZGxlCi0gICAgIDUpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gbG9hZF9iYWxhbmNlKCkgdHJpZWQgdG8gbW92ZSBvbmUgb3IgbW9yZQotCXRhc2tzIGFuZCBmYWlsZWQsIHdoZW4gdGhlIGNwdSB3YXMgYnVzeQotICAgICA2KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHRyaWVkIHRvIG1vdmUgb25lIG9yIG1vcmUKLQl0YXNrcyBhbmQgZmFpbGVkLCB3aGVuIHRoZSBjcHUgd2FzIGp1c3QgYmVjb21pbmcgaWRsZQotICAgICA3KSBzdW0gb2YgaW1iYWxhbmNlcyBkaXNjb3ZlcmVkIChpZiBhbnkpIHdpdGggZWFjaCBjYWxsIHRvCi0JbG9hZF9iYWxhbmNlKCkgaW4gdGhpcyBkb21haW4gd2hlbiB0aGUgY3B1IHdhcyBpZGxlCi0gICAgIDgpIHN1bSBvZiBpbWJhbGFuY2VzIGRpc2NvdmVyZWQgKGlmIGFueSkgd2l0aCBlYWNoIGNhbGwgdG8KLQlsb2FkX2JhbGFuY2UoKSBpbiB0aGlzIGRvbWFpbiB3aGVuIHRoZSBjcHUgd2FzIGJ1c3kKLSAgICAgOSkgc3VtIG9mIGltYmFsYW5jZXMgZGlzY292ZXJlZCAoaWYgYW55KSB3aXRoIGVhY2ggY2FsbCB0bwotCWxvYWRfYmFsYW5jZSgpIGluIHRoaXMgZG9tYWluIHdoZW4gdGhlIGNwdSB3YXMganVzdCBiZWNvbWluZyBpZGxlCi0gICAgMTApICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gbG9hZF9iYWxhbmNlKCkgd2FzIGNhbGxlZCBidXQgZGlkIG5vdCBmaW5kCi0JYSBidXNpZXIgcXVldWUgd2hpbGUgdGhlIGNwdSB3YXMgaWRsZQotICAgIDExKSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHdhcyBjYWxsZWQgYnV0IGRpZCBub3QgZmluZAotCWEgYnVzaWVyIHF1ZXVlIHdoaWxlIHRoZSBjcHUgd2FzIGJ1c3kKLSAgICAxMikgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkIGJ1dCBkaWQgbm90IGZpbmQKLQlhIGJ1c2llciBxdWV1ZSB3aGlsZSB0aGUgY3B1IHdhcyBqdXN0IGJlY29taW5nIGlkbGUKLSAgICAxMykgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBhIGJ1c2llciBxdWV1ZSB3YXMgZm91bmQgd2hpbGUgdGhlIGNwdSB3YXMKLQlpZGxlIGJ1dCBubyBidXNpZXIgZ3JvdXAgd2FzIGZvdW5kCi0gICAgMTQpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gYSBidXNpZXIgcXVldWUgd2FzIGZvdW5kIHdoaWxlIHRoZSBjcHUgd2FzCi0JYnVzeSBidXQgbm8gYnVzaWVyIGdyb3VwIHdhcyBmb3VuZAotICAgIDE1KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGEgYnVzaWVyIHF1ZXVlIHdhcyBmb3VuZCB3aGlsZSB0aGUgY3B1IHdhcwotCWp1c3QgYmVjb21pbmcgaWRsZSBidXQgbm8gYnVzaWVyIGdyb3VwIHdhcyBmb3VuZAorICAgICAxKSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHdhcyBjYWxsZWQgd2hlbiB0aGUKKyAgICAgICAgY3B1IHdhcyBpZGxlCisgICAgIDIpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gbG9hZF9iYWxhbmNlKCkgY2hlY2tlZCBidXQgZm91bmQKKyAgICAgICAgdGhlIGxvYWQgZGlkIG5vdCByZXF1aXJlIGJhbGFuY2luZyB3aGVuIHRoZSBjcHUgd2FzIGlkbGUKKyAgICAgMykgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB0cmllZCB0byBtb3ZlIG9uZSBvcgorICAgICAgICBtb3JlIHRhc2tzIGFuZCBmYWlsZWQsIHdoZW4gdGhlIGNwdSB3YXMgaWRsZQorICAgICA0KSBzdW0gb2YgaW1iYWxhbmNlcyBkaXNjb3ZlcmVkIChpZiBhbnkpIHdpdGggZWFjaCBjYWxsIHRvCisgICAgICAgIGxvYWRfYmFsYW5jZSgpIGluIHRoaXMgZG9tYWluIHdoZW4gdGhlIGNwdSB3YXMgaWRsZQorICAgICA1KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIHB1bGxfdGFzaygpIHdhcyBjYWxsZWQgd2hlbiB0aGUgY3B1CisgICAgICAgIHdhcyBpZGxlCisgICAgIDYpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gcHVsbF90YXNrKCkgd2FzIGNhbGxlZCBldmVuIHRob3VnaAorICAgICAgICB0aGUgdGFyZ2V0IHRhc2sgd2FzIGNhY2hlLWhvdCB3aGVuIGlkbGUKKyAgICAgNykgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkIGJ1dCBkaWQKKyAgICAgICAgbm90IGZpbmQgYSBidXNpZXIgcXVldWUgd2hpbGUgdGhlIGNwdSB3YXMgaWRsZQorICAgICA4KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGEgYnVzaWVyIHF1ZXVlIHdhcyBmb3VuZCB3aGlsZSB0aGUKKyAgICAgICAgY3B1IHdhcyBpZGxlIGJ1dCBubyBidXNpZXIgZ3JvdXAgd2FzIGZvdW5kCiAKLU5leHQgdHdvIGFyZSBzY2hlZF9iYWxhbmNlX2V4ZWMoKSBzdGF0aXN0aWNzOgotICAgIDE3KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIHNjaGVkX2JhbGFuY2VfZXhlYygpIHN1Y2Nlc3NmdWxseSBwdXNoZWQKLQlhIHRhc2sgdG8gYSBuZXcgY3B1Ci0gICAgMTgpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gc2NoZWRfYmFsYW5jZV9leGVjKCkgdHJpZWQgYnV0IGZhaWxlZCB0bwotCXB1c2ggYSB0YXNrIHRvIGEgbmV3IGNwdQorICAgICA5KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHdhcyBjYWxsZWQgd2hlbiB0aGUKKyAgICAgICAgY3B1IHdhcyBidXN5CisgICAgMTApICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gbG9hZF9iYWxhbmNlKCkgY2hlY2tlZCBidXQgZm91bmQgdGhlCisgICAgICAgIGxvYWQgZGlkIG5vdCByZXF1aXJlIGJhbGFuY2luZyB3aGVuIGJ1c3kKKyAgICAxMSkgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB0cmllZCB0byBtb3ZlIG9uZSBvcgorICAgICAgICBtb3JlIHRhc2tzIGFuZCBmYWlsZWQsIHdoZW4gdGhlIGNwdSB3YXMgYnVzeQorICAgIDEyKSBzdW0gb2YgaW1iYWxhbmNlcyBkaXNjb3ZlcmVkIChpZiBhbnkpIHdpdGggZWFjaCBjYWxsIHRvCisgICAgICAgIGxvYWRfYmFsYW5jZSgpIGluIHRoaXMgZG9tYWluIHdoZW4gdGhlIGNwdSB3YXMgYnVzeQorICAgIDEzKSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIHB1bGxfdGFzaygpIHdhcyBjYWxsZWQgd2hlbiBidXN5CisgICAgMTQpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gcHVsbF90YXNrKCkgd2FzIGNhbGxlZCBldmVuIHRob3VnaCB0aGUKKyAgICAgICAgdGFyZ2V0IHRhc2sgd2FzIGNhY2hlLWhvdCB3aGVuIGJ1c3kKKyAgICAxNSkgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkIGJ1dCBkaWQgbm90CisgICAgICAgIGZpbmQgYSBidXNpZXIgcXVldWUgd2hpbGUgdGhlIGNwdSB3YXMgYnVzeQorICAgIDE2KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGEgYnVzaWVyIHF1ZXVlIHdhcyBmb3VuZCB3aGlsZSB0aGUgY3B1CisgICAgICAgIHdhcyBidXN5IGJ1dCBubyBidXNpZXIgZ3JvdXAgd2FzIGZvdW5kCiAKLU5leHQgdHdvIGFyZSB0cnlfdG9fd2FrZV91cCgpIHN0YXRpc3RpY3M6Ci0gICAgMTkpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gdHJ5X3RvX3dha2VfdXAoKSB0cmllZCB0byBtb3ZlIGEgdGFzayBiYXNlZAotCW9uIGFmZmluaXR5IGFuZCBjYWNoZSB3YXJtdGgKLSAgICAyMCkgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiB0cnlfdG9fd2FrZV91cCgpIHRyaWVkIHRvIG1vdmUgYSB0YXNrIGJhc2VkCi0Jb24gbG9hZCBiYWxhbmNpbmcKKyAgICAxNykgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBsb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkIHdoZW4gdGhlCisgICAgICAgIGNwdSB3YXMganVzdCBiZWNvbWluZyBpZGxlCisgICAgMTgpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gbG9hZF9iYWxhbmNlKCkgY2hlY2tlZCBidXQgZm91bmQgdGhlCisgICAgICAgIGxvYWQgZGlkIG5vdCByZXF1aXJlIGJhbGFuY2luZyB3aGVuIHRoZSBjcHUgd2FzIGp1c3QgYmVjb21pbmcgaWRsZQorICAgIDE5KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHRyaWVkIHRvIG1vdmUgb25lIG9yIG1vcmUKKyAgICAgICAgdGFza3MgYW5kIGZhaWxlZCwgd2hlbiB0aGUgY3B1IHdhcyBqdXN0IGJlY29taW5nIGlkbGUKKyAgICAyMCkgc3VtIG9mIGltYmFsYW5jZXMgZGlzY292ZXJlZCAoaWYgYW55KSB3aXRoIGVhY2ggY2FsbCB0bworICAgICAgICBsb2FkX2JhbGFuY2UoKSBpbiB0aGlzIGRvbWFpbiB3aGVuIHRoZSBjcHUgd2FzIGp1c3QgYmVjb21pbmcgaWRsZQorICAgIDIxKSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIHB1bGxfdGFzaygpIHdhcyBjYWxsZWQgd2hlbiBuZXdseSBpZGxlCisgICAgMjIpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gcHVsbF90YXNrKCkgd2FzIGNhbGxlZCBldmVuIHRob3VnaCB0aGUKKyAgICAgICAgdGFyZ2V0IHRhc2sgd2FzIGNhY2hlLWhvdCB3aGVuIGp1c3QgYmVjb21pbmcgaWRsZQorICAgIDIzKSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIGxvYWRfYmFsYW5jZSgpIHdhcyBjYWxsZWQgYnV0IGRpZCBub3QKKyAgICAgICAgZmluZCBhIGJ1c2llciBxdWV1ZSB3aGlsZSB0aGUgY3B1IHdhcyBqdXN0IGJlY29taW5nIGlkbGUKKyAgICAyNCkgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiBhIGJ1c2llciBxdWV1ZSB3YXMgZm91bmQgd2hpbGUgdGhlIGNwdQorICAgICAgICB3YXMganVzdCBiZWNvbWluZyBpZGxlIGJ1dCBubyBidXNpZXIgZ3JvdXAgd2FzIGZvdW5kCiAKKyAgIE5leHQgdGhyZWUgYXJlIGFjdGl2ZV9sb2FkX2JhbGFuY2UoKSBzdGF0aXN0aWNzOgorICAgIDI1KSAjIG9mIHRpbWVzIGFjdGl2ZV9sb2FkX2JhbGFuY2UoKSB3YXMgY2FsbGVkCisgICAgMjYpICMgb2YgdGltZXMgYWN0aXZlX2xvYWRfYmFsYW5jZSgpIHRyaWVkIHRvIG1vdmUgYSB0YXNrIGFuZCBmYWlsZWQKKyAgICAyNykgIyBvZiB0aW1lcyBhY3RpdmVfbG9hZF9iYWxhbmNlKCkgc3VjY2Vzc2Z1bGx5IG1vdmVkIGEgdGFzaworCisgICBOZXh0IHRocmVlIGFyZSBzY2hlZF9iYWxhbmNlX2V4ZWMoKSBzdGF0aXN0aWNzOgorICAgIDI4KSBzYmVfY250IGlzIG5vdCB1c2VkCisgICAgMjkpIHNiZV9iYWxhbmNlZCBpcyBub3QgdXNlZAorICAgIDMwKSBzYmVfcHVzaGVkIGlzIG5vdCB1c2VkCisKKyAgIE5leHQgdGhyZWUgYXJlIHNjaGVkX2JhbGFuY2VfZm9yaygpIHN0YXRpc3RpY3M6CisgICAgMzEpIHNiZl9jbnQgaXMgbm90IHVzZWQKKyAgICAzMikgc2JmX2JhbGFuY2VkIGlzIG5vdCB1c2VkCisgICAgMzMpIHNiZl9wdXNoZWQgaXMgbm90IHVzZWQKKworICAgTmV4dCB0aHJlZSBhcmUgdHJ5X3RvX3dha2VfdXAoKSBzdGF0aXN0aWNzOgorICAgIDM0KSAjIG9mIHRpbWVzIGluIHRoaXMgZG9tYWluIHRyeV90b193YWtlX3VwKCkgYXdva2UgYSB0YXNrIHRoYXQKKyAgICAgICAgbGFzdCByYW4gb24gYSBkaWZmZXJlbnQgY3B1IGluIHRoaXMgZG9tYWluCisgICAgMzUpICMgb2YgdGltZXMgaW4gdGhpcyBkb21haW4gdHJ5X3RvX3dha2VfdXAoKSBtb3ZlZCBhIHRhc2sgdG8gdGhlCisgICAgICAgIHdha2luZyBjcHUgYmVjYXVzZSBpdCB3YXMgY2FjaGUtY29sZCBvbiBpdHMgb3duIGNwdSBhbnl3YXkKKyAgICAzNikgIyBvZiB0aW1lcyBpbiB0aGlzIGRvbWFpbiB0cnlfdG9fd2FrZV91cCgpIHN0YXJ0ZWQgcGFzc2l2ZSBiYWxhbmNpbmcKIAogL3Byb2MvPHBpZD4vc2NoZWRzdGF0CiAtLS0tLS0tLS0tLS0tLS0tCiBzY2hlZHN0YXRzIGFsc28gYWRkcyBhIG5ldyAvcHJvYy88cGlkL3NjaGVkc3RhdCBmaWxlIHRvIGluY2x1ZGUgc29tZSBvZgogdGhlIHNhbWUgaW5mb3JtYXRpb24gb24gYSBwZXItcHJvY2VzcyBsZXZlbC4gIFRoZXJlIGFyZSB0aHJlZSBmaWVsZHMgaW4KLXRoaXMgZmlsZSBjb3JyZWxhdGluZyB0byBmaWVsZHMgMjAsIDIxLCBhbmQgMjIgaW4gdGhlIENQVSBmaWVsZHMsIGJ1dAotdGhleSBvbmx5IGFwcGx5IGZvciB0aGF0IHByb2Nlc3MuCit0aGlzIGZpbGUgY29ycmVsYXRpbmcgZm9yIHRoYXQgcHJvY2VzcyB0bzoKKyAgICAgMSkgdGltZSBzcGVudCBvbiB0aGUgY3B1CisgICAgIDIpIHRpbWUgc3BlbnQgd2FpdGluZyBvbiBhIHJ1bnF1ZXVlCisgICAgIDMpICMgb2YgdGltZXNsaWNlcyBydW4gb24gdGhpcyBjcHUKIAogQSBwcm9ncmFtIGNvdWxkIGJlIGVhc2lseSB3cml0dGVuIHRvIG1ha2UgdXNlIG9mIHRoZXNlIGV4dHJhIGZpZWxkcyB0bwogcmVwb3J0IG9uIGhvdyB3ZWxsIGEgcGFydGljdWxhciBwcm9jZXNzIG9yIHNldCBvZiBwcm9jZXNzZXMgaXMgZmFyaW5nCiB1bmRlciB0aGUgc2NoZWR1bGVyJ3MgcG9saWNpZXMuICBBIHNpbXBsZSB2ZXJzaW9uIG9mIHN1Y2ggYSBwcm9ncmFtIGlzCiBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vZWFnbGV0LnJhaW4uY29tL3JpY2svbGludXgvc2NoZWRzdGF0L3YxMC9sYXRlbmN5LmMKKyAgICBodHRwOi8vZWFnbGV0LnJhaW4uY29tL3JpY2svbGludXgvc2NoZWRzdGF0L3YxMi9sYXRlbmN5LmMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CmluZGV4IGEyYWZjYTMuLjg0N2IzNDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMTAsNyArMTAsNyBAQAogdGhlIG9uZSB0aGF0IGFwcGxpY2F0aW9uIHByb2dyYW1zIHVzZSwgdGhlIHN5c2NhbGwgaW50ZXJmYWNlLiAgVGhhdAogaW50ZXJmYWNlIGlzIF92ZXJ5XyBzdGFibGUgb3ZlciB0aW1lLCBhbmQgd2lsbCBub3QgYnJlYWsuICBJIGhhdmUgb2xkCiBwcm9ncmFtcyB0aGF0IHdlcmUgYnVpbHQgb24gYSBwcmUgMC45c29tZXRoaW5nIGtlcm5lbCB0aGF0IHN0aWxsIHdvcmsKLWp1c3QgZmluZSBvbiB0aGUgbGF0ZXN0IDIuNiBrZXJuZWwgcmVsZWFzZS4gIFRoaXMgaW50ZXJmYWNlIGlzIHRoZSBvbmUKK2p1c3QgZmluZSBvbiB0aGUgbGF0ZXN0IDIuNiBrZXJuZWwgcmVsZWFzZS4gIFRoYXQgaW50ZXJmYWNlIGlzIHRoZSBvbmUKIHRoYXQgdXNlcnMgYW5kIGFwcGxpY2F0aW9uIHByb2dyYW1tZXJzIGNhbiBjb3VudCBvbiBiZWluZyBzdGFibGUuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNmcy1ydWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2ZzLXJ1bGVzLnR4dAppbmRleCA0Mjg2MWJiLi44MGVmNTYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2ZzLXJ1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2ZzLXJ1bGVzLnR4dApAQCAtMSwxOSArMSwxOCBAQAogUnVsZXMgb24gaG93IHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBpbiB0aGUgTGludXgga2VybmVsIHN5c2ZzCiAKLVRoZSBrZXJuZWwgZXhwb3J0ZWQgc3lzZnMgZXhwb3J0cyBpbnRlcm5hbCBrZXJuZWwgaW1wbGVtZW50YXRpb24tZGV0YWlscworVGhlIGtlcm5lbC1leHBvcnRlZCBzeXNmcyBleHBvcnRzIGludGVybmFsIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCiBhbmQgZGVwZW5kcyBvbiBpbnRlcm5hbCBrZXJuZWwgc3RydWN0dXJlcyBhbmQgbGF5b3V0LiBJdCBpcyBhZ3JlZWQgdXBvbgogYnkgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHRoYXQgdGhlIExpbnV4IGtlcm5lbCBkb2VzIG5vdCBwcm92aWRlIGEgc3RhYmxlCiBpbnRlcm5hbCBBUEkuIEFzIHN5c2ZzIGlzIGEgZGlyZWN0IGV4cG9ydCBvZiBrZXJuZWwgaW50ZXJuYWwKLXN0cnVjdHVyZXMsIHRoZSBzeXNmcyBpbnRlcmZhY2UgY2FuIG5vdCBwcm92aWRlIGEgc3RhYmxlIGludGVyZmFjZSBlaWdodGVyLAorc3RydWN0dXJlcywgdGhlIHN5c2ZzIGludGVyZmFjZSBjYW5ub3QgcHJvdmlkZSBhIHN0YWJsZSBpbnRlcmZhY2UgZWl0aGVyOwogaXQgbWF5IGFsd2F5cyBjaGFuZ2UgYWxvbmcgd2l0aCBpbnRlcm5hbCBrZXJuZWwgY2hhbmdlcy4KIAogVG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYnJlYWtpbmcgdXNlcnMgb2Ygc3lzZnMsIHdoaWNoIGFyZSBpbiBtb3N0IGNhc2VzCiBsb3ctbGV2ZWwgdXNlcnNwYWNlIGFwcGxpY2F0aW9ucywgd2l0aCBhIG5ldyBrZXJuZWwgcmVsZWFzZSwgdGhlIHVzZXJzCi1vZiBzeXNmcyBtdXN0IGZvbGxvdyBzb21lIHJ1bGVzIHRvIHVzZSBhbiBhcyBhYnN0cmFjdC1hcy1wb3NzaWJsZSB3YXkgdG8KK29mIHN5c2ZzIG11c3QgZm9sbG93IHNvbWUgcnVsZXMgdG8gdXNlIGFuIGFzLWFic3RyYWN0LWFzLXBvc3NpYmxlIHdheSB0bwogYWNjZXNzIHRoaXMgZmlsZXN5c3RlbS4gVGhlIGN1cnJlbnQgdWRldiBhbmQgSEFMIHByb2dyYW1zIGFscmVhZHkKIGltcGxlbWVudCB0aGlzIGFuZCB1c2VycyBhcmUgZW5jb3VyYWdlZCB0byBwbHVnLCBpZiBwb3NzaWJsZSwgaW50byB0aGUKLWFic3RyYWN0aW9ucyB0aGVzZSBwcm9ncmFtcyBwcm92aWRlIGluc3RlYWQgb2YgYWNjZXNzaW5nIHN5c2ZzCi1kaXJlY3RseS4KK2Fic3RyYWN0aW9ucyB0aGVzZSBwcm9ncmFtcyBwcm92aWRlIGluc3RlYWQgb2YgYWNjZXNzaW5nIHN5c2ZzIGRpcmVjdGx5LgogCiBCdXQgaWYgeW91IHJlYWxseSBkbyB3YW50IG9yIG5lZWQgdG8gYWNjZXNzIHN5c2ZzIGRpcmVjdGx5LCBwbGVhc2UgZm9sbG93CiB0aGUgZm9sbG93aW5nIHJ1bGVzIGFuZCB0aGVuIHlvdXIgcHJvZ3JhbXMgc2hvdWxkIHdvcmsgd2l0aCBmdXR1cmUKQEAgLTI1LDIyICsyNCwyMiBAQAogICBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGluIGl0cyBvd24gQVBJLiBUaGVyZWZvcmUgaXQgaXMgbm90IGJldHRlciB0aGFuCiAgIHJlYWRpbmcgZGlyZWN0b3JpZXMgYW5kIG9wZW5pbmcgdGhlIGZpbGVzIHlvdXJzZWxmLgogICBBbHNvLCBpdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZCwgaW4gdGhlIHNlbnNlIG9mIHJlZmxlY3RpbmcgdGhlCi0gIGN1cnJlbnQga2VybmVsLWRldmVsb3BtZW50LiBUaGUgZ29hbCBvZiBwcm92aWRpbmcgYSBzdGFibGUgaW50ZXJmYWNlCi0gIHRvIHN5c2ZzIGhhcyBmYWlsZWQsIGl0IGNhdXNlcyBtb3JlIHByb2JsZW1zLCB0aGFuIGl0IHNvbHZlcy4gSXQKKyAgY3VycmVudCBrZXJuZWwgZGV2ZWxvcG1lbnQuIFRoZSBnb2FsIG9mIHByb3ZpZGluZyBhIHN0YWJsZSBpbnRlcmZhY2UKKyAgdG8gc3lzZnMgaGFzIGZhaWxlZDsgaXQgY2F1c2VzIG1vcmUgcHJvYmxlbXMgdGhhbiBpdCBzb2x2ZXMuIEl0CiAgIHZpb2xhdGVzIG1hbnkgb2YgdGhlIHJ1bGVzIGluIHRoaXMgZG9jdW1lbnQuCiAKIC0gc3lzZnMgaXMgYWx3YXlzIGF0IC9zeXMKICAgUGFyc2luZyAvcHJvYy9tb3VudHMgaXMgYSB3YXN0ZSBvZiB0aW1lLiBPdGhlciBtb3VudCBwb2ludHMgYXJlIGEKICAgc3lzdGVtIGNvbmZpZ3VyYXRpb24gYnVnIHlvdSBzaG91bGQgbm90IHRyeSB0byBzb2x2ZS4gRm9yIHRlc3QgY2FzZXMsCiAgIHBvc3NpYmx5IHN1cHBvcnQgYSBTWVNGU19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJ3cml0ZSB0aGUKLSAgYXBwbGljYXRpb25zIGJlaGF2aW9yLCBidXQgbmV2ZXIgdHJ5IHRvIHNlYXJjaCBmb3Igc3lzZnMuIE5ldmVyIHRyeQorICBhcHBsaWNhdGlvbidzIGJlaGF2aW9yLCBidXQgbmV2ZXIgdHJ5IHRvIHNlYXJjaCBmb3Igc3lzZnMuIE5ldmVyIHRyeQogICB0byBtb3VudCBpdCwgaWYgeW91IGFyZSBub3QgYW4gZWFybHkgYm9vdCBzY3JpcHQuCiAKIC0gZGV2aWNlcyBhcmUgb25seSAiZGV2aWNlcyIKICAgVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBsaWtlIGNsYXNzLSwgYnVzLSwgcGh5c2ljYWwgZGV2aWNlcywKICAgaW50ZXJmYWNlcywgYW5kIHN1Y2ggdGhhdCB5b3UgY2FuIHJlbHkgb24gaW4gdXNlcnNwYWNlLiBFdmVyeXRoaW5nIGlzCiAgIGp1c3Qgc2ltcGx5IGEgImRldmljZSIuIENsYXNzLSwgYnVzLSwgcGh5c2ljYWwsIC4uLiB0eXBlcyBhcmUganVzdAotICBrZXJuZWwgaW1wbGVtZW50YXRpb24gZGV0YWlscywgd2hpY2ggc2hvdWxkIG5vdCBiZSBleHBlY3RlZCBieQorICBrZXJuZWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyB3aGljaCBzaG91bGQgbm90IGJlIGV4cGVjdGVkIGJ5CiAgIGFwcGxpY2F0aW9ucyB0aGF0IGxvb2sgZm9yIGRldmljZXMgaW4gc3lzZnMuCiAKICAgVGhlIHByb3BlcnRpZXMgb2YgYSBkZXZpY2UgYXJlOgpAQCAtNDgsMTEgKzQ3LDExIEBACiAgICAgICAtIGlkZW50aWNhbCB0byB0aGUgREVWUEFUSCB2YWx1ZSBpbiB0aGUgZXZlbnQgc2VudCBmcm9tIHRoZSBrZXJuZWwKICAgICAgICAgYXQgZGV2aWNlIGNyZWF0aW9uIGFuZCByZW1vdmFsCiAgICAgICAtIHRoZSB1bmlxdWUga2V5IHRvIHRoZSBkZXZpY2UgYXQgdGhhdCBwb2ludCBpbiB0aW1lCi0gICAgICAtIHRoZSBrZXJuZWxzIHBhdGggdG8gdGhlIGRldmljZS1kaXJlY3Rvcnkgd2l0aG91dCB0aGUgbGVhZGluZworICAgICAgLSB0aGUga2VybmVsJ3MgcGF0aCB0byB0aGUgZGV2aWNlIGRpcmVjdG9yeSB3aXRob3V0IHRoZSBsZWFkaW5nCiAgICAgICAgIC9zeXMsIGFuZCBhbHdheXMgc3RhcnRpbmcgd2l0aCB3aXRoIGEgc2xhc2gKICAgICAgIC0gYWxsIGVsZW1lbnRzIG9mIGEgZGV2cGF0aCBtdXN0IGJlIHJlYWwgZGlyZWN0b3JpZXMuIFN5bWxpbmtzCiAgICAgICAgIHBvaW50aW5nIHRvIC9zeXMvZGV2aWNlcyBtdXN0IGFsd2F5cyBiZSByZXNvbHZlZCB0byB0aGVpciByZWFsCi0gICAgICAgIHRhcmdldCwgYW5kIHRoZSB0YXJnZXQgcGF0aCBtdXN0IGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBkZXZpY2UuCisgICAgICAgIHRhcmdldCBhbmQgdGhlIHRhcmdldCBwYXRoIG11c3QgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGRldmljZS4KICAgICAgICAgVGhhdCB3YXkgdGhlIGRldnBhdGggdG8gdGhlIGRldmljZSBtYXRjaGVzIHRoZSBkZXZwYXRoIG9mIHRoZQogICAgICAgICBrZXJuZWwgdXNlZCBhdCBldmVudCB0aW1lLgogICAgICAgLSB1c2luZyBvciBleHBvc2luZyBzeW1saW5rIHZhbHVlcyBhcyBlbGVtZW50cyBpbiBhIGRldnBhdGggc3RyaW5nCkBAIC03MywxNyArNzIsMTcgQEAKICAgICAgICAgbGluawogICAgICAgLSBpdCBpcyByZXRyaWV2ZWQgYnkgcmVhZGluZyB0aGUgImRyaXZlciItbGluayBhbmQgdXNpbmcgb25seSB0aGUKICAgICAgICAgbGFzdCBlbGVtZW50IG9mIHRoZSB0YXJnZXQgcGF0aAotICAgICAgLSBkZXZpY2VzIHdoaWNoIGRvIG5vdCBoYXZlICJkcml2ZXIiLWxpbmssIGp1c3QgZG8gbm90IGhhdmUgYQotICAgICAgICBkcml2ZXI7IGNvcHlpbmcgdGhlIGRyaXZlciB2YWx1ZSBpbiBhIGNoaWxkIGRldmljZSBjb250ZXh0LCBpcyBhCisgICAgICAtIGRldmljZXMgd2hpY2ggZG8gbm90IGhhdmUgImRyaXZlciItbGluayBqdXN0IGRvIG5vdCBoYXZlIGEKKyAgICAgICAgZHJpdmVyOyBjb3B5aW5nIHRoZSBkcml2ZXIgdmFsdWUgaW4gYSBjaGlsZCBkZXZpY2UgY29udGV4dCBpcyBhCiAgICAgICAgIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24KIAogICAgIG8gYXR0cmlidXRlcwotICAgICAgLSB0aGUgZmlsZXMgaW4gdGhlIGRldmljZSBkaXJlY3Rvcnkgb3IgZmlsZXMgYmVsb3cgYSBzdWJkaXJlY3RvcmllcworICAgICAgLSB0aGUgZmlsZXMgaW4gdGhlIGRldmljZSBkaXJlY3Rvcnkgb3IgZmlsZXMgYmVsb3cgc3ViZGlyZWN0b3JpZXMKICAgICAgICAgb2YgdGhlIHNhbWUgZGV2aWNlIGRpcmVjdG9yeQogICAgICAgLSBhY2Nlc3NpbmcgYXR0cmlidXRlcyByZWFjaGVkIGJ5IGEgc3ltbGluayBwb2ludGluZyB0byBhbm90aGVyIGRldmljZSwKICAgICAgICAgbGlrZSB0aGUgImRldmljZSItbGluaywgaXMgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uCiAKLSAgRXZlcnl0aGluZyBlbHNlIGlzIGp1c3QgYSBrZXJuZWwgZHJpdmVyLWNvcmUgaW1wbGVtZW50YXRpb24gZGV0YWlsLAorICBFdmVyeXRoaW5nIGVsc2UgaXMganVzdCBhIGtlcm5lbCBkcml2ZXItY29yZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwKICAgdGhhdCBzaG91bGQgbm90IGJlIGFzc3VtZWQgdG8gYmUgc3RhYmxlIGFjcm9zcyBrZXJuZWwgcmVsZWFzZXMuCiAKIC0gUHJvcGVydGllcyBvZiBwYXJlbnQgZGV2aWNlcyBuZXZlciBiZWxvbmcgaW50byBhIGNoaWxkIGRldmljZS4KQEAgLTkxLDI1ICs5MCwyNSBAQAogICBjb250ZXh0IHByb3BlcnRpZXMuIElmIHRoZSBkZXZpY2UgJ2V0aDAnIG9yICdzZGEnIGRvZXMgbm90IGhhdmUgYQogICAiZHJpdmVyIi1saW5rLCB0aGVuIHRoaXMgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBkcml2ZXIuIEl0cyB2YWx1ZSBpcyBlbXB0eS4KICAgTmV2ZXIgY29weSBhbnkgcHJvcGVydHkgb2YgdGhlIHBhcmVudC1kZXZpY2UgaW50byBhIGNoaWxkLWRldmljZS4gUGFyZW50Ci0gIGRldmljZS1wcm9wZXJ0aWVzIG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgd2l0aG91dCBhbnkgbm90aWNlIHRvIHRoZQorICBkZXZpY2UgcHJvcGVydGllcyBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhvdXQgYW55IG5vdGljZSB0byB0aGUKICAgY2hpbGQgZGV2aWNlLgogCi0tIEhpZXJhcmNoeSBpbiBhIHNpbmdsZSBkZXZpY2UtdHJlZQorLSBIaWVyYXJjaHkgaW4gYSBzaW5nbGUgZGV2aWNlIHRyZWUKICAgVGhlcmUgaXMgb25seSBvbmUgdmFsaWQgcGxhY2UgaW4gc3lzZnMgd2hlcmUgaGllcmFyY2h5IGNhbiBiZSBleGFtaW5lZAogICBhbmQgdGhpcyBpcyBiZWxvdzogL3N5cy9kZXZpY2VzLgotICBJdCBpcyBwbGFubmVkLCB0aGF0IGFsbCBkZXZpY2UgZGlyZWN0b3JpZXMgd2lsbCBlbmQgdXAgaW4gdGhlIHRyZWUKKyAgSXQgaXMgcGxhbm5lZCB0aGF0IGFsbCBkZXZpY2UgZGlyZWN0b3JpZXMgd2lsbCBlbmQgdXAgaW4gdGhlIHRyZWUKICAgYmVsb3cgdGhpcyBkaXJlY3RvcnkuCiAKIC0gQ2xhc3NpZmljYXRpb24gYnkgc3Vic3lzdGVtCiAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgcGxhY2VzIGZvciBjbGFzc2lmaWNhdGlvbiBvZiBkZXZpY2VzOgogICAvc3lzL2Jsb2NrLCAvc3lzL2NsYXNzIGFuZCAvc3lzL2J1cy4gSXQgaXMgcGxhbm5lZCB0aGF0IHRoZXNlIHdpbGwKLSAgbm90IGNvbnRhaW4gYW55IGRldmljZS1kaXJlY3RvcmllcyB0aGVtc2VsdmVzLCBidXQgb25seSBmbGF0IGxpc3RzIG9mCisgIG5vdCBjb250YWluIGFueSBkZXZpY2UgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcywgYnV0IG9ubHkgZmxhdCBsaXN0cyBvZgogICBzeW1saW5rcyBwb2ludGluZyB0byB0aGUgdW5pZmllZCAvc3lzL2RldmljZXMgdHJlZS4KICAgQWxsIHRocmVlIHBsYWNlcyBoYXZlIGNvbXBsZXRlbHkgZGlmZmVyZW50IHJ1bGVzIG9uIGhvdyB0byBhY2Nlc3MKICAgZGV2aWNlIGluZm9ybWF0aW9uLiBJdCBpcyBwbGFubmVkIHRvIG1lcmdlIGFsbCB0aHJlZQotICBjbGFzc2lmaWNhdGlvbi1kaXJlY3RvcmllcyBpbnRvIG9uZSBwbGFjZSBhdCAvc3lzL3N1YnN5c3RlbSwKLSAgZm9sbG93aW5nIHRoZSBsYXlvdXQgb2YgdGhlIGJ1cy1kaXJlY3Rvcmllcy4gQWxsIGJ1c2VzIGFuZAotICBjbGFzc2VzLCBpbmNsdWRpbmcgdGhlIGNvbnZlcnRlZCBibG9jay1zdWJzeXN0ZW0sIHdpbGwgc2hvdyB1cAorICBjbGFzc2lmaWNhdGlvbiBkaXJlY3RvcmllcyBpbnRvIG9uZSBwbGFjZSBhdCAvc3lzL3N1YnN5c3RlbSwKKyAgZm9sbG93aW5nIHRoZSBsYXlvdXQgb2YgdGhlIGJ1cyBkaXJlY3Rvcmllcy4gQWxsIGJ1c2VzIGFuZAorICBjbGFzc2VzLCBpbmNsdWRpbmcgdGhlIGNvbnZlcnRlZCBibG9jayBzdWJzeXN0ZW0sIHdpbGwgc2hvdyB1cAogICB0aGVyZS4KICAgVGhlIGRldmljZXMgYmVsb25naW5nIHRvIGEgc3Vic3lzdGVtIHdpbGwgY3JlYXRlIGEgc3ltbGluayBpbiB0aGUKICAgImRldmljZXMiIGRpcmVjdG9yeSBhdCAvc3lzL3N1YnN5c3RlbS88bmFtZT4vZGV2aWNlcy4KQEAgLTEyMSwzOCArMTIwLDM4IEBACiAgIHN1YnN5c3RlbSBuYW1lLgogCiAgIEFzc3VtaW5nIC9zeXMvY2xhc3MvPHN1YnN5c3RlbT4gYW5kIC9zeXMvYnVzLzxzdWJzeXN0ZW0+LCBvcgotICAvc3lzL2Jsb2NrIGFuZCAvc3lzL2NsYXNzL2Jsb2NrIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlLCBpcyBhIGJ1ZyBpbgorICAvc3lzL2Jsb2NrIGFuZCAvc3lzL2NsYXNzL2Jsb2NrIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlIGlzIGEgYnVnIGluCiAgIHRoZSBhcHBsaWNhdGlvbi4KIAogLSBCbG9jawotICBUaGUgY29udmVydGVkIGJsb2NrLXN1YnN5c3RlbSBhdCAvc3lzL2NsYXNzL2Jsb2NrLCBvcgorICBUaGUgY29udmVydGVkIGJsb2NrIHN1YnN5c3RlbSBhdCAvc3lzL2NsYXNzL2Jsb2NrIG9yCiAgIC9zeXMvc3Vic3lzdGVtL2Jsb2NrIHdpbGwgY29udGFpbiB0aGUgbGlua3MgZm9yIGRpc2tzIGFuZCBwYXJ0aXRpb25zCi0gIGF0IHRoZSBzYW1lIGxldmVsLCBuZXZlciBpbiBhIGhpZXJhcmNoeS4gQXNzdW1pbmcgdGhlIGJsb2NrLXN1YnN5dGVtIHRvCi0gIGNvbnRhaW4gb25seSBkaXNrcyBhbmQgbm90IHBhcnRpdGlvbi1kZXZpY2VzIGluIHRoZSBzYW1lIGZsYXQgbGlzdCBpcworICBhdCB0aGUgc2FtZSBsZXZlbCwgbmV2ZXIgaW4gYSBoaWVyYXJjaHkuIEFzc3VtaW5nIHRoZSBibG9jayBzdWJzeXRlbSB0bworICBjb250YWluIG9ubHkgZGlza3MgYW5kIG5vdCBwYXJ0aXRpb24gZGV2aWNlcyBpbiB0aGUgc2FtZSBmbGF0IGxpc3QgaXMKICAgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uLgogCiAtICJkZXZpY2UiLWxpbmsgYW5kIDxzdWJzeXN0ZW0+OjxrZXJuZWwgbmFtZT4tbGlua3MKICAgTmV2ZXIgZGVwZW5kIG9uIHRoZSAiZGV2aWNlIi1saW5rLiBUaGUgImRldmljZSItbGluayBpcyBhIHdvcmthcm91bmQKLSAgZm9yIHRoZSBvbGQgbGF5b3V0LCB3aGVyZSBjbGFzcy1kZXZpY2VzIGFyZSBub3QgY3JlYXRlZCBpbgotICAvc3lzL2RldmljZXMvIGxpa2UgdGhlIGJ1cy1kZXZpY2VzLiBJZiB0aGUgbGluay1yZXNvbHZpbmcgb2YgYQotICBkZXZpY2UtZGlyZWN0b3J5IGRvZXMgbm90IGVuZCBpbiAvc3lzL2RldmljZXMvLCB5b3UgY2FuIHVzZSB0aGUKKyAgZm9yIHRoZSBvbGQgbGF5b3V0LCB3aGVyZSBjbGFzcyBkZXZpY2VzIGFyZSBub3QgY3JlYXRlZCBpbgorICAvc3lzL2RldmljZXMvIGxpa2UgdGhlIGJ1cyBkZXZpY2VzLiBJZiB0aGUgbGluay1yZXNvbHZpbmcgb2YgYQorICBkZXZpY2UgZGlyZWN0b3J5IGRvZXMgbm90IGVuZCBpbiAvc3lzL2RldmljZXMvLCB5b3UgY2FuIHVzZSB0aGUKICAgImRldmljZSItbGluayB0byBmaW5kIHRoZSBwYXJlbnQgZGV2aWNlcyBpbiAvc3lzL2RldmljZXMvLiBUaGF0IGlzIHRoZQotICBzaW5nbGUgdmFsaWQgdXNlIG9mIHRoZSAiZGV2aWNlIi1saW5rLCBpdCBtdXN0IG5ldmVyIGFwcGVhciBpbiBhbnkKKyAgc2luZ2xlIHZhbGlkIHVzZSBvZiB0aGUgImRldmljZSItbGluazsgaXQgbXVzdCBuZXZlciBhcHBlYXIgaW4gYW55CiAgIHBhdGggYXMgYW4gZWxlbWVudC4gQXNzdW1pbmcgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgImRldmljZSItbGluayBmb3IKICAgYSBkZXZpY2UgaW4gL3N5cy9kZXZpY2VzLyBpcyBhIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24uCiAgIEFjY2Vzc2luZyAvc3lzL2NsYXNzL25ldC9ldGgwL2RldmljZSBpcyBhIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24uCiAKICAgTmV2ZXIgZGVwZW5kIG9uIHRoZSBjbGFzcy1zcGVjaWZpYyBsaW5rcyBiYWNrIHRvIHRoZSAvc3lzL2NsYXNzCiAgIGRpcmVjdG9yeS4gIFRoZXNlIGxpbmtzIGFyZSBhbHNvIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGRlc2lnbiBtaXN0YWtlCi0gIHRoYXQgY2xhc3MtZGV2aWNlcyBhcmUgbm90IGNyZWF0ZWQgaW4gL3N5cy9kZXZpY2VzLiBJZiBhIGRldmljZQorICB0aGF0IGNsYXNzIGRldmljZXMgYXJlIG5vdCBjcmVhdGVkIGluIC9zeXMvZGV2aWNlcy4gSWYgYSBkZXZpY2UKICAgZGlyZWN0b3J5IGRvZXMgbm90IGNvbnRhaW4gZGlyZWN0b3JpZXMgZm9yIGNoaWxkIGRldmljZXMsIHRoZXNlIGxpbmtzCiAgIG1heSBiZSB1c2VkIHRvIGZpbmQgdGhlIGNoaWxkIGRldmljZXMgaW4gL3N5cy9jbGFzcy4gVGhhdCBpcyB0aGUgc2luZ2xlCi0gIHZhbGlkIHVzZSBvZiB0aGVzZSBsaW5rcywgdGhleSBtdXN0IG5ldmVyIGFwcGVhciBpbiBhbnkgcGF0aCBhcyBhbgorICB2YWxpZCB1c2Ugb2YgdGhlc2UgbGlua3M7IHRoZXkgbXVzdCBuZXZlciBhcHBlYXIgaW4gYW55IHBhdGggYXMgYW4KICAgZWxlbWVudC4gQXNzdW1pbmcgdGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBsaW5rcyBmb3IgZGV2aWNlcyB3aGljaCBhcmUKLSAgcmVhbCBjaGlsZCBkZXZpY2UgZGlyZWN0b3JpZXMgaW4gdGhlIC9zeXMvZGV2aWNlcyB0cmVlLCBpcyBhIGJ1ZyBpbgorICByZWFsIGNoaWxkIGRldmljZSBkaXJlY3RvcmllcyBpbiB0aGUgL3N5cy9kZXZpY2VzIHRyZWUgaXMgYSBidWcgaW4KICAgdGhlIGFwcGxpY2F0aW9uLgogCi0gIEl0IGlzIHBsYW5uZWQgdG8gcmVtb3ZlIGFsbCB0aGVzZSBsaW5rcyB3aGVuIHdoZW4gYWxsIGNsYXNzLWRldmljZQorICBJdCBpcyBwbGFubmVkIHRvIHJlbW92ZSBhbGwgdGhlc2UgbGlua3Mgd2hlbiBhbGwgY2xhc3MgZGV2aWNlCiAgIGRpcmVjdG9yaWVzIGxpdmUgaW4gL3N5cy9kZXZpY2VzLgogCiAtIFBvc2l0aW9uIG9mIGRldmljZXMgYWxvbmcgZGV2aWNlIGNoYWluIGNhbiBjaGFuZ2UuCkBAIC0xNjEsNiArMTYwLDUgQEAKICAgdGhlIGNoYWluLiBZb3UgbXVzdCBhbHdheXMgcmVxdWVzdCB0aGUgcGFyZW50IGRldmljZSB5b3UgYXJlIGxvb2tpbmcgZm9yCiAgIGJ5IGl0cyBzdWJzeXN0ZW0gdmFsdWUuIFlvdSBuZWVkIHRvIHdhbGsgdXAgdGhlIGNoYWluIHVudGlsIHlvdSBmaW5kCiAgIHRoZSBkZXZpY2UgdGhhdCBtYXRjaGVzIHRoZSBleHBlY3RlZCBzdWJzeXN0ZW0uIERlcGVuZGluZyBvbiBhIHNwZWNpZmljCi0gIHBvc2l0aW9uIG9mIGEgcGFyZW50IGRldmljZSwgb3IgZXhwb3NpbmcgcmVsYXRpdmUgcGF0aHMsIHVzaW5nICIuLi8iIHRvCi0gIGFjY2VzcyB0aGUgY2hhaW4gb2YgcGFyZW50cywgaXMgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uLgotCisgIHBvc2l0aW9uIG9mIGEgcGFyZW50IGRldmljZSBvciBleHBvc2luZyByZWxhdGl2ZSBwYXRocyB1c2luZyAiLi4vIiB0bworICBhY2Nlc3MgdGhlIGNoYWluIG9mIHBhcmVudHMgaXMgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAwMWYyMjJlLi41Yzc4NGJlIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMzMzOSw2ICszMzM5LDE0IEBACiBXOglodHRwOi8vd3d3LndpbmlzY2hob2Zlci5hdC9saW51eHNpc3VzYnZnYS5zaHRtbAogUzoJTWFpbnRhaW5lZAogCitTTEFCIEFMTE9DQVRPUgorUDoJQ2hyaXN0b3BoIExhbWV0ZXIKK006CWNsYW1ldGVyQHNnaS5jb20KK1A6CVBla2thIEVuYmVyZworTToJcGVuYmVyZ0Bjcy5oZWxzaW5raS5maQorTDoJbGludXgtbW1Aa3ZhY2sub3JnCitTOglNYWludGFpbmVkCisKIFNNQzkxeCBFVEhFUk5FVCBEUklWRVIKIFA6CU5pY29sYXMgUGl0cmUKIE06CW5pY29AY2FtLm9yZwpAQCAtMzY2NiwxMSArMzY3NCw5IEBACiBTOglNYWludGFpbmVkCiAKIFRVTElQIE5FVFdPUksgRFJJVkVSCi1QOglWYWxlcmllIEhlbnNvbgotTToJdmFsQG5tdC5lZHUKIEw6CXR1bGlwLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogCiBUVU4vVEFQIGRyaXZlcgogUDoJTWF4aW0gS3Jhc255YW5za3kKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggMjNmODFjOS4uZGZlM2QxNiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTI5OSw3ICsyOTksNyBAQAogTU9ERkxBR1MJPSAtRE1PRFVMRQogQ0ZMQUdTX01PRFVMRSAgID0gJChNT0RGTEFHUykKIEFGTEFHU19NT0RVTEUgICA9ICQoTU9ERkxBR1MpCi1MREZMQUdTX01PRFVMRSAgPSAtcgorTERGTEFHU19NT0RVTEUgID0KIENGTEFHU19LRVJORUwJPQogQUZMQUdTX0tFUk5FTAk9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2hlYWQuUyBiL2FyY2gvYWxwaGEva2VybmVsL2hlYWQuUwppbmRleCBlMjdkMjNjLi43YWMxZjEzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvaGVhZC5TCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCisuc2VjdGlvbiAudGV4dC5oZWFkLCAiYXgiCiAuZ2xvYmwgc3dhcHBlcl9wZ19kaXIKIC5nbG9ibCBfc3RleHQKIHN3YXBwZXJfcGdfZGlyPVNXQVBQRVJfUEdECmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IGFiNjQyYTQuLjlkYzFjZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLWNoYXIgKiBfX2luaXQKK2NoYXIgKiBfX2RldmluaXQKIHBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQogewogCXJldHVybiBzdHI7CkBAIC0yMDQsNyArMjA0LDcgQEAKICNpZmRlZiBBTFBIQV9SRVNUT1JFX1NSTV9TRVRVUAogc3RhdGljIHN0cnVjdCBwZGV2X3NybV9zYXZlZF9jb25mICpzcm1fc2F2ZWRfY29uZmlnczsKIAotdm9pZCBfX2luaXQKK3ZvaWQgX19kZXZpbml0CiBwZGV2X3NhdmVfc3JtX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwZGV2X3NybV9zYXZlZF9jb25mICp0bXA7CkBAIC0yNDcsMTQgKzI0NywxNCBAQAogfQogI2VuZGlmCiAKLXZvaWQgX19pbml0Cit2b2lkIF9fZGV2aW5pdAogcGNpYmlvc19maXh1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHJlc291cmNlICpyb290KQogewogCXJlcy0+c3RhcnQgKz0gcm9vdC0+c3RhcnQ7CiAJcmVzLT5lbmQgKz0gcm9vdC0+c3RhcnQ7CiB9CiAKLXZvaWQgX19pbml0Cit2b2lkIF9fZGV2aW5pdAogcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJLyogVXBkYXRlIGRldmljZSByZXNvdXJjZXMuICAqLwpAQCAtMjczLDcgKzI3Myw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdAordm9pZCBfX2RldmluaXQKIHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJLyogUHJvcGFnYXRlIGhvc2UgaW5mbyBpbnRvIHRoZSBzdWJvcmRpbmF0ZSBkZXZpY2VzLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pb21tdS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2lvbW11LmMKaW5kZXggNmIwN2Y4OS4uZTFjNDcwNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2lvbW11LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2lvbW11LmMKQEAgLTU4LDcgKzU4LDcgQEAKIAlyZXR1cm4gbWF4OwogfQogDAotc3RydWN0IHBjaV9pb21tdV9hcmVuYSAqCitzdHJ1Y3QgcGNpX2lvbW11X2FyZW5hICogX19pbml0CiBpb21tdV9hcmVuYV9uZXdfbm9kZShpbnQgbmlkLCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGRtYV9hZGRyX3QgYmFzZSwKIAkJICAgICB1bnNpZ25lZCBsb25nIHdpbmRvd19zaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQogewpAQCAtMTE3LDcgKzExNyw3IEBACiAJcmV0dXJuIGFyZW5hOwogfQogCi1zdHJ1Y3QgcGNpX2lvbW11X2FyZW5hICoKK3N0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKiBfX2luaXQKIGlvbW11X2FyZW5hX25ldyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGRtYV9hZGRyX3QgYmFzZSwKIAkJdW5zaWduZWQgbG9uZyB3aW5kb3dfc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKaW5kZXggYjI4NzMxNC4uYWQxNzY0NCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzU4LDcgKzM1OSw3IEBACiAvKgogICogQnJpbmcgb25lIGNwdSBvbmxpbmUuCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0CitzdGF0aWMgaW50IF9fY3B1aW5pdAogc21wX2Jvb3Rfb25lX2NwdShpbnQgY3B1aWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOwpAQCAtNDg3LDcgKzQ4OCw3IEBACiB7CiB9CiAKLWludCBfX2RldmluaXQKK2ludCBfX2NwdWluaXQKIF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc21wX2Jvb3Rfb25lX2NwdShjcHUpOwpAQCAtNTQxLDcgKzU0Miw3IEBACiAJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIH0KIAotaW50IF9faW5pdAoraW50CiBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9hbHBoYS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBmZTEzZGFhLi43YWYwN2QzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE1LDYgKzE1LDcgQEAKIAogICBfdGV4dCA9IC47CQkJCQkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwogICAudGV4dCA6IHsgCisJKigudGV4dC5oZWFkKQogCVRFWFRfVEVYVAogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDg1MDE2MzEuLmM4NTY5ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMzQxLDYgKzM0MSw3IEBACiAJc2VsZWN0IEFSQ0hfTVREX1hJUAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgR0VORVJJQ19USU1FCisJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJbnRlbCdzIFBYQTJYWCBwcm9jZXNzb3IgbGluZS4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwppbmRleCA1YmUyZTk4Li40ZGU0MzJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IDFiNzZkODcuLmVhZmJiMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC02MzAsNyArNjMxLDcgQEAKIC8qCiAgKiBub3Qgc3VwcG9ydGVkIGhlcmUKICAqLwotaW50IF9faW5pdCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCitpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQogewogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwppbmRleCBmMjExNGJjLi44YWQ0NzYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwpAQCAtMzUyLDEwICszNTIsOCBAQAogCiBhc21saW5rYWdlIHZvaWQgZG9fdW5leHBfZmlxIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZm5kZWYgQ09ORklHX0lHTk9SRV9GSVEKIAlwcmludGsoIkhtbS4gIFVuZXhwZWN0ZWQgRklRIHJlY2VpdmVkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKIAlwcmludGsoIllvdSBtYXkgaGF2ZSBhIGhhcmR3YXJlIHByb2JsZW0uLi5cbiIpOwotI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKaW5kZXggNjQwNjdjZC4uNTJhYzM3ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBIUCBKb3JuYWRhNzIwIGluaXQgY29kZQogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBLcmlzdG9mZmVyIEVyaWNzb24gPEtyaXN0b2ZmZXIuRXJpY3NvbkBnbWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRmlsaXAgWnl6bmlld3NraSA8ZmlsaXAuenl6bmlld3NraUB0ZWZuZXQucGw+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hhZWwgR2Vybm90aCA8bWljaGFlbEBnZXJub3RoLm5ldD4KICAqCkBAIC0yMjAsMTQgKzIyMSwxNiBAQAogCS5yZXNvdXJjZQk9IHNhMTExMV9yZXNvdXJjZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBqb3JuYWRhNzIwX21jdV9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImpvcm5hZGE3MjBfbWN1IiwKLQkuaWQJCT0gLTEsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBqb3JuYWRhX3NzcF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImpvcm5hZGFfc3NwIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc2ExMTExX2RldmljZSwKLQkmam9ybmFkYTcyMF9tY3VfZGV2aWNlLAorI2lmZGVmIENPTkZJR19TQTExMDBfSk9STkFEQTcyMF9TU1AKKwkmam9ybmFkYV9zc3BfZGV2aWNlLAorI2VuZGlmCiAJJnMxZDEzeHh4ZmJfZGV2aWNlLAogfTsKIApAQCAtMjM2LDE5ICsyMzksMTkgQEAKIAlpbnQgcmV0ID0gLUVOT0RFVjsKIAogCWlmIChtYWNoaW5lX2lzX2pvcm5hZGE3MjAoKSkgewotCQlHUERSIHw9IEdQSU9fR1BJTzIwOwotCQkvKiBvc2NpbGxhdG9yIHNldHVwIChsaW5lIDExNiBvZiBIUCdzIGRvYykgKi8KKwkJLyogd2Ugd2FudCB0byB1c2UgZ3BpbzIwIGFzIGlucHV0IHRvIGRyaXZlIHRoZSBjbG9jayBvZiBvdXIgdWFydCAzICovCisJCUdQRFIgfD0gR1BJT19HUElPMjA7CS8qIENsZWFyIGdwaW8yMCBwaW4gYXMgaW5wdXQgKi8KIAkJVFVDUiA9IFRVQ1JfVkFMOwotCQkvKiByZXNldHRpbmcgU0ExMTExIChsaW5lIDExOCBvZiBIUCdzIGRvYykgKi8KLQkJR1BTUiA9IEdQSU9fR1BJTzIwOworCQlHUFNSID0gR1BJT19HUElPMjA7CS8qIHN0YXJ0IGdwaW8yMCBwaW4gKi8KIAkJdWRlbGF5KDEpOwotCQlHUENSID0gR1BJT19HUElPMjA7CisJCUdQQ1IgPSBHUElPX0dQSU8yMDsJLyogc3RvcCBncGlvMjAgKi8KIAkJdWRlbGF5KDEpOwotCQlHUFNSID0gR1BJT19HUElPMjA7Ci0JCXVkZWxheSgyMCk7CisJCUdQU1IgPSBHUElPX0dQSU8yMDsJLyogcmVzdGFydCBncGlvMjAgKi8KKwkJdWRlbGF5KDIwKTsJCS8qIGdpdmUgaXQgc29tZSB0aW1lIHRvIHJlc3RhcnQgKi8KIAogCQlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNDUsNyArMzQ4LDcgQEAKIH0KIAogTUFDSElORV9TVEFSVChKT1JOQURBNzIwLCAiSFAgSm9ybmFkYSA3MjAiKQotCS8qIE1haW50YWluZXI6IE1pY2hhZWwgR2Vybm90aCA8bWljaGFlbEBnZXJub3RoLm5ldD4gKi8KKwkvKiBNYWludGFpbmVyOiBLcmlzdG9mZmVyIEVyaWNzb24gPEtyaXN0b2ZmZXIuRXJpY3NvbkBnbWFpbC5jb20+ICovCiAJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwX3NzcC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMF9zc3AuYwppbmRleCAwYTQ1ZTFhLi4zOTVjMzliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwX3NzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjBfc3NwLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCXJldCA9IGpvcm5hZGFfc3NwX2lub3V0KEdFVEJSSUdIVE5FU1MpOwogCiAJLyogc2VlbXMgbGlrZSBpdCB3b3JrZWQsIGp1c3QgZmVlZCBpdCB3aXRoIFR4RHVtbXkgdG8gZ2V0IHJpZCBvZiBkYXRhICovCi0JaWYgKHJldCA9PSBUeER1bW15KQorCWlmIChyZXQgPT0gVFhEVU1NWSkKIAkJam9ybmFkYV9zc3BfaW5vdXQoVFhEVU1NWSk7CiAKIAlqb3JuYWRhX3NzcF9lbmQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jCmluZGV4IGRlN2U2ZWYuLjAzNjBiMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21haWxib3guYwpAQCAtMTYxLDExICsxNjEsMTEgQEAKIC8qCiAgKiBNYWlsYm94IGludGVycnVwdCBoYW5kbGVyCiAgKi8KLXN0YXRpYyB2b2lkIG1ib3hfdHhxX2ZuKHJlcXVlc3RfcXVldWVfdCAqIHEpCitzdGF0aWMgdm9pZCBtYm94X3R4cV9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCiB7CiB9CiAKLXN0YXRpYyB2b2lkIG1ib3hfcnhxX2ZuKHJlcXVlc3RfcXVldWVfdCAqIHEpCitzdGF0aWMgdm9pZCBtYm94X3J4cV9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCiB7CiB9CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogewogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAltYm94X21zZ190IG1zZzsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBtYm94LT5yeHEtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbWJveC0+cnhxLT5xdWV1ZTsKIAogCWRpc2FibGVfbWJveF9pcnEobWJveCwgSVJRX1JYKTsKIApAQCAtMjk3LDcgKzI5Nyw3IEBACiAJCQkJCXJlcXVlc3RfZm5fcHJvYyAqIHByb2MsCiAJCQkJCXZvaWQgKCp3b3JrKSAoc3RydWN0IHdvcmtfc3RydWN0ICopKQogewotCXJlcXVlc3RfcXVldWVfdCAqcTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAlzdHJ1Y3Qgb21hcF9tYm94X3F1ZXVlICptcTsKIAogCW1xID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfbWJveF9xdWV1ZSksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKaW5kZXggMWI3NTY3Mi4uMjA4NDE2NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw4IEBACiBtYWNoaW5lLSQoQ09ORklHX0JGNTM0KSA6PSBiZjUzNwogbWFjaGluZS0kKENPTkZJR19CRjUzNikgOj0gYmY1MzcKIG1hY2hpbmUtJChDT05GSUdfQkY1MzcpIDo9IGJmNTM3CittYWNoaW5lLSQoQ09ORklHX0JGNTQyKSA6PSBiZjU0OAorbWFjaGluZS0kKENPTkZJR19CRjU0NCkgOj0gYmY1NDgKIG1hY2hpbmUtJChDT05GSUdfQkY1NDgpIDo9IGJmNTQ4CiBtYWNoaW5lLSQoQ09ORklHX0JGNTQ5KSA6PSBiZjU0OAogbWFjaGluZS0kKENPTkZJR19CRjU2MSkgOj0gYmY1NjEKQEAgLTM2LDYgKzM4LDggQEAKIGNwdS0kKENPTkZJR19CRjUzNCkgOj0gYmY1MzQKIGNwdS0kKENPTkZJR19CRjUzNikgOj0gYmY1MzYKIGNwdS0kKENPTkZJR19CRjUzNykgOj0gYmY1MzcKK2NwdS0kKENPTkZJR19CRjU0MikgOj0gYmY1NDIKK2NwdS0kKENPTkZJR19CRjU0NCkgOj0gYmY1NDQKIGNwdS0kKENPTkZJR19CRjU0OCkgOj0gYmY1NDgKIGNwdS0kKENPTkZJR19CRjU0OSkgOj0gYmY1NDkKIGNwdS0kKENPTkZJR19CRjU2MSkgOj0gYmY1NjEKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2RtYS1tYXBwaW5nLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9kbWEtbWFwcGluZy5jCmluZGV4IGVhNDhkNWIxLi45NGQ3YjExIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2RtYS1tYXBwaW5nLmMKQEAgLTE2MCw3ICsxNjAsOCBAQAogCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOwogCiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKLQkJc2ctPmRtYV9hZGRyZXNzID0gcGFnZV9hZGRyZXNzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQ7CisJCXNnLT5kbWFfYWRkcmVzcyA9IChkbWFfYWRkcl90KShwYWdlX2FkZHJlc3Moc2ctPnBhZ2UpICsKKwkJCQkJc2ctPm9mZnNldCk7CiAKIAkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2Uoc2dfZG1hX2FkZHJlc3Moc2cpLAogCQkJCQlzZ19kbWFfYWRkcmVzcyhzZykgKwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKaW5kZXggZjU5ZGNlZS4uODhmMjIxYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCkBAIC00MDIsMTEgKzQwMiw3IEBACiAJaWYgKGwxX2xlbmd0aCA+IEwxX0RBVEFfQV9MRU5HVEgpCiAJCXBhbmljKCJMMSBkYXRhIG1lbW9yeSBvdmVyZmxvd1xuIik7CiAKLSNpZmRlZiBCRjU2MV9GQU1JTFkKLQlfYmZpbl9zd3JzdCA9IGJmaW5fcmVhZF9TSUNBX1NXUlNUKCk7Ci0jZWxzZQogCV9iZmluX3N3cnN0ID0gYmZpbl9yZWFkX1NXUlNUKCk7Ci0jZW5kaWYKIAogCS8qIENvcHkgYXRvbWljIHNlcXVlbmNlcyB0byB0aGVpciBmaXhlZCBsb2NhdGlvbiwgYW5kIHNhbml0eSBjaGVjayB0aGF0CiAJICAgdGhlc2UgbG9jYXRpb25zIGFyZSB0aGUgb25lcyB0aGF0IHdlIGFkdmVydGlzZSB0byB1c2Vyc3BhY2UuICAqLwpAQCAtNDI5LDYgKzQyNSw3IEBACiAJQlVHX09OKChjaGFyICopJmF0b21pY194b3IzMiAtIChjaGFyICopJmZpeGVkX2NvZGVfc3RhcnQKIAkgICAgICAgIT0gQVRPTUlDX1hPUjMyIC0gRklYRURfQ09ERV9TVEFSVCk7CiAKKwlpbml0X2V4Y2VwdGlvbl92ZWN0b3JzKCk7CiAJYmY1M3hfY2FjaGVfaW5pdCgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYwppbmRleCAzOTA5ZjViLi44NzY2YmQ2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogI2lmZGVmIENPTkZJR19LR0RCCiAjIGRlZmluZSBDSEtfREVCVUdHRVJfVFJBUCgpIFwKIAlkbyB7IFwKLQkJQ0hLX0RFQlVHR0VSKHRyYXBuciwgc2lnLCBpbmZvLnNpX2NvZGUsIGZwKTsgXAorCQlDSEtfREVCVUdHRVIodHJhcG5yLCBzaWcsIGluZm8uc2lfY29kZSwgZnAsICk7IFwKIAl9IHdoaWxlICgwKQogIyBkZWZpbmUgQ0hLX0RFQlVHR0VSX1RSQVBfTUFZQkUoKSBcCiAJZG8geyBcCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBkMDZmODYwLi5mYjUzNzgwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgogI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAogT1VUUFVUX0ZPUk1BVCgiZWxmMzItYmZpbiIpCiBFTlRSWShfX3N0YXJ0KQpAQCAtNjQsOCArNjUsMTIgQEAKIAogCS5kYXRhIDoKIAl7Ci0JCS4gPSBBTElHTihQQUdFX1NJWkUpOworCQkvKiBtYWtlIHN1cmUgdGhlIGluaXRfdGFzayBpcyBhbGlnbmVkIHRvIHRoZQorCQkgKiBrZXJuZWwgdGhyZWFkIHNpemUgc28gd2UgY2FuIGxvY2F0ZSB0aGUga2VybmVsCisJCSAqIHN0YWNrIHByb3Blcmx5IGFuZCBxdWlja2x5LgorCQkgKi8KIAkJX19zZGF0YSA9IC47CisJCS4gPSBBTElHTihUSFJFQURfU0laRSk7CiAJCSooLmRhdGEuaW5pdF90YXNrKQogCQlEQVRBX0RBVEEKIAkJQ09OU1RSVUNUT1JTCkBAIC03MywxNCArNzgsMTQgQEAKIAkJLiA9IEFMSUdOKDMyKTsKIAkJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKIAotCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkJLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsKIAkJX19lZGF0YSA9IC47CiAJfQogCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJX19faW5pdF9iZWdpbiA9IC47CiAJLmluaXQgOgogCXsKKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJCV9fc2luaXR0ZXh0ID0gLjsKIAkJKiguaW5pdC50ZXh0KQogCQlfX2Vpbml0dGV4dCA9IC47CkBAIC0xNTMsMTAgKzE1OCw5IEBACiAJCV9fZWJzc19iX2wxID0gLjsKIAl9CiAKLQkuID0gTE9BREFERFIoLmRhdGFfYl9sMSkgKyBTSVpFT0YoLmRhdGFfYl9sMSk7Ci0JX19faW5pdF9lbmQgPSBBTElHTihQQUdFX1NJWkUpOworCV9fX2luaXRfZW5kID0gTE9BREFERFIoLmRhdGFfYl9sMSkgKyBTSVpFT0YoLmRhdGFfYl9sMSk7CiAKLQkuYnNzIF9fX2luaXRfZW5kIDoKKwkuYnNzIExPQURBRERSKC5kYXRhX2JfbDEpICsgU0laRU9GKC5kYXRhX2JfbDEpIDoKIAl7CiAJCS4gPSBBTElHTig0KTsKIAkJX19fYnNzX3N0YXJ0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TCmluZGV4IDJmMDhiY2IuLjM4NjUwYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUwpAQCAtNDQwLDE1ICs0NDAsMTUgQEAKIAlTU1lOQzsKIAogCS8qIG1ha2Ugc3VyZSBTWVNDUiBpcyBzZXQgdG8gdXNlIEJNT0RFICovCi0JUDAuaCA9IGhpKFNJQ0FfU1lTQ1IpOwotCVAwLmwgPSBsbyhTSUNBX1NZU0NSKTsKLQlSMC5sID0gMHgyMDsKKwlQMC5oID0gaGkoU1lTQ1IpOworCVAwLmwgPSBsbyhTWVNDUik7CisJUjAubCA9IDB4MjA7CQkvKiBvbiBCRjU2MSwgZGlzYWJsZSBjb3JlIGIgKi8KIAlXW1AwXSA9IFIwLmw7CiAJU1NZTkM7CiAKIAkvKiBpc3N1ZSBhIHN5c3RlbSBzb2Z0IHJlc2V0ICovCi0JUDEuaCA9IGhpKFNJQ0FfU1dSU1QpOwotCVAxLmwgPSBsbyhTSUNBX1NXUlNUKTsKKwlQMS5oID0gaGkoU1dSU1QpOworCVAxLmwgPSBsbyhTV1JTVCk7CiAJUjEubCA9IDB4MDAwNzsKIAlXW1AxXSA9IFIxOwogCVNTWU5DOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZWluaXQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGVpbml0LlMKaW5kZXggOWQ0NzU2Mi4uNWJlNmI5NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZWluaXQuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlaW5pdC5TCkBAIC02MCw2ICs2MCw5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19CTEtGSU5fRENBQ0hFKQogRU5UUlkoX2JmaW5fd3JpdGVfRE1FTV9DT05UUk9MKQorCVAwLmwgPSAoRE1FTV9DT05UUk9MICYgMHhGRkZGKTsKKwlQMC5oID0gKERNRU1fQ09OVFJPTCA+PiAxNik7CisKIAlDTEkgUjE7CiAJU1NZTkM7CQkvKiBTU1lOQyByZXF1aXJlZCBiZWZvcmUgd3JpdGluZyB0byBETUVNX0NPTlRST0wuICovCiAJLmFsaWduIDg7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHktZGMuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1kYy5jCmluZGV4IDZiOWZkMDMuLjY2MGY4ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1kYy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1kYy5jCkBAIC0zNTgsNiArMzU4LDI5IEBACiAKICNlbmRpZgkJCQkvKiBDT05GSUdfSVJRQ0hJUF9ERU1VWF9HUElPICovCiAKK3ZvaWQgX19pbml0IGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCkKK3sKKwlTU1lOQygpOworCisjaWZuZGVmIENPTkZJR19LR0RCCisJYmZpbl93cml0ZV9FVlQwKGV2dF9lbXVsYXRpb24pOworI2VuZGlmCisJYmZpbl93cml0ZV9FVlQyKGV2dF9ldnQyKTsKKwliZmluX3dyaXRlX0VWVDModHJhcCk7CisJYmZpbl93cml0ZV9FVlQ1KGV2dF9pdmh3KTsKKwliZmluX3dyaXRlX0VWVDYoZXZ0X3RpbWVyKTsKKwliZmluX3dyaXRlX0VWVDcoZXZ0X2V2dDcpOworCWJmaW5fd3JpdGVfRVZUOChldnRfZXZ0OCk7CisJYmZpbl93cml0ZV9FVlQ5KGV2dF9ldnQ5KTsKKwliZmluX3dyaXRlX0VWVDEwKGV2dF9ldnQxMCk7CisJYmZpbl93cml0ZV9FVlQxMShldnRfZXZ0MTEpOworCWJmaW5fd3JpdGVfRVZUMTIoZXZ0X2V2dDEyKTsKKwliZmluX3dyaXRlX0VWVDEzKGV2dF9ldnQxMyk7CisJYmZpbl93cml0ZV9FVlQxNChldnQxNF9zb2Z0aXJxKTsKKwliZmluX3dyaXRlX0VWVDE1KGV2dF9zeXN0ZW1fY2FsbCk7CisJQ1NZTkMoKTsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQogICogdGhlIEJGaW4gSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgpAQCAtMzc4LDI0ICs0MDEsNiBAQAogCiAJaW5pdF9leGNlcHRpb25fYnVmZigpOwogCi0jaWZuZGVmIENPTkZJR19LR0RCCi0JYmZpbl93cml0ZV9FVlQwKGV2dF9lbXVsYXRpb24pOwotI2VuZGlmCi0JYmZpbl93cml0ZV9FVlQyKGV2dF9ldnQyKTsKLQliZmluX3dyaXRlX0VWVDModHJhcCk7Ci0JYmZpbl93cml0ZV9FVlQ1KGV2dF9pdmh3KTsKLQliZmluX3dyaXRlX0VWVDYoZXZ0X3RpbWVyKTsKLQliZmluX3dyaXRlX0VWVDcoZXZ0X2V2dDcpOwotCWJmaW5fd3JpdGVfRVZUOChldnRfZXZ0OCk7Ci0JYmZpbl93cml0ZV9FVlQ5KGV2dF9ldnQ5KTsKLQliZmluX3dyaXRlX0VWVDEwKGV2dF9ldnQxMCk7Ci0JYmZpbl93cml0ZV9FVlQxMShldnRfZXZ0MTEpOwotCWJmaW5fd3JpdGVfRVZUMTIoZXZ0X2V2dDEyKTsKLQliZmluX3dyaXRlX0VWVDEzKGV2dF9ldnQxMyk7Ci0JYmZpbl93cml0ZV9FVlQxNChldnQxNF9zb2Z0aXJxKTsKLQliZmluX3dyaXRlX0VWVDE1KGV2dF9zeXN0ZW1fY2FsbCk7Ci0JQ1NZTkMoKTsKLQogCWZvciAoaXJxID0gMDsgaXJxIDw9IFNZU19JUlFTOyBpcnErKykgewogCQlpZiAoaXJxIDw9IElSUV9DT1JFVE1SKQogCQkJc2V0X2lycV9jaGlwKGlycSwgJmJmNTYxX2NvcmVfaXJxY2hpcCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHktc2MuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1zYy5jCmluZGV4IDI4YTg3OGMuLjQ3MDgwMjNmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHktc2MuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHktc2MuYwpAQCAtNTc5LDggKzU3OSwxMiBAQAogCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEEwOwogCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAotCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKQorCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkiR1BJTyBJUlEgJWQgOk5vdCBpbiBQSU5UIEFzc2lnbiB0YWJsZSAiCisJCSJSZWNvbmZpZ3VyZSBJbnRlcnJ1cHQgdG8gUG9ydCBBc3NpZ25lbXRcbiIsIGlycSk7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkgewogCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb25yLCBOVUxMKTsKQEAgLTcxMyw2ICs3MTcsMjkgQEAKIH0KICNlbmRpZgkJCQkvKiBDT05GSUdfSVJRQ0hJUF9ERU1VWF9HUElPICovCiAKK3ZvaWQgX19pbml0IGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCkKK3sKKwlTU1lOQygpOworCisjaWZuZGVmIENPTkZJR19LR0RCCisJYmZpbl93cml0ZV9FVlQwKGV2dF9lbXVsYXRpb24pOworI2VuZGlmCisJYmZpbl93cml0ZV9FVlQyKGV2dF9ldnQyKTsKKwliZmluX3dyaXRlX0VWVDModHJhcCk7CisJYmZpbl93cml0ZV9FVlQ1KGV2dF9pdmh3KTsKKwliZmluX3dyaXRlX0VWVDYoZXZ0X3RpbWVyKTsKKwliZmluX3dyaXRlX0VWVDcoZXZ0X2V2dDcpOworCWJmaW5fd3JpdGVfRVZUOChldnRfZXZ0OCk7CisJYmZpbl93cml0ZV9FVlQ5KGV2dF9ldnQ5KTsKKwliZmluX3dyaXRlX0VWVDEwKGV2dF9ldnQxMCk7CisJYmZpbl93cml0ZV9FVlQxMShldnRfZXZ0MTEpOworCWJmaW5fd3JpdGVfRVZUMTIoZXZ0X2V2dDEyKTsKKwliZmluX3dyaXRlX0VWVDEzKGV2dF9ldnQxMyk7CisJYmZpbl93cml0ZV9FVlQxNChldnQxNF9zb2Z0aXJxKTsKKwliZmluX3dyaXRlX0VWVDE1KGV2dF9zeXN0ZW1fY2FsbCk7CisJQ1NZTkMoKTsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQogICogdGhlIEJGaW4gSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgpAQCAtNzMzLDI5ICs3NjAsMTAgQEAKIAliZmluX3dyaXRlX1NJQ19JTUFTSyhTSUNfVU5NQVNLX0FMTCk7CiAJYmZpbl93cml0ZV9TSUNfSVdSKElXUl9FTkFCTEVfQUxMKTsKICNlbmRpZgotCiAJU1NZTkMoKTsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLSNpZm5kZWYgQ09ORklHX0tHREIKLQliZmluX3dyaXRlX0VWVDAoZXZ0X2VtdWxhdGlvbik7Ci0jZW5kaWYKLQliZmluX3dyaXRlX0VWVDIoZXZ0X2V2dDIpOwotCWJmaW5fd3JpdGVfRVZUMyh0cmFwKTsKLQliZmluX3dyaXRlX0VWVDUoZXZ0X2l2aHcpOwotCWJmaW5fd3JpdGVfRVZUNihldnRfdGltZXIpOwotCWJmaW5fd3JpdGVfRVZUNyhldnRfZXZ0Nyk7Ci0JYmZpbl93cml0ZV9FVlQ4KGV2dF9ldnQ4KTsKLQliZmluX3dyaXRlX0VWVDkoZXZ0X2V2dDkpOwotCWJmaW5fd3JpdGVfRVZUMTAoZXZ0X2V2dDEwKTsKLQliZmluX3dyaXRlX0VWVDExKGV2dF9ldnQxMSk7Ci0JYmZpbl93cml0ZV9FVlQxMihldnRfZXZ0MTIpOwotCWJmaW5fd3JpdGVfRVZUMTMoZXZ0X2V2dDEzKTsKLQliZmluX3dyaXRlX0VWVDE0KGV2dDE0X3NvZnRpcnEpOwotCWJmaW5fd3JpdGVfRVZUMTUoZXZ0X3N5c3RlbV9jYWxsKTsKLQlDU1lOQygpOwotCiAjaWYgZGVmaW5lZChDT05GSUdfSVJRQ0hJUF9ERU1VWF9HUElPKSAmJiBkZWZpbmVkKENPTkZJR19CRjU0eCkKICNpZmRlZiBDT05GSUdfUElOVHhfUkVBU1NJR04KIAlwaW50WzBdLT5hc3NpZ24gPSBDT05GSUdfUElOVDBfQVNTSUdOOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3N5c19mcnYuYyBiL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMKaW5kZXggMjZiM2RmMy4uNmZiZTI2NiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3N5c19mcnYuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tc2cuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggYWJiNTgyYi4uNWM4YTg0NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTkzOCw3ICs5MzgsNyBAQAogCiBtZW51Y29uZmlnIEFQTQogCXRyaXN0YXRlICJBUE0gKEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQpIEJJT1Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBNICYmICFYODZfVklTV1MKKwlkZXBlbmRzIG9uIFBNX1NMRUVQICYmICFYODZfVklTV1MKIAktLS1oZWxwLS0tCiAJICBBUE0gaXMgYSBCSU9TIHNwZWNpZmljYXRpb24gZm9yIHNhdmluZyBwb3dlciB1c2luZyBzZXZlcmFsIGRpZmZlcmVudAogCSAgdGVjaG5pcXVlcy4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBiYXR0ZXJ5IHBvd2VyZWQgbGFwdG9wcyB3aXRoCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnCmluZGV4IGIzMWMwODAuLmYwMzUzMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnCkBAIC0zNiwxMSArMzYsMTEgQEAKIAkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gc29tZXdoYXQuCiAKIGNvbW1lbnQgIlBhZ2UgYWxsb2MgZGVidWcgaXMgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZCBvbiBpMzg2IgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFNPRlRXQVJFX1NVU1BFTkQKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBISUJFUk5BVElPTgogCiBjb25maWcgREVCVUdfUEFHRUFMTE9DCiAJYm9vbCAiRGVidWcgcGFnZSBtZW1vcnkgYWxsb2NhdGlvbnMiCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgIVNPRlRXQVJFX1NVU1BFTkQgJiYgIUhVR0VUTEJGUworCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFISUJFUk5BVElPTiAmJiAhSFVHRVRMQkZTCiAJaGVscAogCSAgVW5tYXAgcGFnZXMgZnJvbSB0aGUga2VybmVsIGxpbmVhciBtYXBwaW5nIGFmdGVyIGZyZWVfcGFnZXMoKS4KIAkgIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlIHNsb3dkb3duLCBidXQgaGVscHMgdG8gZmluZCBjZXJ0YWluIHR5cGVzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9hcG0uYyBiL2FyY2gvaTM4Ni9ib290L2FwbS5jCmluZGV4IGEzNDA4N2MuLmVhYjUwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2FwbS5jCisrKyBiL2FyY2gvaTM4Ni9ib290L2FwbS5jCkBAIC00MCwxNCArNDAsMTUgQEAKIAlpZiAoYnggIT0gMHg1MDRkKQkvKiAiUE0iIHNpZ25hdHVyZSAqLwogCQlyZXR1cm4gLTE7CiAKLQlpZiAoY3ggJiAweDAyKQkJLyogMzIgYml0cyBzdXBwb3J0ZWQ/ICovCisJaWYgKCEoY3ggJiAweDAyKSkJCS8qIDMyIGJpdHMgc3VwcG9ydGVkPyAqLwogCQlyZXR1cm4gLTE7CiAKIAkvKiBEaXNjb25uZWN0IGZpcnN0LCBqdXN0IGluIGNhc2UgKi8KIAlheCA9IDB4NTMwNDsKKwlieCA9IDA7CiAJYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVicCA7IGludCAkMHgxNSA7IHBvcGwgJSVlYnAiCi0JCSAgICAgOiAiK2EiIChheCkKLQkJICAgICA6IDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpCisJCSAgICAgOiA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKIAogCS8qIFBhcmFub2lhICovCiAJZWJ4ID0gZXNpID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L21haW4uYyBiL2FyY2gvaTM4Ni9ib290L21haW4uYwppbmRleCA3ZjAxZjk2Li4wZWVlZjM5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC9tYWluLmMKKysrIGIvYXJjaC9pMzg2L2Jvb3QvbWFpbi5jCkBAIC03MywxNSArNzMsMTUgQEAKIH0KIAogLyoKLSAqIEdldCBJbnRlbCBTcGVlZFN0ZXAgSVNUIGluZm9ybWF0aW9uLgorICogR2V0IEludGVsIFNwZWVkU3RlcCAoSVNUKSBpbmZvcm1hdGlvbi4KICAqLwotc3RhdGljIHZvaWQgcXVlcnlfc3BlZWRzdGVwX2lzdCh2b2lkKQorc3RhdGljIHZvaWQgcXVlcnlfaXN0KHZvaWQpCiB7CiAJYXNtKCJpbnQgJDB4MTUiCi0JICAgIDogIj1hIiAoYm9vdF9wYXJhbXMuc3BlZWRzdGVwX2luZm9bMF0pLAotCSAgICAgICI9YiIgKGJvb3RfcGFyYW1zLnNwZWVkc3RlcF9pbmZvWzFdKSwKLQkgICAgICAiPWMiIChib290X3BhcmFtcy5zcGVlZHN0ZXBfaW5mb1syXSksCi0JICAgICAgIj1kIiAoYm9vdF9wYXJhbXMuc3BlZWRzdGVwX2luZm9bM10pCisJICAgIDogIj1hIiAoYm9vdF9wYXJhbXMuaXN0X2luZm8uc2lnbmF0dXJlKSwKKwkgICAgICAiPWIiIChib290X3BhcmFtcy5pc3RfaW5mby5jb21tYW5kKSwKKwkgICAgICAiPWMiIChib290X3BhcmFtcy5pc3RfaW5mby5ldmVudCksCisJICAgICAgIj1kIiAoYm9vdF9wYXJhbXMuaXN0X2luZm8ucGVyZl9sZXZlbCkKIAkgICAgOiAiYSIgKDB4MDAwMGU5ODApLAkgLyogSVNUIFN1cHBvcnQgKi8KIAkgICAgICAiZCIgKDB4NDc1MzQ5NDMpKTsgLyogUmVxdWVzdCB2YWx1ZSAqLwogfQpAQCAtMTQ0LDggKzE0NCw4IEBACiAJcXVlcnlfdm95YWdlcigpOwogI2VuZGlmCiAKLQkvKiBRdWVyeSBTcGVlZFN0ZXAgSVNUIGluZm9ybWF0aW9uICovCi0JcXVlcnlfc3BlZWRzdGVwX2lzdCgpOworCS8qIFF1ZXJ5IEludGVsIFNwZWVkU3RlcCAoSVNUKSBpbmZvcm1hdGlvbiAqLworCXF1ZXJ5X2lzdCgpOwogCiAJLyogUXVlcnkgQVBNIGluZm9ybWF0aW9uICovCiAjaWYgZGVmaW5lZChDT05GSUdfQVBNKSB8fCBkZWZpbmVkKENPTkZJR19BUE1fTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCmluZGV4IGMzNzUwYzIuLmM4NTU5OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTQzMCwyMiArNDMwLDEyIEBACiAgKiBBbmQgb24gdGhlIGxvY2FsIENQVSB5b3UgbmVlZCB0byBiZSBwcm90ZWN0ZWQgYWdhaW4gTk1JIG9yIE1DRSBoYW5kbGVycwogICogc2VlaW5nIGFuIGluY29uc2lzdGVudCBpbnN0cnVjdGlvbiB3aGlsZSB5b3UgcGF0Y2guCiAgKi8KLXZvaWQgX19rcHJvYmVzIHRleHRfcG9rZSh2b2lkICpvYWRkciwgdW5zaWduZWQgY2hhciAqb3Bjb2RlLCBpbnQgbGVuKQordm9pZCBfX2twcm9iZXMgdGV4dF9wb2tlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGNoYXIgKm9wY29kZSwgaW50IGxlbikKIHsKLSAgICAgICAgdTggKmFkZHIgPSBvYWRkcjsKLQlpZiAoIXB0ZV93cml0ZSgqbG9va3VwX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpYWRkcikpKSB7Ci0JCXN0cnVjdCBwYWdlICpwWzJdID0geyB2aXJ0X3RvX3BhZ2UoYWRkciksIHZpcnRfdG9fcGFnZShhZGRyK1BBR0VfU0laRSkgfTsKLQkJYWRkciA9IHZtYXAocCwgMiwgVk1fTUFQLCBQQUdFX0tFUk5FTCk7Ci0JCWlmICghYWRkcikKLQkJCXJldHVybjsKLQkJYWRkciArPSAoKHVuc2lnbmVkIGxvbmcpb2FkZHIpICUgUEFHRV9TSVpFOwotCX0KIAltZW1jcHkoYWRkciwgb3Bjb2RlLCBsZW4pOwogCXN5bmNfY29yZSgpOwogCS8qIE5vdCBzdHJpY3RseSBuZWVkZWQsIGJ1dCBjYW4gc3BlZWQgQ1BVIHJlY292ZXJ5IHVwLiBJZ25vcmUgY3Jvc3MgY2FjaGVsaW5lCiAJICAgY2FzZS4gKi8KIAlpZiAoY3B1X2hhc19jbGZsdXNoKQotCQlhc20oImNsZmx1c2ggKCUwKSAiIDo6ICJyIiAob2FkZHIpIDogIm1lbW9yeSIpOwotCWlmIChhZGRyICE9IG9hZGRyKQotCQl2dW5tYXAoYWRkcik7CisJCWFzbSgiY2xmbHVzaCAoJTApICIgOjogInIiIChhZGRyKSA6ICJtZW1vcnkiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwppbmRleCAwOTQxMThiLi5kOGM2ZjEzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC05Miw3ICs5Miw3IEBACiBjb25maWcgWDg2X1BPV0VSTk9XX0s4X0FDUEkKIAlib29sICJBQ1BJIFN1cHBvcnQiCiAJc2VsZWN0IEFDUElfUFJPQ0VTU09SCi0JZGVwZW5kcyBvbiBYODZfUE9XRVJOT1dfSzgKKwlkZXBlbmRzIG9uIEFDUEkgJiYgWDg2X1BPV0VSTk9XX0s4CiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIEs4cyBQcm9jZXNzb3IgUGVyZm9ybWFuY2UgU3RhdGVzIHZpYSBBQ1BJLgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9lODIwLmMgYi9hcmNoL2kzODYva2VybmVsL2U4MjAuYwppbmRleCBlNjBjZGRiLi4zYzg2Yjk3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL2kzODYva2VybmVsL2U4MjAuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAKIHN1YnN5c19pbml0Y2FsbChyZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcyk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkKKyNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfSElCRVJOQVRJT04pCiAvKioKICAqIGU4MjBfbWFya19ub3NhdmVfcmVnaW9ucyAtIEZpbmQgdGhlIHJhbmdlcyBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgdGhhdCBkbyBub3QKICAqIGNvcnJlc3BvbmQgdG8gZTgyMCBSQU0gYXJlYXMgYW5kIG1hcmsgdGhlIGNvcnJlc3BvbmRpbmcgcGFnZXMgYXMgbm9zYXZlIGZvcgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKaW5kZXggZDg2NWQwNC4uMDljZjc4MSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC04Miw2ICs4Miw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzX2kzODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzX2kzODYuYwppbmRleCBlNWRjYjkzLi40MjE0NzMwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3N5c19pMzg2LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMgYi9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKaW5kZXggNmRlYjE1OS4uNGViMmU0MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKaW5kZXggYzNiOTkwNS4uNzMwYTViMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2luaXQuYworKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC00MzIsNyArNDMyLDcgQEAKIAlwYXJhdmlydF9wYWdldGFibGVfc2V0dXBfZG9uZShwZ2RfYmFzZSk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX1NMRUVQKQorI2lmIGRlZmluZWQoQ09ORklHX0hJQkVSTkFUSU9OKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJKQogLyoKICAqIFN3YXAgc3VzcGVuZCAmIGZyaWVuZHMgbmVlZCB0aGlzIGZvciByZXN1bWUgYmVjYXVzZSB0aGluZ3MgbGlrZSB0aGUgaW50ZWwtYWdwCiAgKiBkcml2ZXIgbWlnaHQgaGF2ZSBzcGxpdCB1cCBhIGtlcm5lbCA0TUIgbWFwcGluZy4KQEAgLTgwMCw5ICs4MDAsMTcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gUEZOX0FMSUdOKF90ZXh0KTsKIAl1bnNpZ25lZCBsb25nIHNpemUgPSBQRk5fQUxJR04oX2V0ZXh0KSAtIHN0YXJ0OwogCi0JY2hhbmdlX3BhZ2VfYXR0cih2aXJ0X3RvX3BhZ2Uoc3RhcnQpLAotCSAgICAgICAgICAgICAgICAgc2l6ZSA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTF9SWCk7Ci0JcHJpbnRrKCJXcml0ZSBwcm90ZWN0aW5nIHRoZSBrZXJuZWwgdGV4dDogJWx1a1xuIiwgc2l6ZSA+PiAxMCk7CisjaWZuZGVmIENPTkZJR19LUFJPQkVTCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJLyogSXQgbXVzdCBzdGlsbCBiZSBwb3NzaWJsZSB0byBhcHBseSBTTVAgYWx0ZXJuYXRpdmVzLiAqLworCWlmIChudW1fcG9zc2libGVfY3B1cygpIDw9IDEpCisjZW5kaWYKKwl7CisJCWNoYW5nZV9wYWdlX2F0dHIodmlydF90b19wYWdlKHN0YXJ0KSwKKwkJICAgICAgICAgICAgICAgICBzaXplID4+IFBBR0VfU0hJRlQsIFBBR0VfS0VSTkVMX1JYKTsKKwkJcHJpbnRrKCJXcml0ZSBwcm90ZWN0aW5nIHRoZSBrZXJuZWwgdGV4dDogJWx1a1xuIiwgc2l6ZSA+PiAxMCk7CisJfQorI2VuZGlmCiAJc3RhcnQgKz0gc2l6ZTsKIAlzaXplID0gKHVuc2lnbmVkIGxvbmcpX19lbmRfcm9kYXRhIC0gc3RhcnQ7CiAJY2hhbmdlX3BhZ2VfYXR0cih2aXJ0X3RvX3BhZ2Uoc3RhcnQpLApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3Bvd2VyL01ha2VmaWxlIGIvYXJjaC9pMzg2L3Bvd2VyL01ha2VmaWxlCmluZGV4IDJkZTdiYmYuLmQ3NjRlYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wb3dlci9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvcG93ZXIvTWFrZWZpbGUKQEAgLTEsMiArMSwyIEBACiBvYmotJChDT05GSUdfUE0pCQkrPSBjcHUubwotb2JqLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpCSs9IHN3c3VzcC5vIHN1c3BlbmQubworb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzd3N1c3AubyBzdXNwZW5kLm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggMzZjN2I5Ni4uMjFhYTRmYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTQyNSw2ICs0MjUsOSBAQAogCWRlcGVuZHMgb24gSUEzMl9TVVBQT1JUCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBDT01QQVRfRk9SX1U2NF9BTElHTk1FTlQKKwlkZWZfYm9vbCBDT01QQVQKKwogY29uZmlnIElBNjRfTUNBX1JFQ09WRVJZCiAJdHJpc3RhdGUgIk1DQSByZWNvdmVyeSBmcm9tIGVycm9ycyBvdGhlciB0aGFuIFRMQi4iCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCmluZGV4IGNkNGFkZjUuLmU5ODBlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwpAQCAtMjAxNSw5ICsyMDE1LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgaHBfaW9jX2lvbW11X2RldmljZV9pZHNbXSA9IHsKKwl7IkhXUDAwMDEiLCAwfSwKKwl7IkhXUDAwMDQiLCAwfSwKKwl7IiIsIDB9LAorfTsKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9zYmFfaW9jX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiSU9DIElPTU1VIERyaXZlciIsCi0JLmlkcwkJPSAiSFdQMDAwMSxIV1AwMDA0IiwKKwkuaWRzCQk9IGhwX2lvY19pb21tdV9kZXZpY2VfaWRzLAogCS5vcHMJCT0gewogCQkuYWRkCT0gYWNwaV9zYmFfaW9jX2FkZCwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zY3NpLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNjc2kuYwppbmRleCBiYjg3NjgyLi5lNjI2OTRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNjc2kuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNjc2kuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiB7CiAJc3RydWN0IHNjc2lfY21uZCAqc2M7CiAKLQl3aGlsZSAoKHNjID0gcXVldWVbcmRdLnNjKSAhPSAwKSB7CisJd2hpbGUgKChzYyA9IHF1ZXVlW3JkXS5zYykgIT0gTlVMTCkgewogCQlhdG9taWNfZGVjKCZudW1fcmVxcyk7CiAJCXF1ZXVlW3JkXS5zYyA9IE5VTEw7CiAJCWlmIChEQkcpCkBAIC0xMjIsNDggKzEyMiwyMiBAQAogfQogCiBzdGF0aWMgdm9pZAotc2ltc2NzaV9yZWFkd3JpdGUgKHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBpbnQgbW9kZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCXN0cnVjdCBkaXNrX3N0YXQgc3RhdDsKLQlzdHJ1Y3QgZGlza19yZXEgcmVxOwotCi0JcmVxLmFkZHIgPSBfX3BhKHNjLT5yZXF1ZXN0X2J1ZmZlcik7Ci0JcmVxLmxlbiAgPSBsZW47CQkJLyogIyBvZiBieXRlcyB0byB0cmFuc2ZlciAqLwotCi0JaWYgKHNjLT5yZXF1ZXN0X2J1ZmZsZW4gPCByZXEubGVuKQotCQlyZXR1cm47Ci0KLQlzdGF0LmZkID0gZGVzY1tzYy0+ZGV2aWNlLT5pZF07Ci0JaWYgKERCRykKLQkJcHJpbnRrKCJzaW1zY3NpXyVzIEAgJWx4IChvZmYgJWx4KVxuIiwKLQkJICAgICAgIG1vZGUgPT0gU1NDX1JFQUQgPyAicmVhZCI6IndyaXRlIiwgcmVxLmFkZHIsIG9mZnNldCk7Ci0JaWE2NF9zc2Moc3RhdC5mZCwgMSwgX19wYSgmcmVxKSwgb2Zmc2V0LCBtb2RlKTsKLQlpYTY0X3NzYyhfX3BhKCZzdGF0KSwgMCwgMCwgMCwgU1NDX1dBSVRfQ09NUExFVElPTik7Ci0KLQlpZiAoc3RhdC5jb3VudCA9PSByZXEubGVuKSB7Ci0JCXNjLT5yZXN1bHQgPSBHT09EOwotCX0gZWxzZSB7Ci0JCXNjLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAogc2ltc2NzaV9zZ19yZWFkd3JpdGUgKHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBpbnQgbW9kZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0JaW50IGxpc3RfbGVuID0gc2MtPnVzZV9zZzsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjLT5yZXF1ZXN0X2J1ZmZlcjsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNsOwogCXN0cnVjdCBkaXNrX3N0YXQgc3RhdDsKIAlzdHJ1Y3QgZGlza19yZXEgcmVxOwogCiAJc3RhdC5mZCA9IGRlc2Nbc2MtPmRldmljZS0+aWRdOwogCi0Jd2hpbGUgKGxpc3RfbGVuKSB7CisJc2NzaV9mb3JfZWFjaF9zZyhzYywgc2wsIHNjc2lfc2dfY291bnQoc2MpLCBpKSB7CiAJCXJlcS5hZGRyID0gX19wYShwYWdlX2FkZHJlc3Moc2wtPnBhZ2UpICsgc2wtPm9mZnNldCk7CiAJCXJlcS5sZW4gID0gc2wtPmxlbmd0aDsKIAkJaWYgKERCRykKIAkJCXByaW50aygic2ltc2NzaV9zZ18lcyBAICVseCAob2ZmICVseCkgdXNlX3NnPSVkIGxlbj0lZFxuIiwKIAkJCSAgICAgICBtb2RlID09IFNTQ19SRUFEID8gInJlYWQiOiJ3cml0ZSIsIHJlcS5hZGRyLCBvZmZzZXQsCi0JCQkgICAgICAgbGlzdF9sZW4sIHNsLT5sZW5ndGgpOworCQkJICAgICAgIHNjc2lfc2dfY291bnQoc2MpIC0gaSwgc2wtPmxlbmd0aCk7CiAJCWlhNjRfc3NjKHN0YXQuZmQsIDEsIF9fcGEoJnJlcSksIG9mZnNldCwgbW9kZSk7CiAJCWlhNjRfc3NjKF9fcGEoJnN0YXQpLCAwLCAwLCAwLCBTU0NfV0FJVF9DT01QTEVUSU9OKTsKIApAQCAtMTczLDggKzE0Nyw2IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJb2Zmc2V0ICs9ICBzbC0+bGVuZ3RoOwotCQlzbCsrOwotCQlsaXN0X2xlbi0tOwogCX0KIAlzYy0+cmVzdWx0ID0gR09PRDsKIH0KQEAgLTE5MCwxMCArMTYyLDcgQEAKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAogCW9mZnNldCA9ICgoKHNjLT5jbW5kWzFdICYgMHgxZikgPDwgMTYpIHwgKHNjLT5jbW5kWzJdIDw8IDgpIHwgc2MtPmNtbmRbM10pKjUxMjsKLQlpZiAoc2MtPnVzZV9zZyA+IDApCi0JCXNpbXNjc2lfc2dfcmVhZHdyaXRlKHNjLCBtb2RlLCBvZmZzZXQpOwotCWVsc2UKLQkJc2ltc2NzaV9yZWFkd3JpdGUoc2MsIG1vZGUsIG9mZnNldCwgc2MtPmNtbmRbNF0qNTEyKTsKKwlzaW1zY3NpX3NnX3JlYWR3cml0ZShzYywgbW9kZSwgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHNpemVfdApAQCAtMjMwLDI2ICsxOTksMjEgQEAKIAkJfCAoKHVuc2lnbmVkIGxvbmcpc2MtPmNtbmRbM10gPDwgMTYpCiAJCXwgKCh1bnNpZ25lZCBsb25nKXNjLT5jbW5kWzRdIDw8ICA4KSAKIAkJfCAoKHVuc2lnbmVkIGxvbmcpc2MtPmNtbmRbNV0gPDwgIDApKSo1MTJVTDsKLQlpZiAoc2MtPnVzZV9zZyA+IDApCi0JCXNpbXNjc2lfc2dfcmVhZHdyaXRlKHNjLCBtb2RlLCBvZmZzZXQpOwotCWVsc2UKLQkJc2ltc2NzaV9yZWFkd3JpdGUoc2MsIG1vZGUsIG9mZnNldCwgKChzYy0+Y21uZFs3XSA8PCA4KSB8IHNjLT5jbW5kWzhdKSo1MTIpOworCXNpbXNjc2lfc2dfcmVhZHdyaXRlKHNjLCBtb2RlLCBvZmZzZXQpOwogfQogCiBzdGF0aWMgdm9pZCBzaW1zY3NpX2ZpbGxyZXN1bHQoc3RydWN0IHNjc2lfY21uZCAqc2MsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKQogewogCi0JaW50IHNjYXR0ZXJsZW4gPSBzYy0+dXNlX3NnOworCWludCBpOworCXVuc2lnbmVkIHRoaXNsZW47CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbHA7CiAKLQlpZiAoc2NhdHRlcmxlbiA9PSAwKQotCQltZW1jcHkoc2MtPnJlcXVlc3RfYnVmZmVyLCBidWYsIGxlbik7Ci0JZWxzZSBmb3IgKHNscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzYy0+cmVxdWVzdF9idWZmZXI7Ci0JCSAgc2NhdHRlcmxlbi0tID4gMCAmJiBsZW4gPiAwOyBzbHArKykgewotCQl1bnNpZ25lZCB0aGlzbGVuID0gbWluKGxlbiwgc2xwLT5sZW5ndGgpOwotCisJc2NzaV9mb3JfZWFjaF9zZyhzYywgc2xwLCBzY3NpX3NnX2NvdW50KHNjKSwgaSkgeworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQl0aGlzbGVuID0gbWluKGxlbiwgc2xwLT5sZW5ndGgpOwogCQltZW1jcHkocGFnZV9hZGRyZXNzKHNscC0+cGFnZSkgKyBzbHAtPm9mZnNldCwgYnVmLCB0aGlzbGVuKTsKLQkJc2xwKys7CiAJCWxlbiAtPSB0aGlzbGVuOwogCX0KIH0KQEAgLTI3NSw3ICsyMzksNyBAQAogCWlmICh0YXJnZXRfaWQgPD0gMTUgJiYgc2MtPmRldmljZS0+bHVuID09IDApIHsKIAkJc3dpdGNoIChzYy0+Y21uZFswXSkgewogCQkgICAgICBjYXNlIElOUVVJUlk6Ci0JCQlpZiAoc2MtPnJlcXVlc3RfYnVmZmxlbiA8IDM1KSB7CisJCQlpZiAoc2NzaV9idWZmbGVuKHNjKSA8IDM1KSB7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlzcHJpbnRmIChmbmFtZSwgIiVzJWMiLCBzaW1zY3NpX3Jvb3QsICdhJyArIHRhcmdldF9pZCk7CkBAIC0zMjgsNyArMjkyLDcgQEAKIAkJCWJyZWFrOwogCiAJCSAgICAgIGNhc2UgUkVBRF9DQVBBQ0lUWToKLQkJCWlmIChkZXNjW3RhcmdldF9pZF0gPCAwIHx8IHNjLT5yZXF1ZXN0X2J1ZmZsZW4gPCA4KSB7CisJCQlpZiAoZGVzY1t0YXJnZXRfaWRdIDwgMCB8fCBzY3NpX2J1ZmZsZW4oc2MpIDwgOCkgewogCQkJCWJyZWFrOwogCQkJfQogCQkJYnVmID0gbG9jYWxidWY7CkBAIC0zNTAsNyArMzE0LDcgQEAKIAkJICAgICAgY2FzZSBNT0RFX1NFTlNFOgogCQkgICAgICBjYXNlIE1PREVfU0VOU0VfMTA6CiAJCQkvKiBzZC5jIHVzZXMgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciBkaXNrIGRvZXMgd3JpdGUtY2FjaGluZy4gKi8KLQkJCXNpbXNjc2lfZmlsbHJlc3VsdChzYywgKGNoYXIgKillbXB0eV96ZXJvX3BhZ2UsIHNjLT5yZXF1ZXN0X2J1ZmZsZW4pOworCQkJc2ltc2NzaV9maWxscmVzdWx0KHNjLCAoY2hhciAqKWVtcHR5X3plcm9fcGFnZSwgc2NzaV9idWZmbGVuKHNjKSk7CiAJCQlzYy0+cmVzdWx0ID0gR09PRDsKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9pYTMyX3N1cHBvcnQuYyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfc3VwcG9ydC5jCmluZGV4IGUxM2ExYTEuLmQxZDUwY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfc3VwcG9ydC5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfc3VwcG9ydC5jCkBAIC0yNDksMTEgKzI0OSwxMSBAQAogCiAjaWYgUEFHRV9TSElGVCA+IElBMzJfUEFHRV9TSElGVAogCXsKLQkJZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpwYXJ0aWFsX3BhZ2VfY2FjaGVwOworCQlleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmlhNjRfcGFydGlhbF9wYWdlX2NhY2hlcDsKIAotCQlwYXJ0aWFsX3BhZ2VfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInBhcnRpYWxfcGFnZV9jYWNoZSIsCi0JCQkJCQlzaXplb2Yoc3RydWN0IHBhcnRpYWxfcGFnZSksCi0JCQkJCQkwLCBTTEFCX1BBTklDLCBOVUxMKTsKKwkJaWE2NF9wYXJ0aWFsX3BhZ2VfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlhNjRfcGFydGlhbF9wYWdlX2NhY2hlIiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSksCisJCQkJCTAsIFNMQUJfUEFOSUMsIE5VTEwpOwogCX0KICNlbmRpZgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMnByaXYuaCBiL2FyY2gvaWE2NC9pYTMyL2lhMzJwcml2LmgKaW5kZXggY2ZhMGJjMC4uNDY2YmJjYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMnByaXYuaAorKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMycHJpdi5oCkBAIC0yNSw4ICsyNSw4IEBACiAgKiBwYXJ0aWFsbHkgbWFwcGVkIHBhZ2VzIHByb3ZpZGUgcHJlY2lzZSBhY2NvdW50aW5nIG9mIHdoaWNoIDRrIHN1YiBwYWdlcwogICogYXJlIG1hcHBlZCBhbmQgd2hpY2ggb25lcyBhcmUgbm90LCB0aGVyZWJ5IGltcHJvdmluZyBJQS0zMiBjb21wYXRpYmlsaXR5LgogICovCi1zdHJ1Y3QgcGFydGlhbF9wYWdlIHsKLQlzdHJ1Y3QgcGFydGlhbF9wYWdlCSpuZXh0OyAvKiBsaW5rZWQgbGlzdCwgc29ydGVkIGJ5IGFkZHJlc3MgKi8KK3N0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSB7CisJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlICpuZXh0OyAvKiBsaW5rZWQgbGlzdCwgc29ydGVkIGJ5IGFkZHJlc3MgKi8KIAlzdHJ1Y3QgcmJfbm9kZQkJcHBfcmI7CiAJLyogNjRLIGlzIHRoZSBsYXJnZXN0ICJub3JtYWwiIHBhZ2Ugc3VwcG9ydGVkIGJ5IGlhNjQgQUJJLiBTbyA0Syo2NAogCSAqIHNob3VsZCBzdWZmaWNlLiovCkBAIC0zNCwxNyArMzQsMTcgQEAKIAl1bnNpZ25lZCBpbnQJCWJhc2U7CiB9OwogCi1zdHJ1Y3QgcGFydGlhbF9wYWdlX2xpc3QgewotCXN0cnVjdCBwYXJ0aWFsX3BhZ2UJKnBwX2hlYWQ7IC8qIGxpc3QgaGVhZCwgcG9pbnRzIHRvIHRoZSBsb3dlc3QKK3N0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZV9saXN0IHsKKwlzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnBwX2hlYWQ7IC8qIGxpc3QgaGVhZCwgcG9pbnRzIHRvIHRoZSBsb3dlc3QKIAkJCQkJICAgKiBhZGRyZXNzZWQgcGFydGlhbCBwYWdlICovCiAJc3RydWN0IHJiX3Jvb3QJCXBwbF9yYjsKLQlzdHJ1Y3QgcGFydGlhbF9wYWdlCSpwcF9oaW50OyAvKiBwcF9oaW50LT5uZXh0IGlzIHRoZSBsYXN0CisJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlICpwcF9oaW50OyAvKiBwcF9oaW50LT5uZXh0IGlzIHRoZSBsYXN0CiAJCQkJCSAgICogYWNjZXNzZWQgcGFydGlhbCBwYWdlICovCiAJYXRvbWljX3QJCXBwX2NvdW50OyAvKiByZWZlcmVuY2UgY291bnQgKi8KIH07CiAKICNpZiBQQUdFX1NISUZUID4gSUEzMl9QQUdFX1NISUZUCi1zdHJ1Y3QgcGFydGlhbF9wYWdlX2xpc3QqIGlhMzJfaW5pdF9wcF9saXN0ICh2b2lkKTsKK3N0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZV9saXN0KiBpYTMyX2luaXRfcHBfbGlzdCAodm9pZCk7CiAjZWxzZQogIyBkZWZpbmUgaWEzMl9pbml0X3BwX2xpc3QoKQkwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCmluZGV4IDBhZmI0ZmUuLmFmMTA0NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYwpAQCAtMjUzLDE3ICsyNTMsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBTTEFCIGNhY2hlIGZvciBwYXJ0aWFsX3BhZ2Ugc3RydWN0dXJlcyAqLwotc3RydWN0IGttZW1fY2FjaGUgKnBhcnRpYWxfcGFnZV9jYWNoZXA7CisvKiBTTEFCIGNhY2hlIGZvciBpYTY0X3BhcnRpYWxfcGFnZSBzdHJ1Y3R1cmVzICovCitzdHJ1Y3Qga21lbV9jYWNoZSAqaWE2NF9wYXJ0aWFsX3BhZ2VfY2FjaGVwOwogCiAvKgotICogaW5pdCBwYXJ0aWFsX3BhZ2VfbGlzdC4KKyAqIGluaXQgaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdC4KICAqIHJldHVybiAwIG1lYW5zIGttYWxsb2MgZmFpbC4KICAqLwotc3RydWN0IHBhcnRpYWxfcGFnZV9saXN0Kgorc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlX2xpc3QqCiBpYTMyX2luaXRfcHBfbGlzdCh2b2lkKQogewotCXN0cnVjdCBwYXJ0aWFsX3BhZ2VfbGlzdCAqcDsKKwlzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdCAqcDsKIAogCWlmICgocCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiBwOwpAQCAtMjgwLDEyICsyODAsMTIgQEAKICAqIEVsc2UsIHJldHVybiAwIGFuZCBwcm92aWRlIEBwcHJldiwgQHJiX2xpbmssIEByYl9wYXJlbnQgdG8KICAqIGJlIHVzZWQgYnkgbGF0ZXIgX19pYTMyX2luc2VydF9wcCgpLgogICovCi1zdGF0aWMgc3RydWN0IHBhcnRpYWxfcGFnZSAqCi1fX2lhMzJfZmluZF9wcChzdHJ1Y3QgcGFydGlhbF9wYWdlX2xpc3QgKnBwbCwgdW5zaWduZWQgaW50IHN0YXJ0LAotCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgKipwcHJldiwgc3RydWN0IHJiX25vZGUgKioqcmJfbGluaywKK3N0YXRpYyBzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKgorX19pYTMyX2ZpbmRfcHAoc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlX2xpc3QgKnBwbCwgdW5zaWduZWQgaW50IHN0YXJ0LAorCXN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSAqKnBwcmV2LCBzdHJ1Y3QgcmJfbm9kZSAqKipyYl9saW5rLAogCXN0cnVjdCByYl9ub2RlICoqcmJfcGFyZW50KQogewotCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgKnBwOworCXN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSAqcHA7CiAJc3RydWN0IHJiX25vZGUgKipfX3JiX2xpbmssICpfX3JiX3BhcmVudCwgKnJiX3ByZXY7CiAKIAlwcCA9IHBwbC0+cHBfaGludDsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCiAJd2hpbGUgKCpfX3JiX2xpbmspIHsKIAkJX19yYl9wYXJlbnQgPSAqX19yYl9saW5rOwotCQlwcCA9IHJiX2VudHJ5KF9fcmJfcGFyZW50LCBzdHJ1Y3QgcGFydGlhbF9wYWdlLCBwcF9yYik7CisJCXBwID0gcmJfZW50cnkoX19yYl9wYXJlbnQsIHN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSwgcHBfcmIpOwogCiAJCWlmIChwcC0+YmFzZSA9PSBzdGFydCkgewogCQkJcHBsLT5wcF9oaW50ID0gcHA7CkBAIC0zMTQsNyArMzE0LDcgQEAKIAkqcmJfcGFyZW50ID0gX19yYl9wYXJlbnQ7CiAJKnBwcmV2ID0gTlVMTDsKIAlpZiAocmJfcHJldikKLQkJKnBwcmV2ID0gcmJfZW50cnkocmJfcHJldiwgc3RydWN0IHBhcnRpYWxfcGFnZSwgcHBfcmIpOworCQkqcHByZXYgPSByYl9lbnRyeShyYl9wcmV2LCBzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UsIHBwX3JiKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzIyLDkgKzMyMiw5IEBACiAgKiBpbnNlcnQgQHBwIGludG8gQHBwbC4KICAqLwogc3RhdGljIHZvaWQKLV9faWEzMl9pbnNlcnRfcHAoc3RydWN0IHBhcnRpYWxfcGFnZV9saXN0ICpwcGwsIHN0cnVjdCBwYXJ0aWFsX3BhZ2UgKnBwLAotCSBzdHJ1Y3QgcGFydGlhbF9wYWdlICpwcmV2LCBzdHJ1Y3QgcmJfbm9kZSAqKnJiX2xpbmssCi0Jc3RydWN0IHJiX25vZGUgKnJiX3BhcmVudCkKK19faWEzMl9pbnNlcnRfcHAoc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlX2xpc3QgKnBwbCwKKwlzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnBwLCBzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnByZXYsCisJc3RydWN0IHJiX25vZGUgKipyYl9saW5rLCBzdHJ1Y3QgcmJfbm9kZSAqcmJfcGFyZW50KQogewogCS8qIGxpbmsgbGlzdCAqLwogCWlmIChwcmV2KSB7CkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJcHBsLT5wcF9oZWFkID0gcHA7CiAJCWlmIChyYl9wYXJlbnQpCiAJCQlwcC0+bmV4dCA9IHJiX2VudHJ5KHJiX3BhcmVudCwKLQkJCQlzdHJ1Y3QgcGFydGlhbF9wYWdlLCBwcF9yYik7CisJCQkJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlLCBwcF9yYik7CiAJCWVsc2UKIAkJCXBwLT5uZXh0ID0gTlVMTDsKIAl9CkBAIC0zNTAsOCArMzUwLDggQEAKICAqIGRlbGV0ZSBAcHAgZnJvbSBwYXJ0aWFsIHBhZ2UgbGlzdCBAcHBsLgogICovCiBzdGF0aWMgdm9pZAotX19pYTMyX2RlbGV0ZV9wcChzdHJ1Y3QgcGFydGlhbF9wYWdlX2xpc3QgKnBwbCwgc3RydWN0IHBhcnRpYWxfcGFnZSAqcHAsCi0Jc3RydWN0IHBhcnRpYWxfcGFnZSAqcHJldikKK19faWEzMl9kZWxldGVfcHAoc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlX2xpc3QgKnBwbCwKKwlzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnBwLCBzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnByZXYpCiB7CiAJaWYgKHByZXYpIHsKIAkJcHJldi0+bmV4dCA9IHBwLT5uZXh0OwpAQCAtMzYzLDE1ICszNjMsMTUgQEAKIAkJCXBwbC0+cHBfaGludCA9IHBwLT5uZXh0OwogCX0KIAlyYl9lcmFzZSgmcHAtPnBwX3JiLCAmcHBsLT5wcGxfcmIpOwotCWttZW1fY2FjaGVfZnJlZShwYXJ0aWFsX3BhZ2VfY2FjaGVwLCBwcCk7CisJa21lbV9jYWNoZV9mcmVlKGlhNjRfcGFydGlhbF9wYWdlX2NhY2hlcCwgcHApOwogfQogCi1zdGF0aWMgc3RydWN0IHBhcnRpYWxfcGFnZSAqCi1fX3BwX3ByZXYoc3RydWN0IHBhcnRpYWxfcGFnZSAqcHApCitzdGF0aWMgc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlICoKK19fcHBfcHJldihzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnBwKQogewogCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gcmJfcHJldigmcHAtPnBwX3JiKTsKIAlpZiAocHJldikKLQkJcmV0dXJuIHJiX2VudHJ5KHByZXYsIHN0cnVjdCBwYXJ0aWFsX3BhZ2UsIHBwX3JiKTsKKwkJcmV0dXJuIHJiX2VudHJ5KHByZXYsIHN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSwgcHBfcmIpOwogCWVsc2UKIAkJcmV0dXJuIE5VTEw7CiB9CkBAIC0zODMsNyArMzgzLDcgQEAKIHN0YXRpYyB2b2lkCiBfX2lhMzJfZGVsZXRlX3BwX3JhbmdlKHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCkKIHsKLQlzdHJ1Y3QgcGFydGlhbF9wYWdlICpwcCwgKnByZXY7CisJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlICpwcCwgKnByZXY7CiAJc3RydWN0IHJiX25vZGUgKipyYl9saW5rLCAqcmJfcGFyZW50OwogCiAJaWYgKHN0YXJ0ID49IGVuZCkKQEAgLTQwMSw3ICs0MDEsNyBAQAogCX0KIAogCXdoaWxlIChwcCAmJiBwcC0+YmFzZSA8IGVuZCkgewotCQlzdHJ1Y3QgcGFydGlhbF9wYWdlICp0bXAgPSBwcC0+bmV4dDsKKwkJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlICp0bXAgPSBwcC0+bmV4dDsKIAkJX19pYTMyX2RlbGV0ZV9wcChjdXJyZW50LT50aHJlYWQucHBsLCBwcCwgcHJldik7CiAJCXBwID0gdG1wOwogCX0KQEAgLTQxNCw3ICs0MTQsNyBAQAogc3RhdGljIGludAogX19pYTMyX3NldF9wcCh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcGFydGlhbF9wYWdlICpwcCwgKnByZXY7CisJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlICpwcCwgKnByZXY7CiAJc3RydWN0IHJiX25vZGUgKiogcmJfbGluaywgKnJiX3BhcmVudDsKIAl1bnNpZ25lZCBpbnQgcHN0YXJ0LCBzdGFydF9iaXQsIGVuZF9iaXQsIGk7CiAKQEAgLTQ1MCw4ICs0NTAsOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JLyogbmV3IGEgcGFydGlhbF9wYWdlICovCi0JcHAgPSBrbWVtX2NhY2hlX2FsbG9jKHBhcnRpYWxfcGFnZV9jYWNoZXAsIEdGUF9LRVJORUwpOworCS8qIG5ldyBhIGlhNjRfcGFydGlhbF9wYWdlICovCisJcHAgPSBrbWVtX2NhY2hlX2FsbG9jKGlhNjRfcGFydGlhbF9wYWdlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcHAtPmJhc2UgPSBwc3RhcnQ7CkBAIC01MDQsNyArNTA0LDcgQEAKIHN0YXRpYyBpbnQKIF9faWEzMl91bnNldF9wcCh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQpCiB7Ci0Jc3RydWN0IHBhcnRpYWxfcGFnZSAqcHAsICpwcmV2OworCXN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSAqcHAsICpwcmV2OwogCXN0cnVjdCByYl9ub2RlICoqIHJiX2xpbmssICpyYl9wYXJlbnQ7CiAJdW5zaWduZWQgaW50IHBzdGFydCwgc3RhcnRfYml0LCBlbmRfYml0LCBpOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwpAQCAtNTMyLDggKzUzMiw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIG5ldyBhIHBhcnRpYWxfcGFnZSAqLwotCXBwID0ga21lbV9jYWNoZV9hbGxvYyhwYXJ0aWFsX3BhZ2VfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwkvKiBuZXcgYSBpYTY0X3BhcnRpYWxfcGFnZSAqLworCXBwID0ga21lbV9jYWNoZV9hbGxvYyhpYTY0X3BhcnRpYWxfcGFnZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghcHApCiAJCXJldHVybiAtRU5PTUVNOwogCXBwLT5iYXNlID0gcHN0YXJ0OwpAQCAtNjA1LDcgKzYwNSw3IEBACiBzdGF0aWMgaW50CiBfX2lhMzJfY29tcGFyZV9wcCh1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQpCiB7Ci0Jc3RydWN0IHBhcnRpYWxfcGFnZSAqcHAsICpwcmV2OworCXN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSAqcHAsICpwcmV2OwogCXN0cnVjdCByYl9ub2RlICoqIHJiX2xpbmssICpyYl9wYXJlbnQ7CiAJdW5zaWduZWQgaW50IHBzdGFydCwgc3RhcnRfYml0LCBlbmRfYml0LCBzaXplOwogCXVuc2lnbmVkIGludCBmaXJzdF9iaXQsIG5leHRfemVyb19iaXQ7CS8qIHRoZSBmaXJzdCByYW5nZSBpbiBiaXRtYXAgKi8KQEAgLTY4MiwxMyArNjgyLDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1fX2lhMzJfZHJvcF9wcF9saXN0KHN0cnVjdCBwYXJ0aWFsX3BhZ2VfbGlzdCAqcHBsKQorX19pYTMyX2Ryb3BfcHBfbGlzdChzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdCAqcHBsKQogewotCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgKnBwID0gcHBsLT5wcF9oZWFkOworCXN0cnVjdCBpYTY0X3BhcnRpYWxfcGFnZSAqcHAgPSBwcGwtPnBwX2hlYWQ7CiAKIAl3aGlsZSAocHApIHsKLQkJc3RydWN0IHBhcnRpYWxfcGFnZSAqbmV4dCA9IHBwLT5uZXh0OwotCQlrbWVtX2NhY2hlX2ZyZWUocGFydGlhbF9wYWdlX2NhY2hlcCwgcHApOworCQlzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKm5leHQgPSBwcC0+bmV4dDsKKwkJa21lbV9jYWNoZV9mcmVlKGlhNjRfcGFydGlhbF9wYWdlX2NhY2hlcCwgcHApOwogCQlwcCA9IG5leHQ7CiAJfQogCkBAIC02OTYsOSArNjk2LDkgQEAKIH0KIAogdm9pZAotaWEzMl9kcm9wX3BhcnRpYWxfcGFnZV9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK2lhMzJfZHJvcF9pYTY0X3BhcnRpYWxfcGFnZV9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgcGFydGlhbF9wYWdlX2xpc3QqIHBwbCA9IHRhc2stPnRocmVhZC5wcGw7CisJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlX2xpc3QqIHBwbCA9IHRhc2stPnRocmVhZC5wcGw7CiAKIAlpZiAocHBsICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnBwbC0+cHBfY291bnQpKQogCQlfX2lhMzJfZHJvcF9wcF9saXN0KHBwbCk7CkBAIC03MDgsOSArNzA4LDkgQEAKICAqIENvcHkgY3VycmVudC0+dGhyZWFkLnBwbCB0byBwcGwgKGFscmVhZHkgaW5pdGlhbGl6ZWQpLgogICovCiBzdGF0aWMgaW50Ci1fX2lhMzJfY29weV9wcF9saXN0KHN0cnVjdCBwYXJ0aWFsX3BhZ2VfbGlzdCAqcHBsKQorX19pYTMyX2NvcHlfcHBfbGlzdChzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdCAqcHBsKQogewotCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgKnBwLCAqdG1wLCAqcHJldjsKKwlzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2UgKnBwLCAqdG1wLCAqcHJldjsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnJiX2xpbmssICpyYl9wYXJlbnQ7CiAKIAlwcGwtPnBwX2hlYWQgPSBOVUxMOwpAQCAtNzIxLDcgKzcyMSw3IEBACiAJcHJldiA9IE5VTEw7CiAKIAlmb3IgKHBwID0gY3VycmVudC0+dGhyZWFkLnBwbC0+cHBfaGVhZDsgcHA7IHBwID0gcHAtPm5leHQpIHsKLQkJdG1wID0ga21lbV9jYWNoZV9hbGxvYyhwYXJ0aWFsX3BhZ2VfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwkJdG1wID0ga21lbV9jYWNoZV9hbGxvYyhpYTY0X3BhcnRpYWxfcGFnZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQkqdG1wID0gKnBwOwpAQCAtNzM0LDcgKzczNCw4IEBACiB9CiAKIGludAotaWEzMl9jb3B5X3BhcnRpYWxfcGFnZV9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncykKK2lhMzJfY29weV9pYTY0X3BhcnRpYWxfcGFnZV9saXN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQl1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzKQogewogCWludCByZXR2YWwgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDEwM2RkOGUuLjNkNDVkMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC02Nyw2ICs2Nyw4IEBACiB1bnNpZ25lZCBpbnQgYWNwaV9jcGVpX292ZXJyaWRlOwogdW5zaWduZWQgaW50IGFjcGlfY3BlaV9waHlzX2NwdWlkOwogCit1bnNpZ25lZCBsb25nIGFjcGlfd2FrZXVwX2FkZHJlc3MgPSAwOworCiBjb25zdCBjaGFyIF9faW5pdCAqCiBhY3BpX2dldF9zeXNuYW1lKHZvaWQpCiB7CkBAIC03MzksMTYgKzc0MSwxNSBAQAogCiBpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKQogewotCWludCB2ZWN0b3I7CisJaW50IHRtcDsKIAogCWlmIChoYXNfODI1OSAmJiBnc2kgPCAxNikKIAkJKmlycSA9IGlzYV9pcnFfdG9fdmVjdG9yKGdzaSk7CiAJZWxzZSB7Ci0JCXZlY3RvciA9IGdzaV90b192ZWN0b3IoZ3NpKTsKLQkJaWYgKHZlY3RvciA9PSAtMSkKKwkJdG1wID0gZ3NpX3RvX2lycShnc2kpOworCQlpZiAodG1wID09IC0xKQogCQkJcmV0dXJuIC0xOwotCi0JCSppcnEgPSB2ZWN0b3I7CisJCSppcnEgPSB0bXA7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTg2LDQgKzk4NywyMSBAQAogCiBFWFBPUlRfU1lNQk9MKGFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMpOwogCisvKgorICogYWNwaV9zYXZlX3N0YXRlX21lbSgpIC0gc2F2ZSBrZXJuZWwgc3RhdGUKKyAqCisgKiBUQkQgd2hlbiB3aGVuIElBNjQgc3RhcnRzIHRvIHN1cHBvcnQgc3VzcGVuZC4uLgorICovCitpbnQgYWNwaV9zYXZlX3N0YXRlX21lbSh2b2lkKSB7IHJldHVybiAwOyB9IAorCisvKgorICogYWNwaV9yZXN0b3JlX3N0YXRlKCkKKyAqLwordm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpIHt9CisKKy8qCisgKiBkb19zdXNwZW5kX2xvd2xldmVsKCkKKyAqLwordm9pZCBkb19zdXNwZW5kX2xvd2xldmVsKHZvaWQpIHt9CisKICNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9jeWNsb25lLmMgYi9hcmNoL2lhNjQva2VybmVsL2N5Y2xvbmUuYwppbmRleCAyZmQ5NmQ5MC4uNzkwZWYwZDggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvY3ljbG9uZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvY3ljbG9uZS5jCkBAIC0zOCwxMSArMzgsMTEgQEAKIAogaW50IF9faW5pdCBpbml0X2N5Y2xvbmVfY2xvY2sodm9pZCkKIHsKLQl1NjQqIHJlZzsKKwl1NjQgX19pb21lbSAqcmVnOwogCXU2NCBiYXNlOwkvKiBzYXZlZCBjeWNsb25lIGJhc2UgYWRkcmVzcyAqLwogCXU2NCBvZmZzZXQ7CS8qIG9mZnNldCBmcm9tIHBhZ2VhZGRyIHRvIGN5Y2xvbmVfdGltZXIgcmVnaXN0ZXIgKi8KIAlpbnQgaTsKLQl1MzIqIHZvbGF0aWxlIGN5Y2xvbmVfdGltZXI7CS8qIEN5Y2xvbmUgTVBNQzAgcmVnaXN0ZXIgKi8KKwl1MzIgX19pb21lbSAqY3ljbG9uZV90aW1lcjsJLyogQ3ljbG9uZSBNUE1DMCByZWdpc3RlciAqLwogCiAJaWYgKCF1c2VfY3ljbG9uZSkKIAkJcmV0dXJuIDA7CkBAIC01MSw3ICs1MSw3IEBACiAKIAkvKiBmaW5kIGJhc2UgYWRkcmVzcyAqLwogCW9mZnNldCA9IChDWUNMT05FX0NCQVJfQUREUik7Ci0JcmVnID0gKHU2NCopaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHU2NCkpOworCXJlZyA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZih1NjQpKTsKIAlpZighcmVnKXsKIAkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiIKIAkJCQkiIHJlZ2lzdGVyLlxuIik7CkBAIC02OSw3ICs2OSw3IEBACiAKIAkvKiBzZXR1cCBQTUNDICovCiAJb2Zmc2V0ID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKTsKLQlyZWcgPSAodTY0Kilpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YodTY0KSk7CisJcmVnID0gaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZW9mKHU2NCkpOwogCWlmKCFyZWcpewogCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBQTUNDIgogCQkJCSIgcmVnaXN0ZXIuXG4iKTsKQEAgLTgxLDcgKzgxLDcgQEAKIAogCS8qIHNldHVwIE1QQ1MgKi8KIAlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpOwotCXJlZyA9ICh1NjQqKWlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZih1NjQpKTsKKwlyZWcgPSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YodTY0KSk7CiAJaWYoIXJlZyl7CiAJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIE1QQ1MiCiAJCQkJIiByZWdpc3Rlci5cbiIpOwpAQCAtOTMsNyArOTMsNyBAQAogCiAJLyogbWFwIGluIGN5Y2xvbmVfdGltZXIgKi8KIAlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpOwotCWN5Y2xvbmVfdGltZXIgPSAodTMyKilpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplb2YodTMyKSk7CisJY3ljbG9uZV90aW1lciA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemVvZih1MzIpKTsKIAlpZighY3ljbG9uZV90aW1lcil7CiAJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIE1QTUMiCiAJCQkJIiByZWdpc3Rlci5cbiIpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VudGVyIG5vdCBjb3VudGluZyEiCiAJCQkJCSIgRElTQUJMRURcbiIpOwogCQkJaW91bm1hcChjeWNsb25lX3RpbWVyKTsKLQkJCWN5Y2xvbmVfdGltZXIgPSAwOworCQkJY3ljbG9uZV90aW1lciA9IE5VTEw7CiAJCQl1c2VfY3ljbG9uZSA9IDA7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2lhNjQva2VybmVsL2hlYWQuUwppbmRleCA0NGQ1NDBlLi40ZTVlMjc1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2hlYWQuUwpAQCAtMTc4LDcgKzE3OCw3IEBACiBoYWx0X21zZzoKIAlzdHJpbmd6ICJIYWx0aW5nIGtlcm5lbFxuIgogCi0JLnRleHQKKwkuc2VjdGlvbiAudGV4dC5oZWFkLCJheCIKIAogCS5nbG9iYWwgc3RhcnRfYXAKIApAQCAtMzkyLDYgKzM5Miw4IEBACiAJYnIuc3B0ay5tYW55IHNlbGYJCS8vIGVuZGxlc3MgbG9vcAogRU5EKF9zdGFydCkKIAorCS50ZXh0CisKIEdMT0JBTF9FTlRSWShpYTY0X3NhdmVfZGVidWdfcmVncykKIAlhbGxvYyByMTY9YXIucGZzLDEsMCwwLDAKIAltb3YgcjIwPWFyLmxjCQkJLy8gcHJlc2VydmUgYXIubGMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2lhNjQva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGI2OWMzOTcuLmJjOGVmY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwppbmRleCA5MTc5N2MxLi45Mzg2Yjk1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCkBAIC04NSw4ICs4NSw4IEBACiAJWzAgLi4uIElBNjRfTlVNX1ZFQ1RPUlMgLSAxXSA9IElBNjRfU1BVUklPVVNfSU5UX1ZFQ1RPUgogfTsKIAotc3RhdGljIGNwdW1hc2tfdCB2ZWN0b3JfdGFibGVbSUE2NF9NQVhfREVWSUNFX1ZFQ1RPUlNdID0gewotCVswIC4uLiBJQTY0X01BWF9ERVZJQ0VfVkVDVE9SUyAtIDFdID0gQ1BVX01BU0tfTk9ORQorc3RhdGljIGNwdW1hc2tfdCB2ZWN0b3JfdGFibGVbSUE2NF9OVU1fVkVDVE9SU10gPSB7CisJWzAgLi4uIElBNjRfTlVNX1ZFQ1RPUlMgLSAxXSA9IENQVV9NQVNLX05PTkUKIH07CiAKIHN0YXRpYyBpbnQgaXJxX3N0YXR1c1tOUl9JUlFTXSA9IHsKQEAgLTEyMywxNyArMTIzLDE4IEBACiBzdGF0aWMgaW5saW5lIGludCBmaW5kX3VuYXNzaWduZWRfdmVjdG9yKGNwdW1hc2tfdCBkb21haW4pCiB7CiAJY3B1bWFza190IG1hc2s7Ci0JaW50IHBvczsKKwlpbnQgcG9zLCB2ZWN0b3I7CiAKIAljcHVzX2FuZChtYXNrLCBkb21haW4sIGNwdV9vbmxpbmVfbWFwKTsKIAlpZiAoY3B1c19lbXB0eShtYXNrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKHBvcyA9IDA7IHBvcyA8IElBNjRfTlVNX0RFVklDRV9WRUNUT1JTOyBwb3MrKykgewotCQljcHVzX2FuZChtYXNrLCBkb21haW4sIHZlY3Rvcl90YWJsZVtwb3NdKTsKKwkJdmVjdG9yID0gSUE2NF9GSVJTVF9ERVZJQ0VfVkVDVE9SICsgcG9zOworCQljcHVzX2FuZChtYXNrLCBkb21haW4sIHZlY3Rvcl90YWJsZVt2ZWN0b3JdKTsKIAkJaWYgKCFjcHVzX2VtcHR5KG1hc2spKQogCQkJY29udGludWU7Ci0JCXJldHVybiBJQTY0X0ZJUlNUX0RFVklDRV9WRUNUT1IgKyBwb3M7CisJCXJldHVybiB2ZWN0b3I7CiAJfQogCXJldHVybiAtRU5PU1BDOwogfQpAQCAtMTQxLDkgKzE0MiwxMiBAQAogc3RhdGljIGludCBfX2JpbmRfaXJxX3ZlY3RvcihpbnQgaXJxLCBpbnQgdmVjdG9yLCBjcHVtYXNrX3QgZG9tYWluKQogewogCWNwdW1hc2tfdCBtYXNrOwotCWludCBjcHUsIHBvczsKKwlpbnQgY3B1OwogCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSAmaXJxX2NmZ1tpcnFdOwogCisJQlVHX09OKCh1bnNpZ25lZClpcnEgPj0gTlJfSVJRUyk7CisJQlVHX09OKCh1bnNpZ25lZCl2ZWN0b3IgPj0gSUE2NF9OVU1fVkVDVE9SUyk7CisKIAljcHVzX2FuZChtYXNrLCBkb21haW4sIGNwdV9vbmxpbmVfbWFwKTsKIAlpZiAoY3B1c19lbXB0eShtYXNrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTYsOCArMTYwLDcgQEAKIAljZmctPnZlY3RvciA9IHZlY3RvcjsKIAljZmctPmRvbWFpbiA9IGRvbWFpbjsKIAlpcnFfc3RhdHVzW2lycV0gPSBJUlFfVVNFRDsKLQlwb3MgPSB2ZWN0b3IgLSBJQTY0X0ZJUlNUX0RFVklDRV9WRUNUT1I7Ci0JY3B1c19vcih2ZWN0b3JfdGFibGVbcG9zXSwgdmVjdG9yX3RhYmxlW3Bvc10sIGRvbWFpbik7CisJY3B1c19vcih2ZWN0b3JfdGFibGVbdmVjdG9yXSwgdmVjdG9yX3RhYmxlW3ZlY3Rvcl0sIGRvbWFpbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NCw3ICsxNzcsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2NsZWFyX2lycV92ZWN0b3IoaW50IGlycSkKIHsKLQlpbnQgdmVjdG9yLCBjcHUsIHBvczsKKwlpbnQgdmVjdG9yLCBjcHU7CiAJY3B1bWFza190IG1hc2s7CiAJY3B1bWFza190IGRvbWFpbjsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gJmlycV9jZmdbaXJxXTsKQEAgLTE4OSw4ICsxOTIsNyBAQAogCWNmZy0+dmVjdG9yID0gSVJRX1ZFQ1RPUl9VTkFTU0lHTkVEOwogCWNmZy0+ZG9tYWluID0gQ1BVX01BU0tfTk9ORTsKIAlpcnFfc3RhdHVzW2lycV0gPSBJUlFfVU5VU0VEOwotCXBvcyA9IHZlY3RvciAtIElBNjRfRklSU1RfREVWSUNFX1ZFQ1RPUjsKLQljcHVzX2FuZG5vdCh2ZWN0b3JfdGFibGVbcG9zXSwgdmVjdG9yX3RhYmxlW3Bvc10sIGRvbWFpbik7CisJY3B1c19hbmRub3QodmVjdG9yX3RhYmxlW3ZlY3Rvcl0sIHZlY3Rvcl90YWJsZVt2ZWN0b3JdLCBkb21haW4pOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhcl9pcnFfdmVjdG9yKGludCBpcnEpCkBAIC0yMTIsOSArMjE0LDYgQEAKIAl2ZWN0b3IgPSAtRU5PU1BDOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7Ci0JaWYgKGlycSA8IDApIHsKLQkJZ290byBvdXQ7Ci0JfQogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWRvbWFpbiA9IHZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbihjcHUpOwogCQl2ZWN0b3IgPSBmaW5kX3VuYXNzaWduZWRfdmVjdG9yKGRvbWFpbik7CkBAIC0yMjMsNiArMjIyLDggQEAKIAl9CiAJaWYgKHZlY3RvciA8IDApCiAJCWdvdG8gb3V0OworCWlmIChpcnEgPT0gQVVUT19BU1NJR04pCisJCWlycSA9IHZlY3RvcjsKIAlCVUdfT04oX19iaW5kX2lycV92ZWN0b3IoaXJxLCB2ZWN0b3IsIGRvbWFpbikpOwogIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwpAQCAtMjg4LDcgKzI4OSw3IEBACiAJCXZlY3Rvcl9kb21haW5fdHlwZSA9IFZFQ1RPUl9ET01BSU5fUEVSQ1BVOwogCQlub19pbnRfcm91dGluZyA9IDE7CiAJfQotCXJldHVybiAxOworCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oInZlY3RvciIsIHBhcnNlX3ZlY3Rvcl9kb21haW4pOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWFjaHZlYy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tYWNodmVjLmMKaW5kZXggMTNkZjMzNy4uN2NjYjIyOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tYWNodmVjLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tYWNodmVjLmMKQEAgLTEzLDE0ICsxMyw2IEBACiBzdHJ1Y3QgaWE2NF9tYWNoaW5lX3ZlY3RvciBpYTY0X212OwogRVhQT1JUX1NZTUJPTChpYTY0X212KTsKIAotc3RhdGljIF9faW5pdGRhdGEgY29uc3QgY2hhciAqbXZlY19uYW1lOwotc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbXZlYyhjaGFyICpzKQotewotCW12ZWNfbmFtZSA9IHM7Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgibWFjaHZlYyIsIHNldHVwX212ZWMpOwotCiBzdGF0aWMgc3RydWN0IGlhNjRfbWFjaGluZV92ZWN0b3IgKiBfX2luaXQKIGxvb2t1cF9tYWNodmVjIChjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNDEsNyArMzMsNyBAQAogCXN0cnVjdCBpYTY0X21hY2hpbmVfdmVjdG9yICptdjsKIAogCWlmICghbmFtZSkKLQkJbmFtZSA9IG12ZWNfbmFtZSA/IG12ZWNfbmFtZSA6IGFjcGlfZ2V0X3N5c25hbWUoKTsKKwkJbmFtZSA9IGFjcGlfZ2V0X3N5c25hbWUoKTsKIAltdiA9IGxvb2t1cF9tYWNodmVjKG5hbWUpOwogCWlmICghbXYpCiAJCXBhbmljKCJnZW5lcmljIGtlcm5lbCBmYWlsZWQgdG8gZmluZCBtYWNoaW5lIHZlY3RvciBmb3IiCkBAIC01MSw2ICs0MywyMyBAQAogCXByaW50ayhLRVJOX0lORk8gImJvb3RpbmcgZ2VuZXJpYyBrZXJuZWwgb24gcGxhdGZvcm0gJXNcbiIsIG5hbWUpOwogfQogCit2b2lkIF9faW5pdAorbWFjaHZlY19pbml0X2Zyb21fY21kbGluZShjb25zdCBjaGFyICpjbWRsaW5lKQoreworCWNoYXIgc3RyWzY0XTsKKwljb25zdCBjaGFyICpzdGFydDsKKwljaGFyICplbmQ7CisKKwlpZiAoISAoc3RhcnQgPSBzdHJzdHIoY21kbGluZSwgIm1hY2h2ZWM9IikpICkKKwkJcmV0dXJuIG1hY2h2ZWNfaW5pdChOVUxMKTsKKworCXN0cmxjcHkoc3RyLCBzdGFydCArIHN0cmxlbigibWFjaHZlYz0iKSwgc2l6ZW9mKHN0cikpOworCWlmICggKGVuZCA9IHN0cmNocihzdHIsICcgJykpICkKKwkJKmVuZCA9ICdcMCc7CisKKwlyZXR1cm4gbWFjaHZlY19pbml0KHN0cik7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfSUE2NF9HRU5FUklDICovCiAKIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmE0MGNiYS4uNDE1ODkwNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQ5OSw3ICs0OTksOCBAQAogCiAJCS8qIENvcHkgcGFydGlhbGx5IG1hcHBlZCBwYWdlIGxpc3QgKi8KIAkJaWYgKCFyZXR2YWwpCi0JCQlyZXR2YWwgPSBpYTMyX2NvcHlfcGFydGlhbF9wYWdlX2xpc3QocCwgY2xvbmVfZmxhZ3MpOworCQkJcmV0dmFsID0gaWEzMl9jb3B5X2lhNjRfcGFydGlhbF9wYWdlX2xpc3QocCwKKwkJCQkJCQkJY2xvbmVfZmxhZ3MpOwogCX0KICNlbmRpZgogCkBAIC03MjgsNyArNzI5LDcgQEAKIAlpYTY0X2Ryb3BfZnB1KGN1cnJlbnQpOwogI2lmZGVmIENPTkZJR19JQTMyX1NVUFBPUlQKIAlpZiAoSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkpIHsKLQkJaWEzMl9kcm9wX3BhcnRpYWxfcGFnZV9saXN0KGN1cnJlbnQpOworCQlpYTMyX2Ryb3BfaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdChjdXJyZW50KTsKIAkJY3VycmVudC0+dGhyZWFkLnRhc2tfc2l6ZSA9IElBMzJfUEFHRV9PRkZTRVQ7CiAJCXNldF9mcyhVU0VSX0RTKTsKIAl9CkBAIC03NTQsNyArNzU1LDcgQEAKIAkJcGZtX3JlbGVhc2VfZGVidWdfcmVnaXN0ZXJzKGN1cnJlbnQpOwogI2VuZGlmCiAJaWYgKElTX0lBMzJfUFJPQ0VTUyh0YXNrX3B0X3JlZ3MoY3VycmVudCkpKQotCQlpYTMyX2Ryb3BfcGFydGlhbF9wYWdlX2xpc3QoY3VycmVudCk7CisJCWlhMzJfZHJvcF9pYTY0X3BhcnRpYWxfcGFnZV9saXN0KGN1cnJlbnQpOwogfQogCiB1bnNpZ25lZCBsb25nCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggY2YwNmZlNzkuLjdjZWNkMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTQ5MSwxMiArNDkxLDE3IEBACiAJZWZpX2luaXQoKTsKIAlpb19wb3J0X2luaXQoKTsKIAotCXBhcnNlX2Vhcmx5X3BhcmFtKCk7Ci0KICNpZmRlZiBDT05GSUdfSUE2NF9HRU5FUklDCi0JbWFjaHZlY19pbml0KE5VTEwpOworCS8qIG1hY2h2ZWMgbmVlZHMgdG8gYmUgcGFyc2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZQorCSAqIGJlZm9yZSBwYXJzZV9lYXJseV9wYXJhbSgpIGlzIGNhbGxlZCB0byBlbnN1cmUKKwkgKiB0aGF0IGlhNjRfbXYgaXMgaW5pdGlhbGlzZWQgYmVmb3JlIGFueSBjb21tYW5kIGxpbmUKKwkgKiBzZXR0aW5ncyBtYXkgY2F1c2UgY29uc29sZSBzZXR1cCB0byBvY2N1cgorCSAqLworCW1hY2h2ZWNfaW5pdF9mcm9tX2NtZGxpbmUoKmNtZGxpbmVfcCk7CiAjZW5kaWYKIAorCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CisKIAlpZiAoZWFybHlfY29uc29sZV9zZXR1cCgqY21kbGluZV9wKSA9PSAwKQogCQltYXJrX2JzcF9vbmxpbmUoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKaW5kZXggOWY3MjgzOC4uMDk4Mjg4MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCkBAIC00NjgsNyArNDY4LDcgQEAKIAlzZW5kX0lQSV9hbGxidXRzZWxmKElQSV9DUFVfU1RPUCk7CiB9CiAKLWludCBfX2luaXQKK2ludAogc2V0dXBfcHJvZmlsaW5nX3RpbWVyICh1bnNpZ25lZCBpbnQgbXVsdGlwbGllcikKIHsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggOWY1YzkwYi4uNjIyMDlkYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCWludCBjcHU7CiB9OwogCi12b2lkCit2b2lkIF9fY3B1aW5pdAogZG9fZm9ya19pZGxlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY3JlYXRlX2lkbGUgKmNfaWRsZSA9CkBAIC00OTcsNyArNDk3LDcgQEAKIAljb21wbGV0ZSgmY19pZGxlLT5kb25lKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQKK3N0YXRpYyBpbnQgX19jcHVpbml0CiBkb19ib290X2NwdSAoaW50IHNhcGljaWQsIGludCBjcHUpCiB7CiAJaW50IHRpbWVvdXQ7CkBAIC04MDgsNyArODA4LDcgQEAKIAl9CiB9CiAKLWludCBfX2RldmluaXQKK2ludCBfX2NwdWluaXQKIF9fY3B1X3VwICh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCmluZGV4IDYyNzc4NWMuLjZjMGU5ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJpdGMiLAogICAgICAgICAucmF0aW5nICAgICAgICAgPSAzNTAsCiAgICAgICAgIC5yZWFkICAgICAgICAgICA9IGl0Y19nZXRfY3ljbGVzLAotICAgICAgICAubWFzayAgICAgICAgICAgPSAweGZmZmZmZmZmZmZmZmZmZmYsCisgICAgICAgIC5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAogICAgICAgICAubXVsdCAgICAgICAgICAgPSAwLCAvKnRvIGJlIGNhbHVjbGF0ZWQqLwogICAgICAgICAuc2hpZnQgICAgICAgICAgPSAxNiwKICAgICAgICAgLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCkBAIC0yNTUsNyArMjU1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBjeWNsZV90IGl0Y19nZXRfY3ljbGVzKCkKK3N0YXRpYyBjeWNsZV90IGl0Y19nZXRfY3ljbGVzKHZvaWQpCiB7CiAJdTY0IGxjeWNsZSwgbm93LCByZXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4NjBmMjUxLi44M2U4MDY3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC01MCw2ICs1MCw4IEBACiAJS1BST0JFU19URVhUCiAJKiguZ251LmxpbmtvbmNlLnQqKQogICAgIH0KKyAgLnRleHQuaGVhZCA6IEFUKEFERFIoLnRleHQuaGVhZCkgLSBMT0FEX09GRlNFVCkKKwl7ICooLnRleHQuaGVhZCkgfQogICAudGV4dDIgOiBBVChBRERSKC50ZXh0MikgLSBMT0FEX09GRlNFVCkKIAl7ICooLnRleHQyKSB9CiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggMDdkMGU5Mi4uNDg4ZTQ4YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9wY2kuYworKysgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCkBAIC01ODEsNyArNTgxLDcgQEAKIC8qCiAgKiBQQ0kgQklPUyBzZXR1cCwgYWx3YXlzIGRlZmF1bHRzIHRvIFNBTCBpbnRlcmZhY2UKICAqLwotY2hhciAqIF9faW5pdAorY2hhciAqIF9fZGV2aW5pdAogcGNpYmlvc19zZXR1cCAoY2hhciAqc3RyKQogewogCXJldHVybiBzdHI7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwppbmRleCA1N2E5MmVmLi42MmE1MTQyIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jCmluZGV4IDZiMmQ3N2QuLmZlNzNjOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMKQEAgLTQ1LDcgKzQ1LDggQEAKIAogc3RhdGljIHZvaWQgZW5kX21hcHBpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWVuYWJsZV9tYXBwaV9pcnEoaXJxKTsKKwlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfbWFwcGlfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9tYXBwaV9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTg4LDcgKzg5LDcgQEAKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQwXS5jaGlwID0gJm1hcHBpX2lycV90eXBlOwogCWlycV9kZXNjW00zMlJfSVJRX0lOVDBdLmFjdGlvbiA9IE5VTEw7CiAJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UMF0uZGVwdGggPSAxOwotCWljdV9kYXRhW00zMlJfSVJRX0lOVDBdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDEwOworCWljdV9kYXRhW00zMlJfSVJRX0lOVDBdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDExOwogCWRpc2FibGVfbWFwcGlfaXJxKE0zMlJfSVJRX0lOVDApOwogI2VuZGlmIC8qIENPTkZJR19NMzJSX05FMjAwMCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDNlYjMwNTkuLjlkYWU0MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3N5c19tMzJyLmMgYi9hcmNoL20zMnIva2VybmVsL3N5c19tMzJyLmMKaW5kZXggYmRhODU1NC4uYjEzZGJiZSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zeXNfbTMyci5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc3lzX20zMnIuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDk5ZmMxMjIuLjNlZTkxODYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzX202OGsuYwppbmRleCA5MDIzOGE4Li4zNmQ3OGNmIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3N5c19tNjhrLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zeXNfbTY4ay5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZyBiL2FyY2gvbTY4a25vbW11L0tjb25maWcKaW5kZXggMTE3NWNlZi4uMTg1OTA2YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZworKysgYi9hcmNoL202OGtub21tdS9LY29uZmlnCkBAIC0yMTYsNiArMjE2LDE4IEBACiAJaGVscAogCSAgU3VwcG9ydCB0aGUgYnVncyBvZiBYY29waWxvdC4KIAorY29uZmlnIFVDNTI3MgorICAgICAgICBib29sICdBcmN0dXJ1cyBOZXR3b3JrcyB1QzUyNzIgZGltbSBib2FyZCBzdXBwb3J0JworICAgICAgICBkZXBlbmRzIG9uIE01MjcyCisgICAgICAgIGhlbHAKKyAgICAgICAgICBTdXBwb3J0IGZvciB0aGUgQXJjdHVydXMgTmV0d29ya3MgdUM1MjcyIGRpbW0gYm9hcmQuCisKK2NvbmZpZyBVQzUyODIKKyAgICAgICBib29sICJBcmN0dXJ1cyBOZXR3b3JrcyB1QzUyODIgYm9hcmQgc3VwcG9ydCIKKyAgICAgICAgICBkZXBlbmRzIG9uIE01Mjh4CisgICAgICAgaGVscAorICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBBcmN0dXJ1cyBOZXR3b3JrcyB1QzUyODIgZGltbSBib2FyZC4KKwogY29uZmlnIFVDU0lNTQogCWJvb2wgInVDc2ltbSBtb2R1bGUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE02OEVaMzI4CkBAIC0zNDIsNiArMzU0LDE4IEBACiAJZGVwZW5kcyBvbiBNNTI4eAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBFTUFDLkluYyBTT001MjgyRU0gbW9kdWxlLiAgCisJICAKK2NvbmZpZyBXSUxERklSRQorCWJvb2wgIkludGVjIEF1dG9tYXRpb24gSW5jLiBXaWxkRmlyZSBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTTUyOHgKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgSW50ZWMgQXV0b21hdGlvbiBJbmMuIFdpbGRGaXJlLgorCSAgCitjb25maWcgV0lMREZJUkVNT0QKKwlib29sICJJbnRlYyBBdXRvbWF0aW9uIEluYy4gV2lsZEZpcmUgbW9kdWxlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNNTI4eAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBJbnRlYyBBdXRvbWF0aW9uIEluYy4gV2lsZEZpcmUgbW9kdWxlLgogCiBjb25maWcgQVJONTMwNwogCWJvb2wgIkFybmV3c2ggNTMwNyBib2FyZCBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvTWFrZWZpbGUgYi9hcmNoL202OGtub21tdS9NYWtlZmlsZQppbmRleCA4OTUxNzkzLi4xMzA1Y2M5IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9NYWtlZmlsZQorKysgYi9hcmNoL202OGtub21tdS9NYWtlZmlsZQpAQCAtMjYsNiArMjYsOCBAQAogUExBVEZPUk0gOj0gJChwbGF0Zm9ybS15KQogCiBib2FyZC0kKENPTkZJR19QSUxPVCkJCTo9IHBpbG90Citib2FyZC0kKENPTkZJR19VQzUyNzIpICAgICAgICAgIDo9IFVDNTI3MgorYm9hcmQtJChDT05GSUdfVUM1MjgyKSAgICAgICAgICA6PSBVQzUyODIKIGJvYXJkLSQoQ09ORklHX1VDU0lNTSkJCTo9IHVjc2ltbQogYm9hcmQtJChDT05GSUdfVUNESU1NKQkJOj0gdWNkaW1tCiBib2FyZC0kKENPTkZJR19VQ1FVSUNDKQkJOj0gdUNxdWljYwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL2RtYS5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2RtYS5jCmluZGV4IDBhMjU4NzRhLi5lMTBlYWZjIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvZG1hLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2RtYS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCmluZGV4IDIyMDNmNjkuLjNmODZhZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCkBAIC00Miw4ICs0Miw2IEBACiAKIGNoYXIgX19pbml0ZGF0YSBjb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCi12b2lkICgqbWFjaF90cmFwX2luaXQpKHZvaWQpOwotCiAvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KIHZvaWQgKCptYWNoX3NjaGVkX2luaXQpKGlycV9oYW5kbGVyX3QgaGFuZGxlcik7CiB2b2lkICgqbWFjaF90aWNrKSh2b2lkKTsKQEAgLTEzMiw2ICsxMzAsMTEgQEAKIAogCWNvbmZpZ19CU1AoJmNvbW1hbmRfbGluZVswXSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwogCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQorCXN0cm5jcHkoJmNvbW1hbmRfbGluZVswXSwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKKwljb21tYW5kX2xpbmVbc2l6ZW9mKGNvbW1hbmRfbGluZSkgLSAxXSA9IDA7CisjZW5kaWYKKwogCXByaW50ayhLRVJOX0lORk8gIlx4MEZcclxuXG51Q2xpbnV4LyIgQ1BVICJcbiIpOwogCiAjaWZkZWYgQ09ORklHX1VDRElNTQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIwNi9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyMDYvY29uZmlnLmMKaW5kZXggMzM0MzgzMC4uZDBmMmRjNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIwNi9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjA2L2NvbmZpZy5jCkBAIC0yOCw3ICsyOCw2IEBACiB2b2lkIGNvbGRmaXJlX3RpY2sodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3RpbWVyX2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKIHVuc2lnbmVkIGxvbmcgY29sZGZpcmVfdGltZXJfb2Zmc2V0KHZvaWQpOwotdm9pZCBjb2xkZmlyZV90cmFwX2luaXQodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3Jlc2V0KHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTgsMTggKzk3LDkgQEAKIHZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCiB7CiAJbWNmX3NldGltcihNQ0ZTSU1fSU1SX01BU0tBTEwpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCXN0cm5jcHkoY29tbWFuZHAsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLQljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbHNlCi0JbWVtc2V0KGNvbW1hbmRwLCAwLCBzaXplKTsKLSNlbmRpZgotCiAJbWFjaF9zY2hlZF9pbml0ID0gY29sZGZpcmVfdGltZXJfaW5pdDsKIAltYWNoX3RpY2sgPSBjb2xkZmlyZV90aWNrOwogCW1hY2hfZ2V0dGltZW9mZnNldCA9IGNvbGRmaXJlX3RpbWVyX29mZnNldDsKLQltYWNoX3RyYXBfaW5pdCA9IGNvbGRmaXJlX3RyYXBfaW5pdDsKIAltYWNoX3Jlc2V0ID0gY29sZGZpcmVfcmVzZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyMDZlL2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIwNmUvY29uZmlnLmMKaW5kZXggMGY2NzMyMC4uNGFiNjE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIwNmUvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIwNmUvY29uZmlnLmMKQEAgLTI3LDcgKzI3LDYgQEAKIHZvaWQgY29sZGZpcmVfdGljayh2b2lkKTsKIHZvaWQgY29sZGZpcmVfdGltZXJfaW5pdChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwogdW5zaWduZWQgbG9uZyBjb2xkZmlyZV90aW1lcl9vZmZzZXQodm9pZCk7Ci12b2lkIGNvbGRmaXJlX3RyYXBfaW5pdCh2b2lkKTsKIHZvaWQgY29sZGZpcmVfcmVzZXQodm9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05OCwyMSArOTcsMTUgQEAKIHsKIAltY2Zfc2V0aW1yKE1DRlNJTV9JTVJfTUFTS0FMTCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CT09UUEFSQU0pCi0Jc3RybmNweShjb21tYW5kcCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOwotCWNvbW1hbmRwW3NpemUtMV0gPSAwOwotI2VsaWYgZGVmaW5lZChDT05GSUdfTkVUdGVsKQorI2lmIGRlZmluZWQoQ09ORklHX05FVHRlbCkKIAkvKiBDb3B5IGNvbW1hbmQgbGluZSBmcm9tIEZMQVNIIHRvIGxvY2FsIGJ1ZmZlci4uLiAqLwogCW1lbWNweShjb21tYW5kcCwgKGNoYXIgKikgMHhmMDAwNDAwMCwgc2l6ZSk7CiAJY29tbWFuZHBbc2l6ZS0xXSA9IDA7Ci0jZWxzZQotCW1lbXNldChjb21tYW5kcCwgMCwgc2l6ZSk7CiAjZW5kaWYgLyogQ09ORklHX05FVHRlbCAqLwogCiAJbWFjaF9zY2hlZF9pbml0ID0gY29sZGZpcmVfdGltZXJfaW5pdDsKIAltYWNoX3RpY2sgPSBjb2xkZmlyZV90aWNrOwogCW1hY2hfZ2V0dGltZW9mZnNldCA9IGNvbGRmaXJlX3RpbWVyX29mZnNldDsKLQltYWNoX3RyYXBfaW5pdCA9IGNvbGRmaXJlX3RyYXBfaW5pdDsKIAltYWNoX3Jlc2V0ID0gY29sZGZpcmVfcmVzZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyMHgvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjB4L2NvbmZpZy5jCmluZGV4IDU4YjI4NzguLmEyYzk1YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyMHgvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIweC9jb25maWcuYwpAQCAtMzAsNyArMzAsNiBAQAogdm9pZCBjb2xkZmlyZV9waXRfdGljayh2b2lkKTsKIHZvaWQgY29sZGZpcmVfcGl0X2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKIHVuc2lnbmVkIGxvbmcgY29sZGZpcmVfcGl0X29mZnNldCh2b2lkKTsKLXZvaWQgY29sZGZpcmVfdHJhcF9pbml0KHZvaWQpOwogdm9pZCBjb2xkZmlyZV9yZXNldCh2b2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ4LDE3ICs0Nyw5IEBACiAKIHZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCiB7Ci0jaWZkZWYgQ09ORklHX0JPT1RQQVJBTQotICAgIHN0cm5jcHkoY29tbWFuZHAsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLSAgICBjb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbHNlCi0gICAgbWVtc2V0KGNvbW1hbmRwLCAwLCBzaXplKTsKLSNlbmRpZgotCiAgICAgbWFjaF9zY2hlZF9pbml0ID0gY29sZGZpcmVfcGl0X2luaXQ7CiAgICAgbWFjaF90aWNrID0gY29sZGZpcmVfcGl0X3RpY2s7CiAgICAgbWFjaF9nZXR0aW1lb2Zmc2V0ID0gY29sZGZpcmVfcGl0X29mZnNldDsKLSAgICBtYWNoX3RyYXBfaW5pdCA9IGNvbGRmaXJlX3RyYXBfaW5pdDsKICAgICBtYWNoX3Jlc2V0ID0gY29sZGZpcmVfcmVzZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjN4L2NvbmZpZy5jCmluZGV4IDliMDU0ZTYuLjBhM2FmMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyM3gvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTIzeC9jb25maWcuYwpAQCAtMjksNyArMjksNiBAQAogdm9pZCBjb2xkZmlyZV9waXRfdGljayh2b2lkKTsKIHZvaWQgY29sZGZpcmVfcGl0X2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKIHVuc2lnbmVkIGxvbmcgY29sZGZpcmVfcGl0X29mZnNldCh2b2lkKTsKLXZvaWQgY29sZGZpcmVfdHJhcF9pbml0KHZvaWQpOwogdm9pZCBjb2xkZmlyZV9yZXNldCh2b2lkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTYzLDE4ICs2Miw5IEBACiB2b2lkIGNvbmZpZ19CU1AoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQogewogCW1jZl9kaXNhYmxlYWxsKCk7Ci0KLSNpZmRlZiBDT05GSUdfQk9PVFBBUkFNCi0Jc3RybmNweShjb21tYW5kcCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOwotCWNvbW1hbmRwW3NpemUtMV0gPSAwOwotI2Vsc2UKLQltZW1zZXQoY29tbWFuZHAsIDAsIHNpemUpOwotI2VuZGlmCi0KIAltYWNoX3NjaGVkX2luaXQgPSBjb2xkZmlyZV9waXRfaW5pdDsKIAltYWNoX3RpY2sgPSBjb2xkZmlyZV9waXRfdGljazsKIAltYWNoX2dldHRpbWVvZmZzZXQgPSBjb2xkZmlyZV9waXRfb2Zmc2V0OwotCW1hY2hfdHJhcF9pbml0ID0gY29sZGZpcmVfdHJhcF9pbml0OwogCW1hY2hfcmVzZXQgPSBjb2xkZmlyZV9yZXNldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI0OS9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNDkvY29uZmlnLmMKaW5kZXggZDY3MDYwNy4uZGMyYzM2MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI0OS9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjQ5L2NvbmZpZy5jCkBAIC0yNyw3ICsyNyw2IEBACiB2b2lkIGNvbGRmaXJlX3RpY2sodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3RpbWVyX2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKIHVuc2lnbmVkIGxvbmcgY29sZGZpcmVfdGltZXJfb2Zmc2V0KHZvaWQpOwotdm9pZCBjb2xkZmlyZV90cmFwX2luaXQodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3Jlc2V0KHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTYsMTggKzk1LDkgQEAKIHZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCiB7CiAJbWNmX3NldGltcihNQ0ZTSU1fSU1SX01BU0tBTEwpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCXN0cm5jcHkoY29tbWFuZHAsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLQljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbHNlCi0JbWVtc2V0KGNvbW1hbmRwLCAwLCBzaXplKTsKLSNlbmRpZgotCiAJbWFjaF9zY2hlZF9pbml0ID0gY29sZGZpcmVfdGltZXJfaW5pdDsKIAltYWNoX3RpY2sgPSBjb2xkZmlyZV90aWNrOwogCW1hY2hfZ2V0dGltZW9mZnNldCA9IGNvbGRmaXJlX3RpbWVyX29mZnNldDsKLQltYWNoX3RyYXBfaW5pdCA9IGNvbGRmaXJlX3RyYXBfaW5pdDsKIAltYWNoX3Jlc2V0ID0gY29sZGZpcmVfcmVzZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNzIvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MjcyL2NvbmZpZy5jCmluZGV4IDZiNDM3Y2MuLjEzNjVhODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyNzIvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI3Mi9jb25maWcuYwpAQCAtMjgsNyArMjgsNiBAQAogdm9pZCBjb2xkZmlyZV90aWNrKHZvaWQpOwogdm9pZCBjb2xkZmlyZV90aW1lcl9pbml0KGlycV9oYW5kbGVyX3QgaGFuZGxlcik7CiB1bnNpZ25lZCBsb25nIGNvbGRmaXJlX3RpbWVyX29mZnNldCh2b2lkKTsKLXZvaWQgY29sZGZpcmVfdHJhcF9pbml0KHZvaWQpOwogdm9pZCBjb2xkZmlyZV9yZXNldCh2b2lkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBtY2ZfdGltZXJ2ZWN0b3I7CkBAIC0xMTMsMTAgKzExMiw3IEBACiAKIAltY2ZfZGlzYWJsZWFsbCgpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCXN0cm5jcHkoY29tbWFuZHAsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLQljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbGlmIGRlZmluZWQoQ09ORklHX05FVHRlbCkgfHwgZGVmaW5lZChDT05GSUdfU0NBTEVTKQorI2lmIGRlZmluZWQoQ09ORklHX05FVHRlbCkgfHwgZGVmaW5lZChDT05GSUdfU0NBTEVTKQogCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCiAJbWVtY3B5KGNvbW1hbmRwLCAoY2hhciAqKSAweGYwMDA0MDAwLCBzaXplKTsKIAljb21tYW5kcFtzaXplLTFdID0gMDsKQEAgLTEyOCw4ICsxMjQsNiBAQAogCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCiAJbWVtY3B5KGNvbW1hbmRwLCAoY2hhciAqKSAweGYwMDEwMDAwLCBzaXplKTsKIAljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbHNlCi0JbWVtc2V0KGNvbW1hbmRwLCAwLCBzaXplKTsKICNlbmRpZgogCiAJbWNmX3RpbWVydmVjdG9yID0gNjk7CkBAIC0xMzcsNyArMTMxLDYgQEAKIAltYWNoX3NjaGVkX2luaXQgPSBjb2xkZmlyZV90aW1lcl9pbml0OwogCW1hY2hfdGljayA9IGNvbGRmaXJlX3RpY2s7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ID0gY29sZGZpcmVfdGltZXJfb2Zmc2V0OwotCW1hY2hfdHJhcF9pbml0ID0gY29sZGZpcmVfdHJhcF9pbml0OwogCW1hY2hfcmVzZXQgPSBjb2xkZmlyZV9yZXNldDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI3eC9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyN3gvY29uZmlnLmMKaW5kZXggMjhlN2Q5Ni4uMWI4MjA0NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI3eC9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjd4L2NvbmZpZy5jCkBAIC0yOSw3ICsyOSw2IEBACiB2b2lkIGNvbGRmaXJlX3BpdF90aWNrKHZvaWQpOwogdm9pZCBjb2xkZmlyZV9waXRfaW5pdChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwogdW5zaWduZWQgbG9uZyBjb2xkZmlyZV9waXRfb2Zmc2V0KHZvaWQpOwotdm9pZCBjb2xkZmlyZV90cmFwX2luaXQodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3Jlc2V0KHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjMsMTggKzYyLDkgQEAKIHZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCiB7CiAJbWNmX2Rpc2FibGVhbGwoKTsKLQotI2lmZGVmIENPTkZJR19CT09UUEFSQU0KLQlzdHJuY3B5KGNvbW1hbmRwLCBDT05GSUdfQk9PVFBBUkFNX1NUUklORywgc2l6ZSk7Ci0JY29tbWFuZHBbc2l6ZS0xXSA9IDA7Ci0jZWxzZQotCW1lbXNldChjb21tYW5kcCwgMCwgc2l6ZSk7Ci0jZW5kaWYKLQogCW1hY2hfc2NoZWRfaW5pdCA9IGNvbGRmaXJlX3BpdF9pbml0OwogCW1hY2hfdGljayA9IGNvbGRmaXJlX3BpdF90aWNrOwogCW1hY2hfZ2V0dGltZW9mZnNldCA9IGNvbGRmaXJlX3BpdF9vZmZzZXQ7Ci0JbWFjaF90cmFwX2luaXQgPSBjb2xkZmlyZV90cmFwX2luaXQ7CiAJbWFjaF9yZXNldCA9IGNvbGRmaXJlX3Jlc2V0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjh4L2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTI4eC9jb25maWcuYwppbmRleCA4MDViNGY3Li5hMDg5ZTk1IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81Mjh4L2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUyOHgvY29uZmlnLmMKQEAgLTI5LDcgKzI5LDYgQEAKIHZvaWQgY29sZGZpcmVfcGl0X3RpY2sodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3BpdF9pbml0KGlycV9oYW5kbGVyX3QgaGFuZGxlcik7CiB1bnNpZ25lZCBsb25nIGNvbGRmaXJlX3BpdF9vZmZzZXQodm9pZCk7Ci12b2lkIGNvbGRmaXJlX3RyYXBfaW5pdCh2b2lkKTsKIHZvaWQgY29sZGZpcmVfcmVzZXQodm9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MywxOCArNjIsOSBAQAogdm9pZCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKIHsKIAltY2ZfZGlzYWJsZWFsbCgpOwotCi0jaWZkZWYgQ09ORklHX0JPT1RQQVJBTQotCXN0cm5jcHkoY29tbWFuZHAsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLQljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbHNlCi0JbWVtc2V0KGNvbW1hbmRwLCAwLCBzaXplKTsKLSNlbmRpZgotCiAJbWFjaF9zY2hlZF9pbml0ID0gY29sZGZpcmVfcGl0X2luaXQ7CiAJbWFjaF90aWNrID0gY29sZGZpcmVfcGl0X3RpY2s7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ID0gY29sZGZpcmVfcGl0X29mZnNldDsKLQltYWNoX3RyYXBfaW5pdCA9IGNvbGRmaXJlX3RyYXBfaW5pdDsKIAltYWNoX3Jlc2V0ID0gY29sZGZpcmVfcmVzZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2NvbmZpZy5jCmluZGV4IGUwNGI4NGQuLmUzNDYxNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9jb25maWcuYwpAQCAtMjksNyArMjksNiBAQAogdm9pZCBjb2xkZmlyZV90aWNrKHZvaWQpOwogdm9pZCBjb2xkZmlyZV90aW1lcl9pbml0KGlycV9oYW5kbGVyX3QgaGFuZGxlcik7CiB1bnNpZ25lZCBsb25nIGNvbGRmaXJlX3RpbWVyX29mZnNldCh2b2lkKTsKLXZvaWQgY29sZGZpcmVfdHJhcF9pbml0KHZvaWQpOwogdm9pZCBjb2xkZmlyZV9yZXNldCh2b2lkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBtY2ZfdGltZXJ2ZWN0b3I7CkBAIC0xMTEsMTAgKzExMCw3IEBACiB7CiAJbWNmX3NldGltcihNQ0ZTSU1fSU1SX01BU0tBTEwpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCXN0cm5jcHkoY29tbWFuZHAsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBzaXplKTsKLQljb21tYW5kcFtzaXplLTFdID0gMDsKLSNlbGlmIGRlZmluZWQoQ09ORklHX05FVHRlbCkgfHwgZGVmaW5lZChDT05GSUdfZUxJQSkgfHwgXAorI2lmIGRlZmluZWQoQ09ORklHX05FVHRlbCkgfHwgZGVmaW5lZChDT05GSUdfZUxJQSkgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfRElTS3RlbCkgfHwgZGVmaW5lZChDT05GSUdfU0VDVVJFRURHRU1QMykgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ0xFT1BBVFJBKQogCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCkBAIC0xMjQsMTQgKzEyMCwxMSBAQAogCW1jZl90aW1lcnZlY3RvciA9IDMwOwogCW1jZl9wcm9maWxldmVjdG9yID0gMzE7CiAJbWNmX3RpbWVybGV2ZWwgPSA2OwotI2Vsc2UKLQltZW1zZXQoY29tbWFuZHAsIDAsIHNpemUpOwogI2VuZGlmCiAKIAltYWNoX3NjaGVkX2luaXQgPSBjb2xkZmlyZV90aW1lcl9pbml0OwogCW1hY2hfdGljayA9IGNvbGRmaXJlX3RpY2s7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ID0gY29sZGZpcmVfdGltZXJfb2Zmc2V0OwotCW1hY2hfdHJhcF9pbml0ID0gY29sZGZpcmVfdHJhcF9pbml0OwogCW1hY2hfcmVzZXQgPSBjb2xkZmlyZV9yZXNldDsKIAogI2lmZGVmIE1DRl9CRE1fRElTQUJMRQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9lbnRyeS5TCmluZGV4IGMzNThhZWIuLmE4Y2Q4NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2VudHJ5LlMKQEAgLTIxMywxNiArMjEzLDEyIEBACiAgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgcHJldiAodGhlIGN1cnJlbnQgdGFzaykgaXMKICAqIGluIGEwLCBuZXh0ICh0aGUgbmV3IHRhc2spIGlzIGluIGExLHNvIGRvbid0IGNoYW5nZSB0aGVzZQogICogcmVnaXN0ZXJzIHVudGlsIHRoZWlyIGNvbnRlbnRzIGFyZSBubyBsb25nZXIgbmVlZGVkLgorICogVGhpcyBpcyBhbHdheXMgY2FsbGVkIGluIHN1cGVydmlzb3IgbW9kZSwgc28gZG9uJ3QgYm90aGVyIHRvIHNhdmUKKyAqIGFuZCByZXN0b3JlIHNyOyB1c2VyJ3MgcHJvY2VzcyBzciBpcyBhY3R1YWxseSBpbiB0aGUgc3RhY2suCiAgKi8KIEVOVFJZKHJlc3VtZSkKIAltb3ZlbAklYTAsICVkMQkJCS8qIGdldCBwcmV2IHRocmVhZCBpbiBkMSAqLwogCi0JbW92ZXcJJXNyLCVkMAkJCQkvKiBzYXZlIHRocmVhZCBzdGF0dXMgcmVnICovCi0JbW92ZXcJJWQwLCVhMEAoVEFTS19USFJFQUQrVEhSRUFEX1NSKQotCi0Jb3JpbAkjMHg3MDAsJWQwCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JbW92ZQklZDAsJXNyCi0KIAltb3ZlbAlzd191c3AsJWQwCQkJLyogc2F2ZSB1c3AgKi8KIAltb3ZlbAklZDAsJWEwQChUQVNLX1RIUkVBRCtUSFJFQURfVVNQKQogCkBAIC0yMzMsNyArMjI5LDQgQEAKIAogCW1vdmVsCSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX1VTUCksJWEwIC8qIHJlc3RvcmUgdGhyZWFkIHVzZXIgc3RhY2sgKi8KIAltb3ZlbAklYTAsIHN3X3VzcAotCi0JbW92ZXcJJWExQChUQVNLX1RIUkVBRCtUSFJFQURfU1IpLCVkMAkvKiByZXN0b3JlIHRocmVhZCBzdGF0dXMgcmVnICovCi0JbW92ZXcJJWQwLCAlc3IKIAlydHMKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvcGl0LmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L3BpdC5jCmluZGV4IGFhMTViZWUuLmU1M2M0NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvcGl0LmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9waXQuYwpAQCAtNSw5ICs1LDggQEAKICAqCSAgICAgICAgIGhhcmR3YXJlIHRpbWVyIG9ubHkgZXhpc3RzIGluIHRoZSBGcmVlc2NhbGUgQ29sZEZpcmUKICAqCQkgNTI3MC81MjcxLCA1MjgyIGFuZCBvdGhlciBDUFVzLgogICoKLSAqCUNvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQorICoJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCiAgKglDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCwgU25hcEdlYXIgSW5jLiAod3d3LnNuYXBnZWFyLmNvbSkKLSAqCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE3LDggKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL21jZnBpdC5oPgogI2luY2x1ZGUgPGFzbS9tY2ZzaW0uaD4KQEAgLTQzLDEzICs0MiwxOCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjb2xkZmlyZV9waXRfaXJxID0geworCS5uYW1lICAgID0gInRpbWVyIiwKKwkuZmxhZ3MgICA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSLAorfTsKKwogdm9pZCBjb2xkZmlyZV9waXRfaW5pdChpcnFfaGFuZGxlcl90IGhhbmRsZXIpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqaWNycDsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICppbXJwOwogCi0JcmVxdWVzdF9pcnEoTUNGSU5UX1ZFQ0JBU0UgKyBNQ0ZJTlRfUElUMSwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKLQkJIkNvbGRGaXJlIFRpbWVyIiwgTlVMTCk7CisJY29sZGZpcmVfcGl0X2lycS5oYW5kbGVyID0gaGFuZGxlcjsKKwlzZXR1cF9pcnEoTUNGSU5UX1ZFQ0JBU0UgKyBNQ0ZJTlRfUElUMSwgJmNvbGRmaXJlX3BpdF9pcnEpOwogCiAJaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChNQ0ZfSVBTQkFSICsgTUNGSUNNX0lOVEMwICsKIAkJTUNGSU5UQ19JQ1IwICsgTUNGSU5UX1BJVDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy90aW1lcnMuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvdGltZXJzLmMKaW5kZXggZmI2NmVhZC4uNjRiZDBmZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy90aW1lcnMuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L3RpbWVycy5jCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqCXRpbWVycy5jIC0tIGdlbmVyaWMgQ29sZEZpcmUgaGFyZHdhcmUgdGltZXIgc3VwcG9ydC4KICAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiwgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgMTk5OS0yMDA3LCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CkBAIC02MiwxNyArNjIsMjQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY29sZGZpcmVfdGltZXJfaXJxID0geworICAgICAgICAubmFtZSAgICA9ICJ0aW1lciIsCisgICAgICAgIC5mbGFncyAgID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCit9OworCiBzdGF0aWMgaW50IHRpY2tzX3Blcl9pbnRyOwogCiB2b2lkIGNvbGRmaXJlX3RpbWVyX2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKQogeworCWNvbGRmaXJlX3RpbWVyX2lycS5oYW5kbGVyID0gaGFuZGxlcjsKKwlzZXR1cF9pcnEobWNmX3RpbWVydmVjdG9yLCAmY29sZGZpcmVfdGltZXJfaXJxKTsKKwogCV9fcmF3X3dyaXRldyhNQ0ZUSU1FUl9UTVJfRElTQUJMRSwgVEEoTUNGVElNRVJfVE1SKSk7CiAJdGlja3NfcGVyX2ludHIgPSAoTUNGX0JVU0NMSyAvIDE2KSAvIEhaOwogCV9fcmF3X3dyaXRldHJyKHRpY2tzX3Blcl9pbnRyIC0gMSwgVEEoTUNGVElNRVJfVFJSKSk7CiAJX19yYXdfd3JpdGV3KE1DRlRJTUVSX1RNUl9FTk9SSSB8IE1DRlRJTUVSX1RNUl9DTEsxNiB8CiAJCU1DRlRJTUVSX1RNUl9SRVNUQVJUIHwgTUNGVElNRVJfVE1SX0VOQUJMRSwgVEEoTUNGVElNRVJfVE1SKSk7CiAKLQlyZXF1ZXN0X2lycShtY2ZfdGltZXJ2ZWN0b3IsIGhhbmRsZXIsIElSUUZfRElTQUJMRUQsICJ0aW1lciIsIE5VTEwpOwogCW1jZl9zZXR0aW1lcmljcigxLCBtY2ZfdGltZXJsZXZlbCk7CiAKICNpZmRlZiBDT05GSUdfSElHSFBST0ZJTEUKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMngvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzJ4L2NvbmZpZy5jCmluZGV4IDY2NGMzYTEyLi5iMzJjNjQyIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzJ4L2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMngvY29uZmlnLmMKQEAgLTM3LDcgKzM3LDYgQEAKIHZvaWQgY29sZGZpcmVfdGljayh2b2lkKTsKIHZvaWQgY29sZGZpcmVfdGltZXJfaW5pdChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwogdW5zaWduZWQgbG9uZyBjb2xkZmlyZV90aW1lcl9vZmZzZXQodm9pZCk7Ci12b2lkIGNvbGRmaXJlX3RyYXBfaW5pdCh2b2lkKTsKIHZvaWQgY29sZGZpcmVfcmVzZXQodm9pZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgbWNmX3RpbWVydmVjdG9yOwpAQCAtOTIsMTAgKzkxLDcgQEAKIHsKIAltY2Zfc2V0aW1yKE1DRlNJTV9JTVJfTUFTS0FMTCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CT09UUEFSQU0pCi0Jc3RybmNweShjb21tYW5kcCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOwotCWNvbW1hbmRwW3NpemUtMV0gPSAwOwotI2Vsc2UKKyNpZiAhZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQogCS8qIENvcHkgY29tbWFuZCBsaW5lIGZyb20gRkxBU0ggdG8gbG9jYWwgYnVmZmVyLi4uICovCiAJbWVtY3B5KGNvbW1hbmRwLCAoY2hhciAqKSAweDQwMDAsIDQpOwogCWlmKHN0cm5jbXAoY29tbWFuZHAsICJrY2wgIiwgNCkgPT0gMCl7CkBAIC0xMTEsNyArMTA3LDYgQEAKIAltYWNoX3NjaGVkX2luaXQgPSBjb2xkZmlyZV90aW1lcl9pbml0OwogCW1hY2hfdGljayA9IGNvbGRmaXJlX3RpY2s7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ID0gY29sZGZpcmVfdGltZXJfb2Zmc2V0OwotCW1hY2hfdHJhcF9pbml0ID0gY29sZGZpcmVfdHJhcF9pbml0OwogCW1hY2hfcmVzZXQgPSBjb2xkZmlyZV9yZXNldDsKIAogI2lmZGVmIE1DRl9CRE1fRElTQUJMRQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTQwNy9jb25maWcuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzU0MDcvY29uZmlnLmMKaW5kZXggMDM2ZjYyOC4uZTY5MjUzNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTQwNy9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81NDA3L2NvbmZpZy5jCkBAIC0yOCw3ICsyOCw2IEBACiB2b2lkIGNvbGRmaXJlX3RpY2sodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3RpbWVyX2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKIHVuc2lnbmVkIGxvbmcgY29sZGZpcmVfdGltZXJfb2Zmc2V0KHZvaWQpOwotdm9pZCBjb2xkZmlyZV90cmFwX2luaXQodm9pZCk7CiB2b2lkIGNvbGRmaXJlX3Jlc2V0KHZvaWQpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IG1jZl90aW1lcnZlY3RvcjsKQEAgLTEwMiwxMyArMTAxLDYgQEAKIHsKIAltY2Zfc2V0aW1yKE1DRlNJTV9JTVJfTUFTS0FMTCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CT09UUEFSQU0pCi0Jc3RybmNweShjb21tYW5kcCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOwotCWNvbW1hbmRwW3NpemUtMV0gPSAwOwotI2Vsc2UKLQltZW1zZXQoY29tbWFuZHAsIDAsIHNpemUpOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19DTEVPUEFUUkEpCiAJLyogRGlmZmVyZW50IHRpbWVyIHNldHVwIC0gdG8gcHJldmVudCBkZXZpY2UgY2xhc2ggKi8KIAltY2ZfdGltZXJ2ZWN0b3IgPSAzMDsKQEAgLTExOSw3ICsxMTEsNiBAQAogCW1hY2hfc2NoZWRfaW5pdCA9IGNvbGRmaXJlX3RpbWVyX2luaXQ7CiAJbWFjaF90aWNrID0gY29sZGZpcmVfdGljazsKIAltYWNoX2dldHRpbWVvZmZzZXQgPSBjb2xkZmlyZV90aW1lcl9vZmZzZXQ7Ci0JbWFjaF90cmFwX2luaXQgPSBjb2xkZmlyZV90cmFwX2luaXQ7CiAJbWFjaF9yZXNldCA9IGNvbGRmaXJlX3Jlc2V0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L3RpbWVycy5jCmluZGV4IGVmMDY3ZjQuLjAzOTY0NzZmIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYwpAQCAtMTgsMTAgKzE4LDEwIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vTUM2OFZaMzI4Lmg+CiAKQEAgLTUzLDE0ICs1MywxOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtNjgzMjhfdGltZXJfaXJxID0geworCS5uYW1lICAgID0gInRpbWVyIiwKKwkuZmxhZ3MgICA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSLAorfTsKKwogdm9pZCBtNjgzMjhfdGltZXJfaW5pdChpcnFfaGFuZGxlcl90IHRpbWVyX3JvdXRpbmUpCiB7CiAJLyogZGlzYWJsZSB0aW1lciAxICovCiAJVENUTCA9IDA7CiAKIAkvKiBzZXQgSVNSICovCi0JaWYgKHJlcXVlc3RfaXJxKFRNUl9JUlFfTlVNLCB0aW1lcl9yb3V0aW5lLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIE5VTEwpKSAKLQkJcGFuaWMoIlVuYWJsZSB0byBhdHRhY2ggdGltZXIgaW50ZXJydXB0XG4iKTsKKwltNjgzMjhfdGltZXJfaXJxLmhhbmRsZXIgPSB0aW1lcl9yb3V0aW5lOworCXNldHVwX2lycShUTVJfSVJRX05VTSwgJm02ODMyOF90aW1lcl9pcnEpOwogCiAJLyogUmVzdGFydCBtb2RlLCBFbmFibGUgaW50LCBTZXQgY2xvY2sgc291cmNlICovCiAJVENUTCA9IFRDVExfT00gfCBUQ1RMX0lSUUVOIHwgQ0xPQ0tfU09VUkNFOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9jb25maWcuYwppbmRleCA0ZmYxM2JkLi4xNTViNzJmIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9jb25maWcuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9jb25maWcuYwpAQCAtMTcsMTEgKzE3LDExIEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL202ODM2MC5oPgogCkBAIC01MSwxMSArNTEsMTUgQEAKIAogZXh0ZXJuIHZvaWQgY29uZmlnX002ODM2MF9pcnEodm9pZCk7CiAKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG02ODM2MF90aW1lcl9pcnEgPSB7CisJLm5hbWUgICAgPSAidGltZXIiLAorCS5mbGFncyAgID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCit9OworCiB2b2lkIEJTUF9zY2hlZF9pbml0KGlycV9oYW5kbGVyX3QgdGltZXJfcm91dGluZSkKIHsKICAgdW5zaWduZWQgY2hhciBwcmVzY2FsZXI7CiAgIHVuc2lnbmVkIHNob3J0IHRnY3Jfc2F2ZTsKLSAgaW50IHJldHVybl92YWx1ZTsKIAogI2lmIDAKICAgLyogUmVzdGFydCBtb2RlLCBFbmFibGUgaW50LCAzMktIeiwgRW5hYmxlIHRpbWVyICovCkBAIC04NiwxMCArOTAsOCBAQAogICBwcXVpY2MtPnRpbWVyX3RlcjEgPSAweDAwMDM7IC8qIGNsZWFyIHRpbWVyIGV2ZW50cyAqLwogCiAgIC8qIGVuYWJsZSB0aW1lciAxIGludGVycnVwdCBpbiBDSU1SICovCi0vLyAgcmVxdWVzdF9pcnEoSVJRX01BQ0hTUEVDIHwgQ1BNVkVDX1RJTUVSMSwgdGltZXJfcm91dGluZSwgSVJRX0ZMR19MT0NLLCAidGltZXIiLCBOVUxMKTsKLSAgLy9yZXR1cm5fdmFsdWUgPSByZXF1ZXN0X2lycSggQ1BNVkVDX1RJTUVSMSwgdGltZXJfcm91dGluZSwgSVJRX0ZMR19MT0NLLCAidGltZXIiLCBOVUxMKTsKLSAgcmV0dXJuX3ZhbHVlID0gcmVxdWVzdF9pcnEoQ1BNVkVDX1RJTUVSMSAsIHRpbWVyX3JvdXRpbmUsIElSUV9GTEdfTE9DSywKLSAgICAgICAgICAiVGltZXIiLCBOVUxMKTsKKyAgbTY4MzYwX3RpbWVyX2lycS5oYW5kbGVyID0gdGltZXJfcm91dGluZTsKKyAgc2V0dXBfaXJxKENQTVZFQ19USU1FUjEsICZtNjgzNjBfdGltZXJfaXJxKTsKIAogICAvKiBTdGFydCB0aW1lciAxOiAqLwogICB0Z2NyX3NhdmUgPSAocHF1aWNjLT50aW1lcl90Z2NyICYgMHhmZmYwKSB8IDB4MDAwMTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvY29uZmlnLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82OFZaMzI4L2NvbmZpZy5jCmluZGV4IDhhYmUwZjYuLjc5ZGNlZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4VlozMjgvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjhWWjMyOC9jb25maWcuYwpAQCAtMTkxLDEzICsxOTEsNiBAQAogewogCXByaW50ayhLRVJOX0lORk8gIjY4VlozMjggRHJhZ29uQmFsbFZaIHN1cHBvcnQgKGMpIDIwMDEgTGluZW8sIEluYy5cbiIpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQotCXN0cm5jcHkoY29tbWFuZCwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIHNpemUpOwotCWNvbW1hbmRbc2l6ZS0xXSA9IDA7Ci0jZWxzZQotCW1lbXNldChjb21tYW5kLCAwLCBzaXplKTsKLSNlbmRpZgotCiAJaW5pdF9oYXJkd2FyZShjb21tYW5kLCBzaXplKTsKIAogCW1hY2hfc2NoZWRfaW5pdCA9ICh2b2lkICopIG02ODMyOF90aW1lcl9pbml0OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IDIwZDE5YzkuLmE5YTk4N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTMyOCw3ICszMjgsNyBAQAogIyBNSVBTIFNJTQogIwogY29yZS0kKENPTkZJR19NSVBTX1NJTSkJCSs9IGFyY2gvbWlwcy9taXBzc2ltLwotY2ZsYWdzLSQoQ09ORklHX01JUFNfU0lNKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1zaW0KK2NmbGFncy0kKENPTkZJR19NSVBTX1NJTSkJKz0gLUlpbmNsdWRlL2FzbS1taXBzL21hY2gtbWlwc3NpbQogbG9hZC0kKENPTkZJR19NSVBTX1NJTSkJCSs9IDB4ODAxMDAwMDAKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FyYy9jb25zb2xlLmMgYi9hcmNoL21pcHMvYXJjL2NvbnNvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlNjAzMi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYXJjL2NvbnNvbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBzZ2kuY29tKQotICogQ29tcGFiaWxpdHkgd2l0aCBib2FyZCBjYWNoZXMsIFVsZiBDYXJsc3NvbgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8YXNtL3NnaWFsaWIuaD4KLSNpbmNsdWRlIDxhc20vYmNhY2hlLmg+Ci0KLS8qCi0gKiBJUDIyIGJvYXJkY2FjaGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBib2FyZCBjYWNoZXMuICBUaHVzIHdlIGRpc2FibGUgaXQKLSAqIGR1cmluZyByb212ZWMgYWN0aW9uLiAgU2luY2UgcjR4eDAuYyBpcyBhbHdheXMgY29tcGlsZWQgYW5kIGxpbmtlZCB3aXRoIHlvdXIKLSAqIGtlcm5lbCwgdGhpcyBzaG91bGRuJ3QgY2F1c2UgYW55IGhhcm0gcmVnYXJkbGVzcyB3aGF0IE1JUFMgcHJvY2Vzc29yIHlvdQotICogaGF2ZS4KLSAqCi0gKiBUaGUgQVJDIHdyaXRlIGFuZCByZWFkIGZ1bmN0aW9ucyBzZWVtIHRvIGludGVyZmVyZSB3aXRoIHRoZSBzZXJpYWwgbGluZXMKLSAqIGluIHNvbWUgd2F5LiBZb3Ugc2hvdWxkIGJlIGNhcmVmdWwgd2l0aCB0aGVtLgotICovCi0KLXZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgYykKLXsKLQlVTE9ORyBjbnQ7Ci0JQ0hBUiBpdCA9IGM7Ci0KLQliY19kaXNhYmxlKCk7Ci0JQXJjV3JpdGUoMSwgJml0LCAxLCAmY250KTsKLQliY19lbmFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qYXp6L2lvLmMgYi9hcmNoL21pcHMvamF6ei9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODY5MDQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9qYXp6L2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIExvdyBsZXZlbCBJL08gZnVuY3Rpb25zIGZvciBKYXp6IGZhbWlseSBtYWNoaW5lcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgYnkgUmFsZiBCYWVjaGxlLgotICovCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9qYXp6Lmg+Ci0KLS8qCi0gKiBNYXAgYW4gMTZtYiBzZWdtZW50IG9mIHRoZSBFSVNBIGFkZHJlc3Mgc3BhY2UgdG8gMHhlMzAwMDAwMDsKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIG1hcF9laXNhX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotICAvKiBYWFggKi8KLSAgLyogV2UndmUgZ290IGFuIHdpcmVkIGVudHJ5IGluIHRoZSBUTEIuICBXZSBqdXN0IG5lZWQgdG8gbW9kaWZ5IGl0LgotICAgICBmYXN0IGFuZCBjbGVhbi4gIEJ1dCBzaW5jZSB3ZSB3YW50IHRvIGdldCByaWQgb2Ygd2lyZWQgZW50cmllcwotICAgICB0aGluZ3MgYXJlIGEgbGl0dGxlIGJpdCBtb3JlIGNvbXBsaWNhdGVkIC4uLiAqLwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBqYXp6X3JlYWRiKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1bnNpZ25lZCBjaGFyIHJlczsKLQotCW1hcF9laXNhX2FkZHJlc3MoYWRkcik7Ci0JYWRkciAmPSAweGZmZmZmZjsKLQlyZXMgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEpBWlpfRUlTQV9CQVNFICsgYWRkcik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgamF6el9yZWFkdyh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdW5zaWduZWQgc2hvcnQgcmVzOwotCi0JbWFwX2Vpc2FfYWRkcmVzcyhhZGRyKTsKLQlhZGRyICY9IDB4ZmZmZmZmOwotCXJlcyA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoSkFaWl9FSVNBX0JBU0UgKyBhZGRyKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgamF6el9yZWFkbCh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdW5zaWduZWQgaW50IHJlczsKLQotCW1hcF9laXNhX2FkZHJlc3MoYWRkcik7Ci0JYWRkciAmPSAweGZmZmZmZjsKLQlyZXMgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEpBWlpfRUlTQV9CQVNFICsgYWRkcik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCBqYXp6X3dyaXRlYih1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCW1hcF9laXNhX2FkZHJlc3MoYWRkcik7Ci0JYWRkciAmPSAweGZmZmZmZjsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEpBWlpfRUlTQV9CQVNFICsgYWRkcikgPSB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGphenpfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCW1hcF9laXNhX2FkZHJlc3MoYWRkcik7Ci0JYWRkciAmPSAweGZmZmZmZjsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKEpBWlpfRUlTQV9CQVNFICsgYWRkcikgPSB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGphenpfd3JpdGVsKHVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQltYXBfZWlzYV9hZGRyZXNzKGFkZHIpOwotCWFkZHIgJj0gMHhmZmZmZmY7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChKQVpaX0VJU0FfQkFTRSArIGFkZHIpID0gdmFsOwotfQotCi1zdGF0aWMgdm9pZCBqYXp6X21lbXNldF9pbyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCB2YWwsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgd2FkZHI7Ci0KLQl3YWRkciA9IEpBWlpfRUlTQV9CQVNFIHwgKGFkZHIgJiAweGZmZmZmZik7Ci0Jd2hpbGUobGVuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZnJhZ2xlbjsKLQotCQlmcmFnbGVuID0gKH5hZGRyICsgMSkgJiAweGZmZmZmZjsKLQkJZnJhZ2xlbiA9IChmcmFnbGVuIDwgbGVuKSA/IGZyYWdsZW4gOiBsZW47Ci0JCW1hcF9laXNhX2FkZHJlc3MoYWRkcik7Ci0JCW1lbXNldCgoY2hhciAqKXdhZGRyLCB2YWwsIGZyYWdsZW4pOwotCQlhZGRyICs9IGZyYWdsZW47Ci0JCXdhZGRyID0gd2FkZHIgKyBmcmFnbGVuIC0gMHgxMDAwMDAwOwotCQlsZW4gLT0gZnJhZ2xlbjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGphenpfbWVtY3B5X2Zyb21pbyh1bnNpZ25lZCBsb25nIHRvLCB1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgd2FkZHI7Ci0KLQl3YWRkciA9IEpBWlpfRUlTQV9CQVNFIHwgKGZyb20gJiAweGZmZmZmZik7Ci0Jd2hpbGUobGVuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZnJhZ2xlbjsKLQotCQlmcmFnbGVuID0gKH5mcm9tICsgMSkgJiAweGZmZmZmZjsKLQkJZnJhZ2xlbiA9IChmcmFnbGVuIDwgbGVuKSA/IGZyYWdsZW4gOiBsZW47Ci0JCW1hcF9laXNhX2FkZHJlc3MoZnJvbSk7Ci0JCW1lbWNweSgodm9pZCAqKXRvLCAodm9pZCAqKXdhZGRyLCBmcmFnbGVuKTsKLQkJdG8gKz0gZnJhZ2xlbjsKLQkJZnJvbSArPSBmcmFnbGVuOwotCQl3YWRkciA9IHdhZGRyICsgZnJhZ2xlbiAtIDB4MTAwMDAwMDsKLQkJbGVuIC09IGZyYWdsZW47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBqYXp6X21lbWNweV90b2lvKHVuc2lnbmVkIGxvbmcgdG8sIHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyB3YWRkcjsKLQotCXdhZGRyID0gSkFaWl9FSVNBX0JBU0UgfCAodG8gJiAweGZmZmZmZik7Ci0Jd2hpbGUobGVuKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZnJhZ2xlbjsKLQotCQlmcmFnbGVuID0gKH50byArIDEpICYgMHhmZmZmZmY7Ci0JCWZyYWdsZW4gPSAoZnJhZ2xlbiA8IGxlbikgPyBmcmFnbGVuIDogbGVuOwotCQltYXBfZWlzYV9hZGRyZXNzKHRvKTsKLQkJbWVtY3B5KChjaGFyICopdG8gKyBKQVpaX0VJU0FfQkFTRSwgKHZvaWQgKilmcm9tLCBmcmFnbGVuKTsKLQkJdG8gKz0gZnJhZ2xlbjsKLQkJZnJvbSArPSBmcmFnbGVuOwotCQl3YWRkciA9IHdhZGRyICsgZnJhZ2xlbiAtIDB4MTAwMDAwMDsKLQkJbGVuIC09IGZyYWdsZW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2phenovcmVzZXQuYyBiL2FyY2gvbWlwcy9qYXp6L3Jlc2V0LmMKaW5kZXggMmE5NzU0Ny4uZDhhZGU4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2phenovcmVzZXQuYworKysgYi9hcmNoL21pcHMvamF6ei9yZXNldC5jCkBAIC02LDEwICs2LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxhc20vamF6ei5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAKICNkZWZpbmUgS0JEX1NUQVRfSUJGCQkweDAyCS8qIEtleWJvYXJkIGlucHV0IGJ1ZmZlciBmdWxsICovCiAKQEAgLTU4LDEyICs1NCwzIEBACiAJCWphenpfd3JpdGVfb3V0cHV0ICgweDAwKTsKIAl9CiB9Ci0KLXZvaWQgamF6el9tYWNoaW5lX2hhbHQodm9pZCkKLXsKLX0KLQotdm9pZCBqYXp6X21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCi17Ci0JLyogSmF6eiBtYWNoaW5lcyBkb24ndCBoYXZlIGEgc29mdHdhcmUgcG93ZXIgc3dpdGNoICovCi19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvamF6ei9zZXR1cC5jIGIvYXJjaC9taXBzL2phenovc2V0dXAuYwppbmRleCA4MWVjNTU5Li43OTgyNzllIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvamF6ei9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9qYXp6L3NldHVwLmMKQEAgLTM0LDggKzM0LDYgQEAKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgamF6el9oYW5kbGVfaW50KHZvaWQpOwogCiBleHRlcm4gdm9pZCBqYXp6X21hY2hpbmVfcmVzdGFydChjaGFyICpjb21tYW5kKTsKLWV4dGVybiB2b2lkIGphenpfbWFjaGluZV9oYWx0KHZvaWQpOwotZXh0ZXJuIHZvaWQgamF6el9tYWNoaW5lX3Bvd2VyX29mZih2b2lkKTsKIAogdm9pZCBfX2luaXQgcGxhdF90aW1lcl9zZXR1cChzdHJ1Y3QgaXJxYWN0aW9uICppcnEpCiB7CkBAIC05NSw4ICs5Myw2IEBACiAJLyogVGhlIFJUQyBpcyBvdXRzaWRlIHRoZSBwb3J0IGFkZHJlc3Mgc3BhY2UgKi8KIAogCV9tYWNoaW5lX3Jlc3RhcnQgPSBqYXp6X21hY2hpbmVfcmVzdGFydDsKLQlfbWFjaGluZV9oYWx0ID0gamF6el9tYWNoaW5lX2hhbHQ7Ci0JcG1fcG93ZXJfb2ZmID0gamF6el9tYWNoaW5lX3Bvd2VyX29mZjsKIAogCXNjcmVlbl9pbmZvID0gKHN0cnVjdCBzY3JlZW5faW5mbykgewogCQkwLCAwLAkJLyogb3JpZy14LCBvcmlnLXkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMKaW5kZXggZDFlZjI4OTUuLjgzMDMwMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jCkBAIC00MzQsNyArNDM0LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgam1yMzkyN19ydGNfaW5pdCh2b2lkKQogewotCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CisJc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2luaXRkYXRhIHJlcyA9IHsKIAkJLnN0YXJ0CT0gSk1SMzkyN19JT0NfTlZSQU1CX0FERFIgLSBJT19CQVNFLAogCQkuZW5kCT0gSk1SMzkyN19JT0NfTlZSQU1CX0FERFIgLSBJT19CQVNFICsgMHg4MDAgLSAxLAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLXN0dWIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2RiLXN0dWIuYwppbmRleCA3YmM4ODIwLi5jYjU2MjNhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2dkYi1zdHViLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9nZGItc3R1Yi5jCkBAIC0xMDk5LDEyICsxMDk5LDEyIEBACiAgKiBtYWxsb2MgaXMgbmVlZGVkIGJ5IGdkYiBjbGllbnQgaW4gImNhbGwgZnVuYygpIiwgZXZlbiBhIHByaXZhdGUgb25lCiAgKiB3aWxsIG1ha2UgZ2RiIGhhcHB5CiAgKi8KLXN0YXRpYyB2b2lkICogX19hdHRyaWJ1dGVfdXNlZF9fIG1hbGxvYyhzaXplX3Qgc2l6ZSkKK3N0YXRpYyB2b2lkIF9fdXNlZCAqbWFsbG9jKHNpemVfdCBzaXplKQogewogCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV91c2VkX18gZnJlZSAodm9pZCAqd2hlcmUpCitzdGF0aWMgdm9pZCBfX3VzZWQgZnJlZSh2b2lkICp3aGVyZSkKIHsKIAlrZnJlZSh3aGVyZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2hlYWQuUyBiL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TCmluZGV4IGY3ODUzOGUuLmMxNWJiYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaGVhZC5TCkBAIC0xNDEsNyArMTQxLDcgQEAKIEVYUE9SVChzdGV4dCkJCQkJCSMgdXNlZCBmb3IgcHJvZmlsaW5nCiBFWFBPUlQoX3N0ZXh0KQogCi0jaWZkZWYgQ09ORklHX0JPT1RfUkFXCisjaWZuZGVmIENPTkZJR19CT09UX1JBVwogCS8qCiAJICogR2l2ZSB1cyBhIGZpZ2h0aW5nIGNoYW5jZSBvZiBydW5uaW5nIGlmIGV4ZWN1dGlvbiBiZWluZ3MgYXQgdGhlCiAJICoga2VybmVsIGxvYWQgYWRkcmVzcy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBwbGF0Zm9ybSBkb2VzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCmluZGV4IDA2ZTA0ZGEuLmMzNzU2OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jCkBAIC01NjcsNyArNTY3LDcgQEAKIH0KIAogc2F2ZV9zdGF0aWNfZnVuY3Rpb24oc3lzMzJfY2xvbmUpOwotX19hdHRyaWJ1dGVfdXNlZF9fIG5vaW5saW5lIHN0YXRpYyBpbnQKK3N0YXRpYyBpbnQgbm9pbmxpbmUgX191c2VkCiBfc3lzMzJfY2xvbmUobmFiaV9ub19yZWdhcmdzIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKaW5kZXggYmZjOGNhMS4uOGNmMjRkNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKQEAgLTg1LDcgKzg1LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBfX2F0dHJpYnV0ZV91c2VkX18gdm9pZCBkdW1wX3J0bHgodm9pZCkKK3N0YXRpYyB2b2lkIF9fdXNlZCBkdW1wX3J0bHgodm9pZCkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKaW5kZXggYmU3MzYyYi4uMDRiYmJkOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCBiOTQ3YzYxLi41NDFiNTAwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CkBAIC0xNjcsMTQgKzE2OCwxNCBAQAogfQogCiBzYXZlX3N0YXRpY19mdW5jdGlvbihzeXNfZm9yayk7Ci1fX2F0dHJpYnV0ZV91c2VkX18gbm9pbmxpbmUgc3RhdGljIGludAorc3RhdGljIGludCBfX3VzZWQgbm9pbmxpbmUKIF9zeXNfZm9yayhuYWJpX25vX3JlZ2FyZ3Mgc3RydWN0IHB0X3JlZ3MgcmVncykKIHsKIAlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLnJlZ3NbMjldLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7CiB9CiAKIHNhdmVfc3RhdGljX2Z1bmN0aW9uKHN5c19jbG9uZSk7Ci1fX2F0dHJpYnV0ZV91c2VkX18gbm9pbmxpbmUgc3RhdGljIGludAorc3RhdGljIGludCBfX3VzZWQgbm9pbmxpbmUKIF9zeXNfY2xvbmUobmFiaV9ub19yZWdhcmdzIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCmluZGV4IDllNjYzNTQuLmEyYmVlMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwpAQCAtMTU0LDcgKzE1NCw2IEBACiB9OwogCiBzdGF0aWMgdm9pZCByZWxlYXNlX3Byb2dtZW0odm9pZCAqcHRyKTsKLS8qIHN0YXRpYyBfX2F0dHJpYnV0ZV91c2VkX18gdm9pZCBkdW1wX3ZwZShzdHJ1Y3QgdnBlICogdik7ICovCiBleHRlcm4gdm9pZCBzYXZlX2dwX2FkZHJlc3ModW5zaWduZWQgaW50IHNlY2Jhc2UsIHVuc2lnbmVkIGludCByZWwpOwogCiAvKiBnZXQgdGhlIHZwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtaW5vciAqLwpAQCAtMTAyNCw3ICsxMDIzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotX19hdHRyaWJ1dGVfdXNlZF9fIHZvaWQgZHVtcF92cGUoc3RydWN0IHZwZSAqIHYpCit2b2lkIF9fdXNlZCBkdW1wX3ZwZShzdHJ1Y3QgdnBlICogdikKIHsKIAlzdHJ1Y3QgdGMgKnQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXNiMS5jIGIvYXJjaC9taXBzL21tL2Mtc2IxLmMKaW5kZXggNmY5YmQ3Zi4uODVjZTI4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2Mtc2IxLmMKKysrIGIvYXJjaC9taXBzL21tL2Mtc2IxLmMKQEAgLTI3Miw3ICsyNzIsNyBAQAogLyoKICAqIEludmFsaWRhdGUgYWxsIGNhY2hlcyBvbiB0aGlzIENQVQogICovCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV91c2VkX18gbG9jYWxfc2IxX19fZmx1c2hfY2FjaGVfYWxsKHZvaWQpCitzdGF0aWMgdm9pZCBfX3VzZWQgbG9jYWxfc2IxX19fZmx1c2hfY2FjaGVfYWxsKHZvaWQpCiB7CiAJX19zYjFfd3JpdGViYWNrX2ludl9kY2FjaGVfYWxsKCk7CiAJX19zYjFfZmx1c2hfaWNhY2hlX2FsbCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2luaXQuYyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKaW5kZXggNGM4MDUyOC4uYjhjYjBkZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2luaXQuYworKysgYi9hcmNoL21pcHMvbW0vaW5pdC5jCkBAIC00ODQsNyArNDg0LDcgQEAKIH0KICNlbmRpZgogCi12b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQordm9pZCBfX2luaXRfcmVmb2sgZnJlZV9pbml0bWVtKHZvaWQpCiB7CiAJcHJvbV9mcmVlX3Byb21fbWVtb3J5KCk7CiAJZnJlZV9pbml0X3BhZ2VzKCJ1bnVzZWQga2VybmVsIG1lbW9yeSIsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc25pL3NuaXByb20uYyBiL2FyY2gvbWlwcy9zbmkvc25pcHJvbS5jCmluZGV4IDAwYTAzYTYuLmRiNTQ0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zbmkvc25pcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9zbmkvc25pcHJvbS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9zbmkuaD4KICNpbmNsdWRlIDxhc20vbWlwc3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KIAogLyogc3BlY2lhbCBTTkkgcHJvbSBjYWxscyAqLwpAQCAtNzEsNyArNzIsNyBAQAogI2RlZmluZSBTTklfSURQUk9NX1NJWkUJMHgxMDAwCiAKICNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgc25pX2lkcHJvbV9kdW1wKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc25pX2lkcHJvbV9kdW1wKHZvaWQpCiB7CiAJaW50CWk7CiAKQEAgLTg4LDcgKzg5LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBzbmlfbWVtX2luaXQodm9pZCApCitzdGF0aWMgdm9pZCBfX2luaXQgc25pX21lbV9pbml0KHZvaWQgKQogewogCWludCBpLCBtZW1zaXplOwogCXN0cnVjdCBtZW1iYW5rIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X3NldHVwLmMgYi9hcmNoL21pcHMvdHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjcvdG9zaGliYV9yYnR4NDkyN19zZXR1cC5jCmluZGV4IDQwYzdjM2UuLmFiNzIyOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5Mjdfc2V0dXAuYwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgdG9zaGliYV9yYnR4NDkyN19ydGNfaW5pdCh2b2lkKQogewotCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CisJc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2luaXRkYXRhIHJlcyA9IHsKIAkJLnN0YXJ0CT0gMHgxYzAxMDAwMCwKIAkJLmVuZAk9IDB4MWMwMTAwMDAgKyAweDgwMCAtIDEsCiAJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaHB1eC9mcy5jIGIvYXJjaC9wYXJpc2MvaHB1eC9mcy5jCmluZGV4IGYyMDQyZTYuLjEyNjNmMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2hwdXgvZnMuYworKysgYi9hcmNoL3BhcmlzYy9ocHV4L2ZzLmMKQEAgLTIzLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggODM4NGJmOS4uNDQ2Zjk4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2luaXRfdGFzay5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYwppbmRleCAzNTU2NjQ4Li5iODBlMDJhIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jCmluZGV4IDA0YzdlMWQuLmQ3YmM3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCA4NTNjMjgyLi4wMDA5OWVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtNDExLDExICs0MTEsNiBAQAogCWRlZmF1bHQgeSBpZiA0MHggfHwgNDR4CiAJZGVmYXVsdCBuCiAKLWNvbmZpZyBQUENfSU5ESVJFQ1RfUENJX0JFCi0JYm9vbAotCWRlcGVuZHMgUFBDX0lORElSRUNUX1BDSQotCWRlZmF1bHQgbgotCiBjb25maWcgRUlTQQogCWJvb2wKIApAQCAtNDI1LDYgKzQyMCwxMCBAQAogY29uZmlnIEZTTF9TT0MKIAlib29sCiAKK2NvbmZpZyBGU0xfUENJCisgCWJvb2wKKwlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQorCiAjIFllcyBNQ0EgUlMvNjAwMHMgZXhpc3QgYnV0IExpbnV4LVBQQyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBhbnkKIGNvbmZpZyBNQ0EKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCmluZGV4IDM0NmNkM2IuLjIyYWNlY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCkBAIC0yMCw3ICsyMCw3IEBACiAKIGNvbmZpZyBERUJVR19QQUdFQUxMT0MKICAgICAgICAgYm9vbCAiRGVidWcgcGFnZSBtZW1vcnkgYWxsb2NhdGlvbnMiCi0gICAgICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTT0ZUV0FSRV9TVVNQRU5ECisgICAgICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFISUJFUk5BVElPTgogICAgICAgICBoZWxwCiAgICAgICAgICAgVW5tYXAgcGFnZXMgZnJvbSB0aGUga2VybmVsIGxpbmVhciBtYXBwaW5nIGFmdGVyIGZyZWVfcGFnZXMoKS4KICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYSBsYXJnZSBzbG93ZG93biwgYnV0IGhlbHBzIHRvIGZpbmQgY2VydGFpbiB0eXBlcwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIGNvbmZpZyBCT09UWF9URVhUCiAJYm9vbCAiU3VwcG9ydCBmb3IgZWFybHkgYm9vdCB0ZXh0IGNvbnNvbGUgKEJvb3RYIG9yIE9wZW5GaXJtd2FyZSBvbmx5KSIKLQlkZXBlbmRzIFBQQ19PRgorCWRlcGVuZHMgUFBDX09GICYmIFBQQ19NVUxUSVBMQVRGT1JNCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzZWUgcHJvZ3Jlc3MgbWVzc2FnZXMgZnJvbSB0aGUgYm9vdCBmaXJtd2FyZSBpbiB0ZXh0CiAJICBtb2RlLiBSZXF1aXJlcyBlaXRoZXIgQm9vdFggb3IgT3BlbiBGaXJtd2FyZS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEQuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2t1cm9ib3hIRC5kdHMKaW5kZXggYTk4MzY4MC4uMTIyNTM3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2t1cm9ib3hIRC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2t1cm9ib3hIRC5kdHMKQEAgLTMzLDEyICszMywxMCBAQAogCQlQb3dlclBDLDYwM2UgeyAvKiBSZWFsbHkgODI0MSAqLwogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKIAkJCXJlZyA9IDwwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDxiZWJjMjAwPjsJLyogRml4ZWQgYnkgYm9vdHdyYXBwZXIgKi8KLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwxNzQzMDAwPjsgLyogRml4ZWQgYnkgYm9vdHdyYXBwZXIgKi8KLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvKiBGcm9tIGJvb3Rsb2FkZXIgKi8KKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDxiZWJjMjAwPjsJLyogRml4ZWQgYnkgYm9vdGxvYWRlciAqLworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDE3NDMwMDA+OyAvKiBGaXhlZCBieSBib290bG9hZGVyICovCisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLyogRml4ZWQgYnkgYm9vdGxvYWRlciAqLwogCQkJLyogRm9sbG93aW5nIHJlcXVpcmVkIGJ5IGR0YyBidXQgbm90IHVzZWQgKi8KLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MD47CiAJCQlpLWNhY2hlLXNpemUgPSA8NDAwMD47CiAJCQlkLWNhY2hlLXNpemUgPSA8NDAwMD47CiAJCX07CkBAIC02NCwxMSArNjIsMTkgQEAKIAkJCSAgZmVmMDAwMDAgZmVmMDAwMDAgMDAxMDAwMDA+OwkvKiBwY2kgaWFjayAqLwogCiAJCWkyY0A4MDAwMzAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8ODAwMDMwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDUgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCQkJcnRjQDMyIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJydGMiOworCQkJCWNvbXBhdGlibGUgPSAicmljb2gscnM1YzM3MmIiOworCQkJCXJlZyA9IDwzMj47CisJCQl9OwogCQl9OwogCiAJCXNlcmlhbEA4MDAwNDUwMCB7CkBAIC05MSw3ICs5Nyw3IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAotCQltcGljOiBwaWNAODAwNDAwMDAgeworCQltcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA4MDA0MDAwMCB7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCmluZGV4IDVjZjQyZGMuLjU3OWFhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCkBAIC0zMywxMiArMzMsMTAgQEAKIAkJUG93ZXJQQyw2MDNlIHsgLyogUmVhbGx5IDgyNDEgKi8KIAkJCWRldmljZV90eXBlID0gImNwdSI7CiAJCQlyZWcgPSA8MD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8ZmRhZDY4MD47CS8qIEZpeGVkIGJ5IGJvb3R3cmFwcGVyICovCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MUYwNDAwMD47IC8qIEZpeGVkIGJ5IGJvb3R3cmFwcGVyICovCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLyogRnJvbSBib290bG9hZGVyICovCisJCQljbG9jay1mcmVxdWVuY3kgPSA8ZmRhZDY4MD47CS8qIEZpeGVkIGJ5IGJvb3Rsb2FkZXIgKi8KKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwxRjA0MDAwPjsgLyogRml4ZWQgYnkgYm9vdGxvYWRlciAqLworCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8qIEZpeGVkIGJ5IGJvb3Rsb2FkZXIgKi8KIAkJCS8qIEZvbGxvd2luZyByZXF1aXJlZCBieSBkdGMgYnV0IG5vdCB1c2VkICovCi0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDA+OwogCQkJaS1jYWNoZS1zaXplID0gPDQwMDA+OwogCQkJZC1jYWNoZS1zaXplID0gPDQwMDA+OwogCQl9OwpAQCAtNjQsMTEgKzYyLDE5IEBACiAJCQkgIGZlZjAwMDAwIGZlZjAwMDAwIDAwMTAwMDAwPjsJLyogcGNpIGlhY2sgKi8KIAogCQlpMmNAODAwMDMwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDgwMDAzMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw1IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwkJCXJ0Y0AzMiB7CisJCQkJZGV2aWNlX3R5cGUgPSAicnRjIjsKKwkJCQljb21wYXRpYmxlID0gInJpY29oLHJzNWMzNzJiIjsKKwkJCQlyZWcgPSA8MzI+OworCQkJfTsKIAkJfTsKIAogCQlzZXJpYWxAODAwMDQ1MDAgewpAQCAtOTEsOCArOTcsNyBAQAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKLQkJbXBpYzogcGljQDgwMDQwMDAwIHsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQltcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA4MDA0MDAwMCB7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwppbmRleCAwZTNkMzE0Li5iOTE1OGViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQlkZXZpY2VfdHlwZSA9ICJ0c2kxMDgtYnJpZGdlIjsKKwkJZGV2aWNlX3R5cGUgPSAidHNpLWJyaWRnZSI7CiAJCXJhbmdlcyA9IDwwMDAwMDAwMCBjMDAwMDAwMCAwMDAxMDAwMD47CiAJCXJlZyA9IDxjMDAwMDAwMCAwMDAxMDAwMD47CiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTNlcmRiLmR0cwppbmRleCBhMTUzM2NjLi5jNWFkYmU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4NTAwIDEwMD47Ci0JCQljb21wYXRpYmxlID0gIjgzeHgiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKaW5kZXggNGZjMGM0ZC4uZjE1OGVkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODUwMCAxMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4M3h4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCmluZGV4IDQ0N2MwM2YuLjdjNGJlZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQkJcmVnID0gPDg1MDAgMTAwPjsKLQkJCWNvbXBhdGlibGUgPSAiODN4eCI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCmluZGV4IGFlOWJjYTUuLjUwMmY0N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODUwMCAxMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4M3h4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCX07CiAKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4NjAwIDEwMD47Ci0JCQljb21wYXRpYmxlID0gIjgzeHgiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHhncC5kdHMKaW5kZXggZjYzNjUyOC4uMGI4Mzg3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4Z3AuZHRzCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODYwMCAxMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4M3h4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCmluZGV4IDMxMGU4NzcuLjQ4MTA5OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQkJcmVnID0gPDg1MDAgMTAwPjsKLQkJCWNvbXBhdGlibGUgPSAiODN4eCI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LXBjaSI7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQl9OwogCkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODYwMCAxMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4M3h4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IDFlOTE0ZjMxLi5lM2Y3YzEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKQEAgLTE2OSw3ICsxNjksNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4NTAwIDEwMD47Ci0JCQljb21wYXRpYmxlID0gIjgzeHgiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM0OS1wY2kiOwogCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCmluZGV4IDM2NGE5NjkuLmZjOGRmZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4MDAwIDEwMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpeCIsICJmc2wsbXBjODU0MC1wY2kiOwogCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCmluZGV4IDA3MDIwNmYuLmZiMGI2NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4MDAwIDEwMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAKIAkJCWk4MjU5QDE5MDAwIHsKQEAgLTIzMCw3ICsyMzAsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw5MDAwIDEwMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKaW5kZXggODI4NTkyNS4uNDY4MGUyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKQEAgLTEwNCw2ICsxMDQsNyBAQAogCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CiAJCX07CiAKIAkJZXRoZXJuZXRAMjYwMDAgewpAQCAtMTE3LDYgKzExOCw3IEBACiAJCQlpbnRlcnJ1cHRzID0gPDFmIDIgMjAgMiAyMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKIAkJfTsKIAogCQlzZXJpYWxANDUwMCB7CkBAIC0xMzcsNiArMTM5LDIyMyBAQAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKKwkJcGNpQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1wY2kiOworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisKKwkJCQkvKiBJRFNFTCAweDExIEoxNyBTbG90IDEgKi8KKwkJCQk4ODAwIDAgMCAxICZtcGljIDIgMQorCQkJCTg4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJODgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQk4ODAwIDAgMCA0ICZtcGljIDEgMQorCisJCQkJLyogSURTRUwgMHgxMiBKMTYgU2xvdCAyICovCisKKwkJCQk5MDAwIDAgMCAxICZtcGljIDMgMQorCQkJCTkwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQk5MDAwIDAgMCA0ICZtcGljIDEgMT47CisKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIGZmPjsKKwkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMTAwMDAwMDAKKwkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDgwMDAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8M2Y5NDBhYT47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCXJlZyA9IDw4MDAwIDEwMDA+OworCQl9OworCisJCXBjaWVAOTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJcmVnID0gPDkwMDAgMTAwMD47CisJCQlidXMtcmFuZ2UgPSA8MCBmZj47CisJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA5MDAwMDAwMCA5MDAwMDAwMCAwIDEwMDAwMDAwCisJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDA4MDAwMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDFmY2EwNTU+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkvKiBJRFNFTCAweDAgKi8KKwkJCQkwMDAwIDAgMCAxICZtcGljIDQgMQorCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMQorCQkJCT47CisJCX07CisKKwkJcGNpZUBhMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlyZWcgPSA8YTAwMCAxMDAwPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIGZmPjsKKwkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMTAwMDAwMDAKKwkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTI4MDAwMDAgMCAwMDgwMDAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MWZjYTA1NT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwMDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCisJCQkJPjsKKwkJfTsKKworCQlwY2llQGIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCXJlZyA9IDxiMDAwIDEwMDA+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OworCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgYjAwMDAwMDAgYjAwMDAwMDAgMCAxMDAwMDAwMAorCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMzgwMDAwMCAwIDAwODAwMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisKKwkJCQkvLyBJRFNFTCAweDFhCisJCQkJZDAwMCAwIDAgMSAmaTgyNTkgNiAyCisJCQkJZDAwMCAwIDAgMiAmaTgyNTkgMyAyCisJCQkJZDAwMCAwIDAgMyAmaTgyNTkgNCAyCisJCQkJZDAwMCAwIDAgNCAmaTgyNTkgNSAyCisKKwkJCQkvLyBJRFNFTCAweDFiCisJCQkJZDgwMCAwIDAgMSAmaTgyNTkgNSAyCisJCQkJZDgwMCAwIDAgMiAmaTgyNTkgMCAwCisJCQkJZDgwMCAwIDAgMyAmaTgyNTkgMCAwCisJCQkJZDgwMCAwIDAgNCAmaTgyNTkgMCAwCisKKwkJCQkvLyBJRFNFTCAweDFjICBVU0IKKwkJCQllMDAwIDAgMCAxICZpODI1OSA5IDIKKwkJCQllMDAwIDAgMCAyICZpODI1OSBhIDIKKwkJCQllMDAwIDAgMCAzICZpODI1OSBjIDIKKwkJCQllMDAwIDAgMCA0ICZpODI1OSA3IDIKKworCQkJCS8vIElEU0VMIDB4MWQgIEF1ZGlvCisJCQkJZTgwMCAwIDAgMSAmaTgyNTkgOSAyCisJCQkJZTgwMCAwIDAgMiAmaTgyNTkgYSAyCisJCQkJZTgwMCAwIDAgMyAmaTgyNTkgYiAyCisJCQkJZTgwMCAwIDAgNCAmaTgyNTkgMCAwCisKKwkJCQkvLyBJRFNFTCAweDFlIExlZ2FjeQorCQkJCWYwMDAgMCAwIDEgJmk4MjU5IGMgMgorCQkJCWYwMDAgMCAwIDIgJmk4MjU5IDAgMAorCQkJCWYwMDAgMCAwIDMgJmk4MjU5IDAgMAorCQkJCWYwMDAgMCAwIDQgJmk4MjU5IDAgMAorCisJCQkJLy8gSURTRUwgMHgxZiBJREUvU0FUQQorCQkJCWY4MDAgMCAwIDEgJmk4MjU5IDYgMgorCQkJCWY4MDAgMCAwIDIgJmk4MjU5IDAgMAorCQkJCWY4MDAgMCAwIDMgJmk4MjU5IDAgMAorCQkJCWY4MDAgMCAwIDQgJmk4MjU5IDAgMAorCQkJPjsKKwkJCXVsaTE1NzVAMCB7CisJCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgYjAwMDAwMDAKKwkJCQkJICAwMjAwMDAwMCAwIGIwMDAwMDAwCisJCQkJCSAgMCAxMDAwMDAwMAorCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCSAgMCAwMDA4MDAwMD47CisKKwkJCQlwY2lfYnJpZGdlQDAgeworCQkJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBiMDAwMDAwMAorCQkJCQkJICAwMjAwMDAwMCAwIGIwMDAwMDAwCisJCQkJCQkgIDAgMjAwMDAwMDAKKwkJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCQkgIDAgMDAxMDAwMDA+OworCisJCQkJCWlzYUAxZSB7CisJCQkJCQlkZXZpY2VfdHlwZSA9ICJpc2EiOworCQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCQkJCQlyZWcgPSA8ZjAwMCAwIDAgMCAwPjsKKwkJCQkJCXJhbmdlcyA9IDwxIDAgMDEwMDAwMDAgMCAwCisJCQkJCQkJICAwMDAwMTAwMD47CisJCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpODI1OT47CisKKwkJCQkJCWk4MjU5OiBpbnRlcnJ1cHQtY29udHJvbGxlckAyMCB7CisJCQkJCQkJcmVnID0gPDEgMjAgMgorCQkJCQkJCSAgICAgICAxIGEwIDIKKwkJCQkJCQkgICAgICAgMSA0ZDAgMj47CisJCQkJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCQkJCWRldmljZV90eXBlID0gImludGVycnVwdC1jb250cm9sbGVyIjsKKwkJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCQkJCWJ1aWx0LWluOworCQkJCQkJCWNvbXBhdGlibGUgPSAiY2hycCxpaWMiOworCQkJCQkJCWludGVycnVwdHMgPSA8OSAyPjsKKwkJCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0KKwkJCQkJCQkJPCZtcGljPjsKKwkJCQkJCX07CisKKwkJCQkJCWk4MDQyQDYwIHsKKwkJCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJCQlyZWcgPSA8MSA2MCAxIDEgNjQgMT47CisJCQkJCQkJaW50ZXJydXB0cyA9IDwxIDMgYyAzPjsKKwkJCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0KKwkJCQkJCQkJPCZpODI1OT47CisKKwkJCQkJCQlrZXlib2FyZEAwIHsKKwkJCQkJCQkJcmVnID0gPDA+OworCQkJCQkJCQljb21wYXRpYmxlID0gInBucFBOUCwzMDMiOworCQkJCQkJCX07CisKKwkJCQkJCQltb3VzZUAxIHsKKwkJCQkJCQkJcmVnID0gPDE+OworCQkJCQkJCQljb21wYXRpYmxlID0gInBucFBOUCxmMDMiOworCQkJCQkJCX07CisJCQkJCQl9OworCisJCQkJCQlydGNANzAgeworCQkJCQkJCWNvbXBhdGlibGUgPQorCQkJCQkJCQkicG5wUE5QLGIwMCI7CisJCQkJCQkJcmVnID0gPDEgNzAgMj47CisJCQkJCQl9OworCisJCQkJCQlncGlvQDQwMCB7CisJCQkJCQkJcmVnID0gPDEgNDAwIDgwPjsKKwkJCQkJCX07CisJCQkJCX07CisJCQkJfTsKKwkJCX07CisKKwkJfTsKKworCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQkJcmVnID0gPGUwMDAwIDEwMDA+OworCQkJZnNsLGhhcy1yc3RjcjsKKwkJfTsKKwogCQltcGljOiBwaWNANDAwMDAgewogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKaW5kZXggOWQwYjg0Yi4uZDIxNWQyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBNUEM4NTU1IENEUyBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqIE1QQzg1NDggQ0RTIERldmljZSBUcmVlIFNvdXJjZQogICoKICAqIENvcHlyaWdodCAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KICAqCkBAIC00NCw4ICs0NCwxNCBAQAogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJcmFuZ2VzID0gPDAgZTAwMDAwMDAgMDAxMDAwMDA+OwotCQlyZWcgPSA8ZTAwMDAwMDAgMDAxMDAwMDA+OwkvLyBDQ1NSQkFSIDFNCisJCXJhbmdlcyA9IDwwMDAwMTAwMCBlMDAwMTAwMCAwMDBmZjAwMAorCQkJICA4MDAwMDAwMCA4MDAwMDAwMCAxMDAwMDAwMAorCQkJICBlMjAwMDAwMCBlMjAwMDAwMCAwMDgwMDAwMAorCQkJICA5MDAwMDAwMCA5MDAwMDAwMCAxMDAwMDAwMAorCQkJICBlMjgwMDAwMCBlMjgwMDAwMCAwMDgwMDAwMAorCQkJICBhMDAwMDAwMCBhMDAwMDAwMCAyMDAwMDAwMAorCQkgICAgICAgICAgZTMwMDAwMDAgZTMwMDAwMDAgMDEwMDAwMDA+OworCQlyZWcgPSA8ZTAwMDAwMDAgMDAwMDEwMDA+OwkvLyBDQ1NSQkFSCiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CiAKIAkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CkBAIC0xNjIsOCArMTY4LDggQEAKIAkJc2VyaWFsQDQ1MDAgewogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PworCQkJcmVnID0gPDQ1MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CkBAIC0xNzIsNyArMTc4LDcgQEAKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKQEAgLTE4Myw3NyArMTg5LDE1NCBAQAogCQkJZnNsLGhhcy1yc3RjcjsKIAkJfTsKIAotCQlwY2kxOiBwY2lAODAwMCB7Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MWY4MDAgMCAwIDc+OworCQlwY2lAODAwMCB7CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CiAJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4NCAoUENJWCBTbG90IDIpICovCisJCQkJMDIwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDIwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDIwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDIwMDAgMCAwIDQgJm1waWMgMyAxCiAKLQkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCi0JCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCisJCQkJLyogSURTRUwgMHg1IChQQ0lYIFNsb3QgMykgKi8KKwkJCQkwMjgwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkwMjgwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkwMjgwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkwMjgwMCAwIDAgNCAmbXBpYyAwIDEKIAotCQkJCS8qIElEU0VMIDB4MTEgKi8KLQkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKLQkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKKwkJCQkvKiBJRFNFTCAweDYgKFBDSVggU2xvdCA0KSAqLworCQkJCTAzMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTAzMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTAzMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTAzMDAwIDAgMCA0ICZtcGljIDEgMQogCi0JCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDAgMQotCQkJCTA5MDAwIDAgMCAyICZtcGljIDEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMgMQorCQkJCS8qIElEU0VMIDB4OCAoUENJWCBTbG90IDUpICovCisJCQkJMDQwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDQwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDQwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDQwMDAgMCAwIDQgJm1waWMgMyAxCiAKLQkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCi0JCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCisJCQkJLyogSURTRUwgMHhDIChUc2kzMTAgYnJpZGdlKSAqLworCQkJCTA2MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA2MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA2MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA2MDAwIDAgMCA0ICZtcGljIDMgMQogCi0JCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQotCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQorCQkJCS8qIElEU0VMIDB4MTQgKFNsb3QgMikgKi8KKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAzIDEKIAotCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKLQkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKKwkJCQkvKiBJRFNFTCAweDE1IChTbG90IDMpICovCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMCAxCiAKLQkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KLQkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQotCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CisJCQkJLyogSURTRUwgMHgxNiAoU2xvdCA0KSAqLworCQkJCTBiMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBiMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBiMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBiMDAwIDAgMCA0ICZtcGljIDEgMQorCisJCQkJLyogSURTRUwgMHgxOCAoU2xvdCA1KSAqLworCQkJCTBjMDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTBjMDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTBjMDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTBjMDAwIDAgMCA0ICZtcGljIDMgMQorCisJCQkJLyogSURTRUwgMHgxQyAoVHNpMzEwIGJyaWRnZSBQQ0kgcHJpbWFyeSkgKi8KKwkJCQkwRTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwRTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwRTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwRTAwMCAwIDAgNCAmbXBpYyAzIDE+OworCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKLQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKLQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CisJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDEwMDAwMDAwCisJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDA4MDAwMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDNmOTQwYWE+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODAwMCAxMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiODV4eCI7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaXgiLCAiZnNsLG1wYzg1NDAtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAKLQkJCWk4MjU5QDE5MDAwIHsKLQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOwotCQkJCXJlZyA9IDwxOTAwMCAwIDAgMCAxPjsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJCWJ1aWx0LWluOwotCQkJCWNvbXBhdGlibGUgPSAiY2hycCxpaWMiOwotCQkJCWJpZy1lbmRpYW47Ci0JCQkJaW50ZXJydXB0cyA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwY2kxPjsKKwkJCXBjaV9icmlkZ2VAMWMgeworCQkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCQlpbnRlcnJ1cHQtbWFwID0gPAorCisJCQkJCS8qIElEU0VMIDB4MDAgKFByUE1DIFNpdGUpICovCisJCQkJCTAwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCisKKwkJCQkJLyogSURTRUwgMHgwNCAoVklBIGNoaXApICovCisJCQkJCTIwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJCTIwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJCTIwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCTIwMDAgMCAwIDQgJm1waWMgMyAxCisKKwkJCQkJLyogSURTRUwgMHgwNSAoODEzOSkgKi8KKwkJCQkJMjgwMCAwIDAgMSAmbXBpYyAxIDEKKworCQkJCQkvKiBJRFNFTCAweDA2IChTbG90IDYpICovCisJCQkJCTMwMDAgMCAwIDEgJm1waWMgMiAxCisJCQkJCTMwMDAgMCAwIDIgJm1waWMgMyAxCisJCQkJCTMwMDAgMCAwIDMgJm1waWMgMCAxCisJCQkJCTMwMDAgMCAwIDQgJm1waWMgMSAxCisKKwkJCQkJLyogSURFU0wgMHgwNyAoU2xvdCA3KSAqLworCQkJCQkzODAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkzODAwIDAgMCAyICZtcGljIDAgMQorCQkJCQkzODAwIDAgMCAzICZtcGljIDEgMQorCQkJCQkzODAwIDAgMCA0ICZtcGljIDIgMT47CisKKwkJCQlyZWcgPSA8ZTAwMCAwIDAgMCAwPjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwCisJCQkJCSAgMDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkgIDAgMjAwMDAwMDAKKwkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkgIDAgMDAwODAwMDA+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsKKworCQkJCWlzYUA0IHsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKKwkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJCQlyZWcgPSA8MjAwMCAwIDAgMCAwPjsKKwkJCQkJcmFuZ2VzID0gPDEgMCAwMTAwMDAwMCAwIDAgMDAwMDEwMDA+OworCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpODI1OT47CisKKwkJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKKwkJCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCQkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJCQkJcmVnID0gPDEgMjAgMgorCQkJCQkJICAgICAgIDEgYTAgMgorCQkJCQkJICAgICAgIDEgNGQwIDI+OworCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCQkJYnVpbHQtaW47CisJCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKKwkJCQkJCWludGVycnVwdHMgPSA8MCAxPjsKKwkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCQl9OworCisJCQkJCXJ0Y0A3MCB7CisJCQkJCQljb21wYXRpYmxlID0gInBucFBOUCxiMDAiOworCQkJCQkJcmVnID0gPDEgNzAgMj47CisJCQkJCX07CisJCQkJfTsKIAkJCX07CiAJCX07CiAKQEAgLTI2MywyMCArMzQ2LDQ1IEBACiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCiAJCQkJYTgwMCAwIDAgMSAmbXBpYyBiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIGIgMQotCQkJCWE4MDAgMCAwIDMgJm1waWMgYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyBiIDE+OworCQkJCWE4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIDMgMT47CisKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJaW50ZXJydXB0cyA9IDwxOSAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwotCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgYTAwMDAwMDAgYTAwMDAwMDAgMCAyMDAwMDAwMAotCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMzAwMDAwMCAwIDAwMTAwMDAwPjsKKwkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDkwMDAwMDAwIDkwMDAwMDAwIDAgMTAwMDAwMDAKKwkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTI4MDAwMDAgMCAwMDgwMDAwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8M2Y5NDBhYT47CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw5MDAwIDEwMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCX07CisJCS8qIFBDSSBFeHByZXNzICovCisJCXBjaWVAYTAwMCB7CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCisJCQkJLyogSURTRUwgMHgwIChQRVgpICovCisJCQkJMDAwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDAwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDAwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDAwMDAgMCAwIDQgJm1waWMgMyAxPjsKKworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OworCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgYTAwMDAwMDAgYTAwMDAwMDAgMCAyMDAwMDAwMAorCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMzAwMDAwMCAwIDA4MDAwMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJcmVnID0gPGEwMDAgMTAwMD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwogCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCmluZGV4IDE3ZTQ1ZDkuLmMzYzg4ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4MDAwIDEwMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAKIAkJCWk4MjU5QDE5MDAwIHsKQEAgLTIzMCw3ICsyMzAsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw5MDAwIDEwMDA+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cwppbmRleCAyMWNjYWFhLi4xNmRiZTg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICI4NXh4IjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpeCIsICJmc2wsbXBjODU0MC1wY2kiOwogCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJlZyA9IDw4MDAwIDEwMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDNmOTQwYWE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCmluZGV4IDZiYjE4ZjIuLmIxZGNmYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKQEAgLTE3MCw2ICsxNzAsNjYgQEAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtZ3V0cyI7CisJCQlyZWcgPSA8ZTAwMDAgMTAwMD47CisJCQlmc2wsaGFzLXJzdGNyOworCQl9OworCisJCXBjaUA4MDAwIHsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgxMiBBRDE4ICovCisJCQkJOTAwMCAwIDAgMSAmbXBpYyA1IDEKKwkJCQk5MDAwIDAgMCAyICZtcGljIDYgMQorCQkJCTkwMDAgMCAwIDMgJm1waWMgNyAxCisJCQkJOTAwMCAwIDAgNCAmbXBpYyA0IDEKKworCQkJCS8qIElEU0VMIDB4MTMgQUQxOSAqLworCQkJCTk4MDAgMCAwIDEgJm1waWMgNiAxCisJCQkJOTgwMCAwIDAgMiAmbXBpYyA3IDEKKwkJCQk5ODAwIDAgMCAzICZtcGljIDQgMQorCQkJCTk4MDAgMCAwIDQgJm1waWMgNSAxPjsKKworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OworCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAorCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwODAwMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzZjk0MGFhPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJcmVnID0gPDgwMDAgMTAwMD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaSI7CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQl9OworCisJCS8qIFBDSSBFeHByZXNzICovCisJCXBjaWVAYTAwMCB7CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCisJCQkJLyogSURTRUwgMHgwIChQRVgpICovCisJCQkJMDAwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDAwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDAwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDAwMDAgMCAwIDQgJm1waWMgMyAxPjsKKworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OworCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgYTAwMDAwMDAgYTAwMDAwMDAgMCAyMDAwMDAwMAorCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMzAwMDAwMCAwIDA4MDAwMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJcmVnID0gPGEwMDAgMTAwMD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJfTsKKwogCQlzZXJpYWxANDYwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKaW5kZXggNmE3OGEyYi4uNWQ4MjcwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKQEAgLTIxMSw4ICsyMTEsOCBAQAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKLQkJcGNpQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICI4Nnh4IjsKKwkJcGNpZUA4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtcGNpZSI7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDI+OwpAQCAtMzk5LDggKzM5OSw4IEBACiAKIAkJfTsKIAotCQlwY2lAOTAwMCB7Ci0JCQljb21wYXRpYmxlID0gIjg2eHgiOworCQlwY2llQDkwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1wY2llIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9saXRlNTIwMF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9saXRlNTIwMF9kZWZjb25maWcKaW5kZXggZDEyYTk4MS4uOWMzMGNhNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGl0ZTUyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2xpdGU1MjAwX2RlZmNvbmZpZwpAQCAtMTk2LDcgKzE5Niw3IEBACiAjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfUE1fU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TRUNDT01QPXkKICMgQ09ORklHX1dBTlRfREVWSUNFX1RSRUUgaXMgbm90IHNldAogQ09ORklHX0lTQV9ETUFfQVBJPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1NDRfZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODU0NF9kc19kZWZjb25maWcKaW5kZXggYzQwYTI1YS4uNzk5NTIzMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODU0NF9kc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODU0NF9kc19kZWZjb25maWcKQEAgLTEsOSArMSwyNiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNwotIyBTdW4gSnVsICAxIDIzOjU2OjU4IDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMgorIyBGcmkgSnVsIDIwIDE0OjA5OjEzIDIwMDcKICMKICMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc3VwcG9ydAorIworIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfODV4eD15CisjIENPTkZJR19QUENfOHh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfODV4eD15CitDT05GSUdfRTUwMD15CitDT05GSUdfQk9PS0U9eQorQ09ORklHX0ZTTF9CT09LRT15CisjIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19QUEMzMj15CiBDT05GSUdfUFBDX01FUkdFPXkKIENPTkZJR19NTVU9eQpAQCAtMTQsNiArMzEsNyBAQAogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CisjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKIENPTkZJR19QUEM9eQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfR0VORVJJQ19OVlJBTT15CkBAIC0yNSwyOCArNDMsOCBAQAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19ERUZBVUxUX1VJTUFHRT15Ci0KLSMKLSMgUHJvY2Vzc29yIHN1cHBvcnQKLSMKLSMgQ09ORklHX0NMQVNTSUMzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDXzg1eHg9eQotIyBDT05GSUdfUFBDXzg2eHggaXMgbm90IHNldAotIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR180MHggaXMgbm90IHNldAotIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0UyMDAgaXMgbm90IHNldAotQ09ORklHXzg1eHg9eQotQ09ORklHX0U1MDA9eQogIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19CT09LRT15Ci1DT05GSUdfRlNMX0JPT0tFPXkKLSMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAotIyBDT05GSUdfU1BFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwpAQCAtNjMsMTMgKzYxLDEyIEBACiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX0lQQ19OUz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CiBDT05GSUdfQVVESVQ9eQogIyBDT05GSUdfQVVESVRTWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CkBAIC04Niw3ICs4Myw3IEBACiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CkBAIC0xMDUsMjQgKzEwMiwxNyBAQAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKIENPTkZJR19NT0RWRVJTSU9OUz15CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCiBDT05GSUdfQkxPQ0s9eQogQ09ORklHX0xCRD15CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTUzLDcgKzE0Myw3IEBACiBDT05GSUdfTVBDODV4eD15CiBDT05GSUdfTVBJQz15CiAjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0k4MjU5PXkKICMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKICMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CkBAIC0xOTEsNiArMTgxLDggQEAKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX0JPVU5DRT15CitDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CiBDT05GSUdfQ01ETElORV9CT09MPXkKIENPTkZJR19DTURMSU5FPSJyb290PS9kZXYvc2RhMyBydyBjb25zb2xlPXR0eVMwLDExNTIwMCIKQEAgLTIwNSwxNSArMTk3LDIxIEBACiAjCiBDT05GSUdfWk9ORV9ETUE9eQogQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0k9eQotQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkU9eQogQ09ORklHX0ZTTF9TT0M9eQotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9ET01BSU5TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19GU0xfUENJPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CisjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVBQT1JUU19NU0k9eQorIyBDT05GSUdfUENJX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CiAKICMKICMgQWR2YW5jZWQgc2V0dXAKQEAgLTI1NCw3ICsyNTIsNiBAQAogQ09ORklHX0lQX0ZJQl9IQVNIPXkKIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQogQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSD15Ci0jIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVEIGlzIG5vdCBzZXQKIENPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKQEAgLTMzMCw2ICszMjcsNyBAQAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNDAsNDUgKzMzOCwzNSBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotCi0jCi0jIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKLSMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCitDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15CiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTkJEPXkKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTYzODQKIENPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtMzg2LDYgKzM3NCw3IEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX0RNQT15CiAjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUFJPQ19GUz15CkBAIC00MjIsMjUgKzQxMSwxMjAgQEAKICMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwogIwogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfSU5JQzE2MlggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMTMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfV0lOQk9ORCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BMQVRGT1JNIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwogIyBDT05GSUdfTUQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlMgaXMgbm90IHNldAogCiAjCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKIENPTkZJR19QSFlMSUI9eQogCiAjCkBAIC00NTQsMTcgKzUzOCw0NCBAQAogQ09ORklHX1ZJVEVTU0VfUEhZPXkKICMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQorIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiBDT05GSUdfR0lBTkZBUj15CiBDT05GSUdfR0ZBUl9OQVBJPXkKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfQ0hFTFNJT19UMyBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CisjIENPTkZJR19NTFg0X0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCiAjIFdpcmVsZXNzIExBTgpAQCAtNDcyLDIxICs1ODMsMTYgQEAKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwogIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKICMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKIAogIwpAQCAtNTIxLDYgKzYyNyw3IEBACiBDT05GSUdfU0VSSU89eQogQ09ORklHX1NFUklPX0k4MDQyPXkKIENPTkZJR19TRVJJT19TRVJQT1JUPXkKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CkBAIC01MzksNiArNjQ2LDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKIENPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CiBDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CiAjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CkBAIC01NTAsMTQgKzY1OCwxMSBAQAogIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldApAQCAtNTY1LDEyICs2NzAsMTIgQEAKIENPTkZJR19HRU5fUlRDPXkKIENPTkZJR19HRU5fUlRDX1g9eQogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC01NzgsMTEgKzY4Myw4IEBACiAjCiAjIENPTkZJR19TUEkgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwpAQCAtNjU1LDE5ICs3NTcsMTQgQEAKICMgU291bmQKICMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBISUQgRGV2aWNlcwotIworQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAogCiAjCiAjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKQEAgLTY5MSwxNCArNzg4LDcgQEAKICMKICMgTEVEIFRyaWdnZXJzCiAjCi0KLSMKLSMgSW5maW5pQmFuZCBzdXBwb3J0Ci0jCi0KLSMKLSMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCi0jCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIwogIyBSZWFsIFRpbWUgQ2xvY2sKQEAgLTcxOSwxOSArODA5LDEzIEBACiAjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIEkyQyBSVEMgZHJpdmVycwotIwotCi0jCi0jIFNQSSBSVEMgZHJpdmVycwotIwotCi0jCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0NNT1MgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKQEAgLTc1Miw2ICs4MzYsMTEgQEAKICMKIAogIworIyBVc2Vyc3BhY2UgSS9PCisjCisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCiAjIEZpbGUgc3lzdGVtcwogIwogQ09ORklHX0VYVDJfRlM9eQpAQCAtODU5LDcgKzk0OCw2IEBACiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtOTQxLDYgKzEwMjksNyBAQAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKIENPTkZJR19MSUJDUkMzMkM9bQogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfUExJU1Q9eQpAQCAtOTY1LDYgKzEwNTQsNyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorQ09ORklHX1NDSEVEX0RFQlVHPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CkBAIC05OTYsMTAgKzEwODYsNiBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCiBDT05GSUdfQ1JZUFRPPXkKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKQEAgLTEwMzgsNyArMTEyNCw0IEBACiAjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKK0NPTkZJR19DUllQVE9fSFc9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODU2OG1kc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NTY4bWRzX2RlZmNvbmZpZwppbmRleCA2NDUxZDRkLi40MTdkM2U2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NTY4bWRzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NTY4bWRzX2RlZmNvbmZpZwpAQCAtMSw5ICsxLDI2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM3Ci0jIFN1biBKdWwgIDEgMjM6NTY6NTkgMjAwNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyCisjIEZyaSBKdWwgMjAgMTM6NTU6MDQgMjAwNwogIwogIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR182eHggaXMgbm90IHNldAorQ09ORklHX1BQQ184NXh4PXkKKyMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR184NXh4PXkKK0NPTkZJR19FNTAwPXkKK0NPTkZJR19CT09LRT15CitDT05GSUdfRlNMX0JPT0tFPXkKKyMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1NQRT15CisjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19QUEMzMj15CiBDT05GSUdfUFBDX01FUkdFPXkKIENPTkZJR19NTVU9eQpAQCAtMTQsNiArMzEsNyBAQAogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CisjIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTIGlzIG5vdCBzZXQKIENPTkZJR19QUEM9eQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfR0VORVJJQ19OVlJBTT15CkBAIC0yNSwyOCArNDMsOCBAQAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19ERUZBVUxUX1VJTUFHRT15Ci0KLSMKLSMgUHJvY2Vzc29yIHN1cHBvcnQKLSMKLSMgQ09ORklHX0NMQVNTSUMzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDXzg1eHg9eQotIyBDT05GSUdfUFBDXzg2eHggaXMgbm90IHNldAotIyBDT05GSUdfUFBDXzh4eCBpcyBub3Qgc2V0Ci0jIENPTkZJR180MHggaXMgbm90IHNldAotIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0UyMDAgaXMgbm90IHNldAotQ09ORklHXzg1eHg9eQotQ09ORklHX0U1MDA9eQogIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKLUNPTkZJR19CT09LRT15Ci1DT05GSUdfRlNMX0JPT0tFPXkKLSMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX1NQRT15Ci0jIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTYzLDEyICs2MSwxMSBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CkBAIC0xMDAsMjQgKzk3LDE3IEBACiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbGF5ZXIKLSMKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTE4Niw2ICsxNzYsOCBAQAogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QTSBpcyBub3Qgc2V0CkBAIC0yMDEsMTQgKzE5MywyMCBAQAogQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0k9eQogQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkU9eQogQ09ORklHX0ZTTF9TT0M9eQotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9ET01BSU5TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19GU0xfUENJPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CisjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVBQT1JUU19NU0k9eQorIyBDT05GSUdfUENJX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CiAKICMKICMgQWR2YW5jZWQgc2V0dXAKQEAgLTMwOSw2ICszMDcsNyBAQAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zMjMsNDIgKzMyMiwzMSBAQAogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCiAjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKK0NPTkZJR19CTEtfREVWPXkKICMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKICMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zMjc2OAogQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0jIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC0zNjYsNiArMzU0LDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfRE1BPXkKICMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9QUk9DX0ZTPXkKQEAgLTQwMiwyMyArMzkxLDY1IEBACiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKICMKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwogIyBDT05GSUdfTUQgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlMgaXMgbm90IHNldAogCiAjCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKIENPTkZJR19QSFlMSUI9eQogCiAjCkBAIC00MzIsMTcgKzQ2Myw0NCBAQAogIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKIENPTkZJR19HSUFORkFSPXkKIENPTkZJR19HRkFSX05BUEk9eQorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQorIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKICMgV2lyZWxlc3MgTEFOCkBAIC00NTAsMjEgKzUwOCwxNiBAQAogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCiAjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwogIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAogCiAjCkBAIC01MTAsNiArNTYzLDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKIENPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CiBDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CiAjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CkBAIC01MjEsMTQgKzU3NSwxMSBAQAogIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldApAQCAtNTM4LDE3ICs1ODksMjMgQEAKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfQk9PS0VfV0RUIGlzIG5vdCBzZXQKKworIworIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1BDSVBDV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQogIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAogQ09ORklHX0dFTl9SVEM9eQogIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0RFVlBPUlQ9eQogQ09ORklHX0kyQz15CiBDT05GSUdfSTJDX0JPQVJESU5GTz15CiBDT05GSUdfSTJDX0NIQVJERVY9eQpAQCAtNTYzLDIzICs2MjAsNDMgQEAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CiBDT05GSUdfSTJDX01QQz15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKQEAgLTU5MCwxMSArNjY3LDggQEAKICMKICMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEYWxsYXMncyAxLXdpcmUgYnVzCi0jCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0CkBAIC02MjgsMTAgKzcwMiwxMyBAQAogIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldApAQCAtNjcwLDE5ICs3NDcsMTQgQEAKICMgU291bmQKICMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBISUQgRGV2aWNlcwotIworQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NVUFBPUlQ9eQorQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAogCiAjCiAjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKQEAgLTcwNiwxNCArNzc4LDcgQEAKICMKICMgTEVEIFRyaWdnZXJzCiAjCi0KLSMKLSMgSW5maW5pQmFuZCBzdXBwb3J0Ci0jCi0KLSMKLSMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCi0jCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIwogIyBSZWFsIFRpbWUgQ2xvY2sKQEAgLTczNCw2ICs3OTksMTEgQEAKICMKIAogIworIyBVc2Vyc3BhY2UgSS9PCisjCisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCiAjIEZpbGUgc3lzdGVtcwogIwogQ09ORklHX0VYVDJfRlM9eQpAQCAtODI5LDcgKzg5OSw2IEBACiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtODY4LDYgKzkzNyw3IEBACiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19QTElTVD15CiBDT05GSUdfSEFTX0lPTUVNPXkKQEAgLTg5Miw2ICs5NjIsNyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorQ09ORklHX1NDSEVEX0RFQlVHPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CkBAIC05MTUsNyArOTg2LDcgQEAKIENPTkZJR19ERUJVR0dFUj15CiAjIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAotQ09ORklHX0JPT1RYX1RFWFQ9eQorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX0VBUkxZX0RFQlVHPXkKICMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0CkBAIC05MzIsMTAgKzEwMDMsNiBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCiBDT05GSUdfQ1JZUFRPPXkKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKQEAgLTk3Myw3ICsxMDQwLDQgQEAKICMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIworQ09ORklHX0NSWVBUT19IVz15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wbWFjMzJfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcG1hYzMyX2RlZmNvbmZpZwppbmRleCAwZDhiYTYyLi4wODUyNWQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wbWFjMzJfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BtYWMzMl9kZWZjb25maWcKQEAgLTIxOCw3ICsyMTgsNyBAQAogQ09ORklHX1BNX0RFQlVHPXkKICMgQ09ORklHX0RJU0FCTEVfQ09OU09MRV9TVVNQRU5EIGlzIG5vdCBzZXQKIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19TT0ZUV0FSRV9TVVNQRU5EPXkKK0NPTkZJR19ISUJFUk5BVElPTj15CiBDT05GSUdfUE1fU1REX1BBUlRJVElPTj0iIgogQ09ORklHX0FQTV9FTVVMQVRJT049eQogQ09ORklHX1NFQ0NPTVA9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNDJjNDJlYy4uZjM5YTcyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0zNyw5ICszNyw5IEBACiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfNnh4KQkJKz0gaWRsZV82eHgubyBsMmNyXzZ4eC5vIGNwdV9zZXR1cF82eHgubwogb2JqLSQoQ09ORklHX1RBVSkJCSs9IHRhdV82eHgubwotb2JqLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpCSs9IHN3c3VzcC5vIHN1c3BlbmQubwotb2JqMzItJChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkgKz0gc3dzdXNwXzMyLm8KLW9iajY0LSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpICs9IHN3c3VzcF82NC5vIHN3c3VzcF9hc202NC5vCitvYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IHN3c3VzcC5vIHN1c3BlbmQubworb2JqMzItJChDT05GSUdfSElCRVJOQVRJT04pICs9IHN3c3VzcF8zMi5vCitvYmo2NC0kKENPTkZJR19ISUJFUk5BVElPTikgKz0gc3dzdXNwXzY0Lm8gc3dzdXNwX2FzbTY0Lm8KIG9iajMyLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGVfMzIubwogCiBpZmVxICgkKENPTkZJR19QUENfTUVSR0UpLHkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDhjZGQ0OGUuLjE0NDhhZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC04MDksOCArODA5LDkgQEAKIAltdG1zcmQJcjI0CQkJLyogUkkgb24gKi8KIAlsaHoJcjI0LFBBQ0FQQUNBSU5ERVgocjEzKQkvKiBHZXQgcHJvY2Vzc29yICMgKi8KIAljbXB3aQkwLHIyNCwwCQkJLyogQXJlIHdlIHByb2Nlc3NvciAwPyAqLwotCWJlcQkuX19zdGFydF9pbml0aWFsaXphdGlvbl9pU2VyaWVzCS8qIFN0YXJ0IHVwIHRoZSBmaXJzdCBwcm9jZXNzb3IgKi8KLQltZnNwcglyNCxTUFJOX0NUUkxGCisJYm5lCTFmCisJYgkuX19zdGFydF9pbml0aWFsaXphdGlvbl9pU2VyaWVzCS8qIFN0YXJ0IHVwIHRoZSBmaXJzdCBwcm9jZXNzb3IgKi8KKzE6CW1mc3ByCXI0LFNQUk5fQ1RSTEYKIAlsaQlyNSxDVFJMX1JVTkxBVENICS8qIFR1cm4gb2ZmIHRoZSBydW4gbGlnaHQgKi8KIAlhbmRjCXI0LHI0LHI1CiAJbXRzcHIJU1BSTl9DVFJMVCxyNApAQCAtMTYxMSw3ICsxNjEyLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi1fU1RBVElDKF9fc3RhcnRfaW5pdGlhbGl6YXRpb25faVNlcmllcykKK19JTklUX1NUQVRJQyhfX3N0YXJ0X2luaXRpYWxpemF0aW9uX2lTZXJpZXMpCiAJLyogQ2xlYXIgb3V0IHRoZSBCU1MgKi8KIAlMT0FEX1JFR19JTU1FRElBVEUocjExLF9fYnNzX3N0b3ApCiAJTE9BRF9SRUdfSU1NRURJQVRFKHI4LF9fYnNzX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jCmluZGV4IDYwMWVmNzkuLjJhNWNmODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogCiAvKgogICogSGVyZSBjb21lcyB0aGUgcHBjNjQgaW1wbGVtZW50YXRpb24gb2YgdGhlIElPTUFQIApAQCAtMTM2LDcgKzEzNywxMiBAQAogCiB2b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkvKiBOb3RoaW5nIHRvIGRvICovCisJaWYgKGlzYV92YWRkcl9pc19pb3BvcnQoYWRkcikpCisJCXJldHVybjsKKwlpZiAocGNpYmlvc192YWRkcl9pc19pb3BvcnQoYWRkcikpCisJCXJldHVybjsKKwlpb3VubWFwKGFkZHIpOwogfQorCiBFWFBPUlRfU1lNQk9MKHBjaV9pb21hcCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9pb3VubWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCmluZGV4IDJmYzg3ODYuLjI0YmVhOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwpAQCAtNDE4LDEwICs0MTgsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpcnFfdG9faHcpOwogCi1zdHJ1Y3QgaXJxX2hvc3QgKmlycV9hbGxvY19ob3N0KHVuc2lnbmVkIGludCByZXZtYXBfdHlwZSwKLQkJCQl1bnNpZ25lZCBpbnQgcmV2bWFwX2FyZywKLQkJCQlzdHJ1Y3QgaXJxX2hvc3Rfb3BzICpvcHMsCi0JCQkJaXJxX2h3X251bWJlcl90IGludmFsX2lycSkKK19faW5pdF9yZWZvayBzdHJ1Y3QgaXJxX2hvc3QgKmlycV9hbGxvY19ob3N0KHVuc2lnbmVkIGludCByZXZtYXBfdHlwZSwKKwkJCQkJCXVuc2lnbmVkIGludCByZXZtYXBfYXJnLAorCQkJCQkJc3RydWN0IGlycV9ob3N0X29wcyAqb3BzLAorCQkJCQkJaXJxX2h3X251bWJlcl90IGludmFsX2lycSkKIHsKIAlzdHJ1Y3QgaXJxX2hvc3QgKmhvc3Q7CiAJdW5zaWduZWQgaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGlycV9ob3N0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKaW5kZXggZmU3ZDEyNS4uMDgzY2ZiZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7CiB9CiAKLXN0cnVjdCBwY2lfY29udHJvbGxlciAqIHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK19faW5pdF9yZWZvayBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CiAKQEAgLTEwMSw2ICsxMDEsMjkgQEAKIAkJa2ZyZWUocGhiKTsKIH0KIAoraW50IHBjaWJpb3NfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvc2UsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgeworI2lmZGVmIENPTkZJR19QUEM2NAorCQlzaXplID0gaG9zZS0+cGNpX2lvX3NpemU7CisjZWxzZQorCQlzaXplID0gaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxOworI2VuZGlmCisJCWlmIChhZGRyZXNzID49IGhvc2UtPmlvX2Jhc2VfdmlydCAmJgorCQkgICAgYWRkcmVzcyA8IChob3NlLT5pb19iYXNlX3ZpcnQgKyBzaXplKSkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogUmV0dXJuIHRoZSBkb21haW4gbnVtYmVyIGZvciB0aGlzIGJ1cy4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggMGFkZjA3Ny4uY2QzNWM5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC02MCw2ICs2MCwyNCBAQAogc3RhdGljIGludCBwY2lfYnVzX2NvdW50OwogCiBzdGF0aWMgdm9pZAorZml4dXBfaGlkZV9ob3N0X3Jlc291cmNlX2ZzbChzdHJ1Y3QgcGNpX2RldiogZGV2KQoreworCWludCBpLCBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKKworCWlmICgoY2xhc3MgPT0gUENJX0NMQVNTX1BST0NFU1NPUl9QT1dFUlBDKSAmJgorCQkoZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfTk9STUFMKSAmJgorCQkoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKKwkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOworCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOworCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7CisJCX0KKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9NT1RPUk9MQSwgUENJX0FOWV9JRCwgZml4dXBfaGlkZV9ob3N0X3Jlc291cmNlX2ZzbCk7IAorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfRlJFRVNDQUxFLCBQQ0lfQU5ZX0lELCBmaXh1cF9oaWRlX2hvc3RfcmVzb3VyY2VfZnNsKTsgCisKK3N0YXRpYyB2b2lkCiBmaXh1cF9icm9rZW5fcGNuZXQzMihzdHJ1Y3QgcGNpX2RldiogZGV2KQogewogCWlmICgoZGV2LT5jbGFzcz4+OCA9PSBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCkpIHsKQEAgLTQxNSwxNSArNDMzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdAotdXBkYXRlX2JyaWRnZV9iYXNlKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBpKQordm9pZCBfX2luaXQKK3VwZGF0ZV9icmlkZ2VfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBidXMtPnJlc291cmNlW2ldOwogCXU4IGlvX2Jhc2VfbG8sIGlvX2xpbWl0X2xvOwogCXUxNiBtZW1fYmFzZSwgbWVtX2xpbWl0OwogCXUxNiBjbWQ7CiAJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBvZmY7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IGJ1cy0+c2VsZjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBkZXYtPnN5c2RhdGE7CiAKIAlpZiAoIWhvc2UpIHsKQEAgLTQ2NywxMiArNDgzLDIwIEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgbWVtX2xpbWl0KTsKIAogCX0gZWxzZSB7Ci0JCURCRyhLRVJOX0VSUiAiUENJOiB1Z2gsIGJyaWRnZSAlcyByZXMgJWQgaGFzIGZsYWdzPSVseFxuIiwKLQkJICAgIHBjaV9uYW1lKGRldiksIGksIHJlcy0+ZmxhZ3MpOworCQlEQkcoS0VSTl9FUlIgIlBDSTogdWdoLCBicmlkZ2UgJXMgcmVzIGhhcyBmbGFncz0lbHhcbiIsCisJCSAgICBwY2lfbmFtZShkZXYpLCByZXMtPmZsYWdzKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdAordXBkYXRlX2JyaWRnZV9iYXNlKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBpKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gYnVzLT5yZXNvdXJjZVtpXTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYnVzLT5zZWxmOworCXVwZGF0ZV9icmlkZ2VfcmVzb3VyY2UoZGV2LCByZXMpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYWxsb2NfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlkeCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnByLCAqciA9ICZkZXYtPnJlc291cmNlW2lkeF07CkBAIC0xMjIzLDcgKzEyNDcsNyBAQAogCiBzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKIAotdm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3ZvaWQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGlvX29mZnNldDsKQEAgLTE0NjgsMyArMTQ5MiwxMCBAQAogRUFSTFlfUENJX09QKHdyaXRlLCBieXRlLCB1OCkKIEVBUkxZX1BDSV9PUCh3cml0ZSwgd29yZCwgdTE2KQogRUFSTFlfUENJX09QKHdyaXRlLCBkd29yZCwgdTMyKQorCitleHRlcm4gaW50IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5IChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBjYXApOworaW50IGVhcmx5X2ZpbmRfY2FwYWJpbGl0eShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZmbiwKKwkJCSAgaW50IGNhcCkKK3sKKwlyZXR1cm4gcGNpX2J1c19maW5kX2NhcGFiaWxpdHkoZmFrZV9wY2lfYnVzKGhvc2UsIGJ1cyksIGRldmZuLCBjYXApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA4NGYwMDBhLi5hODM3MjdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtNDIzLDcgKzQyMywxMSBAQAogCXByaW50aygiICBDUjogJTA4bHggIFhFUjogJTA4bHhcbiIsIHJlZ3MtPmNjciwgcmVncy0+eGVyKTsKIAl0cmFwID0gVFJBUChyZWdzKTsKIAlpZiAodHJhcCA9PSAweDMwMCB8fCB0cmFwID09IDB4NjAwKQorI2lmIGRlZmluZWQoQ09ORklHXzR4eCkgfHwgZGVmaW5lZChDT05GSUdfQk9PS0UpCisJCXByaW50aygiREVBUjogIlJFRyIsIEVTUjogIlJFRyJcbiIsIHJlZ3MtPmRhciwgcmVncy0+ZHNpc3IpOworI2Vsc2UKIAkJcHJpbnRrKCJEQVI6ICJSRUciLCBEU0lTUjogIlJFRyJcbiIsIHJlZ3MtPmRhciwgcmVncy0+ZHNpc3IpOworI2VuZGlmCiAJcHJpbnRrKCJUQVNLID0gJXBbJWRdICclcycgVEhSRUFEOiAlcCIsCiAJICAgICAgIGN1cnJlbnQsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgdGFza190aHJlYWRfaW5mbyhjdXJyZW50KSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggMzc4NmRjYy4uYjVjOTZhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTI0LDcgKzI0LDcgQEAKIC8qIE1heCBhZGRyZXNzIHNpemUgd2UgZGVhbCB3aXRoICovCiAjZGVmaW5lIE9GX01BWF9BRERSX0NFTExTCTQKICNkZWZpbmUgT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykJKChuYSkgPiAwICYmIChuYSkgPD0gT0ZfTUFYX0FERFJfQ0VMTFMgJiYgXAotCQkJKG5zKSA+PSAwKQorCQkJKG5zKSA+IDApCiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfYnVzICpvZl9tYXRjaF9idXMoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBzdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCmluZGV4IDQ5MjRjNDguLjUwZWYzOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwpAQCAtNDk2LDYgKzQ5NiwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiODA0MiIpOworCQkvKiBQZWdhc29zIGhhcyBubyBkZXZpY2VfdHlwZSBvbiBpdHMgODA0MiBub2RlLCBsb29rIGZvciB0aGUKKwkJICogbmFtZSBpbnN0ZWFkICovCisJCWlmICghbnApCisJCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICI4MDQyIik7CiAJCWJyZWFrOwogCWNhc2UgRkRDX0JBU0U6IC8qIEZEQzEgKi8KIAkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiZmRjIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMKaW5kZXggZmM2NjQ3ZC4uZjg1ZjQwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzY2FsbHMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3VkYmcuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jCmluZGV4IGNiY2ExZGYuLjBmOWI0ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jCkBAIC0xNTUsNyArMTU1LDcgQEAKICAqIENhbGxlZCBieSBzZXR1cF9zeXN0ZW0gYWZ0ZXIgcHBjX21kLT5wcm9iZSBhbmQgcHBjX21kLT5lYXJseV9pbml0LgogICogQ2FsbCBpdCBhZ2FpbiBhZnRlciBzZXR0aW5nIHVkYmdfcHV0YyBpbiBwcGNfbWQtPnNldHVwX2FyY2guCiAgKi8KLXZvaWQgcmVnaXN0ZXJfZWFybHlfdWRiZ19jb25zb2xlKHZvaWQpCit2b2lkIF9faW5pdCByZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUodm9pZCkKIHsKIAlpZiAoZWFybHlfY29uc29sZV9pbml0aWFsaXplZCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jIGIvYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jCmluZGV4IDJmMjRlYTAuLmFkYTViNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvcmhlYXAuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL3JoZWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbG1iLmMgYi9hcmNoL3Bvd2VycGMvbW0vbG1iLmMKaW5kZXggZTNhMWU4ZC4uOGY0ZDJkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2xtYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9sbWIuYwpAQCAtMTM4LDggKzEzOCw4IEBACiBzdGF0aWMgbG9uZyBfX2luaXQgbG1iX2FkZF9yZWdpb24oc3RydWN0IGxtYl9yZWdpb24gKnJnbiwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgaSwgY29hbGVzY2VkID0gMDsKLQlsb25nIGFkamFjZW50OworCXVuc2lnbmVkIGxvbmcgY29hbGVzY2VkID0gMDsKKwlsb25nIGFkamFjZW50LCBpOwogCiAJLyogRmlyc3QgdHJ5IGFuZCBjb2FsZXNjZSB0aGlzIExNQiB3aXRoIGFub3RoZXIuICovCiAJZm9yIChpPTA7IGkgPCByZ24tPmNudDsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9zcHVfdGFza19zeW5jLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9zcHVfdGFza19zeW5jLmMKaW5kZXggMTMzNjY1Ny4uNGE4OTBjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Rhc2tfc3luYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV90YXNrX3N5bmMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Rjb29raWVzLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKaW5kZXggZGEyMDgzMi4uMmQxYjA1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKQEAgLTU1Myw3ICs1NTMsOCBAQAogCiAJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsCiAJCQkgICByLnN0YXJ0ICsgb2Zmc2V0b2YocGNpX2NwbTJfdCwgcGNpX2NmZ19hZGRyKSwKLQkJCSAgIHIuc3RhcnQgKyBvZmZzZXRvZihwY2lfY3BtMl90LCBwY2lfY2ZnX2RhdGEpKTsKKwkJCSAgIHIuc3RhcnQgKyBvZmZzZXRvZihwY2lfY3BtMl90LCBwY2lfY2ZnX2RhdGEpLAorCQkJICAgMCk7CiAKIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIG5wLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCBjMGUyYjg5Li45MjA2OTQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC03NCwxMSArNzQsMTEgQEAKIAkgKi8KIAkvKiBQQ0kgMSAqLwogCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODUwMCkgewotCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODMwMCwgaW1tciArIDB4ODMwNCk7CisJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzAwLCBpbW1yICsgMHg4MzA0LCAwKTsKIAl9CiAJLyogUENJIDIgKi8KIAlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDg2MDApIHsKLQkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDgzODAsIGltbXIgKyAweDgzODQpOworCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODM4MCwgaW1tciArIDB4ODM4NCwgMCk7CiAJCXByaW1hcnkgPSAwOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwppbmRleCA2Mjk5MjZlLi5mNTgxODQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwpAQCAtMTgsNiArMTgsNyBAQAogY29uZmlnIE1QQzg1eHhfQ0RTCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzg1eHggQ0RTIgogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCXNlbGVjdCBQUENfSTgyNTkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4NXh4IENEUyBib2FyZAogCkBAIC0zMCw2ICszMSw3IEBACiAKIGNvbmZpZyBNUEM4NTQ0X0RTCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzg1NDQgRFMiCisJc2VsZWN0IFBQQ19JODI1OQogCXNlbGVjdCBERUZBVUxUX1VJTUFHRQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1QQzg1NDQgRFMgYm9hcmQKQEAgLTUwLDkgKzUyLDkgQEAKIGNvbmZpZyBNUEM4NXh4CiAJYm9vbAogCXNlbGVjdCBQUENfVURCR18xNjU1MAotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0lfQkUKKwlzZWxlY3QgUFBDX0lORElSRUNUX1BDSSBpZiBQQ0kKIAlzZWxlY3QgTVBJQworCXNlbGVjdCBGU0xfUENJIGlmIFBDSQogCXNlbGVjdCBTRVJJQUxfODI1MF9TSEFSRV9JUlEgaWYgU0VSSUFMXzgyNTAKIAlkZWZhdWx0IHkgaWYgTVBDODU0MF9BRFMgfHwgTVBDODV4eF9DRFMgfHwgTVBDODU2MF9BRFMgXAogCQl8fCBNUEM4NXh4X01EUyB8fCBNUEM4NTQ0X0RTCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKaW5kZXggNGUwMmNiYi4uZDcwZjJkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBQb3dlclBDIDg1eHggbGludXgga2VybmVsLgogIwotb2JqLSQoQ09ORklHX1BQQ184NXh4KQkrPSBtaXNjLm8gcGNpLm8KK29iai0kKENPTkZJR19QUENfODV4eCkJKz0gbWlzYy5vCiBvYmotJChDT05GSUdfTVBDODU0MF9BRFMpICs9IG1wYzg1eHhfYWRzLm8KIG9iai0kKENPTkZJR19NUEM4NTYwX0FEUykgKz0gbXBjODV4eF9hZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfQ0RTKSArPSBtcGM4NXh4X2Nkcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYwppbmRleCA2ZmI5MGFhLi40OTA1ZjZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMKQEAgLTIsNiArMiw4IEBACiAgKiBNUEM4NTQ0IERTIEJvYXJkIFNldHVwCiAgKgogICogQXV0aG9yIFhpYW5naHVhIFhpYW8gKHgueGlhb0BmcmVlc2NhbGUuY29tKQorICogUm95IFphbmcgPHRpZS1mZWkuemFuZ0BmcmVlc2NhbGUuY29tPgorICogCS0gQWRkIFBDSS9QQ0kgRXhwcmVlcyBzdXBwb3J0CiAgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMiwxMyArMTQsMTYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vbXBjODV4eC5oPgogI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTI3LDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KICNpbmNsdWRlICJtcGM4NXh4LmgiCiAKICN1bmRlZiBERUJVRwpAQCAtMzcsNiArNDMsMTcgQEAKICNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQ19JODI1OQorc3RhdGljIHZvaWQgbXBjODU0NF84MjU5X2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXVuc2lnbmVkIGludCBjYXNjYWRlX2lycSA9IGk4MjU5X2lycSgpOworCisJaWYgKGNhc2NhZGVfaXJxICE9IE5PX0lSUSkgeworCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOworCX0KKwlkZXNjLT5jaGlwLT5lb2koaXJxKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfUFBDX0k4MjU5ICovCiAKIHZvaWQgX19pbml0IG1wYzg1NDRfZHNfcGljX2luaXQodm9pZCkKIHsKQEAgLTk2LDE5ICsxMTMsMjQwIEBACiAjZW5kaWYJLyogQ09ORklHX1BQQ19JODI1OSAqLwogfQogCisjaWZkZWYgQ09ORklHX1BDSQorZW51bSBwaXJxIHsgUElSUUEgPSA4LCBQSVJRQiwgUElSUUMsIFBJUlFELCBQSVJRRSwgUElSUUYsIFBJUlFHLCBQSVJRSCB9OworCisvKgorICogVmFsdWUgaW4gIHRhYmxlIC0tIElSUSBudW1iZXIKKyAqLworY29uc3QgdW5zaWduZWQgY2hhciB1bGkxNTc1X2lycV9yb3V0ZV90YWJsZVsxNl0gPSB7CisJMCwJCS8qIDA6IFJlc2VydmVkICovCisJMHg4LAorCTAsCQkvKiAyOiBSZXNlcnZlZCAqLworCTB4MiwKKwkweDQsCisJMHg1LAorCTB4NywKKwkweDYsCisJMCwJCS8qIDg6IFJlc2VydmVkICovCisJMHgxLAorCTB4MywKKwkweDksCisJMHhiLAorCTAsCQkvKiAxMzogUmVzZXJ2ZWQgKi8KKwkweGQsCisJMHhmLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2dldF9wY2lfaXJxX2Zyb21fb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgc2xvdCwgaW50IHBpbikKK3sKKwlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7CisJdTMyIGxhZGRyWzNdOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaG9zZW5vZGUgPSBob3NlID8gaG9zZS0+YXJjaF9kYXRhIDogTlVMTDsKKworCWlmICghaG9zZW5vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJbGFkZHJbMF0gPSAoaG9zZS0+Zmlyc3RfYnVzbm8gPDwgMTYpIHwgKFBDSV9ERVZGTihzbG90LCAwKSA8PCA4KTsKKwlsYWRkclsxXSA9IGxhZGRyWzJdID0gMDsKKwlvZl9pcnFfbWFwX3Jhdyhob3Nlbm9kZSwgJnBpbiwgMSwgbGFkZHIsICZvaXJxKTsKKwlEQkcoIm1wYzg1NDRfZHM6IHBjaSBpcnEgYWRkciAleCwgc2xvdCAlZCwgcGluICVkLCBpcnEgJWRcbiIsCisJICAgIGxhZGRyWzBdLCBzbG90LCBwaW4sIG9pcnEuc3BlY2lmaWVyWzBdKTsKKwlyZXR1cm4gb2lycS5zcGVjaWZpZXJbMF07Cit9CisKKy8qODI1OSovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfdWxpMTU3NShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwl1bnNpZ25lZCBjaGFyIGlycTJwaW5bMTZdOworCXVuc2lnbmVkIGxvbmcgcGlycV9tYXBfd29yZCA9IDA7CisJdTMyIGlycTsKKwlpbnQgaTsKKworCS8qCisJICogVUxJMTU3NSBpbnRlcnJ1cHRzIHJvdXRlIHNldHVwCisJICovCisJbWVtc2V0KGlycTJwaW4sIDAsIDE2KTsJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IHZhbHVlIDAgKi8KKworCWlycTJwaW5bNl09UElSUUErMzsJLyogZW5hYmxlZCBtYXBwaW5nIGZvciBJUlE2IHRvIFBJUlFELCB1c2VkIGJ5IFNBVEEgKi8KKworCS8qCisJICogUElSUUUgLT4gUElSUUYgbWFwcGluZyBzZXQgbWFudWFsbHkKKwkgKgorCSAqIElSUSBwaW4gICBJUlEjCisJICogUElSUUUgLS0tLSA5CisJICogUElSUUYgLS0tLSAxMAorCSAqIFBJUlFHIC0tLS0gMTEKKwkgKiBQSVJRSCAtLS0tIDEyCisJICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJaXJxMnBpbltpICsgOV0gPSBQSVJRRSArIGk7CisKKwkvKiBTZXQgSVJRLVBJUlEgTWFwcGluZyB0byBVTEkxNTc1ICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWlmIChpcnEycGluW2ldKQorCQkJcGlycV9tYXBfd29yZCB8PSAodWxpMTU3NV9pcnFfcm91dGVfdGFibGVbaV0gJiAweGYpCisJCQkgICAgPDwgKChpcnEycGluW2ldIC0gUElSUUEpICogNCk7CisKKwlwaXJxX21hcF93b3JkIHw9IDE8PDI2OwkvKiBkaXNhYmxlIElOVHggaW4gRVAgbW9kZSovCisKKwkvKiBVTEkxNTc1IElSUSBtYXBwaW5nIGNvbmYgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZSBpcyAweGI5MzE3NTQyICovCisJREJHKCJTZXR1cCBVTEkxNTc1IElSUSBtYXBwaW5nIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUgPSAweCV4XG4iLAorCQkoaW50KXBpcnFfbWFwX3dvcmQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQ4LCBwaXJxX21hcF93b3JkKTsKKworI2RlZmluZSBVTEkxNTc1X1NFVF9ERVZfSVJRKHNsb3QsIHBpbiwgcmVnKQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpbnQgaXJxOwkJCQkJCVwKKwkJaXJxID0gZ2V0X3BjaV9pcnFfZnJvbV9vZihob3NlLCBzbG90LCBwaW4pOwkJXAorCQlpZiAoaXJxID4gMCAmJiBpcnEgPCAxNikgCQkJCVwKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHJlZywgaXJxMnBpbltpcnFdKTsJXAorCQllbHNlCQkJCQkJCVwKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVMSTE1NzUgZGV2aWNlIgkJXAorCQkJCSIoc2xvdCAlZCwgcGluICVkKSBpcnEgJWQgaXMgaW52YWxpZC5cbiIsIFwKKwkJCQlzbG90LCBwaW4sIGlycSk7CQkJXAorCX0gd2hpbGUoMCkKKworCS8qIFVTQiAxLjEgT0hDSSBjb250cm9sbGVyIDEsIHNsb3QgMjgsIHBpbiAxICovCisJVUxJMTU3NV9TRVRfREVWX0lSUSgyOCwgMSwgMHg4Nik7CisKKwkvKiBVU0IgMS4xIE9IQ0kgY29udHJvbGxlciAyLCBzbG90IDI4LCBwaW4gMiAqLworCVVMSTE1NzVfU0VUX0RFVl9JUlEoMjgsIDIsIDB4ODcpOworCisJLyogVVNCIDEuMSBPSENJIGNvbnRyb2xsZXIgMywgc2xvdCAyOCwgcGluIDMgKi8KKwlVTEkxNTc1X1NFVF9ERVZfSVJRKDI4LCAzLCAweDg4KTsKKworCS8qIFVTQiAyLjAgY29udHJvbGxlciwgc2xvdCAyOCwgcGluIDQgKi8KKwlpcnEgPSBnZXRfcGNpX2lycV9mcm9tX29mKGhvc2UsIDI4LCA0KTsKKwlpZiAoaXJxID49IDAgJiYgaXJxIDw9IDE1KQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg3NCwgdWxpMTU3NV9pcnFfcm91dGVfdGFibGVbaXJxXSk7CisKKwkvKiBBdWRpbyBjb250cm9sbGVyLCBzbG90IDI5LCBwaW4gMSAqLworCVVMSTE1NzVfU0VUX0RFVl9JUlEoMjksIDEsIDB4OGEpOworCisJLyogTW9kZW0gY29udHJvbGxlciwgc2xvdCAyOSwgcGluIDIgKi8KKwlVTEkxNTc1X1NFVF9ERVZfSVJRKDI5LCAyLCAweDhiKTsKKworCS8qIEhEIGF1ZGlvIGNvbnRyb2xsZXIsIHNsb3QgMjksIHBpbiAzICovCisJVUxJMTU3NV9TRVRfREVWX0lSUSgyOSwgMywgMHg4Yyk7CisKKwkvKiBTTUIgaW50ZXJydXB0OiBzbG90IDMwLCBwaW4gMSAqLworCVVMSTE1NzVfU0VUX0RFVl9JUlEoMzAsIDEsIDB4OGUpOworCisJLyogUE1VIEFDUEkgU0NJIGludGVycnVwdDogc2xvdCAzMCwgcGluIDIgKi8KKwlVTEkxNTc1X1NFVF9ERVZfSVJRKDMwLCAyLCAweDhmKTsKKworCS8qIFNlcmlhbCBBVEEgaW50ZXJydXB0OiBzbG90IDMxLCBwaW4gMSAqLworCVVMSTE1NzVfU0VUX0RFVl9JUlEoMzEsIDEsIDB4OGQpOworCisJLyogUHJpbWFyeSBQQVRBIElERSBJUlE6IDE0CisJICogU2Vjb25kYXJ5IFBBVEEgSURFIElSUTogMTUKKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCAweDMwIHwgdWxpMTU3NV9pcnFfcm91dGVfdGFibGVbMTRdKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDc1LCB1bGkxNTc1X2lycV9yb3V0ZV90YWJsZVsxNV0pOworCisJLyogU2V0IElSUTE0IGFuZCBJUlExNSB0byBsZWdhY3kgSVJRcyAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0NiwgJnRlbXApOworCXRlbXAgfD0gMHhjMDAwOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NDYsIHRlbXApOworCisJLyogU2V0IGk4MjU5IGludGVycnVwdCB0cmlnZ2VyCisJICogSVJRIDM6ICBMZXZlbAorCSAqIElSUSA0OiAgTGV2ZWwKKwkgKiBJUlEgNTogIExldmVsCisJICogSVJRIDY6ICBMZXZlbAorCSAqIElSUSA3OiAgTGV2ZWwKKwkgKiBJUlEgOTogIExldmVsCisJICogSVJRIDEwOiBMZXZlbAorCSAqIElSUSAxMTogTGV2ZWwKKwkgKiBJUlEgMTI6IExldmVsCisJICogSVJRIDE0OiBFZGdlCisJICogSVJRIDE1OiBFZGdlCisJICovCisJb3V0YigweGZhLCAweDRkMCk7CisJb3V0YigweDFlLCAweDRkMSk7CisKKyN1bmRlZiBVTEkxNTc1X1NFVF9ERVZfSVJRCit9CisKKy8qIFNBVEEgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya191bGk1Mjg4KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDgzLCAmYyk7CisJYyB8PSAweDgwOwkJLyogcmVhZC93cml0ZSBsb2NrICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4MywgYyk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDA5LCAweDAxKTsJLyogQmFzZSBjbGFzcyBjb2RlOiBzdG9yYWdlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHgwYSwgMHgwNik7CS8qIElERSBkaXNrICovCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4ODMsICZjKTsKKwljICY9IDB4N2Y7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4MywgYyk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4ODQsICZjKTsKKwljIHw9IDB4MDE7CQkJCS8qIGVtdWxhdGVkIFBBVEEgbW9kZSBlbmFibGVkICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4NCwgYyk7Cit9CisKKy8qIFBBVEEgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya191bGk1MjI5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDA0LCAweDA0MDUpOwkvKiBNRU0gSU8gTVNJICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDRhLCAmdGVtcCk7CisJdGVtcCB8PSAweDEwMDA7CQkJCS8qIEVuYWJsZSBOYXRpdmUgSVJRIDE0LzE1ICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgdGVtcCk7Cit9CisKKy8qQnJpZGdlKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlYXJseV91bGk1MjQ5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4MDQsIDB4MDAwNyk7CS8qIG1lbSBhY2Nlc3MgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4N2MsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDdjLCAweDgwKTsJLyogUi9XIGxvY2sgY29udHJvbCAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4MDksIDB4MDEpOwkvKiBzZXQgYXMgcGNpLXBjaSBicmlkZ2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDdjLCB0ZW1wKTsJLyogcmVzdG9yZSBwY2kgYnVzIGRlYnVnIGNvbnRyb2wgKi8KKwlkZXYtPmNsYXNzIHw9IDB4MTsKK30KKworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQUwsIDB4MTU3NSwgcXVpcmtfdWxpMTU3NSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BTCwgMHg1Mjg4LCBxdWlya191bGk1Mjg4KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0FMLCAweDUyMjksIHF1aXJrX3VsaTUyMjkpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9BTCwgMHg1MjQ5LCBlYXJseV91bGk1MjQ5KTsKKyNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKIC8qCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NTQ0X2RzX3NldHVwX2FyY2godm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKyNlbmRpZgorCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJtcGM4NTQ0X2RzX3NldHVwX2FyY2goKSIsIDApOwogCisjaWZkZWYgQ09ORklHX1BDSQorCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKKwkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJzcmMpOworCQlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweGIwMDApCisJCQlmc2xfYWRkX2JyaWRnZShucCwgMSk7CisJCWVsc2UKKwkJCWZzbF9hZGRfYnJpZGdlKG5wLCAwKTsKKwl9CisjZW5kaWYKKwogCXByaW50aygiTVBDODU0NCBEUyBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKIH0KIAotCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KQEAgLTEyNCw2ICszNjIsNyBAQAogCS5wcm9iZQkJCT0gbXBjODU0NF9kc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBtcGM4NTQ0X2RzX3NldHVwX2FyY2gsCiAJLmluaXRfSVJRCQk9IG1wYzg1NDRfZHNfcGljX2luaXQsCisJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBtcGM4NXh4X3Jlc3RhcnQsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaAppbmRleCA3Mjg2ZmZhLi41YjM0ZGVlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKQEAgLTE1LDQgKzE1LDMgQEAKICAqLwogCiBleHRlcm4gdm9pZCBtcGM4NXh4X3Jlc3RhcnQoY2hhciAqKTsKLWV4dGVybiBpbnQgbXBjODV4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKaW5kZXggNzIzNWY3MC4uNDBhODI4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vdWRiZy5oPgogCiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogI2luY2x1ZGUgIm1wYzg1eHguaCIKIAogI2lmZGVmIENPTkZJR19DUE0yCkBAIC0yMTcsNyArMjE4LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCW1wYzg1eHhfYWRkX2JyaWRnZShucCk7CisJCWZzbF9hZGRfYnJpZGdlKG5wLCAxKTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwppbmRleCA1MGM4ZDY0Li42YTE3MWU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTQ1LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KICNpbmNsdWRlICJtcGM4NXh4LmgiCiAKIHN0YXRpYyBpbnQgY2RzX3BjaV9zbG90ID0gMjsKQEAgLTU4LDggKzYwLDYgQEAKIHN0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCiAJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKChidXMgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCS8qIFdlIGV4cGxpY2l0bHkgZG8gbm90IGdvIHBhc3QgdGhlIFR1bmRyYSAzMjAgQnJpZGdlICovCiAJaWYgKChidXMgPT0gMSkgJiYgKFBDSV9TTE9UKGRldmZuKSA9PSBBUkNBRElBXzJORF9CUklER0VfSURTRUwpKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtNjksNiArNjksMzcgQEAKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAorc3RhdGljIHZvaWQgbXBjODV4eF9jZHNfcmVzdGFydChjaGFyICpjbWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwl1X2NoYXIgdG1wOworCisJaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2LAorCQkJCQlOVUxMKSkpIHsKKworCQkvKiBVc2UgdGhlIFZJQSBTdXBlciBTb3V0aGJyaWRnZSB0byBmb3JjZSBhIFBDSSByZXNldCAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDcsICZ0bXApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ3LCB0bXAgfCAxKTsKKworCQkvKiBGbHVzaCB0aGUgb3V0Ym91bmQgUENJIHdyaXRlIHF1ZXVlcyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDcsICZ0bXApOworCisJCS8qCisJCSAqICBBdCB0aGlzIHBvaW50LCB0aGUgaGFyd2FyZSByZXNldCBzaG91bGQgaGF2ZSB0cmlnZ2VyZWQuCisJCSAqICBIb3dldmVyLCBpZiBpdCBkb2Vzbid0IHdvcmsgZm9yIHNvbWUgbXlzdGVyaW91cyByZWFzb24sCisJCSAqICBqdXN0IGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCByZXNldCBiZWxvdy4KKwkJICovCisKKwkJcGNpX2Rldl9wdXQoZGV2KTsKKwl9CisKKwkvKgorCSAqICBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBWSUEgY2hpcCAobWF5YmUgdGhlIFAyUCBicmlkZ2UgaXMgZGlzYWJsZWQpCisJICogIG9yIHRoZSBWSUEgY2hpcCByZXNldCBkaWRuJ3Qgd29yaywganVzdCB1c2UgdGhlIGRlZmF1bHQgcmVzZXQuCisJICovCisJbXBjODV4eF9yZXN0YXJ0KE5VTEwpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9jZHNfcGNpX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVfY2hhciBjOwpAQCAtOTgsNyArMTI5LDcgQEAKIAkJLyogVGhlcmUgYXJlIHR3byBVU0IgY29udHJvbGxlcnMuCiAJCSAqIElkZW50aWZ5IHRoZW0gYnkgZnVuY3RvbiBudW1iZXIKIAkJICovCi0JCQlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikpCisJCQlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikgPT0gMykKIAkJCQlkZXYtPmlycSA9IDExOwogCQkJZWxzZQogCQkJCWRldi0+aXJxID0gMTA7CkBAIC0xMDksMTcgKzE0MCw0MSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX19kZXZpbml0IHNraXBfZmFrZV9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiBNYWtlIGl0IGFuIGVycm9yIHRvIHNraXAgdGhlIGZha2UgYnJpZGdlCisJICogaW4gcGNpX3NldHVwX2RldmljZSgpIGluIHByb2JlLmMgKi8KKwlkZXYtPmhkcl90eXBlID0gMHg3ZjsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgMHgzZmZmLCBza2lwX2Zha2VfYnJpZGdlKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4M2ZmZiwgMHgxOTU3LCBza2lwX2Zha2VfYnJpZGdlKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4ZmYzZiwgMHg1NzE5LCBza2lwX2Zha2VfYnJpZGdlKTsKKwogI2lmZGVmIENPTkZJR19QUENfSTgyNTkKLSN3YXJuaW5nIFRoZSBpODI1OSBQSUMgc3VwcG9ydCBpcyBjdXJyZW50bHkgYnJva2VuCi1zdGF0aWMgdm9pZCBtcGM4NXh4XzgyNTlfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBtcGM4NXh4XzgyNTlfY2FzY2FkZV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsCisJCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxID0gaTgyNTlfaXJxKCk7CiAKIAlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKQorCQkvKiBoYW5kbGUgYW4gaW50ZXJydXB0IGZyb20gdGhlIDgyNTkgKi8KIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIAotCWRlc2MtPmNoaXAtPmVvaShpcnEpOworCS8qIGNoZWNrIGZvciBhbnkgaW50ZXJydXB0cyBmcm9tIHRoZSBzaGFyZWQgSVJRIGxpbmUgKi8KKwloYW5kbGVfZmFzdGVvaV9pcnEoaXJxLCBkZXNjKTsKIH0KKworc3RhdGljIGlycXJldHVybl90IG1wYzg1eHhfODI1OV9jYXNjYWRlX2FjdGlvbihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtcGM4NXh4Y2RzXzgyNTlfaXJxYWN0aW9uID0geworCS5oYW5kbGVyID0gbXBjODV4eF84MjU5X2Nhc2NhZGVfYWN0aW9uLAorCS5mbGFncyA9IElSUUZfU0hBUkVELAorCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKKwkubmFtZSA9ICI4MjU5IGNhc2NhZGUiLAorfTsKICNlbmRpZiAvKiBQUENfSTgyNTkgKi8KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKQEAgLTEyOCwxMCArMTgzLDYgQEAKIAlzdHJ1Y3QgbXBpYyAqbXBpYzsKIAlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfUFBDX0k4MjU5Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjYXNjYWRlX25vZGUgPSBOVUxMOwotCWludCBjYXNjYWRlX2lycTsKLSNlbmRpZgogCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgIm9wZW4tcGljIik7CiAKQEAgLTE1NSw4ICsyMDYsMTkgQEAKIAlvZl9ub2RlX3B1dChucCk7CiAKIAltcGljX2luaXQobXBpYyk7Cit9CiAKLSNpZmRlZiBDT05GSUdfUFBDX0k4MjU5CisjaWYgZGVmaW5lZChDT05GSUdfUFBDX0k4MjU5KSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCitzdGF0aWMgaW50IG1wYzg1eHhfY2RzXzgyNTlfYXR0YWNoKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNhc2NhZGVfbm9kZSA9IE5VTEw7CisJaW50IGNhc2NhZGVfaXJxOworCisJaWYgKCFtYWNoaW5lX2lzKG1wYzg1eHhfY2RzKSkKKwkJcmV0dXJuIDA7CisKIAkvKiBJbml0aWFsaXplIHRoZSBpODI1OSBjb250cm9sbGVyICovCiAJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKQogCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJjaHJwLGlpYyIpKSB7CkBAIC0xNjYsMjIgKzIyOCwzOSBAQAogCiAJaWYgKGNhc2NhZGVfbm9kZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZmluZCBpODI1OSBQSUNcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWNhc2NhZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2FzY2FkZV9ub2RlLCAwKTsKIAlpZiAoY2FzY2FkZV9pcnEgPT0gTk9fSVJRKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBjYXNjYWRlIGludGVycnVwdFxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKIAlpODI1OV9pbml0KGNhc2NhZGVfbm9kZSwgMCk7CiAJb2Zfbm9kZV9wdXQoY2FzY2FkZV9ub2RlKTsKIAotCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGNhc2NhZGVfaXJxLCBtcGM4NXh4XzgyNTlfY2FzY2FkZSk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19JODI1OSAqLworCS8qCisJICogIEhvb2sgdGhlIGludGVycnVwdCB0byBtYWtlIHN1cmUgZGVzYy0+YWN0aW9uIGlzIG5ldmVyIE5VTEwuCisJICogIFRoaXMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGludGVycnVwdCBkb2VzIG5vdCBnZXQKKwkgKiAgZGlzYWJsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIHRoZSBzaGFyZWQgSVJRIGxpbmUgZnJlZXMgdGhlaXIKKwkgKiAgaW50ZXJydXB0LgorCSAqLworCWlmICgocmV0ID0gc2V0dXBfaXJxKGNhc2NhZGVfaXJxLCAmbXBjODV4eGNkc184MjU5X2lycWFjdGlvbikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldHVwIGNhc2NhZGUgaW50ZXJydXB0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBTdWNjZXNzLiBDb25uZWN0IG91ciBsb3ctbGV2ZWwgY2FzY2FkZSBoYW5kbGVyLiAqLworCXNldF9pcnFfaGFuZGxlcihjYXNjYWRlX2lycSwgbXBjODV4eF84MjU5X2Nhc2NhZGVfaGFuZGxlcik7CisKKwlyZXR1cm4gMDsKIH0KIAorZGV2aWNlX2luaXRjYWxsKG1wYzg1eHhfY2RzXzgyNTlfYXR0YWNoKTsKKworI2VuZGlmIC8qIENPTkZJR19QUENfSTgyNTkgKi8KKwogLyoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKICAqLwpAQCAtMjE4LDkgKzI5NywxNCBAQAogCX0KIAogI2lmZGVmIENPTkZJR19QQ0kKLQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCW1wYzg1eHhfYWRkX2JyaWRnZShucCk7Ci0KKwlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspIHsKKwkJc3RydWN0IHJlc291cmNlIHJzcmM7CisJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyc3JjKTsKKwkJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4MDAwKQorCQkJZnNsX2FkZF9icmlkZ2UobnAsIDEpOworCQllbHNlCisJCQlmc2xfYWRkX2JyaWRnZShucCwgMCk7CisJfQogCXBwY19tZC5wY2lfaXJxX2ZpeHVwID0gbXBjODV4eF9jZHNfcGNpX2lycV9maXh1cDsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgpAQCAtMjY1LDcgKzM0OSwxMiBAQAogCS5pbml0X0lSUQk9IG1wYzg1eHhfY2RzX3BpY19pbml0LAogCS5zaG93X2NwdWluZm8JPSBtcGM4NXh4X2Nkc19zaG93X2NwdWluZm8sCiAJLmdldF9pcnEJPSBtcGljX2dldF9pcnEsCisjaWZkZWYgQ09ORklHX1BDSQorCS5yZXN0YXJ0CT0gbXBjODV4eF9jZHNfcmVzdGFydCwKKyNlbHNlCiAJLnJlc3RhcnQJPSBtcGM4NXh4X3Jlc3RhcnQsCisjZW5kaWYKIAkuY2FsaWJyYXRlX2RlY3IgPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5wcm9ncmVzcwk9IHVkYmdfcHJvZ3Jlc3MsCisJLnBjaWJpb3NfZml4dXBfYnVzCT0gZnNsX3BjaWJpb3NfZml4dXBfYnVzLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggMDA0YjgwYi4uZTgwMDNiZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogI2luY2x1ZGUgPGFzbS9xZS5oPgogI2luY2x1ZGUgPGFzbS9xZV9pYy5oPgogI2luY2x1ZGUgPGFzbS9tcGljLmg+CkBAIC05NCw5ICs5NSw4IEBACiAJfQogCiAjaWZkZWYgQ09ORklHX1BDSQotCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgewotCQltcGM4NXh4X2FkZF9icmlkZ2UobnApOwotCX0KKwlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCisJCWZzbF9hZGRfYnJpZGdlKG5wLCAxKTsKIAlvZl9ub2RlX3B1dChucCk7CiAjZW5kaWYKIApAQCAtMjA4LDQgKzIwOCw1IEBACiAJLnJlc3RhcnQJPSBtcGM4NXh4X3Jlc3RhcnQsCiAJLmNhbGlicmF0ZV9kZWNyCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJPSB1ZGJnX3Byb2dyZXNzLAorCS5wY2liaW9zX2ZpeHVwX2J1cwk9IGZzbF9wY2liaW9zX2ZpeHVwX2J1cywKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTg0MTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIEZTTCBTb0Mgc2V0dXAgY29kZQotICoKLSAqIE1haW50YWluZWQgYnkgS3VtYXIgR2FsYSAoc2VlIE1BSU5UQUlORVJTIGZvciBjb250YWN0IGluZm9ybWF0aW9uKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgotCi0jdW5kZWYgREVCVUcKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyh4Li4uKSBwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lIERCRyh4Li4uKQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUENJCi1pbnQgX19pbml0IG1wYzg1eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKLXsKLQlpbnQgbGVuOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKLQljb25zdCBpbnQgKmJ1c19yYW5nZTsKLQlpbnQgcHJpbWFyeSA9IDEsIGhhc19hZGRyZXNzID0gMDsKLQlwaHlzX2FkZHJfdCBpbW1yID0gZ2V0X2ltbXJiYXNlKCk7Ci0KLQlEQkcoIkFkZGluZyBQQ0kgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKLQotCS8qIEZldGNoIGhvc3QgYnJpZGdlIHJlZ2lzdGVycyBhZGRyZXNzICovCi0JaGFzX2FkZHJlc3MgPSAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIDAsICZyc3JjKSA9PSAwKTsKLQotCS8qIEdldCBidXMgcmFuZ2UgaWYgYW55ICovCi0JYnVzX3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOwotCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKLQkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKLQl9Ci0KLQlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7Ci0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwotCWlmICghaG9zZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0KLQkvKiBQQ0kgMSAqLwotCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODAwMCkgewotCQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgaW1tciArIDB4ODAwMCwgaW1tciArIDB4ODAwNCk7Ci0JfQotCS8qIFBDSSAyICovCi0JaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg5MDAwKSB7Ci0JCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg5MDAwLCBpbW1yICsgMHg5MDA0KTsKLQkJcHJpbWFyeSA9IDA7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODV4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCi0JICAgICAgICJGaXJtd2FyZSBidXMgbnVtYmVyOiAlZC0+JWRcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcnNyYy5zdGFydCwgaG9zZS0+Zmlyc3RfYnVzbm8sCi0JCWhvc2UtPmxhc3RfYnVzbm8pOwotCi0JREJHKCIgLT5Ib3NlIGF0IDB4JXAsIGNmZ19hZGRyPTB4JXAsY2ZnX2RhdGE9MHglcFxuIiwKLQkJaG9zZSwgaG9zZS0+Y2ZnX2FkZHIsIGhvc2UtPmNmZ19kYXRhKTsKLQotCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KLQkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KLQlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgcHJpbWFyeSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCmluZGV4IDBmYWViZmQuLjM0M2I3NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnCkBAIC0xNCw4ICsxNCw3IEBACiAKIGNvbmZpZyBNUEM4NjQxCiAJYm9vbAotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0lfQkUKKwlzZWxlY3QgRlNMX1BDSSBpZiBQQ0kKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKIAlzZWxlY3QgTVBJQwogCWRlZmF1bHQgeSBpZiBNUEM4NjQxX0hQQ04KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZQppbmRleCA0MThmZDhmLi4zMzc2Yzc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L01ha2VmaWxlCkBAIC00LDQgKzQsMyBAQAogCiBvYmotJChDT05GSUdfU01QKQkJKz0gbXBjODZ4eF9zbXAubwogb2JqLSQoQ09ORklHX01QQzg2NDFfSFBDTikJKz0gbXBjODZ4eF9ocGNuLm8KLW9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmgKaW5kZXggMjNmN2VkMi4uNTI1ZmZhMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCkBAIC0xNSwxMSArMTUsNiBAQAogICogbXBjODZ4eF8qIGZpbGVzLiBNb3N0bHkgZm9yIHVzZSBieSBtcGM4Nnh4X3NldHVwKCkuCiAgKi8KIAotZXh0ZXJuIGludCBtcGM4Nnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwotCi1leHRlcm4gaW50IG1wYzg2eHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCSAgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKTsKLQogZXh0ZXJuIHZvaWQgX19pbml0IG1wYzg2eHhfc21wX2luaXQodm9pZCk7CiAKICNlbmRpZgkvKiBfX01QQzg2WFhfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKaW5kZXggNWIwMWVjNy4uZTllYWEwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwpAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL21waWMuaD4KIAorI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KIAogI2luY2x1ZGUgIm1wYzg2eHguaCIKQEAgLTM0NCw4ICszNDUsMTQgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfUENJCi0JZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQltcGM4Nnh4X2FkZF9icmlkZ2UobnApOworCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKKwkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJzcmMpOworCQlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDgwMDApCisJCQlmc2xfYWRkX2JyaWRnZShucCwgMSk7CisJCWVsc2UKKwkJCWZzbF9hZGRfYnJpZGdlKG5wLCAwKTsKKwl9CiAjZW5kaWYKIAogCXByaW50aygiTVBDODZ4eCBIUENOIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwpAQCAtNDI0LDcgKzQzMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogZGVmaW5lX21hY2hpbmUobXBjODZ4eF9ocGNuKSB7CiAJLm5hbWUJCQk9ICJNUEM4Nnh4IEhQQ04iLAogCS5wcm9iZQkJCT0gbXBjODZ4eF9ocGNuX3Byb2JlLApAQCAtNDM2LDQgKzQ0Miw1IEBACiAJLnRpbWVfaW5pdAkJPSBtcGM4Nnh4X3RpbWVfaW5pdCwKIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKKwkucGNpYmlvc19maXh1cF9idXMJPSBmc2xfcGNpYmlvc19maXh1cF9idXMsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2NkNWIwNS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAqIE1QQzg2WFggcGNpIHNldHVwIGNvZGUKLSAqCi0gKiBSZWNvZGU6IFpIQU5HIFdFSSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+Ci0gKiBJbml0aWFsIGF1dGhvcjogWGlhbmdodWEgWGlhbyA8eC54aWFvQGZyZWVzY2FsZS5jb20+Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KLSNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaWUuaD4KLQotI2luY2x1ZGUgIm1wYzg2eHguaCIKLQotI3VuZGVmIERFQlVHCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikKLSNlbmRpZgotCi1zdHJ1Y3QgcGNpZV9vdXRib3VuZF93aW5kb3dfcmVncyB7Ci0JdWludCAgICBwZXhvdGFyOyAgICAgICAgICAgICAgIC8qIDB4LjAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyICovCi0JdWludCAgICBwZXhvdGVhcjsgICAgICAgICAgICAgIC8qIDB4LjQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyICovCi0JdWludCAgICBwZXhvd2JhcjsgICAgICAgICAgICAgIC8qIDB4LjggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMxWzRdOwotCXVpbnQgICAgcGV4b3dhcjsgICAgICAgICAgICAgICAvKiAweC4xMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMyWzEyXTsKLX07Ci0KLXN0cnVjdCBwY2llX2luYm91bmRfd2luZG93X3JlZ3MgewotCXVpbnQgICAgcGV4aXRhcjsgICAgICAgICAgICAgICAvKiAweC4wIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMxWzRdOwotCXVpbnQgICAgcGV4aXdiYXI7ICAgICAgICAgICAgICAvKiAweC44IC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCi0JdWludCAgICBwZXhpd2JlYXI7ICAgICAgICAgICAgIC8qIDB4LmMgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQl1aW50ICAgIHBleGl3YXI7ICAgICAgICAgICAgICAgLyogMHguMTAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMyWzEyXTsKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9wY2llX2F0bXUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMpCi17Ci0Jdm9sYXRpbGUgc3RydWN0IGNjc3JfcGV4ICpwY2llOwotCXZvbGF0aWxlIHN0cnVjdCBwY2llX291dGJvdW5kX3dpbmRvd19yZWdzICpwY2llb3c7Ci0Jdm9sYXRpbGUgc3RydWN0IHBjaWVfaW5ib3VuZF93aW5kb3dfcmVncyAqcGNpZWl3OwotCWludCBpID0gMDsKLQotCURCRygiUENJRSBtZW1vcnkgbWFwIHN0YXJ0IDB4JXgsIHNpemUgMHgleFxuIiwgcnNyYy0+c3RhcnQsCi0JCQlyc3JjLT5lbmQgLSByc3JjLT5zdGFydCArIDEpOwotCXBjaWUgPSBpb3JlbWFwKHJzcmMtPnN0YXJ0LCByc3JjLT5lbmQgLSByc3JjLT5zdGFydCArIDEpOwotCi0JLyogRGlzYWJsZSBhbGwgd2luZG93cyAoZXhjZXB0IHBleG93YXIwIHNpbmNlIGl0cyBpZ25vcmVkKSAqLwotCXBjaWUtPnBleG93YXIxID0gMDsKLQlwY2llLT5wZXhvd2FyMiA9IDA7Ci0gCXBjaWUtPnBleG93YXIzID0gMDsKLSAJcGNpZS0+cGV4b3dhcjQgPSAwOwotIAlwY2llLT5wZXhpd2FyMSA9IDA7Ci0gCXBjaWUtPnBleGl3YXIyID0gMDsKLSAJcGNpZS0+cGV4aXdhcjMgPSAwOwotCi0gCXBjaWVvdyA9IChzdHJ1Y3QgcGNpZV9vdXRib3VuZF93aW5kb3dfcmVncyAqKSZwY2llLT5wZXhvdGFyMTsKLSAJcGNpZWl3ID0gKHN0cnVjdCBwY2llX2luYm91bmRfd2luZG93X3JlZ3MgKikmcGNpZS0+cGV4aXRhcjE7Ci0KLSAJLyogU2V0dXAgb3V0Ym91bmQgTUVNIHdpbmRvdyAqLwotIAlmb3IoaSA9IDA7IGkgPCAzOyBpKyspCi0gCQlpZiAoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKXsKLSAJCQlEQkcoIlBDSUUgTUVNIHJlc291cmNlIHN0YXJ0IDB4JTA4eCwgc2l6ZSAweCUwOHguXG4iLAotIAkJCQlob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0LAotIAkJCQlob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZAotIAkJCQkgIC0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCArIDEpOwotIAkJCXBjaWVvdy0+cGV4b3RhciA9IChob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0KSA+PiAxMgotIAkJCQkmIDB4MDAwZmZmZmY7Ci0gCQkJcGNpZW93LT5wZXhvdGVhciA9IDA7Ci0gCQkJcGNpZW93LT5wZXhvd2JhciA9IChob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0KSA+PiAxMgotIAkJCQkmIDB4MDAwZmZmZmY7Ci0gCQkJLyogRW5hYmxlLCBNZW0gUi9XICovCi0gCQkJcGNpZW93LT5wZXhvd2FyID0gMHg4MDA0NDAwMCB8Ci0gCQkJCShfX2lsb2cyKGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kCi0gCQkJCQkgLSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0ICsgMSkKLSAJCQkJIC0gMSk7Ci0gCQkJcGNpZW93Kys7Ci0gCQl9Ci0KLSAJLyogU2V0dXAgb3V0Ym91bmQgSU8gd2luZG93ICovCi0gCWlmIChob3NlLT5pb19yZXNvdXJjZS5mbGFncyAmIElPUkVTT1VSQ0VfSU8pewotIAkJREJHKCJQQ0lFIElPIHJlc291cmNlIHN0YXJ0IDB4JTA4eCwgc2l6ZSAweCUwOHgsIHBoeSBiYXNlIDB4JTA4eC5cbiIsCi0gCQkJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsCi0gCQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxLAotIAkJCWhvc2UtPmlvX2Jhc2VfcGh5cyk7Ci0gCQlwY2llb3ctPnBleG90YXIgPSAoaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQpID4+IDEyICYgMHgwMDBmZmZmZjsKLSAJCXBjaWVvdy0+cGV4b3RlYXIgPSAwOwotIAkJcGNpZW93LT5wZXhvd2JhciA9IChob3NlLT5pb19iYXNlX3BoeXMpID4+IDEyICYgMHgwMDBmZmZmZjsKLSAJCS8qIEVuYWJsZSwgSU8gUi9XICovCi0gCQlwY2llb3ctPnBleG93YXIgPSAweDgwMDg4MDAwIHwgKF9faWxvZzIoaG9zZS0+aW9fcmVzb3VyY2UuZW5kCi0gCQkJCQktIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICsgMSkgLSAxKTsKLSAJfQotCi0gCS8qIFNldHVwIDJHIGluYm91bmQgTWVtb3J5IFdpbmRvdyBAIDAgKi8KLSAJcGNpZWl3LT5wZXhpdGFyID0gMHgwMDAwMDAwMDsKLSAJcGNpZWl3LT5wZXhpd2JhciA9IDB4MDAwMDAwMDA7Ci0gCS8qIEVuYWJsZSwgUHJlZmV0Y2gsIExvY2FsIE1lbSwgU25vb3AgUi9XLCAyRyAqLwotIAlwY2llaXctPnBleGl3YXIgPSAweGEwZjU1MDFlOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLW1wYzg2eHhfc2V0dXBfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHUzMiBwY2llX29mZnNldCwgdTMyIHBjaWVfc2l6ZSkKLXsKLQl1MTYgY21kOwotCi0JREJHKCJQQ0lFIGhvc3QgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXQgMHglMDh4LCBzaXplIDB4JTA4eC5cbiIsCi0JCQlwY2llX29mZnNldCwgcGNpZV9zaXplKTsKLQotCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgMCwgMCwgUENJX0NPTU1BTkQsICZjbWQpOwotCWNtZCB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZCi0JICAgIHwgUENJX0NPTU1BTkRfSU87Ci0JZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgMCwgMCwgUENJX0NPTU1BTkQsIGNtZCk7Ci0KLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlLCAwLCAwLCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCBpLCByZXNfaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JLyoKLQkgKiBNYWtlIHRoZSBicmlkZ2UgYmUgdHJhbnNwYXJlbnQuCi0JICovCi0JZGV2LT50cmFuc3BhcmVudCA9IDE7Ci0KLQlob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKLQlpZiAoIWhvc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIGhvc2UgZm9yIGJ1cyAlZFxuIiwKLQkJICAgICAgIGRldi0+YnVzLT5udW1iZXIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzKSB7Ci0JCXJlcyA9ICZkZXYtPnJlc291cmNlW3Jlc19pZHgrK107Ci0JCXJlcy0+c3RhcnQgPSBob3NlLT5pb19yZXNvdXJjZS5zdGFydDsKLQkJcmVzLT5lbmQgPSBob3NlLT5pb19yZXNvdXJjZS5lbmQ7Ci0JCXJlcy0+ZmxhZ3MgPSBob3NlLT5pb19yZXNvdXJjZS5mbGFnczsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXJlcyA9ICZkZXYtPnJlc291cmNlW3Jlc19pZHggKyBpXTsKLQkJcmVzLT5zdGFydCA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQ7Ci0JCXJlcy0+ZW5kID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5lbmQ7Ci0JCXJlcy0+ZmxhZ3MgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmZsYWdzOwotCX0KLX0KLQotCi1ERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIDB4NzAxMCwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOwotREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCAweDcwMTEsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKLQotI2RlZmluZSBQQ0lFX0xUU1NNCTB4NDA0CS8qIFBDSWUgTGluayBUcmFpbmluZyBhbmQgU3RhdHVzICovCi0jZGVmaW5lIFBDSUVfTFRTU01fTDAJMHgxNgkvKiBMMCBzdGF0ZSAqLwotCi1pbnQgX19pbml0IG1wYzg2eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKLXsKLQlpbnQgbGVuOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKLQljb25zdCBpbnQgKmJ1c19yYW5nZTsKLQlpbnQgaGFzX2FkZHJlc3MgPSAwOwotCWludCBwcmltYXJ5ID0gMDsKLQl1MTYgdmFsOwotCi0JREJHKCJBZGRpbmcgUENJRSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwotCi0JLyogRmV0Y2ggaG9zdCBicmlkZ2UgcmVnaXN0ZXJzIGFkZHJlc3MgKi8KLQloYXNfYWRkcmVzcyA9IChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnJzcmMpID09IDApOwotCi0JLyogR2V0IGJ1cyByYW5nZSBpZiBhbnkgKi8KLQlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7Ci0JaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKLQkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKLQotCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWhvc2UtPmluZGlyZWN0X3R5cGUgPSBQUENfSU5ESVJFQ1RfVFlQRV9FWFRfUkVHIHwKLQkJCQlQUENfSU5ESVJFQ1RfVFlQRV9TVVJQUkVTU19QUklNQVJZX0JVUzsKLQotCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMHgwOwotCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwotCi0Jc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQpOwotCi0JLyogUHJvYmUgdGhlIGhvc2UgbGluayB0cmFpbmluZyBzdGF0dXMgKi8KLQllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSUVfTFRTU00sICZ2YWwpOwotCWlmICh2YWwgPCBQQ0lFX0xUU1NNX0wwKQotCQlyZXR1cm4gLUVOWElPOwotCi0JLyogU2V0dXAgdGhlIFBDSUUgaG9zdCBjb250cm9sbGVyLiAqLwotCW1wYzg2eHhfc2V0dXBfcGNpZShob3NlLCByc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKLQotCWlmICgocnNyYy5zdGFydCAmIDB4ZmZmZmYpID09IDB4ODAwMCkKLQkJcHJpbWFyeSA9IDE7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNUEM4Nnh4IFBDSUUgaG9zdCBicmlkZ2UgYXQgMHglMDhseC4gIgotCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgcnNyYy5zdGFydCwKLQkgICAgICAgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPmxhc3RfYnVzbm8pOwotCi0JREJHKCIgLT5Ib3NlIGF0IDB4JXAsIGNmZ19hZGRyPTB4JXAsY2ZnX2RhdGE9MHglcFxuIiwKLQkJaG9zZSwgaG9zZS0+Y2ZnX2FkZHIsIGhvc2UtPmNmZ19kYXRhKTsKLQotCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KLQkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KLQlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgcHJpbWFyeSk7Ci0KLQkvKiBTZXR1cCBQRVggd2luZG93IHJlZ2lzdGVycyAqLwotCXNldHVwX3BjaWVfYXRtdShob3NlLCAmcnNyYyk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCmluZGV4IDY2OTRmODYuLjljYjA4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwpAQCAtNTksNyArNTksOCBAQAogCUlOSVRfTElTVF9IRUFEKCZjdHgtPmFmZl9saXN0KTsKIAlpZiAoZ2FuZykKIAkJc3B1X2dhbmdfYWRkX2N0eChnYW5nLCBjdHgpOwotCWN0eC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKIAlzcHVfc2V0X3RpbWVzbGljZShjdHgpOwogCWN0eC0+c3RhdHMudXRpbF9zdGF0ZSA9IFNQVV9VVElMX0lETEVfTE9BREVEOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKaW5kZXggMGI1MGZhNS4uNmFiZGQ4ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwpAQCAtMzEyLDYgKzMxMiw3IEBACiAJc3B1X2FjcXVpcmUoY3R4KTsKIAlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfU0FWRUQpIHsKIAkJX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKKwkJc3B1X3NldF90aW1lc2xpY2UoY3R4KTsKIAogCQlyZXQgPSBzcHVfYWN0aXZhdGUoY3R4LCAwKTsKIAkJaWYgKHJldCkgewpAQCAtMzIyLDYgKzMyMyw5IEBACiAJCS8qCiAJCSAqIFdlIGhhdmUgdG8gdXBkYXRlIHRoZSBzY2hlZHVsaW5nIHByaW9yaXR5IHVuZGVyIGFjdGl2ZV9tdXRleAogCQkgKiB0byBwcm90ZWN0IGFnYWluc3QgZmluZF92aWN0aW0oKS4KKwkJICoKKwkJICogTm8gbmVlZCB0byB1cGRhdGUgdGhlIHRpbWVzbGljZSBBU0FQLCBpdCB3aWxsIGdldCB1cGRhdGVkCisJCSAqIG9uY2UgdGhlIGN1cnJlbnQgb25lIGhhcyBleHBpcmVkLgogCQkgKi8KIAkJc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKGN0eCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAyMjc5NjhiLi43NThhODBhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtOTI3LDEwICs5MjcsNiBAQAogCQlJTklUX0xJU1RfSEVBRCgmc3B1X3ByaW8tPnJ1bnFbaV0pOwogCQlfX2NsZWFyX2JpdChpLCBzcHVfcHJpby0+Yml0bWFwKTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCW11dGV4X2luaXQoJmNiZV9zcHVfaW5mb1tpXS5saXN0X211dGV4KTsKLQkJSU5JVF9MSVNUX0hFQUQoJmNiZV9zcHVfaW5mb1tpXS5zcHVzKTsKLQl9CiAJc3Bpbl9sb2NrX2luaXQoJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCiAJc2V0dXBfdGltZXIoJnNwdXNjaGVkX3RpbWVyLCBzcHVzY2hlZF93YWtlLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKaW5kZXggOGIyMGMwYy4uMmJmZGViOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKQEAgLTQwLDEzICs0MCwxMCBAQAogc3RydWN0IHNwdV9jb250ZXh0X29wczsKIHN0cnVjdCBzcHVfZ2FuZzsKIAotZW51bSB7Ci0JU1BVX1NDSEVEX1dBU19BQ1RJVkUsCS8qIHdhcyBhY3RpdmUgdXBvbiBzcHVfYWNxdWlyZV9zYXZlZCgpICAqLwotfTsKLQogLyogY3R4LT5zY2hlZF9mbGFncyAqLwogZW51bSB7CiAJU1BVX1NDSEVEX05PVElGWV9BQ1RJVkUsCisJU1BVX1NDSEVEX1dBU19BQ1RJVkUsCS8qIHdhcyBhY3RpdmUgdXBvbiBzcHVfYWNxdWlyZV9zYXZlZCgpICAqLwogfTsKIAogc3RydWN0IHNwdV9jb250ZXh0IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwppbmRleCAzNjkwNjI0Li4yOGQxNjQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAl9CiAJaW91bm1hcChyZWcpOwogCi0Jc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHIuc3RhcnQgKyAweGY4MDAwLCByLnN0YXJ0ICsgMHhmODAxMCk7CisJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHIuc3RhcnQgKyAweGY4MDAwLCByLnN0YXJ0ICsgMHhmODAxMCwgMCk7CiB9CiAKIC8qIE1hcnZlbGwgRGlzY292ZXJ5IElJIGJhc2VkIFBlZ2Fzb3MgMiAqLwpAQCAtMjc3LDEzICsyNzcsMTQgQEAKIAkJCWhvc2UtPmNmZ19kYXRhID0gcDsKIAkJCWdnMl9wY2lfY29uZmlnX2Jhc2UgPSBwOwogCQl9IGVsc2UgaWYgKGlzX3BlZ2Fzb3MgPT0gMSkgewotCQkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIDB4ZmVjMDBjZjgsIDB4ZmVlMDBjZmMpOworCQkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIDB4ZmVjMDBjZjgsIDB4ZmVlMDBjZmMsIDApOwogCQl9IGVsc2UgaWYgKGlzX3BlZ2Fzb3MgPT0gMikgewogCQkJc2V0dXBfcGVnMihob3NlLCBkZXYpOwogCQl9IGVsc2UgaWYgKCFzdHJuY21wKG1vZGVsLCAiSUJNLENQQzcxMCIsIDEwKSkgewogCQkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsCiAJCQkJCSAgIHIuc3RhcnQgKyAweDAwMGY4MDAwLAotCQkJCQkgICByLnN0YXJ0ICsgMHgwMDBmODAxMCk7CisJCQkJCSAgIHIuc3RhcnQgKyAweDAwMGY4MDEwLAorCQkJCQkgICAwKTsKIAkJCWlmIChpbmRleCA9PSAwKSB7CiAJCQkJZG1hID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgInN5c3RlbS1kbWEtYmFzZSIsCiAJCQkJCQkJJmxlbik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKaW5kZXggZjRkMGE3YS4uYmQ1Y2E1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwpAQCAtNzMsNyArNzMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0Jc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIDB4ZmVjMDAwMDAsIDB4ZmVlMDAwMDApOworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwLCAwKTsKIAogCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KIAkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9scGV2ZW50cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMKaW5kZXggOTFkZjUyYS4uMzRiZGJiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2xwZXZlbnRzLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogfQogX19zZXR1cCgic3ByZWFkX2xwZXZlbnRzPSIsIHNldF9zcHJlYWRfbHBldmVudHMpOwogCi12b2lkIHNldHVwX2h2bHBldmVudF9xdWV1ZSh2b2lkKQordm9pZCBfX2luaXQgc2V0dXBfaHZscGV2ZW50X3F1ZXVlKHZvaWQpCiB7CiAJdm9pZCAqZXZlbnRTdGFjazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKaW5kZXggZmNlYWFlNC4uMjU0MjQwMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCkBAIC00OTAsNiArNDkwLDkgQEAKIAkvKiBGaXh1cCAiYnVzLXJhbmdlIiBPRiBwcm9wZXJ0eSAqLwogCWZpeHVwX2J1c19yYW5nZShkZXYpOwogCisJLyogQ2hlY2sgZm9yIGxlZ2FjeSBJT3MgKi8KKwlpc2FfYnJpZGdlX2ZpbmRfZWFybHkoaG9zZSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggNDg0ZWI0ZS4uMDhjZTMxZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiBvYmotJChDT05GSUdfVTNfREFSVCkJCSs9IGRhcnRfaW9tbXUubwogb2JqLSQoQ09ORklHX01NSU9fTlZSQU0pCSs9IG1taW9fbnZyYW0ubwogb2JqLSQoQ09ORklHX0ZTTF9TT0MpCQkrPSBmc2xfc29jLm8KK29iai0kKENPTkZJR19GU0xfUENJKQkJKz0gZnNsX3BjaS5vCiBvYmotJChDT05GSUdfVFNJMTA4X0JSSURHRSkJKz0gdHNpMTA4X3BjaS5vIHRzaTEwOF9kZXYubwogb2JqLSQoQ09ORklHX1FVSUNDX0VOR0lORSkJKz0gcWVfbGliLwogbXY2NHg2MC0kKENPTkZJR19QQ0kpCQkrPSBtdjY0eDYwX3BjaS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjBjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIE1QQzg1eHgvODZ4eCBQQ0kvUENJRSBzdXBwb3J0IHJvdXRpbmcuCisgKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYworICoKKyAqIEluaXRpYWwgYXV0aG9yOiBYaWFuZ2h1YSBYaWFvIDx4LnhpYW9AZnJlZXNjYWxlLmNvbT4KKyAqIFJlY29kZTogWkhBTkcgV0VJIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKyAqIFJld3JpdGUgdGhlIHJvdXRpbmcgZm9yIEZyZXNjYWxlIFBDSSBhbmQgUENJIEV4cHJlc3MKKyAqIAlSb3kgWmFuZyA8dGllLWZlaS56YW5nQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKworLyogYXRtdSBzZXR1cCBmb3IgZnNsIHBjaS9wY2llIGNvbnRyb2xsZXIgKi8KK3ZvaWQgX19pbml0IHNldHVwX3BjaV9hdG11KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgc3RydWN0IHJlc291cmNlICpyc3JjKQoreworCXN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2k7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiUENJIG1lbW9yeSBtYXAgc3RhcnQgMHgleCwgc2l6ZSAweCV4XG4iLCByc3JjLT5zdGFydCwKKwkJCXJzcmMtPmVuZCAtIHJzcmMtPnN0YXJ0ICsgMSk7CisJcGNpID0gaW9yZW1hcChyc3JjLT5zdGFydCwgcnNyYy0+ZW5kIC0gcnNyYy0+c3RhcnQgKyAxKTsKKworCS8qIERpc2FibGUgYWxsIHdpbmRvd3MgKGV4Y2VwdCBwb3dhcjAgc2luY2UgaXRzIGlnbm9yZWQpICovCisJZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQorCQlvdXRfYmUzMigmcGNpLT5wb3dbaV0ucG93YXIsIDApOworCWZvcihpID0gMDsgaSA8IDM7IGkrKykKKwkJb3V0X2JlMzIoJnBjaS0+cGl3W2ldLnBpd2FyLCAwKTsKKworCS8qIFNldHVwIG91dGJvdW5kIE1FTSB3aW5kb3cgKi8KKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisJCWlmIChob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0peworCQkJcHJfZGVidWcoIlBDSSBNRU0gcmVzb3VyY2Ugc3RhcnQgMHglMDh4LCBzaXplIDB4JTA4eC5cbiIsCisJCQkJaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCwKKwkJCQlob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZAorCQkJCSAgLSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0ICsgMSk7CisJCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3RhciwKKwkJCQkoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCA+PiAxMikKKwkJCQkmIDB4MDAwZmZmZmYpOworCQkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG90ZWFyLCAwKTsKKwkJCW91dF9iZTMyKCZwY2ktPnBvd1tpKzFdLnBvd2JhciwKKwkJCQkoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCA+PiAxMikKKwkJCQkmIDB4MDAwZmZmZmYpOworCQkJLyogRW5hYmxlLCBNZW0gUi9XICovCisJCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3dhciwgMHg4MDA0NDAwMAorCQkJCXwgKF9faWxvZzIoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5lbmQKKwkJCQktIGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQgKyAxKSAtIDEpKTsKKwkJfQorCisJLyogU2V0dXAgb3V0Ym91bmQgSU8gd2luZG93ICovCisJaWYgKGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzICYgSU9SRVNPVVJDRV9JTyl7CisJCXByX2RlYnVnKCJQQ0kgSU8gcmVzb3VyY2Ugc3RhcnQgMHglMDh4LCBzaXplIDB4JTA4eCwgcGh5IGJhc2UgMHglMDh4LlxuIiwKKwkJCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAorCQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxLAorCQkJaG9zZS0+aW9fYmFzZV9waHlzKTsKKwkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG90YXIsIChob3NlLT5pb19yZXNvdXJjZS5zdGFydCA+PiAxMikKKwkJCQkmIDB4MDAwZmZmZmYpOworCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3RlYXIsIDApOworCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3diYXIsIChob3NlLT5pb19iYXNlX3BoeXMgPj4gMTIpCisJCQkJJiAweDAwMGZmZmZmKTsKKwkJLyogRW5hYmxlLCBJTyBSL1cgKi8KKwkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG93YXIsIDB4ODAwODgwMDAKKwkJCXwgKF9faWxvZzIoaG9zZS0+aW9fcmVzb3VyY2UuZW5kCisJCQktIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICsgMSkgLSAxKSk7CisJfQorCisJLyogU2V0dXAgMkcgaW5ib3VuZCBNZW1vcnkgV2luZG93IEAgMSAqLworCW91dF9iZTMyKCZwY2ktPnBpd1syXS5waXRhciwgMHgwMDAwMDAwMCk7CisJb3V0X2JlMzIoJnBjaS0+cGl3WzJdLnBpd2JhciwweDAwMDAwMDAwKTsKKwlvdXRfYmUzMigmcGNpLT5waXdbMl0ucGl3YXIsIFBJV0FSXzJHKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfcGNpX2NtZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJdTE2IGNtZDsKKwlpbnQgY2FwX3g7CisKKwllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSV9DT01NQU5ELCAmY21kKTsKKwljbWQgfD0gUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWQorCQl8IFBDSV9DT01NQU5EX0lPOworCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSV9DT01NQU5ELCBjbWQpOworCisJY2FwX3ggPSBlYXJseV9maW5kX2NhcGFiaWxpdHkoaG9zZSwgMCwgMCwgUENJX0NBUF9JRF9QQ0lYKTsKKwlpZiAoY2FwX3gpIHsKKwkJaW50IHBjaV94X2NtZCA9IGNhcF94ICsgUENJX1hfQ01EOworCQljbWQgPSBQQ0lfWF9DTURfTUFYX1NQTElUIHwgUENJX1hfQ01EX01BWF9SRUFECisJCQl8IFBDSV9YX0NNRF9FUk8gfCBQQ0lfWF9DTURfRFBFUlJfRTsKKwkJZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgMCwgMCwgcGNpX3hfY21kLCBjbWQpOworCX0gZWxzZSB7CisJCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIDAsIDAsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpLCByZXNfaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCisJLyogaWYgd2UgYXJlbid0IGEgUENJZSBkb24ndCBib3RoZXIgKi8KKwlpZiAoIXBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpCisJCXJldHVybiA7CisKKwkvKgorCSAqIE1ha2UgdGhlIGJyaWRnZSBiZSB0cmFuc3BhcmVudC4KKwkgKi8KKwlkZXYtPnRyYW5zcGFyZW50ID0gMTsKKworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCWlmICghaG9zZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgaG9zZSBmb3IgYnVzICVkXG4iLAorCQkgICAgICAgZGV2LT5idXMtPm51bWJlcik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciBvdXQgYW55IG9mIHRoZSB2aXJ0dWFsIFAyUCBicmlkZ2UgcmVnaXN0ZXJzICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0lPX0JBU0VfVVBQRVIxNiwgMCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0lPX0xJTUlUX1VQUEVSMTYsIDApOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JT19CQVNFLCAweDEwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU9fTElNSVQsIDApOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9NRU1PUllfQkFTRSwgMHgxMCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX01FTU9SWV9MSU1JVCwgMCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX1BSRUZfQkFTRV9VUFBFUjMyLCAweDApOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9QUkVGX0xJTUlUX1VQUEVSMzIsIDB4MCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX1BSRUZfTUVNT1JZX0JBU0UsIDB4MTApOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgMCk7CisKKwlpZiAoaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3MpIHsKKwkJcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzX2lkeCsrXTsKKwkJcmVzLT5zdGFydCA9IGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0OworCQlyZXMtPmVuZCA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZDsKKwkJcmVzLT5mbGFncyA9IGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzOworCQl1cGRhdGVfYnJpZGdlX3Jlc291cmNlKGRldiwgcmVzKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJlcyA9ICZkZXYtPnJlc291cmNlW3Jlc19pZHggKyBpXTsKKwkJcmVzLT5zdGFydCA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQ7CisJCXJlcy0+ZW5kID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5lbmQ7CisJCXJlcy0+ZmxhZ3MgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmZsYWdzOworCQl1cGRhdGVfYnJpZGdlX3Jlc291cmNlKGRldiwgcmVzKTsKKwl9Cit9CisKK2ludCBfX2luaXQgZnNsX3BjaWVfY2hlY2tfbGluayhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJdTE2IHZhbDsKKwllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSUVfTFRTU00sICZ2YWwpOworCWlmICh2YWwgPCBQQ0lFX0xUU1NNX0wwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmc2xfcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKKwlpbnQgaTsKKworCS8qIGRlYWwgd2l0aCBib2d1cyBwY2lfYnVzIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyBjb25uZWN0ZWQgb24gUENJZSAqLworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfTk9fUENJRV9MSU5LKSB7CisJCWlmIChidXMtPnBhcmVudCkgeworCQkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJCQlidXMtPnJlc291cmNlW2ldID0gYnVzLT5wYXJlbnQtPnJlc291cmNlW2ldOworCQl9CisJfQorfQorCitpbnQgX19pbml0IGZzbF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaXNfcHJpbWFyeSkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKKwljb25zdCBpbnQgKmJ1c19yYW5nZTsKKworCXByX2RlYnVnKCJBZGRpbmcgUENJIGhvc3QgYnJpZGdlICVzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CisKKwkvKiBGZXRjaCBob3N0IGJyaWRnZSByZWdpc3RlcnMgYWRkcmVzcyAqLworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnJzcmMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBwY2kgcmVnaXN0ZXIgYmFzZSEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogR2V0IGJ1cyByYW5nZSBpZiBhbnkgKi8KKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CisJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKKwkJCSIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CisJaWYgKCFob3NlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMHgwOworCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOworCisJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQsCisJCVBQQ19JTkRJUkVDVF9UWVBFX0JJR19FTkRJQU4pOworCXNldHVwX3BjaV9jbWQoaG9zZSk7CisKKwkvKiBjaGVjayBQQ0kgZXhwcmVzcyBsaW5rIHN0YXR1cyAqLworCWlmIChlYXJseV9maW5kX2NhcGFiaWxpdHkoaG9zZSwgMCwgMCwgUENJX0NBUF9JRF9FWFApKSB7CisJCWhvc2UtPmluZGlyZWN0X3R5cGUgfD0gUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRyB8CisJCQlQUENfSU5ESVJFQ1RfVFlQRV9TVVJQUkVTU19QUklNQVJZX0JVUzsKKwkJaWYgKGZzbF9wY2llX2NoZWNrX2xpbmsoaG9zZSkpCisJCQlob3NlLT5pbmRpcmVjdF90eXBlIHw9IFBQQ19JTkRJUkVDVF9UWVBFX05PX1BDSUVfTElOSzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBGU0wgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4iCisJCSJGaXJtd2FyZSBidXMgbnVtYmVyOiAlZC0+JWRcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcnNyYy5zdGFydCwgaG9zZS0+Zmlyc3RfYnVzbm8sCisJCWhvc2UtPmxhc3RfYnVzbm8pOworCisJcHJfZGVidWcoIiAtPkhvc2UgYXQgMHglcCwgY2ZnX2FkZHI9MHglcCxjZmdfZGF0YT0weCVwXG4iLAorCQlob3NlLCBob3NlLT5jZmdfYWRkciwgaG9zZS0+Y2ZnX2RhdGEpOworCisJLyogSW50ZXJwcmV0IHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSAqLworCS8qIFRoaXMgYWxzbyBtYXBzIHRoZSBJL08gcmVnaW9uIGFuZCBzZXRzIGlzYV9pby9tZW1fYmFzZSAqLworCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgZGV2LCBpc19wcmltYXJ5KTsKKworCS8qIFNldHVwIFBFWCB3aW5kb3cgcmVnaXN0ZXJzICovCisJc2V0dXBfcGNpX2F0bXUoaG9zZSwgJnJzcmMpOworCisJcmV0dXJuIDA7Cit9CisKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTQ4RSwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDgsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTQzRSwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDMsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NTQ3RSwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDVFLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU0NSwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NjhFLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU2OCwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NjdFLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU2NywgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg1NDRFLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIFBDSV9ERVZJQ0VfSURfTVBDODU0NCwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCBQQ0lfREVWSUNFX0lEX01QQzg2NDEsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgUENJX0RFVklDRV9JRF9NUEM4NjQxRCwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IwNGFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIE1QQzg1eHgvODZ4eCBQQ0kgRXhwcmVzcyBzdHJ1Y3R1cmUgZGVmaW5lCisgKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWZuZGVmIF9fUE9XRVJQQ19GU0xfUENJX0gKKyNkZWZpbmUgX19QT1dFUlBDX0ZTTF9QQ0lfSAorCisjZGVmaW5lIFBDSUVfTFRTU00JMHgwNDA0CQkvKiBQQ0lFIExpbmsgVHJhaW5pbmcgYW5kIFN0YXR1cyAqLworI2RlZmluZSBQQ0lFX0xUU1NNX0wwCTB4MTYJCS8qIEwwIHN0YXRlICovCisjZGVmaW5lIFBJV0FSXzJHCTB4YTBmNTUwMWUJLyogRW5hYmxlLCBQcmVmZXRjaCwgTG9jYWwgTWVtLCBTbm9vcCBSL1csIDJHICovCisKKy8qIFBDSS9QQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgcmVnICovCitzdHJ1Y3QgcGNpX291dGJvdW5kX3dpbmRvd19yZWdzIHsKKwlfX2JlMzIJcG90YXI7CS8qIDB4LjAgLSBPdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyICovCisJX19iZTMyCXBvdGVhcjsJLyogMHguNCAtIE91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlfX2JlMzIJcG93YmFyOwkvKiAweC44IC0gT3V0Ym91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCXU4CXJlczFbNF07CisJX19iZTMyCXBvd2FyOwkvKiAweC4xMCAtIE91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyICovCisJdTgJcmVzMlsxMl07Cit9OworCisvKiBQQ0kvUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgcmVnICovCitzdHJ1Y3QgcGNpX2luYm91bmRfd2luZG93X3JlZ3MgeworCV9fYmUzMglwaXRhcjsJLyogMHguMCAtIEluYm91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAqLworCXU4CXJlczFbNF07CisJX19iZTMyCXBpd2JhcjsJLyogMHguOCAtIEluYm91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCV9fYmUzMglwaXdiZWFyOwkvKiAweC5jIC0gSW5ib3VuZCB3aW5kb3cgYmFzZSBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyICovCisJX19iZTMyCXBpd2FyOwkvKiAweC4xMCAtIEluYm91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgKi8KKwl1OAlyZXMyWzEyXTsKK307CisKKy8qIFBDSS9QQ0kgRXhwcmVzcyBJTyBibG9jayByZWdpc3RlcnMgZm9yIDg1eHgvODZ4eCAqLworc3RydWN0IGNjc3JfcGNpIHsKKwlfX2JlMzIJY29uZmlnX2FkZHI7CQkvKiAweC4wMDAgLSBQQ0kvUENJRSBDb25maWd1cmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwlfX2JlMzIJY29uZmlnX2RhdGE7CQkvKiAweC4wMDQgLSBQQ0kvUENJRSBDb25maWd1cmF0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKwlfX2JlMzIJaW50X2FjazsJCS8qIDB4LjAwOCAtIFBDSSBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgKi8KKwlfX2JlMzIJcGV4X290Yl9jcGxfdG9yOwkvKiAweC4wMGMgLSBQQ0lFIE91dGJvdW5kIGNvbXBsZXRpb24gdGltZW91dCByZWdpc3RlciAqLworCV9fYmUzMglwZXhfY29uZl90b3I7CQkvKiAweC4wMTAgLSBQQ0lFIGNvbmZpZ3VyYXRpb24gdGltZW91dCByZWdpc3RlciAqLworCXU4CXJlczJbMTJdOworCV9fYmUzMglwZXhfcG1lX21lc19kcjsJCS8qIDB4LjAyMCAtIFBDSUUgUE1FIGFuZCBtZXNzYWdlIGRldGVjdCByZWdpc3RlciAqLworCV9fYmUzMglwZXhfcG1lX21lc19kaXNyOwkvKiAweC4wMjQgLSBQQ0lFIFBNRSBhbmQgbWVzc2FnZSBkaXNhYmxlIHJlZ2lzdGVyICovCisJX19iZTMyCXBleF9wbWVfbWVzX2llcjsJLyogMHguMDI4IC0gUENJRSBQTUUgYW5kIG1lc3NhZ2UgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCV9fYmUzMglwZXhfcG1jcjsJCS8qIDB4LjAyYyAtIFBDSUUgcG93ZXIgbWFuYWdlbWVudCBjb21tYW5kIHJlZ2lzdGVyICovCisJdTgJcmVzM1szMDI0XTsKKworLyogUENJL1BDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyAwLTQKKyAqIFdpbmRvdyAwIGlzIHRoZSBkZWZhdWx0IHdpbmRvdyBhbmQgaXMgdGhlIG9ubHkgd2luZG93IGVuYWJsZWQgdXBvbiByZXNldC4KKyAqIFRoZSBkZWZhdWx0IG91dGJvdW5kIHJlZ2lzdGVyIHNldCBpcyB1c2VkIHdoZW4gYSB0cmFuc2FjdGlvbiBtaXNzZXMKKyAqIGluIGFsbCBvZiB0aGUgb3RoZXIgb3V0Ym91bmQgd2luZG93cy4KKyAqLworCXN0cnVjdCBwY2lfb3V0Ym91bmRfd2luZG93X3JlZ3MgcG93WzVdOworCisJdTgJcmVzMTRbMjU2XTsKKworLyogUENJL1BDSSBFeHByZXNzIGluYm91bmQgd2luZG93IDMtMQorICogaW5ib3VuZCB3aW5kb3cgMSBzdXBwb3J0cyBvbmx5IGEgMzItYml0IGJhc2UgYWRkcmVzcyBhbmQgZG9lcyBub3QKKyAqIGRlZmluZSBhbiBpbmJvdW5kIHdpbmRvdyBiYXNlIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIuCisgKi8KKwlzdHJ1Y3QgcGNpX2luYm91bmRfd2luZG93X3JlZ3MgcGl3WzNdOworCisJX19iZTMyCXBleF9lcnJfZHI7CQkvKiAweC5lMDAgLSBQQ0kvUENJRSBlcnJvciBkZXRlY3QgcmVnaXN0ZXIgKi8KKwl1OAlyZXMyMVs0XTsKKwlfX2JlMzIJcGV4X2Vycl9lbjsJCS8qIDB4LmUwOCAtIFBDSS9QQ0lFIGVycm9yIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1OAlyZXMyMls0XTsKKwlfX2JlMzIJcGV4X2Vycl9kaXNyOwkJLyogMHguZTEwIC0gUENJL1BDSUUgZXJyb3IgZGlzYWJsZSByZWdpc3RlciAqLworCXU4CXJlczIzWzEyXTsKKwlfX2JlMzIJcGV4X2Vycl9jYXBfc3RhdDsJLyogMHguZTIwIC0gUENJL1BDSUUgZXJyb3IgY2FwdHVyZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl1OAlyZXMyNFs0XTsKKwlfX2JlMzIJcGV4X2Vycl9jYXBfcjA7CQkvKiAweC5lMjggLSBQQ0lFIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLworCV9fYmUzMglwZXhfZXJyX2NhcF9yMTsJCS8qIDB4LmUyYyAtIFBDSUUgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCisJX19iZTMyCXBleF9lcnJfY2FwX3IyOwkJLyogMHguZTMwIC0gUENJRSBlcnJvciBjYXB0dXJlIHJlZ2lzdGVyIDAgKi8KKwlfX2JlMzIJcGV4X2Vycl9jYXBfcjM7CQkvKiAweC5lMzQgLSBQQ0lFIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLworfTsKKworZXh0ZXJuIGludCBmc2xfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGlzX3ByaW1hcnkpOworZXh0ZXJuIHZvaWQgZnNsX3BjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOworCisjZW5kaWYgLyogX19QT1dFUlBDX0ZTTF9QQ0lfSCAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaWUuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5Nzc5Yy4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTVBDODV4eC84Nnh4IFBDSSBFeHByZXNzIHN0cnVjdHVyZSBkZWZpbmUKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19QT1dFUlBDX0ZTTF9QQ0lFX0gKLSNkZWZpbmUgX19QT1dFUlBDX0ZTTF9QQ0lFX0gKLQotLyogUENJRSBFeHByZXNzIElPIGJsb2NrIHJlZ2lzdGVycyBpbiA4NXh4Lzg2eHggKi8KLQotc3RydWN0IGNjc3JfcGV4IHsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhfY29uZmlnX2FkZHI7CS8qIDB4LjAwMCAtIFBDSSBFeHByZXNzIENvbmZpZ3VyYXRpb24gQWRkcmVzcyBSZWdpc3RlciAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleF9jb25maWdfZGF0YTsJLyogMHguMDA0IC0gUENJIEV4cHJlc3MgQ29uZmlndXJhdGlvbiBEYXRhIFJlZ2lzdGVyICovCi0JdTggX19pb21lbSAgICByZXMxWzRdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleF9vdGJfY3BsX3RvcjsJLyogMHguMDBjIC0gUENJIEV4cHJlc3MgT3V0Ym91bmQgY29tcGxldGlvbiB0aW1lb3V0IHJlZ2lzdGVyICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4X2NvbmZfdG9yOwkJLyogMHguMDEwIC0gUENJIEV4cHJlc3MgY29uZmlndXJhdGlvbiB0aW1lb3V0IHJlZ2lzdGVyICovCi0JdTggX19pb21lbSAgICByZXMyWzEyXTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhfcG1lX21lc19kcjsJLyogMHguMDIwIC0gUENJIEV4cHJlc3MgUE1FIGFuZCBtZXNzYWdlIGRldGVjdCByZWdpc3RlciAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleF9wbWVfbWVzX2Rpc3I7CS8qIDB4LjAyNCAtIFBDSSBFeHByZXNzIFBNRSBhbmQgbWVzc2FnZSBkaXNhYmxlIHJlZ2lzdGVyICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4X3BtZV9tZXNfaWVyOwkvKiAweC4wMjggLSBQQ0kgRXhwcmVzcyBQTUUgYW5kIG1lc3NhZ2UgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleF9wbWNyOwkJLyogMHguMDJjIC0gUENJIEV4cHJlc3MgcG93ZXIgbWFuYWdlbWVudCBjb21tYW5kIHJlZ2lzdGVyICovCi0JdTggX19pb21lbSAgICByZXMzWzMwMjRdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG90YXIwOwkJLyogMHguYzAwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAwICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4b3RlYXIwOwkJLyogMHguYzA0IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAwKi8KLQl1OCBfX2lvbWVtICAgIHJlczRbOF07Ci0JX19iZTMyIF9faW9tZW0gICAgcGV4b3dhcjA7CQkvKiAweC5jMTAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAwKi8KLQl1OCBfX2lvbWVtICAgIHJlczVbMTJdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG90YXIxOwkJLyogMHguYzIwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAxICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4b3RlYXIxOwkJLyogMHguYzI0IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAxKi8KLQlfX2JlMzIgX19pb21lbSAgICBwZXhvd2JhcjE7CQkvKiAweC5jMjggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDEqLwotCXU4IF9faW9tZW0gICAgcmVzNls0XTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhvd2FyMTsJCS8qIDB4LmMzMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDEqLwotCXU4IF9faW9tZW0gICAgcmVzN1sxMl07Ci0JX19iZTMyIF9faW9tZW0gICAgcGV4b3RhcjI7CQkvKiAweC5jNDAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQlfX2JlMzIgX19pb21lbSAgICBwZXhvdGVhcjI7CQkvKiAweC5jNDQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDIqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YmFyMjsJCS8qIDB4LmM0OCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMiovCi0JdTggX19pb21lbSAgICByZXM4WzRdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YXIyOwkJLyogMHguYzUwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMiovCi0JdTggX19pb21lbSAgICByZXM5WzEyXTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhvdGFyMzsJCS8qIDB4LmM2MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG90ZWFyMzsJCS8qIDB4LmM2NCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMyovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4b3diYXIzOwkJLyogMHguYzY4IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAzKi8KLQl1OCBfX2lvbWVtICAgIHJlczEwWzRdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YXIzOwkJLyogMHguYzcwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMyovCi0JdTggX19pb21lbSAgICByZXMxMVsxMl07Ci0JX19iZTMyIF9faW9tZW0gICAgcGV4b3RhcjQ7CQkvKiAweC5jODAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KLQlfX2JlMzIgX19pb21lbSAgICBwZXhvdGVhcjQ7CQkvKiAweC5jODQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDQqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YmFyNDsJCS8qIDB4LmM4OCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgNCovCi0JdTggX19pb21lbSAgICByZXMxMls0XTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhvd2FyNDsJCS8qIDB4LmM5MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDQqLwotCXU4IF9faW9tZW0gICAgcmVzMTNbMTJdOwotCXU4IF9faW9tZW0gICAgcmVzMTRbMjU2XTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhpdGFyMzsJCS8qIDB4LmRhMCAtIFBDSSBFeHByZXNzIGluYm91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAzICovCi0JdTggX19pb21lbSAgICByZXMxNVs0XTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhpd2JhcjM7CQkvKiAweC5kYTggLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleGl3YmVhcjM7CQkvKiAweC5kYWMgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleGl3YXIzOwkJLyogMHguZGIwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAzICovCi0JdTggX19pb21lbSAgICByZXMxNlsxMl07Ci0JX19iZTMyIF9faW9tZW0gICAgcGV4aXRhcjI7CQkvKiAweC5kYzAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLwotCXU4IF9faW9tZW0gICAgcmVzMTdbNF07Ci0JX19iZTMyIF9faW9tZW0gICAgcGV4aXdiYXIyOwkJLyogMHguZGM4IC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQlfX2JlMzIgX19pb21lbSAgICBwZXhpd2JlYXIyOwkJLyogMHguZGNjIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQlfX2JlMzIgX19pb21lbSAgICBwZXhpd2FyMjsJCS8qIDB4LmRkMCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMiAqLwotCXU4IF9faW9tZW0gICAgcmVzMThbMTJdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleGl0YXIxOwkJLyogMHguZGUwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQl1OCBfX2lvbWVtICAgIHJlczE5WzRdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleGl3YmFyMTsJCS8qIDB4LmRlOCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAyICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4aXdiZWFyMTsJCS8qIDB4LmRlYyAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAyICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4aXdhcjE7CQkvKiAweC5kZjAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDIgKi8KLQl1OCBfX2lvbWVtICAgIHJlczIwWzEyXTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2RyOwkJLyogMHguZTAwIC0gUENJIEV4cHJlc3MgZXJyb3IgZGV0ZWN0IHJlZ2lzdGVyICovCi0JdTggX19pb21lbSAgICByZXMyMVs0XTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2VuOwkJLyogMHguZTA4IC0gUENJIEV4cHJlc3MgZXJyb3IgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwotCXU4IF9faW9tZW0gICAgcmVzMjJbNF07Ci0JX19iZTMyIF9faW9tZW0gICAgcGV4X2Vycl9kaXNyOwkJLyogMHguZTEwIC0gUENJIEV4cHJlc3MgZXJyb3IgZGlzYWJsZSByZWdpc3RlciAqLwotCXU4IF9faW9tZW0gICAgcmVzMjNbMTJdOwotCV9fYmUzMiBfX2lvbWVtICAgIHBleF9lcnJfY2FwX3N0YXQ7CS8qIDB4LmUyMCAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgc3RhdHVzIHJlZ2lzdGVyICovCi0JdTggX19pb21lbSAgICByZXMyNFs0XTsKLQlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2NhcF9yMDsJLyogMHguZTI4IC0gUENJIEV4cHJlc3MgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCi0JX19iZTMyIF9faW9tZW0gICAgcGV4X2Vycl9jYXBfcjE7CS8qIDB4LmUyYyAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLwotCV9fYmUzMiBfX2lvbWVtICAgIHBleF9lcnJfY2FwX3IyOwkvKiAweC5lMzAgLSBQQ0kgRXhwcmVzcyBlcnJvciBjYXB0dXJlIHJlZ2lzdGVyIDAgKi8KLQlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2NhcF9yMzsJLyogMHguZTM0IC0gUENJIEV4cHJlc3MgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCi19OwotCi0jZW5kaWYgLyogX19QT1dFUlBDX0ZTTF9QQ0lFX0ggKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCmluZGV4IDMyODlmYWIuLjcyNzQ1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCkBAIC0zMDUsNiArMzA1LDY0IEBACiAKIGFyY2hfaW5pdGNhbGwoZ2Zhcl9vZl9pbml0KTsKIAorI2lmZGVmIENPTkZJR19JMkNfQk9BUkRJTkZPCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CitzdHJ1Y3QgaTJjX2RyaXZlcl9kZXZpY2UgeworCWNoYXIJKm9mX2RldmljZTsKKwljaGFyCSppMmNfZHJpdmVyOworCWNoYXIJKmkyY190eXBlOworfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyX2RldmljZSBpMmNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJeyJyaWNvaCxyczVjMzcyYSIsICJydGMtcnM1YzM3MiIsICJyczVjMzcyYSIsfSwKKwl7InJpY29oLHJzNWMzNzJiIiwgInJ0Yy1yczVjMzcyIiwgInJzNWMzNzJiIix9LAorCXsicmljb2gscnY1YzM4NiIsICAicnRjLXJzNWMzNzIiLCAicnY1YzM4NiIsfSwKKwl7InJpY29oLHJ2NWMzODdhIiwgInJ0Yy1yczVjMzcyIiwgInJ2NWMzODdhIix9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2ZfZmluZF9pMmNfZHJpdmVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaTJjX2RldmljZXMpOyBpKyspIHsKKwkJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCBpMmNfZGV2aWNlc1tpXS5vZl9kZXZpY2UpKQorCQkJY29udGludWU7CisJCXN0cm5jcHkoaW5mby0+ZHJpdmVyX25hbWUsIGkyY19kZXZpY2VzW2ldLmkyY19kcml2ZXIsIEtPQkpfTkFNRV9MRU4pOworCQlzdHJuY3B5KGluZm8tPnR5cGUsIGkyY19kZXZpY2VzW2ldLmkyY190eXBlLCBJMkNfTkFNRV9TSVpFKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb2ZfcmVnaXN0ZXJfaTJjX2RldmljZXMoc3RydWN0IGRldmljZV9ub2RlICphZGFwX25vZGUsIGludCBidXNfbnVtKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IE5VTEw7CisKKwl3aGlsZSAoKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChhZGFwX25vZGUsIG5vZGUpKSkgeworCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKwkJY29uc3QgdTMyICphZGRyOworCQlpbnQgbGVuOworCisJCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlZyIsICZsZW4pOworCQlpZiAoIWFkZHIgfHwgbGVuIDwgc2l6ZW9mKGludCkgfHwgKmFkZHIgPiAoMSA8PCAxMCkgLSAxKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJmc2xfaW9jLmM6IGludmFsaWQgaTJjIGRldmljZSBlbnRyeVxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluZm8uaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJCWlmIChpbmZvLmlycSA9PSBOT19JUlEpCisJCQlpbmZvLmlycSA9IC0xOworCisJCWlmIChvZl9maW5kX2kyY19kcml2ZXIobm9kZSwgJmluZm8pIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWluZm8ucGxhdGZvcm1fZGF0YSA9IE5VTEw7CisJCWluZm8uYWRkciA9ICphZGRyOworCisJCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKGJ1c19udW0sICZpbmZvLCAxKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGZzbF9pMmNfb2ZfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CkBAIC0zNDksNiArNDA3LDggQEAKIAkJCQkJCSAgICBmc2xfaTJjX3BsYXRmb3JtX2RhdGEpKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gdW5yZWc7CisKKwkJb2ZfcmVnaXN0ZXJfaTJjX2RldmljZXMobnAsIGkpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzYwLDYgKzQyMCw3IEBACiB9CiAKIGFyY2hfaW5pdGNhbGwoZnNsX2kyY19vZl9pbml0KTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ184M3h4CiBzdGF0aWMgaW50IF9faW5pdCBtcGM4M3h4X3dkdF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2dyYWNrbGUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZ3JhY2tsZS5jCmluZGV4IDQyMDUzNjIuLjExYWQ1NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZ3JhY2tsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZ3JhY2tsZS5jCkBAIC01NSw3ICs1NSw3IEBACiAKIHZvaWQgX19pbml0IHNldHVwX2dyYWNrbGUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewotCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKKwlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgMHhmZWMwMDAwMCwgMHhmZWUwMDAwMCwgMCk7CiAJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWMxLDEiKSkKIAkJcGNpX2Fzc2lnbl9hbGxfYnVzZXMgPSAxOwogCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsUG93ZXJCb29rMTk5OCIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMKaW5kZXggYzdlNmU4NS4uNTI5NDU2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jCkBAIC0yMCwxMiArMjAsNiBAQAogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KIAotI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFCi0jZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9iZTMyCi0jZWxzZQotI2RlZmluZSBQQ0lfQ0ZHX09VVCBvdXRfbGUzMgotI2VuZGlmCi0KIHN0YXRpYyBpbnQKIGluZGlyZWN0X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKIAkJICAgICBpbnQgbGVuLCB1MzIgKnZhbCkKQEAgLTM1LDEwICsyOSwxNyBAQAogCXU4IGNmZ190eXBlID0gMDsKIAl1MzIgYnVzX25vLCByZWc7CiAKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX05PX1BDSUVfTElOSykgeworCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCQlpZiAoZGV2Zm4gIT0gMCkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJfQorCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCiAJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCQorCiAJaWYgKGhvc2UtPmluZGlyZWN0X3R5cGUgJiBQUENfSU5ESVJFQ1RfVFlQRV9TRVRfQ0ZHX1RZUEUpCiAJCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5maXJzdF9idXNubykKIAkJCWNmZ190eXBlID0gMTsKQEAgLTUxLDkgKzUyLDEyIEBACiAJZWxzZQogCQlyZWcgPSBvZmZzZXQgJiAweGZjOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCSAoMHg4MDAwMDAwMCB8IChidXNfbm8gPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCByZWcgfCBjZmdfdHlwZSkpOworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfQklHX0VORElBTikKKwkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikgfAorCQkJIChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CisJZWxzZQorCQlvdXRfbGUzMihob3NlLT5jZmdfYWRkciwgKDB4ODAwMDAwMDAgfCAoYnVzX25vIDw8IDE2KSB8CisJCQkgKGRldmZuIDw8IDgpIHwgcmVnIHwgY2ZnX3R5cGUpKTsKIAogCS8qCiAJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCkBAIC04Myw2ICs4NywxMyBAQAogCXU4IGNmZ190eXBlID0gMDsKIAl1MzIgYnVzX25vLCByZWc7CiAKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX05PX1BDSUVfTElOSykgeworCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCQlpZiAoZGV2Zm4gIT0gMCkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJfQorCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCiAJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtOTksOSArMTEwLDEyIEBACiAJZWxzZQogCQlyZWcgPSBvZmZzZXQgJiAweGZjOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCSAoMHg4MDAwMDAwMCB8IChidXNfbm8gPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCByZWcgfCBjZmdfdHlwZSkpOworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfQklHX0VORElBTikKKwkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikgfAorCQkJIChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CisJZWxzZQorCQlvdXRfbGUzMihob3NlLT5jZmdfYWRkciwgKDB4ODAwMDAwMDAgfCAoYnVzX25vIDw8IDE2KSB8CisJCQkgKGRldmZuIDw8IDgpIHwgcmVnIHwgY2ZnX3R5cGUpKTsKIAogCS8qIHN1cnByZXNzIHNldHRpbmcgb2YgUENJX1BSSU1BUllfQlVTICovCiAJaWYgKGhvc2UtPmluZGlyZWN0X3R5cGUgJiBQUENfSU5ESVJFQ1RfVFlQRV9TVVJQUkVTU19QUklNQVJZX0JVUykKQEAgLTEzNSwyNCArMTQ5LDE2IEBACiB9OwogCiB2b2lkIF9faW5pdAotc2V0dXBfaW5kaXJlY3RfcGNpX25vbWFwKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdm9pZCBfX2lvbWVtICogY2ZnX2FkZHIsCi0Jdm9pZCBfX2lvbWVtICogY2ZnX2RhdGEpCi17Ci0JaG9zZS0+Y2ZnX2FkZHIgPSBjZmdfYWRkcjsKLQlob3NlLT5jZmdfZGF0YSA9IGNmZ19kYXRhOwotCWhvc2UtPm9wcyA9ICZpbmRpcmVjdF9wY2lfb3BzOwotfQotCi12b2lkIF9faW5pdAotc2V0dXBfaW5kaXJlY3RfcGNpKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpCitzZXR1cF9pbmRpcmVjdF9wY2koc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB1MzIgY2ZnX2FkZHIsIHUzMiBjZmdfZGF0YSwgdTMyIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOwotCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1iYXNlOwogCiAJbWJhc2UgPSBpb3JlbWFwKGJhc2UsIFBBR0VfU0laRSk7Ci0JYWRkciA9IG1iYXNlICsgKGNmZ19hZGRyICYgflBBR0VfTUFTSyk7CisJaG9zZS0+Y2ZnX2FkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOwogCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCiAJCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKLQlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKLQlzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoaG9zZSwgYWRkciwgZGF0YSk7CisJaG9zZS0+Y2ZnX2RhdGEgPSBtYmFzZSArIChjZmdfZGF0YSAmIH5QQUdFX01BU0spOworCWhvc2UtPm9wcyA9ICZpbmRpcmVjdF9wY2lfb3BzOworCWhvc2UtPmluZGlyZWN0X3R5cGUgPSBmbGFnczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYwppbmRleCA0NWRiODZjLi45YjNiYWE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKLQlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5zdGFydCArIDQpOworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgNCwgMCk7CiAJaG9zZS0+c2VsZl9idXNubyA9IGhvc2UtPmZpcnN0X2J1c25vOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVY2NHg2MCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL1RRTTg1NDBfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9UUU04NTQwX2RlZmNvbmZpZwppbmRleCA5OWJmM2I3Li5mMzNmMGU3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9jb25maWdzL1RRTTg1NDBfZGVmY29uZmlnCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU0MF9kZWZjb25maWcKQEAgLTEzNiw3ICsxMzYsNyBAQAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElCRVJOQVRJT04gaXMgbm90IHNldAogQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9UUU04NTQxX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU0MV9kZWZjb25maWcKaW5kZXggMGZmNTY2OS4uZTAwY2Q2MiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9UUU04NTQxX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL1RRTTg1NDFfZGVmY29uZmlnCkBAIC0xMzgsNyArMTM4LDcgQEAKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TRUNDT01QPXkKIENPTkZJR19JU0FfRE1BX0FQST15CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU1NV9kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL1RRTTg1NTVfZGVmY29uZmlnCmluZGV4IDczMGIzZGIuLjQzYTBkOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU1NV9kZWZjb25maWcKKysrIGIvYXJjaC9wcGMvY29uZmlncy9UUU04NTU1X2RlZmNvbmZpZwpAQCAtMTM4LDcgKzEzOCw3IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogIyBDT05GSUdfUE0gaXMgbm90IHNldAotIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU0VDQ09NUD15CiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL1RRTTg1NjBfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9UUU04NTYwX2RlZmNvbmZpZwppbmRleCAxZDkwMjA3Li5hODE0ZDE3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9jb25maWdzL1RRTTg1NjBfZGVmY29uZmlnCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvVFFNODU2MF9kZWZjb25maWcKQEAgLTEzNyw3ICsxMzcsNyBAQAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElCRVJOQVRJT04gaXMgbm90IHNldAogQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9ldjY0MzYwX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvZXY2NDM2MF9kZWZjb25maWcKaW5kZXggZDQ3MWU1Ny4uZjI5N2M0YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9ldjY0MzYwX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL2V2NjQzNjBfZGVmY29uZmlnCkBAIC0xNDIsNyArMTQyLDcgQEAKIENPTkZJR19DTURMSU5FX0JPT0w9eQogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5TU0wLDExNTIwMCByb290PS9kZXYvbXRkYmxvY2sxIHJ3IHJvb3Rmc3R5cGU9amZmczIiCiAjIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJQkVSTkFUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19TRUNDT01QPXkKIENPTkZJR19JU0FfRE1BX0FQST15CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2NvbmZpZ3MvbWwzMDBfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9tbDMwMF9kZWZjb25maWcKaW5kZXggNGEzM2FjYS4uNjliYWQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvY29uZmlncy9tbDMwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wcGMvY29uZmlncy9tbDMwMF9kZWZjb25maWcKQEAgLTE0OCw3ICsxNDgsNyBAQAogQ09ORklHX0NNRExJTkVfQk9PTD15CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCw5NjAwIgogIyBDT05GSUdfUE0gaXMgbm90IHNldAotIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU0VDQ09NUD15CiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL21sNDAzX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvbWw0MDNfZGVmY29uZmlnCmluZGV4IGZhZmQyNTEuLmE3ODg5NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2NvbmZpZ3MvbWw0MDNfZGVmY29uZmlnCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvbWw0MDNfZGVmY29uZmlnCkBAIC0xNDksNyArMTQ5LDcgQEAKIENPTkZJR19DTURMSU5FX0JPT0w9eQogQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsOTYwMCIKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElCRVJOQVRJT04gaXMgbm90IHNldAogQ09ORklHX1NFQ0NPTVA9eQogQ09ORklHX0lTQV9ETUFfQVBJPXkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9tcGM4MzR4X3N5c19kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZwppbmRleCBiOTZhNmQ2Li5kOTBjOGE3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZworKysgYi9hcmNoL3BwYy9jb25maWdzL21wYzgzNHhfc3lzX2RlZmNvbmZpZwpAQCAtMTMwLDcgKzEzMCw3IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogIyBDT05GSUdfUE0gaXMgbm90IHNldAotIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfU0VDQ09NUD15CiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL3ByZXBfZGVmY29uZmlnIGIvYXJjaC9wcGMvY29uZmlncy9wcmVwX2RlZmNvbmZpZwppbmRleCAwYWEzMzMxLi5iN2NlZTJkIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9jb25maWdzL3ByZXBfZGVmY29uZmlnCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvcHJlcF9kZWZjb25maWcKQEAgLTE2Niw3ICsxNjYsNyBAQAogQ09ORklHX1BNPXkKICMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfU09GVFdBUkVfU1VTUEVORD15CitDT05GSUdfSElCRVJOQVRJT049eQogQ09ORklHX1BNX1NURF9QQVJUSVRJT049IiIKICMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAogQ09ORklHX0lTQV9ETUFfQVBJPXkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCmluZGV4IDZmZmJhYjcuLjYyMzkxZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKKysrIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAvKgogICogYXBwbGRhdGFfbW9kX3Z0aW1lcl93cmFwKCkKICAqCi0gKiB3cmFwcGVyIGZ1bmN0aW9uIGZvciBtb2RfdmlydF90aW1lcigpLCBiZWNhdXNlIHNtcF9jYWxsX2Z1bmN0aW9uX29uKCkKKyAqIHdyYXBwZXIgZnVuY3Rpb24gZm9yIG1vZF92aXJ0X3RpbWVyKCksIGJlY2F1c2Ugc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKCkKICAqIGFjY2VwdHMgb25seSBvbmUgcGFyYW1ldGVyLgogICovCiBzdGF0aWMgdm9pZCBfX2FwcGxkYXRhX21vZF92dGltZXJfd3JhcCh2b2lkICpwKSB7CkBAIC0yMDgsOSArMjA4LDkgQEAKIAkJCQkJICBudW1fb25saW5lX2NwdXMoKSkgKiBUT0RfTUlDUk87CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQkJcGVyX2NwdShhcHBsZGF0YV90aW1lciwgaSkuZXhwaXJlcyA9IHBlcl9jcHVfaW50ZXJ2YWw7Ci0JCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihhZGRfdmlydF90aW1lcl9wZXJpb2RpYywKLQkJCQkJICAgICAmcGVyX2NwdShhcHBsZGF0YV90aW1lciwgaSksCi0JCQkJCSAgICAgMCwgMSwgaSk7CisJCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaSwgYWRkX3ZpcnRfdGltZXJfcGVyaW9kaWMsCisJCQkJCQkgJnBlcl9jcHUoYXBwbGRhdGFfdGltZXIsIGkpLAorCQkJCQkJIDAsIDEpOwogCQl9CiAJCWFwcGxkYXRhX3RpbWVyX2FjdGl2ZSA9IDE7CiAJCVBfSU5GTygiTW9uaXRvcmluZyB0aW1lciBzdGFydGVkLlxuIik7CkBAIC0yMzYsOCArMjM2LDggQEAKIAkJCX0gYXJnczsKIAkJCWFyZ3MudGltZXIgPSAmcGVyX2NwdShhcHBsZGF0YV90aW1lciwgaSk7CiAJCQlhcmdzLmV4cGlyZXMgPSBwZXJfY3B1X2ludGVydmFsOwotCQkJc21wX2NhbGxfZnVuY3Rpb25fb24oX19hcHBsZGF0YV9tb2RfdnRpbWVyX3dyYXAsCi0JCQkJCSAgICAgJmFyZ3MsIDAsIDEsIGkpOworCQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGksIF9fYXBwbGRhdGFfbW9kX3Z0aW1lcl93cmFwLAorCQkJCQkJICZhcmdzLCAwLCAxKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwppbmRleCBhY2M0MTU0Li42ZWUxYmVkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCkBAIC0xNzEwLDMgKzE3MTAsMTMgQEAKIHN5c19ldmVudGZkX3dyYXBwZXI6CiAJbGxnZnIJJXIyLCVyMgkJCSMgdW5zaWduZWQgaW50CiAJamcJc3lzX2V2ZW50ZmQKKworCS5nbG9ibAlzeXNfZmFsbG9jYXRlX3dyYXBwZXIKK3N5c19mYWxsb2NhdGVfd3JhcHBlcjoKKwlsZ2ZyCSVyMiwlcjIJCQkjIGludAorCWxnZnIJJXIzLCVyMwkJCSMgaW50CisJc2xsZwklcjQsJXI0LDMyCQkjIGdldCBoaWdoIHdvcmQgb2YgNjRiaXQgbG9mZl90CisJbHIJJXI0LCVyNQkJCSMgZ2V0IGxvdyB3b3JkIG9mIDY0Yml0IGxvZmZfdAorCXNsbGcJJXI1LCVyNiwzMgkJIyBnZXQgaGlnaCB3b3JkIG9mIDY0Yml0IGxvZmZfdAorCWwJJXI1LDE2NCglcjE1KQkJIyBnZXQgbG93IHdvcmQgb2YgNjRiaXQgbG9mZl90CisJamcJc3lzX2ZhbGxvY2F0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCmluZGV4IGJjN2ZmMzYuLmYzYmNlYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTYyNCw5ICs2MjQsMTEgQEAKICMgX1RJRl9NQ0NLX1BFTkRJTkcgaXMgc2V0LCBjYWxsIGhhbmRsZXIKICMKIGlvX21jY2tfcGVuZGluZzoKKwlUUkFDRV9JUlFTX09GRgogCWwJJXIxLEJBU0VEKC5MczM5MF9oYW5kbGVfbWNjaykKLQlsYQklcjE0LEJBU0VEKGlvX3dvcmtfbG9vcCkKLQlicgklcjEJCQkjIFRJRiBiaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGhhbmRsZXIKKwliYXNyCSVyMTQsJXIxCQkjIFRJRiBiaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGhhbmRsZXIKKwlUUkFDRV9JUlFTX09OCisJYglCQVNFRChpb193b3JrX2xvb3ApCiAKICMKICMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmluZGV4IDJhN2IxMzAuLjljMGQ1Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCkBAIC02MTEsOCArNjExLDEwIEBACiAjIF9USUZfTUNDS19QRU5ESU5HIGlzIHNldCwgY2FsbCBoYW5kbGVyCiAjCiBpb19tY2NrX3BlbmRpbmc6Ci0JbGFybAklcjE0LGlvX3dvcmtfbG9vcAotCWpnCXMzOTBfaGFuZGxlX21jY2sJIyBUSUYgYml0IHdpbGwgYmUgY2xlYXJlZCBieSBoYW5kbGVyCisJVFJBQ0VfSVJRU19PRkYKKwlicmFzbAklcjE0LHMzOTBfaGFuZGxlX21jY2sJIyBUSUYgYml0IHdpbGwgYmUgY2xlYXJlZCBieSBoYW5kbGVyCisJVFJBQ0VfSVJRU19PTgorCWoJaW9fd29ya19sb29wCiAKICMKICMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCmluZGV4IDhmOGM4MDIuLjgzNDc3YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCkBAIC0zNSw2ICszNSw3IEBACiAjZGVmaW5lIEFSQ0hfT0ZGU0VUCTAKICNlbmRpZgogCisuc2VjdGlvbiAiLnRleHQuaGVhZCIsImF4IgogI2lmbmRlZiBDT05GSUdfSVBMCiAJLm9yZyAgIDAKIAkubG9uZyAgMHgwMDA4MDAwMCwweDgwMDAwMDAwK3N0YXJ0dXAJIyBKdXN0IGEgcmVzdGFydCBQU1cKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3MzOTAva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGQ3M2E3NDAuLmQ0OTQxNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDQ0MTk3NWIuLmFiYjQ0N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCAxODJjMDg1YS4uMzVlZGJlZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMjAsNyArMTIxLDcgQEAKIAlpZiAod2FpdCkKIAkJZGF0YS5maW5pc2hlZCA9IENQVV9NQVNLX05PTkU7CiAKLQlzcGluX2xvY2tfYmgoJmNhbGxfbG9jayk7CisJc3Bpbl9sb2NrKCZjYWxsX2xvY2spOwogCWNhbGxfZGF0YSA9ICZkYXRhOwogCiAJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBtYXApCkBAIC0xMjksMTggKzEzMCwxNiBAQAogCS8qIFdhaXQgZm9yIHJlc3BvbnNlICovCiAJd2hpbGUgKCFjcHVzX2VxdWFsKG1hcCwgZGF0YS5zdGFydGVkKSkKIAkJY3B1X3JlbGF4KCk7Ci0KIAlpZiAod2FpdCkKIAkJd2hpbGUgKCFjcHVzX2VxdWFsKG1hcCwgZGF0YS5maW5pc2hlZCkpCiAJCQljcHVfcmVsYXgoKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZjYWxsX2xvY2spOwotCisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CiBvdXQ6Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAobG9jYWwpCisJaWYgKGxvY2FsKSB7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCWZ1bmMoaW5mbyk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJfQogfQogCiAvKgpAQCAtMTcwLDMwICsxNjksMjggQEAKIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogCiAvKgotICogc21wX2NhbGxfZnVuY3Rpb25fb246CisgKiBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGU6CisgKiBAY3B1OiB0aGUgQ1BVIHdoZXJlIGZ1bmMgc2hvdWxkIHJ1bgogICogQGZ1bmM6IHRoZSBmdW5jdGlvbiB0byBydW47IHRoaXMgbXVzdCBiZSBmYXN0IGFuZCBub24tYmxvY2tpbmcKICAqIEBpbmZvOiBhbiBhcmJpdHJhcnkgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgogICogQG5vbmF0b21pYzogdW51c2VkCiAgKiBAd2FpdDogaWYgdHJ1ZSwgd2FpdCAoYXRvbWljYWxseSkgdW50aWwgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBvbiBvdGhlciBDUFVzCi0gKiBAY3B1OiB0aGUgQ1BVIHdoZXJlIGZ1bmMgc2hvdWxkIHJ1bgogICoKICAqIFJ1biBhIGZ1bmN0aW9uIG9uIG9uZSBwcm9jZXNzb3IuCiAgKgogICogWW91IG11c3Qgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGRpc2FibGVkIGludGVycnVwdHMsIGZyb20gYQogICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgb3IgZnJvbSBhIGJvdHRvbSBoYWxmLgogICovCi1pbnQgc21wX2NhbGxfZnVuY3Rpb25fb24odm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IG5vbmF0b21pYywKLQkJCSBpbnQgd2FpdCwgaW50IGNwdSkKK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdSwgdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywKKwkJCSAgICAgaW50IG5vbmF0b21pYywgaW50IHdhaXQpCiB7Ci0JY3B1bWFza190IG1hcCA9IENQVV9NQVNLX05PTkU7Ci0KIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQljcHVfc2V0KGNwdSwgbWFwKTsKLQlfX3NtcF9jYWxsX2Z1bmN0aW9uX21hcChmdW5jLCBpbmZvLCBub25hdG9taWMsIHdhaXQsIG1hcCk7CisJX19zbXBfY2FsbF9mdW5jdGlvbl9tYXAoZnVuYywgaW5mbywgbm9uYXRvbWljLCB3YWl0LAorCQkJCWNwdW1hc2tfb2ZfY3B1KGNwdSkpOwogCXByZWVtcHRfZW5hYmxlKCk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uX29uKTsKK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKIAogc3RhdGljIHZvaWQgZG9fc2VuZF9zdG9wKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMgYi9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKaW5kZXggMWM5MGM3ZS4uMWVhZmY4NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CkBAIC0yNjUsMyArMjY2LDIzIEBACiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBzeXNfZmFkdmlzZTY0XzY0KGEuZmQsIGEub2Zmc2V0LCBhLmxlbiwgYS5hZHZpY2UpOwogfQorCisjaWZuZGVmIENPTkZJR182NEJJVAorLyoKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIHRvIGNhbGwgc3lzX2ZhbGxvY2F0ZSgpLiBGb3IgMzEgYml0IHMzOTAgdGhlIGxhc3QKKyAqIDY0IGJpdCBhcmd1bWVudCAibGVuIiBpcyBzcGxpdCBpbnRvIHRoZSB1cHBlciBhbmQgbG93ZXIgMzIgYml0cy4gVGhlCisgKiBzeXN0ZW0gY2FsbCB3cmFwcGVyIGluIHRoZSB1c2VyIHNwYWNlIGxvYWRzIHRoZSB2YWx1ZSB0byAlcjYvJXI3LgorICogVGhlIGNvZGUgaW4gZW50cnkuUyBrZWVwcyB0aGUgdmFsdWVzIGluICVyMiAtICVyNiB3aGVyZSB0aGV5IGFyZSBhbmQKKyAqIHN0b3JlcyAlcjcgdG8gOTYoJXIxNSkuIEJ1dCB0aGUgc3RhbmRhcmQgQyBsaW5rYWdlIHJlcXVpcmVzIHRoYXQKKyAqIHRoZSB3aG9sZSA2NCBiaXQgdmFsdWUgZm9yIGxlbiBpcyBzdG9yZWQgb24gdGhlIHN0YWNrIGFuZCBkb2Vzbid0CisgKiB1c2UgJXI2IGF0IGFsbC4gU28gczM5MF9mYWxsb2NhdGUgaGFzIHRvIGNvbnZlcnQgdGhlIGFyZ3VtZW50cyBmcm9tCisgKiAgICVyMjogZmQsICVyMzogbW9kZSwgJXI0LyVyNTogb2Zmc2V0LCAlcjYvOTYoJXIxNSktOTkoJXIxNSk6IGxlbgorICogdG8KKyAqICAgJXIyOiBmZCwgJXIzOiBtb2RlLCAlcjQvJXI1OiBvZmZzZXQsIDk2KCVyMTUpLTEwMyglcjE1KTogbGVuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzMzkwX2ZhbGxvY2F0ZShpbnQgZmQsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgIHUzMiBsZW5faGlnaCwgdTMyIGxlbl9sb3cpCit7CisJcmV0dXJuIHN5c19mYWxsb2NhdGUoZmQsIG1vZGUsIG9mZnNldCwgKCh1NjQpbGVuX2hpZ2ggPDwgMzIpIHwgbGVuX2xvdyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCA3MzhmZWI0Li45ZTI2ZWQ5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0zMjIsNyArMzIyLDcgQEAKIFNZU0NBTEwoc3lzX2dldGNwdSxzeXNfZ2V0Y3B1LHN5c19nZXRjcHVfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2Vwb2xsX3B3YWl0LHN5c19lcG9sbF9wd2FpdCxjb21wYXRfc3lzX2Vwb2xsX3B3YWl0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c191dGltZXMsc3lzX3V0aW1lcyxjb21wYXRfc3lzX3V0aW1lc193cmFwcGVyKQotTklfU1lTQ0FMTAkJCQkJCQkvKiAzMTQgc3lzX2ZhbGxvY2F0ZSAqLworU1lTQ0FMTChzMzkwX2ZhbGxvY2F0ZSxzeXNfZmFsbG9jYXRlLHN5c19mYWxsb2NhdGVfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3V0aW1lbnNhdCxzeXNfdXRpbWVuc2F0LGNvbXBhdF9zeXNfdXRpbWVuc2F0X3dyYXBwZXIpCS8qIDMxNSAqLwogU1lTQ0FMTChzeXNfc2lnbmFsZmQsc3lzX3NpZ25hbGZkLGNvbXBhdF9zeXNfc2lnbmFsZmRfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3RpbWVyZmQsc3lzX3RpbWVyZmQsY29tcGF0X3N5c190aW1lcmZkX3dyYXBwZXIpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNmFiN2Q0ZS4uYjQ2MjJhMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMjEsNiArMjEsNyBAQAogICAuID0gMHgwMDAwMDAwMDsKICAgX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCiAgIC50ZXh0IDogeworCSooLnRleHQuaGVhZCkKIAlURVhUX1RFWFQKIAlTQ0hFRF9URVhUCiAJTE9DS19URVhUCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKaW5kZXggYjZlZDE0My4uODRmZjc4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwpAQCAtNDE1LDcgKzQxNSw3IEBACiAKIC8qCiAgKiBJZiB3ZSBjaGFuZ2UgYSBwZW5kaW5nIHRpbWVyIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgQ1BVCi0gKiB3aGVyZSB0aGUgdGltZXIgaXMgcnVubmluZyBvbiwgZS5nLiBieSBzbXBfY2FsbF9mdW5jdGlvbl9vbigpCisgKiB3aGVyZSB0aGUgdGltZXIgaXMgcnVubmluZyBvbiwgZS5nLiBieSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoKQogICoKICAqIFRoZSBvcmlnaW5hbCBtb2RfdGltZXIgYWRkcyB0aGUgdGltZXIgaWYgaXQgaXMgbm90IHBlbmRpbmcuIEZvciBjb21wYXRpYmlsaXR5CiAgKiB3ZSBkbyB0aGUgc2FtZS4gVGhlIHRpbWVyIHdpbGwgYmUgYWRkZWQgb24gdGhlIGN1cnJlbnQgQ1BVIGFzIGEgb25lc2hvdCB0aW1lci4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS92bWVtLmMgYi9hcmNoL3MzOTAvbW0vdm1lbS5jCmluZGV4IDkyYTU2NTEuLmZkNTk0ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS92bWVtLmMKKysrIGIvYXJjaC9zMzkwL21tL3ZtZW0uYwpAQCAtMjksOCArMjksOCBAQAogCiBzdGF0aWMgTElTVF9IRUFEKG1lbV9zZWdzKTsKIAotdm9pZCBtZW1tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZSwKLQkJIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuKQordm9pZCBfX21lbWluaXQgbWVtbWFwX2luaXQodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHpvbmUsCisJCQkgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbikKIHsKIAlzdHJ1Y3QgcGFnZSAqc3RhcnQsICplbmQ7CiAJc3RydWN0IHBhZ2UgKm1hcF9zdGFydCwgKm1hcF9lbmQ7CkBAIC02Niw3ICs2Niw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnZtZW1fYWxsb2NfcGFnZXModW5zaWduZWQgaW50IG9yZGVyKQorc3RhdGljIHZvaWQgX19pbml0X3JlZm9rICp2bWVtX2FsbG9jX3BhZ2VzKHVuc2lnbmVkIGludCBvcmRlcikKIHsKIAlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKIAkJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvS2NvbmZpZyBiL2FyY2gvc2g2NC9LY29uZmlnCmluZGV4IGZmNjU0MjAuLjU2NjQ2MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9LY29uZmlnCisrKyBiL2FyY2gvc2g2NC9LY29uZmlnCkBAIC00Nyw2ICs0Nyw5IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgQVJDSF9OT19WSVJUX1RPX0JVUworCWRlZl9ib29sIHkKKwogc291cmNlIGluaXQvS2NvbmZpZwogCiBtZW51ICJTeXN0ZW0gdHlwZSIKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3NoNjQva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGRlMmQwN2QuLmRlZWU4YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbXF1ZXVlLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2tlcm5lbC9pcnFfaW50Yy5jIGIvYXJjaC9zaDY0L2tlcm5lbC9pcnFfaW50Yy5jCmluZGV4IDQyYzA3ZDIuLjNiNjNhOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9rZXJuZWwvaXJxX2ludGMuYworKysgYi9hcmNoL3NoNjQva2VybmVsL2lycV9pbnRjLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3NoNjQva2VybmVsL3BjaS1kbWEuYwppbmRleCBhMzZjM2Q3Li5hOTMyOGY4IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3NoNjQva2VybmVsL3BjaS1kbWEuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAJaWYgKHZwICE9IE5VTEwpIHsKIAkJbWVtc2V0KHZwLCAwLCBzaXplKTsKLQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cyhyZXQpOworCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fcGh5cyhyZXQpOwogCQlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKXJldCwgc2l6ZSk7CiAJfQogCkBAIC00Miw3ICs0Miw3IEBACiB7CiAJdm9pZCAqYWxsb2M7CiAKLQlhbGxvYyA9IGJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKWRtYV9oYW5kbGUpOworCWFsbG9jID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKWRtYV9oYW5kbGUpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWxsb2MsIGdldF9vcmRlcihzaXplKSk7CiAKIAlpb3VubWFwKHZhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaDY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMWI4OWM5ZC4uY2ViOTQ1OCAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIxLDYgKzIxLDcgQEAKICAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIHByb2Nlc3MgaGFuZGxpbmcuLgogICovCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvc3lzX3NoNjQuYyBiL2FyY2gvc2g2NC9rZXJuZWwvc3lzX3NoNjQuYwppbmRleCAxOTEyNmRhLi5iN2YxOGUyOSAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC9zeXNfc2g2NC5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvc3lzX3NoNjQuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2RiZy5jIGIvYXJjaC9zaDY0L2xpYi9kYmcuYwppbmRleCA0MzEwZmM4Li45NzgxNmUwIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvbGliL2RiZy5jCisrKyBiL2FyY2gvc2g2NC9saWIvZGJnLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAogdHlwZWRlZiB1NjQgcmVnVHlwZV90OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9kZWZjb25maWcgYi9hcmNoL3NwYXJjL2RlZmNvbmZpZwppbmRleCAzOGJkNzlmLi5mN2E1MDkxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2RlZmNvbmZpZworKysgYi9hcmNoL3NwYXJjL2RlZmNvbmZpZwpAQCAtMSwxMiArMSwxNCBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjMQotIyBNb24gTWF5IDE0IDAzOjI1OjE0IDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMy1yYzEKKyMgV2VkIEp1bCAyNSAxNTozMDoyMSAyMDA3CiAjCiBDT05GSUdfTU1VPXkKIENPTkZJR19ISUdITUVNPXkKIENPTkZJR19aT05FX0RNQT15CiBDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKK0NPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19PRj15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0yMywxMiArMjUsMTEgQEAKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19JUENfTlMgaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKIENPTkZJR19QT1NJWF9NUVVFVUU9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKQEAgLTYzLDI0ICs2NCwxNyBAQAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LTU9EPXkKLQotIwotIyBCbG9jayBsYXllcgotIwogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTEzLDExICsxMDcsMTQgQEAKIENPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19FTVVMQVRFRF9DTVBYQ0hHPXkKIENPTkZJR19TVU5fUE09eQogIyBDT05GSUdfU1VONCBpcyBub3Qgc2V0CiBDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTk9fRE1BIGlzIG5vdCBzZXQKIENPTkZJR19TVU5fT1BFTlBST01GUz1tCiAjIENPTkZJR19TUEFSQ19MRUQgaXMgbm90IHNldAogQ09ORklHX0JJTkZNVF9FTEY9eQpAQCAtMTM0LDYgKzEzMSw3IEBACiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQogCiAjCiAjIE5ldHdvcmtpbmcKQEAgLTE5NywyNSArMTk1LDEzIEBACiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogQ09ORklHX0lQX1NDVFA9bQogIyBDT05GSUdfU0NUUF9EQkdfTVNHIGlzIG5vdCBzZXQKIENPTkZJR19TQ1RQX0RCR19PQkpDTlQ9eQogIyBDT05GSUdfU0NUUF9ITUFDX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0NUUF9ITUFDX1NIQTEgaXMgbm90IHNldAogQ09ORklHX1NDVFBfSE1BQ19NRDU9eQotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQEAgLTI1Myw2ICsyMzksNyBAQAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0yNjcsMjggKzI1NCwxMiBAQAogIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCitDT05GSUdfT0ZfREVWSUNFPXkKICMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIworQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldApAQCAtMzAzLDE4ICsyNzQsMTEgQEAKIENPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTMyMiw2ICsyODYsNyBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ETUE9eQogIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX1BST0NfRlM9eQpAQCAtMzUyLDEyICszMTcsOCBAQAogQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKICMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKLSMKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldApAQCAtMzY3LDcgKzMyOCw2IEBACiAjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldApAQCAtMzg5LDE0ICszNDksOSBAQAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0VTUF9DT1JFPXkKIENPTkZJR19TQ1NJX1NVTkVTUD15CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKQEAgLTQxMiwzMCArMzY3LDE2IEBACiAjCiAjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCiAjIENPTkZJR19JMk8gaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKIENPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiBDT05GSUdfVFVOPW0KLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwogIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NSUk9bQogQ09ORklHX1NVTkxBTkNFPXkKQEAgLTQ0NSwxMCArMzg2LDYgQEAKICMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CiAjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKQEAgLTQ2NCw3ICs0MDEsNyBAQAogIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKQEAgLTQ3NywxMSArNDE0LDYgQEAKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKLUNPTkZJR19NTFg0X0RFQlVHPXkKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk5LDE1ICs0MzEsNyBAQAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCiAjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwogIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAogCiAjCkBAIC01MTUsNiArNDM5LDcgQEAKICMKIENPTkZJR19JTlBVVD15CiAjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTU5MywyMiArNTE4LDEzIEBACiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPW0KLUNPTkZJR19SVEM9bQorQ09ORklHX0pTX1JUQz1tCiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogQ09ORklHX0RFVlBPUlQ9eQogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKQEAgLTYxOCwyMCArNTM0LDI0IEBACiAjCiAjIENPTkZJR19TUEkgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKQEAgLTY1Niw2ICs1NzYsNyBAQAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNjY4LDE2ICs1ODksMTAgQEAKICMgU291bmQKICMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBISUQgRGV2aWNlcwotIworQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIworQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQpAQCAtNjkyLDMwICs2MDcsMTAgQEAKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZGV2aWNlcwotIwogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotCi0jCi0jIExFRCBkcml2ZXJzCi0jCi0KLSMKLSMgTEVEIFRyaWdnZXJzCi0jCi0KLSMKLSMgSW5maW5pQmFuZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIwotIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKLSMKLQotIwogIyBSZWFsIFRpbWUgQ2xvY2sKICMKICMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CkBAIC03MzQsNiArNjI5LDExIEBACiAjCiAKICMKKyMgVXNlcnNwYWNlIEkvTworIworIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIwogIyBNaXNjIExpbnV4L1NQQVJDIGRyaXZlcnMKICMKIENPTkZJR19TVU5fT1BFTlBST01JTz1tCkBAIC04NTMsNyArNzUzLDYgQEAKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogQ09ORklHX0FGU19GUz1tCiAjIENPTkZJR19BRlNfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtOTI3LDYgKzgyNiw3IEBACiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CkBAIC05NTMsMTAgKzg1Myw2IEBACiBDT05GSUdfS0VZUz15CiAjIENPTkZJR19LRVlTX0RFQlVHX1BST0NfS0VZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCiBDT05GSUdfQ1JZUFRPPXkKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKQEAgLTk5NiwxMCArODkyLDcgQEAKIENPTkZJR19DUllQVE9fQ1JDMzJDPW0KICMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpAQCAtMTAwOSw2ICs5MDIsNyBAQAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKIENPTkZJR19MSUJDUkMzMkM9bQogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggZmMzMWRlNi4uZDlkNGY5NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMKaW5kZXggZTNhNTM3Ni4uMzlmYmQzYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYwpAQCAtNDE1LDcgKzQxNSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljb25zdCBjaGFyICp0eXBlOwogCXBoYW5kbGUgbm9kZTsKLQlpbnQgc2tpcCwgZmQ7CisJaW50IHNraXAsIHRtcCwgZmQ7CiAKIAlvZl9jb25zb2xlX3BhdGggPSBwcm9tX2Vhcmx5X2FsbG9jKDI1Nik7CiAKQEAgLTQ0Miw4ICs0NDIsOSBAQAogCQkJcHJvbV9oYWx0KCk7CiAJCX0KIAorCQl0bXAgPSBza2lwOwogCQlmb3JfZWFjaF9ub2RlX2J5X3R5cGUoZHAsIHR5cGUpIHsKLQkJCWlmICghc2tpcC0tKQorCQkJaWYgKCF0bXAtLSkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoIWRwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYwppbmRleCA1NWJhYzUxLi43YjRhYmRlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKQEAgLTE2MSw2ICsxNjEsOCBAQAogRVhQT1JUX1NZTUJPTChCVEZJWFVQX0NBTEwobW11X3JlbGVhc2Vfc2NzaV9zZ2wpKTsKIEVYUE9SVF9TWU1CT0woQlRGSVhVUF9DQUxMKG1tdV9yZWxlYXNlX3Njc2lfb25lKSk7CiAKK0VYUE9SVF9TWU1CT0woQlRGSVhVUF9DQUxMKHBncHJvdF9ub25jYWNoZWQpKTsKKwogI2lmZGVmIENPTkZJR19TQlVTCiBFWFBPUlRfU1lNQk9MKHNidXNfcm9vdCk7CiBFWFBPUlRfU1lNQk9MKGRtYV9jaGFpbik7CkBAIC0yNjAsNiArMjYyLDcgQEAKIC8qIE1vdmluZyBkYXRhIHRvL2Zyb20gdXNlcnNwYWNlLiAqLwogRVhQT1JUX1NZTUJPTChfX2NvcHlfdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcik7CiAKIC8qIE5ldHdvcmtpbmcgaGVscGVyIHJvdXRpbmVzLiAqLwogRVhQT1JUX1NZTUJPTChfX2NzdW1fcGFydGlhbF9jb3B5X3NwYXJjX2dlbmVyaWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvc3BhcmMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNDc1ODM4ODcuLjE1MTA5YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzUsNiArMzUsOCBAQAogICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KICAgX19zdG9wX19fZXhfdGFibGUgPSAuOwogCisgIE5PVEVTCisKICAgLiA9IEFMSUdOKDQwOTYpOwogICBfX2luaXRfYmVnaW4gPSAuOwogICBfc2luaXR0ZXh0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL21lbXNldC5TIGIvYXJjaC9zcGFyYy9saWIvbWVtc2V0LlMKaW5kZXggYTY1ZWJhNC4uMWMzN2VhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbGliL21lbXNldC5TCisrKyBiL2FyY2gvc3BhcmMvbGliL21lbXNldC5TCkBAIC0xNjIsNyArMTYyLDcgQEAKIDg6CiAJIGFkZAklbzAsIDEsICVvMAogCXN1YmNjCSVvMSwgMSwgJW8xCi0JYm5lLGEJOGIKKwlibmUJOGIKIAkgRVgoc3RiCSVnMywgWyVvMCAtIDFdLCBhZGQgJW8xLCAxKQogMDoKIAlyZXRsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vcHJpbnRmLmMgYi9hcmNoL3NwYXJjL3Byb20vcHJpbnRmLmMKaW5kZXggMjdmZGFjOS4uYTM2YWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3ByaW50Zi5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9wcmludGYuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpAQCAtNDQsMyArNDUsNCBAQAogCiAJcHJvbV93cml0ZShwcGJ1ZiwgaSk7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fcHJpbnRmKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnLmRlYnVnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcuZGVidWcKaW5kZXggMWYxMzBmMy4uYTVmYWEzNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcuZGVidWcKQEAgLTI5LDcgKzI5LDcgQEAKIAogY29uZmlnIERFQlVHX1BBR0VBTExPQwogCWJvb2wgIkRlYnVnIHBhZ2UgbWVtb3J5IGFsbG9jYXRpb25zIgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTT0ZUV0FSRV9TVVNQRU5ECisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgIUhJQkVSTkFUSU9OCiAJaGVscAogCSAgVW5tYXAgcGFnZXMgZnJvbSB0aGUga2VybmVsIGxpbmVhciBtYXBwaW5nIGFmdGVyIGZyZWVfcGFnZXMoKS4KIAkgIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlIHNsb3dkb3duLCBidXQgaGVscHMgdG8gZmluZCBjZXJ0YWluIHR5cGVzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnIGIvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZwppbmRleCAxMGUzMDE5Li42ODMzOGE2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKQEAgLTEsMTEgKzEsMTIgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMgotIyBUaHUgSnVsIDE5IDIxOjMwOjM3IDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMy1yYzEKKyMgU3VuIEp1bCAyMiAxOToyNDozNyAyMDA3CiAjCiBDT05GSUdfU1BBUkM9eQogQ09ORklHX1NQQVJDNjQ9eQogQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiBDT05GSUdfNjRCSVQ9eQogQ09ORklHX01NVT15CkBAIC0xNyw2ICsxOCw3IEBACiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQorQ09ORklHX09GPXkKIENPTkZJR19TUEFSQzY0X1BBR0VfU0laRV84S0I9eQogIyBDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEFSQzY0X1BBR0VfU0laRV81MTJLQiBpcyBub3Qgc2V0CkBAIC0zMTQsNiArMzE2LDcgQEAKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIENPTkZJR19DT05ORUNUT1I9bQogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKK0NPTkZJR19PRl9ERVZJQ0U9eQogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKQEAgLTQzMywxMCArNDM2LDcgQEAKIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPW0KICMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwotIworQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogQ09ORklHX0lTQ1NJX1RDUD1tCiAjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldApAQCAtNzAxLDcgKzcwMSw2IEBACiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLUNPTkZJR19SVEM9eQogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKQEAgLTg0NCw2ICs4NDMsNyBAQAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKIENPTkZJR19GQl9EREM9eQpAQCAtOTM3LDcgKzkzNyw2IEBACiBDT05GSUdfU05EX1BDTV9PU1M9bQogQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQogQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKLSMgQ09ORklHX1NORF9SVENUSU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAogQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQogQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CkBAIC0xMDM0LDYgKzEwMzMsMTAgQEAKICMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAogCiAjCisjIFNvQyBBdWRpbyBzdXBwb3J0IGZvciBTdXBlckgKKyMKKworIwogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldApAQCAtMTE1NywxOSArMTE2MCw3IEBACiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRldmljZXMKLSMKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIwogIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CiAKICMKQEAgLTExOTksNyArMTE5MCw2IEBACiAjIE1pc2MgTGludXgvU1BBUkMgZHJpdmVycwogIwogQ09ORklHX1NVTl9PUEVOUFJPTUlPPW0KLUNPTkZJR19TVU5fTU9TVEVLX1JUQz15CiAjIENPTkZJR19PQlBfRkxBU0ggaXMgbm90IHNldAogIyBDT05GSUdfU1VOX0JQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQkNfSTJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGI2Njg3NmIuLjQwZDJmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtOCwxNCArOCwxNCBAQAogZXh0cmEteQkJOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCiAKIG9iai15CQk6PSBwcm9jZXNzLm8gc2V0dXAubyBjcHUubyBpZHByb20ubyBcCi0JCSAgIHRyYXBzLm8gYXV4aW8ubyB1bmFfYXNtLm8gc3lzZnMubyBcCisJCSAgIHRyYXBzLm8gYXV4aW8ubyB1bmFfYXNtLm8gc3lzZnMubyBpb21tdS5vIFwKIAkJICAgaXJxLm8gcHRyYWNlLm8gdGltZS5vIHN5c19zcGFyYy5vIHNpZ25hbC5vIFwKIAkJICAgdW5hbGlnbmVkLm8gY2VudHJhbC5vIHBjaS5vIHN0YXJmaXJlLm8gc2VtYXBob3JlLm8gXAogCQkgICBwb3dlci5vIHNidXMubyBpb21tdV9jb21tb24ubyBzcGFyYzY0X2tzeW1zLm8gY2htYy5vIFwKIAkJICAgdmlzZW11bC5vIHByb20ubyBvZl9kZXZpY2UubyBodmFwaS5vIHNzdGF0ZS5vIG1kZXNjLm8KIAogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpICs9IHN0YWNrdHJhY2Uubwotb2JqLSQoQ09ORklHX1BDSSkJICs9IGVidXMubyBpc2EubyBwY2lfY29tbW9uLm8gcGNpX2lvbW11Lm8gXAorb2JqLSQoQ09ORklHX1BDSSkJICs9IGVidXMubyBpc2EubyBwY2lfY29tbW9uLm8gXAogCQkJICAgIHBjaV9wc3ljaG8ubyBwY2lfc2FicmUubyBwY2lfc2NoaXpvLm8gXAogCQkJICAgIHBjaV9zdW40di5vIHBjaV9zdW40dl9hc20ubyBwY2lfZmlyZS5vCiBvYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vIGh2dHJhbXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYwppbmRleCA2ZDI5NTYxLi5iYzlhZTM2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYwpAQCAtMzkxLDYgKzM5MSw4IEBACiAJc2QgPSAmZGV2LT5vZmRldi5kZXYuYXJjaGRhdGE7CiAJc2QtPnByb21fbm9kZSA9IGRwOwogCXNkLT5vcCA9ICZkZXYtPm9mZGV2OworCXNkLT5pb21tdSA9IGRldi0+YnVzLT5vZmRldi5kZXYucGFyZW50LT5hcmNoZGF0YS5pb21tdTsKKwlzZC0+c3RjID0gZGV2LT5idXMtPm9mZGV2LmRldi5wYXJlbnQtPmFyY2hkYXRhLnN0YzsKIAogCWRldi0+b2ZkZXYubm9kZSA9IGRwOwogCWRldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZkZXYtPmJ1cy0+b2ZkZXYuZGV2OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUwppbmRleCAzNWZlYWNiLi45ZGJkODMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUwpAQCAtMSwxNSArMSwxNSBAQAotLyogJElkOiBoZWFkLlMsdiAxLjg3IDIwMDIvMDIvMDkgMTk6NDk6MzEgZGF2ZW0gRXhwICQKLSAqIGhlYWQuUzogSW5pdGlhbCBib290IGNvZGUgZm9yIHRoZSBTcGFyYzY0IHBvcnQgb2YgTGludXguCisvKiBoZWFkLlM6IEluaXRpYWwgYm9vdCBjb2RlIGZvciB0aGUgU3BhcmM2NCBwb3J0IG9mIExpbnV4LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwxOTk3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgU2l0c2t5IChEYXZpZC5TaXRza3lAYW51LmVkdS5hdSkKLSAqIENvcHlyaWdodCAoQykgMTk5NywxOTk4IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggSmFrdWIgSmVsaW5layAoampAc3Vuc2l0ZS5tZmYuY3VuaS5jeikKICAqIENvcHlyaWdodCAoQykgMTk5NyBNaWd1ZWwgZGUgSWNhemEgKG1pZ3VlbEBudWNsZWN1LnVuYW0ubXgpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KQEAgLTM3NCw2ICszNzQsNyBAQAogCWptcGwgICAgJWcyICsgJWcwLCAlZzAKIAkgbm9wCiAKKwkuc2VjdGlvbgkudGV4dC5pbml0LnJlZm9rCiBzdW40dV9pbml0OgogCUJSQU5DSF9JRl9TVU40VihnMSwgc3VuNHZfaW5pdCkKIApAQCAtNTI5LDYgKzUzMCw4IEBACiAJIG5vcAogCS8qIE5vdCByZWFjaGVkLi4uICovCiAKKwkucHJldmlvdXMKKwogCS8qIFRoaXMgaXMgbWVhbnQgdG8gYWxsb3cgdGhlIHNoYXJpbmcgb2YgdGhpcyBjb2RlIGJldHdlZW4KIAkgKiBib290IHByb2Nlc3NvciBpbnZvY2F0aW9uICh2aWEgc2V0dXBfdGJhKCkgYmVsb3cpIGFuZAogCSAqIHNlY29uZGFyeSBwcm9jZXNzb3Igc3RhcnR1cCAodmlhIHRyYW1wb2xpbmUuUykuICBUaGUKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2luaXRfdGFzay5jCmluZGV4IDMyOWIzOGYuLjkwMDA3Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lvbW11LmMKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYwpyZW5hbWUgdG8gYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdS5jCmluZGV4IDcwZDIzNjQuLmIzNWE2MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pb21tdS5jCkBAIC0xLDI4ICsxLDMyIEBACi0vKiBwY2lfaW9tbXUuYzogVWx0cmFTcGFyYyBQQ0kgY29udHJvbGxlciBJT00vU1RDIHN1cHBvcnQuCisvKiBpb21tdS5jOiBHZW5lcmljIHNwYXJjNjQgSU9NTVUgc3VwcG9ydC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEpha3ViIEplbGluZWsgKGpha3ViQHJlZGhhdC5jb20pCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAotI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2lmZGVmIENPTkZJR19QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAKICNpbmNsdWRlICJpb21tdV9jb21tb24uaCIKLSNpbmNsdWRlICJwY2lfaW1wbC5oIgogCi0jZGVmaW5lIFBDSV9TVENfQ1RYTUFUQ0hfQUREUihTVEMsIENUWCkJXAorI2RlZmluZSBTVENfQ1RYTUFUQ0hfQUREUihTVEMsIENUWCkJXAogCSgoU1RDKS0+c3RyYnVmX2N0eG1hdGNoX2Jhc2UgKyAoKENUWCkgPDwgMykpCisjZGVmaW5lIFNUQ19GTFVTSEZMQUdfSU5JVChTVEMpIFwKKwkoKigoU1RDKS0+c3RyYnVmX2ZsdXNoZmxhZykgPSAwVUwpCisjZGVmaW5lIFNUQ19GTFVTSEZMQUdfU0VUKFNUQykgXAorCSgqKChTVEMpLT5zdHJidWZfZmx1c2hmbGFnKSAhPSAwVUwpCiAKLS8qIEFjY2Vzc2luZyBJT01NVSBhbmQgU3RyZWFtaW5nIEJ1ZmZlciByZWdpc3RlcnMuCi0gKiBSRUcgcGFyYW1ldGVyIGlzIGEgcGh5c2ljYWwgYWRkcmVzcy4gIEFsbCByZWdpc3RlcnMKLSAqIGFyZSA2NC1iaXRzIGluIHNpemUuCi0gKi8KLSNkZWZpbmUgcGNpX2lvbW11X3JlYWQoX19yZWcpIFwKKyNkZWZpbmUgaW9tbXVfcmVhZChfX3JlZykgXAogKHsJdTY0IF9fcmV0OyBcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImxkeGEgWyUxXSAlMiwgJTAiIFwKIAkJCSAgICAgOiAiPXIiIChfX3JldCkgXApAQCAtMzAsNyArMzQsNyBAQAogCQkJICAgICA6ICJtZW1vcnkiKTsgXAogCV9fcmV0OyBcCiB9KQotI2RlZmluZSBwY2lfaW9tbXVfd3JpdGUoX19yZWcsIF9fdmFsKSBcCisjZGVmaW5lIGlvbW11X3dyaXRlKF9fcmVnLCBfX3ZhbCkgXAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHhhICUwLCBbJTFdICUyIiBcCiAJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLyBcCiAJCQkgICAgIDogInIiIChfX3ZhbCksICJyIiAoX19yZWcpLCBcCkBAIC00MCwxOSArNDQsMTkgQEAKIHN0YXRpYyB2b2lkIF9faW9tbXVfZmx1c2hhbGwoc3RydWN0IGlvbW11ICppb21tdSkKIHsKIAlpZiAoaW9tbXUtPmlvbW11X2ZsdXNoaW52KSB7Ci0JCXBjaV9pb21tdV93cml0ZShpb21tdS0+aW9tbXVfZmx1c2hpbnYsIH4odTY0KTApOworCQlpb21tdV93cml0ZShpb21tdS0+aW9tbXVfZmx1c2hpbnYsIH4odTY0KTApOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgdGFnOwogCQlpbnQgZW50cnk7CiAKLQkJdGFnID0gaW9tbXUtPmlvbW11X2ZsdXNoICsgKDB4YTU4MFVMIC0gMHgwMjEwVUwpOworCQl0YWcgPSBpb21tdS0+aW9tbXVfdGFnczsKIAkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgMTY7IGVudHJ5KyspIHsKLQkJCXBjaV9pb21tdV93cml0ZSh0YWcsIDApOworCQkJaW9tbXVfd3JpdGUodGFnLCAwKTsKIAkJCXRhZyArPSA4OwogCQl9CiAKIAkJLyogRW5zdXJlIGNvbXBsZXRpb24gb2YgcHJldmlvdXMgUElPIHdyaXRlcy4gKi8KLQkJKHZvaWQpIHBjaV9pb21tdV9yZWFkKGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcpOworCQkodm9pZCkgaW9tbXVfcmVhZChpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnKTsKIAl9CiB9CiAKQEAgLTgwLDcgKzg0LDcgQEAKIH0KIAogLyogQmFzZWQgbGFyZ2VseSB1cG9uIHRoZSBwcGM2NCBpb21tdSBhbGxvY2F0b3IuICAqLwotc3RhdGljIGxvbmcgcGNpX2FyZW5hX2FsbG9jKHN0cnVjdCBpb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIGxvbmcgYXJlbmFfYWxsb2Moc3RydWN0IGlvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCiB7CiAJc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CiAJdW5zaWduZWQgbG9uZyBuLCBpLCBzdGFydCwgZW5kLCBsaW1pdDsKQEAgLTEyMSw3ICsxMjUsNyBAQAogCXJldHVybiBuOwogfQogCi1zdGF0aWMgdm9pZCBwY2lfYXJlbmFfZnJlZShzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIHZvaWQgYXJlbmFfZnJlZShzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtMTI5LDcgKzEzMyw4IEBACiAJCV9fY2xlYXJfYml0KGksIGFyZW5hLT5tYXApOwogfQogCi12b2lkIHBjaV9pb21tdV90YWJsZV9pbml0KHN0cnVjdCBpb21tdSAqaW9tbXUsIGludCB0c2JzaXplLCB1MzIgZG1hX29mZnNldCwgdTMyIGRtYV9hZGRyX21hc2spCitpbnQgaW9tbXVfdGFibGVfaW5pdChzdHJ1Y3QgaW9tbXUgKmlvbW11LCBpbnQgdHNic2l6ZSwKKwkJICAgICB1MzIgZG1hX29mZnNldCwgdTMyIGRtYV9hZGRyX21hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBpLCB0c2JiYXNlLCBvcmRlciwgc3osIG51bV90c2JfZW50cmllczsKIApAQCAtMTQ2LDggKzE1MSw4IEBACiAJc3ogPSAoc3ogKyA3VUwpICYgfjdVTDsKIAlpb21tdS0+YXJlbmEubWFwID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpb21tdS0+YXJlbmEubWFwKSB7Ci0JCXByb21fcHJpbnRmKCJQQ0lfSU9NTVU6IEVycm9yLCBrbWFsbG9jKGFyZW5hLm1hcCkgZmFpbGVkLlxuIik7Ci0JCXByb21faGFsdCgpOworCQlwcmludGsoS0VSTl9FUlIgIklPTU1VOiBFcnJvciwga21hbGxvYyhhcmVuYS5tYXApIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaW9tbXUtPmFyZW5hLmxpbWl0ID0gbnVtX3RzYl9lbnRyaWVzOwogCkBAIC0xNTYsOCArMTYxLDggQEAKIAkgKi8KIAlpb21tdS0+ZHVtbXlfcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CiAJaWYgKCFpb21tdS0+ZHVtbXlfcGFnZSkgewotCQlwcm9tX3ByaW50ZigiUENJX0lPTU1VOiBFcnJvciwgZ2ZwKGR1bW15X3BhZ2UpIGZhaWxlZC5cbiIpOwotCQlwcm9tX2hhbHQoKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJT01NVTogRXJyb3IsIGdmcChkdW1teV9wYWdlKSBmYWlsZWQuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9tYXA7CiAJfQogCW1lbXNldCgodm9pZCAqKWlvbW11LT5kdW1teV9wYWdlLCAwLCBQQUdFX1NJWkUpOwogCWlvbW11LT5kdW1teV9wYWdlX3BhID0gKHVuc2lnbmVkIGxvbmcpIF9fcGEoaW9tbXUtPmR1bW15X3BhZ2UpOwpAQCAtMTY2LDIwICsxNzEsMzIgQEAKIAlvcmRlciA9IGdldF9vcmRlcih0c2JzaXplKTsKIAl0c2JiYXNlID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CiAJaWYgKCF0c2JiYXNlKSB7Ci0JCXByb21fcHJpbnRmKCJQQ0lfSU9NTVU6IEVycm9yLCBnZnAodHNiKSBmYWlsZWQuXG4iKTsKLQkJcHJvbV9oYWx0KCk7CisJCXByaW50ayhLRVJOX0VSUiAiSU9NTVU6IEVycm9yLCBnZnAodHNiKSBmYWlsZWQuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9kdW1teV9wYWdlOwogCX0KIAlpb21tdS0+cGFnZV90YWJsZSA9IChpb3B0ZV90ICopdHNiYmFzZTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fdHNiX2VudHJpZXM7IGkrKykKIAkJaW9wdGVfbWFrZV9kdW1teShpb21tdSwgJmlvbW11LT5wYWdlX3RhYmxlW2ldKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV9kdW1teV9wYWdlOgorCWZyZWVfcGFnZShpb21tdS0+ZHVtbXlfcGFnZSk7CisJaW9tbXUtPmR1bW15X3BhZ2UgPSAwVUw7CisKK291dF9mcmVlX21hcDoKKwlrZnJlZShpb21tdS0+YXJlbmEubWFwKTsKKwlpb21tdS0+YXJlbmEubWFwID0gTlVMTDsKKworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW5saW5lIGlvcHRlX3QgKmFsbG9jX25wYWdlcyhzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKIAlsb25nIGVudHJ5OwogCi0JZW50cnkgPSBwY2lfYXJlbmFfYWxsb2MoaW9tbXUsIG5wYWdlcyk7CisJZW50cnkgPSBhcmVuYV9hbGxvYyhpb21tdSwgbnBhZ2VzKTsKIAlpZiAodW5saWtlbHkoZW50cnkgPCAwKSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE4OCw3ICsyMDUsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9ucGFnZXMoc3RydWN0IGlvbW11ICppb21tdSwgZG1hX2FkZHJfdCBiYXNlLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKLQlwY2lfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBiYXNlID4+IElPX1BBR0VfU0hJRlQsIG5wYWdlcyk7CisJYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBiYXNlID4+IElPX1BBR0VfU0hJRlQsIG5wYWdlcyk7CiB9CiAKIHN0YXRpYyBpbnQgaW9tbXVfYWxsb2NfY3R4KHN0cnVjdCBpb21tdSAqaW9tbXUpCkBAIC0yMTksMTEgKzIzNiw4IEBACiAJfQogfQogCi0vKiBBbGxvY2F0ZSBhbmQgbWFwIGtlcm5lbCBidWZmZXIgb2Ygc2l6ZSBTSVpFIHVzaW5nIGNvbnNpc3RlbnQgbW9kZQotICogRE1BIGZvciBQQ0kgZGV2aWNlIFBERVYuICBSZXR1cm4gbm9uLU5VTEwgY3B1LXNpZGUgYWRkcmVzcyBpZgotICogc3VjY2Vzc2Z1bCBhbmQgc2V0ICpETUFfQUREUlAgdG8gdGhlIFBDSSBzaWRlIGRtYSBhZGRyZXNzLgotICovCi1zdGF0aWMgdm9pZCAqcGNpXzR1X2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfYWRkcnAsIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkICpkbWFfNHVfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICBkbWFfYWRkcl90ICpkbWFfYWRkcnAsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCWlvcHRlX3QgKmlvcHRlOwpAQCAtMjQxLDcgKzI1NSw3IEBACiAJCXJldHVybiBOVUxMOwogCW1lbXNldCgoY2hhciAqKWZpcnN0X3BhZ2UsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CiAKLQlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAlpb3B0ZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgc2l6ZSA+PiBJT19QQUdFX1NISUZUKTsKQEAgLTI2OCwxNSArMjgyLDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogRnJlZSBhbmQgdW5tYXAgYSBjb25zaXN0ZW50IERNQSB0cmFuc2xhdGlvbi4gKi8KLXN0YXRpYyB2b2lkIHBjaV80dV9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHUsIGRtYV9hZGRyX3QgZHZtYSkKK3N0YXRpYyB2b2lkIGRtYV80dV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJIHZvaWQgKmNwdSwgZG1hX2FkZHJfdCBkdm1hKQogewogCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJaW9wdGVfdCAqaW9wdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgb3JkZXIsIG5wYWdlczsKIAogCW5wYWdlcyA9IElPX1BBR0VfQUxJR04oc2l6ZSkgPj4gSU9fUEFHRV9TSElGVDsKLQlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJaW9wdGUgPSBpb21tdS0+cGFnZV90YWJsZSArCiAJCSgoZHZtYSAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlKSA+PiBJT19QQUdFX1NISUZUKTsKIApAQCAtMjkxLDEwICszMDUsOCBAQAogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNwdSwgb3JkZXIpOwogfQogCi0vKiBNYXAgYSBzaW5nbGUgYnVmZmVyIGF0IFBUUiBvZiBTWiBieXRlcyBmb3IgUENJIERNQQotICogaW4gc3RyZWFtaW5nIG1vZGUuCi0gKi8KLXN0YXRpYyBkbWFfYWRkcl90IHBjaV80dV9tYXBfc2luZ2xlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKK3N0YXRpYyBkbWFfYWRkcl90IGRtYV80dV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc3osCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKQEAgLTMwNCwxMCArMzE2LDEwIEBACiAJdTMyIGJ1c19hZGRyLCByZXQ7CiAJdW5zaWduZWQgbG9uZyBpb3B0ZV9wcm90ZWN0aW9uOwogCi0JaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0Jc3RyYnVmID0gcGRldi0+ZGV2LmFyY2hkYXRhLnN0YzsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CisJc3RyYnVmID0gZGV2LT5hcmNoZGF0YS5zdGM7CiAKLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSkpCisJaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBETUFfTk9ORSkpCiAJCWdvdG8gYmFkX25vX2N0eDsKIAogCW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpcHRyOwpAQCAtMzMyLDcgKzM0NCw3IEBACiAJCWlvcHRlX3Byb3RlY3Rpb24gPSBJT1BURV9TVFJFQU1JTkcoY3R4KTsKIAllbHNlCiAJCWlvcHRlX3Byb3RlY3Rpb24gPSBJT1BURV9DT05TSVNURU5UKGN0eCk7Ci0JaWYgKGRpcmVjdGlvbiAhPSBQQ0lfRE1BX1RPREVWSUNFKQorCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKIAkJaW9wdGVfcHJvdGVjdGlvbiB8PSBJT1BURV9XUklURTsKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKywgYmFzZSsrLCBiYXNlX3BhZGRyICs9IElPX1BBR0VfU0laRSkKQEAgLTM0NSwxMCArMzU3LDEyIEBACiBiYWRfbm9fY3R4OgogCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCVdBUk5fT04oMSk7Ci0JcmV0dXJuIFBDSV9ETUFfRVJST1JfQ09ERTsKKwlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9zdHJidWZfZmx1c2goc3RydWN0IHN0cmJ1ZiAqc3RyYnVmLCBzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1MzIgdmFkZHIsIHVuc2lnbmVkIGxvbmcgY3R4LCB1bnNpZ25lZCBsb25nIG5wYWdlcywgaW50IGRpcmVjdGlvbikKK3N0YXRpYyB2b2lkIHN0cmJ1Zl9mbHVzaChzdHJ1Y3Qgc3RyYnVmICpzdHJidWYsIHN0cnVjdCBpb21tdSAqaW9tbXUsCisJCQkgdTMyIHZhZGRyLCB1bnNpZ25lZCBsb25nIGN0eCwgdW5zaWduZWQgbG9uZyBucGFnZXMsCisJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCWludCBsaW1pdDsKIApAQCAtMzU4LDIyICszNzIsMjIgQEAKIAkJdTY0IHZhbDsKIAogCQlmbHVzaHJlZyA9IHN0cmJ1Zi0+c3RyYnVmX2N0eGZsdXNoOwotCQltYXRjaHJlZyA9IFBDSV9TVENfQ1RYTUFUQ0hfQUREUihzdHJidWYsIGN0eCk7CisJCW1hdGNocmVnID0gU1RDX0NUWE1BVENIX0FERFIoc3RyYnVmLCBjdHgpOwogCi0JCXBjaV9pb21tdV93cml0ZShmbHVzaHJlZywgY3R4KTsKLQkJdmFsID0gcGNpX2lvbW11X3JlYWQobWF0Y2hyZWcpOworCQlpb21tdV93cml0ZShmbHVzaHJlZywgY3R4KTsKKwkJdmFsID0gaW9tbXVfcmVhZChtYXRjaHJlZyk7CiAJCXZhbCAmPSAweGZmZmY7CiAJCWlmICghdmFsKQogCQkJZ290byBkb19mbHVzaF9zeW5jOwogCiAJCXdoaWxlICh2YWwpIHsKIAkJCWlmICh2YWwgJiAweDEpCi0JCQkJcGNpX2lvbW11X3dyaXRlKGZsdXNocmVnLCBjdHgpOworCQkJCWlvbW11X3dyaXRlKGZsdXNocmVnLCBjdHgpOwogCQkJdmFsID4+PSAxOwogCQl9Ci0JCXZhbCA9IHBjaV9pb21tdV9yZWFkKG1hdGNocmVnKTsKKwkJdmFsID0gaW9tbXVfcmVhZChtYXRjaHJlZyk7CiAJCWlmICh1bmxpa2VseSh2YWwpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfc3RyYnVmX2ZsdXNoOiBjdHggZmx1c2ggIgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3RyYnVmX2ZsdXNoOiBjdHggZmx1c2ggIgogCQkJICAgICAgICJ0aW1lb3V0IG1hdGNocmVnWyVseF0gY3R4WyVseF1cbiIsCiAJCQkgICAgICAgdmFsLCBjdHgpOwogCQkJZ290byBkb19wYWdlX2ZsdXNoOwpAQCAtMzgzLDcgKzM5Nyw3IEBACiAKIAlkb19wYWdlX2ZsdXNoOgogCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIHZhZGRyICs9IElPX1BBR0VfU0laRSkKLQkJCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9wZmx1c2gsIHZhZGRyKTsKKwkJCWlvbW11X3dyaXRlKHN0cmJ1Zi0+c3RyYnVmX3BmbHVzaCwgdmFkZHIpOwogCX0KIAogZG9fZmx1c2hfc3luYzoKQEAgLTM5MSwxNSArNDA1LDE1IEBACiAJICogdGhlIHN0cmVhbWluZyBjYWNoZSwgbm8gZmx1c2gtZmxhZyBzeW5jaHJvbml6YXRpb24gbmVlZHMKIAkgKiB0byBiZSBwZXJmb3JtZWQuCiAJICovCi0JaWYgKGRpcmVjdGlvbiA9PSBQQ0lfRE1BX1RPREVWSUNFKQorCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKIAkJcmV0dXJuOwogCi0JUENJX1NUQ19GTFVTSEZMQUdfSU5JVChzdHJidWYpOwotCXBjaV9pb21tdV93cml0ZShzdHJidWYtPnN0cmJ1Zl9mc3luYywgc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnX3BhKTsKLQkodm9pZCkgcGNpX2lvbW11X3JlYWQoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7CisJU1RDX0ZMVVNIRkxBR19JTklUKHN0cmJ1Zik7CisJaW9tbXVfd3JpdGUoc3RyYnVmLT5zdHJidWZfZnN5bmMsIHN0cmJ1Zi0+c3RyYnVmX2ZsdXNoZmxhZ19wYSk7CisJKHZvaWQpIGlvbW11X3JlYWQoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7CiAKIAlsaW1pdCA9IDEwMDAwMDsKLQl3aGlsZSAoIVBDSV9TVENfRkxVU0hGTEFHX1NFVChzdHJidWYpKSB7CisJd2hpbGUgKCFTVENfRkxVU0hGTEFHX1NFVChzdHJidWYpKSB7CiAJCWxpbWl0LS07CiAJCWlmICghbGltaXQpCiAJCQlicmVhazsKQEAgLTQwNywzNyArNDIxLDMyIEBACiAJCXJtYigpOwogCX0KIAlpZiAoIWxpbWl0KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfc3RyYnVmX2ZsdXNoOiBmbHVzaGZsYWcgdGltZW91dCAiCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0cmJ1Zl9mbHVzaDogZmx1c2hmbGFnIHRpbWVvdXQgIgogCQkgICAgICAgInZhZGRyWyUwOHhdIGN0eFslbHhdIG5wYWdlc1slbGRdXG4iLAogCQkgICAgICAgdmFkZHIsIGN0eCwgbnBhZ2VzKTsKIH0KIAotLyogVW5tYXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAqLwotc3RhdGljIHZvaWQgcGNpXzR1X3VubWFwX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZG1hX2FkZHJfdCBidXNfYWRkciwgc2l6ZV90IHN6LCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIHZvaWQgZG1hXzR1X3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCisJCQkJc2l6ZV90IHN6LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJaW9wdGVfdCAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIGN0eCwgaTsKIAotCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKSkgeworCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gRE1BX05PTkUpKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQlXQVJOX09OKDEpOwogCQlyZXR1cm47CiAJfQogCi0JaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0Jc3RyYnVmID0gcGRldi0+ZGV2LmFyY2hkYXRhLnN0YzsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CisJc3RyYnVmID0gZGV2LT5hcmNoZGF0YS5zdGM7CiAKIAlucGFnZXMgPSBJT19QQUdFX0FMSUdOKGJ1c19hZGRyICsgc3opIC0gKGJ1c19hZGRyICYgSU9fUEFHRV9NQVNLKTsKIAlucGFnZXMgPj49IElPX1BBR0VfU0hJRlQ7CiAJYmFzZSA9IGlvbW11LT5wYWdlX3RhYmxlICsKIAkJKChidXNfYWRkciAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlKSA+PiBJT19QQUdFX1NISUZUKTsKLSNpZmRlZiBERUJVR19QQ0lfSU9NTVUKLQlpZiAoSU9QVEVfSVNfRFVNTVkoaW9tbXUsIGJhc2UpKQotCQlwcmludGsoInBjaV91bm1hcF9zaW5nbGUgY2FsbGVkIG9uIG5vbi1tYXBwZWQgcmVnaW9uICUwOHgsJTA4eCBmcm9tICUwMTZseFxuIiwKLQkJICAgICAgIGJ1c19hZGRyLCBzeiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLSNlbmRpZgogCWJ1c19hZGRyICY9IElPX1BBR0VfTUFTSzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwpAQCAtNDQ5LDggKzQ1OCw4IEBACiAKIAkvKiBTdGVwIDE6IEtpY2sgZGF0YSBvdXQgb2Ygc3RyZWFtaW5nIGJ1ZmZlcnMgaWYgbmVjZXNzYXJ5LiAqLwogCWlmIChzdHJidWYtPnN0cmJ1Zl9lbmFibGVkKQotCQlwY2lfc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsCi0JCQkJIG5wYWdlcywgZGlyZWN0aW9uKTsKKwkJc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsCisJCQkgICAgIG5wYWdlcywgZGlyZWN0aW9uKTsKIAogCS8qIFN0ZXAgMjogQ2xlYXIgb3V0IFRTQiBlbnRyaWVzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykKQEAgLTQ2Nyw3ICs0NzYsOCBAQAogCShfX3BhKHBhZ2VfYWRkcmVzcygoU0cpLT5wYWdlKSkgKyAoU0cpLT5vZmZzZXQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX3NnKGlvcHRlX3QgKmlvcHRlLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJICAgaW50IG51c2VkLCBpbnQgbmVsZW1zLCB1bnNpZ25lZCBsb25nIGlvcHRlX3Byb3RlY3Rpb24pCisJCQkgICBpbnQgbnVzZWQsIGludCBuZWxlbXMsCisJCQkgICB1bnNpZ25lZCBsb25nIGlvcHRlX3Byb3RlY3Rpb24pCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpkbWFfc2cgPSBzZzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2VuZCA9IHNnICsgbmVsZW1zOwpAQCAtNTM5LDEyICs1NDksOCBAQAogCX0KIH0KIAotLyogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IFNHTElTVCB3aXRoIE5FTEVNUyBhcnJheQotICogZWxlbWVudHMgaW4gc3RyZWFtaW5nIG1vZGUgZm9yIFBDSSBETUEuCi0gKiBXaGVuIG1ha2luZyBjaGFuZ2VzIGhlcmUsIGluc3BlY3QgdGhlIGFzc2VtYmx5IG91dHB1dC4gSSB3YXMgaGF2aW5nCi0gKiBoYXJkIHRpbWUgdG8ga2VlcCB0aGlzIHJvdXRpbmUgb3V0IG9mIHVzaW5nIHN0YWNrIHNsb3RzIGZvciBob2xkaW5nIHZhcmlhYmxlcy4KLSAqLwotc3RhdGljIGludCBwY2lfNHVfbWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKK3N0YXRpYyBpbnQgZG1hXzR1X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKQEAgLTU1NywxOSArNTYzLDIwIEBACiAJLyogRmFzdCBwYXRoIHNpbmdsZSBlbnRyeSBzY2F0dGVybGlzdHMuICovCiAJaWYgKG5lbGVtcyA9PSAxKSB7CiAJCXNnbGlzdC0+ZG1hX2FkZHJlc3MgPQotCQkJcGNpXzR1X21hcF9zaW5nbGUocGRldiwKLQkJCQkJICAocGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCksCisJCQlkbWFfNHVfbWFwX3NpbmdsZShkZXYsCisJCQkJCSAgKHBhZ2VfYWRkcmVzcyhzZ2xpc3QtPnBhZ2UpICsKKwkJCQkJICAgc2dsaXN0LT5vZmZzZXQpLAogCQkJCQkgIHNnbGlzdC0+bGVuZ3RoLCBkaXJlY3Rpb24pOwotCQlpZiAodW5saWtlbHkoc2dsaXN0LT5kbWFfYWRkcmVzcyA9PSBQQ0lfRE1BX0VSUk9SX0NPREUpKQorCQlpZiAodW5saWtlbHkoc2dsaXN0LT5kbWFfYWRkcmVzcyA9PSBETUFfRVJST1JfQ09ERSkpCiAJCQlyZXR1cm4gMDsKIAkJc2dsaXN0LT5kbWFfbGVuZ3RoID0gc2dsaXN0LT5sZW5ndGg7CiAJCXJldHVybiAxOwogCX0KIAotCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OwotCXN0cmJ1ZiA9IHBkZXYtPmRldi5hcmNoZGF0YS5zdGM7Ci0JCi0JaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpKQorCWlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKKwlzdHJidWYgPSBkZXYtPmFyY2hkYXRhLnN0YzsKKworCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gRE1BX05PTkUpKQogCQlnb3RvIGJhZF9ub19jdHg7CiAKIAkvKiBTdGVwIDE6IFByZXBhcmUgc2NhdHRlciBsaXN0LiAqLwpAQCAtNjA5LDcgKzYxNiw3IEBACiAJCWlvcHRlX3Byb3RlY3Rpb24gPSBJT1BURV9TVFJFQU1JTkcoY3R4KTsKIAllbHNlCiAJCWlvcHRlX3Byb3RlY3Rpb24gPSBJT1BURV9DT05TSVNURU5UKGN0eCk7Ci0JaWYgKGRpcmVjdGlvbiAhPSBQQ0lfRE1BX1RPREVWSUNFKQorCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKIAkJaW9wdGVfcHJvdGVjdGlvbiB8PSBJT1BURV9XUklURTsKIAogCWZpbGxfc2coYmFzZSwgc2dsaXN0LCB1c2VkLCBuZWxlbXMsIGlvcHRlX3Byb3RlY3Rpb24pOwpAQCAtNjI4LDggKzYzNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuICovCi1zdGF0aWMgdm9pZCBwY2lfNHVfdW5tYXBfc2coc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIHZvaWQgZG1hXzR1X3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCQkgICAgaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJc3RydWN0IHN0cmJ1ZiAqc3RyYnVmOwpAQCAtNjM3LDE0ICs2NDQsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBjdHgsIGksIG5wYWdlczsKIAl1MzIgYnVzX2FkZHI7CiAKLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSkpIHsKKwlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IERNQV9OT05FKSkgewogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJV0FSTl9PTigxKTsKIAl9CiAKLQlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKLQlzdHJidWYgPSBwZGV2LT5kZXYuYXJjaGRhdGEuc3RjOwotCQorCWlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKKwlzdHJidWYgPSBkZXYtPmFyY2hkYXRhLnN0YzsKKwogCWJ1c19hZGRyID0gc2dsaXN0LT5kbWFfYWRkcmVzcyAmIElPX1BBR0VfTUFTSzsKIAogCWZvciAoaSA9IDE7IGkgPCBuZWxlbXM7IGkrKykKQEAgLTY1NywxMSArNjY0LDYgQEAKIAliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKwogCQkoKGJ1c19hZGRyIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UpID4+IElPX1BBR0VfU0hJRlQpOwogCi0jaWZkZWYgREVCVUdfUENJX0lPTU1VCi0JaWYgKElPUFRFX0lTX0RVTU1ZKGlvbW11LCBiYXNlKSkKLQkJcHJpbnRrKCJwY2lfdW5tYXBfc2cgY2FsbGVkIG9uIG5vbi1tYXBwZWQgcmVnaW9uICUwMTZseCwlZCBmcm9tICUwMTZseFxuIiwgc2dsaXN0LT5kbWFfYWRkcmVzcywgbmVsZW1zLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotI2VuZGlmCi0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAogCS8qIFJlY29yZCB0aGUgY29udGV4dCwgaWYgYW55LiAqLwpAQCAtNjcxLDcgKzY3Myw3IEBACiAKIAkvKiBTdGVwIDE6IEtpY2sgZGF0YSBvdXQgb2Ygc3RyZWFtaW5nIGJ1ZmZlcnMgaWYgbmVjZXNzYXJ5LiAqLwogCWlmIChzdHJidWYtPnN0cmJ1Zl9lbmFibGVkKQotCQlwY2lfc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsIG5wYWdlcywgZGlyZWN0aW9uKTsKKwkJc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsIG5wYWdlcywgZGlyZWN0aW9uKTsKIAogCS8qIFN0ZXAgMjogQ2xlYXIgb3V0IHRoZSBUU0IgZW50cmllcy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspCkBAIC02ODQsMTcgKzY4NiwxNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKLS8qIE1ha2UgcGh5c2ljYWwgbWVtb3J5IGNvbnNpc3RlbnQgZm9yIGEgc2luZ2xlCi0gKiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24gYWZ0ZXIgYSB0cmFuc2Zlci4KLSAqLwotc3RhdGljIHZvaWQgcGNpXzR1X2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLCBzaXplX3Qgc3osIGludCBkaXJlY3Rpb24pCitzdGF0aWMgdm9pZCBkbWFfNHVfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwKKwkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJc3RydWN0IHN0cmJ1ZiAqc3RyYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGN0eCwgbnBhZ2VzOwogCi0JaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0Jc3RyYnVmID0gcGRldi0+ZGV2LmFyY2hkYXRhLnN0YzsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CisJc3RyYnVmID0gZGV2LT5hcmNoZGF0YS5zdGM7CiAKIAlpZiAoIXN0cmJ1Zi0+c3RyYnVmX2VuYWJsZWQpCiAJCXJldHVybjsKQEAgLTcxNywyMyArNzE4LDIyIEBACiAJfQogCiAJLyogU3RlcCAyOiBLaWNrIGRhdGEgb3V0IG9mIHN0cmVhbWluZyBidWZmZXJzLiAqLwotCXBjaV9zdHJidWZfZmx1c2goc3RyYnVmLCBpb21tdSwgYnVzX2FkZHIsIGN0eCwgbnBhZ2VzLCBkaXJlY3Rpb24pOworCXN0cmJ1Zl9mbHVzaChzdHJidWYsIGlvbW11LCBidXNfYWRkciwgY3R4LCBucGFnZXMsIGRpcmVjdGlvbik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogfQogCi0vKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNldCBvZiBzdHJlYW1pbmcKLSAqIG1vZGUgRE1BIHRyYW5zbGF0aW9ucyBhZnRlciBhIHRyYW5zZmVyLgotICovCi1zdGF0aWMgdm9pZCBwY2lfNHVfZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCitzdGF0aWMgdm9pZCBkbWFfNHVfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywKKwkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgY3R4LCBucGFnZXMsIGk7CiAJdTMyIGJ1c19hZGRyOwogCi0JaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0Jc3RyYnVmID0gcGRldi0+ZGV2LmFyY2hkYXRhLnN0YzsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CisJc3RyYnVmID0gZGV2LT5hcmNoZGF0YS5zdGM7CiAKIAlpZiAoIXN0cmJ1Zi0+c3RyYnVmX2VuYWJsZWQpCiAJCXJldHVybjsKQEAgLTc1OSw2NSArNzU5LDUxIEBACiAJaS0tOwogCW5wYWdlcyA9IChJT19QQUdFX0FMSUdOKHNnbGlzdFtpXS5kbWFfYWRkcmVzcyArIHNnbGlzdFtpXS5kbWFfbGVuZ3RoKQogCQkgIC0gYnVzX2FkZHIpID4+IElPX1BBR0VfU0hJRlQ7Ci0JcGNpX3N0cmJ1Zl9mbHVzaChzdHJidWYsIGlvbW11LCBidXNfYWRkciwgY3R4LCBucGFnZXMsIGRpcmVjdGlvbik7CisJc3RyYnVmX2ZsdXNoKHN0cmJ1ZiwgaW9tbXUsIGJ1c19hZGRyLCBjdHgsIG5wYWdlcywgZGlyZWN0aW9uKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKLWNvbnN0IHN0cnVjdCBwY2lfaW9tbXVfb3BzIHBjaV9zdW40dV9pb21tdV9vcHMgPSB7Ci0JLmFsbG9jX2NvbnNpc3RlbnQJCT0gcGNpXzR1X2FsbG9jX2NvbnNpc3RlbnQsCi0JLmZyZWVfY29uc2lzdGVudAkJPSBwY2lfNHVfZnJlZV9jb25zaXN0ZW50LAotCS5tYXBfc2luZ2xlCQkJPSBwY2lfNHVfbWFwX3NpbmdsZSwKLQkudW5tYXBfc2luZ2xlCQkJPSBwY2lfNHVfdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cJCQkJPSBwY2lfNHVfbWFwX3NnLAotCS51bm1hcF9zZwkJCT0gcGNpXzR1X3VubWFwX3NnLAotCS5kbWFfc3luY19zaW5nbGVfZm9yX2NwdQk9IHBjaV80dV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSwKLQkuZG1hX3N5bmNfc2dfZm9yX2NwdQkJPSBwY2lfNHVfZG1hX3N5bmNfc2dfZm9yX2NwdSwKK2NvbnN0IHN0cnVjdCBkbWFfb3BzIHN1bjR1X2RtYV9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50CQk9IGRtYV80dV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAkJPSBkbWFfNHVfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZQkJPSBkbWFfNHVfbWFwX3NpbmdsZSwKKwkudW5tYXBfc2luZ2xlCQk9IGRtYV80dV91bm1hcF9zaW5nbGUsCisJLm1hcF9zZwkJCT0gZG1hXzR1X21hcF9zZywKKwkudW5tYXBfc2cJCT0gZG1hXzR1X3VubWFwX3NnLAorCS5zeW5jX3NpbmdsZV9mb3JfY3B1CT0gZG1hXzR1X3N5bmNfc2luZ2xlX2Zvcl9jcHUsCisJLnN5bmNfc2dfZm9yX2NwdQk9IGRtYV80dV9zeW5jX3NnX2Zvcl9jcHUsCiB9OwogCi1zdGF0aWMgdm9pZCBhbGlfc291bmRfZG1hX2hhY2soc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBzZXRfYml0KQorY29uc3Qgc3RydWN0IGRtYV9vcHMgKmRtYV9vcHMgPSAmc3VuNHVfZG1hX29wczsKK0VYUE9SVF9TWU1CT0woZG1hX29wcyk7CisKK2ludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRldmljZV9tYXNrKQogewotCXN0cnVjdCBwY2lfZGV2ICphbGlfaXNhX2JyaWRnZTsKLQl1OCB2YWw7Ci0KLQkvKiBBTEkgc291bmQgY2hpcHMgZ2VuZXJhdGUgMzEtYml0cyBvZiBETUEsIGEgc3BlY2lhbCByZWdpc3RlcgotCSAqIGRldGVybWluZXMgd2hhdCBiaXQgMzEgaXMgZW1pdHRlZCBhcy4KLQkgKi8KLQlhbGlfaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsCi0JCQkJCSBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAotCQkJCQkgTlVMTCk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGlfaXNhX2JyaWRnZSwgMHg3ZSwgJnZhbCk7Ci0JaWYgKHNldF9iaXQpCi0JCXZhbCB8PSAweDAxOwotCWVsc2UKLQkJdmFsICY9IH4weDAxOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGlfaXNhX2JyaWRnZSwgMHg3ZSwgdmFsKTsKLQlwY2lfZGV2X3B1dChhbGlfaXNhX2JyaWRnZSk7Ci19Ci0KLWludCBwY2lfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IGRldmljZV9tYXNrKQotewotCXU2NCBkbWFfYWRkcl9tYXNrOwotCi0JaWYgKHBkZXYgPT0gTlVMTCkgewotCQlkbWFfYWRkcl9tYXNrID0gMHhmZmZmZmZmZjsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OwotCi0JCWRtYV9hZGRyX21hc2sgPSBpb21tdS0+ZG1hX2FkZHJfbWFzazsKLQotCQlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwgJiYKLQkJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMX001NDUxICYmCi0JCSAgICBkZXZpY2VfbWFzayA9PSAweDdmZmZmZmZmKSB7Ci0JCQlhbGlfc291bmRfZG1hX2hhY2socGRldiwKLQkJCQkJICAgKGRtYV9hZGRyX21hc2sgJiAweDgwMDAwMDAwKSAhPSAwKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQorCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBkZXYtPmFyY2hkYXRhLmlvbW11OworCXU2NCBkbWFfYWRkcl9tYXNrID0gaW9tbXUtPmRtYV9hZGRyX21hc2s7CiAKIAlpZiAoZGV2aWNlX21hc2sgPj0gKDFVTCA8PCAzMlVMKSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gKGRldmljZV9tYXNrICYgZG1hX2FkZHJfbWFzaykgPT0gZG1hX2FkZHJfbWFzazsKKwlpZiAoKGRldmljZV9tYXNrICYgZG1hX2FkZHJfbWFzaykgPT0gZG1hX2FkZHJfbWFzaykKKwkJcmV0dXJuIDE7CisKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCisJCXJldHVybiBwY2lfZG1hX3N1cHBvcnRlZCh0b19wY2lfZGV2KGRldiksIGRldmljZV9tYXNrKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRtYV9zdXBwb3J0ZWQpOworCitpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKKwkJcmV0dXJuIHBjaV9zZXRfZG1hX21hc2sodG9fcGNpX2RldihkZXYpLCBkbWFfbWFzayk7CisjZW5kaWYKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3NldF9tYXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lzYS5jCmluZGV4IDFhMTA0M2YuLjBmMTlkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pc2EuYwpAQCAtOTAsNiArOTAsOCBAQAogCQlzZCA9ICZpc2FfZGV2LT5vZmRldi5kZXYuYXJjaGRhdGE7CiAJCXNkLT5wcm9tX25vZGUgPSBkcDsKIAkJc2QtPm9wID0gJmlzYV9kZXYtPm9mZGV2OworCQlzZC0+aW9tbXUgPSBpc2FfYnItPm9mZGV2LmRldi5wYXJlbnQtPmFyY2hkYXRhLmlvbW11OworCQlzZC0+c3RjID0gaXNhX2JyLT5vZmRldi5kZXYucGFyZW50LT5hcmNoZGF0YS5zdGM7CiAKIAkJaXNhX2Rldi0+b2ZkZXYubm9kZSA9IGRwOwogCQlpc2FfZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJmlzYV9ici0+b2ZkZXYuZGV2OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKaW5kZXggNTVhZDFiOC4uM2Q5M2U5MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwpAQCAtMjgzLDEyICsyODMsNiBAQAogCXJldHVybiBwY2lfY29udHJvbGxlcl9zY2FuKHBjaV9pc19jb250cm9sbGVyKTsKIH0KIAotY29uc3Qgc3RydWN0IHBjaV9pb21tdV9vcHMgKnBjaV9pb21tdV9vcHM7Ci1FWFBPUlRfU1lNQk9MKHBjaV9pb21tdV9vcHMpOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBjaV9pb21tdV9vcHMgcGNpX3N1bjR1X2lvbW11X29wcywKLQlwY2lfc3VuNHZfaW9tbXVfb3BzOwotCiAvKiBGaW5kIGVhY2ggY29udHJvbGxlciBpbiB0aGUgc3lzdGVtLCBhdHRhY2ggYW5kIGluaXRpYWxpemUKICAqIHNvZnR3YXJlIHN0YXRlIHN0cnVjdHVyZSBmb3IgZWFjaCBhbmQgbGluayBpbnRvIHRoZQogICogcGNpX3BibV9yb290LiAgU2V0dXAgdGhlIGNvbnRyb2xsZXIgZW5vdWdoIHN1Y2gKQEAgLTI5NiwxMSArMjkwLDYgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHBjaV9jb250cm9sbGVyX3Byb2JlKHZvaWQpCiB7Ci0JaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpCi0JCXBjaV9pb21tdV9vcHMgPSAmcGNpX3N1bjR2X2lvbW11X29wczsKLQllbHNlCi0JCXBjaV9pb21tdV9vcHMgPSAmcGNpX3N1bjR1X2lvbW11X29wczsKLQogCXByaW50aygiUENJOiBQcm9iaW5nIGZvciBjb250cm9sbGVycy5cbiIpOwogCiAJcGNpX2NvbnRyb2xsZXJfc2NhbihwY2lfY29udHJvbGxlcl9pbml0KTsKQEAgLTQwNiw2ICszOTUsMTAgQEAKIAlzZC0+b3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5vZGUpOwogCXNkLT5tc2lfbnVtID0gMHhmZmZmZmZmZjsKIAorCXNkID0gJnNkLT5vcC0+ZGV2LmFyY2hkYXRhOworCXNkLT5pb21tdSA9IHBibS0+aW9tbXU7CisJc2QtPnN0YyA9ICZwYm0tPnN0YzsKKwogCXR5cGUgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImRldmljZV90eXBlIiwgTlVMTCk7CiAJaWYgKHR5cGUgPT0gTlVMTCkKIAkJdHlwZSA9ICIiOwpAQCAtNDIyLDEwICs0MTUsMTUgQEAKIAlkZXYtPm11bHRpZnVuY3Rpb24gPSAwOwkJLyogbWF5YmUgYSBsaWU/ICovCiAKIAlpZiAoaG9zdF9jb250cm9sbGVyKSB7Ci0JCWRldi0+dmVuZG9yID0gMHgxMDhlOwotCQlkZXYtPmRldmljZSA9IDB4ODAwMDsKLQkJZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID0gMHgwMDAwOwotCQlkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPSAweDAwMDA7CisJCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsCisJCQkJCSAgICAgJmRldi0+dmVuZG9yKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0RFVklDRV9JRCwKKwkJCQkJICAgICAmZGV2LT5kZXZpY2UpOworCQl9IGVsc2UgeworCQkJZGV2LT52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NVTjsKKwkJCWRldi0+ZGV2aWNlID0gMHg4MGYwOworCQl9CiAJCWRldi0+Y2ZnX3NpemUgPSAyNTY7CiAJCWRldi0+Y2xhc3MgPSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKIAkJc3ByaW50ZihwY2lfbmFtZShkZXYpLCAiJTA0eDolMDJ4OiUwMnguJWQiLCBwY2lfZG9tYWluX25yKGJ1cyksCkBAIC04MTgsNyArODE2LDcgQEAKIHsKIAlzdGF0aWMgdTggZmFrZV9wY2lfY29uZmlnW10gPSB7CiAJCTB4OGUsIDB4MTAsIC8qIFZlbmRvcjogMHgxMDhlIChTdW4pICovCi0JCTB4MDAsIDB4ODAsIC8qIERldmljZTogMHg4MDAwIChQQk0pICovCisJCTB4ZjAsIDB4ODAsIC8qIERldmljZTogMHg4MGYwIChGaXJlKSAqLwogCQkweDQ2LCAweDAxLCAvKiBDb21tYW5kOiAweDAxNDYgKFNFUlIsIFBBUklUWSwgTUFTVEVSLCBNRU0pICovCiAJCTB4YTAsIDB4MjIsIC8qIFN0YXR1czogMHgwMmEwIChERVZTRUxfTUVELCBGQjJCLCA2Nk1IWikgKi8KIAkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgLyogQ2xhc3M6IDB4MDYwMDAwMDAgaG9zdCBicmlkZ2UgKi8KQEAgLTEyMjEsNCArMTIxOSw1MSBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfZGV2aWNlX3RvX09GX25vZGUpOwogCitzdGF0aWMgdm9pZCBhbGlfc291bmRfZG1hX2hhY2soc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBzZXRfYml0KQoreworCXN0cnVjdCBwY2lfZGV2ICphbGlfaXNhX2JyaWRnZTsKKwl1OCB2YWw7CisKKwkvKiBBTEkgc291bmQgY2hpcHMgZ2VuZXJhdGUgMzEtYml0cyBvZiBETUEsIGEgc3BlY2lhbCByZWdpc3RlcgorCSAqIGRldGVybWluZXMgd2hhdCBiaXQgMzEgaXMgZW1pdHRlZCBhcy4KKwkgKi8KKwlhbGlfaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsCisJCQkJCSBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAorCQkJCQkgTlVMTCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGlfaXNhX2JyaWRnZSwgMHg3ZSwgJnZhbCk7CisJaWYgKHNldF9iaXQpCisJCXZhbCB8PSAweDAxOworCWVsc2UKKwkJdmFsICY9IH4weDAxOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGlfaXNhX2JyaWRnZSwgMHg3ZSwgdmFsKTsKKwlwY2lfZGV2X3B1dChhbGlfaXNhX2JyaWRnZSk7Cit9CisKK2ludCBwY2lfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IGRldmljZV9tYXNrKQoreworCXU2NCBkbWFfYWRkcl9tYXNrOworCisJaWYgKHBkZXYgPT0gTlVMTCkgeworCQlkbWFfYWRkcl9tYXNrID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCisJCWRtYV9hZGRyX21hc2sgPSBpb21tdS0+ZG1hX2FkZHJfbWFzazsKKworCQlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwgJiYKKwkJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMX001NDUxICYmCisJCSAgICBkZXZpY2VfbWFzayA9PSAweDdmZmZmZmZmKSB7CisJCQlhbGlfc291bmRfZG1hX2hhY2socGRldiwKKwkJCQkJICAgKGRtYV9hZGRyX21hc2sgJiAweDgwMDAwMDAwKSAhPSAwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGRldmljZV9tYXNrID49ICgxVUwgPDwgMzJVTCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIChkZXZpY2VfbWFzayAmIGRtYV9hZGRyX21hc2spID09IGRtYV9hZGRyX21hc2s7Cit9CisKICNlbmRpZiAvKiAhKENPTkZJR19QQ0kpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCmluZGV4IDQyNDkyMTQuLjJmNjFjNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCkBAIC00NCw2ICs0NCw2NyBAQAogCXJldHVybiAodm9pZCAqKQkocGJtLT5jb25maWdfc3BhY2UgfCBidXMgfCBkZXZmbiB8IHJlZyk7CiB9CiAKKy8qIEF0IGxlYXN0IG9uIFNhYnJlLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWNjZXNzIGFsbCBQQ0kgaG9zdCBjb250cm9sbGVyCisgKiByZWdpc3RlcnMgYXQgdGhlaXIgbmF0dXJhbCBzaXplLCBvdGhlcndpc2UgemVyb3MgYXJlIHJldHVybmVkLgorICogU3RyYW5nZSBidXQgdHJ1ZSwgYW5kIEkgc2VlIG5vIGxhbmd1YWdlIGluIHRoZSBVbHRyYVNQQVJDLUlJaQorICogcHJvZ3JhbW1lcidzIG1hbnVhbCB0aGF0IG1lbnRpb25zIHRoaXMgZXZlbiBpbmRpcmVjdGx5LgorICovCitzdGF0aWMgaW50IHN1bjR1X3JlYWRfcGNpX2NmZ19ob3N0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkgICB1bnNpZ25lZCBjaGFyIGJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJdTMyIHRtcDMyLCAqYWRkcjsKKwl1MTYgdG1wMTY7CisJdTggdG1wODsKKworCWFkZHIgPSBzdW40dV9jb25maWdfbWthZGRyKHBibSwgYnVzLCBkZXZmbiwgd2hlcmUpOworCWlmICghYWRkcikKKwkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJaWYgKHdoZXJlIDwgOCkgeworCQkJdW5zaWduZWQgbG9uZyBhbGlnbiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOworCisJCQlhbGlnbiAmPSB+MTsKKwkJCXBjaV9jb25maWdfcmVhZDE2KCh1MTYgKilhbGlnbiwgJnRtcDE2KTsKKwkJCWlmICh3aGVyZSAmIDEpCisJCQkJKnZhbHVlID0gdG1wMTYgPj4gODsKKwkJCWVsc2UKKwkJCQkqdmFsdWUgPSB0bXAxNiAmIDB4ZmY7CisJCX0gZWxzZSB7CisJCQlwY2lfY29uZmlnX3JlYWQ4KCh1OCAqKWFkZHIsICZ0bXA4KTsKKwkJCSp2YWx1ZSA9ICh1MzIpIHRtcDg7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmICh3aGVyZSA8IDgpIHsKKwkJCXBjaV9jb25maWdfcmVhZDE2KCh1MTYgKilhZGRyLCAmdG1wMTYpOworCQkJKnZhbHVlID0gKHUzMikgdG1wMTY7CisJCX0gZWxzZSB7CisJCQlwY2lfY29uZmlnX3JlYWQ4KCh1OCAqKWFkZHIsICZ0bXA4KTsKKwkJCSp2YWx1ZSA9ICh1MzIpIHRtcDg7CisJCQlwY2lfY29uZmlnX3JlYWQ4KCgodTggKilhZGRyKSArIDEsICZ0bXA4KTsKKwkJCSp2YWx1ZSB8PSAoKHUzMikgdG1wOCkgPDwgODsKKwkJfQorCQlicmVhazsKKworCWNhc2UgNDoKKwkJdG1wMzIgPSAweGZmZmZmZmZmOworCQlzdW40dV9yZWFkX3BjaV9jZmdfaG9zdChwYm0sIGJ1cywgZGV2Zm4sCisJCQkJCXdoZXJlLCAyLCAmdG1wMzIpOworCQkqdmFsdWUgPSB0bXAzMjsKKworCQl0bXAzMiA9IDB4ZmZmZmZmZmY7CisJCXN1bjR1X3JlYWRfcGNpX2NmZ19ob3N0KHBibSwgYnVzLCBkZXZmbiwKKwkJCQkJd2hlcmUgKyAyLCAyLCAmdG1wMzIpOworCQkqdmFsdWUgfD0gdG1wMzIgPDwgMTY7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCiBzdGF0aWMgaW50IHN1bjR1X3JlYWRfcGNpX2NmZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzX2RldiwgdW5zaWduZWQgaW50IGRldmZuLAogCQkJICAgICAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKIHsKQEAgLTUzLDEwICsxMTQsNiBAQAogCXUxNiB0bXAxNjsKIAl1OCB0bXA4OwogCi0JaWYgKGJ1c19kZXYgPT0gcGJtLT5wY2lfYnVzICYmIGRldmZuID09IDB4MDApCi0JCXJldHVybiBwY2lfaG9zdF9icmlkZ2VfcmVhZF9wY2lfY2ZnKGJ1c19kZXYsIGRldmZuLCB3aGVyZSwKLQkJCQkJCSAgICBzaXplLCB2YWx1ZSk7Ci0KIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6CiAJCSp2YWx1ZSA9IDB4ZmY7CkBAIC02OSw2ICsxMjYsMTAgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKCFidXNfZGV2LT5udW1iZXIgJiYgIVBDSV9TTE9UKGRldmZuKSkKKwkJcmV0dXJuIHN1bjR1X3JlYWRfcGNpX2NmZ19ob3N0KHBibSwgYnVzLCBkZXZmbiwgd2hlcmUsCisJCQkJCSAgICAgICBzaXplLCB2YWx1ZSk7CisKIAlhZGRyID0gc3VuNHVfY29uZmlnX21rYWRkcihwYm0sIGJ1cywgZGV2Zm4sIHdoZXJlKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CkBAIC0xMDEsNiArMTYyLDUzIEBACiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAorc3RhdGljIGludCBzdW40dV93cml0ZV9wY2lfY2ZnX2hvc3Qoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyIGJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsdWUpCit7CisJdTMyICphZGRyOworCisJYWRkciA9IHN1bjR1X2NvbmZpZ19ta2FkZHIocGJtLCBidXMsIGRldmZuLCB3aGVyZSk7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQlpZiAod2hlcmUgPCA4KSB7CisJCQl1bnNpZ25lZCBsb25nIGFsaWduID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisJCQl1MTYgdG1wMTY7CisKKwkJCWFsaWduICY9IH4xOworCQkJcGNpX2NvbmZpZ19yZWFkMTYoKHUxNiAqKWFsaWduLCAmdG1wMTYpOworCQkJaWYgKHdoZXJlICYgMSkgeworCQkJCXRtcDE2ICY9IDB4MDBmZjsKKwkJCQl0bXAxNiB8PSB2YWx1ZSA8PCA4OworCQkJfSBlbHNlIHsKKwkJCQl0bXAxNiAmPSAweGZmMDA7CisJCQkJdG1wMTYgfD0gdmFsdWU7CisJCQl9CisJCQlwY2lfY29uZmlnX3dyaXRlMTYoKHUxNiAqKWFsaWduLCB0bXAxNik7CisJCX0gZWxzZQorCQkJcGNpX2NvbmZpZ193cml0ZTgoKHU4ICopYWRkciwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmICh3aGVyZSA8IDgpIHsKKwkJCXBjaV9jb25maWdfd3JpdGUxNigodTE2ICopYWRkciwgdmFsdWUpOworCQl9IGVsc2UgeworCQkJcGNpX2NvbmZpZ193cml0ZTgoKHU4ICopYWRkciwgdmFsdWUgJiAweGZmKTsKKwkJCXBjaV9jb25maWdfd3JpdGU4KCgodTggKilhZGRyKSArIDEsIHZhbHVlID4+IDgpOworCQl9CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3VuNHVfd3JpdGVfcGNpX2NmZ19ob3N0KHBibSwgYnVzLCBkZXZmbiwKKwkJCQkJIHdoZXJlLCAyLCB2YWx1ZSAmIDB4ZmZmZik7CisJCXN1bjR1X3dyaXRlX3BjaV9jZmdfaG9zdChwYm0sIGJ1cywgZGV2Zm4sCisJCQkJCSB3aGVyZSArIDIsIDIsIHZhbHVlID4+IDE2KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKIHN0YXRpYyBpbnQgc3VuNHVfd3JpdGVfcGNpX2NmZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzX2RldiwgdW5zaWduZWQgaW50IGRldmZuLAogCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWx1ZSkKIHsKQEAgLTEwOCw5ICsyMTYsMTAgQEAKIAl1bnNpZ25lZCBjaGFyIGJ1cyA9IGJ1c19kZXYtPm51bWJlcjsKIAl1MzIgKmFkZHI7CiAKLQlpZiAoYnVzX2RldiA9PSBwYm0tPnBjaV9idXMgJiYgZGV2Zm4gPT0gMHgwMCkKLQkJcmV0dXJuIHBjaV9ob3N0X2JyaWRnZV93cml0ZV9wY2lfY2ZnKGJ1c19kZXYsIGRldmZuLCB3aGVyZSwKLQkJCQkJCSAgICAgc2l6ZSwgdmFsdWUpOworCWlmICghYnVzX2Rldi0+bnVtYmVyICYmICFQQ0lfU0xPVChkZXZmbikpCisJCXJldHVybiBzdW40dV93cml0ZV9wY2lfY2ZnX2hvc3QocGJtLCBidXMsIGRldmZuLCB3aGVyZSwKKwkJCQkJCXNpemUsIHZhbHVlKTsKKwogCWFkZHIgPSBzdW40dV9jb25maWdfbWthZGRyKHBibSwgYnVzLCBkZXZmbiwgd2hlcmUpOwogCWlmICghYWRkcikKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ZpcmUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ZpcmUuYwppbmRleCA3ZjVkNDczLi4xNGQ2N2ZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9maXJlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfZmlyZS5jCkBAIC0zOSwxMiArMzksMTIgQEAKICNkZWZpbmUgRklSRV9JT01NVV9GTFVTSAkweDQwMTAwVUwKICNkZWZpbmUgRklSRV9JT01NVV9GTFVTSElOVgkweDQwMTA4VUwKIAotc3RhdGljIHZvaWQgcGNpX2ZpcmVfcGJtX2lvbW11X2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIGludCBwY2lfZmlyZV9wYm1faW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdSA9IHBibS0+aW9tbXU7CiAJdTMyIHZkbWFbMl0sIGRtYV9tYXNrOwogCXU2NCBjb250cm9sOwotCWludCB0c2JzaXplOworCWludCB0c2JzaXplLCBlcnI7CiAKIAkvKiBObyB2aXJ0dWFsLWRtYSBwcm9wZXJ0eSBvbiB0aGVzZSBndXlzLCB1c2UgbGFyZ2VzdCBzaXplLiAgKi8KIAl2ZG1hWzBdID0gMHhjMDAwMDAwMDsgLyogYmFzZSAqLwpAQCAtNjgsNyArNjgsOSBAQAogCSAqLwogCWZpcmVfd3JpdGUoaW9tbXUtPmlvbW11X2ZsdXNoaW52LCB+KHU2NCkwKTsKIAotCXBjaV9pb21tdV90YWJsZV9pbml0KGlvbW11LCB0c2JzaXplICogOCAqIDEwMjQsIHZkbWFbMF0sIGRtYV9tYXNrKTsKKwllcnIgPSBpb21tdV90YWJsZV9pbml0KGlvbW11LCB0c2JzaXplICogOCAqIDEwMjQsIHZkbWFbMF0sIGRtYV9tYXNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJZmlyZV93cml0ZShpb21tdS0+aW9tbXVfdHNiYmFzZSwgX19wYShpb21tdS0+cGFnZV90YWJsZSkgfCAweDdVTCk7CiAKQEAgLTc4LDYgKzgwLDggQEAKIAkJICAgIDB4MDAwMDAwMDIgLyogQnlwYXNzIGVuYWJsZSAqLwkJfAogCQkgICAgMHgwMDAwMDAwMSAvKiBUcmFuc2xhdGlvbiBlbmFibGUgKi8pOwogCWZpcmVfd3JpdGUoaW9tbXUtPmlvbW11X2NvbnRyb2wsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIEJhc2VkIGF0IHBibS0+Y29udHJvbGxlcl9yZWdzICovCkBAIC0xNjcsOCArMTcxLDggQEAKIAlmaXJlX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBGSVJFX1BFQ19JRU5BQiwgfih1NjQpMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9maXJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIHBvcnRpZCkKK3N0YXRpYyBpbnQgcGNpX2ZpcmVfcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCisJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHUzMiBwb3J0aWQpCiB7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwpAQCAtMjAzLDcgKzIwNyw4IEBACiAJcGNpX2dldF9wYm1fcHJvcHMocGJtKTsKIAogCXBjaV9maXJlX2h3X2luaXQocGJtKTsKLQlwY2lfZmlyZV9wYm1faW9tbXVfaW5pdChwYm0pOworCisJcmV0dXJuIHBjaV9maXJlX3BibV9pb21tdV9pbml0KHBibSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBvcnRpZF9jb21wYXJlKHUzMiB4LCB1MzIgeSkKQEAgLTIyMiw3ICsyMjcsOCBAQAogCiAJZm9yIChwYm0gPSBwY2lfcGJtX3Jvb3Q7IHBibTsgcGJtID0gcGJtLT5uZXh0KSB7CiAJCWlmIChwb3J0aWRfY29tcGFyZShwYm0tPnBvcnRpZCwgcG9ydGlkKSkgewotCQkJcGNpX2ZpcmVfcGJtX2luaXQocGJtLT5wYXJlbnQsIGRwLCBwb3J0aWQpOworCQkJaWYgKHBjaV9maXJlX3BibV9pbml0KHBibS0+cGFyZW50LCBkcCwgcG9ydGlkKSkKKwkJCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTI1MCw3ICsyNTYsOSBAQAogCSAqLwogCXBjaV9tZW1zcGFjZV9tYXNrID0gMHg3ZmZmZmZmZlVMOwogCi0JcGNpX2ZpcmVfcGJtX2luaXQocCwgZHAsIHBvcnRpZCk7CisJaWYgKHBjaV9maXJlX3BibV9pbml0KHAsIGRwLCBwb3J0aWQpKQorCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKKwogCXJldHVybjsKIAogZmF0YWxfbWVtb3J5X2Vycm9yOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwppbmRleCA1OTgzOTNhMi4uYjZiNGNmZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMKQEAgLTgxMywxNiArODEzLDE5IEBACiAJcHN5Y2hvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHBibSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBzeWNob19pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3N0YXRpYyBpbnQgcHN5Y2hvX2lvbW11X2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewogCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OwogCXVuc2lnbmVkIGxvbmcgaTsKIAl1NjQgY29udHJvbDsKKwlpbnQgZXJyOwogCiAJLyogUmVnaXN0ZXIgYWRkcmVzc2VzLiAqLwogCWlvbW11LT5pb21tdV9jb250cm9sICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lPTU1VX0NPTlRST0w7CiAJaW9tbXUtPmlvbW11X3RzYmJhc2UgID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9NTVVfVFNCQkFTRTsKIAlpb21tdS0+aW9tbXVfZmx1c2ggICAgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9GTFVTSDsKKwlpb21tdS0+aW9tbXVfdGFncyAgICAgPSBpb21tdS0+aW9tbXVfZmx1c2ggKyAoMHhhNTgwVUwgLSAweDAyMTBVTCk7CisKIAkvKiBQU1lDSE8ncyBJT01NVSBsYWNrcyBjdHggZmx1c2hpbmcuICovCiAJaW9tbXUtPmlvbW11X2N0eGZsdXNoID0gMDsKIApAQCAtODQ1LDcgKzg0OCw5IEBACiAJLyogTGVhdmUgZGlhZyBtb2RlIGVuYWJsZWQgZm9yIGZ1bGwtZmx1c2hpbmcgZG9uZQogCSAqIGluIHBjaV9pb21tdS5jCiAJICovCi0JcGNpX2lvbW11X3RhYmxlX2luaXQoaW9tbXUsIElPX1RTQl9TSVpFLCAweGMwMDAwMDAwLCAweGZmZmZmZmZmKTsKKwllcnIgPSBpb21tdV90YWJsZV9pbml0KGlvbW11LCBJT19UU0JfU0laRSwgMHhjMDAwMDAwMCwgMHhmZmZmZmZmZik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXBzeWNob193cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JT01NVV9UU0JCQVNFLAogCQkgICAgIF9fcGEoaW9tbXUtPnBhZ2VfdGFibGUpKTsKQEAgLTg1OCw2ICs4NjMsOCBAQAogCS8qIElmIG5lY2Vzc2FyeSwgaG9vayB1cyB1cCBmb3Igc3RhcmZpcmUgSVJRIHRyYW5zbGF0aW9ucy4gKi8KIAlpZiAodGhpc19pc19zdGFyZmlyZSkKIAkJc3RhcmZpcmVfaG9va3VwKHBibS0+cG9ydGlkKTsKKworCXJldHVybiAwOwogfQogCiAjZGVmaW5lIFBTWUNIT19JUlFfUkVUUlkJMHgxYTAwVUwKQEAgLTEwMzEsMTUgKzEwMzgsMTIgQEAKIAl9CiAKIAlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXApIHsKLQkJcHJvbV9wcmludGYoIlBTWUNITzogRmF0YWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCWlmICghcCkKKwkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWlvbW11KSB7Ci0JCXByb21fcHJpbnRmKCJQU1lDSE86IEZhdGFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KKwlpZiAoIWlvbW11KQorCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKKwogCXAtPnBibV9BLmlvbW11ID0gcC0+cGJtX0IuaW9tbXUgPSBpb21tdTsKIAogCXAtPnBibV9BLnBvcnRpZCA9IHVwYV9wb3J0aWQ7CkBAIC0xMDYyLDggKzEwNjYsMTQgQEAKIAogCXBzeWNob19jb250cm9sbGVyX2h3aW5pdCgmcC0+cGJtX0EpOwogCi0JcHN5Y2hvX2lvbW11X2luaXQoJnAtPnBibV9BKTsKKwlpZiAocHN5Y2hvX2lvbW11X2luaXQoJnAtPnBibV9BKSkKKwkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAKIAlpc19wYm1fYSA9ICgocHJfcmVnc1swXS5waHlzX2FkZHIgJiAweDYwMDApID09IDB4MjAwMCk7CiAJcHN5Y2hvX3BibV9pbml0KHAsIGRwLCBpc19wYm1fYSk7CisJcmV0dXJuOworCitmYXRhbF9tZW1vcnlfZXJyb3I6CisJcHJvbV9wcmludGYoIlBTWUNITzogRmF0YWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKKwlwcm9tX2hhbHQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCmluZGV4IDIyZTFiZTUuLmZiYTY3YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwpAQCAtNjcyLDE4ICs2NzIsMjAgQEAKIAlzYWJyZV9yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhwYm0pOwogfQogCi1zdGF0aWMgdm9pZCBzYWJyZV9pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCSAgICAgaW50IHRzYnNpemUsIHVuc2lnbmVkIGxvbmcgZHZtYV9vZmZzZXQsCi0JCQkgICAgIHUzMiBkbWFfbWFzaykKK3N0YXRpYyBpbnQgc2FicmVfaW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkgICAgaW50IHRzYnNpemUsIHVuc2lnbmVkIGxvbmcgZHZtYV9vZmZzZXQsCisJCQkgICAgdTMyIGRtYV9tYXNrKQogewogCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OwogCXVuc2lnbmVkIGxvbmcgaTsKIAl1NjQgY29udHJvbDsKKwlpbnQgZXJyOwogCiAJLyogUmVnaXN0ZXIgYWRkcmVzc2VzLiAqLwogCWlvbW11LT5pb21tdV9jb250cm9sICA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0FCUkVfSU9NTVVfQ09OVFJPTDsKIAlpb21tdS0+aW9tbXVfdHNiYmFzZSAgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPTU1VX1RTQkJBU0U7CiAJaW9tbXUtPmlvbW11X2ZsdXNoICAgID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9GTFVTSDsKKwlpb21tdS0+aW9tbXVfdGFncyAgICAgPSBpb21tdS0+aW9tbXVfZmx1c2ggKyAoMHhhNTgwVUwgLSAweDAyMTBVTCk7CiAJaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgU0FCUkVfV1JTWU5DOwogCS8qIFNhYnJlJ3MgSU9NTVUgbGFja3MgY3R4IGZsdXNoaW5nLiAqLwogCWlvbW11LT5pb21tdV9jdHhmbHVzaCA9IDA7CkBAIC03MDEsNyArNzAzLDEwIEBACiAJLyogTGVhdmUgZGlhZyBtb2RlIGVuYWJsZWQgZm9yIGZ1bGwtZmx1c2hpbmcgZG9uZQogCSAqIGluIHBjaV9pb21tdS5jCiAJICovCi0JcGNpX2lvbW11X3RhYmxlX2luaXQoaW9tbXUsIHRzYnNpemUgKiAxMDI0ICogOCwgZHZtYV9vZmZzZXQsIGRtYV9tYXNrKTsKKwllcnIgPSBpb21tdV90YWJsZV9pbml0KGlvbW11LCB0c2JzaXplICogMTAyNCAqIDgsCisJCQkgICAgICAgZHZtYV9vZmZzZXQsIGRtYV9tYXNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJc2FicmVfd3JpdGUocGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9UU0JCQVNFLAogCQkgICAgX19wYShpb21tdS0+cGFnZV90YWJsZSkpOwpAQCAtNzIyLDYgKzcyNyw4IEBACiAJCWJyZWFrOwogCX0KIAlzYWJyZV93cml0ZShwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPTU1VX0NPTlRST0wsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCkBAIC03NzUsMTYgKzc4MiwxMiBAQAogCX0KIAogCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9BVE9NSUMpOwotCWlmICghcCkgewotCQlwcm9tX3ByaW50ZigiU0FCUkU6IEVycm9yLCBrbWFsbG9jKHBjaV9jb250cm9sbGVyX2luZm8pIGZhaWxlZC5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJaWYgKCFwKQorCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAogCWlvbW11ID0ga3phbGxvYyhzaXplb2YoKmlvbW11KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpb21tdSkgewotCQlwcm9tX3ByaW50ZigiU0FCUkU6IEVycm9yLCBrbWFsbG9jKHBjaV9pb21tdSkgZmFpbGVkLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KKwlpZiAoIWlvbW11KQorCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAlwYm0gPSAmcC0+cGJtX0E7CiAJcGJtLT5pb21tdSA9IGlvbW11OwogCkBAIC04NDcsMTAgKzg1MCwxNiBAQAogCQkJcHJvbV9oYWx0KCk7CiAJfQogCi0Jc2FicmVfaW9tbXVfaW5pdChwYm0sIHRzYnNpemUsIHZkbWFbMF0sIGRtYV9tYXNrKTsKKwlpZiAoc2FicmVfaW9tbXVfaW5pdChwYm0sIHRzYnNpemUsIHZkbWFbMF0sIGRtYV9tYXNrKSkKKwkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAKIAkvKgogCSAqIExvb2sgZm9yIEFQQiB1bmRlcm5lYXRoLgogCSAqLwogCXNhYnJlX3BibV9pbml0KHAsIHBibSwgZHApOworCXJldHVybjsKKworZmF0YWxfbWVtb3J5X2Vycm9yOgorCXByb21fcHJpbnRmKCJTQUJSRTogRmF0YWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKKwlwcm9tX2hhbHQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2NoaXpvLmMKaW5kZXggYWU3Njg5OC4uM2MzMGJmYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2NoaXpvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2NoaXpvLmMKQEAgLTExNDgsMTQgKzExNDgsMTQgQEAKICNkZWZpbmUgU0NISVpPX0lPTU1VX0ZMVVNICQkoMHgwMDIxMFVMKQogI2RlZmluZSBTQ0hJWk9fSU9NTVVfQ1RYRkxVU0gJCSgweDAwMjE4VUwpCiAKLXN0YXRpYyB2b2lkIHNjaGl6b19wYm1faW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCitzdGF0aWMgaW50IHNjaGl6b19wYm1faW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdSA9IHBibS0+aW9tbXU7CiAJdW5zaWduZWQgbG9uZyBpLCB0YWdiYXNlLCBkYXRhYmFzZTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdTMyIHZkbWFbMl0sIGRtYV9tYXNrOworCWludCB0c2JzaXplLCBlcnI7CiAJdTY0IGNvbnRyb2w7Ci0JaW50IHRzYnNpemU7CiAKIAlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShwYm0tPnByb21fbm9kZSwgInZpcnR1YWwtZG1hIiwgTlVMTCk7CiAJaWYgKHByb3ApIHsKQEAgLTExOTUsNiArMTE5NSw3IEBACiAJaW9tbXUtPmlvbW11X2NvbnRyb2wgID0gcGJtLT5wYm1fcmVncyArIFNDSElaT19JT01NVV9DT05UUk9MOwogCWlvbW11LT5pb21tdV90c2JiYXNlICA9IHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fSU9NTVVfVFNCQkFTRTsKIAlpb21tdS0+aW9tbXVfZmx1c2ggICAgPSBwYm0tPnBibV9yZWdzICsgU0NISVpPX0lPTU1VX0ZMVVNIOworCWlvbW11LT5pb21tdV90YWdzICAgICA9IGlvbW11LT5pb21tdV9mbHVzaCArICgweGE1ODBVTCAtIDB4MDIxMFVMKTsKIAlpb21tdS0+aW9tbXVfY3R4Zmx1c2ggPSBwYm0tPnBibV9yZWdzICsgU0NISVpPX0lPTU1VX0NUWEZMVVNIOwogCiAJLyogV2UgdXNlIHRoZSBtYWluIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIG9mIFNDSElaTyBhcyB0aGUgd3JpdGUKQEAgLTEyMTksNyArMTIyMCw5IEBACiAJLyogTGVhdmUgZGlhZyBtb2RlIGVuYWJsZWQgZm9yIGZ1bGwtZmx1c2hpbmcgZG9uZQogCSAqIGluIHBjaV9pb21tdS5jCiAJICovCi0JcGNpX2lvbW11X3RhYmxlX2luaXQoaW9tbXUsIHRzYnNpemUgKiA4ICogMTAyNCwgdmRtYVswXSwgZG1hX21hc2spOworCWVyciA9IGlvbW11X3RhYmxlX2luaXQoaW9tbXUsIHRzYnNpemUgKiA4ICogMTAyNCwgdmRtYVswXSwgZG1hX21hc2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlzY2hpem9fd3JpdGUoaW9tbXUtPmlvbW11X3RzYmJhc2UsIF9fcGEoaW9tbXUtPnBhZ2VfdGFibGUpKTsKIApAQCAtMTIzNiw2ICsxMjM5LDggQEAKIAogCWNvbnRyb2wgfD0gU0NISVpPX0lPTU1VX0NUUkxfRU5BQjsKIAlzY2hpem9fd3JpdGUoaW9tbXUtPmlvbW11X2NvbnRyb2wsIGNvbnRyb2wpOworCisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgU0NISVpPX1BDSV9JUlFfUkVUUlkJKDB4MWEwMFVMKQpAQCAtMTMyOCwxNCArMTMzMywxNCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2NoaXpvX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHUzMiBwb3J0aWQsCi0JCQkgICAgaW50IGNoaXBfdHlwZSkKK3N0YXRpYyBpbnQgc2NoaXpvX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAorCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIHBvcnRpZCwKKwkJCSAgIGludCBjaGlwX3R5cGUpCiB7CiAJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCWNvbnN0IGNoYXIgKmNoaXBzZXRfbmFtZTsKLQlpbnQgaXNfcGJtX2E7CisJaW50IGlzX3BibV9hLCBlcnI7CiAKIAlzd2l0Y2ggKGNoaXBfdHlwZSkgewogCWNhc2UgUEJNX0NISVBfVFlQRV9UT01BVElMTE86CkBAIC0xNDA2LDggKzE0MTEsMTMgQEAKIAogCXBjaV9nZXRfcGJtX3Byb3BzKHBibSk7CiAKLQlzY2hpem9fcGJtX2lvbW11X2luaXQocGJtKTsKKwllcnIgPSBzY2hpem9fcGJtX2lvbW11X2luaXQocGJtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJc2NoaXpvX3BibV9zdHJidWZfaW5pdChwYm0pOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBvcnRpZF9jb21wYXJlKHUzMiB4LCB1MzIgeSwgaW50IGNoaXBfdHlwZSkKQEAgLTE0MzEsMzQgKzE0NDEsMzggQEAKIAogCWZvciAocGJtID0gcGNpX3BibV9yb290OyBwYm07IHBibSA9IHBibS0+bmV4dCkgewogCQlpZiAocG9ydGlkX2NvbXBhcmUocGJtLT5wb3J0aWQsIHBvcnRpZCwgY2hpcF90eXBlKSkgewotCQkJc2NoaXpvX3BibV9pbml0KHBibS0+cGFyZW50LCBkcCwgcG9ydGlkLCBjaGlwX3R5cGUpOworCQkJaWYgKHNjaGl6b19wYm1faW5pdChwYm0tPnBhcmVudCwgZHAsCisJCQkJCSAgICBwb3J0aWQsIGNoaXBfdHlwZSkpCisJCQkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKIAlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXApCi0JCWdvdG8gbWVtZmFpbDsKKwkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAKIAlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdSksIEdGUF9BVE9NSUMpOwogCWlmICghaW9tbXUpCi0JCWdvdG8gbWVtZmFpbDsKKwkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAKIAlwLT5wYm1fQS5pb21tdSA9IGlvbW11OwogCiAJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWlvbW11KQotCQlnb3RvIG1lbWZhaWw7CisJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwogCiAJcC0+cGJtX0IuaW9tbXUgPSBpb21tdTsKIAogCS8qIExpa2UgUFNZQ0hPIHdlIGhhdmUgYSAyR0IgYWxpZ25lZCBhcmVhIGZvciBtZW1vcnkgc3BhY2UuICovCiAJcGNpX21lbXNwYWNlX21hc2sgPSAweDdmZmZmZmZmVUw7CiAKLQlzY2hpem9fcGJtX2luaXQocCwgZHAsIHBvcnRpZCwgY2hpcF90eXBlKTsKKwlpZiAoc2NoaXpvX3BibV9pbml0KHAsIGRwLCBwb3J0aWQsIGNoaXBfdHlwZSkpCisJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOworCiAJcmV0dXJuOwogCi1tZW1mYWlsOgorZmF0YWxfbWVtb3J5X2Vycm9yOgogCXByb21fcHJpbnRmKCJTQ0hJWk86IEZhdGFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLlxuIik7CiAJcHJvbV9oYWx0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCA2MzljZjA2Li40NjZmNGFhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTMzLDMwICszMywzMCBAQAogI2RlZmluZSBQR0xJU1RfTkVOVFMJKFBBR0VfU0laRSAvIHNpemVvZih1NjQpKQogCiBzdHJ1Y3QgaW9tbXVfYmF0Y2ggewotCXN0cnVjdCBwY2lfZGV2CSpwZGV2OwkJLyogRGV2aWNlIG1hcHBpbmcgaXMgZm9yLgkqLworCXN0cnVjdCBkZXZpY2UJKmRldjsJCS8qIERldmljZSBtYXBwaW5nIGlzIGZvci4JKi8KIAl1bnNpZ25lZCBsb25nCXByb3Q7CQkvKiBJT01NVSBwYWdlIHByb3RlY3Rpb25zCSovCiAJdW5zaWduZWQgbG9uZwllbnRyeTsJCS8qIEluZGV4IGludG8gSU9UU0IuCQkqLwogCXU2NAkJKnBnbGlzdDsJLyogTGlzdCBvZiBwaHlzaWNhbCBwYWdlcwkqLwogCXVuc2lnbmVkIGxvbmcJbnBhZ2VzOwkJLyogTnVtYmVyIG9mIHBhZ2VzIGluIGxpc3QuCSovCiB9OwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGlvbW11X2JhdGNoLCBwY2lfaW9tbXVfYmF0Y2gpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBpb21tdV9iYXRjaCwgaW9tbXVfYmF0Y2gpOwogCiAvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQuICAqLwotc3RhdGljIGlubGluZSB2b2lkIHBjaV9pb21tdV9iYXRjaF9zdGFydChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGVudHJ5KQorc3RhdGljIGlubGluZSB2b2lkIGlvbW11X2JhdGNoX3N0YXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGVudHJ5KQogewotCXN0cnVjdCBpb21tdV9iYXRjaCAqcCA9ICZfX2dldF9jcHVfdmFyKHBjaV9pb21tdV9iYXRjaCk7CisJc3RydWN0IGlvbW11X2JhdGNoICpwID0gJl9fZ2V0X2NwdV92YXIoaW9tbXVfYmF0Y2gpOwogCi0JcC0+cGRldgkJPSBwZGV2OworCXAtPmRldgkJPSBkZXY7CiAJcC0+cHJvdAkJPSBwcm90OwogCXAtPmVudHJ5CT0gZW50cnk7CiAJcC0+bnBhZ2VzCT0gMDsKIH0KIAogLyogSW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkLiAgKi8KLXN0YXRpYyBsb25nIHBjaV9pb21tdV9iYXRjaF9mbHVzaChzdHJ1Y3QgaW9tbXVfYmF0Y2ggKnApCitzdGF0aWMgbG9uZyBpb21tdV9iYXRjaF9mbHVzaChzdHJ1Y3QgaW9tbXVfYmF0Y2ggKnApCiB7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcC0+cGRldi0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKKwlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwLT5kZXYtPmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKIAl1bnNpZ25lZCBsb25nIGRldmhhbmRsZSA9IHBibS0+ZGV2aGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHAtPnByb3Q7CiAJdW5zaWduZWQgbG9uZyBlbnRyeSA9IHAtPmVudHJ5OwpAQCAtNzAsNyArNzAsNyBAQAogCQkJCQkgIG5wYWdlcywgcHJvdCwgX19wYShwZ2xpc3QpKTsKIAkJaWYgKHVubGlrZWx5KG51bSA8IDApKSB7CiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJCXByaW50aygicGNpX2lvbW11X2JhdGNoX2ZsdXNoOiBJT01NVSBtYXAgb2YgIgorCQkJCXByaW50aygiaW9tbXVfYmF0Y2hfZmx1c2g6IElPTU1VIG1hcCBvZiAiCiAJCQkJICAgICAgICJbJTA4bHg6JTA4bHg6JWx4OiVseDolbHhdIGZhaWxlZCB3aXRoICIKIAkJCQkgICAgICAgInN0YXR1cyAlbGRcbiIsCiAJCQkJICAgICAgIGRldmhhbmRsZSwgSFZfUENJX1RTQklEKDAsIGVudHJ5KSwKQEAgLTkwLDMwICs5MCwzMCBAQAogfQogCiAvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQuICAqLwotc3RhdGljIGlubGluZSBsb25nIHBjaV9pb21tdV9iYXRjaF9hZGQodTY0IHBoeXNfcGFnZSkKK3N0YXRpYyBpbmxpbmUgbG9uZyBpb21tdV9iYXRjaF9hZGQodTY0IHBoeXNfcGFnZSkKIHsKLQlzdHJ1Y3QgaW9tbXVfYmF0Y2ggKnAgPSAmX19nZXRfY3B1X3ZhcihwY2lfaW9tbXVfYmF0Y2gpOworCXN0cnVjdCBpb21tdV9iYXRjaCAqcCA9ICZfX2dldF9jcHVfdmFyKGlvbW11X2JhdGNoKTsKIAogCUJVR19PTihwLT5ucGFnZXMgPj0gUEdMSVNUX05FTlRTKTsKIAogCXAtPnBnbGlzdFtwLT5ucGFnZXMrK10gPSBwaHlzX3BhZ2U7CiAJaWYgKHAtPm5wYWdlcyA9PSBQR0xJU1RfTkVOVFMpCi0JCXJldHVybiBwY2lfaW9tbXVfYmF0Y2hfZmx1c2gocCk7CisJCXJldHVybiBpb21tdV9iYXRjaF9mbHVzaChwKTsKIAogCXJldHVybiAwOwogfQogCiAvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQuICAqLwotc3RhdGljIGlubGluZSBsb25nIHBjaV9pb21tdV9iYXRjaF9lbmQodm9pZCkKK3N0YXRpYyBpbmxpbmUgbG9uZyBpb21tdV9iYXRjaF9lbmQodm9pZCkKIHsKLQlzdHJ1Y3QgaW9tbXVfYmF0Y2ggKnAgPSAmX19nZXRfY3B1X3ZhcihwY2lfaW9tbXVfYmF0Y2gpOworCXN0cnVjdCBpb21tdV9iYXRjaCAqcCA9ICZfX2dldF9jcHVfdmFyKGlvbW11X2JhdGNoKTsKIAogCUJVR19PTihwLT5ucGFnZXMgPj0gUEdMSVNUX05FTlRTKTsKIAotCXJldHVybiBwY2lfaW9tbXVfYmF0Y2hfZmx1c2gocCk7CisJcmV0dXJuIGlvbW11X2JhdGNoX2ZsdXNoKHApOwogfQogCi1zdGF0aWMgbG9uZyBwY2lfYXJlbmFfYWxsb2Moc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCitzdGF0aWMgbG9uZyBhcmVuYV9hbGxvYyhzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIG4sIGksIHN0YXJ0LCBlbmQsIGxpbWl0OwogCWludCBwYXNzOwpAQCAtMTUyLDcgKzE1Miw4IEBACiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9hcmVuYV9mcmVlKHN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCitzdGF0aWMgdm9pZCBhcmVuYV9mcmVlKHN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtMTYwLDcgKzE2MSw4IEBACiAJCV9fY2xlYXJfYml0KGksIGFyZW5hLT5tYXApOwogfQogCi1zdGF0aWMgdm9pZCAqcGNpXzR2X2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfYWRkcnAsIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkICpkbWFfNHZfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICBkbWFfYWRkcl90ICpkbWFfYWRkcnAsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yZGVyLCBmaXJzdF9wYWdlLCBucGFnZXMsIG47CkBAIC0xODAsMTAgKzE4MiwxMCBAQAogCiAJbWVtc2V0KChjaGFyICopZmlyc3RfcGFnZSwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKIAotCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCWlvbW11ID0gZGV2LT5hcmNoZGF0YS5pb21tdTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCWVudHJ5ID0gcGNpX2FyZW5hX2FsbG9jKCZpb21tdS0+YXJlbmEsIG5wYWdlcyk7CisJZW50cnkgPSBhcmVuYV9hbGxvYygmaW9tbXUtPmFyZW5hLCBucGFnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKIAlpZiAodW5saWtlbHkoZW50cnkgPCAwTCkpCkBAIC0xOTYsMTggKzE5OCwxOCBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JcGNpX2lvbW11X2JhdGNoX3N0YXJ0KHBkZXYsCi0JCQkgICAgICAoSFZfUENJX01BUF9BVFRSX1JFQUQgfAotCQkJICAgICAgIEhWX1BDSV9NQVBfQVRUUl9XUklURSksCi0JCQkgICAgICBlbnRyeSk7CisJaW9tbXVfYmF0Y2hfc3RhcnQoZGV2LAorCQkJICAoSFZfUENJX01BUF9BVFRSX1JFQUQgfAorCQkJICAgSFZfUENJX01BUF9BVFRSX1dSSVRFKSwKKwkJCSAgZW50cnkpOwogCiAJZm9yIChuID0gMDsgbiA8IG5wYWdlczsgbisrKSB7Ci0JCWxvbmcgZXJyID0gcGNpX2lvbW11X2JhdGNoX2FkZChmaXJzdF9wYWdlICsgKG4gKiBQQUdFX1NJWkUpKTsKKwkJbG9uZyBlcnIgPSBpb21tdV9iYXRjaF9hZGQoZmlyc3RfcGFnZSArIChuICogUEFHRV9TSVpFKSk7CiAJCWlmICh1bmxpa2VseShlcnIgPCAwTCkpCiAJCQlnb3RvIGlvbW11X21hcF9mYWlsOwogCX0KIAotCWlmICh1bmxpa2VseShwY2lfaW9tbXVfYmF0Y2hfZW5kKCkgPCAwTCkpCisJaWYgKHVubGlrZWx5KGlvbW11X2JhdGNoX2VuZCgpIDwgMEwpKQogCQlnb3RvIGlvbW11X21hcF9mYWlsOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMjE3LDcgKzIxOSw3IEBACiBpb21tdV9tYXBfZmFpbDoKIAkvKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gICovCiAJc3Bpbl9sb2NrKCZpb21tdS0+bG9jayk7Ci0JcGNpX2FyZW5hX2ZyZWUoJmlvbW11LT5hcmVuYSwgZW50cnksIG5wYWdlcyk7CisJYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBlbnRyeSwgbnBhZ2VzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCiBhcmVuYV9hbGxvY19mYWlsOgpAQCAtMjI1LDcgKzIyNyw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV80dl9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHUsIGRtYV9hZGRyX3QgZHZtYSkKK3N0YXRpYyB2b2lkIGRtYV80dl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdSwKKwkJCQkgZG1hX2FkZHJfdCBkdm1hKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwpAQCAtMjMzLDE0ICsyMzYsMTQgQEAKIAl1MzIgZGV2aGFuZGxlOwogCiAJbnBhZ2VzID0gSU9fUEFHRV9BTElHTihzaXplKSA+PiBJT19QQUdFX1NISUZUOwotCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OwotCXBibSA9IHBkZXYtPmRldi5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXI7CisJaW9tbXUgPSBkZXYtPmFyY2hkYXRhLmlvbW11OworCXBibSA9IGRldi0+YXJjaGRhdGEuaG9zdF9jb250cm9sbGVyOwogCWRldmhhbmRsZSA9IHBibS0+ZGV2aGFuZGxlOwogCWVudHJ5ID0gKChkdm1hIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UpID4+IElPX1BBR0VfU0hJRlQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKLQlwY2lfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBlbnRyeSwgbnBhZ2VzKTsKKwlhcmVuYV9mcmVlKCZpb21tdS0+YXJlbmEsIGVudHJ5LCBucGFnZXMpOwogCiAJZG8gewogCQl1bnNpZ25lZCBsb25nIG51bTsKQEAgLTI1OCw3ICsyNjEsOCBAQAogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNwdSwgb3JkZXIpOwogfQogCi1zdGF0aWMgZG1hX2FkZHJfdCBwY2lfNHZfbWFwX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc3osIGludCBkaXJlY3Rpb24pCitzdGF0aWMgZG1hX2FkZHJfdCBkbWFfNHZfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHN6LAorCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIG9hZGRyOwpAQCAtMjY3LDkgKzI3MSw5IEBACiAJdW5zaWduZWQgbG9uZyBwcm90OwogCWxvbmcgZW50cnk7CiAKLQlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAKLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSkpCisJaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBETUFfTk9ORSkpCiAJCWdvdG8gYmFkOwogCiAJb2FkZHIgPSAodW5zaWduZWQgbG9uZylwdHI7CkBAIC0yNzcsNyArMjgxLDcgQEAKIAlucGFnZXMgPj49IElPX1BBR0VfU0hJRlQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQllbnRyeSA9IHBjaV9hcmVuYV9hbGxvYygmaW9tbXUtPmFyZW5hLCBucGFnZXMpOworCWVudHJ5ID0gYXJlbmFfYWxsb2MoJmlvbW11LT5hcmVuYSwgbnBhZ2VzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KGVudHJ5IDwgMEwpKQpAQCAtMjg4LDE5ICsyOTIsMTkgQEAKIAlyZXQgPSBidXNfYWRkciB8IChvYWRkciAmIH5JT19QQUdFX01BU0spOwogCWJhc2VfcGFkZHIgPSBfX3BhKG9hZGRyICYgSU9fUEFHRV9NQVNLKTsKIAlwcm90ID0gSFZfUENJX01BUF9BVFRSX1JFQUQ7Ci0JaWYgKGRpcmVjdGlvbiAhPSBQQ0lfRE1BX1RPREVWSUNFKQorCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKIAkJcHJvdCB8PSBIVl9QQ0lfTUFQX0FUVFJfV1JJVEU7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQlwY2lfaW9tbXVfYmF0Y2hfc3RhcnQocGRldiwgcHJvdCwgZW50cnkpOworCWlvbW11X2JhdGNoX3N0YXJ0KGRldiwgcHJvdCwgZW50cnkpOwogCiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrLCBiYXNlX3BhZGRyICs9IElPX1BBR0VfU0laRSkgewotCQlsb25nIGVyciA9IHBjaV9pb21tdV9iYXRjaF9hZGQoYmFzZV9wYWRkcik7CisJCWxvbmcgZXJyID0gaW9tbXVfYmF0Y2hfYWRkKGJhc2VfcGFkZHIpOwogCQlpZiAodW5saWtlbHkoZXJyIDwgMEwpKQogCQkJZ290byBpb21tdV9tYXBfZmFpbDsKIAl9Ci0JaWYgKHVubGlrZWx5KHBjaV9pb21tdV9iYXRjaF9lbmQoKSA8IDBMKSkKKwlpZiAodW5saWtlbHkoaW9tbXVfYmF0Y2hfZW5kKCkgPCAwTCkpCiAJCWdvdG8gaW9tbXVfbWFwX2ZhaWw7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0zMTAsMTggKzMxNCwxOSBAQAogYmFkOgogCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCVdBUk5fT04oMSk7Ci0JcmV0dXJuIFBDSV9ETUFfRVJST1JfQ09ERTsKKwlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CiAKIGlvbW11X21hcF9mYWlsOgogCS8qIEludGVycnVwdHMgYXJlIGRpc2FibGVkLiAgKi8KIAlzcGluX2xvY2soJmlvbW11LT5sb2NrKTsKLQlwY2lfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBlbnRyeSwgbnBhZ2VzKTsKKwlhcmVuYV9mcmVlKCZpb21tdS0+YXJlbmEsIGVudHJ5LCBucGFnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gUENJX0RNQV9FUlJPUl9DT0RFOworCXJldHVybiBETUFfRVJST1JfQ09ERTsKIH0KIAotc3RhdGljIHZvaWQgcGNpXzR2X3VubWFwX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZG1hX2FkZHJfdCBidXNfYWRkciwgc2l6ZV90IHN6LCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIHZvaWQgZG1hXzR2X3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCisJCQkJc2l6ZV90IHN6LCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCXN0cnVjdCBpb21tdSAqaW9tbXU7CkBAIC0zMjksMTQgKzMzNCwxNCBAQAogCWxvbmcgZW50cnk7CiAJdTMyIGRldmhhbmRsZTsKIAotCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKSkgeworCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gRE1BX05PTkUpKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQlXQVJOX09OKDEpOwogCQlyZXR1cm47CiAJfQogCi0JaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7Ci0JcGJtID0gcGRldi0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CisJcGJtID0gZGV2LT5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXI7CiAJZGV2aGFuZGxlID0gcGJtLT5kZXZoYW5kbGU7CiAKIAlucGFnZXMgPSBJT19QQUdFX0FMSUdOKGJ1c19hZGRyICsgc3opIC0gKGJ1c19hZGRyICYgSU9fUEFHRV9NQVNLKTsKQEAgLTM0Niw3ICszNTEsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCiAJZW50cnkgPSAoYnVzX2FkZHIgLSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSkgPj4gSU9fUEFHRV9TSElGVDsKLQlwY2lfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBlbnRyeSwgbnBhZ2VzKTsKKwlhcmVuYV9mcmVlKCZpb21tdS0+YXJlbmEsIGVudHJ5LCBucGFnZXMpOwogCiAJZG8gewogCQl1bnNpZ25lZCBsb25nIG51bTsKQEAgLTM2Myw3ICszNjgsNyBAQAogI2RlZmluZSBTR19FTlRfUEhZU19BRERSRVNTKFNHKQlcCiAJKF9fcGEocGFnZV9hZGRyZXNzKChTRyktPnBhZ2UpKSArIChTRyktPm9mZnNldCkKIAotc3RhdGljIGlubGluZSBsb25nIGZpbGxfc2cobG9uZyBlbnRyeSwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCitzdGF0aWMgaW5saW5lIGxvbmcgZmlsbF9zZyhsb25nIGVudHJ5LCBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCQkJICAgaW50IG51c2VkLCBpbnQgbmVsZW1zLCB1bnNpZ25lZCBsb25nIHByb3QpCiB7CkBAIC0zNzQsNyArMzc5LDcgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCXBjaV9pb21tdV9iYXRjaF9zdGFydChwZGV2LCBwcm90LCBlbnRyeSk7CisJaW9tbXVfYmF0Y2hfc3RhcnQoZGV2LCBwcm90LCBlbnRyeSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVzZWQ7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIHB0ZXZhbCA9IH4wVUw7CkBAIC00MTUsNyArNDIwLDcgQEAKIAkJCXdoaWxlIChsZW4gPiAwKSB7CiAJCQkJbG9uZyBlcnI7CiAKLQkJCQllcnIgPSBwY2lfaW9tbXVfYmF0Y2hfYWRkKHB0ZXZhbCk7CisJCQkJZXJyID0gaW9tbXVfYmF0Y2hfYWRkKHB0ZXZhbCk7CiAJCQkJaWYgKHVubGlrZWx5KGVyciA8IDBMKSkKIAkJCQkJZ290byBpb21tdV9tYXBfZmFpbGVkOwogCkBAIC00NDYsNyArNDUxLDcgQEAKIAkJZG1hX3NnKys7CiAJfQogCi0JaWYgKHVubGlrZWx5KHBjaV9pb21tdV9iYXRjaF9lbmQoKSA8IDBMKSkKKwlpZiAodW5saWtlbHkoaW9tbXVfYmF0Y2hfZW5kKCkgPCAwTCkpCiAJCWdvdG8gaW9tbXVfbWFwX2ZhaWxlZDsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTQ1Nyw3ICs0NjIsOCBAQAogCXJldHVybiAtMUw7CiB9CiAKLXN0YXRpYyBpbnQgcGNpXzR2X21hcF9zZyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCitzdGF0aWMgaW50IGRtYV80dl9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJCSBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIHByb3Q7CkBAIC00NjksMTggKzQ3NSwxOSBAQAogCS8qIEZhc3QgcGF0aCBzaW5nbGUgZW50cnkgc2NhdHRlcmxpc3RzLiAqLwogCWlmIChuZWxlbXMgPT0gMSkgewogCQlzZ2xpc3QtPmRtYV9hZGRyZXNzID0KLQkJCXBjaV80dl9tYXBfc2luZ2xlKHBkZXYsCi0JCQkJCSAgKHBhZ2VfYWRkcmVzcyhzZ2xpc3QtPnBhZ2UpICsgc2dsaXN0LT5vZmZzZXQpLAorCQkJZG1hXzR2X21hcF9zaW5nbGUoZGV2LAorCQkJCQkgIChwYWdlX2FkZHJlc3Moc2dsaXN0LT5wYWdlKSArCisJCQkJCSAgIHNnbGlzdC0+b2Zmc2V0KSwKIAkJCQkJICBzZ2xpc3QtPmxlbmd0aCwgZGlyZWN0aW9uKTsKLQkJaWYgKHVubGlrZWx5KHNnbGlzdC0+ZG1hX2FkZHJlc3MgPT0gUENJX0RNQV9FUlJPUl9DT0RFKSkKKwkJaWYgKHVubGlrZWx5KHNnbGlzdC0+ZG1hX2FkZHJlc3MgPT0gRE1BX0VSUk9SX0NPREUpKQogCQkJcmV0dXJuIDA7CiAJCXNnbGlzdC0+ZG1hX2xlbmd0aCA9IHNnbGlzdC0+bGVuZ3RoOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlpb21tdSA9IGRldi0+YXJjaGRhdGEuaW9tbXU7CiAJCi0JaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpKQorCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gRE1BX05PTkUpKQogCQlnb3RvIGJhZDsKIAogCS8qIFN0ZXAgMTogUHJlcGFyZSBzY2F0dGVyIGxpc3QuICovCkBAIC00ODgsNyArNDk1LDcgQEAKIAogCS8qIFN0ZXAgMjogQWxsb2NhdGUgYSBjbHVzdGVyIGFuZCBjb250ZXh0LCBpZiBuZWNlc3NhcnkuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JZW50cnkgPSBwY2lfYXJlbmFfYWxsb2MoJmlvbW11LT5hcmVuYSwgbnBhZ2VzKTsKKwllbnRyeSA9IGFyZW5hX2FsbG9jKCZpb21tdS0+YXJlbmEsIG5wYWdlcyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAogCWlmICh1bmxpa2VseShlbnRyeSA8IDBMKSkKQEAgLTUxMCwxMCArNTE3LDEwIEBACiAKIAkvKiBTdGVwIDQ6IENyZWF0ZSB0aGUgbWFwcGluZ3MuICovCiAJcHJvdCA9IEhWX1BDSV9NQVBfQVRUUl9SRUFEOwotCWlmIChkaXJlY3Rpb24gIT0gUENJX0RNQV9UT0RFVklDRSkKKwlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCiAJCXByb3QgfD0gSFZfUENJX01BUF9BVFRSX1dSSVRFOwogCi0JZXJyID0gZmlsbF9zZyhlbnRyeSwgcGRldiwgc2dsaXN0LCB1c2VkLCBuZWxlbXMsIHByb3QpOworCWVyciA9IGZpbGxfc2coZW50cnksIGRldiwgc2dsaXN0LCB1c2VkLCBuZWxlbXMsIHByb3QpOwogCWlmICh1bmxpa2VseShlcnIgPCAwTCkpCiAJCWdvdG8gaW9tbXVfbWFwX2ZhaWxlZDsKIApAQCAtNTI2LDEzICs1MzMsMTQgQEAKIAogaW9tbXVfbWFwX2ZhaWxlZDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlwY2lfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBlbnRyeSwgbnBhZ2VzKTsKKwlhcmVuYV9mcmVlKCZpb21tdS0+YXJlbmEsIGVudHJ5LCBucGFnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGNpXzR2X3VubWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKK3N0YXRpYyB2b2lkIGRtYV80dl91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJICAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJc3RydWN0IGlvbW11ICppb21tdTsKQEAgLTU0MCwxMyArNTQ4LDEzIEBACiAJbG9uZyBlbnRyeTsKIAl1MzIgZGV2aGFuZGxlLCBidXNfYWRkcjsKIAotCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKSkgeworCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gRE1BX05PTkUpKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQlXQVJOX09OKDEpOwogCX0KIAotCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OwotCXBibSA9IHBkZXYtPmRldi5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXI7CisJaW9tbXUgPSBkZXYtPmFyY2hkYXRhLmlvbW11OworCXBibSA9IGRldi0+YXJjaGRhdGEuaG9zdF9jb250cm9sbGVyOwogCWRldmhhbmRsZSA9IHBibS0+ZGV2aGFuZGxlOwogCQogCWJ1c19hZGRyID0gc2dsaXN0LT5kbWFfYWRkcmVzcyAmIElPX1BBR0VfTUFTSzsKQEAgLTU2Miw3ICs1NzAsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKLQlwY2lfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBlbnRyeSwgbnBhZ2VzKTsKKwlhcmVuYV9mcmVlKCZpb21tdS0+YXJlbmEsIGVudHJ5LCBucGFnZXMpOwogCiAJZG8gewogCQl1bnNpZ25lZCBsb25nIG51bTsKQEAgLTU3NiwyNSArNTg0LDI5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpXzR2X2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLCBzaXplX3Qgc3osIGludCBkaXJlY3Rpb24pCitzdGF0aWMgdm9pZCBkbWFfNHZfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwKKwkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCS8qIE5vdGhpbmcgdG8gZG8uLi4gKi8KIH0KIAotc3RhdGljIHZvaWQgcGNpXzR2X2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIHZvaWQgZG1hXzR2X3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsCisJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCS8qIE5vdGhpbmcgdG8gZG8uLi4gKi8KIH0KIAotY29uc3Qgc3RydWN0IHBjaV9pb21tdV9vcHMgcGNpX3N1bjR2X2lvbW11X29wcyA9IHsKLQkuYWxsb2NfY29uc2lzdGVudAkJPSBwY2lfNHZfYWxsb2NfY29uc2lzdGVudCwKLQkuZnJlZV9jb25zaXN0ZW50CQk9IHBjaV80dl9mcmVlX2NvbnNpc3RlbnQsCi0JLm1hcF9zaW5nbGUJCQk9IHBjaV80dl9tYXBfc2luZ2xlLAotCS51bm1hcF9zaW5nbGUJCQk9IHBjaV80dl91bm1hcF9zaW5nbGUsCi0JLm1hcF9zZwkJCQk9IHBjaV80dl9tYXBfc2csCi0JLnVubWFwX3NnCQkJPSBwY2lfNHZfdW5tYXBfc2csCi0JLmRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1CT0gcGNpXzR2X2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1LAotCS5kbWFfc3luY19zZ19mb3JfY3B1CQk9IHBjaV80dl9kbWFfc3luY19zZ19mb3JfY3B1LAorY29uc3Qgc3RydWN0IGRtYV9vcHMgc3VuNHZfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQJCQk9IGRtYV80dl9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAkJCT0gZG1hXzR2X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zaW5nbGUJCQk9IGRtYV80dl9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUJCQk9IGRtYV80dl91bm1hcF9zaW5nbGUsCisJLm1hcF9zZwkJCQk9IGRtYV80dl9tYXBfc2csCisJLnVubWFwX3NnCQkJPSBkbWFfNHZfdW5tYXBfc2csCisJLnN5bmNfc2luZ2xlX2Zvcl9jcHUJCT0gZG1hXzR2X3N5bmNfc2luZ2xlX2Zvcl9jcHUsCisJLnN5bmNfc2dfZm9yX2NwdQkJPSBkbWFfNHZfc3luY19zZ19mb3JfY3B1LAogfTsKIAogc3RhdGljIHZvaWQgcGNpX3N1bjR2X3NjYW5fYnVzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKQEAgLTExODYsNiArMTE5OCw4IEBACiAJCX0KIAkJcHJpbnRrKCJTVU40Vl9QQ0k6IFJlZ2lzdGVyZWQgaHZhcGkgbWFqb3JbJWx1XSBtaW5vclslbHVdXG4iLAogCQkgICAgICAgdnBjaV9tYWpvciwgdnBjaV9taW5vcik7CisKKwkJZG1hX29wcyA9ICZzdW40dl9kbWFfb3BzOwogCX0KIAogCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CkBAIC0xMjA2LDcgKzEyMjAsNyBAQAogCQlpZiAoIXBhZ2UpCiAJCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAotCQlwZXJfY3B1KHBjaV9pb21tdV9iYXRjaCwgaSkucGdsaXN0ID0gKHU2NCAqKSBwYWdlOworCQlwZXJfY3B1KGlvbW11X2JhdGNoLCBpKS5wZ2xpc3QgPSAodTY0ICopIHBhZ2U7CiAJfQogCiAJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvKSwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGZkNzg5OWIuLmNhN2NkZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCmluZGV4IGExZmQ5YmMuLmQxZmIxM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCkBAIC0yNiwxMSArMjYsNiBAQAogCiAjZGVmaW5lIE1BUF9CQVNFCSgodTMyKTB4YzAwMDAwMDApCiAKLXN0cnVjdCBzYnVzX2luZm8gewotCXN0cnVjdCBpb21tdQlpb21tdTsKLQlzdHJ1Y3Qgc3RyYnVmCXN0cmJ1ZjsKLX07Ci0KIC8qIE9mZnNldHMgZnJvbSBpb21tdV9yZWdzICovCiAjZGVmaW5lIFNZU0lPX0lPTU1VUkVHX0JBU0UJMHgyNDAwVUwKICNkZWZpbmUgSU9NTVVfQ09OVFJPTAkoMHgyNDAwVUwgLSAweDI0MDBVTCkJLyogSU9NTVUgY29udHJvbCByZWdpc3RlciAqLwpAQCAtNDQsMTkgKzM5LDYgQEAKIAogI2RlZmluZSBJT01NVV9EUkFNX1ZBTElECSgxVUwgPDwgMzBVTCkKIAotc3RhdGljIHZvaWQgX19pb21tdV9mbHVzaGFsbChzdHJ1Y3QgaW9tbXUgKmlvbW11KQotewotCXVuc2lnbmVkIGxvbmcgdGFnOwotCWludCBlbnRyeTsKLQotCXRhZyA9IGlvbW11LT5pb21tdV9jb250cm9sICsgKElPTU1VX1RBR0RJQUcgLSBJT01NVV9DT05UUk9MKTsKLQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCAxNjsgZW50cnkrKykgewotCQl1cGFfd3JpdGVxKDAsIHRhZyk7Ci0JCXRhZyArPSA4VUw7Ci0JfQotCXVwYV9yZWFkcShpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnKTsKLX0KLQogLyogT2Zmc2V0cyBmcm9tIHN0cmJ1Zl9yZWdzICovCiAjZGVmaW5lIFNZU0lPX1NUUkJVRlJFR19CQVNFCTB4MjgwMFVMCiAjZGVmaW5lIFNUUkJVRl9DT05UUk9MCSgweDI4MDBVTCAtIDB4MjgwMFVMKQkvKiBDb250cm9sICovCkBAIC02OSw1MTEgKzUxLDEwIEBACiAKICNkZWZpbmUgU1RSQlVGX1RBR19WQUxJRAkweDAyVUwKIAotc3RhdGljIHZvaWQgc2J1c19zdHJidWZfZmx1c2goc3RydWN0IGlvbW11ICppb21tdSwgc3RydWN0IHN0cmJ1ZiAqc3RyYnVmLCB1MzIgYmFzZSwgdW5zaWduZWQgbG9uZyBucGFnZXMsIGludCBkaXJlY3Rpb24pCi17Ci0JdW5zaWduZWQgbG9uZyBuOwotCWludCBsaW1pdDsKLQotCW4gPSBucGFnZXM7Ci0Jd2hpbGUgKG4tLSkKLQkJdXBhX3dyaXRlcShiYXNlICsgKG4gPDwgSU9fUEFHRV9TSElGVCksIHN0cmJ1Zi0+c3RyYnVmX3BmbHVzaCk7Ci0KLQkvKiBJZiB0aGUgZGV2aWNlIGNvdWxkIG5vdCBoYXZlIHBvc3NpYmx5IHB1dCBkaXJ0eSBkYXRhIGludG8KLQkgKiB0aGUgc3RyZWFtaW5nIGNhY2hlLCBubyBmbHVzaC1mbGFnIHN5bmNocm9uaXphdGlvbiBuZWVkcwotCSAqIHRvIGJlIHBlcmZvcm1lZC4KLQkgKi8KLQlpZiAoZGlyZWN0aW9uID09IFNCVVNfRE1BX1RPREVWSUNFKQotCQlyZXR1cm47Ci0KLQkqKHN0cmJ1Zi0+c3RyYnVmX2ZsdXNoZmxhZykgPSAwVUw7Ci0KLQkvKiBXaG9vcGVlIGN1c2hpb24hICovCi0JdXBhX3dyaXRlcShzdHJidWYtPnN0cmJ1Zl9mbHVzaGZsYWdfcGEsIHN0cmJ1Zi0+c3RyYnVmX2ZzeW5jKTsKLQl1cGFfcmVhZHEoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7Ci0KLQlsaW1pdCA9IDEwMDAwMDsKLQl3aGlsZSAoKihzdHJidWYtPnN0cmJ1Zl9mbHVzaGZsYWcpID09IDBVTCkgewotCQlsaW1pdC0tOwotCQlpZiAoIWxpbWl0KQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxKTsKLQkJcm1iKCk7Ci0JfQotCWlmICghbGltaXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInNidXNfc3RyYnVmX2ZsdXNoOiBmbHVzaGZsYWcgdGltZW91dCAiCi0JCSAgICAgICAidmFkZHJbJTA4eF0gbnBhZ2VzWyVsZF1cbiIsCi0JCSAgICAgICBiYXNlLCBucGFnZXMpOwotfQotCi0vKiBCYXNlZCBsYXJnZWx5IHVwb24gdGhlIHBwYzY0IGlvbW11IGFsbG9jYXRvci4gICovCi1zdGF0aWMgbG9uZyBzYnVzX2FyZW5hX2FsbG9jKHN0cnVjdCBpb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQotewotCXN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEgPSAmaW9tbXUtPmFyZW5hOwotCXVuc2lnbmVkIGxvbmcgbiwgaSwgc3RhcnQsIGVuZCwgbGltaXQ7Ci0JaW50IHBhc3M7Ci0KLQlsaW1pdCA9IGFyZW5hLT5saW1pdDsKLQlzdGFydCA9IGFyZW5hLT5oaW50OwotCXBhc3MgPSAwOwotCi1hZ2FpbjoKLQluID0gZmluZF9uZXh0X3plcm9fYml0KGFyZW5hLT5tYXAsIGxpbWl0LCBzdGFydCk7Ci0JZW5kID0gbiArIG5wYWdlczsKLQlpZiAodW5saWtlbHkoZW5kID49IGxpbWl0KSkgewotCQlpZiAobGlrZWx5KHBhc3MgPCAxKSkgewotCQkJbGltaXQgPSBzdGFydDsKLQkJCXN0YXJ0ID0gMDsKLQkJCV9faW9tbXVfZmx1c2hhbGwoaW9tbXUpOwotCQkJcGFzcysrOwotCQkJZ290byBhZ2FpbjsKLQkJfSBlbHNlIHsKLQkJCS8qIFNjYW5uZWQgdGhlIHdob2xlIHRoaW5nLCBnaXZlIHVwLiAqLwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JZm9yIChpID0gbjsgaSA8IGVuZDsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChpLCBhcmVuYS0+bWFwKSkgewotCQkJc3RhcnQgPSBpICsgMTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSBuOyBpIDwgZW5kOyBpKyspCi0JCV9fc2V0X2JpdChpLCBhcmVuYS0+bWFwKTsKLQotCWFyZW5hLT5oaW50ID0gZW5kOwotCi0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB2b2lkIHNidXNfYXJlbmFfZnJlZShzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQotewotCXVuc2lnbmVkIGxvbmcgaTsKLQotCWZvciAoaSA9IGJhc2U7IGkgPCAoYmFzZSArIG5wYWdlcyk7IGkrKykKLQkJX19jbGVhcl9iaXQoaSwgYXJlbmEtPm1hcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNidXNfaW9tbXVfdGFibGVfaW5pdChzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBpbnQgdHNic2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRzYmJhc2UsIG9yZGVyLCBzeiwgbnVtX3RzYl9lbnRyaWVzOwotCi0JbnVtX3RzYl9lbnRyaWVzID0gdHNic2l6ZSAvIHNpemVvZihpb3B0ZV90KTsKLQotCS8qIFNldHVwIGluaXRpYWwgc29mdHdhcmUgSU9NTVUgc3RhdGUuICovCi0Jc3Bpbl9sb2NrX2luaXQoJmlvbW11LT5sb2NrKTsKLQlpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSA9IE1BUF9CQVNFOwotCi0JLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGZyZWUgYXJlYSBtYXAuICAqLwotCXN6ID0gbnVtX3RzYl9lbnRyaWVzIC8gODsKLQlzeiA9IChzeiArIDdVTCkgJiB+N1VMOwotCWlvbW11LT5hcmVuYS5tYXAgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlvbW11LT5hcmVuYS5tYXApIHsKLQkJcHJvbV9wcmludGYoIlNCVVNfSU9NTVU6IEVycm9yLCBrbWFsbG9jKGFyZW5hLm1hcCkgZmFpbGVkLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KLQlpb21tdS0+YXJlbmEubGltaXQgPSBudW1fdHNiX2VudHJpZXM7Ci0KLQkvKiBOb3cgYWxsb2NhdGUgYW5kIHNldHVwIHRoZSBJT01NVSBwYWdlIHRhYmxlIGl0c2VsZi4gICovCi0Jb3JkZXIgPSBnZXRfb3JkZXIodHNic2l6ZSk7Ci0JdHNiYmFzZSA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOwotCWlmICghdHNiYmFzZSkgewotCQlwcm9tX3ByaW50ZigiSU9NTVU6IEVycm9yLCBnZnAodHNiKSBmYWlsZWQuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCWlvbW11LT5wYWdlX3RhYmxlID0gKGlvcHRlX3QgKil0c2JiYXNlOwotCW1lbXNldChpb21tdS0+cGFnZV90YWJsZSwgMCwgdHNic2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW9wdGVfdCAqYWxsb2NfbnBhZ2VzKHN0cnVjdCBpb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQotewotCWxvbmcgZW50cnk7Ci0KLQllbnRyeSA9IHNidXNfYXJlbmFfYWxsb2MoaW9tbXUsIG5wYWdlcyk7Ci0JaWYgKHVubGlrZWx5KGVudHJ5IDwgMCkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGlvbW11LT5wYWdlX3RhYmxlICsgZW50cnk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX25wYWdlcyhzdHJ1Y3QgaW9tbXUgKmlvbW11LCBkbWFfYWRkcl90IGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQotewotCXNidXNfYXJlbmFfZnJlZSgmaW9tbXUtPmFyZW5hLCBiYXNlID4+IElPX1BBR0VfU0hJRlQsIG5wYWdlcyk7Ci19Ci0KLXZvaWQgKnNidXNfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkdm1hX2FkZHIpCi17Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11OwotCWlvcHRlX3QgKmlvcHRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yZGVyLCBmaXJzdF9wYWdlOwotCXZvaWQgKnJldDsKLQlpbnQgbnBhZ2VzOwotCi0Jc2l6ZSA9IElPX1BBR0VfQUxJR04oc2l6ZSk7Ci0Jb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JaWYgKG9yZGVyID49IDEwKQotCQlyZXR1cm4gTlVMTDsKLQotCWZpcnN0X3BhZ2UgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfQ09NUCwgb3JkZXIpOwotCWlmIChmaXJzdF9wYWdlID09IDBVTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KChjaGFyICopZmlyc3RfcGFnZSwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKLQotCWluZm8gPSBzZGV2LT5idXMtPmlvbW11OwotCWlvbW11ID0gJmluZm8tPmlvbW11OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JaW9wdGUgPSBhbGxvY19ucGFnZXMoaW9tbXUsIHNpemUgPj4gSU9fUEFHRV9TSElGVCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh1bmxpa2VseShpb3B0ZSA9PSBOVUxMKSkgewotCQlmcmVlX3BhZ2VzKGZpcnN0X3BhZ2UsIG9yZGVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JKmR2bWFfYWRkciA9IChpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSArCi0JCSAgICAgICgoaW9wdGUgLSBpb21tdS0+cGFnZV90YWJsZSkgPDwgSU9fUEFHRV9TSElGVCkpOwotCXJldCA9ICh2b2lkICopIGZpcnN0X3BhZ2U7Ci0JbnBhZ2VzID0gc2l6ZSA+PiBJT19QQUdFX1NISUZUOwotCWZpcnN0X3BhZ2UgPSBfX3BhKGZpcnN0X3BhZ2UpOwotCXdoaWxlIChucGFnZXMtLSkgewotCQlpb3B0ZV92YWwoKmlvcHRlKSA9IChJT1BURV9WQUxJRCB8IElPUFRFX0NBQ0hFIHwKLQkJCQkgICAgIElPUFRFX1dSSVRFIHwKLQkJCQkgICAgIChmaXJzdF9wYWdlICYgSU9QVEVfUEFHRSkpOwotCQlpb3B0ZSsrOwotCQlmaXJzdF9wYWdlICs9IElPX1BBR0VfU0laRTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHNidXNfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdSwgZG1hX2FkZHJfdCBkdm1hKQotewotCXN0cnVjdCBzYnVzX2luZm8gKmluZm87Ci0Jc3RydWN0IGlvbW11ICppb21tdTsKLQlpb3B0ZV90ICppb3B0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBvcmRlciwgbnBhZ2VzOwotCi0JbnBhZ2VzID0gSU9fUEFHRV9BTElHTihzaXplKSA+PiBJT19QQUdFX1NISUZUOwotCWluZm8gPSBzZGV2LT5idXMtPmlvbW11OwotCWlvbW11ID0gJmluZm8tPmlvbW11OwotCWlvcHRlID0gaW9tbXUtPnBhZ2VfdGFibGUgKwotCQkoKGR2bWEgLSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSkgPj4gSU9fUEFHRV9TSElGVCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCWZyZWVfbnBhZ2VzKGlvbW11LCBkdm1hIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UsIG5wYWdlcyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0Jb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JaWYgKG9yZGVyIDwgMTApCi0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpY3B1LCBvcmRlcik7Ci19Ci0KLWRtYV9hZGRyX3Qgc2J1c19tYXBfc2luZ2xlKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc3osIGludCBkaXJlY3Rpb24pCi17Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11OwotCWlvcHRlX3QgKmJhc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgbnBhZ2VzLCBvYWRkcjsKLQl1bnNpZ25lZCBsb25nIGksIGJhc2VfcGFkZHI7Ci0JdTMyIGJ1c19hZGRyLCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBpb3B0ZV9wcm90ZWN0aW9uOwotCi0JaW5mbyA9IHNkZXYtPmJ1cy0+aW9tbXU7Ci0JaW9tbXUgPSAmaW5mby0+aW9tbXU7Ci0KLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFNCVVNfRE1BX05PTkUpKQotCQlCVUcoKTsKLQotCW9hZGRyID0gKHVuc2lnbmVkIGxvbmcpcHRyOwotCW5wYWdlcyA9IElPX1BBR0VfQUxJR04ob2FkZHIgKyBzeikgLSAob2FkZHIgJiBJT19QQUdFX01BU0spOwotCW5wYWdlcyA+Pj0gSU9fUEFHRV9TSElGVDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCWJhc2UgPSBhbGxvY19ucGFnZXMoaW9tbXUsIG5wYWdlcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh1bmxpa2VseSghYmFzZSkpCi0JCUJVRygpOwotCi0JYnVzX2FkZHIgPSAoaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UgKwotCQkgICAgKChiYXNlIC0gaW9tbXUtPnBhZ2VfdGFibGUpIDw8IElPX1BBR0VfU0hJRlQpKTsKLQlyZXQgPSBidXNfYWRkciB8IChvYWRkciAmIH5JT19QQUdFX01BU0spOwotCWJhc2VfcGFkZHIgPSBfX3BhKG9hZGRyICYgSU9fUEFHRV9NQVNLKTsKLQotCWlvcHRlX3Byb3RlY3Rpb24gPSBJT1BURV9WQUxJRCB8IElPUFRFX1NUQlVGIHwgSU9QVEVfQ0FDSEU7Ci0JaWYgKGRpcmVjdGlvbiAhPSBTQlVTX0RNQV9UT0RFVklDRSkKLQkJaW9wdGVfcHJvdGVjdGlvbiB8PSBJT1BURV9XUklURTsKLQotCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKywgYmFzZSsrLCBiYXNlX3BhZGRyICs9IElPX1BBR0VfU0laRSkKLQkJaW9wdGVfdmFsKCpiYXNlKSA9IGlvcHRlX3Byb3RlY3Rpb24gfCBiYXNlX3BhZGRyOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBzYnVzX3VubWFwX3NpbmdsZShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKLXsKLQlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gJmluZm8tPmlvbW11OwotCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZiA9ICZpbmZvLT5zdHJidWY7Ci0JaW9wdGVfdCAqYmFzZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIGk7Ci0KLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFNCVVNfRE1BX05PTkUpKQotCQlCVUcoKTsKLQotCW5wYWdlcyA9IElPX1BBR0VfQUxJR04oYnVzX2FkZHIgKyBzeikgLSAoYnVzX2FkZHIgJiBJT19QQUdFX01BU0spOwotCW5wYWdlcyA+Pj0gSU9fUEFHRV9TSElGVDsKLQliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKwotCQkoKGJ1c19hZGRyIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UpID4+IElPX1BBR0VfU0hJRlQpOwotCi0JYnVzX2FkZHIgJj0gSU9fUEFHRV9NQVNLOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jc2J1c19zdHJidWZfZmx1c2goaW9tbXUsIHN0cmJ1ZiwgYnVzX2FkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspCi0JCWlvcHRlX3ZhbChiYXNlW2ldKSA9IDBVTDsKLQlmcmVlX25wYWdlcyhpb21tdSwgYnVzX2FkZHIgLSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSwgbnBhZ2VzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotfQotCi0jZGVmaW5lIFNHX0VOVF9QSFlTX0FERFJFU1MoU0cpCVwKLQkoX19wYShwYWdlX2FkZHJlc3MoKFNHKS0+cGFnZSkpICsgKFNHKS0+b2Zmc2V0KQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9zZyhpb3B0ZV90ICppb3B0ZSwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgIGludCBudXNlZCwgaW50IG5lbGVtcywgdW5zaWduZWQgbG9uZyBpb3B0ZV9wcm90ZWN0aW9uKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCAqZG1hX3NnID0gc2c7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19lbmQgPSBzZyArIG5lbGVtczsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBudXNlZDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcHRldmFsID0gfjBVTDsKLQkJdTMyIGRtYV9ucGFnZXM7Ci0KLQkJZG1hX25wYWdlcyA9ICgoZG1hX3NnLT5kbWFfYWRkcmVzcyAmIChJT19QQUdFX1NJWkUgLSAxVUwpKSArCi0JCQkgICAgICBkbWFfc2ctPmRtYV9sZW5ndGggKwotCQkJICAgICAgKChJT19QQUdFX1NJWkUgLSAxVUwpKSkgPj4gSU9fUEFHRV9TSElGVDsKLQkJZG8gewotCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JCQlzaWduZWQgaW50IGxlbjsKLQotCQkJLyogSWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgd2UgaGF2ZSBhdCBsZWFzdCBvbmUKLQkJCSAqIG1vcmUgcGFnZSB0byBtYXAuICBTbyB3YWxrIGZvcndhcmQgdW50aWwgd2UKLQkJCSAqIGhpdCBhIHBhZ2UgY3Jvc3NpbmcsIGFuZCBiZWdpbiBjcmVhdGluZyBuZXcKLQkJCSAqIG1hcHBpbmdzIGZyb20gdGhhdCBzcG90LgotCQkJICovCi0JCQlmb3IgKDs7KSB7Ci0JCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQkJCQl0bXAgPSBTR19FTlRfUEhZU19BRERSRVNTKHNnKTsKLQkJCQlsZW4gPSBzZy0+bGVuZ3RoOwotCQkJCWlmICgoKHRtcCBeIHB0ZXZhbCkgPj4gSU9fUEFHRV9TSElGVCkgIT0gMFVMKSB7Ci0JCQkJCXB0ZXZhbCA9IHRtcCAmIElPX1BBR0VfTUFTSzsKLQkJCQkJb2Zmc2V0ID0gdG1wICYgKElPX1BBR0VfU0laRSAtIDFVTCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoKCh0bXAgXiAodG1wICsgbGVuIC0gMVVMKSkgPj4gSU9fUEFHRV9TSElGVCkgIT0gMFVMKSB7Ci0JCQkJCXB0ZXZhbCA9ICh0bXAgKyBJT19QQUdFX1NJWkUpICYgSU9fUEFHRV9NQVNLOwotCQkJCQlvZmZzZXQgPSAwVUw7Ci0JCQkJCWxlbiAtPSAoSU9fUEFHRV9TSVpFIC0gKHRtcCAmIChJT19QQUdFX1NJWkUgLSAxVUwpKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzZysrOwotCQkJfQotCi0JCQlwdGV2YWwgPSBpb3B0ZV9wcm90ZWN0aW9uIHwgKHB0ZXZhbCAmIElPUFRFX1BBR0UpOwotCQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCQkqaW9wdGUrKyA9IF9faW9wdGUocHRldmFsKTsKLQkJCQlwdGV2YWwgKz0gSU9fUEFHRV9TSVpFOwotCQkJCWxlbiAtPSAoSU9fUEFHRV9TSVpFIC0gb2Zmc2V0KTsKLQkJCQlvZmZzZXQgPSAwOwotCQkJCWRtYV9ucGFnZXMtLTsKLQkJCX0KLQotCQkJcHRldmFsID0gKHB0ZXZhbCAmIElPUFRFX1BBR0UpICsgbGVuOwotCQkJc2crKzsKLQotCQkJLyogU2tpcCBvdmVyIGFueSB0YWlsIG1hcHBpbmdzIHdlJ3ZlIGZ1bGx5IG1hcHBlZCwKLQkJCSAqIGFkanVzdGluZyBwdGV2YWwgYWxvbmcgdGhlIHdheS4gIFN0b3Agd2hlbiB3ZQotCQkJICogZGV0ZWN0IGEgcGFnZSBjcm9zc2luZyBldmVudC4KLQkJCSAqLwotCQkJd2hpbGUgKHNnIDwgc2dfZW5kICYmCi0JCQkgICAgICAgKHB0ZXZhbCA8PCAoNjQgLSBJT19QQUdFX1NISUZUKSkgIT0gMFVMICYmCi0JCQkgICAgICAgKHB0ZXZhbCA9PSBTR19FTlRfUEhZU19BRERSRVNTKHNnKSkgJiYKLQkJCSAgICAgICAoKHB0ZXZhbCBeCi0JCQkJIChTR19FTlRfUEhZU19BRERSRVNTKHNnKSArIHNnLT5sZW5ndGggLSAxVUwpKSA+PiBJT19QQUdFX1NISUZUKSA9PSAwVUwpIHsKLQkJCQlwdGV2YWwgKz0gc2ctPmxlbmd0aDsKLQkJCQlzZysrOwotCQkJfQotCQkJaWYgKChwdGV2YWwgPDwgKDY0IC0gSU9fUEFHRV9TSElGVCkpID09IDBVTCkKLQkJCQlwdGV2YWwgPSB+MFVMOwotCQl9IHdoaWxlIChkbWFfbnBhZ2VzICE9IDApOwotCQlkbWFfc2crKzsKLQl9Ci19Ci0KLWludCBzYnVzX21hcF9zZyhzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQotewotCXN0cnVjdCBzYnVzX2luZm8gKmluZm87Ci0Jc3RydWN0IGlvbW11ICppb21tdTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIGlvcHRlX3Byb3RlY3Rpb247Ci0JaW9wdGVfdCAqYmFzZTsKLQl1MzIgZG1hX2Jhc2U7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3RtcDsKLQlpbnQgdXNlZDsKLQotCS8qIEZhc3QgcGF0aCBzaW5nbGUgZW50cnkgc2NhdHRlcmxpc3RzLiAqLwotCWlmIChuZWxlbXMgPT0gMSkgewotCQlzZ2xpc3QtPmRtYV9hZGRyZXNzID0KLQkJCXNidXNfbWFwX3NpbmdsZShzZGV2LAotCQkJCQkocGFnZV9hZGRyZXNzKHNnbGlzdC0+cGFnZSkgKyBzZ2xpc3QtPm9mZnNldCksCi0JCQkJCXNnbGlzdC0+bGVuZ3RoLCBkaXJlY3Rpb24pOwotCQlzZ2xpc3QtPmRtYV9sZW5ndGggPSBzZ2xpc3QtPmxlbmd0aDsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaW5mbyA9IHNkZXYtPmJ1cy0+aW9tbXU7Ci0JaW9tbXUgPSAmaW5mby0+aW9tbXU7Ci0KLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFNCVVNfRE1BX05PTkUpKQotCQlCVUcoKTsKLQotCW5wYWdlcyA9IHByZXBhcmVfc2coc2dsaXN0LCBuZWxlbXMpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0JYmFzZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgbnBhZ2VzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHVubGlrZWx5KGJhc2UgPT0gTlVMTCkpCi0JCUJVRygpOwotCi0JZG1hX2Jhc2UgPSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSArCi0JCSgoYmFzZSAtIGlvbW11LT5wYWdlX3RhYmxlKSA8PCBJT19QQUdFX1NISUZUKTsKLQotCS8qIE5vcm1hbGl6ZSBEVk1BIGFkZHJlc3Nlcy4gKi8KLQl1c2VkID0gbmVsZW1zOwotCi0Jc2d0bXAgPSBzZ2xpc3Q7Ci0Jd2hpbGUgKHVzZWQgJiYgc2d0bXAtPmRtYV9sZW5ndGgpIHsKLQkJc2d0bXAtPmRtYV9hZGRyZXNzICs9IGRtYV9iYXNlOwotCQlzZ3RtcCsrOwotCQl1c2VkLS07Ci0JfQotCXVzZWQgPSBuZWxlbXMgLSB1c2VkOwotCi0JaW9wdGVfcHJvdGVjdGlvbiA9IElPUFRFX1ZBTElEIHwgSU9QVEVfU1RCVUYgfCBJT1BURV9DQUNIRTsKLQlpZiAoZGlyZWN0aW9uICE9IFNCVVNfRE1BX1RPREVWSUNFKQotCQlpb3B0ZV9wcm90ZWN0aW9uIHw9IElPUFRFX1dSSVRFOwotCi0JZmlsbF9zZyhiYXNlLCBzZ2xpc3QsIHVzZWQsIG5lbGVtcywgaW9wdGVfcHJvdGVjdGlvbik7Ci0KLSNpZmRlZiBWRVJJRllfU0cKLQl2ZXJpZnlfc2dsaXN0KHNnbGlzdCwgbmVsZW1zLCBiYXNlLCBucGFnZXMpOwotI2VuZGlmCi0KLQlyZXR1cm4gdXNlZDsKLX0KLQotdm9pZCBzYnVzX3VubWFwX3NnKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCi17Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11OwotCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKLQlpb3B0ZV90ICpiYXNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGksIG5wYWdlczsKLQl1MzIgYnVzX2FkZHI7Ci0KLQlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFNCVVNfRE1BX05PTkUpKQotCQlCVUcoKTsKLQotCWluZm8gPSBzZGV2LT5idXMtPmlvbW11OwotCWlvbW11ID0gJmluZm8tPmlvbW11OwotCXN0cmJ1ZiA9ICZpbmZvLT5zdHJidWY7Ci0KLQlidXNfYWRkciA9IHNnbGlzdC0+ZG1hX2FkZHJlc3MgJiBJT19QQUdFX01BU0s7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgbmVsZW1zOyBpKyspCi0JCWlmIChzZ2xpc3RbaV0uZG1hX2xlbmd0aCA9PSAwKQotCQkJYnJlYWs7Ci0JaS0tOwotCW5wYWdlcyA9IChJT19QQUdFX0FMSUdOKHNnbGlzdFtpXS5kbWFfYWRkcmVzcyArIHNnbGlzdFtpXS5kbWFfbGVuZ3RoKSAtCi0JCSAgYnVzX2FkZHIpID4+IElPX1BBR0VfU0hJRlQ7Ci0KLQliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKwotCQkoKGJ1c19hZGRyIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UpID4+IElPX1BBR0VfU0hJRlQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jc2J1c19zdHJidWZfZmx1c2goaW9tbXUsIHN0cmJ1ZiwgYnVzX2FkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspCi0JCWlvcHRlX3ZhbChiYXNlW2ldKSA9IDBVTDsKLQlmcmVlX25wYWdlcyhpb21tdSwgYnVzX2FkZHIgLSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSwgbnBhZ2VzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotfQotCi12b2lkIHNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLCBzaXplX3Qgc3osIGludCBkaXJlY3Rpb24pCi17Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11OwotCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXM7Ci0KLQlpbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKLQlpb21tdSA9ICZpbmZvLT5pb21tdTsKLQlzdHJidWYgPSAmaW5mby0+c3RyYnVmOwotCi0JbnBhZ2VzID0gSU9fUEFHRV9BTElHTihidXNfYWRkciArIHN6KSAtIChidXNfYWRkciAmIElPX1BBR0VfTUFTSyk7Ci0JbnBhZ2VzID4+PSBJT19QQUdFX1NISUZUOwotCWJ1c19hZGRyICY9IElPX1BBR0VfTUFTSzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwotCXNidXNfc3RyYnVmX2ZsdXNoKGlvbW11LCBzdHJidWYsIGJ1c19hZGRyLCBucGFnZXMsIGRpcmVjdGlvbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqc2RldiwgZG1hX2FkZHJfdCBiYXNlLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKLXsKLX0KLQotdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKLXsKLQlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvOwotCXN0cnVjdCBpb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHN0cmJ1ZiAqc3RyYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5wYWdlcywgaTsKLQl1MzIgYnVzX2FkZHI7Ci0KLQlpbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKLQlpb21tdSA9ICZpbmZvLT5pb21tdTsKLQlzdHJidWYgPSAmaW5mby0+c3RyYnVmOwotCi0JYnVzX2FkZHIgPSBzZ2xpc3RbMF0uZG1hX2FkZHJlc3MgJiBJT19QQUdFX01BU0s7Ci0JZm9yIChpID0gMDsgaSA8IG5lbGVtczsgaSsrKSB7Ci0JCWlmICghc2dsaXN0W2ldLmRtYV9sZW5ndGgpCi0JCQlicmVhazsKLQl9Ci0JaS0tOwotCW5wYWdlcyA9IChJT19QQUdFX0FMSUdOKHNnbGlzdFtpXS5kbWFfYWRkcmVzcyArIHNnbGlzdFtpXS5kbWFfbGVuZ3RoKQotCQkgIC0gYnVzX2FkZHIpID4+IElPX1BBR0VfU0hJRlQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgc3RyYnVmLCBidXNfYWRkciwgbnBhZ2VzLCBkaXJlY3Rpb24pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgc2J1c19kbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQotewotfQotCiAvKiBFbmFibGUgNjQtYml0IERWTUEgbW9kZSBmb3IgdGhlIGdpdmVuIGRldmljZS4gKi8KIHZvaWQgc2J1c19zZXRfc2J1czY0KHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IGJ1cnN0cykKIHsKLQlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gJmluZm8tPmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBzZGV2LT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7CiAJaW50IHNsb3QgPSBzZGV2LT5zbG90OwogCXVuc2lnbmVkIGxvbmcgY2ZnX3JlZzsKIAl1NjQgdmFsOwpAQCAtNzEzLDggKzE5NCw3IEBACiB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEodm9pZCAqYnVzY29va2llLCB1bnNpZ25lZCBpbnQgaW5vKQogewogCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyA9IChzdHJ1Y3Qgc2J1c19idXMgKilidXNjb29raWU7Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbyA9IHNidXMtPmlvbW11OwotCXN0cnVjdCBpb21tdSAqaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9IHNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwogCXVuc2lnbmVkIGxvbmcgaW1hcCwgaWNscjsKIAlpbnQgc2J1c19sZXZlbCA9IDA7CkBAIC03NzYsOCArMjU2LDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzeXNpb191ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbyA9IHNidXMtPmlvbW11OwotCXN0cnVjdCBpb21tdSAqaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9IHNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwogCXVuc2lnbmVkIGxvbmcgYWZzcl9yZWcsIGFmYXJfcmVnOwogCXVuc2lnbmVkIGxvbmcgYWZzciwgYWZhciwgZXJyb3JfYml0czsKQEAgLTg0OSw4ICszMjgsNyBAQAogc3RhdGljIGlycXJldHVybl90IHN5c2lvX2NlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyA9IGRldl9pZDsKLQlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvID0gc2J1cy0+aW9tbXU7Ci0Jc3RydWN0IGlvbW11ICppb21tdSA9ICZpbmZvLT5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWc7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwpAQCAtOTI3LDggKzQwNSw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3lzaW9fc2J1c19lcnJvcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNidXNfaW5mbyAqaW5mbyA9IHNidXMtPmlvbW11OwotCXN0cnVjdCBpb21tdSAqaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9IHNidXMtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGFmc3JfcmVnLCBhZmFyX3JlZywgcmVnX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwogCWludCByZXBvcnRlZDsKQEAgLTk5NSw4ICs0NzIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgc3lzaW9fcmVnaXN0ZXJfZXJyb3JfaGFuZGxlcnMoc3RydWN0IHNidXNfYnVzICpzYnVzKQogewotCXN0cnVjdCBzYnVzX2luZm8gKmluZm8gPSBzYnVzLT5pb21tdTsKLQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gJmluZm8tPmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyByZWdfYmFzZSA9IGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcgLSAweDIwMDBVTDsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXU2NCBjb250cm9sOwpAQCAtMTA0MSw3ICs1MTcsNiBAQAogewogCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCXN0cnVjdCBzYnVzX2luZm8gKmluZm87CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJdW5zaWduZWQgbG9uZyByZWdzLCByZWdfYmFzZTsKQEAgLTEwNTQsMjUgKzUyOSwyOCBAQAogCiAJcHIgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKIAlpZiAoIXByKSB7Ci0JCXByb21fcHJpbnRmKCJzYnVzX2lvbW11X2luaXQ6IENhbm5vdCBtYXAgU1lTSU8gY29udHJvbCByZWdpc3RlcnMuXG4iKTsKKwkJcHJvbV9wcmludGYoInNidXNfaW9tbXVfaW5pdDogQ2Fubm90IG1hcCBTWVNJTyAiCisJCQkgICAgImNvbnRyb2wgcmVnaXN0ZXJzLlxuIik7CiAJCXByb21faGFsdCgpOwogCX0KIAlyZWdzID0gcHItPnBoeXNfYWRkcjsKIAotCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmIChpbmZvID09IE5VTEwpIHsKLQkJcHJvbV9wcmludGYoInNidXNfaW9tbXVfaW5pdDogRmF0YWwgZXJyb3IsICIKLQkJCSAgICAia21hbGxvYyhpbmZvKSBmYWlsZWRcbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJaW9tbXUgPSBremFsbG9jKHNpemVvZigqaW9tbXUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWlvbW11KQorCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKKwlzdHJidWYgPSBremFsbG9jKHNpemVvZigqc3RyYnVmKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzdHJidWYpCisJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwogCi0JaW9tbXUgPSAmaW5mby0+aW9tbXU7Ci0Jc3RyYnVmID0gJmluZm8tPnN0cmJ1ZjsKKwlzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXUgPSBpb21tdTsKKwlzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuc3RjID0gc3RyYnVmOwogCiAJcmVnX2Jhc2UgPSByZWdzICsgU1lTSU9fSU9NTVVSRUdfQkFTRTsKIAlpb21tdS0+aW9tbXVfY29udHJvbCA9IHJlZ19iYXNlICsgSU9NTVVfQ09OVFJPTDsKIAlpb21tdS0+aW9tbXVfdHNiYmFzZSA9IHJlZ19iYXNlICsgSU9NTVVfVFNCQkFTRTsKIAlpb21tdS0+aW9tbXVfZmx1c2ggPSByZWdfYmFzZSArIElPTU1VX0ZMVVNIOworCWlvbW11LT5pb21tdV90YWdzID0gaW9tbXUtPmlvbW11X2NvbnRyb2wgKworCQkoSU9NTVVfVEFHRElBRyAtIElPTU1VX0NPTlRST0wpOwogCiAJcmVnX2Jhc2UgPSByZWdzICsgU1lTSU9fU1RSQlVGUkVHX0JBU0U7CiAJc3RyYnVmLT5zdHJidWZfY29udHJvbCA9IHJlZ19iYXNlICsgU1RSQlVGX0NPTlRST0w7CkBAIC0xMDkzLDE0ICs1NzEsMTIgQEAKIAkgKi8KIAlpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnID0gcmVncyArIDB4MjAwMFVMOwogCi0JLyogTGluayBpbnRvIFNZU0lPIHNvZnR3YXJlIHN0YXRlLiAqLwotCXNidXMtPmlvbW11ID0gaW5mbzsKLQogCXByaW50aygiU1lTSU86IFVQQSBwb3J0SUQgJXgsIGF0ICUwMTZseFxuIiwKIAkgICAgICAgc2J1cy0+cG9ydGlkLCByZWdzKTsKIAogCS8qIFNldHVwIGZvciBUU0JfU0laRT03LCBUQldfU0laRT0wLCBNTVVfREU9MSwgTU1VX0VOPTEgKi8KLQlzYnVzX2lvbW11X3RhYmxlX2luaXQoaW9tbXUsIElPX1RTQl9TSVpFKTsKKwlpZiAoaW9tbXVfdGFibGVfaW5pdChpb21tdSwgSU9fVFNCX1NJWkUsIE1BUF9CQVNFLCAweGZmZmZmZmZmKSkKKwkJZ290byBmYXRhbF9tZW1vcnlfZXJyb3I7CiAKIAljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5pb21tdV9jb250cm9sKTsKIAljb250cm9sID0gKCg3VUwgPDwgMTZVTCkJfApAQCAtMTE1Nyw2ICs2MzMsMTAgQEAKIAkJc3RhcmZpcmVfaG9va3VwKHNidXMtPnBvcnRpZCk7CiAKIAlzeXNpb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzYnVzKTsKKwlyZXR1cm47CisKK2ZhdGFsX21lbW9yeV9lcnJvcjoKKwlwcm9tX3ByaW50Zigic2J1c19pb21tdV9pbml0OiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOwogfQogCiB2b2lkIHNidXNfZmlsbF9kZXZpY2VfaXJxKHN0cnVjdCBzYnVzX2RldiAqc2RldikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggNDkwNjNjYS4uNjljYWQxYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKQEAgLTE0NjAsNiArMTQ2MCw3NCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAorc3RhdGljIHZvaWQgbW9zdGVrX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtc3RrNDh0MDJfcmVnczsKKwl1OCB0bXA7CisKKwlzcGluX2xvY2tfaXJxKCZtb3N0ZWtfbG9jayk7CisKKwl0bXAgPSBtb3N0ZWtfcmVhZChyZWdzICsgTU9TVEVLX0NSRUcpOworCXRtcCB8PSBNU1RLX0NSRUdfUkVBRDsKKwltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOworCisJcnRjX3RtLT50bV9zZWMgPSBNU1RLX1JFR19TRUMocmVncyk7CisJcnRjX3RtLT50bV9taW4gPSBNU1RLX1JFR19NSU4ocmVncyk7CisJcnRjX3RtLT50bV9ob3VyID0gTVNUS19SRUdfSE9VUihyZWdzKTsKKwlydGNfdG0tPnRtX21kYXkgPSBNU1RLX1JFR19ET00ocmVncyk7CisJcnRjX3RtLT50bV9tb24gPSBNU1RLX1JFR19NT05USChyZWdzKTsKKwlydGNfdG0tPnRtX3llYXIgPSBNU1RLX0NWVF9ZRUFSKCBNU1RLX1JFR19ZRUFSKHJlZ3MpICk7CisJcnRjX3RtLT50bV93ZGF5ID0gTVNUS19SRUdfRE9XKHJlZ3MpOworCisJdG1wID0gbW9zdGVrX3JlYWQocmVncyArIE1PU1RFS19DUkVHKTsKKwl0bXAgJj0gfk1TVEtfQ1JFR19SRUFEOworCW1vc3Rla193cml0ZShyZWdzICsgTU9TVEVLX0NSRUcsIHRtcCk7CisKKwlzcGluX3VubG9ja19pcnEoJm1vc3Rla19sb2NrKTsKKworCXJ0Y190bS0+dG1fbW9uLS07CisJcnRjX3RtLT50bV93ZGF5LS07CisJcnRjX3RtLT50bV95ZWFyIC09IDE5MDA7Cit9CisKK3N0YXRpYyBpbnQgbW9zdGVrX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwl1bnNpZ25lZCBjaGFyIG1vbiwgZGF5LCBocnMsIG1pbiwgc2VjLCB3ZGF5OworCXZvaWQgX19pb21lbSAqcmVncyA9IG1zdGs0OHQwMl9yZWdzOworCXVuc2lnbmVkIGludCB5cnM7CisJdTggdG1wOworCisJeXJzID0gcnRjX3RtLT50bV95ZWFyICsgMTkwMDsKKwltb24gPSBydGNfdG0tPnRtX21vbiArIDE7CisJZGF5ID0gcnRjX3RtLT50bV9tZGF5OworCXdkYXkgPSBydGNfdG0tPnRtX3dkYXkgKyAxOworCWhycyA9IHJ0Y190bS0+dG1faG91cjsKKwltaW4gPSBydGNfdG0tPnRtX21pbjsKKwlzZWMgPSBydGNfdG0tPnRtX3NlYzsKKworCXNwaW5fbG9ja19pcnEoJm1vc3Rla19sb2NrKTsKKworCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7CisJdG1wIHw9IE1TVEtfQ1JFR19XUklURTsKKwltb3N0ZWtfd3JpdGUocmVncyArIE1PU1RFS19DUkVHLCB0bXApOworCisJTVNUS19TRVRfUkVHX1NFQyhyZWdzLCBzZWMpOworCU1TVEtfU0VUX1JFR19NSU4ocmVncywgbWluKTsKKwlNU1RLX1NFVF9SRUdfSE9VUihyZWdzLCBocnMpOworCU1TVEtfU0VUX1JFR19ET1cocmVncywgd2RheSk7CisJTVNUS19TRVRfUkVHX0RPTShyZWdzLCBkYXkpOworCU1TVEtfU0VUX1JFR19NT05USChyZWdzLCBtb24pOworCU1TVEtfU0VUX1JFR19ZRUFSKHJlZ3MsIHlycyAtIE1TVEtfWUVBUl9aRVJPKTsKKworCXRtcCA9IG1vc3Rla19yZWFkKHJlZ3MgKyBNT1NURUtfQ1JFRyk7CisJdG1wICY9IH5NU1RLX0NSRUdfV1JJVEU7CisJbW9zdGVrX3dyaXRlKHJlZ3MgKyBNT1NURUtfQ1JFRywgdG1wKTsKKworCXNwaW5fdW5sb2NrX2lycSgmbW9zdGVrX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBtaW5pX3J0Y19vcHMgewogCXZvaWQgKCpnZXRfcnRjX3RpbWUpKHN0cnVjdCBydGNfdGltZSAqKTsKIAlpbnQgKCpzZXRfcnRjX3RpbWUpKHN0cnVjdCBydGNfdGltZSAqKTsKQEAgLTE0ODcsNiArMTU1NSwxMSBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKK3N0YXRpYyBzdHJ1Y3QgbWluaV9ydGNfb3BzIG1vc3Rla19ydGNfb3BzID0geworCS5nZXRfcnRjX3RpbWUgPSBtb3N0ZWtfZ2V0X3J0Y190aW1lLAorCS5zZXRfcnRjX3RpbWUgPSBtb3N0ZWtfc2V0X3J0Y190aW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBtaW5pX3J0Y19vcHMgKm1pbmlfcnRjX29wczsKIAogc3RhdGljIGlubGluZSB2b2lkIG1pbmlfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKQEAgLTE2MTUsNiArMTY4OCw4IEBACiAJZWxzZSBpZiAoZHMxMjg3X3JlZ3MpCiAJCW1pbmlfcnRjX29wcyA9ICZjbW9zX3J0Y19vcHM7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCWVsc2UgaWYgKG1zdGs0OHQwMl9yZWdzKQorCQltaW5pX3J0Y19vcHMgPSAmbW9zdGVrX3J0Y19vcHM7CiAJZWxzZQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDZlZjJkMjkuLjZlZjQyYjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKQEAgLTIxMzQsMTIgKzIxMzQsMjAgQEAKIHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqX2tzcCkKIHsKIAl1bnNpZ25lZCBsb25nIHBjLCBmcCwgdGhyZWFkX2Jhc2UsIGtzcDsKLQl2b2lkICp0cCA9IHRhc2tfc3RhY2tfcGFnZSh0c2spOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CiAJc3RydWN0IHJlZ193aW5kb3cgKnJ3OwogCWludCBjb3VudCA9IDA7CiAKIAlrc3AgPSAodW5zaWduZWQgbG9uZykgX2tzcDsKLQorCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCXRwID0gdGFza190aHJlYWRfaW5mbyh0c2spOworCWlmIChrc3AgPT0gMFVMKSB7CisJCWlmICh0c2sgPT0gY3VycmVudCkKKwkJCWFzbSgibW92ICUlZnAsICUwIiA6ICI9ciIgKGtzcCkpOworCQllbHNlCisJCQlrc3AgPSB0cC0+a3NwOworCX0KIAlpZiAodHAgPT0gY3VycmVudF90aHJlYWRfaW5mbygpKQogCQlmbHVzaHdfYWxsKCk7CiAKQEAgLTIxNjgsMTEgKzIxNzYsNyBAQAogCiB2b2lkIGR1bXBfc3RhY2sodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nICprc3A7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92CSUlZnAsICUwIgotCQkJICAgICA6ICI9ciIgKGtzcCkpOwotCXNob3dfc3RhY2soY3VycmVudCwga3NwKTsKKwlzaG93X3N0YWNrKGN1cnJlbnQsIE5VTEwpOwogfQogCiBFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW9ocy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92aW9ocy5jCmluZGV4IDA5MTI2ZmMuLjcwOGZhMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvaHMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKQEAgLTcwMiw3ICs3MDIsNyBAQAogfQogRVhQT1JUX1NZTUJPTCh2aW9fc2VuZF9zaWQpOwogCi1leHRlcm4gaW50IHZpb19sZGNfYWxsb2Moc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKK2ludCB2aW9fbGRjX2FsbG9jKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCiAJCQkgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyAqYmFzZV9jZmcsCiAJCQkgdm9pZCAqZXZlbnRfYXJnKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDQ4MTg2MTcuLmI5ODJmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ1LDYgKzQ1LDggQEAKICAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CiAgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKIAorICBOT1RFUworCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwogICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogeyAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKaW5kZXggMTcxMjNlOS4uOWY3NzQwZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKQEAgLTExMiwxNSArMTEyLDEyIEBACiAKIHN0YXRpYyB2b2lkIGJhZF9rZXJuZWxfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyAqa3NwOwotCiAJcHJpbnRrKEtFUk5fQ1JJVCAiT09QUzogQm9ndXMga2VybmVsIFBDIFslMDE2bHhdIGluIGZhdWx0IGhhbmRsZXJcbiIsCiAJICAgICAgIHJlZ3MtPnRwYyk7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiT09QUzogUlBDIFslMDE2bHhdXG4iLCByZWdzLT51X3JlZ3NbMTVdKTsKIAlwcmludF9zeW1ib2woIlJQQzogPCVzPlxuIiwgcmVncy0+dV9yZWdzWzE1XSk7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiT09QUzogRmF1bHQgd2FzIHRvIHZhZGRyWyVseF1cbiIsIHZhZGRyKTsKLQlfX2FzbV9fKCJtb3YgJSVzcCwgJTAiIDogIj1yIiAoa3NwKSk7Ci0Jc2hvd19zdGFjayhjdXJyZW50LCBrc3ApOworCWR1bXBfc3RhY2soKTsKIAl1bmhhbmRsZWRfZmF1bHQocmVncy0+dHBjLCBjdXJyZW50LCByZWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKaW5kZXggNTQyYzllZi4uZDg3MDkwNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCkBAIC00OTksNyArNDk5LDcgQEAKIAkucmVtb3ZlCQk9IG1lbV9yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IG1lbV9tY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtZW1fbWNfaW5pdCh2b2lkKQogewogCWlmKGNhbl9kcm9wX21lbW9yeSgpKQogCQltY29uc29sZV9yZWdpc3Rlcl9kZXYoJm1lbV9tYyk7CkBAIC03OTgsNyArNzk4LDcgQEAKICAqLwogc3RhdGljIGNoYXIgKm5vdGlmeV9zb2NrZXQgPSBOVUxMOwogCi1zdGF0aWMgaW50IG1jb25zb2xlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG1jb25zb2xlX2luaXQodm9pZCkKIHsKIAkvKiBsb25nIHRvIGF2b2lkIHNpemUgbWlzbWF0Y2ggd2FybmluZ3MgZnJvbSBnY2MgKi8KIAlsb25nIHNvY2s7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKaW5kZXggZTQxYTA4ZjAuLjg2NzY2NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tbWFwcGVyX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+IAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+IAorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKaW5kZXggNzI3NzNkZC4uZDM1ZDBjMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKQEAgLTYyMyw3ICs2MjMsNyBAQAogCXJldHVybiBmb3VuZDsKIH0KIAotc3RhdGljIGludCBldGhfc2V0dXAoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgZXRoX3NldHVwKGNoYXIgKnN0cikKIHsKIAlzdHJ1Y3QgZXRoX2luaXQgKm5ldzsKIAljaGFyICplcnJvcjsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKaW5kZXggZmMyN2Y2Yy4uYWZmNjYxZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogIiAgICBDaGFuZ2UgdGhlIHViZCBkZXZpY2UgbmFtZSB0byBcImhkXCIuXG5cbiIKICk7CiAKLXN0YXRpYyB2b2lkIGRvX3ViZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpOworc3RhdGljIHZvaWQgZG9fdWJkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKTsKIAogLyogT25seSBjaGFuZ2VkIGJ5IHViZF9pbml0LCB3aGljaCBpcyBhbiBpbml0Y2FsbC4gKi8KIGludCB0aHJlYWRfZmQgPSAtMTsKQEAgLTEwODEsNyArMTA4MSw3IEBACiB9CiAKIC8qIENhbGxlZCB3aXRoIGRldi0+bG9jayBoZWxkICovCi1zdGF0aWMgdm9pZCBkb191YmRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBkb191YmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqaW9fcmVxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9leGVjLmMgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKaW5kZXggMzU2ZTUwZi4uY2U2ODI4ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2V4ZWMuYworKysgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSAibGludXgvc2xhYi5oIgogI2luY2x1ZGUgImxpbnV4L3NtcF9sb2NrLmgiCiAjaW5jbHVkZSAibGludXgvcHRyYWNlLmgiCisjaW5jbHVkZSAibGludXgvZnMuaCIKICNpbmNsdWRlICJhc20vcHRyYWNlLmgiCiAjaW5jbHVkZSAiYXNtL3BndGFibGUuaCIKICNpbmNsdWRlICJhc20vdGxiZmx1c2guaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMKaW5kZXggZDRmMWQxYS4uY2JhNTE2ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMKQEAgLTQsNiArNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImxpbnV4L21tLmgiCisjaW5jbHVkZSAibGludXgvZnMuaCIKICNpbmNsdWRlICJsaW51eC9tb2R1bGUuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgogI2luY2x1ZGUgImxpbnV4L2luaXRfdGFzay5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9tZW0uYwppbmRleCA3MmZmODU2Li5kMmIxMWYyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9tZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9tZW0uYwpAQCAtNjIsNyArNjIsNyBAQAogfQogI2VuZGlmCiAKLXZvaWQgbWVtX2luaXQodm9pZCkKK3ZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7CiAJLyogY2xlYXIgdGhlIHplcm8tcGFnZSAqLwogCW1lbXNldCgodm9pZCAqKSBlbXB0eV96ZXJvX3BhZ2UsIDAsIFBBR0VfU0laRSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKaW5kZXggM2JhNmU0Yy4uNWVlN2U4NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYwpAQCAtMjgsNyArMjgsOCBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHBoeXNtZW1fc2l6ZTsKIAotaW50IGluaXRfbWFwcyh1bnNpZ25lZCBsb25nIHBoeXNtZW0sIHVuc2lnbmVkIGxvbmcgaW9tZW0sIHVuc2lnbmVkIGxvbmcgaGlnaG1lbSkKK2ludCBfX2luaXQgaW5pdF9tYXBzKHVuc2lnbmVkIGxvbmcgcGh5c21lbSwgdW5zaWduZWQgbG9uZyBpb21lbSwKKwkJICAgICB1bnNpZ25lZCBsb25nIGhpZ2htZW0pCiB7CiAJc3RydWN0IHBhZ2UgKnAsICptYXA7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2xlbiwgcGh5c19wYWdlcywgaGlnaG1lbV9sZW4sIGhpZ2htZW1fcGFnZXM7CkBAIC00NywxMyArNDgsNyBAQAogCXRvdGFsX3BhZ2VzID0gcGh5c19wYWdlcyArIGlvbWVtX3BhZ2VzICsgaGlnaG1lbV9wYWdlczsKIAl0b3RhbF9sZW4gPSBwaHlzX2xlbiArIGlvbWVtX2xlbiArIGhpZ2htZW1fbGVuOwogCi0JaWYoa21hbGxvY19vayl7Ci0JCW1hcCA9IGttYWxsb2ModG90YWxfbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYobWFwID09IE5VTEwpCi0JCQltYXAgPSB2bWFsbG9jKHRvdGFsX2xlbik7Ci0JfQotCWVsc2UgbWFwID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXModG90YWxfbGVuKTsKLQorCW1hcCA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKHRvdGFsX2xlbik7CiAJaWYobWFwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC05OCw4ICs5Myw4IEBACiAKIGV4dGVybiBpbnQgX19zeXNjYWxsX3N0dWJfc3RhcnQ7CiAKLXZvaWQgc2V0dXBfcGh5c21lbSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHJlc2VydmVfZW5kLAotCQkgICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBsb25nIGhpZ2htZW0pCit2b2lkIF9faW5pdCBzZXR1cF9waHlzbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV9lbmQsCisJCQkgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGxvbmcgaGlnaG1lbSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlc2VydmUgPSByZXNlcnZlX2VuZCAtIHN0YXJ0OwogCWludCBwZm4gPSBQRk5fVVAoX19wYShyZXNlcnZlX2VuZCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYwppbmRleCAyYTY5YTdjLi40ODA1MWE5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIGV4dGVybiB2b2lkIHN0YXJ0X2tlcm5lbCh2b2lkKTsKIAotc3RhdGljIGludCBzdGFydF9rZXJuZWxfcHJvYyh2b2lkICp1bnVzZWQpCitzdGF0aWMgaW50IF9faW5pdCBzdGFydF9rZXJuZWxfcHJvYyh2b2lkICp1bnVzZWQpCiB7CiAJaW50IHBpZDsKIApAQCAtMTY1LDcgKzE2NSw3IEBACiAKIGV4dGVybiBjaGFyIGNwdTBfaXJxc3RhY2tbXTsKIAotaW50IHN0YXJ0X3VtbF9za2FzKHZvaWQpCitpbnQgX19pbml0IHN0YXJ0X3VtbF9za2FzKHZvaWQpCiB7CiAJc3RhY2tfcHJvdGVjdGlvbnMoKHVuc2lnbmVkIGxvbmcpICZjcHUwX2lycXN0YWNrKTsKIAlzZXRfc2lnc3RhY2soY3B1MF9pcnFzdGFjaywgVEhSRUFEX1NJWkUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jIGIvYXJjaC91bS9rZXJuZWwvc3lzY2FsbC5jCmluZGV4IDIzN2M0ZWEuLjdiM2I2NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAibGludXgvZmlsZS5oIgogI2luY2x1ZGUgImxpbnV4L3NtcF9sb2NrLmgiCiAjaW5jbHVkZSAibGludXgvbW0uaCIKKyNpbmNsdWRlICJsaW51eC9mcy5oIgogI2luY2x1ZGUgImxpbnV4L3V0c25hbWUuaCIKICNpbmNsdWRlICJsaW51eC9tc2cuaCIKICNpbmNsdWRlICJsaW51eC9zaG0uaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCmluZGV4IGIxMjZkZjQuLjU5MzQ4MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAibW9kZS5oIgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAKIHN0cnVjdCBhaW9fdGhyZWFkX3JlcSB7CiAJZW51bSBhaW9fdHlwZSB0eXBlOwpAQCAtNjUsNDcgKzY2LDMzIEBACiBzdGF0aWMgaW50IGRvX2FpbyhhaW9fY29udGV4dF90IGN0eCwgZW51bSBhaW9fdHlwZSB0eXBlLCBpbnQgZmQsIGNoYXIgKmJ1ZiwKIAkJICBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBzdHJ1Y3QgYWlvX2NvbnRleHQgKmFpbykKIHsKLQlzdHJ1Y3QgaW9jYiBpb2NiLCAqaW9jYnAgPSAmaW9jYjsKKwlzdHJ1Y3QgaW9jYiAqaW9jYnAgPSAmICgoc3RydWN0IGlvY2IpIHsKKwkJCQkgICAgLmFpb19kYXRhICAgICAgID0gKHVuc2lnbmVkIGxvbmcpIGFpbywKKwkJCQkgICAgLmFpb19maWxkZXMgICAgID0gZmQsCisJCQkJICAgIC5haW9fYnVmICAgICAgICA9ICh1bnNpZ25lZCBsb25nKSBidWYsCisJCQkJICAgIC5haW9fbmJ5dGVzICAgICA9IGxlbiwKKwkJCQkgICAgLmFpb19vZmZzZXQgICAgID0gb2Zmc2V0CisJCQkgICAgIH0pOwogCWNoYXIgYzsKLQlpbnQgZXJyOwogCi0JaW9jYiA9ICgoc3RydWN0IGlvY2IpIHsgLmFpb19kYXRhIAk9ICh1bnNpZ25lZCBsb25nKSBhaW8sCi0JCQkJLmFpb19yZXFwcmlvCT0gMCwKLQkJCQkuYWlvX2ZpbGRlcwk9IGZkLAotCQkJCS5haW9fYnVmCT0gKHVuc2lnbmVkIGxvbmcpIGJ1ZiwKLQkJCQkuYWlvX25ieXRlcwk9IGxlbiwKLQkJCQkuYWlvX29mZnNldAk9IG9mZnNldCwKLQkJCQkuYWlvX3Jlc2VydmVkMQk9IDAsCi0JCQkJLmFpb19yZXNlcnZlZDIJPSAwLAotCQkJCS5haW9fcmVzZXJ2ZWQzCT0gMCB9KTsKLQotCXN3aXRjaCh0eXBlKXsKKwlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFJT19SRUFEOgotCQlpb2NiLmFpb19saW9fb3Bjb2RlID0gSU9DQl9DTURfUFJFQUQ7Ci0JCWVyciA9IGlvX3N1Ym1pdChjdHgsIDEsICZpb2NicCk7CisJCWlvY2JwLT5haW9fbGlvX29wY29kZSA9IElPQ0JfQ01EX1BSRUFEOwogCQlicmVhazsKIAljYXNlIEFJT19XUklURToKLQkJaW9jYi5haW9fbGlvX29wY29kZSA9IElPQ0JfQ01EX1BXUklURTsKLQkJZXJyID0gaW9fc3VibWl0KGN0eCwgMSwgJmlvY2JwKTsKKwkJaW9jYnAtPmFpb19saW9fb3Bjb2RlID0gSU9DQl9DTURfUFdSSVRFOwogCQlicmVhazsKIAljYXNlIEFJT19NTUFQOgotCQlpb2NiLmFpb19saW9fb3Bjb2RlID0gSU9DQl9DTURfUFJFQUQ7Ci0JCWlvY2IuYWlvX2J1ZiA9ICh1bnNpZ25lZCBsb25nKSAmYzsKLQkJaW9jYi5haW9fbmJ5dGVzID0gc2l6ZW9mKGMpOwotCQllcnIgPSBpb19zdWJtaXQoY3R4LCAxLCAmaW9jYnApOworCQlpb2NicC0+YWlvX2xpb19vcGNvZGUgPSBJT0NCX0NNRF9QUkVBRDsKKwkJaW9jYnAtPmFpb19idWYgPSAodW5zaWduZWQgbG9uZykgJmM7CisJCWlvY2JwLT5haW9fbmJ5dGVzID0gc2l6ZW9mKGMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIkJvZ3VzIG9wIGluIGRvX2FpbyAtICVkXG4iLCB0eXBlKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJYnJlYWs7CisJCXByaW50ayhVTV9LRVJOX0VSUiAiQm9ndXMgb3AgaW4gZG9fYWlvIC0gJWRcbiIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZihlcnIgPiAwKQotCQllcnIgPSAwOwotCWVsc2UKLQkJZXJyID0gLWVycm5vOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gKGlvX3N1Ym1pdChjdHgsIDEsICZpb2NicCkgPiAwKSA/IDAgOiAtZXJybm87CiB9CiAKIC8qIEluaXRpYWxpemVkIGluIGFuIGluaXRjYWxsIGFuZCB1bmNoYW5nZWQgdGhlcmVhZnRlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwppbmRleCAyZDlkMmNhLi5lOWMxNDMyIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAjZGVmaW5lIE1BRFZfUkVNT1ZFIEtFUk5FTF9NQURWX1JFTU9WRQogI2VuZGlmCiAKLWludCBfX2luaXQgb3NfZHJvcF9tZW1vcnkodm9pZCAqYWRkciwgaW50IGxlbmd0aCkKK2ludCBvc19kcm9wX21lbW9yeSh2b2lkICphZGRyLCBpbnQgbGVuZ3RoKQogewogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMgYi9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCmluZGV4IDQxOWIyZDUuLjRjMzdiMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwpAQCAtMTksMTAgKzE5LDcgQEAKIGV4dGVybiB2b2lkICptZW1zZXQodm9pZCAqLCBpbnQsIHNpemVfdCk7CiBleHRlcm4gaW50IHByaW50Zihjb25zdCBjaGFyICosIC4uLik7CiAKLS8qIElmIHRoZXkncmUgbm90IGRlZmluZWQsIHRoZSBleHBvcnQgaXMgaW5jbHVkZWQgaW4gbGliL3N0cmluZy5jLiovCi0jaWZkZWYgX19IQVZFX0FSQ0hfU1RSTEVOCi1FWFBPUlRfU1lNQk9MKHN0cmxlbik7Ci0jZW5kaWYKKy8qIElmIGl0J3Mgbm90IGRlZmluZWQsIHRoZSBleHBvcnQgaXMgaW5jbHVkZWQgaW4gbGliL3N0cmluZy5jLiovCiAjaWZkZWYgX19IQVZFX0FSQ0hfU1RSU1RSCiBFWFBPUlRfU1lNQk9MKHN0cnN0cik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCmluZGV4IDA5ODcyMGIuLmQ2YjNlY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogb2JqLSQoQ09ORklHX01PREVfU0tBUykgKz0gc3R1Yi5vIHN0dWJfc2Vndi5vCiAKLXN1YmFyY2gtb2JqLXkgPSBsaWIvYml0b3BzLm8gbGliL3NlbWFwaG9yZS5vCitzdWJhcmNoLW9iai15ID0gbGliL2JpdG9wcy5vIGxpYi9zZW1hcGhvcmUubyBsaWIvc3RyaW5nLm8KIHN1YmFyY2gtb2JqLSQoQ09ORklHX0hJR0hNRU0pICs9IG1tL2hpZ2htZW0ubwogc3ViYXJjaC1vYmotJChDT05GSUdfTU9EVUxFUykgKz0ga2VybmVsL21vZHVsZS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnCmluZGV4IDQ1ZjgyYWUuLmZmYTAzNjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZwpAQCAtNzY1LDYgKzc2NSw5IEBACiAJZGVwZW5kcyBvbiBJQTMyX0VNVUxBVElPTgogCWRlZmF1bHQgeQogCitjb25maWcgQ09NUEFUX0ZPUl9VNjRfQUxJR05NRU5UCisJZGVmX2Jvb2wgQ09NUEFUCisKIGNvbmZpZyBTWVNWSVBDX0NPTVBBVAogCWJvb2wKIAlkZXBlbmRzIG9uIENPTVBBVCAmJiBTWVNWSVBDCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9kZWZjb25maWcgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKaW5kZXggYjdjNGNkMC4uZTY0ZjY1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvZGVmY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L2RlZmNvbmZpZwpAQCAtMTk5LDcgKzE5OSw3IEBACiBDT05GSUdfUE09eQogIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19TT0ZUV0FSRV9TVVNQRU5EPXkKK0NPTkZJR19ISUJFUk5BVElPTj15CiBDT05GSUdfUE1fU1REX1BBUlRJVElPTj0iIgogQ09ORklHX1NVU1BFTkRfU01QPXkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2JpbmZtdC5jIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2JpbmZtdC5jCmluZGV4IGI3MGYzZTcuLmRmZmQyYWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9iaW5mbXQuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYmluZm10LmMKQEAgLTQxLDggKzQxLDkgQEAKICN1bmRlZiBBUkNIX0RMSU5GTwogI2RlZmluZSBBUkNIX0RMSU5GTyBkbyB7ICBcCiAJaWYgKHN5c2N0bF92c3lzY2FsbDMyKSB7IFwKLQlORVdfQVVYX0VOVChBVF9TWVNJTkZPLCAodTMyKSh1NjQpVlNZU0NBTEwzMl9WU1lTQ0FMTCk7IFwKLQlORVdfQVVYX0VOVChBVF9TWVNJTkZPX0VIRFIsIFZTWVNDQUxMMzJfQkFTRSk7ICAgIFwKKwkJY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9ICh2b2lkICopVlNZU0NBTEwzMl9CQVNFOwlcCisJCU5FV19BVVhfRU5UKEFUX1NZU0lORk8sICh1MzIpKHU2NClWU1lTQ0FMTDMyX1ZTWVNDQUxMKTsgXAorCQlORVdfQVVYX0VOVChBVF9TWVNJTkZPX0VIRFIsIFZTWVNDQUxMMzJfQkFTRSk7ICAgIFwKIAl9CVwKIH0gd2hpbGUoMCkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jIGIvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCmluZGV4IDRkZTNhNTQzLi40YTIzM2FkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL3N5c2NhbGwzMi5jIGIvYXJjaC94ODZfNjQvaWEzMi9zeXNjYWxsMzIuYwppbmRleCBmYzQ0MTlmLi4xNTAxM2JhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3N5c2NhbGwzMi5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvc3lzY2FsbDMyLmMKQEAgLTQ5LDE0ICs0OSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotY29uc3QgY2hhciAqYXJjaF92bWFfbmFtZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlpZiAodm1hLT52bV9zdGFydCA9PSBWU1lTQ0FMTDMyX0JBU0UgJiYKLQkgICAgdm1hLT52bV9tbSAmJiB2bWEtPnZtX21tLT50YXNrX3NpemUgPT0gSUEzMl9QQUdFX09GRlNFVCkKLQkJcmV0dXJuICJbdmRzb10iOwotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5c2NhbGwzMih2b2lkKQogeyAKIAljaGFyICpzeXNjYWxsMzJfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDQ3ZjFkYzMuLmQxZDE4YzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIG9iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubyBjcmFzaC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfUE0pCQkrPSBzdXNwZW5kLm8KLW9iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzdXNwZW5kX2FzbS5vCitvYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IHN1c3BlbmRfYXNtLm8KIG9iai0kKENPTkZJR19DUFVfRlJFUSkJCSs9IGNwdWZyZXEvCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogb2JqLSQoQ09ORklHX0lPTU1VKQkJKz0gcGNpLWdhcnQubyBhcGVydHVyZS5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9zbGVlcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCA0Mjc3ZjJiLi43OTQ3NWQyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9zbGVlcC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3NsZWVwLmMKQEAgLTUxLDggKzUxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvdy1MZXZlbCBTbGVlcCBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKLQogLyogYWRkcmVzcyBpbiBsb3cgbWVtb3J5IG9mIHRoZSB3YWtldXAgcm91dGluZS4gKi8KIHVuc2lnbmVkIGxvbmcgYWNwaV93YWtldXBfYWRkcmVzcyA9IDA7CiB1bnNpZ25lZCBsb25nIGFjcGlfcmVhbG1vZGVfZmxhZ3M7CkBAIC0xMTcsOCArMTE1LDYgQEAKIAogX19zZXR1cCgiYWNwaV9zbGVlcD0iLCBhY3BpX3NsZWVwX3NldHVwKTsKIAotI2VuZGlmCQkJCS8qQ09ORklHX0FDUElfU0xFRVAgKi8KLQogdm9pZCBhY3BpX3BjaV9saW5rX2V4aXQodm9pZCkKIHsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGU3YWM2MjkuLjI4NDJmNTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3N1c3BlbmQuYwppbmRleCBlYTgzYTlmLi41NzNjMGE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiB9CiAKLSNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogLyogRGVmaW5lZCBpbiBhcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZF9hc20uUyAqLwogZXh0ZXJuIGludCByZXN0b3JlX2ltYWdlKHZvaWQpOwogCkBAIC0yMzYsNCArMjM2LDQgQEAKIAl1bnNpZ25lZCBsb25nIG5vc2F2ZV9lbmRfcGZuID0gUEFHRV9BTElHTihfX3BhX3N5bWJvbCgmX19ub3NhdmVfZW5kKSkgPj4gUEFHRV9TSElGVDsKIAlyZXR1cm4gKHBmbiA+PSBub3NhdmVfYmVnaW5fcGZuKSAmJiAocGZuIDwgbm9zYXZlX2VuZF9wZm4pOwogfQotI2VuZGlmIC8qIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EICovCisjZW5kaWYgLyogQ09ORklHX0hJQkVSTkFUSU9OICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3lzX3g4Nl82NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3N5c194ODZfNjQuYwppbmRleCBkMDY3ZDlhLi40NzcwYjdhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc3lzX3g4Nl82NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zeXNfeDg2XzY0LmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tc2cuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90Y2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90Y2UuYwppbmRleCAzYWVhZTJmLi44MjE1MjdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RjZS5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkKiBhbGxvY190Y2VfdGFibGUodm9pZCkKK3ZvaWQgKiBfX2luaXQgYWxsb2NfdGNlX3RhYmxlKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHNpemU7CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXJldHVybiBfX2FsbG9jX2Jvb3RtZW1fbG93KHNpemUsIHNpemUsIDApOwogfQogCi12b2lkIGZyZWVfdGNlX3RhYmxlKHZvaWQgKnRibCkKK3ZvaWQgX19pbml0IGZyZWVfdGNlX3RhYmxlKHZvaWQgKnRibCkKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RzYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RzYy5jCmluZGV4IDliNzZiMDMuLjJhNTliZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90c2MuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjLmMKQEAgLTExOCw4ICsxMTgsNiBAQAogCiAjZW5kaWYKIAotc3RhdGljIGludCB0c2NfdW5zdGFibGUgPSAwOwotCiAvKgogICogTWFrZSBhbiBlZHVjYXRlZCBndWVzcyBpZiB0aGUgVFNDIGlzIHRydXN0d29ydGh5IGFuZCBzeW5jaHJvbml6ZWQKICAqIG92ZXIgYWxsIENQVXMuCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9pbml0LmMgYi9hcmNoL3g4Nl82NC9tbS9pbml0LmMKaW5kZXggMzhmNWQ2My4uNDU4ODkzYiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gveDg2XzY0L21tL2luaXQuYwpAQCAtNjAwLDYgKzYwMCwxNiBAQAogewogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylfc3RleHQsIGVuZDsKIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCS8qIEl0IG11c3Qgc3RpbGwgYmUgcG9zc2libGUgdG8gYXBwbHkgU01QIGFsdGVybmF0aXZlcy4gKi8KKwlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpCisJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX2V0ZXh0OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfS1BST0JFUworCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX19zdGFydF9yb2RhdGE7CisjZW5kaWYKKwkKIAllbmQgPSAodW5zaWduZWQgbG9uZylfX2VuZF9yb2RhdGE7CiAJc3RhcnQgPSAoc3RhcnQgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKIAllbmQgJj0gUEFHRV9NQVNLOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvdmRzby92bWEuYyBiL2FyY2gveDg2XzY0L3Zkc28vdm1hLmMKaW5kZXggZDRjYjgzYS4uZmY5MzMzZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvdmRzby92bWEuYworKysgYi9hcmNoL3g4Nl82NC92ZHNvL3ZtYS5jCkBAIC00LDYgKzQsNyBAQAogICogU3ViamVjdCB0byB0aGUgR1BMLCB2LjIKICAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCBjYTJlZjRlLi4yNDg0ZTBlIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTQ5LDggKzQ5LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAotZW5kaWYgIyBCTE9DSwotCiBjb25maWcgQkxLX0RFVl9CU0cKIAlib29sICJCbG9jayBsYXllciBTRyBzdXBwb3J0IHY0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCkBAIC02NCw0ICs2Miw2IEBACiAJcHJvdG9jb2xzIChlLmcuIFRhc2sgTWFuYWdlbWVudCBGdW5jdGlvbnMgYW5kIFNNUCBpbiBTZXJpYWwKIAlBdHRhY2hlZCBTQ1NJKS4KIAorZW5kaWYgIyBCTE9DSworCiBzb3VyY2UgYmxvY2svS2NvbmZpZy5pb3NjaGVkCmRpZmYgLS1naXQgYS9ibG9jay9hcy1pb3NjaGVkLmMgYi9ibG9jay9hcy1pb3NjaGVkLmMKaW5kZXggM2UzMTZkZC4uZGM3MTVhNSAxMDA2NDQKLS0tIGEvYmxvY2svYXMtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2FzLWlvc2NoZWQuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAgKiBhc19jb21wbGV0ZWRfcmVxdWVzdCBpcyB0byBiZSBjYWxsZWQgd2hlbiBhIHJlcXVlc3QgaGFzIGNvbXBsZXRlZCBhbmQKICAqIHJldHVybmVkIHNvbWV0aGluZyB0byB0aGUgcmVxdWVzdGluZyBwcm9jZXNzLCBiZSBpdCBhbiBlcnJvciBvciBkYXRhLgogICovCi1zdGF0aWMgdm9pZCBhc19jb21wbGV0ZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGFzX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAKQEAgLTg1Myw3ICs4NTMsOCBAQAogICogcmVmZXJlbmNlIHVubGVzcyBpdCByZXBsYWNlcyB0aGUgcmVxdWVzdCBhdCBzb21lcGFydCBvZiB0aGUgZWxldmF0b3IKICAqIChpZS4gdGhlIGRpc3BhdGNoIHF1ZXVlKQogICovCi1zdGF0aWMgdm9pZCBhc19yZW1vdmVfcXVldWVkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBhc19yZW1vdmVfcXVldWVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJY29uc3QgaW50IGRhdGFfZGlyID0gcnFfaXNfc3luYyhycSk7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CkBAIC05NzgsNyArOTc5LDcgQEAKICAqIHJlYWQvd3JpdGUgZXhwaXJlLCBiYXRjaCBleHBpcmUsIGV0YywgYW5kIG1vdmVzIGl0IHRvIHRoZSBkaXNwYXRjaAogICogcXVldWUuIFJldHVybnMgMSBpZiBhIHJlcXVlc3Qgd2FzIGZvdW5kLCAwIG90aGVyd2lzZS4KICAqLwotc3RhdGljIGludCBhc19kaXNwYXRjaF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGZvcmNlKQorc3RhdGljIGludCBhc19kaXNwYXRjaF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJY29uc3QgaW50IHJlYWRzID0gIWxpc3RfZW1wdHkoJmFkLT5maWZvX2xpc3RbUkVRX1NZTkNdKTsKQEAgLTExMzksNyArMTE0MCw3IEBACiAvKgogICogYWRkIHJxIHRvIHJidHJlZSBhbmQgZmlmbwogICovCi1zdGF0aWMgdm9pZCBhc19hZGRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGFzX2FkZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJaW50IGRhdGFfZGlyOwpAQCAtMTE2Nyw3ICsxMTY4LDcgQEAKIAlSUV9TRVRfU1RBVEUocnEsIEFTX1JRX1FVRVVFRCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFzX2FjdGl2YXRlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBhc19hY3RpdmF0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJV0FSTl9PTihSUV9TVEFURShycSkgIT0gQVNfUlFfRElTUEFUQ0hFRCk7CiAJUlFfU0VUX1NUQVRFKHJxLCBBU19SUV9SRU1PVkVEKTsKQEAgLTExNzUsNyArMTE3Niw3IEBACiAJCWF0b21pY19kZWMoJlJRX0lPQyhycSktPmFpYy0+bnJfZGlzcGF0Y2hlZCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFzX2RlYWN0aXZhdGVfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGFzX2RlYWN0aXZhdGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCVdBUk5fT04oUlFfU1RBVEUocnEpICE9IEFTX1JRX1JFTU9WRUQpOwogCVJRX1NFVF9TVEFURShycSwgQVNfUlFfRElTUEFUQ0hFRCk7CkBAIC0xMTg5LDcgKzExOTAsNyBAQAogICogaXMgbm90IGVtcHR5IC0gaXQgaXMgdXNlZCBpbiB0aGUgYmxvY2sgbGF5ZXIgdG8gY2hlY2sgZm9yIHBsdWdnaW5nIGFuZAogICogbWVyZ2luZyBvcHBvcnR1bml0aWVzCiAgKi8KLXN0YXRpYyBpbnQgYXNfcXVldWVfZW1wdHkocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIGludCBhc19xdWV1ZV9lbXB0eShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIApAQCAtMTE5OCw3ICsxMTk5LDcgQEAKIH0KIAogc3RhdGljIGludAotYXNfbWVyZ2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqKnJlcSwgc3RydWN0IGJpbyAqYmlvKQorYXNfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc2VjdG9yX3QgcmJfa2V5ID0gYmlvLT5iaV9zZWN0b3IgKyBiaW9fc2VjdG9ycyhiaW8pOwpAQCAtMTIxNiw3ICsxMjE3LDggQEAKIAlyZXR1cm4gRUxFVkFUT1JfTk9fTUVSR0U7CiB9CiAKLXN0YXRpYyB2b2lkIGFzX21lcmdlZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBhc19tZXJnZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKKwkJCSAgICAgIGludCB0eXBlKQogewogCXN0cnVjdCBhc19kYXRhICphZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCkBAIC0xMjM0LDcgKzEyMzYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXNfbWVyZ2VkX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKK3N0YXRpYyB2b2lkIGFzX21lcmdlZF9yZXF1ZXN0cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKIAkJCSAJc3RydWN0IHJlcXVlc3QgKm5leHQpCiB7CiAJLyoKQEAgLTEyODUsNyArMTI4Nyw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgYXNfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQorc3RhdGljIGludCBhc19tYXlfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBydykKIHsKIAlpbnQgcmV0ID0gRUxWX01RVUVVRV9NQVk7CiAJc3RydWN0IGFzX2RhdGEgKmFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CkBAIC0xMzE4LDcgKzEzMjAsNyBAQAogLyoKICAqIGluaXRpYWxpemUgZWxldmF0b3IgcHJpdmF0ZSBkYXRhIChhc19kYXRhKS4KICAqLwotc3RhdGljIHZvaWQgKmFzX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgKmFzX2luaXRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IGFzX2RhdGEgKmFkOwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGt0cmFjZS5jIGIvYmxvY2svYmxrdHJhY2UuYwppbmRleCAzZjBlN2MzLi4yMGZhMDM0IDEwMDY0NAotLS0gYS9ibG9jay9ibGt0cmFjZS5jCisrKyBiL2Jsb2NrL2Jsa3RyYWNlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAkJY29uc3QgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCQl0LT5tYWdpYyA9IEJMS19JT19UUkFDRV9NQUdJQyB8IEJMS19JT19UUkFDRV9WRVJTSU9OOwotCQl0LT50aW1lID0gc2NoZWRfY2xvY2soKSAtIHBlcl9jcHUoYmxrX3RyYWNlX2NwdV9vZmZzZXQsIGNwdSk7CisJCXQtPnRpbWUgPSBjcHVfY2xvY2soY3B1KSAtIHBlcl9jcHUoYmxrX3RyYWNlX2NwdV9vZmZzZXQsIGNwdSk7CiAJCXQtPmRldmljZSA9IGJ0LT5kZXY7CiAJCXQtPmFjdGlvbiA9IGFjdGlvbjsKIAkJdC0+cGlkID0gcGlkOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKIAkJdC0+bWFnaWMgPSBCTEtfSU9fVFJBQ0VfTUFHSUMgfCBCTEtfSU9fVFJBQ0VfVkVSU0lPTjsKIAkJdC0+c2VxdWVuY2UgPSArKygqc2VxdWVuY2UpOwotCQl0LT50aW1lID0gc2NoZWRfY2xvY2soKSAtIHBlcl9jcHUoYmxrX3RyYWNlX2NwdV9vZmZzZXQsIGNwdSk7CisJCXQtPnRpbWUgPSBjcHVfY2xvY2soY3B1KSAtIHBlcl9jcHUoYmxrX3RyYWNlX2NwdV9vZmZzZXQsIGNwdSk7CiAJCXQtPnNlY3RvciA9IHNlY3RvcjsKIAkJdC0+Ynl0ZXMgPSBieXRlczsKIAkJdC0+YWN0aW9uID0gd2hhdDsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCWtmcmVlKGJ0KTsKIH0KIAotc3RhdGljIGludCBibGtfdHJhY2VfcmVtb3ZlKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyBpbnQgYmxrX3RyYWNlX3JlbW92ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpidDsKIApAQCAtMzEyLDcgKzMxMiw3IEBACiAvKgogICogU2V0dXAgZXZlcnl0aGluZyByZXF1aXJlZCB0byBzdGFydCB0cmFjaW5nCiAgKi8KLXN0YXRpYyBpbnQgYmxrX3RyYWNlX3NldHVwKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKK3N0YXRpYyBpbnQgYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJICAgY2hhciBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgYnV0czsKQEAgLTQwMSw3ICs0MDEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYmxrX3RyYWNlX3N0YXJ0c3RvcChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBzdGFydCkKK3N0YXRpYyBpbnQgYmxrX3RyYWNlX3N0YXJ0c3RvcChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHN0YXJ0KQogewogCXN0cnVjdCBibGtfdHJhY2UgKmJ0OwogCWludCByZXQ7CkBAIC00NDQsNyArNDQ0LDcgQEAKICAqKi8KIGludCBibGtfdHJhY2VfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgY21kLCBjaGFyIF9fdXNlciAqYXJnKQogewotCXJlcXVlc3RfcXVldWVfdCAqcTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAlpbnQgcmV0LCBzdGFydCA9IDA7CiAKIAlxID0gYmRldl9nZXRfcXVldWUoYmRldik7CkBAIC00NzksNyArNDc5LDcgQEAKICAqIEBxOiAgICB0aGUgcmVxdWVzdCBxdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQogICoKICAqKi8KLXZvaWQgYmxrX3RyYWNlX3NodXRkb3duKHJlcXVlc3RfcXVldWVfdCAqcSkKK3ZvaWQgYmxrX3RyYWNlX3NodXRkb3duKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWlmIChxLT5ibGtfdHJhY2UpIHsKIAkJYmxrX3RyYWNlX3N0YXJ0c3RvcChxLCAwKTsKQEAgLTQ4OCwxNyArNDg4LDE3IEBACiB9CiAKIC8qCi0gKiBBdmVyYWdlIG9mZnNldCBvdmVyIHR3byBjYWxscyB0byBzY2hlZF9jbG9jaygpIHdpdGggYSBnZXR0aW1lb2ZkYXkoKQorICogQXZlcmFnZSBvZmZzZXQgb3ZlciB0d28gY2FsbHMgdG8gY3B1X2Nsb2NrKCkgd2l0aCBhIGdldHRpbWVvZmRheSgpCiAgKiBpbiB0aGUgbWlkZGxlCiAgKi8KLXN0YXRpYyB2b2lkIGJsa19jaGVja190aW1lKHVuc2lnbmVkIGxvbmcgbG9uZyAqdCkKK3N0YXRpYyB2b2lkIGJsa19jaGVja190aW1lKHVuc2lnbmVkIGxvbmcgbG9uZyAqdCwgaW50IHRoaXNfY3B1KQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBhLCBiOwogCXN0cnVjdCB0aW1ldmFsIHR2OwogCi0JYSA9IHNjaGVkX2Nsb2NrKCk7CisJYSA9IGNwdV9jbG9jayh0aGlzX2NwdSk7CiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JYiA9IHNjaGVkX2Nsb2NrKCk7CisJYiA9IGNwdV9jbG9jayh0aGlzX2NwdSk7CiAKIAkqdCA9IHR2LnR2X3NlYyAqIDEwMDAwMDAwMDAgKyB0di50dl91c2VjICogMTAwMDsKIAkqdCAtPSAoYSArIGIpIC8gMjsKQEAgLTUxMCwxNiArNTEwLDE2IEBACiBzdGF0aWMgdm9pZCBibGtfdHJhY2VfY2hlY2tfY3B1X3RpbWUodm9pZCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgKnQ7Ci0JaW50IGNwdSA9IGdldF9jcHUoKTsKKwlpbnQgdGhpc19jcHUgPSBnZXRfY3B1KCk7CiAKLQl0ID0gJnBlcl9jcHUoYmxrX3RyYWNlX2NwdV9vZmZzZXQsIGNwdSk7CisJdCA9ICZwZXJfY3B1KGJsa190cmFjZV9jcHVfb2Zmc2V0LCB0aGlzX2NwdSk7CiAKIAkvKgogCSAqIEp1c3QgY2FsbCBpdCB0d2ljZSwgaG9wZWZ1bGx5IHRoZSBzZWNvbmQgY2FsbCB3aWxsIGJlIGNhY2hlIGhvdAogCSAqIGFuZCBhIGxpdHRsZSBtb3JlIHByZWNpc2UKIAkgKi8KLQlibGtfY2hlY2tfdGltZSh0KTsKLQlibGtfY2hlY2tfdGltZSh0KTsKKwlibGtfY2hlY2tfdGltZSh0LCB0aGlzX2NwdSk7CisJYmxrX2NoZWNrX3RpbWUodCwgdGhpc19jcHUpOwogCiAJcHV0X2NwdSgpOwogfQpkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwppbmRleCBiNTcxODY5Li5kNjBlZWU1IDEwMDY0NAotLS0gYS9ibG9jay9ic2cuYworKysgYi9ibG9jay9ic2cuYwpAQCAtOSwxMyArOSw2IEBACiAgKiAgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwotLyoKLSAqIFRPRE8KLSAqCS0gU2hvdWxkIHRoaXMgZ2V0IG1lcmdlZCwgYmxvY2svc2NzaV9pb2N0bC5jIHdpbGwgYmUgbWlncmF0ZWQgaW50bwotICoJICB0aGlzIGZpbGUuIFRvIGtlZXAgbWFpbnRlbmFuY2UgZG93biwgaXQncyBlYXNpZXIgdG8gaGF2ZSB0aGVtCi0gKgkgIHNlcGVyYXRlZCByaWdodCBub3cuCi0gKgotICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KQEAgLTI0LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvYnNnLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTM3LDcgKzMxLDcgQEAKICNkZWZpbmUgQlNHX1ZFUlNJT04JIjAuNCIKIAogc3RydWN0IGJzZ19kZXZpY2UgewotCXJlcXVlc3RfcXVldWVfdCAqcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c3lfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRvbmVfbGlzdDsKQEAgLTcwLDEzICs2NCwxMiBAQAogI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfTVVURVgoYnNnX211dGV4KTsKLXN0YXRpYyBpbnQgYnNnX2RldmljZV9uciwgYnNnX21pbm9yX2lkeDsKK3N0YXRpYyBERUZJTkVfSURSKGJzZ19taW5vcl9pZHIpOwogCiAjZGVmaW5lIEJTR19MSVNUX0FSUkFZX1NJWkUJOAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGJzZ19kZXZpY2VfbGlzdFtCU0dfTElTVF9BUlJBWV9TSVpFXTsKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqYnNnX2NsYXNzOwotc3RhdGljIExJU1RfSEVBRChic2dfY2xhc3NfbGlzdCk7CiBzdGF0aWMgaW50IGJzZ19tYWpvcjsKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpic2dfY21kX2NhY2hlcDsKQEAgLTkyLDcgKzg1LDYgQEAKIAlzdHJ1Y3QgYmlvICpiaWRpX2JpbzsKIAlpbnQgZXJyOwogCXN0cnVjdCBzZ19pb192NCBoZHI7Ci0Jc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqdWhkcjsKIAljaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07CiB9OwogCkBAIC0xODAsNyArMTcyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGJsa19maWxsX3NndjRfaGRyX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorc3RhdGljIGludCBibGtfZmlsbF9zZ3Y0X2hkcl9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJCXN0cnVjdCBzZ19pb192NCAqaGRyLCBpbnQgaGFzX3dyaXRlX3Blcm0pCiB7CiAJbWVtc2V0KHJxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsgLyogQVRBUEkgaGF0ZXMgZ2FyYmFnZSBhZnRlciBDREIgKi8KQEAgLTIxNCw3ICsyMDYsNyBAQAogICogQ2hlY2sgaWYgc2dfaW9fdjQgZnJvbSB1c2VyIGlzIGFsbG93ZWQgYW5kIHZhbGlkCiAgKi8KIHN0YXRpYyBpbnQKLWJzZ192YWxpZGF0ZV9zZ3Y0X2hkcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBzZ19pb192NCAqaGRyLCBpbnQgKnJ3KQorYnNnX3ZhbGlkYXRlX3NndjRfaGRyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3Qgc2dfaW9fdjQgKmhkciwgaW50ICpydykKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjUwLDcgKzI0Miw3IEBACiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKgogYnNnX21hcF9oZHIoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3Qgc2dfaW9fdjQgKmhkcikKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZC0+cXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZC0+cXVldWU7CiAJc3RydWN0IHJlcXVlc3QgKnJxLCAqbmV4dF9ycSA9IE5VTEw7CiAJaW50IHJldCwgcnc7CiAJdW5zaWduZWQgaW50IGR4ZmVyX2xlbjsKQEAgLTM0NSw3ICszMzcsNyBAQAogICogZG8gZmluYWwgc2V0dXAgb2YgYSAnYmMnIGFuZCBzdWJtaXQgdGhlIG1hdGNoaW5nICdycScgdG8gdGhlIGJsb2NrCiAgKiBsYXllciBmb3IgaW8KICAqLwotc3RhdGljIHZvaWQgYnNnX2FkZF9jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgcmVxdWVzdF9xdWV1ZV90ICpxLAorc3RhdGljIHZvaWQgYnNnX2FkZF9jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkgICAgc3RydWN0IGJzZ19jb21tYW5kICpiYywgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXJxLT5zZW5zZSA9IGJjLT5zZW5zZTsKQEAgLTYxMSw3ICs2MDMsNyBAQAogCWJjID0gTlVMTDsKIAlyZXQgPSAwOwogCXdoaWxlIChucl9jb21tYW5kcykgewotCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZC0+cXVldWU7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmQtPnF1ZXVlOwogCiAJCWJjID0gYnNnX2FsbG9jX2NvbW1hbmQoYmQpOwogCQlpZiAoSVNfRVJSKGJjKSkgewpAQCAtNjIwLDcgKzYxMiw2IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWJjLT51aGRyID0gKHN0cnVjdCBzZ19pb192NCBfX3VzZXIgKikgYnVmOwogCQlpZiAoY29weV9mcm9tX3VzZXIoJmJjLT5oZHIsIGJ1Ziwgc2l6ZW9mKGJjLT5oZHIpKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWJyZWFrOwpAQCAtNzgxLDIzICs3NzIsMTggQEAKIAogc3RhdGljIHN0cnVjdCBic2dfZGV2aWNlICpic2dfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBfX2JzZ19nZXRfZGV2aWNlKGltaW5vcihpbm9kZSkpOwotCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QsICpfX2JjZDsKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQ7CisJc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgKmJjZDsKIAorCWJkID0gX19ic2dfZ2V0X2RldmljZShpbWlub3IoaW5vZGUpKTsKIAlpZiAoYmQpCiAJCXJldHVybiBiZDsKIAogCS8qCiAJICogZmluZCB0aGUgY2xhc3MgZGV2aWNlCiAJICovCi0JYmNkID0gTlVMTDsKIAltdXRleF9sb2NrKCZic2dfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoX19iY2QsICZic2dfY2xhc3NfbGlzdCwgbGlzdCkgewotCQlpZiAoX19iY2QtPm1pbm9yID09IGltaW5vcihpbm9kZSkpIHsKLQkJCWJjZCA9IF9fYmNkOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJYmNkID0gaWRyX2ZpbmQoJmJzZ19taW5vcl9pZHIsIGltaW5vcihpbm9kZSkpOwogCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKIAogCWlmICghYmNkKQpAQCAtOTM2LDEzICs5MjIsMTIgQEAKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKwlpZHJfcmVtb3ZlKCZic2dfbWlub3JfaWRyLCBiY2QtPm1pbm9yKTsKIAlzeXNmc19yZW1vdmVfbGluaygmcS0+a29iaiwgImJzZyIpOwogCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKGJjZC0+Y2xhc3NfZGV2KTsKIAlwdXRfZGV2aWNlKGJjZC0+ZGV2KTsKIAliY2QtPmNsYXNzX2RldiA9IE5VTEw7CiAJYmNkLT5kZXYgPSBOVUxMOwotCWxpc3RfZGVsX2luaXQoJmJjZC0+bGlzdCk7Ci0JYnNnX2RldmljZV9uci0tOwogCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJzZ191bnJlZ2lzdGVyX3F1ZXVlKTsKQEAgLTk1MCw5ICs5MzUsOSBAQAogaW50IGJzZ19yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGRldmljZSAqZ2RldiwKIAkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgKmJjZCwgKl9fYmNkOworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2Q7CiAJZGV2X3QgZGV2OwotCWludCByZXQgPSAtRU1GSUxFOworCWludCByZXQsIG1pbm9yOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiA9IE5VTEw7CiAJY29uc3QgY2hhciAqZGV2bmFtZTsKIApAQCAtOTY5LDI4ICs5NTQsMjYgQEAKIAogCWJjZCA9ICZxLT5ic2dfZGV2OwogCW1lbXNldChiY2QsIDAsIHNpemVvZigqYmNkKSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmJjZC0+bGlzdCk7CiAKIAltdXRleF9sb2NrKCZic2dfbXV0ZXgpOwotCWlmIChic2dfZGV2aWNlX25yID09IEJTR19NQVhfREVWUykgeworCisJcmV0ID0gaWRyX3ByZV9nZXQoJmJzZ19taW5vcl9pZHIsIEdGUF9LRVJORUwpOworCWlmICghcmV0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJldCA9IGlkcl9nZXRfbmV3KCZic2dfbWlub3JfaWRyLCBiY2QsICZtaW5vcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdW5sb2NrOworCisJaWYgKG1pbm9yID49IEJTR19NQVhfREVWUykgewogCQlwcmludGsoS0VSTl9FUlIgImJzZzogdG9vIG1hbnkgYnNnIGRldmljZXNcbiIpOwotCQlnb3RvIGVycjsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byByZW1vdmVfaWRyOwogCX0KIAotcmV0cnk6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShfX2JjZCwgJmJzZ19jbGFzc19saXN0LCBsaXN0KSB7Ci0JCWlmIChfX2JjZC0+bWlub3IgPT0gYnNnX21pbm9yX2lkeCkgewotCQkJYnNnX21pbm9yX2lkeCsrOwotCQkJaWYgKGJzZ19taW5vcl9pZHggPT0gQlNHX01BWF9ERVZTKQotCQkJCWJzZ19taW5vcl9pZHggPSAwOwotCQkJZ290byByZXRyeTsKLQkJfQotCX0KLQotCWJjZC0+bWlub3IgPSBic2dfbWlub3JfaWR4Kys7Ci0JaWYgKGJzZ19taW5vcl9pZHggPT0gQlNHX01BWF9ERVZTKQotCQlic2dfbWlub3JfaWR4ID0gMDsKLQorCWJjZC0+bWlub3IgPSBtaW5vcjsKIAliY2QtPnF1ZXVlID0gcTsKIAliY2QtPmRldiA9IGdldF9kZXZpY2UoZ2Rldik7CiAJZGV2ID0gTUtERVYoYnNnX21ham9yLCBiY2QtPm1pbm9yKTsKQEAgLTk5OCwyNyArOTgxLDI2IEBACiAJCQkJCWRldm5hbWUpOwogCWlmIChJU19FUlIoY2xhc3NfZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGNsYXNzX2Rldik7Ci0JCWdvdG8gZXJyX3B1dDsKKwkJZ290byBwdXRfZGV2OwogCX0KIAliY2QtPmNsYXNzX2RldiA9IGNsYXNzX2RldjsKIAogCWlmIChxLT5rb2JqLnNkKSB7CiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZxLT5rb2JqLCAmYmNkLT5jbGFzc19kZXYtPmtvYmosICJic2ciKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisJCQlnb3RvIHVucmVnaXN0ZXJfY2xhc3NfZGV2OwogCX0KIAotCWxpc3RfYWRkX3RhaWwoJmJjZC0+bGlzdCwgJmJzZ19jbGFzc19saXN0KTsKLQlic2dfZGV2aWNlX25yKys7Ci0KIAltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CiAJcmV0dXJuIDA7CiAKLWVycl91bnJlZ2lzdGVyOgordW5yZWdpc3Rlcl9jbGFzc19kZXY6CiAJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoY2xhc3NfZGV2KTsKLWVycl9wdXQ6CitwdXRfZGV2OgogCXB1dF9kZXZpY2UoZ2Rldik7Ci1lcnI6CityZW1vdmVfaWRyOgorCWlkcl9yZW1vdmUoJmJzZ19taW5vcl9pZHIsIG1pbm9yKTsKK3VubG9jazoKIAltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IGQxNDhjY2IuLjU0ZGMwNTQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtNzEsNyArNzEsNyBAQAogICogUGVyIGJsb2NrIGRldmljZSBxdWV1ZSBzdHJ1Y3R1cmUKICAqLwogc3RydWN0IGNmcV9kYXRhIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIAogCS8qCiAJICogcnIgbGlzdCBvZiBxdWV1ZXMgd2l0aCByZXF1ZXN0cyBhbmQgdGhlIGNvdW50IG9mIHRoZW0KQEAgLTE5Nyw3ICsxOTcsNyBAQAogQ0ZRX0NGUVFfRk5TKHN5bmMpOwogI3VuZGVmIENGUV9DRlFRX0ZOUwogCi1zdGF0aWMgdm9pZCBjZnFfZGlzcGF0Y2hfaW5zZXJ0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3N0YXRpYyB2b2lkIGNmcV9kaXNwYXRjaF9pbnNlcnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2dldF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKiwgaW50LAogCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZ2ZwX3QpOwogc3RhdGljIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ZxX2NpY19yYl9sb29rdXAoc3RydWN0IGNmcV9kYXRhICosCkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJa2Jsb2NrZF9zY2hlZHVsZV93b3JrKCZjZnFkLT51bnBsdWdfd29yayk7CiB9CiAKLXN0YXRpYyBpbnQgY2ZxX3F1ZXVlX2VtcHR5KHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyBpbnQgY2ZxX3F1ZXVlX2VtcHR5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCkBAIC02MjMsNyArNjIzLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgY2ZxX2FjdGl2YXRlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBjZnFfYWN0aXZhdGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCkBAIC02NDEsNyArNjQxLDcgQEAKIAljZnFkLT5sYXN0X3Bvc2l0aW9uID0gcnEtPmhhcmRfc2VjdG9yICsgcnEtPmhhcmRfbnJfc2VjdG9yczsKIH0KIAotc3RhdGljIHZvaWQgY2ZxX2RlYWN0aXZhdGVfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGNmcV9kZWFjdGl2YXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIApAQCAtNjY1LDcgKzY2NSw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNmcV9tZXJnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW50IGNmcV9tZXJnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKipyZXEsCisJCSAgICAgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpfX3JxOwpAQCAtNjc5LDcgKzY4MCw3IEBACiAJcmV0dXJuIEVMRVZBVE9SX05PX01FUkdFOwogfQogCi1zdGF0aWMgdm9pZCBjZnFfbWVyZ2VkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLAorc3RhdGljIHZvaWQgY2ZxX21lcmdlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLAogCQkJICAgICAgIGludCB0eXBlKQogewogCWlmICh0eXBlID09IEVMRVZBVE9SX0ZST05UX01FUkdFKSB7CkBAIC02OTAsNyArNjkxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWNmcV9tZXJnZWRfcmVxdWVzdHMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCitjZnFfbWVyZ2VkX3JlcXVlc3RzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCSAgICBzdHJ1Y3QgcmVxdWVzdCAqbmV4dCkKIHsKIAkvKgpAQCAtNzAzLDcgKzcwNCw3IEBACiAJY2ZxX3JlbW92ZV9yZXF1ZXN0KG5leHQpOwogfQogCi1zdGF0aWMgaW50IGNmcV9hbGxvd19tZXJnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKK3N0YXRpYyBpbnQgY2ZxX2FsbG93X21lcmdlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkgICBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CkBAIC05MTMsNyArOTE0LDcgQEAKIC8qCiAgKiBNb3ZlIHJlcXVlc3QgZnJvbSBpbnRlcm5hbCBsaXN0cyB0byB0aGUgcmVxdWVzdCBxdWV1ZSBkaXNwYXRjaCBsaXN0LgogICovCi1zdGF0aWMgdm9pZCBjZnFfZGlzcGF0Y2hfaW5zZXJ0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIHZvaWQgY2ZxX2Rpc3BhdGNoX2luc2VydChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBSUV9DRlFRKHJxKTsKQEAgLTEwOTMsNyArMTA5NCw3IEBACiAJcmV0dXJuIGRpc3BhdGNoZWQ7CiB9CiAKLXN0YXRpYyBpbnQgY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGZvcmNlKQorc3RhdGljIGludCBjZnFfZGlzcGF0Y2hfcmVxdWVzdHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBmb3JjZSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwpAQCAtMTIxNCw3ICsxMjE1LDcgQEAKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjaWMtPmtleTsKIAogCWlmIChjZnFkKSB7Ci0JCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNmcWQtPnF1ZXVlOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNmcWQtPnF1ZXVlOwogCiAJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCV9fY2ZxX2V4aXRfc2luZ2xlX2lvX2NvbnRleHQoY2ZxZCwgY2ljKTsKQEAgLTE3NzUsNyArMTc3Niw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBjZnFfaW5zZXJ0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBjZnFfaW5zZXJ0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gUlFfQ0ZRUShycSk7CkBAIC0xNzg5LDcgKzE3OTAsNyBAQAogCWNmcV9ycV9lbnF1ZXVlZChjZnFkLCBjZnFxLCBycSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNmcV9jb21wbGV0ZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGNmcV9jb21wbGV0ZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBSUV9DRlFRKHJxKTsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOwpAQCAtMTg2OCw3ICsxODY5LDcgQEAKIAlyZXR1cm4gRUxWX01RVUVVRV9NQVk7CiB9CiAKLXN0YXRpYyBpbnQgY2ZxX21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKK3N0YXRpYyBpbnQgY2ZxX21heV9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3KQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKQEAgLTE5MjIsNyArMTkyMyw3IEBACiAgKiBBbGxvY2F0ZSBjZnEgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCiAgKi8KIHN0YXRpYyBpbnQKLWNmcV9zZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgZ2ZwX3QgZ2ZwX21hc2spCitjZnFfc2V0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwpAQCAtMTk3NCw3ICsxOTc1LDcgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNmcV9kYXRhLCB1bnBsdWdfd29yayk7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gY2ZxZC0+cXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjZnFkLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwpAQCAtMjA3Miw3ICsyMDczLDcgQEAKIHN0YXRpYyB2b2lkIGNmcV9leGl0X3F1ZXVlKGVsZXZhdG9yX3QgKmUpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gZS0+ZWxldmF0b3JfZGF0YTsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjZnFkLT5xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNmcWQtPnF1ZXVlOwogCiAJY2ZxX3NodXRkb3duX3RpbWVyX3dxKGNmcWQpOwogCkBAIC0yMDk4LDcgKzIwOTksNyBAQAogCWtmcmVlKGNmcWQpOwogfQogCi1zdGF0aWMgdm9pZCAqY2ZxX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgKmNmcV9pbml0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKIApkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IDg3Y2EwMmEuLjFhNTExZmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogLyoKICAqIHJlbW92ZSBycSBmcm9tIHJidHJlZSBhbmQgZmlmby4KICAqLwotc3RhdGljIHZvaWQgZGVhZGxpbmVfcmVtb3ZlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBkZWFkbGluZV9yZW1vdmVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCkBAIC0xMTUsNyArMTE1LDcgQEAKIH0KIAogc3RhdGljIGludAotZGVhZGxpbmVfbWVyZ2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqKnJlcSwgc3RydWN0IGJpbyAqYmlvKQorZGVhZGxpbmVfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc3RydWN0IHJlcXVlc3QgKl9fcnE7CkBAIC0xNDQsOCArMTQ0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBkZWFkbGluZV9tZXJnZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEsCi0JCQkJICAgIGludCB0eXBlKQorc3RhdGljIHZvaWQgZGVhZGxpbmVfbWVyZ2VkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCB0eXBlKQogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCkBAIC0xNTksNyArMTU5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRlYWRsaW5lX21lcmdlZF9yZXF1ZXN0cyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEsCitkZWFkbGluZV9tZXJnZWRfcmVxdWVzdHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEsCiAJCQkgc3RydWN0IHJlcXVlc3QgKm5leHQpCiB7CiAJLyoKQEAgLTE4NSw3ICsxODUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBkZWFkbGluZV9tb3ZlX3RvX2Rpc3BhdGNoKHN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHJxLT5xOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7CiAKIAlkZWFkbGluZV9yZW1vdmVfcmVxdWVzdChxLCBycSk7CiAJZWx2X2Rpc3BhdGNoX2FkZF90YWlsKHEsIHJxKTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogICogZGVhZGxpbmVfZGlzcGF0Y2hfcmVxdWVzdHMgc2VsZWN0cyB0aGUgYmVzdCByZXF1ZXN0IGFjY29yZGluZyB0bwogICogcmVhZC93cml0ZSBleHBpcmUsIGZpZm9fYmF0Y2gsIGV0YwogICovCi1zdGF0aWMgaW50IGRlYWRsaW5lX2Rpc3BhdGNoX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGZvcmNlKQorc3RhdGljIGludCBkZWFkbGluZV9kaXNwYXRjaF9yZXF1ZXN0cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IGZvcmNlKQogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCWNvbnN0IGludCByZWFkcyA9ICFsaXN0X2VtcHR5KCZkZC0+Zmlmb19saXN0W1JFQURdKTsKQEAgLTMzNSw3ICszMzUsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGRlYWRsaW5lX3F1ZXVlX2VtcHR5KHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyBpbnQgZGVhZGxpbmVfcXVldWVfZW1wdHkoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAKQEAgLTM1Niw3ICszNTYsNyBAQAogLyoKICAqIGluaXRpYWxpemUgZWxldmF0b3IgcHJpdmF0ZSBkYXRhIChkZWFkbGluZV9kYXRhKS4KICAqLwotc3RhdGljIHZvaWQgKmRlYWRsaW5lX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgKmRlYWRsaW5lX2luaXRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IGRlYWRsaW5lX2RhdGEgKmRkOwogCmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCBkMjY1OTYzLi5jNmQxNTNkIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogc3RhdGljIGludCBlbHZfaW9zY2hlZF9hbGxvd19tZXJnZShzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBycS0+cTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHJxLT5xOwogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX2FsbG93X21lcmdlX2ZuKQpAQCAtMTQxLDEyICsxNDEsMTMgQEAKIAlyZXR1cm4gZTsKIH0KIAotc3RhdGljIHZvaWQgKmVsZXZhdG9yX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmVxKQorc3RhdGljIHZvaWQgKmVsZXZhdG9yX2luaXRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZXEpCiB7CiAJcmV0dXJuIGVxLT5vcHMtPmVsZXZhdG9yX2luaXRfZm4ocSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVsZXZhdG9yX2F0dGFjaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZXEsCitzdGF0aWMgdm9pZCBlbGV2YXRvcl9hdHRhY2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZXEsCiAJCQkgICB2b2lkICpkYXRhKQogewogCXEtPmVsZXZhdG9yID0gZXE7CkBAIC0xNzIsNyArMTczLDggQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZWx2X2t0eXBlOwogCi1zdGF0aWMgZWxldmF0b3JfdCAqZWxldmF0b3JfYWxsb2MocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqZSkKK3N0YXRpYyBlbGV2YXRvcl90ICplbGV2YXRvcl9hbGxvYyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgIHN0cnVjdCBlbGV2YXRvcl90eXBlICplKQogewogCWVsZXZhdG9yX3QgKmVxOwogCWludCBpOwpAQCAtMjEyLDcgKzIxNCw3IEBACiAJa2ZyZWUoZSk7CiB9CiAKLWludCBlbGV2YXRvcl9pbml0KHJlcXVlc3RfcXVldWVfdCAqcSwgY2hhciAqbmFtZSkKK2ludCBlbGV2YXRvcl9pbml0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBlbGV2YXRvcl90eXBlICplID0gTlVMTDsKIAlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmVxOwpAQCAtMjY0LDcgKzI2Niw3IEBACiAKIEVYUE9SVF9TWU1CT0woZWxldmF0b3JfZXhpdCk7CiAKLXN0YXRpYyB2b2lkIGVsdl9hY3RpdmF0ZV9ycShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGVsdl9hY3RpdmF0ZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIApAQCAtMjcyLDcgKzI3NCw3IEBACiAJCWUtPm9wcy0+ZWxldmF0b3JfYWN0aXZhdGVfcmVxX2ZuKHEsIHJxKTsKIH0KIAotc3RhdGljIHZvaWQgZWx2X2RlYWN0aXZhdGVfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBlbHZfZGVhY3RpdmF0ZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIApAQCAtMjg1LDEzICsyODcsMTMgQEAKIAlobGlzdF9kZWxfaW5pdCgmcnEtPmhhc2gpOwogfQogCi1zdGF0aWMgdm9pZCBlbHZfcnFoYXNoX2RlbChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGVsdl9ycWhhc2hfZGVsKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaWYgKEVMVl9PTl9IQVNIKHJxKSkKIAkJX19lbHZfcnFoYXNoX2RlbChycSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVsdl9ycWhhc2hfYWRkKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIHZvaWQgZWx2X3JxaGFzaF9hZGQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CiAKQEAgLTI5OSwxMyArMzAxLDEzIEBACiAJaGxpc3RfYWRkX2hlYWQoJnJxLT5oYXNoLCAmZS0+aGFzaFtFTFZfSEFTSF9GTihycV9oYXNoX2tleShycSkpXSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVsdl9ycWhhc2hfcmVwb3NpdGlvbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIGVsdl9ycWhhc2hfcmVwb3NpdGlvbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCV9fZWx2X3JxaGFzaF9kZWwocnEpOwogCWVsdl9ycWhhc2hfYWRkKHEsIHJxKTsKIH0KIAotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICplbHZfcnFoYXNoX2ZpbmQocmVxdWVzdF9xdWV1ZV90ICpxLCBzZWN0b3JfdCBvZmZzZXQpCitzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmVsdl9ycWhhc2hfZmluZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc2VjdG9yX3Qgb2Zmc2V0KQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaF9saXN0ID0gJmUtPmhhc2hbRUxWX0hBU0hfRk4ob2Zmc2V0KV07CkBAIC0zOTEsNyArMzkzLDcgQEAKICAqIGVudHJ5LiAgcnEgaXMgc29ydCBpbnN0ZWQgaW50byB0aGUgZGlzcGF0Y2ggcXVldWUuIFRvIGJlIHVzZWQgYnkKICAqIHNwZWNpZmljIGVsZXZhdG9ycy4KICAqLwotdm9pZCBlbHZfZGlzcGF0Y2hfc29ydChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3ZvaWQgZWx2X2Rpc3BhdGNoX3NvcnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzZWN0b3JfdCBib3VuZGFyeTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKQEAgLTQ0OSw3ICs0NTEsNyBAQAogCiBFWFBPUlRfU1lNQk9MKGVsdl9kaXNwYXRjaF9hZGRfdGFpbCk7CiAKLWludCBlbHZfbWVyZ2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqKnJlcSwgc3RydWN0IGJpbyAqYmlvKQoraW50IGVsdl9tZXJnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKipyZXEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CiAJc3RydWN0IHJlcXVlc3QgKl9fcnE7CkBAIC00ODEsNyArNDgzLDcgQEAKIAlyZXR1cm4gRUxFVkFUT1JfTk9fTUVSR0U7CiB9CiAKLXZvaWQgZWx2X21lcmdlZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdHlwZSkKK3ZvaWQgZWx2X21lcmdlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB0eXBlKQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIApAQCAtNDk0LDcgKzQ5Niw3IEBACiAJcS0+bGFzdF9tZXJnZSA9IHJxOwogfQogCi12b2lkIGVsdl9tZXJnZV9yZXF1ZXN0cyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKK3ZvaWQgZWx2X21lcmdlX3JlcXVlc3RzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkgICAgIHN0cnVjdCByZXF1ZXN0ICpuZXh0KQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKQEAgLTUwOSw3ICs1MTEsNyBAQAogCXEtPmxhc3RfbWVyZ2UgPSBycTsKIH0KIAotdm9pZCBlbHZfcmVxdWV1ZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQordm9pZCBlbHZfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJLyoKIAkgKiBpdCBhbHJlYWR5IHdlbnQgdGhyb3VnaCBkZXF1ZXVlLCB3ZSBuZWVkIHRvIGRlY3JlbWVudCB0aGUKQEAgLTUyNiw3ICs1MjgsNyBAQAogCWVsdl9pbnNlcnQocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9SRVFVRVVFKTsKIH0KIAotc3RhdGljIHZvaWQgZWx2X2RyYWluX2VsZXZhdG9yKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIGVsdl9kcmFpbl9lbGV2YXRvcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWQ7CiAJd2hpbGUgKHEtPmVsZXZhdG9yLT5vcHMtPmVsZXZhdG9yX2Rpc3BhdGNoX2ZuKHEsIDEpKQpAQCAtNTQwLDcgKzU0Miw3IEBACiAJfQogfQogCi12b2lkIGVsdl9pbnNlcnQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB3aGVyZSkKK3ZvaWQgZWx2X2luc2VydChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgd2hlcmUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXVuc2lnbmVkIG9yZHNlcTsKQEAgLTYzOCw3ICs2NDAsNyBAQAogCX0KIH0KIAotdm9pZCBfX2Vsdl9hZGRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHdoZXJlLAordm9pZCBfX2Vsdl9hZGRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgd2hlcmUsCiAJCSAgICAgICBpbnQgcGx1ZykKIHsKIAlpZiAocS0+b3JkY29sb3IpCkBAIC02NzYsNyArNjc4LDcgQEAKIAogRVhQT1JUX1NZTUJPTChfX2Vsdl9hZGRfcmVxdWVzdCk7CiAKLXZvaWQgZWx2X2FkZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgd2hlcmUsCit2b2lkIGVsdl9hZGRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgd2hlcmUsCiAJCSAgICAgaW50IHBsdWcpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY4OCw3ICs2OTAsNyBAQAogCiBFWFBPUlRfU1lNQk9MKGVsdl9hZGRfcmVxdWVzdCk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3QgKl9fZWx2X25leHRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXF1ZXN0ICpfX2Vsdl9uZXh0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCkBAIC03MDQsNyArNzA2LDcgQEAKIAl9CiB9CiAKLXN0cnVjdCByZXF1ZXN0ICplbHZfbmV4dF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0cnVjdCByZXF1ZXN0ICplbHZfbmV4dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlpbnQgcmV0OwpAQCAtNzcwLDcgKzc3Miw3IEBACiAKIEVYUE9SVF9TWU1CT0woZWx2X25leHRfcmVxdWVzdCk7CiAKLXZvaWQgZWx2X2RlcXVldWVfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3ZvaWQgZWx2X2RlcXVldWVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCUJVR19PTihsaXN0X2VtcHR5KCZycS0+cXVldWVsaXN0KSk7CiAJQlVHX09OKEVMVl9PTl9IQVNIKHJxKSk7CkBAIC03ODgsNyArNzkwLDcgQEAKIAogRVhQT1JUX1NZTUJPTChlbHZfZGVxdWV1ZV9yZXF1ZXN0KTsKIAotaW50IGVsdl9xdWV1ZV9lbXB0eShyZXF1ZXN0X3F1ZXVlX3QgKnEpCitpbnQgZWx2X3F1ZXVlX2VtcHR5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIApAQCAtODAzLDcgKzgwNSw3IEBACiAKIEVYUE9SVF9TWU1CT0woZWx2X3F1ZXVlX2VtcHR5KTsKIAotc3RydWN0IHJlcXVlc3QgKmVsdl9sYXR0ZXJfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0cnVjdCByZXF1ZXN0ICplbHZfbGF0dGVyX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CiAKQEAgLTgxMiw3ICs4MTQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgcmVxdWVzdCAqZWx2X2Zvcm1lcl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RydWN0IHJlcXVlc3QgKmVsdl9mb3JtZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIApAQCAtODIxLDcgKzgyMyw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBlbHZfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGdmcF90IGdmcF9tYXNrKQoraW50IGVsdl9zZXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBnZnBfdCBnZnBfbWFzaykKIHsKIAllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CiAKQEAgLTgzMiw3ICs4MzQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGVsdl9wdXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3ZvaWQgZWx2X3B1dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOwogCkBAIC04NDAsNyArODQyLDcgQEAKIAkJZS0+b3BzLT5lbGV2YXRvcl9wdXRfcmVxX2ZuKHJxKTsKIH0KIAotaW50IGVsdl9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncpCitpbnQgZWx2X21heV9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3KQogewogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIApAQCAtODUwLDcgKzg1Miw3IEBACiAJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOwogfQogCi12b2lkIGVsdl9jb21wbGV0ZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3ZvaWQgZWx2X2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOwogCkBAIC0xMDA2LDcgKzEwMDgsNyBAQAogICogbmVlZCBmb3IgdGhlIG5ldyBvbmUuIHRoaXMgd2F5IHdlIGhhdmUgYSBjaGFuY2Ugb2YgZ29pbmcgYmFjayB0byB0aGUgb2xkCiAgKiBvbmUsIGlmIHRoZSBuZXcgb25lIGZhaWxzIGluaXQgZm9yIHNvbWUgcmVhc29uLgogICovCi1zdGF0aWMgaW50IGVsZXZhdG9yX3N3aXRjaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBlbGV2YXRvcl90eXBlICpuZXdfZSkKK3N0YXRpYyBpbnQgZWxldmF0b3Jfc3dpdGNoKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqbmV3X2UpCiB7CiAJZWxldmF0b3JfdCAqb2xkX2VsZXZhdG9yLCAqZTsKIAl2b2lkICpkYXRhOwpAQCAtMTA3OCw3ICsxMDgwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3NpemVfdCBlbHZfaW9zY2hlZF9zdG9yZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBjb3VudCkKK3NzaXplX3QgZWx2X2lvc2NoZWRfc3RvcmUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHNpemVfdCBjb3VudCkKIHsKIAljaGFyIGVsZXZhdG9yX25hbWVbRUxWX05BTUVfTUFYXTsKIAlzaXplX3QgbGVuOwpAQCAtMTEwNyw3ICsxMTEwLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXNzaXplX3QgZWx2X2lvc2NoZWRfc2hvdyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIGNoYXIgKm5hbWUpCitzc2l6ZV90IGVsdl9pb3NjaGVkX3Nob3coc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUpCiB7CiAJZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOwogCXN0cnVjdCBlbGV2YXRvcl90eXBlICplbHYgPSBlLT5lbGV2YXRvcl90eXBlOwpAQCAtMTEyNyw3ICsxMTMwLDggQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdHJ1Y3QgcmVxdWVzdCAqZWx2X3JiX2Zvcm1lcl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RydWN0IHJlcXVlc3QgKmVsdl9yYl9mb3JtZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IHJiX25vZGUgKnJicHJldiA9IHJiX3ByZXYoJnJxLT5yYl9ub2RlKTsKIApAQCAtMTEzOSw3ICsxMTQzLDggQEAKIAogRVhQT1JUX1NZTUJPTChlbHZfcmJfZm9ybWVyX3JlcXVlc3QpOwogCi1zdHJ1Y3QgcmVxdWVzdCAqZWx2X3JiX2xhdHRlcl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RydWN0IHJlcXVlc3QgKmVsdl9yYl9sYXR0ZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IHJiX25vZGUgKnJibmV4dCA9IHJiX25leHQoJnJxLT5yYl9ub2RlKTsKIApkaWZmIC0tZ2l0IGEvYmxvY2svbGxfcndfYmxrLmMgYi9ibG9jay9sbF9yd19ibGsuYwppbmRleCA2NjA1NmNhLi44YzJjYWZmIDEwMDY0NAotLS0gYS9ibG9jay9sbF9yd19ibGsuYworKysgYi9ibG9jay9sbF9yd19ibGsuYwpAQCAtNDAsNyArNDAsNyBAQAogc3RhdGljIHZvaWQgYmxrX3VucGx1Z190aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBzdGF0aWMgdm9pZCBkcml2ZV9zdGF0X2FjY3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgbnJfc2VjdG9ycywgaW50IG5ld19pbyk7CiBzdGF0aWMgdm9pZCBpbml0X3JlcXVlc3RfZnJvbV9iaW8oc3RydWN0IHJlcXVlc3QgKnJlcSwgc3RydWN0IGJpbyAqYmlvKTsKLXN0YXRpYyBpbnQgX19tYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pOworc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKIHN0YXRpYyBzdHJ1Y3QgaW9fY29udGV4dCAqY3VycmVudF9pb19jb250ZXh0KGdmcF90IGdmcF9mbGFncywgaW50IG5vZGUpOwogCiAvKgpAQCAtMTIxLDcgKzEyMSw3IEBACiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKnJldCA9IE5VTEw7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gYmRldl9nZXRfcXVldWUoYmRldik7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAogCWlmIChxKQogCQlyZXQgPSAmcS0+YmFja2luZ19kZXZfaW5mbzsKQEAgLTE0MCw3ICsxNDAsNyBAQAogICogY2RiIGZyb20gdGhlIHJlcXVlc3QgZGF0YSBmb3IgaW5zdGFuY2UuCiAgKgogICovCi12b2lkIGJsa19xdWV1ZV9wcmVwX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgcHJlcF9ycV9mbiAqcGZuKQordm9pZCBibGtfcXVldWVfcHJlcF9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgcHJlcF9ycV9mbiAqcGZuKQogewogCXEtPnByZXBfcnFfZm4gPSBwZm47CiB9CkBAIC0xNjMsMTQgKzE2MywxNCBAQAogICogbm8gbWVyZ2VfYnZlY19mbiBpcyBkZWZpbmVkIGZvciBhIHF1ZXVlLCBhbmQgb25seSB0aGUgZml4ZWQgbGltaXRzIGFyZQogICogaG9ub3JlZC4KICAqLwotdm9pZCBibGtfcXVldWVfbWVyZ2VfYnZlYyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIG1lcmdlX2J2ZWNfZm4gKm1iZm4pCit2b2lkIGJsa19xdWV1ZV9tZXJnZV9idmVjKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBtZXJnZV9idmVjX2ZuICptYmZuKQogewogCXEtPm1lcmdlX2J2ZWNfZm4gPSBtYmZuOwogfQogCiBFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tZXJnZV9idmVjKTsKIAotdm9pZCBibGtfcXVldWVfc29mdGlycV9kb25lKHJlcXVlc3RfcXVldWVfdCAqcSwgc29mdGlycV9kb25lX2ZuICpmbikKK3ZvaWQgYmxrX3F1ZXVlX3NvZnRpcnFfZG9uZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc29mdGlycV9kb25lX2ZuICpmbikKIHsKIAlxLT5zb2Z0aXJxX2RvbmVfZm4gPSBmbjsKIH0KQEAgLTE5OSw3ICsxOTksNyBAQAogICogICAgX19iaW9fa21hcF9hdG9taWMoKSB0byBnZXQgYSB0ZW1wb3Jhcnkga2VybmVsIG1hcHBpbmcsIG9yIGJ5IGNhbGxpbmcKICAqICAgIGJsa19xdWV1ZV9ib3VuY2UoKSB0byBjcmVhdGUgYSBidWZmZXIgaW4gbm9ybWFsIG1lbW9yeS4KICAqKi8KLXZvaWQgYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxLCBtYWtlX3JlcXVlc3RfZm4gKiBtZm4pCit2b2lkIGJsa19xdWV1ZV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxLCBtYWtlX3JlcXVlc3RfZm4gKiBtZm4pCiB7CiAJLyoKIAkgKiBzZXQgZGVmYXVsdHMKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiBFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYWtlX3JlcXVlc3QpOwogCi1zdGF0aWMgdm9pZCBycV9pbml0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIHZvaWQgcnFfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCUlOSVRfTElTVF9IRUFEKCZycS0+cXVldWVsaXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcnEtPmRvbmVsaXN0KTsKQEAgLTI3Miw3ICsyNzIsNyBAQAogICogICBmZWF0dXJlIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYW5kIGluZGljYXRlIHNvLgogICoKICAqKi8KLWludCBibGtfcXVldWVfb3JkZXJlZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHVuc2lnbmVkIG9yZGVyZWQsCitpbnQgYmxrX3F1ZXVlX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIG9yZGVyZWQsCiAJCSAgICAgIHByZXBhcmVfZmx1c2hfZm4gKnByZXBhcmVfZmx1c2hfZm4pCiB7CiAJaWYgKG9yZGVyZWQgJiAoUVVFVUVfT1JERVJFRF9QUkVGTFVTSCB8IFFVRVVFX09SREVSRURfUE9TVEZMVVNIKSAmJgpAQCAtMzExLDcgKzMxMSw3IEBACiAgKiAgIHRvIHRoZSBibG9jayBsYXllciBieSBkZWZpbmluZyBpdCB0aHJvdWdoIHRoaXMgY2FsbC4KICAqCiAgKiovCi12b2lkIGJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIGlzc3VlX2ZsdXNoX2ZuICppZmYpCit2b2lkIGJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaXNzdWVfZmx1c2hfZm4gKmlmZikKIHsKIAlxLT5pc3N1ZV9mbHVzaF9mbiA9IGlmZjsKIH0KQEAgLTMyMSw3ICszMjEsNyBAQAogLyoKICAqIENhY2hlIGZsdXNoaW5nIGZvciBvcmRlcmVkIHdyaXRlcyBoYW5kbGluZwogICovCi1pbmxpbmUgdW5zaWduZWQgYmxrX29yZGVyZWRfY3VyX3NlcShyZXF1ZXN0X3F1ZXVlX3QgKnEpCitpbmxpbmUgdW5zaWduZWQgYmxrX29yZGVyZWRfY3VyX3NlcShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlpZiAoIXEtPm9yZHNlcSkKIAkJcmV0dXJuIDA7CkBAIC0zMzAsNyArMzMwLDcgQEAKIAogdW5zaWduZWQgYmxrX29yZGVyZWRfcmVxX3NlcShzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gcnEtPnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBycS0+cTsKIAogCUJVR19PTihxLT5vcmRzZXEgPT0gMCk7CiAKQEAgLTM1Nyw3ICszNTcsNyBAQAogCQlyZXR1cm4gUVVFVUVfT1JEU0VRX0RPTkU7CiB9CiAKLXZvaWQgYmxrX29yZGVyZWRfY29tcGxldGVfc2VxKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgc2VxLCBpbnQgZXJyb3IpCit2b2lkIGJsa19vcmRlcmVkX2NvbXBsZXRlX3NlcShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgc2VxLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCB1cHRvZGF0ZTsKQEAgLTQwMSw3ICs0MDEsNyBAQAogCWJsa19vcmRlcmVkX2NvbXBsZXRlX3NlcShycS0+cSwgUVVFVUVfT1JEU0VRX1BPU1RGTFVTSCwgZXJyb3IpOwogfQogCi1zdGF0aWMgdm9pZCBxdWV1ZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHVuc2lnbmVkIHdoaWNoKQorc3RhdGljIHZvaWQgcXVldWVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIHdoaWNoKQogewogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlycV9lbmRfaW9fZm4gKmVuZF9pbzsKQEAgLTQyNSw3ICs0MjUsNyBAQAogCWVsdl9pbnNlcnQocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3QgKnN0YXJ0X29yZGVyZWQocmVxdWVzdF9xdWV1ZV90ICpxLAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdCAqc3RhcnRfb3JkZXJlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlxLT5iaV9zaXplID0gMDsKQEAgLTQ3Niw3ICs0NzYsNyBAQAogCXJldHVybiBycTsKIH0KIAotaW50IGJsa19kb19vcmRlcmVkKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKipycXApCitpbnQgYmxrX2RvX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcnFwKQogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9ICpycXA7CiAJaW50IGlzX2JhcnJpZXIgPSBibGtfZnNfcmVxdWVzdChycSkgJiYgYmxrX2JhcnJpZXJfcnEocnEpOwpAQCAtNTI3LDcgKzUyNyw3IEBACiAKIHN0YXRpYyBpbnQgZmx1c2hfZHJ5X2Jpb19lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlcywgaW50IGVycm9yKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJpby0+YmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJpby0+YmlfcHJpdmF0ZTsKIAogCS8qCiAJICogVGhpcyBpcyBkcnkgcnVuLCByZXN0b3JlIGJpb19zZWN0b3IgYW5kIHNpemUuICBXZSdsbCBmaW5pc2gKQEAgLTU1MSw3ICs1NTEsNyBAQAogc3RhdGljIGludCBvcmRlcmVkX2Jpb19lbmRpbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBiaW8gKmJpbywKIAkJCSAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgaW50IGVycm9yKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHJxLT5xOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7CiAJYmlvX2VuZF9pb190ICplbmRpbzsKIAl2b2lkICpwcml2YXRlOwogCkBAIC01ODgsNyArNTg4LDcgQEAKICAqICAgIGJsa19xdWV1ZV9ib3VuY2VfbGltaXQgdG8gaGF2ZSBsb3dlciBtZW1vcnkgcGFnZXMgYWxsb2NhdGVkIGFzIGJvdW5jZQogICogICAgYnVmZmVycyBmb3IgZG9pbmcgSS9PIHRvIHBhZ2VzIHJlc2lkaW5nIGFib3ZlIEBwYWdlLgogICoqLwotdm9pZCBibGtfcXVldWVfYm91bmNlX2xpbWl0KHJlcXVlc3RfcXVldWVfdCAqcSwgdTY0IGRtYV9hZGRyKQordm9pZCBibGtfcXVldWVfYm91bmNlX2xpbWl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1NjQgZG1hX2FkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBib3VuY2VfcGZuID0gZG1hX2FkZHIgPj4gUEFHRV9TSElGVDsKIAlpbnQgZG1hID0gMDsKQEAgLTYyNCw3ICs2MjQsNyBAQAogICogICAgRW5hYmxlcyBhIGxvdyBsZXZlbCBkcml2ZXIgdG8gc2V0IGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBzaXplIG9mCiAgKiAgICByZWNlaXZlZCByZXF1ZXN0cy4KICAqKi8KLXZvaWQgYmxrX3F1ZXVlX21heF9zZWN0b3JzKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgaW50IG1heF9zZWN0b3JzKQordm9pZCBibGtfcXVldWVfbWF4X3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBtYXhfc2VjdG9ycykKIHsKIAlpZiAoKG1heF9zZWN0b3JzIDw8IDkpIDwgUEFHRV9DQUNIRV9TSVpFKSB7CiAJCW1heF9zZWN0b3JzID0gMSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIDkpOwpAQCAtNjUxLDcgKzY1MSw4IEBACiAgKiAgICBwaHlzaWNhbCBkYXRhIHNlZ21lbnRzIGluIGEgcmVxdWVzdC4gIFRoaXMgd291bGQgYmUgdGhlIGxhcmdlc3Qgc2l6ZWQKICAqICAgIHNjYXR0ZXIgbGlzdCB0aGUgZHJpdmVyIGNvdWxkIGhhbmRsZS4KICAqKi8KLXZvaWQgYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgc2hvcnQgbWF4X3NlZ21lbnRzKQordm9pZCBibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJIHVuc2lnbmVkIHNob3J0IG1heF9zZWdtZW50cykKIHsKIAlpZiAoIW1heF9zZWdtZW50cykgewogCQltYXhfc2VnbWVudHMgPSAxOwpAQCAtNjc0LDcgKzY3NSw4IEBACiAgKiAgICBhZGRyZXNzL2xlbmd0aCBwYWlycyB0aGUgaG9zdCBhZGFwdGVyIGNhbiBhY3R1YWxseSBnaXZlIGFzIG9uY2UKICAqICAgIHRvIHRoZSBkZXZpY2UuCiAgKiovCi12b2lkIGJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICpxLCB1bnNpZ25lZCBzaG9ydCBtYXhfc2VnbWVudHMpCit2b2lkIGJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbWF4X3NlZ21lbnRzKQogewogCWlmICghbWF4X3NlZ21lbnRzKSB7CiAJCW1heF9zZWdtZW50cyA9IDE7CkBAIC02OTUsNyArNjk3LDcgQEAKICAqICAgIEVuYWJsZXMgYSBsb3cgbGV2ZWwgZHJpdmVyIHRvIHNldCBhbiB1cHBlciBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBhCiAgKiAgICBjb2FsZXNjZWQgc2VnbWVudAogICoqLwotdm9pZCBibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSkKK3ZvaWQgYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSkKIHsKIAlpZiAobWF4X3NpemUgPCBQQUdFX0NBQ0hFX1NJWkUpIHsKIAkJbWF4X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CkBAIC03MTgsNyArNzIwLDcgQEAKICAqICAgZXZlbiBpbnRlcm5hbCByZWFkLW1vZGlmeS13cml0ZSBvcGVyYXRpb25zKS4gVXN1YWxseSB0aGUgZGVmYXVsdAogICogICBvZiA1MTIgY292ZXJzIG1vc3QgaGFyZHdhcmUuCiAgKiovCi12b2lkIGJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgc2hvcnQgc2l6ZSkKK3ZvaWQgYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIHNob3J0IHNpemUpCiB7CiAJcS0+aGFyZHNlY3Rfc2l6ZSA9IHNpemU7CiB9CkBAIC03MzUsNyArNzM3LDcgQEAKICAqIEB0Ogl0aGUgc3RhY2tpbmcgZHJpdmVyICh0b3ApCiAgKiBAYjogIHRoZSB1bmRlcmx5aW5nIGRldmljZSAoYm90dG9tKQogICoqLwotdm9pZCBibGtfcXVldWVfc3RhY2tfbGltaXRzKHJlcXVlc3RfcXVldWVfdCAqdCwgcmVxdWVzdF9xdWV1ZV90ICpiKQordm9pZCBibGtfcXVldWVfc3RhY2tfbGltaXRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICp0LCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYikKIHsKIAkvKiB6ZXJvIGlzICJpbmZpbml0eSIgKi8KIAl0LT5tYXhfc2VjdG9ycyA9IG1pbl9ub3RfemVybyh0LT5tYXhfc2VjdG9ycyxiLT5tYXhfc2VjdG9ycyk7CkBAIC03NTYsNyArNzU4LDcgQEAKICAqIEBxOiAgdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UKICAqIEBtYXNrOiAgdGhlIG1lbW9yeSBib3VuZGFyeSBtYXNrCiAgKiovCi12b2lkIGJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgbG9uZyBtYXNrKQordm9pZCBibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgbG9uZyBtYXNrKQogewogCWlmIChtYXNrIDwgUEFHRV9DQUNIRV9TSVpFIC0gMSkgewogCQltYXNrID0gUEFHRV9DQUNIRV9TSVpFIC0gMTsKQEAgLTc3OCw3ICs3ODAsNyBAQAogICogICAgdGhpcyBpcyB1c2VkIHdoZW4gYnVpZGluZyBkaXJlY3QgaW8gcmVxdWVzdHMgZm9yIHRoZSBxdWV1ZS4KICAqCiAgKiovCi12b2lkIGJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IG1hc2spCit2b2lkIGJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgbWFzaykKIHsKIAlxLT5kbWFfYWxpZ25tZW50ID0gbWFzazsKIH0KQEAgLTc5Niw3ICs3OTgsNyBAQAogICoKICAqICAgIG5vIGxvY2tzIG5lZWQgYmUgaGVsZC4KICAqKi8KLXN0cnVjdCByZXF1ZXN0ICpibGtfcXVldWVfZmluZF90YWcocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgdGFnKQorc3RydWN0IHJlcXVlc3QgKmJsa19xdWV1ZV9maW5kX3RhZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHRhZykKIHsKIAlyZXR1cm4gYmxrX21hcF9xdWV1ZV9maW5kX3RhZyhxLT5xdWV1ZV90YWdzLCB0YWcpOwogfQpAQCAtODQwLDcgKzg0Miw3IEBACiAgKiAgICBibGtfY2xlYW51cF9xdWV1ZSgpIHdpbGwgdGFrZSBjYXJlIG9mIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgaWYgdGFnZ2luZwogICogICAgaGFzIGJlZW4gdXNlZC4gU28gdGhlcmUncyBubyBuZWVkIHRvIGNhbGwgdGhpcyBkaXJlY3RseS4KICAqKi8KLXN0YXRpYyB2b2lkIF9fYmxrX3F1ZXVlX2ZyZWVfdGFncyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBfX2Jsa19xdWV1ZV9mcmVlX3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IGJsa19xdWV1ZV90YWcgKmJxdCA9IHEtPnF1ZXVlX3RhZ3M7CiAKQEAgLTg3Nyw3ICs4NzksNyBAQAogICoJVGhpcyBpcyB1c2VkIHRvIGRpc2FibGVkIHRhZ2dlZCBxdWV1aW5nIHRvIGEgZGV2aWNlLCB5ZXQgbGVhdmUKICAqCXF1ZXVlIGluIGZ1bmN0aW9uLgogICoqLwotdm9pZCBibGtfcXVldWVfZnJlZV90YWdzKHJlcXVlc3RfcXVldWVfdCAqcSkKK3ZvaWQgYmxrX3F1ZXVlX2ZyZWVfdGFncyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAljbGVhcl9iaXQoUVVFVUVfRkxBR19RVUVVRUQsICZxLT5xdWV1ZV9mbGFncyk7CiB9CkBAIC04ODUsNyArODg3LDcgQEAKIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX2ZyZWVfdGFncyk7CiAKIHN0YXRpYyBpbnQKLWluaXRfdGFnX21hcChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBibGtfcXVldWVfdGFnICp0YWdzLCBpbnQgZGVwdGgpCitpbml0X3RhZ19tYXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBibGtfcXVldWVfdGFnICp0YWdzLCBpbnQgZGVwdGgpCiB7CiAJc3RydWN0IHJlcXVlc3QgKip0YWdfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyAqdGFnX21hcDsKQEAgLTk1NSw3ICs5NTcsNyBAQAogICogQGRlcHRoOiAgdGhlIG1heGltdW0gcXVldWUgZGVwdGggc3VwcG9ydGVkCiAgKiBAdGFnczogdGhlIHRhZyB0byB1c2UKICAqKi8KLWludCBibGtfcXVldWVfaW5pdF90YWdzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGRlcHRoLAoraW50IGJsa19xdWV1ZV9pbml0X3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBkZXB0aCwKIAkJCXN0cnVjdCBibGtfcXVldWVfdGFnICp0YWdzKQogewogCWludCByYzsKQEAgLTk5Niw3ICs5OTgsNyBAQAogICogIE5vdGVzOgogICogICAgTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgcXVldWUgbG9jayBoZWxkLgogICoqLwotaW50IGJsa19xdWV1ZV9yZXNpemVfdGFncyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBuZXdfZGVwdGgpCitpbnQgYmxrX3F1ZXVlX3Jlc2l6ZV90YWdzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgbmV3X2RlcHRoKQogewogCXN0cnVjdCBibGtfcXVldWVfdGFnICpicXQgPSBxLT5xdWV1ZV90YWdzOwogCXN0cnVjdCByZXF1ZXN0ICoqdGFnX2luZGV4OwpAQCAtMTA1OSw3ICsxMDYxLDcgQEAKICAqICBOb3RlczoKICAqICAgcXVldWUgbG9jayBtdXN0IGJlIGhlbGQuCiAgKiovCi12b2lkIGJsa19xdWV1ZV9lbmRfdGFnKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQordm9pZCBibGtfcXVldWVfZW5kX3RhZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBibGtfcXVldWVfdGFnICpicXQgPSBxLT5xdWV1ZV90YWdzOwogCWludCB0YWcgPSBycS0+dGFnOwpAQCAtMTExMSw3ICsxMTEzLDcgQEAKICAqICBOb3RlczoKICAqICAgcXVldWUgbG9jayBtdXN0IGJlIGhlbGQuCiAgKiovCi1pbnQgYmxrX3F1ZXVlX3N0YXJ0X3RhZyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK2ludCBibGtfcXVldWVfc3RhcnRfdGFnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IGJsa19xdWV1ZV90YWcgKmJxdCA9IHEtPnF1ZXVlX3RhZ3M7CiAJaW50IHRhZzsKQEAgLTExNTgsNyArMTE2MCw3IEBACiAgKiAgTm90ZXM6CiAgKiAgIHF1ZXVlIGxvY2sgbXVzdCBiZSBoZWxkLgogICoqLwotdm9pZCBibGtfcXVldWVfaW52YWxpZGF0ZV90YWdzKHJlcXVlc3RfcXVldWVfdCAqcSkKK3ZvaWQgYmxrX3F1ZXVlX2ludmFsaWRhdGVfdGFncyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgYmxrX3F1ZXVlX3RhZyAqYnF0ID0gcS0+cXVldWVfdGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICpuOwpAQCAtMTIwNSw3ICsxMjA3LDcgQEAKIAogRVhQT1JUX1NZTUJPTChibGtfZHVtcF9ycV9mbGFncyk7CiAKLXZvaWQgYmxrX3JlY291bnRfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pCit2b2lkIGJsa19yZWNvdW50X3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJpb192ZWMgKmJ2LCAqYnZwcnYgPSBOVUxMOwogCWludCBpLCBucl9waHlzX3NlZ3MsIG5yX2h3X3NlZ3MsIHNlZ19zaXplLCBod19zZWdfc2l6ZSwgY2x1c3RlcjsKQEAgLTEyNjcsNyArMTI2OSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa19yZWNvdW50X3NlZ21lbnRzKTsKIAotc3RhdGljIGludCBibGtfcGh5c19jb250aWdfc2VnbWVudChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbywKK3N0YXRpYyBpbnQgYmxrX3BoeXNfY29udGlnX3NlZ21lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKIAkJCQkgICBzdHJ1Y3QgYmlvICpueHQpCiB7CiAJaWYgKCEocS0+cXVldWVfZmxhZ3MgJiAoMSA8PCBRVUVVRV9GTEFHX0NMVVNURVIpKSkKQEAgLTEyODgsNyArMTI5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmxrX2h3X2NvbnRpZ19zZWdtZW50KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvLAorc3RhdGljIGludCBibGtfaHdfY29udGlnX3NlZ21lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKIAkJCQkgc3RydWN0IGJpbyAqbnh0KQogewogCWlmICh1bmxpa2VseSghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fU0VHX1ZBTElEKSkpCkBAIC0xMzA4LDcgKzEzMTAsOCBAQAogICogbWFwIGEgcmVxdWVzdCB0byBzY2F0dGVybGlzdCwgcmV0dXJuIG51bWJlciBvZiBzZyBlbnRyaWVzIHNldHVwLiBDYWxsZXIKICAqIG11c3QgbWFrZSBzdXJlIHNnIGNhbiBob2xkIHJxLT5ucl9waHlzX3NlZ21lbnRzIGVudHJpZXMKICAqLwotaW50IGJsa19ycV9tYXBfc2cocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCitpbnQgYmxrX3JxX21hcF9zZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCiB7CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWMsICpidnBydjsKIAlzdHJ1Y3QgYmlvICpiaW87CkBAIC0xMzYxLDcgKzEzNjQsNyBAQAogICogc3BlY2lmaWMgb25lcyBpZiBzbyBkZXNpcmVkCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgbGxfbmV3X21lcmdlYWJsZShyZXF1ZXN0X3F1ZXVlX3QgKnEsCitzdGF0aWMgaW5saW5lIGludCBsbF9uZXdfbWVyZ2VhYmxlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJCSAgIHN0cnVjdCByZXF1ZXN0ICpyZXEsCiAJCQkJICAgc3RydWN0IGJpbyAqYmlvKQogewpAQCAtMTM4Miw3ICsxMzg1LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbGxfbmV3X2h3X3NlZ21lbnQocmVxdWVzdF9xdWV1ZV90ICpxLAorc3RhdGljIGlubGluZSBpbnQgbGxfbmV3X2h3X3NlZ21lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJICAgIHN0cnVjdCByZXF1ZXN0ICpyZXEsCiAJCQkJICAgIHN0cnVjdCBiaW8gKmJpbykKIHsKQEAgLTE0MDYsNyArMTQwOSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBsbF9iYWNrX21lcmdlX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwgc3RydWN0IGJpbyAqYmlvKQoraW50IGxsX2JhY2tfbWVyZ2VfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAl1bnNpZ25lZCBzaG9ydCBtYXhfc2VjdG9yczsKIAlpbnQgbGVuOwpAQCAtMTQ0NCw3ICsxNDQ3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobGxfYmFja19tZXJnZV9mbik7CiAKLXN0YXRpYyBpbnQgbGxfZnJvbnRfbWVyZ2VfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLCAKK3N0YXRpYyBpbnQgbGxfZnJvbnRfbWVyZ2VfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEsIAogCQkJICAgICBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJdW5zaWduZWQgc2hvcnQgbWF4X3NlY3RvcnM7CkBAIC0xNDgzLDcgKzE0ODYsNyBAQAogCXJldHVybiBsbF9uZXdfaHdfc2VnbWVudChxLCByZXEsIGJpbyk7CiB9CiAKLXN0YXRpYyBpbnQgbGxfbWVyZ2VfcmVxdWVzdHNfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLAorc3RhdGljIGludCBsbF9tZXJnZV9yZXF1ZXN0c19mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKIAkJCQlzdHJ1Y3QgcmVxdWVzdCAqbmV4dCkKIHsKIAlpbnQgdG90YWxfcGh5c19zZWdtZW50czsKQEAgLTE1MzksNyArMTU0Miw3IEBACiAgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmIGFuZCBubyByZXF1ZXN0cyBvbiB0aGUgcXVldWUgYW5kCiAgKiB3aXRoIHRoZSBxdWV1ZSBsb2NrIGhlbGQuCiAgKi8KLXZvaWQgYmxrX3BsdWdfZGV2aWNlKHJlcXVlc3RfcXVldWVfdCAqcSkKK3ZvaWQgYmxrX3BsdWdfZGV2aWNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCVdBUk5fT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKQEAgLTE1NjIsNyArMTU2NSw3IEBACiAgKiByZW1vdmUgdGhlIHF1ZXVlIGZyb20gdGhlIHBsdWdnZWQgbGlzdCwgaWYgcHJlc2VudC4gY2FsbGVkIHdpdGgKICAqIHF1ZXVlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotaW50IGJsa19yZW1vdmVfcGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCitpbnQgYmxrX3JlbW92ZV9wbHVnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCVdBUk5fT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKQEAgLTE1NzgsNyArMTU4MSw3IEBACiAvKgogICogcmVtb3ZlIHRoZSBwbHVnIGFuZCBsZXQgaXQgcmlwLi4KICAqLwotdm9pZCBfX2dlbmVyaWNfdW5wbHVnX2RldmljZShyZXF1ZXN0X3F1ZXVlX3QgKnEpCit2b2lkIF9fZ2VuZXJpY191bnBsdWdfZGV2aWNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWlmICh1bmxpa2VseShibGtfcXVldWVfc3RvcHBlZChxKSkpCiAJCXJldHVybjsKQEAgLTE1OTIsNyArMTU5NSw3IEBACiAKIC8qKgogICogZ2VuZXJpY191bnBsdWdfZGV2aWNlIC0gZmlyZSBhIHJlcXVlc3QgcXVldWUKLSAqIEBxOiAgICBUaGUgJnJlcXVlc3RfcXVldWVfdCBpbiBxdWVzdGlvbgorICogQHE6ICAgIFRoZSAmc3RydWN0IHJlcXVlc3RfcXVldWUgaW4gcXVlc3Rpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgTGludXggdXNlcyBwbHVnZ2luZyB0byBidWlsZCBiaWdnZXIgcmVxdWVzdHMgcXVldWVzIGJlZm9yZSBsZXR0aW5nCkBAIC0xNjAxLDcgKzE2MDQsNyBAQAogICogICBnZXRzIHVucGx1Z2dlZCwgdGhlIHJlcXVlc3RfZm4gZGVmaW5lZCBmb3IgdGhlIHF1ZXVlIGlzIGludm9rZWQgYW5kCiAgKiAgIHRyYW5zZmVycyBzdGFydGVkLgogICoqLwotdm9pZCBnZW5lcmljX3VucGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICpxKQordm9pZCBnZW5lcmljX3VucGx1Z19kZXZpY2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAlfX2dlbmVyaWNfdW5wbHVnX2RldmljZShxKTsKQEAgLTE2MTIsNyArMTYxNSw3IEBACiBzdGF0aWMgdm9pZCBibGtfYmFja2luZ19kZXZfdW5wbHVnKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCiAJCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gYmRpLT51bnBsdWdfaW9fZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkaS0+dW5wbHVnX2lvX2RhdGE7CiAKIAkvKgogCSAqIGRldmljZXMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhbiAtPnVucGx1Z19mbiBkZWZpbmVkCkBAIC0xNjI3LDcgKzE2MzAsOCBAQAogCiBzdGF0aWMgdm9pZCBibGtfdW5wbHVnX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNvbnRhaW5lcl9vZih3b3JrLCByZXF1ZXN0X3F1ZXVlX3QsIHVucGx1Z193b3JrKTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSwgdW5wbHVnX3dvcmspOwogCiAJYmxrX2FkZF90cmFjZV9wZHVfaW50KHEsIEJMS19UQV9VTlBMVUdfSU8sIE5VTEwsCiAJCQkJcS0+cnEuY291bnRbUkVBRF0gKyBxLT5ycS5jb3VudFtXUklURV0pOwpAQCAtMTYzNyw3ICsxNjQxLDcgQEAKIAogc3RhdGljIHZvaWQgYmxrX3VucGx1Z190aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSAocmVxdWVzdF9xdWV1ZV90ICopZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKWRhdGE7CiAKIAlibGtfYWRkX3RyYWNlX3BkdV9pbnQocSwgQkxLX1RBX1VOUExVR19USU1FUiwgTlVMTCwKIAkJCQlxLT5ycS5jb3VudFtSRUFEXSArIHEtPnJxLmNvdW50W1dSSVRFXSk7CkBAIC0xNjQ3LDE0ICsxNjUxLDE0IEBACiAKIC8qKgogICogYmxrX3N0YXJ0X3F1ZXVlIC0gcmVzdGFydCBhIHByZXZpb3VzbHkgc3RvcHBlZCBxdWV1ZQotICogQHE6ICAgIFRoZSAmcmVxdWVzdF9xdWV1ZV90IGluIHF1ZXN0aW9uCisgKiBAcTogICAgVGhlICZzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSBpbiBxdWVzdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgogICogICBibGtfc3RhcnRfcXVldWUoKSB3aWxsIGNsZWFyIHRoZSBzdG9wIGZsYWcgb24gdGhlIHF1ZXVlLCBhbmQgY2FsbAogICogICB0aGUgcmVxdWVzdF9mbiBmb3IgdGhlIHF1ZXVlIGlmIGl0IHdhcyBpbiBhIHN0b3BwZWQgc3RhdGUgd2hlbgogICogICBlbnRlcmVkLiBBbHNvIHNlZSBibGtfc3RvcF9xdWV1ZSgpLiBRdWV1ZSBsb2NrIG11c3QgYmUgaGVsZC4KICAqKi8KLXZvaWQgYmxrX3N0YXJ0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSkKK3ZvaWQgYmxrX3N0YXJ0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCVdBUk5fT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKQEAgLTE2NzcsNyArMTY4MSw3IEBACiAKIC8qKgogICogYmxrX3N0b3BfcXVldWUgLSBzdG9wIGEgcXVldWUKLSAqIEBxOiAgICBUaGUgJnJlcXVlc3RfcXVldWVfdCBpbiBxdWVzdGlvbgorICogQHE6ICAgIFRoZSAmc3RydWN0IHJlcXVlc3RfcXVldWUgaW4gcXVlc3Rpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgVGhlIExpbnV4IGJsb2NrIGxheWVyIGFzc3VtZXMgdGhhdCBhIGJsb2NrIGRyaXZlciB3aWxsIGNvbnN1bWUgYWxsCkBAIC0xNjg5LDcgKzE2OTMsNyBAQAogICogICB0aGUgZHJpdmVyIGhhcyBzaWduYWxsZWQgaXQncyByZWFkeSB0byBnbyBhZ2Fpbi4gVGhpcyBoYXBwZW5zIGJ5IGNhbGxpbmcKICAqICAgYmxrX3N0YXJ0X3F1ZXVlKCkgdG8gcmVzdGFydCBxdWV1ZSBvcGVyYXRpb25zLiBRdWV1ZSBsb2NrIG11c3QgYmUgaGVsZC4KICAqKi8KLXZvaWQgYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQordm9pZCBibGtfc3RvcF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlibGtfcmVtb3ZlX3BsdWcocSk7CiAJc2V0X2JpdChRVUVVRV9GTEFHX1NUT1BQRUQsICZxLT5xdWV1ZV9mbGFncyk7CkBAIC0xNzQ2LDcgKzE3NTAsNyBAQAogRVhQT1JUX1NZTUJPTChibGtfcnVuX3F1ZXVlKTsKIAogLyoqCi0gKiBibGtfY2xlYW51cF9xdWV1ZTogLSByZWxlYXNlIGEgJnJlcXVlc3RfcXVldWVfdCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKKyAqIGJsa19jbGVhbnVwX3F1ZXVlOiAtIHJlbGVhc2UgYSAmc3RydWN0IHJlcXVlc3RfcXVldWUgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkCiAgKiBAa29iajogICAgdGhlIGtvYmogYmVsb25naW5nIG9mIHRoZSByZXF1ZXN0IHF1ZXVlIHRvIGJlIHJlbGVhc2VkCiAgKgogICogRGVzY3JpcHRpb246CkBAIC0xNzYyLDcgKzE3NjYsOCBAQAogICoqLwogc3RhdGljIHZvaWQgYmxrX3JlbGVhc2VfcXVldWUoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlLCBrb2JqKTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9CisJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSwga29iaik7CiAJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CiAKIAlibGtfc3luY19xdWV1ZShxKTsKQEAgLTE3NzgsMTMgKzE3ODMsMTMgQEAKIAlrbWVtX2NhY2hlX2ZyZWUocmVxdWVzdHFfY2FjaGVwLCBxKTsKIH0KIAotdm9pZCBibGtfcHV0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSkKK3ZvaWQgYmxrX3B1dF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlrb2JqZWN0X3B1dCgmcS0+a29iaik7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19wdXRfcXVldWUpOwogCi12b2lkIGJsa19jbGVhbnVwX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqIHEpCit2b2lkIGJsa19jbGVhbnVwX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKIHsKIAltdXRleF9sb2NrKCZxLT5zeXNmc19sb2NrKTsKIAlzZXRfYml0KFFVRVVFX0ZMQUdfREVBRCwgJnEtPnF1ZXVlX2ZsYWdzKTsKQEAgLTE3OTgsNyArMTgwMyw3IEBACiAKIEVYUE9SVF9TWU1CT0woYmxrX2NsZWFudXBfcXVldWUpOwogCi1zdGF0aWMgaW50IGJsa19pbml0X2ZyZWVfbGlzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgaW50IGJsa19pbml0X2ZyZWVfbGlzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKIApAQCAtMTgxNyw3ICsxODIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotcmVxdWVzdF9xdWV1ZV90ICpibGtfYWxsb2NfcXVldWUoZ2ZwX3QgZ2ZwX21hc2spCitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2FsbG9jX3F1ZXVlKGdmcF90IGdmcF9tYXNrKQogewogCXJldHVybiBibGtfYWxsb2NfcXVldWVfbm9kZShnZnBfbWFzaywgLTEpOwogfQpAQCAtMTgyNSw5ICsxODMwLDkgQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgcXVldWVfa3R5cGU7CiAKLXJlcXVlc3RfcXVldWVfdCAqYmxrX2FsbG9jX3F1ZXVlX25vZGUoZ2ZwX3QgZ2ZwX21hc2ssIGludCBub2RlX2lkKQorc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19hbGxvY19xdWV1ZV9ub2RlKGdmcF90IGdmcF9tYXNrLCBpbnQgbm9kZV9pZCkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAlxID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKHJlcXVlc3RxX2NhY2hlcCwKIAkJCQlnZnBfbWFzayB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwpAQCAtMTg4MiwxNiArMTg4NywxNiBAQAogICogICAgd2hlbiB0aGUgYmxvY2sgZGV2aWNlIGlzIGRlYWN0aXZhdGVkIChzdWNoIGFzIGF0IG1vZHVsZSB1bmxvYWQpLgogICoqLwogCi1yZXF1ZXN0X3F1ZXVlX3QgKmJsa19pbml0X3F1ZXVlKHJlcXVlc3RfZm5fcHJvYyAqcmZuLCBzcGlubG9ja190ICpsb2NrKQorc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19pbml0X3F1ZXVlKHJlcXVlc3RfZm5fcHJvYyAqcmZuLCBzcGlubG9ja190ICpsb2NrKQogewogCXJldHVybiBibGtfaW5pdF9xdWV1ZV9ub2RlKHJmbiwgbG9jaywgLTEpOwogfQogRVhQT1JUX1NZTUJPTChibGtfaW5pdF9xdWV1ZSk7CiAKLXJlcXVlc3RfcXVldWVfdCAqCitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqCiBibGtfaW5pdF9xdWV1ZV9ub2RlKHJlcXVlc3RfZm5fcHJvYyAqcmZuLCBzcGlubG9ja190ICpsb2NrLCBpbnQgbm9kZV9pZCkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBibGtfYWxsb2NfcXVldWVfbm9kZShHRlBfS0VSTkVMLCBub2RlX2lkKTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJsa19hbGxvY19xdWV1ZV9ub2RlKEdGUF9LRVJORUwsIG5vZGVfaWQpOwogCiAJaWYgKCFxKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE5NDAsNyArMTk0NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa19pbml0X3F1ZXVlX25vZGUpOwogCi1pbnQgYmxrX2dldF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpCitpbnQgYmxrX2dldF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlpZiAobGlrZWx5KCF0ZXN0X2JpdChRVUVVRV9GTEFHX0RFQUQsICZxLT5xdWV1ZV9mbGFncykpKSB7CiAJCWtvYmplY3RfZ2V0KCZxLT5rb2JqKTsKQEAgLTE5NTIsNyArMTk1Nyw3IEBACiAKIEVYUE9SVF9TWU1CT0woYmxrX2dldF9xdWV1ZSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBibGtfZnJlZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIGlubGluZSB2b2lkIGJsa19mcmVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlpZiAocnEtPmNtZF9mbGFncyAmIFJFUV9FTFZQUklWKQogCQllbHZfcHV0X3JlcXVlc3QocSwgcnEpOwpAQCAtMTk2MCw3ICsxOTY1LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKLWJsa19hbGxvY19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBpbnQgcHJpdiwgZ2ZwX3QgZ2ZwX21hc2spCitibGtfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3LCBpbnQgcHJpdiwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gbWVtcG9vbF9hbGxvYyhxLT5ycS5ycV9wb29sLCBnZnBfbWFzayk7CiAKQEAgLTE5ODgsNyArMTk5Myw3IEBACiAgKiBpb2NfYmF0Y2hpbmcgcmV0dXJucyB0cnVlIGlmIHRoZSBpb2MgaXMgYSB2YWxpZCBiYXRjaGluZyByZXF1ZXN0IGFuZAogICogc2hvdWxkIGJlIGdpdmVuIHByaW9yaXR5IGFjY2VzcyB0byBhIHJlcXVlc3QuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlvY19iYXRjaGluZyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBpb19jb250ZXh0ICppb2MpCitzdGF0aWMgaW5saW5lIGludCBpb2NfYmF0Y2hpbmcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBpb19jb250ZXh0ICppb2MpCiB7CiAJaWYgKCFpb2MpCiAJCXJldHVybiAwOwpAQCAtMjAwOSw3ICsyMDE0LDcgQEAKICAqIGlzIHRoZSBiZWhhdmlvdXIgd2Ugd2FudCB0aG91Z2ggLSBvbmNlIGl0IGdldHMgYSB3YWtldXAgaXQgc2hvdWxkIGJlIGdpdmVuCiAgKiBhIG5pY2UgcnVuLgogICovCi1zdGF0aWMgdm9pZCBpb2Nfc2V0X2JhdGNoaW5nKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGlvX2NvbnRleHQgKmlvYykKK3N0YXRpYyB2b2lkIGlvY19zZXRfYmF0Y2hpbmcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBpb19jb250ZXh0ICppb2MpCiB7CiAJaWYgKCFpb2MgfHwgaW9jX2JhdGNoaW5nKHEsIGlvYykpCiAJCXJldHVybjsKQEAgLTIwMTgsNyArMjAyMyw3IEBACiAJaW9jLT5sYXN0X3dhaXRlZCA9IGppZmZpZXM7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZnJlZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKK3N0YXRpYyB2b2lkIF9fZnJlZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3KQogewogCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwogCkBAIC0yMDM3LDcgKzIwNDIsNyBAQAogICogQSByZXF1ZXN0IGhhcyBqdXN0IGJlZW4gcmVsZWFzZWQuICBBY2NvdW50IGZvciBpdCwgdXBkYXRlIHRoZSBmdWxsIGFuZAogICogY29uZ2VzdGlvbiBzdGF0dXMsIHdha2UgdXAgYW55IHdhaXRlcnMuICAgQ2FsbGVkIHVuZGVyIHEtPnF1ZXVlX2xvY2suCiAgKi8KLXN0YXRpYyB2b2lkIGZyZWVkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsIGludCBwcml2KQorc3RhdGljIHZvaWQgZnJlZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3LCBpbnQgcHJpdikKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKIApAQCAtMjA1Nyw3ICsyMDYyLDcgQEAKICAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLCB3aXRoIHF1ZXVlX2xvY2sgaGVsZC4KICAqIFJldHVybnMgIU5VTEwgb24gc3VjY2Vzcywgd2l0aCBxdWV1ZV9sb2NrICpub3QgaGVsZCouCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZ2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcndfZmxhZ3MsCitzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgcndfZmxhZ3MsCiAJCQkJICAgc3RydWN0IGJpbyAqYmlvLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBOVUxMOwpAQCAtMjE2Miw3ICsyMTY3LDcgQEAKICAqCiAgKiBDYWxsZWQgd2l0aCBxLT5xdWV1ZV9sb2NrIGhlbGQsIGFuZCByZXR1cm5zIHdpdGggaXQgdW5sb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZ2V0X3JlcXVlc3Rfd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCByd19mbGFncywKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZ2V0X3JlcXVlc3Rfd2FpdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3X2ZsYWdzLAogCQkJCQlzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJY29uc3QgaW50IHJ3ID0gcndfZmxhZ3MgJiAweDAxOwpAQCAtMjIwNCw3ICsyMjA5LDcgQEAKIAlyZXR1cm4gcnE7CiB9CiAKLXN0cnVjdCByZXF1ZXN0ICpibGtfZ2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsIGdmcF90IGdmcF9tYXNrKQorc3RydWN0IHJlcXVlc3QgKmJsa19nZXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3LCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAKQEAgLTIyMzQsNyArMjIzOSw3IEBACiAgKgogICogVGhlIHF1ZXVlIGxvY2sgbXVzdCBiZSBoZWxkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotdm9pZCBibGtfc3RhcnRfcXVldWVpbmcocmVxdWVzdF9xdWV1ZV90ICpxKQordm9pZCBibGtfc3RhcnRfcXVldWVpbmcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJaWYgKCFibGtfcXVldWVfcGx1Z2dlZChxKSkKIAkJcS0+cmVxdWVzdF9mbihxKTsKQEAgLTIyNTMsNyArMjI1OCw3IEBACiAgKiAgICBtb3JlLCB3aGVuIHRoYXQgY29uZGl0aW9uIGhhcHBlbnMgd2UgbmVlZCB0byBwdXQgdGhlIHJlcXVlc3QgYmFjawogICogICAgb24gdGhlIHF1ZXVlLiBNdXN0IGJlIGNhbGxlZCB3aXRoIHF1ZXVlIGxvY2sgaGVsZC4KICAqLwotdm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQordm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJYmxrX2FkZF90cmFjZV9ycShxLCBycSwgQkxLX1RBX1JFUVVFVUUpOwogCkBAIC0yMjg0LDcgKzIyODksNyBAQAogICogICAgb2YgdGhlIHF1ZXVlIGZvciB0aGluZ3MgbGlrZSBhIFFVRVVFX0ZVTEwgbWVzc2FnZSBmcm9tIGEgZGV2aWNlLCBvciBhCiAgKiAgICBob3N0IHRoYXQgaXMgdW5hYmxlIHRvIGFjY2VwdCBhIHBhcnRpY3VsYXIgY29tbWFuZC4KICAqLwotdm9pZCBibGtfaW5zZXJ0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCit2b2lkIGJsa19pbnNlcnRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJaW50IGF0X2hlYWQsIHZvaWQgKmRhdGEpCiB7CiAJaW50IHdoZXJlID0gYXRfaGVhZCA/IEVMRVZBVE9SX0lOU0VSVF9GUk9OVCA6IEVMRVZBVE9SX0lOU0VSVF9CQUNLOwpAQCAtMjMzMCw3ICsyMzM1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorc3RhdGljIGludCBfX2Jsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJICAgICB2b2lkIF9fdXNlciAqdWJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIHVhZGRyOwpAQCAtMjQwMyw4ICsyNDA4LDggQEAKICAqICAgIG9yaWdpbmFsIGJpbyBtdXN0IGJlIHBhc3NlZCBiYWNrIGluIHRvIGJsa19ycV91bm1hcF91c2VyKCkgZm9yIHByb3BlcgogICogICAgdW5tYXBwaW5nLgogICovCi1pbnQgYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCB2b2lkIF9fdXNlciAqdWJ1ZiwKLQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoraW50IGJsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkgICAgdm9pZCBfX3VzZXIgKnVidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVhZCA9IDA7CiAJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKQEAgLTI0NzAsNyArMjQ3NSw3IEBACiAgKiAgICBvcmlnaW5hbCBiaW8gbXVzdCBiZSBwYXNzZWQgYmFjayBpbiB0byBibGtfcnFfdW5tYXBfdXNlcigpIGZvciBwcm9wZXIKICAqICAgIHVubWFwcGluZy4KICAqLwotaW50IGJsa19ycV9tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCitpbnQgYmxrX3JxX21hcF91c2VyX2lvdihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJc3RydWN0IHNnX2lvdmVjICppb3YsIGludCBpb3ZfY291bnQsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IGJpbyAqYmlvOwpAQCAtMjU0MCw3ICsyNTQ1LDcgQEAKICAqIEBsZW46CWxlbmd0aCBvZiB1c2VyIGRhdGEKICAqIEBnZnBfbWFzazoJbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKICAqLwotaW50IGJsa19ycV9tYXBfa2VybihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqa2J1ZiwKK2ludCBibGtfcnFfbWFwX2tlcm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgdm9pZCAqa2J1ZiwKIAkJICAgIHVuc2lnbmVkIGludCBsZW4sIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCBiaW8gKmJpbzsKQEAgLTI1NzcsNyArMjU4Miw3IEBACiAgKiAgICBJbnNlcnQgYSBmdWxseSBwcmVwYXJlZCByZXF1ZXN0IGF0IHRoZSBiYWNrIG9mIHRoZSBpbyBzY2hlZHVsZXIgcXVldWUKICAqICAgIGZvciBleGVjdXRpb24uICBEb24ndCB3YWl0IGZvciBjb21wbGV0aW9uLgogICovCi12b2lkIGJsa19leGVjdXRlX3JxX25vd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLAordm9pZCBibGtfZXhlY3V0ZV9ycV9ub3dhaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLAogCQkJICAgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgYXRfaGVhZCwKIAkJCSAgIHJxX2VuZF9pb19mbiAqZG9uZSkKIHsKQEAgLTI2MDUsNyArMjYxMCw3IEBACiAgKiAgICBJbnNlcnQgYSBmdWxseSBwcmVwYXJlZCByZXF1ZXN0IGF0IHRoZSBiYWNrIG9mIHRoZSBpbyBzY2hlZHVsZXIgcXVldWUKICAqICAgIGZvciBleGVjdXRpb24gYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uCiAgKi8KLWludCBibGtfZXhlY3V0ZV9ycShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLAoraW50IGJsa19leGVjdXRlX3JxKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywKIAkJICAgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgYXRfaGVhZCkKIHsKIAlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3YWl0KTsKQEAgLTI2NDgsNyArMjY1Myw3IEBACiAgKi8KIGludCBibGtkZXZfaXNzdWVfZmx1c2goc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgKmVycm9yX3NlY3RvcikKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAlpZiAoYmRldi0+YmRfZGlzayA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMjY4NCw3ICsyNjg5LDcgQEAKICAqIHF1ZXVlIGxvY2sgaXMgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZCwgYXMgd2UgbXVjayB3aXRoIHRoZQogICogcmVxdWVzdCBxdWV1ZSBsaXN0LgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSwgc3RydWN0IHJlcXVlc3QgKiByZXEpCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxLCBzdHJ1Y3QgcmVxdWVzdCAqIHJlcSkKIHsKIAlkcml2ZV9zdGF0X2FjY3QocmVxLCByZXEtPm5yX3NlY3RvcnMsIDEpOwogCkBAIC0yNzMwLDcgKzI3MzUsNyBAQAogLyoKICAqIHF1ZXVlIGxvY2sgbXVzdCBiZSBoZWxkCiAgKi8KLXZvaWQgX19ibGtfcHV0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQordm9pZCBfX2Jsa19wdXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlpZiAodW5saWtlbHkoIXEpKQogCQlyZXR1cm47CkBAIC0yNzYwLDcgKzI3NjUsNyBAQAogdm9pZCBibGtfcHV0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHJlcS0+cTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHJlcS0+cTsKIAogCS8qCiAJICogR2VlLCBJREUgY2FsbHMgaW4gdy8gTlVMTCBxLiAgRml4IElERSBhbmQgcmVtb3ZlIHRoZQpAQCAtMjc5OCw3ICsyODAzLDcgQEAKIC8qCiAgKiBIYXMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIHJlcXVlc3Qgc3BpbmxvY2sgYWNxdWlyZWQKICAqLwotc3RhdGljIGludCBhdHRlbXB0X21lcmdlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKK3N0YXRpYyBpbnQgYXR0ZW1wdF9tZXJnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSwKIAkJCSAgc3RydWN0IHJlcXVlc3QgKm5leHQpCiB7CiAJaWYgKCFycV9tZXJnZWFibGUocmVxKSB8fCAhcnFfbWVyZ2VhYmxlKG5leHQpKQpAQCAtMjg1MSw3ICsyODU2LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXR0ZW1wdF9iYWNrX21lcmdlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIGlubGluZSBpbnQgYXR0ZW1wdF9iYWNrX21lcmdlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSAgICAgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCByZXF1ZXN0ICpuZXh0ID0gZWx2X2xhdHRlcl9yZXF1ZXN0KHEsIHJxKTsKIApAQCAtMjg2MSw3ICsyODY3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXR0ZW1wdF9mcm9udF9tZXJnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyBpbmxpbmUgaW50IGF0dGVtcHRfZnJvbnRfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJICAgICAgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCByZXF1ZXN0ICpwcmV2ID0gZWx2X2Zvcm1lcl9yZXF1ZXN0KHEsIHJxKTsKIApAQCAtMjkwNSw3ICsyOTEyLDcgQEAKIAlyZXEtPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogfQogCi1zdGF0aWMgaW50IF9fbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAJaW50IGVsX3JldCwgbnJfc2VjdG9ycywgYmFycmllciwgZXJyOwpAQCAtMzExOSw3ICszMTI2LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIF9fZ2VuZXJpY19tYWtlX3JlcXVlc3Qoc3RydWN0IGJpbyAqYmlvKQogewotCXJlcXVlc3RfcXVldWVfdCAqcTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAlzZWN0b3JfdCBtYXhzZWN0b3I7CiAJc2VjdG9yX3Qgb2xkX3NlY3RvcjsKIAlpbnQgcmV0LCBucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKQEAgLTMzMTIsNyArMzMxOSw3IEBACiAJc3RydWN0IGJpbyAqYmlvLCAqcHJldmJpbyA9IE5VTEw7CiAJaW50IG5yX3BoeXNfc2VncywgbnJfaHdfc2VnczsKIAl1bnNpZ25lZCBpbnQgcGh5c19zaXplLCBod19zaXplOwotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHJxLT5xOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7CiAKIAlpZiAoIXJxLT5iaW8pCiAJCXJldHVybjsKQEAgLTM2NTgsNyArMzY2NSw4IEBACiAKIEVYUE9SVF9TWU1CT0woZW5kX3JlcXVlc3QpOwogCi12b2lkIGJsa19ycV9iaW9fcHJlcChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IGJpbyAqYmlvKQordm9pZCBibGtfcnFfYmlvX3ByZXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJICAgICBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJLyogZmlyc3QgdHdvIGJpdHMgYXJlIGlkZW50aWNhbCBpbiBycS0+Y21kX2ZsYWdzIGFuZCBiaW8tPmJpX3J3ICovCiAJcnEtPmNtZF9mbGFncyB8PSAoYmlvLT5iaV9ydyAmIDMpOwpAQCAtMzcwMSw3ICszNzA5LDcgQEAKIAkJCXNpemVvZihzdHJ1Y3QgcmVxdWVzdCksIDAsIFNMQUJfUEFOSUMsIE5VTEwpOwogCiAJcmVxdWVzdHFfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImJsa2Rldl9xdWV1ZSIsCi0JCQlzaXplb2YocmVxdWVzdF9xdWV1ZV90KSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7CisJCQlzaXplb2Yoc3RydWN0IHJlcXVlc3RfcXVldWUpLCAwLCBTTEFCX1BBTklDLCBOVUxMKTsKIAogCWlvY29udGV4dF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmxrZGV2X2lvYyIsCiAJCQlzaXplb2Yoc3RydWN0IGlvX2NvbnRleHQpLCAwLCBTTEFCX1BBTklDLCBOVUxMKTsKQEAgLTQwMjEsNyArNDAyOSw4IEBACiBxdWV1ZV9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCiB7CiAJc3RydWN0IHF1ZXVlX3N5c2ZzX2VudHJ5ICplbnRyeSA9IHRvX3F1ZXVlKGF0dHIpOwotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSwga29iaik7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPQorCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHJlcXVlc3RfcXVldWUsIGtvYmopOwogCXNzaXplX3QgcmVzOwogCiAJaWYgKCFlbnRyeS0+c2hvdykKQEAgLTQwNDEsNyArNDA1MCw3IEBACiAJCSAgICBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgbGVuZ3RoKQogewogCXN0cnVjdCBxdWV1ZV9zeXNmc19lbnRyeSAqZW50cnkgPSB0b19xdWV1ZShhdHRyKTsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHJlcXVlc3RfcXVldWUsIGtvYmopOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlLCBrb2JqKTsKIAogCXNzaXplX3QgcmVzOwogCkBAIC00MDcyLDcgKzQwODEsNyBAQAogewogCWludCByZXQ7CiAKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRpc2stPnF1ZXVlOwogCiAJaWYgKCFxIHx8ICFxLT5yZXF1ZXN0X2ZuKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtNDA5Nyw3ICs0MTA2LDcgQEAKIAogdm9pZCBibGtfdW5yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRpc2stPnF1ZXVlOwogCiAJaWYgKHEgJiYgcS0+cmVxdWVzdF9mbikgewogCQllbHZfdW5yZWdpc3Rlcl9xdWV1ZShxKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL25vb3AtaW9zY2hlZC5jIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKaW5kZXggMWMzZGUyYi4uNzU2M2Q4YSAxMDA2NDQKLS0tIGEvYmxvY2svbm9vcC1pb3NjaGVkLmMKKysrIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKQEAgLTExLDEzICsxMSwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CiB9OwogCi1zdGF0aWMgdm9pZCBub29wX21lcmdlZF9yZXF1ZXN0cyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKK3N0YXRpYyB2b2lkIG5vb3BfbWVyZ2VkX3JlcXVlc3RzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJIHN0cnVjdCByZXF1ZXN0ICpuZXh0KQogewogCWxpc3RfZGVsX2luaXQoJm5leHQtPnF1ZXVlbGlzdCk7CiB9CiAKLXN0YXRpYyBpbnQgbm9vcF9kaXNwYXRjaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBmb3JjZSkKK3N0YXRpYyBpbnQgbm9vcF9kaXNwYXRjaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IGZvcmNlKQogewogCXN0cnVjdCBub29wX2RhdGEgKm5kID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAKQEAgLTMxLDE0ICszMSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBub29wX2FkZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIHZvaWQgbm9vcF9hZGRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBub29wX2RhdGEgKm5kID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAKIAlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmbmQtPnF1ZXVlKTsKIH0KIAotc3RhdGljIGludCBub29wX3F1ZXVlX2VtcHR5KHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyBpbnQgbm9vcF9xdWV1ZV9lbXB0eShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3Qgbm9vcF9kYXRhICpuZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCkBAIC00Niw3ICs0Niw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqCi1ub29wX2Zvcm1lcl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorbm9vcF9mb3JtZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXN0cnVjdCBub29wX2RhdGEgKm5kID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAKQEAgLTU2LDcgKzU2LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKLW5vb3BfbGF0dGVyX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitub29wX2xhdHRlcl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IG5vb3BfZGF0YSAqbmQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIApAQCAtNjUsNyArNjUsNyBAQAogCXJldHVybiBsaXN0X2VudHJ5KHJxLT5xdWV1ZWxpc3QubmV4dCwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCk7CiB9CiAKLXN0YXRpYyB2b2lkICpub29wX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgKm5vb3BfaW5pdF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3Qgbm9vcF9kYXRhICpuZDsKIApkaWZmIC0tZ2l0IGEvYmxvY2svc2NzaV9pb2N0bC5jIGIvYmxvY2svc2NzaV9pb2N0bC5jCmluZGV4IGQzNTlhNzEuLjkxYzczMjIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTQ5LDIyICs0OSwyMiBAQAogCXJldHVybiBwdXRfdXNlcihzZ192ZXJzaW9uX251bSwgcCk7CiB9CiAKLXN0YXRpYyBpbnQgc2NzaV9nZXRfaWRsdW4ocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgX191c2VyICpwKQorc3RhdGljIGludCBzY3NpX2dldF9pZGx1bihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IF9fdXNlciAqcCkKIHsKIAlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CiB9CiAKLXN0YXRpYyBpbnQgc2NzaV9nZXRfYnVzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IF9fdXNlciAqcCkKK3N0YXRpYyBpbnQgc2NzaV9nZXRfYnVzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgX191c2VyICpwKQogewogCXJldHVybiBwdXRfdXNlcigwLCBwKTsKIH0KIAotc3RhdGljIGludCBzZ19nZXRfdGltZW91dChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgaW50IHNnX2dldF90aW1lb3V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXJldHVybiBxLT5zZ190aW1lb3V0IC8gKEhaIC8gVVNFUl9IWik7CiB9CiAKLXN0YXRpYyBpbnQgc2dfc2V0X3RpbWVvdXQocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgX191c2VyICpwKQorc3RhdGljIGludCBzZ19zZXRfdGltZW91dChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IF9fdXNlciAqcCkKIHsKIAlpbnQgdGltZW91dCwgZXJyID0gZ2V0X3VzZXIodGltZW91dCwgcCk7CiAKQEAgLTc0LDE0ICs3NCwxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc2dfZ2V0X3Jlc2VydmVkX3NpemUocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgX191c2VyICpwKQorc3RhdGljIGludCBzZ19nZXRfcmVzZXJ2ZWRfc2l6ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IF9fdXNlciAqcCkKIHsKIAl1bnNpZ25lZCB2YWwgPSBtaW4ocS0+c2dfcmVzZXJ2ZWRfc2l6ZSwgcS0+bWF4X3NlY3RvcnMgPDwgOSk7CiAKIAlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKIH0KIAotc3RhdGljIGludCBzZ19zZXRfcmVzZXJ2ZWRfc2l6ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBfX3VzZXIgKnApCitzdGF0aWMgaW50IHNnX3NldF9yZXNlcnZlZF9zaXplKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgX191c2VyICpwKQogewogCWludCBzaXplLCBlcnIgPSBnZXRfdXNlcihzaXplLCBwKTsKIApAQCAtMTAxLDcgKzEwMSw3IEBACiAgKiB3aWxsIGFsd2F5cyByZXR1cm4gdGhhdCB3ZSBhcmUgQVRBUEkgZXZlbiBmb3IgYSByZWFsIFNDU0kgZHJpdmUsIEknbSBub3QKICAqIHNvIHN1cmUgdGhpcyBpcyB3b3J0aCBkb2luZyBhbnl0aGluZyBhYm91dCAod2h5IHdvdWxkIHlvdSBjYXJlPz8pCiAgKi8KLXN0YXRpYyBpbnQgc2dfZW11bGF0ZWRfaG9zdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBfX3VzZXIgKnApCitzdGF0aWMgaW50IHNnX2VtdWxhdGVkX2hvc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBfX3VzZXIgKnApCiB7CiAJcmV0dXJuIHB1dF91c2VyKDEsIHApOwogfQpAQCAtMjE0LDcgKzIxNCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChibGtfdmVyaWZ5X2NvbW1hbmQpOwogCi1zdGF0aWMgaW50IGJsa19maWxsX3NnaGRyX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorc3RhdGljIGludCBibGtfZmlsbF9zZ2hkcl9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJICAgICBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIsIGludCBoYXNfd3JpdGVfcGVybSkKIHsKIAltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLwpAQCAtMjg2LDcgKzI4Niw3IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgc2dfaW8oc3RydWN0IGZpbGUgKmZpbGUsIHJlcXVlc3RfcXVldWVfdCAqcSwKK3N0YXRpYyBpbnQgc2dfaW8oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQlzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywgc3RydWN0IHNnX2lvX2hkciAqaGRyKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKQEAgLTUxOSw3ICs1MTksOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2dfc2NzaV9pb2N0bCk7CiAKIC8qIFNlbmQgYmFzaWMgYmxvY2sgcmVxdWVzdHMgKi8KLXN0YXRpYyBpbnQgX19ibGtfc2VuZF9nZW5lcmljKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIGludCBjbWQsIGludCBkYXRhKQorc3RhdGljIGludCBfX2Jsa19zZW5kX2dlbmVyaWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLAorCQkJICAgICAgaW50IGNtZCwgaW50IGRhdGEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCBlcnI7CkBAIC01MzksNyArNTQwLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBibGtfc2VuZF9zdGFydF9zdG9wKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIGludCBkYXRhKQorc3RhdGljIGlubGluZSBpbnQgYmxrX3NlbmRfc3RhcnRfc3RvcChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgICAgICBzdHJ1Y3QgZ2VuZGlzayAqYmRfZGlzaywgaW50IGRhdGEpCiB7CiAJcmV0dXJuIF9fYmxrX3NlbmRfZ2VuZXJpYyhxLCBiZF9kaXNrLCBHUENNRF9TVEFSVF9TVE9QX1VOSVQsIGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY29ybi9ibG9jay9mZDE3NzIuYyBiL2RyaXZlcnMvYWNvcm4vYmxvY2svZmQxNzcyLmMKaW5kZXggNDIzZWQwOC4uZDdlMThjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY29ybi9ibG9jay9mZDE3NzIuYworKysgYi9kcml2ZXJzL2Fjb3JuL2Jsb2NrL2ZkMTc3Mi5jCkBAIC0zNzIsNyArMzcyLDcgQEAKIHN0YXRpYyB2b2lkIGNvbmZpZ190eXBlcyh2b2lkKTsKIHN0YXRpYyBpbnQgZmxvcHB5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIGludCBmbG9wcHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqKTsKK3N0YXRpYyB2b2lkIGRvX2ZkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QqIHEpCitzdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlKiBxKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNvcm4vYmxvY2svbWZtaGQuYyBiL2RyaXZlcnMvYWNvcm4vYmxvY2svbWZtaGQuYwppbmRleCBkODU1MjBmLi43NDA1OGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Fjb3JuL2Jsb2NrL21mbWhkLmMKKysrIGIvZHJpdmVycy9hY29ybi9ibG9jay9tZm1oZC5jCkBAIC05MjQsNyArOTI0LDcgQEAKIAlEQkcoIm1mbV9yZXF1ZXN0OiBEcm9wcGluZyBvdXQgYm90dG9tXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZG9fbWZtX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgZG9fbWZtX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJREJHKCJkb19tZm1fcmVxdWVzdDogYWJvdXQgdG8gbWZtX3JlcXVlc3RcbiIpOwogCW1mbV9yZXF1ZXN0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IDQwOGI0NTEuLjkzNGQ2MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC00Myw1MSArNDMsMzkgQEAKIGlmIEFDUEkKIAogY29uZmlnIEFDUElfU0xFRVAKLQlib29sICJTbGVlcCBTdGF0ZXMiCi0JZGVwZW5kcyBvbiBYODYgJiYgKCFTTVAgfHwgU1VTUEVORF9TTVApCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBBQ1BJIHN1c3BlbmQgc3RhdGVzLiAKLQotCSAgV2l0aCB0aGlzIG9wdGlvbiwgeW91IHdpbGwgYmUgYWJsZSB0byBwdXQgdGhlIHN5c3RlbSAidG8gc2xlZXAiLiAKLQkgIFNsZWVwIHN0YXRlcyBhcmUgbG93IHBvd2VyIHN0YXRlcyBmb3IgdGhlIHN5c3RlbSBhbmQgZGV2aWNlcy4gQWxsCi0JICBvZiB0aGUgc3lzdGVtIG9wZXJhdGluZyBzdGF0ZSBpcyBzYXZlZCB0byBlaXRoZXIgbWVtb3J5IG9yIGRpc2sKLQkgIChkZXBlbmRpbmcgb24gdGhlIHN0YXRlKSwgdG8gYWxsb3cgdGhlIHN5c3RlbSB0byByZXN1bWUgb3BlcmF0aW9uCi0JICBxdWlja2x5IGF0IHlvdXIgcmVxdWVzdC4KLQotCSAgQWx0aG91Z2ggdGhpcyBvcHRpb24gc291bmRzIHJlYWxseSBuaWZ0eSwgYmFyZWx5IGFueSBvZiB0aGUgZGV2aWNlCi0JICBkcml2ZXJzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBkcml2ZXIgbW9kZWwgYW5kIGhlbmNlIGZldwotCSAgaGF2ZSBwcm9wZXIgcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0LiAKLQotCSAgVGhpcyBvcHRpb24gaXMgbm90IHJlY29tbWVuZGVkIGZvciBhbnlvbmUgZXhjZXB0IHRob3NlIGRvaW5nIGRyaXZlcgotCSAgcG93ZXIgbWFuYWdlbWVudCBkZXZlbG9wbWVudC4KLQotY29uZmlnIEFDUElfU0xFRVBfUFJPQ19GUwogCWJvb2wKLQlkZXBlbmRzIG9uIEFDUElfU0xFRVAgJiYgUFJPQ19GUworCWRlcGVuZHMgb24gUE1fU0xFRVAKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFDUElfU0xFRVBfUFJPQ19TTEVFUAorY29uZmlnIEFDUElfUFJPQ0ZTCisJYm9vbCAiRGVwcmVjYXRlZCAvcHJvYy9hY3BpIGZpbGVzIgorCWRlcGVuZHMgb24gUFJPQ19GUworCS0tLWhlbHAtLS0KKwkgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBvcHRpb24gYWxsb3dzCisJICBkZXByaWNhdGVkIC9wcm9jL2FjcGkvIGZpbGVzIHRvIGV4aXN0LCBldmVuIHdoZW4KKwkgIHRoZXkgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IGZ1bmN0aW9ucyBpbiAvc3lzLgorCSAgVGhlIGRlcHJlY2F0ZWQgZmlsZXMgKGFuZCB0aGVpciByZXBsYWNlbWVudHMpIGluY2x1ZGU6CisKKwkgIC9wcm9jL2FjcGkvc2xlZXAgKC9zeXMvcG93ZXIvc3RhdGUpCisJICAvcHJvYy9hY3BpL2luZm8gKC9zeXMvbW9kdWxlcy9hY3BpL3BhcmFtZXRlcnMvYWNwaWNhX3ZlcnNpb24pCisJICAvcHJvYy9hY3BpL2RzZHQgKC9zeXMvZmlybXdhcmUvYWNwaS90YWJsZXMvRFNEVCkKKwkgIC9wcm9jL2FjcGkvZmFkdCAoL3N5cy9maXJtd2FyZS9hY3BpL3RhYmxlcy9GQUNQKQorCSAgL3Byb2MvYWNwaS9kZWJ1Z19sYXllciAoL3N5cy9tb2R1bGUvYWNwaS9wYXJhbWV0ZXJzL2RlYnVnX2xheWVyKQorCSAgL3Byb2MvYWNwaS9kZWJ1Z19sZXZlbCAoL3N5cy9tb2R1bGUvYWNwaS9wYXJhbWV0ZXJzL2RlYnVnX2xldmVsKQorCisJICBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIC9wcm9jL2FjcGkvIGZpbGVzCisJICBhbmQgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCB5ZXQgZXhpc3QgaW4gL3N5cy4KKworCSAgU2F5IE4gdG8gZGVsZXRlIC9wcm9jL2FjcGkvIGZpbGVzIHRoYXQgaGF2ZSBtb3ZlZCB0byAvc3lzLworCitjb25maWcgQUNQSV9QUk9DRlNfU0xFRVAKIAlib29sICIvcHJvYy9hY3BpL3NsZWVwIChkZXByZWNhdGVkKSIKLQlkZXBlbmRzIG9uIEFDUElfU0xFRVBfUFJPQ19GUworCWRlcGVuZHMgb24gUE1fU0xFRVAgJiYgQUNQSV9QUk9DRlMKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJICBDcmVhdGUgL3Byb2MvYWNwaS9zbGVlcAogCSAgRGVwcmVjYXRlZCBieSAvc3lzL3Bvd2VyL3N0YXRlCiAKLWNvbmZpZyBBQ1BJX1BST0NGUwotCWJvb2wgIlByb2NmcyBpbnRlcmZhY2UgKGRlcHJlY2F0ZWQpIgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIFRoZSBQcm9jZnMgaW50ZXJmYWNlIGZvciBBQ1BJIGlzIG1hZGUgb3B0aW9uYWwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0JICBBcyB0aGUgc2FtZSBmdW5jdGlvbnMgYXJlIGR1cGxpY2F0ZWQgaW4gdGhlIHN5c2ZzIGludGVyZmFjZQotCSAgYW5kIHRoaXMgcHJvYyBpbnRlcmZhY2Ugd2lsbCBiZSByZW1vdmVkIHNvbWUgdGltZSBsYXRlciwKLQkgIGl0J3MgbWFya2VkIGFzIGRlcHJlY2F0ZWQuCi0JICAoIC9wcm9jL2FjcGkvZGVidWdfbGF5ZXIgJiYgZGVidWdfbGV2ZWwgYXJlIGRlcHJlY2F0ZWQgYnkKLQkgICAgL3N5cy9tb2R1bGUvYWNwaS9wYXJhbWV0ZXJzL2RlYnVnX2xheWVyICYmIGRlYnVnX2xldmVsLgotCSAgICAvcHJvYy9hY3BpL2luZm8gaXMgZGVwcmVjYXRlZCBieQotCSAgICAvc3lzL21vZHVsZS9hY3BpL3BhcmFtZXRlcnMvYWNwaWNhX3ZlcnNpb24gKQotCiBjb25maWcgQUNQSV9BQwogCXRyaXN0YXRlICJBQyBBZGFwdGVyIgogCWRlcGVuZHMgb24gWDg2CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWMuYyBiL2RyaXZlcnMvYWNwaS9hYy5jCmluZGV4IDM3YzdkYzQuLmQ4YjM1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hYy5jCkBAIC0zNCw3ICszNCw2IEBACiAKICNkZWZpbmUgQUNQSV9BQ19DT01QT05FTlQJCTB4MDAwMjAwMDAKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJCSJhY19hZGFwdGVyIgotI2RlZmluZSBBQ1BJX0FDX0hJRCAJCQkiQUNQSTAwMDMiCiAjZGVmaW5lIEFDUElfQUNfREVWSUNFX05BTUUJCSJBQyBBZGFwdGVyIgogI2RlZmluZSBBQ1BJX0FDX0ZJTEVfU1RBVEUJCSJzdGF0ZSIKICNkZWZpbmUgQUNQSV9BQ19OT1RJRllfU1RBVFVTCQkweDgwCkBAIC01NiwxMCArNTUsMTYgQEAKIHN0YXRpYyBpbnQgYWNwaV9hY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9hY19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAorY29uc3Qgc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZV9pZCBhY19kZXZpY2VfaWRzW10gPSB7CisJeyJBQ1BJMDAwMyIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBhY19kZXZpY2VfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2FjX2RyaXZlciA9IHsKIAkubmFtZSA9ICJhYyIsCiAJLmNsYXNzID0gQUNQSV9BQ19DTEFTUywKLQkuaWRzID0gQUNQSV9BQ19ISUQsCisJLmlkcyA9IGFjX2RldmljZV9pZHMsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfYWNfYWRkLAogCQkucmVtb3ZlID0gYWNwaV9hY19yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKaW5kZXggZTY1NjI4YS4uNWYxMTI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwpAQCAtNTMsMTAgKzUzLDE2IEBACiBzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2RldmljZV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBtZW1vcnlfZGV2aWNlX2lkc1tdID0geworCXtBQ1BJX01FTU9SWV9ERVZJQ0VfSElELCAwfSwKKwl7IiIsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgbWVtb3J5X2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfbWVtb3J5X2RldmljZV9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiYWNwaV9tZW1ob3RwbHVnIiwKIAkuY2xhc3MgPSBBQ1BJX01FTU9SWV9ERVZJQ0VfQ0xBU1MsCi0JLmlkcyA9IEFDUElfTUVNT1JZX0RFVklDRV9ISUQsCisJLmlkcyA9IG1lbW9yeV9kZXZpY2VfaWRzLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX21lbW9yeV9kZXZpY2VfYWRkLAogCQkucmVtb3ZlID0gYWNwaV9tZW1vcnlfZGV2aWNlX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwppbmRleCAzY2Q3OWNhLi45YzRiZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCkBAIC01Niw3ICs1Niw2IEBACiAjZGVmaW5lIEFDUElfSE9US19OQU1FICAgICAgICAgICJBc3VzIExhcHRvcCBBQ1BJIEV4dHJhcyBEcml2ZXIiCiAjZGVmaW5lIEFDUElfSE9US19DTEFTUyAgICAgICAgICJob3RrZXkiCiAjZGVmaW5lIEFDUElfSE9US19ERVZJQ0VfTkFNRSAgICJIb3RrZXkiCi0jZGVmaW5lIEFDUElfSE9US19ISUQgICAgICAgICAgICJBVEswMTAwIgogCiAvKgogICogU29tZSBldmVudHMgd2UgdXNlLCBzYW1lIGZvciBhbGwgQXN1cwpAQCAtNDI2LDE0ICs0MjUsMjAgQEAKIHN0YXRpYyBzdHJ1Y3QgYXN1c19ob3RrICpob3RrOwogCiAvKgotICogVGhlIGhvdGtleSBkcml2ZXIgZGVjbGFyYXRpb24KKyAqIFRoZSBob3RrZXkgZHJpdmVyIGFuZCBhdXRvbG9hZGluZyBkZWNsYXJhdGlvbgogICovCiBzdGF0aWMgaW50IGFzdXNfaG90a19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhc3VzX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGFzdXNfZGV2aWNlX2lkc1tdID0geworCXsiQVRLMDEwMCIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBhc3VzX2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFzdXNfaG90a19kcml2ZXIgPSB7CiAJLm5hbWUgPSAiYXN1c19hY3BpIiwKIAkuY2xhc3MgPSBBQ1BJX0hPVEtfQ0xBU1MsCi0JLmlkcyA9IEFDUElfSE9US19ISUQsCisJLmlkcyA9IGFzdXNfZGV2aWNlX2lkcywKIAkub3BzID0gewogCQkuYWRkID0gYXN1c19ob3RrX2FkZCwKIAkJLnJlbW92ZSA9IGFzdXNfaG90a19yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCBjYWQ5MzJkLi44MTY1MTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTQxLDcgKzQxLDYgQEAKIAogI2RlZmluZSBBQ1BJX0JBVFRFUllfQ09NUE9ORU5UCQkweDAwMDQwMDAwCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9DTEFTUwkJImJhdHRlcnkiCi0jZGVmaW5lIEFDUElfQkFUVEVSWV9ISUQJCSJQTlAwQzBBIgogI2RlZmluZSBBQ1BJX0JBVFRFUllfREVWSUNFX05BTUUJIkJhdHRlcnkiCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9OT1RJRllfU1RBVFVTCTB4ODAKICNkZWZpbmUgQUNQSV9CQVRURVJZX05PVElGWV9JTkZPCTB4ODEKQEAgLTc0LDEwICs3MywxNiBAQAogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJhdHRlcnlfZGV2aWNlX2lkc1tdID0geworCXsiUE5QMEMwQSIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBiYXR0ZXJ5X2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYmF0dGVyeV9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiYmF0dGVyeSIsCiAJLmNsYXNzID0gQUNQSV9CQVRURVJZX0NMQVNTLAotCS5pZHMgPSBBQ1BJX0JBVFRFUllfSElELAorCS5pZHMgPSBiYXR0ZXJ5X2RldmljZV9pZHMsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfYmF0dGVyeV9hZGQsCiAJCS5yZXN1bWUgPSBhY3BpX2JhdHRlcnlfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCmluZGV4IGNiNDExMGIuLjU0MDU4MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXR0b24uYworKysgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKQEAgLTY2LDYgKzY2LDE2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgQnV0dG9uIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJ1dHRvbl9kZXZpY2VfaWRzW10gPSB7CisJe0FDUElfQlVUVE9OX0hJRF9MSUQsICAgIDB9LAorCXtBQ1BJX0JVVFRPTl9ISURfU0xFRVAsICAwfSwKKwl7QUNQSV9CVVRUT05fSElEX1NMRUVQRiwgMH0sCisJe0FDUElfQlVUVE9OX0hJRF9QT1dFUiwgIDB9LAorCXtBQ1BJX0JVVFRPTl9ISURfUE9XRVJGLCAwfSwKKwl7IiIsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgYnV0dG9uX2RldmljZV9pZHMpOworCiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX2J1dHRvbl9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtNzQsNyArODQsNyBAQAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2J1dHRvbl9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiYnV0dG9uIiwKIAkuY2xhc3MgPSBBQ1BJX0JVVFRPTl9DTEFTUywKLQkuaWRzID0gImJ1dHRvbl9wb3dlcixidXR0b25fc2xlZXAsUE5QMEMwRCxQTlAwQzBDLFBOUDBDMEUiLAorCS5pZHMgPSBidXR0b25fZGV2aWNlX2lkcywKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV9idXR0b25fYWRkLAogCQkucmVtb3ZlID0gYWNwaV9idXR0b25fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCmluZGV4IDBkZDNiZjcuLjNjMjVlYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKQEAgLTUyLDEwICs1MiwxOCBAQAogc3RhdGljIGludCBhY3BpX2NvbnRhaW5lcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2NvbnRhaW5lcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBjb250YWluZXJfZGV2aWNlX2lkc1tdID0geworCXsiQUNQSTAwMDQiLCAwfSwKKwl7IlBOUDBBMDUiLCAwfSwKKwl7IlBOUDBBMDYiLCAwfSwKKwl7IiIsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgY29udGFpbmVyX2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfY29udGFpbmVyX2RyaXZlciA9IHsKIAkubmFtZSA9ICJjb250YWluZXIiLAogCS5jbGFzcyA9IEFDUElfQ09OVEFJTkVSX0NMQVNTLAotCS5pZHMgPSAiQUNQSTAwMDQsUE5QMEEwNSxQTlAwQTA2IiwKKwkuaWRzID0gY29udGFpbmVyX2RldmljZV9pZHMsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfY29udGFpbmVyX2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfY29udGFpbmVyX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggMTBlODUxMC4uNDY5ZjNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KIAogI2RlZmluZSBBQ1BJX0VDX0NMQVNTCQkJImVtYmVkZGVkX2NvbnRyb2xsZXIiCi0jZGVmaW5lIEFDUElfRUNfSElECQkJIlBOUDBDMDkiCiAjZGVmaW5lIEFDUElfRUNfREVWSUNFX05BTUUJCSJFbWJlZGRlZCBDb250cm9sbGVyIgogI2RlZmluZSBBQ1BJX0VDX0ZJTEVfSU5GTwkJImluZm8iCiAKQEAgLTgyLDEwICs4MSwxNSBAQAogc3RhdGljIGludCBhY3BpX2VjX3N0b3Aoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGVjX2RldmljZV9pZHNbXSA9IHsKKwl7IlBOUDBDMDkiLCAwfSwKKwl7IiIsIDB9LAorfTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2VjX2RyaXZlciA9IHsKIAkubmFtZSA9ICJlYyIsCiAJLmNsYXNzID0gQUNQSV9FQ19DTEFTUywKLQkuaWRzID0gQUNQSV9FQ19ISUQsCisJLmlkcyA9IGVjX2RldmljZV9pZHMsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfZWNfYWRkLAogCQkucmVtb3ZlID0gYWNwaV9lY19yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKaW5kZXggMjNlZTdiYy4uYjFhYWEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiBzdGF0aWMgdTggYWNwaV9ldl9pc19wY2lfcm9vdF9icmlkZ2Uoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2RldmljZV9pZCBoaWQ7CisJc3RydWN0IGFjcGljYV9kZXZpY2VfaWQgaGlkOwogCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Zhbi5jIGIvZHJpdmVycy9hY3BpL2Zhbi5jCmluZGV4IGVjNjU1YzUuLmM4MWY2YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9mYW4uYworKysgYi9kcml2ZXJzL2FjcGkvZmFuLmMKQEAgLTUwLDEwICs1MCwxNiBAQAogc3RhdGljIGludCBhY3BpX2Zhbl9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogc3RhdGljIGludCBhY3BpX2Zhbl9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGZhbl9kZXZpY2VfaWRzW10gPSB7CisJeyJQTlAwQzBCIiwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGZhbl9kZXZpY2VfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2Zhbl9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiZmFuIiwKIAkuY2xhc3MgPSBBQ1BJX0ZBTl9DTEFTUywKLQkuaWRzID0gIlBOUDBDMEIiLAorCS5pZHMgPSBmYW5fZGV2aWNlX2lkcywKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV9mYW5fYWRkLAogCQkucmVtb3ZlID0gYWNwaV9mYW5fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCmluZGV4IGJlNGYyODkuLmFiNjViMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAl1MzIgZmxhZ3M7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkIGhpZDsKKwlzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCBoaWQ7CiAJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWQ7CiAJYWNwaV9uYXRpdmVfdWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCmluZGV4IDM0NDhlZGQuLmM5ZjUyNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCkBAIC00Niw3ICs0Niw2IEBACiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgicGNpX2xpbmsiKTsKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19DTEFTUwkJInBjaV9pcnFfcm91dGluZyIKLSNkZWZpbmUgQUNQSV9QQ0lfTElOS19ISUQJCSJQTlAwQzBGIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0RFVklDRV9OQU1FCSJQQ0kgSW50ZXJydXB0IExpbmsiCiAjZGVmaW5lIEFDUElfUENJX0xJTktfRklMRV9JTkZPCQkiaW5mbyIKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19GSUxFX1NUQVRVUwkic3RhdGUiCkBAIC01NCwxMCArNTMsMTYgQEAKIHN0YXRpYyBpbnQgYWNwaV9wY2lfbGlua19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3BjaV9saW5rX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGxpbmtfZGV2aWNlX2lkc1tdID0geworCXsiUE5QMEMwRiIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBsaW5rX2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX2xpbmtfZHJpdmVyID0gewogCS5uYW1lID0gInBjaV9saW5rIiwKIAkuY2xhc3MgPSBBQ1BJX1BDSV9MSU5LX0NMQVNTLAotCS5pZHMgPSBBQ1BJX1BDSV9MSU5LX0hJRCwKKwkuaWRzID0gbGlua19kZXZpY2VfaWRzLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3BjaV9saW5rX2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfcGNpX2xpbmtfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCBhZDQxNDVhLi5mMTRmZjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtMzgsMTYgKzM4LDIxIEBACiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgicGNpX3Jvb3QiKTsKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9DTEFTUwkJInBjaV9icmlkZ2UiCi0jZGVmaW5lIEFDUElfUENJX1JPT1RfSElECQkiUE5QMEEwMyIKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9ERVZJQ0VfTkFNRQkiUENJIFJvb3QgQnJpZGdlIgogc3RhdGljIGludCBhY3BpX3BjaV9yb290X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3Rfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHJvb3RfZGV2aWNlX2lkc1tdID0geworCXsiUE5QMEEwMyIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCByb290X2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX3Jvb3RfZHJpdmVyID0gewogCS5uYW1lID0gInBjaV9yb290IiwKIAkuY2xhc3MgPSBBQ1BJX1BDSV9ST09UX0NMQVNTLAotCS5pZHMgPSBBQ1BJX1BDSV9ST09UX0hJRCwKKwkuaWRzID0gcm9vdF9kZXZpY2VfaWRzLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3BjaV9yb290X2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMgYi9kcml2ZXJzL2FjcGkvcG93ZXIuYwppbmRleCA0ZmZlY2QxLi41N2I5YTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcG93ZXIuYworKysgYi9kcml2ZXJzL2FjcGkvcG93ZXIuYwpAQCAtNTksMTAgKzU5LDE2IEBACiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcl9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAorc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZV9pZCBwb3dlcl9kZXZpY2VfaWRzW10gPSB7CisJe0FDUElfUE9XRVJfSElELCAwfSwKKwl7IiIsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgcG93ZXJfZGV2aWNlX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wb3dlcl9kcml2ZXIgPSB7CiAJLm5hbWUgPSAicG93ZXIiLAogCS5jbGFzcyA9IEFDUElfUE9XRVJfQ0xBU1MsCi0JLmlkcyA9IEFDUElfUE9XRVJfSElELAorCS5pZHMgPSBwb3dlcl9kZXZpY2VfaWRzLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3Bvd2VyX2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfcG93ZXJfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCA4MWFjZWI1Li40OTg0MjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtODgsMTAgKzg4LDE2IEBACiBleHRlcm4gaW50IGFjcGlfcHJvY2Vzc29yX3RzdGF0ZV9oYXNfY2hhbmdlZChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIAogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHByb2Nlc3Nvcl9kZXZpY2VfaWRzW10gPSB7CisJe0FDUElfUFJPQ0VTU09SX0hJRCwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHByb2Nlc3Nvcl9kZXZpY2VfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3Byb2Nlc3Nvcl9kcml2ZXIgPSB7CiAJLm5hbWUgPSAicHJvY2Vzc29yIiwKIAkuY2xhc3MgPSBBQ1BJX1BST0NFU1NPUl9DTEFTUywKLQkuaWRzID0gQUNQSV9QUk9DRVNTT1JfSElELAorCS5pZHMgPSBwcm9jZXNzb3JfZGV2aWNlX2lkcywKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV9wcm9jZXNzb3JfYWRkLAogCQkucmVtb3ZlID0gYWNwaV9wcm9jZXNzb3JfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwppbmRleCAzZjU1ZDFmLi4wYjgyMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwpAQCAtNDcsNiArNDcsOSBAQAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpOwogCisvKgorICogX1RQQyAtIFRocm90dGxpbmcgUHJlc2VudCBDYXBhYmlsaXRpZXMKKyAqLwogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcGxhdGZvcm1fbGltaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwpAQCAtNTUsOCArNTgsMTAgQEAKIAlpZiAoIXByKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIocHItPmhhbmRsZSwgIl9UUEMiLCBOVUxMLCAmdHBjKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRXZhbHVhdGluZyBfVFBDIikpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkV2YWx1YXRpbmcgX1RQQyIpKTsKKwkJfQogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcHItPnRocm90dGxpbmdfcGxhdGZvcm1fbGltaXQgPSAoaW50KXRwYzsKQEAgLTY4LDkgKzczLDkgQEAKIAlyZXR1cm4gYWNwaV9wcm9jZXNzb3JfZ2V0X3BsYXRmb3JtX2xpbWl0KHByKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BUQywgX1RTUywgX1RTRCBzdXBwb3J0IAotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBfUFRDIC0gUHJvY2Vzc29yIFRocm90dGxpbmcgQ29udHJvbCAoYW5kIHN0YXR1cykgcmVnaXN0ZXIgbG9jYXRpb24KKyAqLwogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19jb250cm9sKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC04MSw3ICs4Niw5IEBACiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX1BUQyIsIE5VTEwsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRXZhbHVhdGluZyBfUFRDIikpOworCQlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkV2YWx1YXRpbmcgX1BUQyIpKTsKKwkJfQogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEzMiw2ICsxMzksMTAgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CisKKy8qCisgKiBfVFNTIC0gVGhyb3R0bGluZyBTdXBwb3J0ZWQgU3RhdGVzCisgKi8KIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfc3RhdGVzKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xNDQsNyArMTU1LDkgQEAKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsICJfVFNTIiwgTlVMTCwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJFdmFsdWF0aW5nIF9UU1MiKSk7CisJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRXZhbHVhdGluZyBfVFNTIikpOworCQl9CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMjAxLDYgKzIxNCwxMCBAQAogCiAJcmV0dXJuIHJlc3VsdDsKIH0KKworLyoKKyAqIF9UU0QgLSBULVN0YXRlIERlcGVuZGVuY2llcworICovCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF90c2Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTIxMyw2ICsyMzAsOSBAQAogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9UU0QiLCBOVUxMLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJFdmFsdWF0aW5nIF9UU0QiKSk7CisJCX0KIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC01MjUsOSArNTQ1LDYgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgc3RlcCA9IDA7CiAJaW50IGkgPSAwOwotCWludCBub19wdGMgPSAwOwotCWludCBub190c3MgPSAwOwotCWludCBub190c2QgPSAwOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAogCQkJICAicGJsa19hZGRyZXNzWzB4JTA4eF0gZHV0eV9vZmZzZXRbJWRdIGR1dHlfd2lkdGhbJWRdXG4iLApAQCAtNTM4LDEyICs1NTUsMTQgQEAKIAlpZiAoIXByKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFRCRDogU3VwcG9ydCBBQ1BJIDIuMCBvYmplY3RzICovCi0Jbm9fcHRjID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfY29udHJvbChwcik7Ci0Jbm9fdHNzID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfc3RhdGVzKHByKTsKLQlub190c2QgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfdHNkKHByKTsKLQotCWlmIChub19wdGMgfHwgbm9fdHNzKSB7CisJLyoKKwkgKiBFdmFsdWF0ZSBfUFRDLCBfVFNTIGFuZCBfVFBDCisJICogVGhleSBtdXN0IGFsbCBiZSBwcmVzZW50IG9yIG5vbmUgb2YgdGhlbSBjYW4gYmUgdXNlZC4KKwkgKi8KKwlpZiAoYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfY29udHJvbChwcikgfHwKKwkJYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfc3RhdGVzKHByKSB8fAorCQlhY3BpX3Byb2Nlc3Nvcl9nZXRfcGxhdGZvcm1fbGltaXQocHIpKQorCXsKIAkJcHItPnRocm90dGxpbmcuYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmcgPQogCQkgICAgJmFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nX2ZhZHQ7CiAJCXByLT50aHJvdHRsaW5nLmFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nID0KQEAgLTU1NSw2ICs1NzQsOCBAQAogCQkgICAgJmFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nX3B0YzsKIAl9CiAKKwlhY3BpX3Byb2Nlc3Nvcl9nZXRfdHNkKHByKTsKKwogCWlmICghcHItPnRocm90dGxpbmcuYWRkcmVzcykgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyB0aHJvdHRsaW5nIHJlZ2lzdGVyXG4iKSk7CiAJCXJldHVybiAwOwpAQCAtNjU4LDE4ICs2NzksMjAgQEAKIAkJICAgcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQgLSAxKTsKIAogCXNlcV9wdXRzKHNlcSwgInN0YXRlczpcbiIpOwotCWlmIChhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyA9PSBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19mYWR0KQorCWlmIChwci0+dGhyb3R0bGluZy5hY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyA9PQorCQkJYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfZmFkdCkgewogCQlmb3IgKGkgPSAwOyBpIDwgcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQ7IGkrKykKIAkJCXNlcV9wcmludGYoc2VxLCAiICAgJWNUJWQ6ICAgICAgICAgICAgICAgICAgJTAyZCUlXG4iLAogCQkJCSAgIChpID09IHByLT50aHJvdHRsaW5nLnN0YXRlID8gJyonIDogJyAnKSwgaSwKIAkJCQkgICAocHItPnRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlID8gcHItPgogCQkJCSAgICB0aHJvdHRsaW5nLnN0YXRlc1tpXS5wZXJmb3JtYW5jZSAvIDEwIDogMCkpOwotCWVsc2UKKwl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQ7IGkrKykKIAkJCXNlcV9wcmludGYoc2VxLCAiICAgJWNUJWQ6ICAgICAgICAgICAgICAgICAgJTAyZCUlXG4iLAogCQkJCSAgIChpID09IHByLT50aHJvdHRsaW5nLnN0YXRlID8gJyonIDogJyAnKSwgaSwKIAkJCQkgICAoaW50KXByLT50aHJvdHRsaW5nLnN0YXRlc190c3NbaV0uCiAJCQkJICAgZnJlcXBlcmNlbnRhZ2UpOworCX0KIAogICAgICAgZW5kOgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Nicy5jIGIvZHJpdmVycy9hY3BpL3Nicy5jCmluZGV4IDk3NGQwMGMuLjdkOGU3OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zYnMuYworKysgYi9kcml2ZXJzL2FjcGkvc2JzLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNkZWZpbmUgQUNQSV9TQlNfQ0xBU1MJCQkic2JzIgogI2RlZmluZSBBQ1BJX0FDX0NMQVNTCQkJImFjX2FkYXB0ZXIiCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9DTEFTUwkJImJhdHRlcnkiCi0jZGVmaW5lIEFDUElfU0JTX0hJRAkJCSJBQ1BJMDAwMiIKICNkZWZpbmUgQUNQSV9TQlNfREVWSUNFX05BTUUJCSJTbWFydCBCYXR0ZXJ5IFN5c3RlbSIKICNkZWZpbmUgQUNQSV9TQlNfRklMRV9JTkZPCQkiaW5mbyIKICNkZWZpbmUgQUNQSV9TQlNfRklMRV9TVEFURQkJInN0YXRlIgpAQCAtMTI0LDEwICsxMjMsMTcgQEAKIHN0YXRpYyBpbnQgYWNwaV9zYnNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfc2JzX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgc2JzX2RldmljZV9pZHNbXSA9IHsKKwl7IkFDUEkwMDAxIiwgMH0sCisJeyJBQ1BJMDAwNSIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBzYnNfZGV2aWNlX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9zYnNfZHJpdmVyID0gewogCS5uYW1lID0gInNicyIsCiAJLmNsYXNzID0gQUNQSV9TQlNfQ0xBU1MsCi0JLmlkcyA9ICJBQ1BJMDAwMSxBQ1BJMDAwNSIsCisJLmlkcyA9IHNic19kZXZpY2VfaWRzLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3Nic19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX3Nic19yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCA2YjNiOGE1Li5iZTc0MzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTE2LDcgKzE2LDcgQEAKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfcm9vdDsKIAogI2RlZmluZSBBQ1BJX0JVU19DTEFTUwkJCSJzeXN0ZW1fYnVzIgotI2RlZmluZSBBQ1BJX0JVU19ISUQJCQkiQUNQSV9CVVMiCisjZGVmaW5lIEFDUElfQlVTX0hJRAkJCSJMTlhTWUJVUyIKICNkZWZpbmUgQUNQSV9CVVNfREVWSUNFX05BTUUJCSJTeXN0ZW0gQnVzIgogCiBzdGF0aWMgTElTVF9IRUFEKGFjcGlfZGV2aWNlX2xpc3QpOwpAQCAtMjksNiArMjksNjIgQEAKIAl1bnNpZ25lZCBpbnQgaW5zdGFuY2Vfbm87CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwogfTsKKworLyoKKyAqIENyZWF0ZXMgaGlkL2NpZChzKSBzdHJpbmcgbmVlZGVkIGZvciBtb2RhbGlhcyBhbmQgdWV2ZW50CisgKiBlLmcuIG9uIGEgZGV2aWNlIHdpdGggaGlkOklCTTAwMDEgYW5kIGNpZDpBQ1BJMDAwMSB5b3UgZ2V0OgorICogY2hhciAqbW9kYWxpYXM6ICJhY3BpOklCTTAwMDE6QUNQSTAwMDEiCisqLworaW50IGNyZWF0ZV9tb2RhbGlhcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2LCBjaGFyICptb2RhbGlhcywgaW50IHNpemUpeworCisJaW50IGxlbjsKKworCWlmICghYWNwaV9kZXYtPmZsYWdzLmhhcmR3YXJlX2lkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxlbiA9IHNucHJpbnRmKG1vZGFsaWFzLCBzaXplLCAiYWNwaTolczoiLAorCQkgICAgICAgYWNwaV9kZXYtPnBucC5oYXJkd2FyZV9pZCk7CisJaWYgKGxlbiA8IDAgfHwgbGVuID49IHNpemUpCisJCXJldHVybiAtRUlOVkFMOworCXNpemUgLT0gbGVuOworCisJaWYgKGFjcGlfZGV2LT5mbGFncy5jb21wYXRpYmxlX2lkcykgeworCQlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZF9saXN0OworCQlpbnQgaTsKKwkJaW50IGNvdW50OworCisJCWNpZF9saXN0ID0gYWNwaV9kZXYtPnBucC5jaWRfbGlzdDsKKwkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7CisJCQljb3VudCA9IHNucHJpbnRmKCZtb2RhbGlhc1tsZW5dLCBzaXplLCAiJXM6IiwKKwkJCQkJIGNpZF9saXN0LT5pZFtpXS52YWx1ZSk7CisJCQlpZiAoY291bnQgPCAwIHx8IGNvdW50ID49IHNpemUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImFjcGk6ICVzIGNpZFslaV0gZXhjZWVkcyBldmVudCBidWZmZXIgc2l6ZSIsCisJCQkJICAgICAgIGFjcGlfZGV2LT5wbnAuZGV2aWNlX25hbWUsIGkpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuICs9IGNvdW50OworCQkJc2l6ZSAtPSBjb3VudDsKKwkJfQorCX0KKworCW1vZGFsaWFzW2xlbl0gPSAnXDAnOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90CithY3BpX2RldmljZV9tb2RhbGlhc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgeworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOworCWludCBsZW47CisKKwkvKiBEZXZpY2UgaGFzIG5vIEhJRCBhbmQgbm8gQ0lEIG9yIHN0cmluZyBpcyA+MTAyNCAqLworCWxlbiA9IGNyZWF0ZV9tb2RhbGlhcyhhY3BpX2RldiwgYnVmLCAxMDI0KTsKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAwOworCWJ1ZltsZW4rK10gPSAnXG4nOworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIDA0NDQsIGFjcGlfZGV2aWNlX21vZGFsaWFzX3Nob3csIE5VTEwpOworCiBzdGF0aWMgaW50IGFjcGlfZWplY3Rfb3BlcmF0aW9uKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGxvY2thYmxlKQogewogCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OwpAQCAtMTU0LDYgKzIxMCwxMiBAQAogCQkJZ290byBlbmQ7CiAJfQogCisJaWYgKGRldi0+ZmxhZ3MuaGFyZHdhcmVfaWQgfHwgZGV2LT5mbGFncy5jb21wYXRpYmxlX2lkcyl7CisJCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RhbGlhcyk7CisJCWlmKHJlc3VsdCkKKwkJCWdvdG8gZW5kOworCX0KKwogICAgICAgICAvKgogICAgICAgICAgKiBJZiBkZXZpY2UgaGFzIF9FSjAsICdlamVjdCcgZmlsZSBpcyBjcmVhdGVkIHRoYXQgaXMgdXNlZCB0byB0cmlnZ2VyCiAgICAgICAgICAqIGhvdC1yZW1vdmFsIGZ1bmN0aW9uIGZyb20gdXNlcmxhbmQuCkBAIC0xNzgsNiArMjQwLDkgQEAKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9lamVjdCk7CiAKKwlpZiAoZGV2LT5mbGFncy5oYXJkd2FyZV9pZCB8fCBkZXYtPmZsYWdzLmNvbXBhdGlibGVfaWRzKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbW9kYWxpYXMpOworCiAJaWYoZGV2LT5mbGFncy5oYXJkd2FyZV9pZCkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2hpZCk7CiAJaWYoZGV2LT5oYW5kbGUpCkBAIC0xODYsNiArMjUxLDM3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJQUNQSSBCdXMgb3BlcmF0aW9ucwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGFjcGlfbWF0Y2hfZGV2aWNlX2lkcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCSAgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZHMpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKworCWlmIChkZXZpY2UtPmZsYWdzLmhhcmR3YXJlX2lkKSB7CisJCWZvciAoaWQgPSBpZHM7IGlkLT5pZFswXTsgaWQrKykgeworCQkJaWYgKCFzdHJjbXAoKGNoYXIqKWlkLT5pZCwgZGV2aWNlLT5wbnAuaGFyZHdhcmVfaWQpKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKGRldmljZS0+ZmxhZ3MuY29tcGF0aWJsZV9pZHMpIHsKKwkJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdCA9IGRldmljZS0+cG5wLmNpZF9saXN0OworCQlpbnQgaTsKKworCQlmb3IgKGlkID0gaWRzOyBpZC0+aWRbMF07IGlkKyspIHsKKwkJCS8qIGNvbXBhcmUgbXVsdGlwbGUgX0NJRCBlbnRyaWVzIGFnYWluc3QgZHJpdmVyIGlkcyAqLworCQkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7CisJCQkJaWYgKCFzdHJjbXAoKGNoYXIqKWlkLT5pZCwKKwkJCQkJICAgIGNpZF9saXN0LT5pZFtpXS52YWx1ZSkpCisJCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIC1FTk9FTlQ7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfbWF0Y2hfZGV2aWNlX2lkcyk7CisKIHN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOwpAQCAtMjE5LDM3ICszMTUsMTkgQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmFjcGlfZHJ2ID0gdG9fYWNwaV9kcml2ZXIoZHJ2KTsKIAotCXJldHVybiAhYWNwaV9tYXRjaF9pZHMoYWNwaV9kZXYsIGFjcGlfZHJ2LT5pZHMpOworCXJldHVybiAhYWNwaV9tYXRjaF9kZXZpY2VfaWRzKGFjcGlfZGV2LCBhY3BpX2Rydi0+aWRzKTsKIH0KIAogc3RhdGljIGludCBhY3BpX2RldmljZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLAotCWNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQorCQkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IHRvX2FjcGlfZGV2aWNlKGRldik7Ci0JaW50IGkgPSAwLCBsZW5ndGggPSAwLCByZXQgPSAwOwogCi0JaWYgKGFjcGlfZGV2LT5mbGFncy5oYXJkd2FyZV9pZCkKLQkJcmV0ID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAotCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKLQkJCSJIV0lEPSVzIiwgYWNwaV9kZXYtPnBucC5oYXJkd2FyZV9pZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGFjcGlfZGV2LT5mbGFncy5jb21wYXRpYmxlX2lkcykgewotCQlpbnQgajsKLQkJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdDsKLQotCQljaWRfbGlzdCA9IGFjcGlfZGV2LT5wbnAuY2lkX2xpc3Q7Ci0KLQkJZm9yIChqID0gMDsgaiA8IGNpZF9saXN0LT5jb3VudDsgaisrKSB7Ci0JCQlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwKLQkJCQlidWZmZXJfc2l6ZSwgJmxlbmd0aCwgIkNPTVBUSUQ9JXMiLAotCQkJCWNpZF9saXN0LT5pZFtqXS52YWx1ZSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiAtRU5PTUVNOwotCQl9CisJc3RyY3B5KGJ1ZmZlciwgIk1PREFMSUFTPSIpOworCWlmIChjcmVhdGVfbW9kYWxpYXMoYWNwaV9kZXYsIGJ1ZmZlciArIDksIGJ1ZmZlcl9zaXplIC0gOSkgPiAwKSB7CisJCWVudnBbMF0gPSBidWZmZXI7CisJCWVudnBbMV0gPSBOVUxMOwogCX0KLQotCWVudnBbaV0gPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC01NDMsMjUgKzYyMSw2IEBACiAJcmV0dXJuOwogfQogCi1pbnQgYWNwaV9tYXRjaF9pZHMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmlkcykKLXsKLQlpZiAoZGV2aWNlLT5mbGFncy5oYXJkd2FyZV9pZCkKLQkJaWYgKHN0cnN0cihpZHMsIGRldmljZS0+cG5wLmhhcmR3YXJlX2lkKSkKLQkJCXJldHVybiAwOwotCi0JaWYgKGRldmljZS0+ZmxhZ3MuY29tcGF0aWJsZV9pZHMpIHsKLQkJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdCA9IGRldmljZS0+cG5wLmNpZF9saXN0OwotCQlpbnQgaTsKLQotCQkvKiBjb21wYXJlIG11bHRpcGxlIF9DSUQgZW50cmllcyBhZ2FpbnN0IGRyaXZlciBpZHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7Ci0JCQlpZiAoc3Ryc3RyKGlkcywgY2lkX2xpc3QtPmlkW2ldLnZhbHVlKSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gLUVOT0VOVDsKLX0KLQogc3RhdGljIGludCBhY3BpX2J1c19nZXRfcGVyZl9mbGFncyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlkZXZpY2UtPnBlcmZvcm1hbmNlLnN0YXRlID0gQUNQSV9TVEFURV9VTktOT1dOOwpAQCAtNjI0LDYgKzY4MywxMyBAQAogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKnBhY2thZ2UgPSBOVUxMOwogCisJc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJ1dHRvbl9kZXZpY2VfaWRzW10gPSB7CisJCXsiUE5QMEMwRCIsIDB9LAorCQl7IlBOUDBDMEMiLCAwfSwKKwkJeyJQTlAwQzBFIiwgMH0sCisJCXsiIiwgMH0sCisJfTsKKwogCiAJLyogX1BSVyAqLwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLCAiX1BSVyIsIE5VTEwsICZidWZmZXIpOwpAQCAtNjQzLDcgKzcwOSw3IEBACiAKIAlkZXZpY2UtPndha2V1cC5mbGFncy52YWxpZCA9IDE7CiAJLyogUG93ZXIgYnV0dG9uLCBMaWQgc3dpdGNoIGFsd2F5cyBlbmFibGUgd2FrZXVwICovCi0JaWYgKCFhY3BpX21hdGNoX2lkcyhkZXZpY2UsICJQTlAwQzBELFBOUDBDMEMsUE5QMEMwRSIpKQorCWlmICghYWNwaV9tYXRjaF9kZXZpY2VfaWRzKGRldmljZSwgYnV0dG9uX2RldmljZV9pZHMpKQogCQlkZXZpY2UtPndha2V1cC5mbGFncy5ydW5fd2FrZSA9IDE7CiAKICAgICAgIGVuZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9zbGVlcC9NYWtlZmlsZQppbmRleCBkNmMwMTc3Li4xOTVhNGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLXkJCQkJCTo9IHBvd2Vyb2ZmLm8gd2FrZXVwLm8KIG9iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkJKz0gbWFpbi5vCi1vYmotJChDT05GSUdfQUNQSV9TTEVFUF9QUk9DX0ZTKQkrPSBwcm9jLm8KK29iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkJKz0gcHJvYy5vCiAKIEVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKaW5kZXggMzI3OWU3Mi4uZThjZmY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCkBAIC0yMSw2ICsyMSw5IEBACiAKIHU4IHNsZWVwX3N0YXRlc1tBQ1BJX1NfU1RBVEVfQ09VTlRdOwogCitzdGF0aWMgdTMyIGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gQUNQSV9TVEFURV9TMDsKKworI2lmZGVmIENPTkZJR19TVVNQRU5ECiBzdGF0aWMgc3RydWN0IHBtX29wcyBhY3BpX3BtX29wczsKIAogZXh0ZXJuIHZvaWQgZG9fc3VzcGVuZF9sb3dsZXZlbCh2b2lkKTsKQEAgLTM1LDM0ICszOCw0OSBAQAogc3RhdGljIGludCBpbml0XzgyNTlBX2FmdGVyX1MxOwogCiAvKioKLSAqCWFjcGlfcG1fcHJlcGFyZSAtIERvIHByZWxpbWluYXJ5IHN1c3BlbmQgd29yay4KLSAqCUBwbV9zdGF0ZToJCXN1c3BlbmQgc3RhdGUgd2UncmUgZW50ZXJpbmcuCi0gKgotICoJTWFrZSBzdXJlIHdlIHN1cHBvcnQgdGhlIHN0YXRlLiBJZiB3ZSBkbywgYW5kIHdlIG5lZWQgaXQsIHNldCB0aGUKLSAqCWZpcm13YXJlIHdha2luZyB2ZWN0b3IgYW5kIGRvIGFyY2gtc3BlY2lmaWMgbmFzdGluZXNzIHRvIGdldCB0aGUgCi0gKgl3YWtldXAgY29kZSB0byB0aGUgd2FraW5nIHZlY3Rvci4gCisgKglhY3BpX3BtX3NldF90YXJnZXQgLSBTZXQgdGhlIHRhcmdldCBzeXN0ZW0gc2xlZXAgc3RhdGUgdG8gdGhlIHN0YXRlCisgKgkJYXNzb2NpYXRlZCB3aXRoIGdpdmVuIEBwbV9zdGF0ZSwgaWYgc3VwcG9ydGVkLgogICovCiAKLWV4dGVybiBpbnQgYWNwaV9zbGVlcF9wcmVwYXJlKHUzMiBhY3BpX3N0YXRlKTsKLWV4dGVybiB2b2lkIGFjcGlfcG93ZXJfb2ZmKHZvaWQpOworc3RhdGljIGludCBhY3BpX3BtX3NldF90YXJnZXQoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQoreworCXUzMiBhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CisJaW50IGVycm9yID0gMDsKKworCWlmIChzbGVlcF9zdGF0ZXNbYWNwaV9zdGF0ZV0pIHsKKwkJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBhY3BpX3N0YXRlOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUNQSSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3RhdGU6ICVkXG4iLAorCQkJcG1fc3RhdGUpOworCQllcnJvciA9IC1FTk9TWVM7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglhY3BpX3BtX3ByZXBhcmUgLSBEbyBwcmVsaW1pbmFyeSBzdXNwZW5kIHdvcmsuCisgKglAcG1fc3RhdGU6IGlnbm9yZWQKKyAqCisgKglJZiBuZWNlc3NhcnksIHNldCB0aGUgZmlybXdhcmUgd2FraW5nIHZlY3RvciBhbmQgZG8gYXJjaC1zcGVjaWZpYworICoJbmFzdGluZXNzIHRvIGdldCB0aGUgd2FrZXVwIGNvZGUgdG8gdGhlIHdha2luZyB2ZWN0b3IuCisgKi8KIAogc3RhdGljIGludCBhY3BpX3BtX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQogewotCXUzMiBhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CisJaW50IGVycm9yID0gYWNwaV9zbGVlcF9wcmVwYXJlKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKTsKIAotCWlmICghc2xlZXBfc3RhdGVzW2FjcGlfc3RhdGVdKSB7Ci0JCXByaW50aygiYWNwaV9wbV9wcmVwYXJlIGRvZXMgbm90IHN1cHBvcnQgJWQgXG4iLCBwbV9zdGF0ZSk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCXJldHVybiBhY3BpX3NsZWVwX3ByZXBhcmUoYWNwaV9zdGF0ZSk7CisJaWYgKGVycm9yKQorCQlhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSA9IEFDUElfU1RBVEVfUzA7CisKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgogICoJYWNwaV9wbV9lbnRlciAtIEFjdHVhbGx5IGVudGVyIGEgc2xlZXAgc3RhdGUuCi0gKglAcG1fc3RhdGU6CQlTdGF0ZSB3ZSdyZSBlbnRlcmluZy4KKyAqCUBwbV9zdGF0ZTogaWdub3JlZAogICoKLSAqCUZsdXNoIGNhY2hlcyBhbmQgZ28gdG8gc2xlZXAuIEZvciBTVFIgb3IgU1RELCB3ZSBoYXZlIHRvIGNhbGwgCi0gKglhcmNoLXNwZWNpZmljIGFzc2VtYmx5LCB3aGljaCBpbiB0dXJuIGNhbGwgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSgpLgorICoJRmx1c2ggY2FjaGVzIGFuZCBnbyB0byBzbGVlcC4gRm9yIFNUUiB3ZSBoYXZlIHRvIGNhbGwgYXJjaC1zcGVjaWZpYworICoJYXNzZW1ibHksIHdoaWNoIGluIHR1cm4gY2FsbCBhY3BpX2VudGVyX3NsZWVwX3N0YXRlKCkuCiAgKglJdCdzIHVuZm9ydHVuYXRlLCBidXQgaXQgd29ya3MuIFBsZWFzZSBmaXggaWYgeW91J3JlIGZlZWxpbmcgZnJpc2t5LgogICovCiAKQEAgLTcwLDMxICs4OCwzMSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXUzMiBhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CisJdTMyIGFjcGlfc3RhdGUgPSBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZTsKIAogCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CiAKIAkvKiBEbyBhcmNoIHNwZWNpZmljIHNhdmluZyBvZiBzdGF0ZS4gKi8KLQlpZiAocG1fc3RhdGUgPiBQTV9TVVNQRU5EX1NUQU5EQlkpIHsKKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKSB7CiAJCWludCBlcnJvciA9IGFjcGlfc2F2ZV9zdGF0ZV9tZW0oKTsKLQkJaWYgKGVycm9yKQorCisJCWlmIChlcnJvcikgeworCQkJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1MwOwogCQkJcmV0dXJuIGVycm9yOworCQl9CiAJfQogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UoYWNwaV9zdGF0ZSk7Ci0Jc3dpdGNoIChwbV9zdGF0ZSkgewotCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCXN3aXRjaCAoYWNwaV9zdGF0ZSkgeworCWNhc2UgQUNQSV9TVEFURV9TMToKIAkJYmFycmllcigpOwogCQlzdGF0dXMgPSBhY3BpX2VudGVyX3NsZWVwX3N0YXRlKGFjcGlfc3RhdGUpOwogCQlicmVhazsKIAotCWNhc2UgUE1fU1VTUEVORF9NRU06CisJY2FzZSBBQ1BJX1NUQVRFX1MzOgogCQlkb19zdXNwZW5kX2xvd2xldmVsKCk7CiAJCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogQUNQSSAzLjAgc3BlY3MgKFA2Mikgc2F5cyB0aGF0IGl0J3MgdGhlIHJlc3BvbnNhYmlsdHkKQEAgLTEwNywxMiArMTI1LDggQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIkJhY2sgdG8gQyFcbiIpOwogCi0JLyogcmVzdG9yZSBwcm9jZXNzb3Igc3RhdGUKLQkgKiBXZSBzaG91bGQgb25seSBiZSBoZXJlIGlmIHdlJ3JlIGNvbWluZyBiYWNrIGZyb20gU1RSIG9yIFNURC4KLQkgKiBBbmQsIGluIHRoZSBjYXNlIG9mIHRoZSBsYXR0ZXIsIHRoZSBtZW1vcnkgaW1hZ2Ugc2hvdWxkIGhhdmUgYWxyZWFkeQotCSAqIGJlZW4gbG9hZGVkIGZyb20gZGlzay4KLQkgKi8KLQlpZiAocG1fc3RhdGUgPiBQTV9TVVNQRU5EX1NUQU5EQlkpCisJLyogcmVzdG9yZSBwcm9jZXNzb3Igc3RhdGUgKi8KKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKQogCQlhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKCk7CiAKIAlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgPyAwIDogLUVGQVVMVDsKQEAgLTEyMCw3ICsxMzQsNyBAQAogCiAvKioKICAqCWFjcGlfcG1fZmluaXNoIC0gRmluaXNoIHVwIHN1c3BlbmQgc2VxdWVuY2UuCi0gKglAcG1fc3RhdGU6CQlTdGF0ZSB3ZSdyZSBjb21pbmcgb3V0IG9mLgorICoJQHBtX3N0YXRlOiBpZ25vcmVkCiAgKgogICoJVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgd2Ugd2FrZSBiYWNrIHVwIChvciBpZiBlbnRlcmluZyB0aGUgc2xlZXAgc3RhdGUKICAqCWZhaWxlZCkuIApAQCAtMTI4LDcgKzE0Miw3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9wbV9maW5pc2goc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQogewotCXUzMiBhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CisJdTMyIGFjcGlfc3RhdGUgPSBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZTsKIAogCWFjcGlfbGVhdmVfc2xlZXBfc3RhdGUoYWNwaV9zdGF0ZSk7CiAJYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2UoYWNwaV9zdGF0ZSk7CkBAIC0xMzYsMjggKzE1MCwxNyBAQAogCS8qIHJlc2V0IGZpcm13YXJlIHdha2luZyB2ZWN0b3IgKi8KIAlhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIDApOwogCisJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1MwOworCisjaWZkZWYgQ09ORklHX1g4NgogCWlmIChpbml0XzgyNTlBX2FmdGVyX1MxKSB7CiAJCXByaW50aygiQnJva2VuIHRvc2hpYmEgbGFwdG9wIC0+IGtpY2tpbmcgaW50ZXJydXB0c1xuIik7CiAJCWluaXRfODI1OUEoMCk7CiAJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKLWludCBhY3BpX3N1c3BlbmQodTMyIGFjcGlfc3RhdGUpCi17Ci0Jc3VzcGVuZF9zdGF0ZV90IHN0YXRlc1tdID0gewotCQlbMV0gPSBQTV9TVVNQRU5EX1NUQU5EQlksCi0JCVszXSA9IFBNX1NVU1BFTkRfTUVNLAotCQlbNV0gPSBQTV9TVVNQRU5EX01BWAotCX07Ci0KLQlpZiAoYWNwaV9zdGF0ZSA8IDYgJiYgc3RhdGVzW2FjcGlfc3RhdGVdKQotCQlyZXR1cm4gcG1fc3VzcGVuZChzdGF0ZXNbYWNwaV9zdGF0ZV0pOwotCWlmIChhY3BpX3N0YXRlID09IDQpCi0JCXJldHVybiBoaWJlcm5hdGUoKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQogc3RhdGljIGludCBhY3BpX3BtX3N0YXRlX3ZhbGlkKHN1c3BlbmRfc3RhdGVfdCBwbV9zdGF0ZSkKIHsKIAl1MzIgYWNwaV9zdGF0ZTsKQEAgLTE3NiwxMiArMTc5LDM0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIGFjcGlfcG1fb3BzID0gewogCS52YWxpZCA9IGFjcGlfcG1fc3RhdGVfdmFsaWQsCisJLnNldF90YXJnZXQgPSBhY3BpX3BtX3NldF90YXJnZXQsCiAJLnByZXBhcmUgPSBhY3BpX3BtX3ByZXBhcmUsCiAJLmVudGVyID0gYWNwaV9wbV9lbnRlciwKIAkuZmluaXNoID0gYWNwaV9wbV9maW5pc2gsCiB9OwogCi0jaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKKy8qCisgKiBUb3NoaWJhIGZhaWxzIHRvIHByZXNlcnZlIGludGVycnVwdHMgb3ZlciBTMSwgcmVpbml0aWFsaXphdGlvbgorICogb2YgODI1OSBpcyBuZWVkZWQgYWZ0ZXIgUzEgcmVzdW1lLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ludHNfYWZ0ZXJfczEoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgd2l0aCBicm9rZW4gUzEgZGV0ZWN0ZWQuXG4iLCBkLT5pZGVudCk7CisJaW5pdF84MjU5QV9hZnRlcl9TMSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGFjcGlzbGVlcF9kbWlfdGFibGVbXSA9IHsKKwl7CisJIC5jYWxsYmFjayA9IGluaXRfaW50c19hZnRlcl9zMSwKKwkgLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIDQwMzBjZHQiLAorCSAubWF0Y2hlcyA9IHtETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLH0sCisJIH0sCisJe30sCit9OworI2VuZGlmIC8qIENPTkZJR19TVVNQRU5EICovCisKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KIHN0YXRpYyBpbnQgYWNwaV9oaWJlcm5hdGlvbl9wcmVwYXJlKHZvaWQpCiB7CiAJcmV0dXJuIGFjcGlfc2xlZXBfcHJlcGFyZShBQ1BJX1NUQVRFX1M0KTsKQEAgLTIzMyw0MSArMjU4LDExNCBAQAogCS5wcmVfcmVzdG9yZSA9IGFjcGlfaGliZXJuYXRpb25fcHJlX3Jlc3RvcmUsCiAJLnJlc3RvcmVfY2xlYW51cCA9IGFjcGlfaGliZXJuYXRpb25fcmVzdG9yZV9jbGVhbnVwLAogfTsKLSNlbmRpZgkJCQkvKiBDT05GSUdfU09GVFdBUkVfU1VTUEVORCAqLworI2VuZGlmCQkJCS8qIENPTkZJR19ISUJFUk5BVElPTiAqLwogCi0vKgotICogVG9zaGliYSBmYWlscyB0byBwcmVzZXJ2ZSBpbnRlcnJ1cHRzIG92ZXIgUzEsIHJlaW5pdGlhbGl6YXRpb24KLSAqIG9mIDgyNTkgaXMgbmVlZGVkIGFmdGVyIFMxIHJlc3VtZS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgaW5pdF9pbnRzX2FmdGVyX3MxKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoraW50IGFjcGlfc3VzcGVuZCh1MzIgYWNwaV9zdGF0ZSkKIHsKLQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyB3aXRoIGJyb2tlbiBTMSBkZXRlY3RlZC5cbiIsIGQtPmlkZW50KTsKLQlpbml0XzgyNTlBX2FmdGVyX1MxID0gMTsKLQlyZXR1cm4gMDsKKwlzdXNwZW5kX3N0YXRlX3Qgc3RhdGVzW10gPSB7CisJCVsxXSA9IFBNX1NVU1BFTkRfU1RBTkRCWSwKKwkJWzNdID0gUE1fU1VTUEVORF9NRU0sCisJCVs1XSA9IFBNX1NVU1BFTkRfTUFYCisJfTsKKworCWlmIChhY3BpX3N0YXRlIDwgNiAmJiBzdGF0ZXNbYWNwaV9zdGF0ZV0pCisJCXJldHVybiBwbV9zdXNwZW5kKHN0YXRlc1thY3BpX3N0YXRlXSk7CisJaWYgKGFjcGlfc3RhdGUgPT0gNCkKKwkJcmV0dXJuIGhpYmVybmF0ZSgpOworCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBhY3Bpc2xlZXBfZG1pX3RhYmxlW10gPSB7Ci0JewotCSAuY2FsbGJhY2sgPSBpbml0X2ludHNfYWZ0ZXJfczEsCi0JIC5pZGVudCA9ICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwKLQkgLm1hdGNoZXMgPSB7RE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSx9LAotCSB9LAotCXt9LAotfTsKKy8qKgorICoJYWNwaV9wbV9kZXZpY2Vfc2xlZXBfc3RhdGUgLSByZXR1cm4gcHJlZmVycmVkIHBvd2VyIHN0YXRlIG9mIEFDUEkgZGV2aWNlCisgKgkJaW4gdGhlIHN5c3RlbSBzbGVlcCBzdGF0ZSBnaXZlbiBieSAlYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUKKyAqCUBkZXY6IGRldmljZSB0byBleGFtaW5lCisgKglAd2FrZTogaWYgc2V0LCB0aGUgZGV2aWNlIHNob3VsZCBiZSBhYmxlIHRvIHdha2UgdXAgdGhlIHN5c3RlbQorICoJQGRfbWluX3A6IHVzZWQgdG8gc3RvcmUgdGhlIHVwcGVyIGxpbWl0IG9mIGFsbG93ZWQgc3RhdGVzIHJhbmdlCisgKglSZXR1cm4gdmFsdWU6IHByZWZlcnJlZCBwb3dlciBzdGF0ZSBvZiB0aGUgZGV2aWNlIG9uIHN1Y2Nlc3MsIC1FTk9ERVYgb24KKyAqCQlmYWlsdXJlIChpZS4gaWYgdGhlcmUncyBubyAnc3RydWN0IGFjcGlfZGV2aWNlJyBmb3IgQGRldikKKyAqCisgKglGaW5kIHRoZSBsb3dlc3QgcG93ZXIgKGhpZ2hlc3QgbnVtYmVyKSBBQ1BJIGRldmljZSBwb3dlciBzdGF0ZSB0aGF0CisgKglkZXZpY2UgQGRldiBjYW4gYmUgaW4gd2hpbGUgdGhlIHN5c3RlbSBpcyBpbiB0aGUgc2xlZXAgc3RhdGUgcmVwcmVzZW50ZWQKKyAqCWJ5ICVhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZS4gIElmIEB3YWtlIGlzIG5vbnplcm8sIHRoZSBkZXZpY2Ugc2hvdWxkIGJlCisgKglhYmxlIHRvIHdha2UgdXAgdGhlIHN5c3RlbSBmcm9tIHRoaXMgc2xlZXAgc3RhdGUuICBJZiBAZF9taW5fcCBpcyBzZXQsCisgKgl0aGUgaGlnaGVzdCBwb3dlciAobG93ZXN0IG51bWJlcikgZGV2aWNlIHBvd2VyIHN0YXRlIG9mIEBkZXYgYWxsb3dlZAorICoJaW4gdGhpcyBzeXN0ZW0gc2xlZXAgc3RhdGUgaXMgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGl0LgorICoKKyAqCVRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBAZGV2IGlzIHZhbGlkIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICoJVGhlIGNhbGxlciBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBmaWd1cmluZyBvdXQgaWYgdGhlIGRldmljZSBpcworICoJc3VwcG9zZWQgdG8gYmUgYWJsZSB0byB3YWtlIHVwIHRoZSBzeXN0ZW0gYW5kIHBhc3NpbmcgdGhpcyBpbmZvcm1hdGlvbgorICoJdmlhIEB3YWtlLgorICovCisKK2ludCBhY3BpX3BtX2RldmljZV9zbGVlcF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCB3YWtlLCBpbnQgKmRfbWluX3ApCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKGRldik7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OworCWNoYXIgYWNwaV9tZXRob2RbXSA9ICJfU3hEIjsKKwl1bnNpZ25lZCBsb25nIGRfbWluLCBkX21heDsKKworCWlmICghaGFuZGxlIHx8IEFDUElfRkFJTFVSRShhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDUEkgaGFuZGxlIGhhcyBubyBjb250ZXh0IVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWFjcGlfbWV0aG9kWzJdID0gJzAnICsgYWNwaV90YXJnZXRfc2xlZXBfc3RhdGU7CisJLyoKKwkgKiBJZiB0aGUgc2xlZXAgc3RhdGUgaXMgUzAsIHdlIHdpbGwgcmV0dXJuIEQzLCBidXQgaWYgdGhlIGRldmljZSBoYXMKKwkgKiBfUzBXLCB3ZSB3aWxsIHVzZSB0aGUgdmFsdWUgZnJvbSBfUzBXCisJICovCisJZF9taW4gPSBBQ1BJX1NUQVRFX0QwOworCWRfbWF4ID0gQUNQSV9TVEFURV9EMzsKKworCS8qCisJICogSWYgcHJlc2VudCwgX1N4RCBtZXRob2RzIHJldHVybiB0aGUgbWluaW11bSBELXN0YXRlIChoaWdoZXN0IHBvd2VyCisJICogc3RhdGUpIHdlIGNhbiB1c2UgZm9yIHRoZSBjb3JyZXNwb25kaW5nIFMtc3RhdGVzLiAgT3RoZXJ3aXNlLCB0aGUKKwkgKiBtaW5pbXVtIEQtc3RhdGUgaXMgRDAgKEFDUEkgMy54KS4KKwkgKgorCSAqIE5PVEU6IFdlIHJlbHkgb24gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKCkgbm90IGNsb2JiZXJpbmcgdGhlIGludGVnZXIKKwkgKiBwcm92aWRlZCAtLSB0aGF0J3Mgb3VyIGZhdWx0IHJlY292ZXJ5LCB3ZSBpZ25vcmUgcmV0dmFsLgorCSAqLworCWlmIChhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSA+IEFDUElfU1RBVEVfUzApCisJCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIGFjcGlfbWV0aG9kLCBOVUxMLCAmZF9taW4pOworCisJLyoKKwkgKiBJZiBfUFJXIHNheXMgd2UgY2FuIHdha2UgdXAgdGhlIHN5c3RlbSBmcm9tIHRoZSB0YXJnZXQgc2xlZXAgc3RhdGUsCisJICogdGhlIEQtc3RhdGUgcmV0dXJuZWQgYnkgX1N4RCBpcyBzdWZmaWNpZW50IGZvciB0aGF0ICh3ZSBhc3N1bWUgYQorCSAqIHdha2V1cC1hd2FyZSBkcml2ZXIgaWYgd2FrZSBpcyBzZXQpLiAgU3RpbGwsIGlmIF9TeFcgZXhpc3RzCisJICogKEFDUEkgMy54KSwgaXQgc2hvdWxkIHJldHVybiB0aGUgbWF4aW11bSAobG93ZXN0IHBvd2VyKSBELXN0YXRlIHRoYXQKKwkgKiBjYW4gd2FrZSB0aGUgc3lzdGVtLiAgX1MwVyBtYXkgYmUgdmFsaWQsIHRvby4KKwkgKi8KKwlpZiAoYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPT0gQUNQSV9TVEFURV9TMCB8fAorCSAgICAod2FrZSAmJiBhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCAmJgorCSAgICAgYWRldi0+d2FrZXVwLnNsZWVwX3N0YXRlIDw9IGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKSkgeworCQlhY3BpX21ldGhvZFszXSA9ICdXJzsKKwkJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgYWNwaV9tZXRob2QsIE5VTEwsICZkX21heCk7CisJCS8qIFNhbml0eSBjaGVjayAqLworCQlpZiAoZF9tYXggPCBkX21pbikKKwkJCWRfbWluID0gZF9tYXg7CisJfQorCisJaWYgKGRfbWluX3ApCisJCSpkX21pbl9wID0gZF9taW47CisJcmV0dXJuIGRfbWF4OworfQogCiBpbnQgX19pbml0IGFjcGlfc2xlZXBfaW5pdCh2b2lkKQogeworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCB0eXBlX2EsIHR5cGVfYjsKKyNpZmRlZiBDT05GSUdfU1VTUEVORAogCWludCBpID0gMDsKIAogCWRtaV9jaGVja19zeXN0ZW0oYWNwaXNsZWVwX2RtaV90YWJsZSk7CisjZW5kaWYKIAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19TVVNQRU5ECiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIihzdXBwb3J0cyIpOwotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1NfU1RBVEVfQ09VTlQ7IGkrKykgewotCQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JCXU4IHR5cGVfYSwgdHlwZV9iOworCWZvciAoaSA9IEFDUElfU1RBVEVfUzA7IGkgPCBBQ1BJX1NUQVRFX1M0OyBpKyspIHsKIAkJc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKGksICZ0eXBlX2EsICZ0eXBlX2IpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXNsZWVwX3N0YXRlc1tpXSA9IDE7CkBAIC0yNzcsMTAgKzM3NSwxNCBAQAogCXByaW50aygiKVxuIik7CiAKIAlwbV9zZXRfb3BzKCZhY3BpX3BtX29wcyk7CisjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5ECi0JaWYgKHNsZWVwX3N0YXRlc1tBQ1BJX1NUQVRFX1M0XSkKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KKwlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TNCwgJnR5cGVfYSwgJnR5cGVfYik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWhpYmVybmF0aW9uX3NldF9vcHMoJmFjcGlfaGliZXJuYXRpb25fb3BzKTsKKwkJc2xlZXBfc3RhdGVzW0FDUElfU1RBVEVfUzRdID0gMTsKKwl9CiAjZWxzZQogCXNsZWVwX3N0YXRlc1tBQ1BJX1NUQVRFX1M0XSA9IDA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCmluZGV4IDYxZjE4MjIuLjY2YjYyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYwpAQCAtMTQsOCArMTQsMTYgQEAKICNpbmNsdWRlICJzbGVlcC5oIgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAorCisvKgorICogdGhpcyBmaWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yOgorICogL3Byb2MvYWNwaS9zbGVlcAorICogL3Byb2MvYWNwaS9hbGFybQorICogL3Byb2MvYWNwaS93YWtldXAKKyAqLworCiBBQ1BJX01PRFVMRV9OQU1FKCJzbGVlcCIpCi0jaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAorI2lmZGVmCUNPTkZJR19BQ1BJX1BST0NGU19TTEVFUAogc3RhdGljIGludCBhY3BpX3N5c3RlbV9zbGVlcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCWludCBpOwpAQCAtNTgsNyArNjYsNyBAQAogCQlnb3RvIERvbmU7CiAJfQogCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKLSNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogCWlmIChzdGF0ZSA9PSA0KSB7CiAJCWVycm9yID0gaGliZXJuYXRlKCk7CiAJCWdvdG8gRG9uZTsKQEAgLTY4LDkgKzc2LDkgQEAKICAgICAgIERvbmU6CiAJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBjb3VudDsKIH0KLSNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQICovCisjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfUFJPQ0ZTX1NMRUVQICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0NNT1MpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQ01PU19NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9DTU9TKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0NNT1NfTU9EVUxFKSB8fCAhZGVmaW5lZChDT05GSUdfWDg2KQogLyogdXNlIC9zeXMvY2xhc3MvcnRjL3J0Y1gvd2FrZWFsYXJtIGluc3RlYWQ7IGl0J3Mgbm90IEFDUEktc3BlY2lmaWMgKi8KICNlbHNlCiAjZGVmaW5lCUhBVkVfQUNQSV9MRUdBQ1lfQUxBUk0KQEAgLTQ2Myw3ICs0NzEsNyBAQAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi0jaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAorI2lmZGVmCUNPTkZJR19BQ1BJX1BST0NGU19TTEVFUAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fc2xlZXBfZm9wcyA9IHsKIAkub3BlbiA9IGFjcGlfc3lzdGVtX3NsZWVwX29wZW5fZnMsCiAJLnJlYWQgPSBzZXFfcmVhZCwKQEAgLTQ3MSw3ICs0NzksNyBAQAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07Ci0jZW5kaWYJCQkJLyogQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUCAqLworI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX1BST0NGU19TTEVFUCAqLwogCiAjaWZkZWYJSEFWRV9BQ1BJX0xFR0FDWV9BTEFSTQogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fYWxhcm1fZm9wcyA9IHsKQEAgLTQ5OCwxNCArNTA2LDE0IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCi0jaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAorI2lmZGVmCUNPTkZJR19BQ1BJX1BST0NGU19TTEVFUAogCS8qICdzbGVlcCcgW1IvV10gKi8KIAllbnRyeSA9CiAJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KCJzbGVlcCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCSAgICAgIGFjcGlfcm9vdF9kaXIpOwogCWlmIChlbnRyeSkKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3N5c3RlbV9zbGVlcF9mb3BzOwotI2VuZGlmCisjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfUFJPQ0ZTICovCiAKICNpZmRlZglIQVZFX0FDUElfTEVHQUNZX0FMQVJNCiAJLyogJ2FsYXJtJyBbUi9XXSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3NsZWVwLmggYi9kcml2ZXJzL2FjcGkvc2xlZXAvc2xlZXAuaAppbmRleCBmM2U3MDM5Li5mZjFmODUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvc2xlZXAuaAorKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvc2xlZXAuaApAQCAtNiwzICs2LDUgQEAKIGV4dGVybiB2b2lkIGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UodTggc2xlZXBfc3RhdGUpOwogZXh0ZXJuIHZvaWQgYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2UodTggc2xlZXBfc3RhdGUpOwogZXh0ZXJuIHZvaWQgYWNwaV9ncGVfc2xlZXBfcHJlcGFyZSh1MzIgc2xlZXBfc3RhdGUpOworCitleHRlcm4gaW50IGFjcGlfc2xlZXBfcHJlcGFyZSh1MzIgYWNwaV9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKaW5kZXggZmFiOGYyNi4uOTdjMjdkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYwpAQCAtMTcsNyArMTcsNiBAQAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWNwaV93YWtldXBfZGV2aWNlX2xpc3Q7CiBleHRlcm4gc3BpbmxvY2tfdCBhY3BpX2RldmljZV9sb2NrOwogCi0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKIC8qKgogICogYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wcmVwIC0gcHJlcGFyZSB3YWtldXAgZGV2aWNlcwogICoJQHNsZWVwX3N0YXRlOglBQ1BJIHN0YXRlCkBAIC0xODAsNyArMTc5LDYgQEAKIH0KIAogbGF0ZV9pbml0Y2FsbChhY3BpX3dha2V1cF9kZXZpY2VfaW5pdCk7Ci0jZW5kaWYKIAogLyoKICAqIERpc2FibGUgYWxsIHdha2V1cCBHUEVzIGJlZm9yZSBlbnRlcmluZyByZXF1ZXN0ZWQgc2xlZXAgc3RhdGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwppbmRleCA1OGYxMzM4Li41YTYyZGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKQEAgLTkyLDEwICs5MiwxNiBAQAogc3RhdGljIHNzaXplX3QgYWNwaV90aGVybWFsX3dyaXRlX3BvbGxpbmcoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwKIAkJCQkJICBzaXplX3QsIGxvZmZfdCAqKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAgdGhlcm1hbF9kZXZpY2VfaWRzW10gPSB7CisJe0FDUElfVEhFUk1BTF9ISUQsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCB0aGVybWFsX2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdGhlcm1hbF9kcml2ZXIgPSB7CiAJLm5hbWUgPSAidGhlcm1hbCIsCiAJLmNsYXNzID0gQUNQSV9USEVSTUFMX0NMQVNTLAotCS5pZHMgPSBBQ1BJX1RIRVJNQUxfSElELAorCS5pZHMgPSB0aGVybWFsX2RldmljZV9pZHMsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfdGhlcm1hbF9hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX3RoZXJtYWxfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKaW5kZXggZjExMmFmNC4uMDA0MmI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCkBAIC00MDcsNyArNDA3LDcgQEAKIAogYWNwaV9zdGF0dXMKIGFjcGlfdXRfZXhlY3V0ZV9ISUQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAotCQkgICAgc3RydWN0IGFjcGlfZGV2aWNlX2lkICpoaWQpCisJCSAgICBzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCAqaGlkKQogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTYwOSw3ICs2MDksNyBAQAogCiBhY3BpX3N0YXR1cwogYWNwaV91dF9leGVjdXRlX1VJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCi0JCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKnVpZCkKKwkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICp1aWQpCiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCAwNGVhNjk3Li5kOTg3MDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtNzQsMTAgKzc0LDE2IEBACiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHZpZGVvX2RldmljZV9pZHNbXSA9IHsKKwl7QUNQSV9WSURFT19ISUQsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCB2aWRlb19kZXZpY2VfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3ZpZGVvX2J1cyA9IHsKIAkubmFtZSA9ICJ2aWRlbyIsCiAJLmNsYXNzID0gQUNQSV9WSURFT19DTEFTUywKLQkuaWRzID0gQUNQSV9WSURFT19ISUQsCisJLmlkcyA9IHZpZGVvX2RldmljZV9pZHMsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfdmlkZW9fYnVzX2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfdmlkZW9fYnVzX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCmluZGV4IGQ5ZmEzMjkuLmFkMDcwODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwpAQCAtOTEsNiArOTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImF0YV9waWl4IgogI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4xMSIKQEAgLTE0MCw2ICsxNDEsOSBAQAogCVJWCQkJPSAtMywgLyogcmVzZXJ2ZWQgKi8KIAogCVBJSVhfQUhDSV9ERVZJQ0UJPSA2LAorCisJLyogaG9zdC0+ZmxhZ3MgYml0cyAqLworCVBJSVhfSE9TVF9CUk9LRU5fU1VTUEVORCA9ICgxIDw8IDI0KSwKIH07CiAKIHN0cnVjdCBwaWl4X21hcF9kYiB7CkBAIC0xNTksNiArMTYzLDEwIEBACiBzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBpY2hfc2V0X2RtYW1vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KTsKIHN0YXRpYyBpbnQgaWNoX3BhdGFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpOworc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKyNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGluX21vZHVsZV9pbml0ID0gMTsKIApAQCAtMjU1LDggKzI2Myw4IEBACiAJLnByb2JlCQkJPSBwaWl4X2luaXRfb25lLAogCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKICNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAkJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBwaWl4X3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lLAogI2VuZGlmCiB9OwogCkBAIC04ODEsNiArODg5LDEwNyBAQAogCWRvX3BhdGFfc2V0X2RtYW1vZGUoYXAsIGFkZXYsIDEpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgcGlpeF9icm9rZW5fc3VzcGVuZF9kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJURUNSQSBNNSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVE9TSElCQSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJURUNSQSBNNSIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiU2F0ZWxsaXRlIFUyMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU2F0ZWxsaXRlIFUyMDAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIlNhdGVsbGl0ZSBVMjA1IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUT1NISUJBIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlNhdGVsbGl0ZSBVMjA1IiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJQb3J0ZWdlIE01MDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUE9SVEVHRSBNNTAwIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgcGlpeF9wY2lfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlyYyA9IGF0YV9ob3N0X3N1c3BlbmQoaG9zdCwgbWVzZyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBTb21lIGJyYWluZGFtYWdlZCBBQ1BJIHN1c3BlbmQgaW1wbGVtZW50YXRpb25zIGV4cGVjdCB0aGUKKwkgKiBjb250cm9sbGVyIHRvIGJlIGF3YWtlIG9uIGVudHJ5OyBvdGhlcndpc2UsIGl0IGJ1cm5zIGNwdQorCSAqIGN5Y2xlcyBhbmQgcG93ZXIgdHJ5aW5nIHRvIGRvIHNvbWV0aGluZyB0byB0aGUgc2xlZXBpbmcKKwkgKiBiZWF1dHkuCisJICovCisJaWYgKGRtaV9jaGVja19zeXN0ZW0ocGlpeF9icm9rZW5fc3VzcGVuZF9kbWlfdGFibGUpICYmCisJICAgIG1lc2cuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgeworCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCQkvKiBtYXJrIGl0cyBwb3dlciBzdGF0ZSBhcyAidW5rbm93biIsIHNpbmNlIHdlIGRvbid0CisJCSAqIGtub3cgaWYgZS5nLiB0aGUgQklPUyB3aWxsIGNoYW5nZSBpdHMgZGV2aWNlIHN0YXRlCisJCSAqIHdoZW4gd2Ugc3VzcGVuZC4KKwkJICovCisJCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMCkKKwkJCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfVU5LTk9XTjsKKworCQkvKiB0ZWxsIHJlc3VtZSB0aGF0IGl0J3Mgd2FraW5nIHVwIGZyb20gYnJva2VuIHN1c3BlbmQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwkJaG9zdC0+ZmxhZ3MgfD0gUElJWF9IT1NUX0JST0tFTl9TVVNQRU5EOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCWF0YV9wY2lfZGV2aWNlX2RvX3N1c3BlbmQocGRldiwgbWVzZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWlmIChob3N0LT5mbGFncyAmIFBJSVhfSE9TVF9CUk9LRU5fU1VTUEVORCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCQlob3N0LT5mbGFncyAmPSB+UElJWF9IT1NUX0JST0tFTl9TVVNQRU5EOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCQkvKiBQQ0kgZGV2aWNlIHdhc24ndCBkaXNhYmxlZCBkdXJpbmcgc3VzcGVuZC4gIFVzZQorCQkgKiBfX3BjaV9yZWVuYWJsZV9kZXZpY2UoKSB0byBhdm9pZCBhZmZlY3RpbmcgdGhlCisJCSAqIGVuYWJsZSBjb3VudC4KKwkJICovCisJCXJjID0gX19wY2lfcmVlbmFibGVfZGV2aWNlKHBkZXYpOworCQlpZiAocmMpCisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSAiCisJCQkJICAgImRldmljZSBhZnRlciByZXN1bWUgKCVkKVxuIiwgcmMpOworCX0gZWxzZQorCQlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKKworCWlmIChyYyA9PSAwKQorCQlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKKwogI2RlZmluZSBBSENJX1BDSV9CQVIgNQogI2RlZmluZSBBSENJX0dMT0JBTF9DVEwgMHgwNAogI2RlZmluZSBBSENJX0VOQUJMRSAoMSA8PCAzMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDEyYWMwYjUuLmU4MzY0NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtNzY4LDcgKzc2OCw3IEBACiAJICogRGVjcmVtZW50IG1heCBodyBzZWdtZW50cyBhY2NvcmRpbmdseS4KIAkgKi8KIAlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJKSB7Ci0JCXJlcXVlc3RfcXVldWVfdCAqcSA9IHNkZXYtPnJlcXVlc3RfcXVldWU7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsKIAkJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhxLCBxLT5tYXhfaHdfc2VnbWVudHMgLSAxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCmluZGV4IDAxMDQzNjcuLmU4YTI4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwpAQCAtNDUsNyArNDUsNyBAQAogCQkuaWRlbnQgPSAiSFAgUGF2aWxpb24gTjU0MzAiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJPbW5pQm9vayBOMzJOLTczNiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRVJTSU9OLCAiT21uaUJvb2sgTjMyTi03MzYiKSwKIAkJfSwKIAl9LAogCXsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKaW5kZXggYjBhZjY1YS4uODRkOWM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0Mzd4IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuNyIKIAogc3RydWN0IGhwdF9jbG9jayB7CiAJdTgJeGZlcl9zcGVlZDsKQEAgLTExMDMsMTcgKzExMDMsMTcgQEAKIAogCQkvKiBTZWxlY3QgdGhlIERQTEwgY2xvY2suICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIDB4MjEpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1QywgKGZfaGlnaCA8PCAxNikgfCBmX2xvdyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLCAoZl9oaWdoIDw8IDE2KSB8IGZfbG93IHwgMHgxMDApOwogCiAJCWZvcihhZGp1c3QgPSAwOyBhZGp1c3QgPCA4OyBhZGp1c3QrKykgewogCQkJaWYgKGhwdDM3eF9jYWxpYnJhdGVfZHBsbChkZXYpKQogCQkJCWJyZWFrOwogCQkJLyogU2VlIGlmIGl0J2xsIHNldHRsZSBhdCBhIGZyYWN0aW9uYWxseSBkaWZmZXJlbnQgY2xvY2sgKi8KLQkJCWlmICgoYWRqdXN0ICYgMykgPT0gMykgewotCQkJCWZfbG93IC0tOwotCQkJCWZfaGlnaCArKzsKLQkJCX0KLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLCAoZl9oaWdoIDw8IDE2KSB8IGZfbG93KTsKKwkJCWlmIChhZGp1c3QgJiAxKQorCQkJCWZfbG93IC09IGFkanVzdCA+PiAxOworCQkJZWxzZQorCQkJCWZfaGlnaCArPSBhZGp1c3QgPj4gMTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLCAoZl9oaWdoIDw8IDE2KSB8IGZfbG93IHwgMHgxMDApOwogCQl9CiAJCWlmIChhZGp1c3QgPT0gOCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB0Mzd4OiBEUExMIGRpZCBub3Qgc3RhYmlsaXplLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCAzNTk5YWIyLi5lNjczOGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTI0LDggKzI0LDYgQEAKICNpbmNsdWRlICJiYXNlLmgiCiAjaW5jbHVkZSAicG93ZXIvcG93ZXIuaCIKIAotZXh0ZXJuIGNvbnN0IGNoYXIgKmtvYmplY3RfYWN0aW9uc1tdOwotCiBpbnQgKCpwbGF0Zm9ybV9ub3RpZnkpKHN0cnVjdCBkZXZpY2UgKiBkZXYpID0gTlVMTDsKIGludCAoKnBsYXRmb3JtX25vdGlmeV9yZW1vdmUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpID0gTlVMTDsKIApAQCAtNjgwLDggKzY3OCw3IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3N1YnN5czsKIAl9Ci0JLyogb25seSBidXMtZGV2aWNlIHBhcmVudHMgZ2V0IGEgImRldmljZSItbGluayAqLwotCWlmIChkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+YnVzKSB7CisJaWYgKGRldi0+cGFyZW50KSB7CiAJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJmRldi0+cGFyZW50LT5rb2JqLAogCQkJCQkgICJkZXZpY2UiKTsKIAkJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCA1M2YwZWU2Li5iMjRlZmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtMjMyLDYgKzIzMiw3IEBACiAvKioKICAqIGZpcm13YXJlX2RhdGFfd3JpdGUgLSB3cml0ZSBtZXRob2QgZm9yIGZpcm13YXJlCiAgKiBAa29iajoga29iamVjdCBmb3IgdGhlIGRldmljZQorICogQGJpbl9hdHRyOiBiaW5fYXR0ciBzdHJ1Y3R1cmUKICAqIEBidWZmZXI6IGJ1ZmZlciBiZWluZyB3cml0dGVuCiAgKiBAb2Zmc2V0OiBidWZmZXIgb2Zmc2V0IGZvciB3cml0ZSBpbiB0b3RhbCBkYXRhIHN0b3JlIGFyZWEKICAqIEBjb3VudDogYnVmZmVyIHNpemUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZQppbmRleCA5NjZhNWUyLi45Y2FlYWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLXkJCQk6PSBzaHV0ZG93bi5vCi1vYmotJChDT05GSUdfUE0pCSs9IG1haW4ubyBzdXNwZW5kLm8gcmVzdW1lLm8gc3lzZnMubworb2JqLSQoQ09ORklHX1BNX1NMRUVQKQkrPSBtYWluLm8gc3VzcGVuZC5vIHJlc3VtZS5vIHN5c2ZzLm8KIG9iai0kKENPTkZJR19QTV9UUkFDRSkJKz0gdHJhY2UubwogCiBpZmVxICgkKENPTkZJR19ERUJVR19EUklWRVIpLHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcG93ZXIuaCBiL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oCmluZGV4IDU5MWEwZGQuLjhiYTA4MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oCkBAIC01LDcgKzUsNyBAQAogZXh0ZXJuIHZvaWQgZGV2aWNlX3NodXRkb3duKHZvaWQpOwogCiAKLSNpZmRlZiBDT05GSUdfUE0KKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAogLyoKICAqIG1haW4uYwpAQCAtNjIsNyArNjIsNyBAQAogICovCiBleHRlcm4gaW50IHN1c3BlbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsKIAotI2Vsc2UgLyogQ09ORklHX1BNICovCisjZWxzZSAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogCiBzdGF0aWMgaW5saW5lIGludCBkZXZpY2VfcG1fYWRkKHN0cnVjdCBkZXZpY2UgKiBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jCmluZGV4IGE0N2VlMWIuLjU2ZThlYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jCkBAIC00NCw3ICs0NCw1IEBACiAJCQlkZXYtPmRyaXZlci0+c2h1dGRvd24oZGV2KTsKIAkJfQogCX0KLQotCXN5c2Rldl9zaHV0ZG93bigpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQppbmRleCBhN2EwOTkwLi4wMTRlNzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKQEAgLTMxLDQgKzMxLDQgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX1VCKQkrPSB1Yi5vCiAKIG9iai0kKENPTkZJR19YRU5fQkxLREVWX0ZST05URU5EKQkrPSB4ZW4tYmxrZnJvbnQubwotb2JqLSQoQ09ORklHX0xHVUVTVF9HVUVTVCkJKz0gbGd1ZXN0X2Jsay5vCitvYmotJChDT05GSUdfTEdVRVNUX0JMT0NLKQkrPSBsZ3Vlc3RfYmxrLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW1pZmxvcC5jIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKaW5kZXggNmNlOGI4OS4uYzk3NTFiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKKysrIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKQEAgLTE0MjIsNyArMTQyMiw3IEBACiAJZ290byByZXBlYXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2ZkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3N0YXRpYyB2b2lkIGRvX2ZkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCXJlZG9fZmRfcmVxdWVzdCgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmggYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaAppbmRleCAxZDg0NjY4Li5iYTA3Zjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaApAQCAtMTM4LDcgKzEzOCw3IEBACiAJdTE2IG1heGJjbnQ7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7LyogZGlzayBjcmVhdGUgd29yayBzdHJ1Y3QgKi8KIAlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7Ci0JcmVxdWVzdF9xdWV1ZV90IGJsa3E7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgYmxrcTsKIAlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvOyAKIAlzZWN0b3JfdCBzc2l6ZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKaW5kZXggNGY1OTgyNy4uMDA3ZmFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1hb2VibGtfbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQorYW9lYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBhb2VkZXYgKmQ7CiAJc3RydWN0IGJ1ZiAqYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hdGFmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwppbmRleCAxNGQ2Yjk0Li45NDI2OGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYwpAQCAtMTQ2Niw3ICsxNDY2LDcgQEAKIH0KIAogCi12b2lkIGRvX2ZkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3ZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCiB7CiAgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCBhMmQ2NjEyLi4xYmU4MmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAogc3RhdGljIGN0bHJfaW5mb190ICpoYmFbTUFYX0NUTFJdOwogCi1zdGF0aWMgdm9pZCBkb19jY2lzc19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSk7CitzdGF0aWMgdm9pZCBkb19jY2lzc19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBkb19jY2lzc19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaW50IGNjaXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKTsKIHN0YXRpYyBpbnQgY2Npc3NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwpAQCAtMTU4NCw3ICsxNTg0LDcgQEAKIAkgKi8KIAlpZiAoaC0+Z2VuZGlza1swXSAhPSBkaXNrKSB7CiAJCWlmIChkaXNrKSB7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZGlzay0+cXVldWU7CiAJCQlpZiAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkKIAkJCQlkZWxfZ2VuZGlzayhkaXNrKTsKIAkJCWlmIChxKSB7CkBAIC0yNTExLDcgKzI1MTEsNyBAQAogLyoKICAqIEdldCBhIHJlcXVlc3QgYW5kIHN1Ym1pdCBpdCB0byB0aGUgY29udHJvbGxlci4KICAqLwotc3RhdGljIHZvaWQgZG9fY2Npc3NfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBkb19jY2lzc19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWN0bHJfaW5mb190ICpoID0gcS0+cXVldWVkYXRhOwogCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKQEAgLTMzODAsNyArMzM4MCw3IEBACiAJZG8gewogCQlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2ID0gJihoYmFbaV0tPmRydltqXSk7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaGJhW2ldLT5nZW5kaXNrW2pdOwotCQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwogCiAJCS8qIENoZWNrIGlmIHRoZSBkaXNrIHdhcyBhbGxvY2F0ZWQgYWxyZWFkeSAqLwogCQlpZiAoIWRpc2spewpAQCAtMzUyMyw3ICszNTIzLDcgQEAKIAlmb3IgKGogPSAwOyBqIDwgQ0lTU19NQVhfTFVOOyBqKyspIHsKIAkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBoYmFbaV0tPmdlbmRpc2tbal07CiAJCWlmIChkaXNrKSB7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZGlzay0+cXVldWU7CiAKIAkJCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKQogCQkJCWRlbF9nZW5kaXNrKGRpc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IGI5NGNkMWMuLmJlNGUzNDc3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCisrKyBiL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiBzdGF0aWMgaW50IGlkYV9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOwogc3RhdGljIGludCBpZGFfY3Rscl9pb2N0bChjdGxyX2luZm9fdCAqaCwgaW50IGRzaywgaWRhX2lvY3RsX3QgKmlvKTsKIAotc3RhdGljIHZvaWQgZG9faWRhX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKTsKK3N0YXRpYyB2b2lkIGRvX2lkYV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIHN0YXRpYyB2b2lkIHN0YXJ0X2lvKGN0bHJfaW5mb190ICpoKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGFkZFEoY21kbGlzdF90ICoqUXB0ciwgY21kbGlzdF90ICpjKTsKQEAgLTM5MSw3ICszOTEsNyBAQAogLyogcGRldiBpcyBOVUxMIGZvciBlaXNhICovCiBzdGF0aWMgaW50IF9faW5pdCBjcHFhcnJheV9yZWdpc3Rlcl9jdGxyKCBpbnQgaSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwogCWludCBqOwogCiAJLyogCkBAIC04ODYsNyArODg2LDcgQEAKICAqIGFyZSBpbiBoZXJlIChlaXRoZXIgdmlhIHRoZSBkdW1teSBkb19pZGFfcmVxdWVzdCBmdW5jdGlvbnMgb3IgYnkgYmVpbmcKICAqIGNhbGxlZCBmcm9tIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgogICovCi1zdGF0aWMgdm9pZCBkb19pZGFfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBkb19pZGFfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAljdGxyX2luZm9fdCAqaCA9IHEtPnF1ZXVlZGF0YTsKIAljbWRsaXN0X3QgKmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwppbmRleCBmZTA4ODA0Li4wODViNzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCisrKyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmN1cnJlbnRfcmVxOwogc3RhdGljIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpmbG9wcHlfcXVldWU7Ci1zdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpOworc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpOwogCiAjaWZuZGVmIGZkX2dldF9kbWFfcmVzaWR1ZQogI2RlZmluZSBmZF9nZXRfZG1hX3Jlc2lkdWUoKSBnZXRfZG1hX3Jlc2lkdWUoRkxPUFBZX0RNQSkKQEAgLTI5ODEsNyArMjk4MSw3IEBACiAJc2NoZWR1bGVfYmgocmVkb19mZF9yZXF1ZXN0KTsKIH0KIAotc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQorc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCiB7CiAJaWYgKG1heF9idWZmZXJfc2VjdG9ycyA9PSAwKSB7CiAJCXByaW50aygiVkZTOiBkb19mZF9yZXF1ZXN0IGNhbGxlZCBvbiBub24tb3BlbiBkZXZpY2VcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sZ3Vlc3RfYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL2xndWVzdF9ibGsuYwppbmRleCAxNjM0YzJkLi45M2UzYzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2xndWVzdF9ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xndWVzdF9ibGsuYwpAQCAtMSw2ICsxLDEyIEBACi0vKiBBIHNpbXBsZSBibG9jayBkcml2ZXIgZm9yIGxndWVzdC4KKy8qRDo0MDAKKyAqIFRoZSBHdWVzdCBibG9jayBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgMjAwNiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+IElCTSBDb3Jwb3JhdGlvbgorICogVGhpcyBpcyBhIHNpbXBsZSBibG9jayBkcml2ZXIsIHdoaWNoIGFwcGVhcnMgYXMgL2Rldi9sZ2JhLCBsZ2JiLCBsZ2JjIGV0Yy4KKyAqIFRoZSBtZWNoYW5pc20gaXMgc2ltcGxlOiB3ZSBwbGFjZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QgaW4gdGhlCisgKiBkZXZpY2UgcGFnZSwgdGhlbiB1c2UgU0VORF9ETUEgKGNvbnRhaW5pbmcgdGhlIGRhdGEgZm9yIGEgd3JpdGUsIG9yIGFuIGVtcHR5CisgKiAicGluZyIgRE1BIGZvciBhIHJlYWQpLgorIDoqLworLyogQ29weXJpZ2h0IDIwMDYgUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI1LDI3ICszMSw1MCBAQAogCiBzdGF0aWMgY2hhciBuZXh0X2Jsb2NrX2luZGV4ID0gJ2EnOwogCisvKkQ6NDIwIEhlcmUgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgYWJvdXQKKyAqIGVhY2ggR3Vlc3QgYmxvY2sgZGV2aWNlLgorICoKKyAqIEknbSBzdXJlIGF0IHRoaXMgc3RhZ2UsIHlvdSdyZSB3b25kZXJpbmcgImhleSwgd2hlcmUgd2FzIHRoZSBhZHZlbnR1cmUgSSB3YXMKKyAqIHByb21pc2VkPyIgYW5kIHRoaW5raW5nICJSdXN0eSBzdWNrcywgSSBzaGFsbCBzYXkgbmFzdHkgdGhpbmdzIGFib3V0IGhpbSBvbgorICogbXkgYmxvZyIuICBJIHRoaW5rIFJlYWwgYWR2ZW50dXJlcyBoYXZlIGJvcmluZyBiaXRzLCB0b28sIGFuZCB5b3UncmUgaW4gdGhlCisgKiBtaWRkbGUgb2Ygb25lLiAgQnV0IGl0IGdldHMgYmV0dGVyLiAgSnVzdCBub3QgcXVpdGUgeWV0LiAqLwogc3RydWN0IGJsb2NrZGV2CiB7CisJLyogVGhlIGJsb2NrIHF1ZXVlIGluZnJhc3RydWN0dXJlIHdhbnRzIGEgc3BpbmxvY2s6IGl0IGlzIGhlbGQgd2hpbGUgaXQKKwkgKiBjYWxscyBvdXIgYmxvY2sgcmVxdWVzdCBmdW5jdGlvbi4gIFdlIGdyYWIgaXQgaW4gb3VyIGludGVycnVwdAorCSAqIGhhbmRsZXIgc28gdGhlIHJlc3BvbnNlcyBkb24ndCBtZXNzIHdpdGggbmV3IHJlcXVlc3RzLiAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAotCS8qIFRoZSBkaXNrIHN0cnVjdHVyZSBmb3IgdGhlIGtlcm5lbC4gKi8KKwkvKiBUaGUgZGlzayBzdHJ1Y3R1cmUgcmVnaXN0ZXJlZCB3aXRoIGtlcm5lbC4gKi8KIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIAotCS8qIFRoZSBtYWpvciBudW1iZXIgZm9yIHRoaXMgZGlzay4gKi8KKwkvKiBUaGUgbWFqb3IgZGV2aWNlIG51bWJlciBmb3IgdGhpcyBkaXNrLCBhbmQgdGhlIGludGVycnVwdC4gIFdlIG9ubHkKKwkgKiByZWFsbHkga2VlcCB0aGVtIGhlcmUgZm9yIGNvbXBsZXRlbmVzczsgd2UnZCBuZWVkIHRoZW0gaWYgd2UKKwkgKiBzdXBwb3J0ZWQgZGV2aWNlIHVucGx1Z2dpbmcuICovCiAJaW50IG1ham9yOwogCWludCBpcnE7CiAKKwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIGRldmljZSdzIG1lbW9yeSBwYWdlICovCiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7Ci0JLyogVGhlIG1hcHBlZCBibG9jayBwYWdlLiAqLworCS8qIFRoZSBtYXBwZWQgbWVtb3J5IHBhZ2UgZm9yIGNvbnZlbmllbnQgYWNjZXMuICovCiAJc3RydWN0IGxndWVzdF9ibG9ja19wYWdlICpsYl9wYWdlOwogCi0JLyogV2Ugb25seSBoYXZlIGEgc2luZ2xlIHJlcXVlc3Qgb3V0c3RhbmRpbmcgYXQgYSB0aW1lLiAqLworCS8qIFdlIG9ubHkgaGF2ZSBhIHNpbmdsZSByZXF1ZXN0IG91dHN0YW5kaW5nIGF0IGEgdGltZTogdGhpcyBpcyBpdC4gKi8KIAlzdHJ1Y3QgbGd1ZXN0X2RtYSBkbWE7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIH07CiAKLS8qIEplbnMgZ2F2ZSBtZSB0aGlzIG5pY2UgaGVscGVyIHRvIGVuZCBhbGwgY2h1bmtzIG9mIGEgcmVxdWVzdC4gKi8KKy8qRDo0OTUgV2Ugb3JpZ2luYWxseSB1c2VkIGVuZF9yZXF1ZXN0KCkgdGhyb3VnaG91dCB0aGUgZHJpdmVyLCBidXQgaXQgdHVybnMKKyAqIG91dCB0aGF0IGVuZF9yZXF1ZXN0KCkgaXMgZGVwcmVjYXRlZCwgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgZW5kIHRoZSByZXF1ZXN0CisgKiAod2hpY2ggc2VlbXMgbGlrZSBhIGdvb2QgcmVhc29uIHRvIGRlcHJlY2F0ZSBpdCEpLiAgSXQgc2ltcGx5IGVuZHMgdGhlIGZpcnN0CisgKiBiaW8uICBTbyBpZiB3ZSBoYWQgMyBiaW9zIGluIGEgInN0cnVjdCByZXF1ZXN0IiB3ZSB3b3VsZCBkbyBhbGwgMywKKyAqIGVuZF9yZXF1ZXN0KCksIGRvIDIsIGVuZF9yZXF1ZXN0KCksIGRvIDEgYW5kIGVuZF9yZXF1ZXN0KCk6IHR3aWNlIGFzIG11Y2gKKyAqIHdvcmsgYXMgd2UgbmVlZGVkIHRvIGRvLgorICoKKyAqIFRoaXMgcmVpbmZvcmNlZCB0byBtZSB0aGF0IEkgZG8gbm90IHVuZGVyc3RhbmQgdGhlIGJsb2NrIGxheWVyLgorICoKKyAqIE5vbmV0aGVsZXNzLCBKZW5zIEF4Ym9lIGdhdmUgbWUgdGhpcyBuaWNlIGhlbHBlciB0byBlbmQgYWxsIGNodW5rcyBvZiBhCisgKiByZXF1ZXN0LiAgVGhpcyBpbXByb3ZlZCBkaXNrIHNwZWVkIGJ5IDEzMCUuICovCiBzdGF0aWMgdm9pZCBlbmRfZW50aXJlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHVwdG9kYXRlKQogewogCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHJlcSwgdXB0b2RhdGUsIHJlcS0+aGFyZF9ucl9zZWN0b3JzKSkKQEAgLTU1LDMwICs4NCw2MiBAQAogCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEsIHVwdG9kYXRlKTsKIH0KIAorLyogSSdtIHRvbGQgdGhlcmUgYXJlIG9ubHkgdHdvIHN0b3JpZXMgaW4gdGhlIHdvcmxkIHdvcnRoIHRlbGxpbmc6IGxvdmUgYW5kCisgKiBoYXRlLiAgU28gdGhlcmUgdXNlZCB0byBiZSBhIGxvdmUgc2NlbmUgaGVyZSBsaWtlIHRoaXM6CisgKgorICogIExhdW5jaGVyOglXZSBjb3VsZCBtYWtlIGJlYXV0aWZ1bCBJL08gdG9nZXRoZXIsIHlvdSBhbmQgSS4KKyAqICBHdWVzdDoJTXksIHRoYXQncyBhIGJpZyBkaXNrIQorICoKKyAqIFVuZm9ydHVuYXRlbHksIGl0IHdhcyBqdXN0IHRvbyByYXVuY2h5IGZvciBvdXIgb3RoZXJ3aXNlLWdlbnRsZSB0YWxlLiAqLworCisvKkQ6NDkwIFRoaXMgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCBjYWxsZWQgd2hlbiBhIGJsb2NrIHJlYWQgb3Igd3JpdGUgaGFzCisgKiBiZWVuIGNvbXBsZXRlZCBmb3IgdXMuICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgbGdiX2lycShpbnQgaXJxLCB2b2lkICpfYmQpCiB7CisJLyogV2UgaGFuZGVkIG91ciAic3RydWN0IGJsb2NrZGV2IiBhcyB0aGUgYXJndW1lbnQgdG8gcmVxdWVzdF9pcnEoKSwgc28KKwkgKiBpdCBpcyBwYXNzZWQgdGhyb3VnaCB0byB1cyBoZXJlLiAgVGhpcyB0ZWxscyB1cyB3aGljaCBkZXZpY2Ugd2UncmUKKwkgKiBkZWFsaW5nIHdpdGggaW4gY2FzZSB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUuICovCiAJc3RydWN0IGJsb2NrZGV2ICpiZCA9IF9iZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyogV2Ugd2VyZW4ndCBkb2luZyBhbnl0aGluZz8gIFN0cmFuZ2UsIGJ1dCBjb3VsZCBoYXBwZW4gaWYgd2Ugc2hhcmVkCisJICogaW50ZXJydXB0cyAod2UgZG9uJ3QhKS4gKi8KIAlpZiAoIWJkLT5yZXEpIHsKIAkJcHJfZGVidWcoIk5vIHdvcmshXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAorCS8qIE5vdCBkb25lIHlldD8gIFRoYXQncyBlcXVhbGx5IHN0cmFuZ2UuICovCiAJaWYgKCFiZC0+bGJfcGFnZS0+cmVzdWx0KSB7CiAJCXByX2RlYnVnKCJObyByZXN1bHQhXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAorCS8qIFdlIGhhdmUgdG8gZ3JhYiB0aGUgbG9jayBiZWZvcmUgZW5kaW5nIHRoZSByZXF1ZXN0LiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+bG9jaywgZmxhZ3MpOworCS8qICJyZXN1bHQiIGlzIDEgZm9yIHN1Y2Nlc3MsIDIgZm9yIGZhaWx1cmU6IGVuZF9lbnRpcmVfcmVxdWVzdCgpIHdhbnRzCisJICogdG8ga25vdyB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkIG9yIG5vdC4gKi8KIAllbmRfZW50aXJlX3JlcXVlc3QoYmQtPnJlcSwgYmQtPmxiX3BhZ2UtPnJlc3VsdCA9PSAxKTsKKwkvKiBDbGVhciBvdXQgcmVxdWVzdCwgaXQncyBkb25lLiAqLwogCWJkLT5yZXEgPSBOVUxMOworCS8qIFJlc2V0IGluY29taW5nIERNQSBmb3IgbmV4dCB0aW1lLiAqLwogCWJkLT5kbWEudXNlZF9sZW4gPSAwOworCS8qIFJlYWR5IGZvciBtb3JlIHJlYWRzIG9yIHdyaXRlcyAqLwogCWJsa19zdGFydF9xdWV1ZShiZC0+ZGlzay0+cXVldWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5sb2NrLCBmbGFncyk7CisKKwkvKiBUaGUgaW50ZXJydXB0IHdhcyBmb3IgdXMsIHdlIGRlYWx0IHdpdGggaXQuICovCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCisvKkQ6NDgwIFRoZSBibG9jayBsYXllcidzICJzdHJ1Y3QgcmVxdWVzdCIgY29udGFpbnMgYSBudW1iZXIgb2YgInN0cnVjdCBiaW8icywKKyAqIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgInN0cnVjdCBiaW9fdmVjInMsIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgYSBwYWdlLCBhbgorICogb2Zmc2V0IGFuZCBhIGxlbmd0aC4KKyAqCisgKiBGb3J0dW5hdGVseSB0aGVyZSBhcmUgaXRlcmF0b3JzIHRvIGhlbHAgdXMgd2FsayB0aHJvdWdoIHRoZSAic3RydWN0CisgKiByZXF1ZXN0Ii4gIEV2ZW4gbW9yZSBmb3J0dW5hdGVseSwgdGhlcmUgd2VyZSBwbGVudHkgb2YgcGxhY2VzIHRvIHN0ZWFsIHRoZQorICogY29kZSBmcm9tLiAgV2UgcGFjayB0aGUgInN0cnVjdCByZXF1ZXN0IiBpbnRvIG91ciAic3RydWN0IGxndWVzdF9kbWEiIGFuZAorICogcmV0dXJuIHRoZSB0b3RhbCBsZW5ndGguICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHJlcV90b19kbWEoc3RydWN0IHJlcXVlc3QgKnJlcSwgc3RydWN0IGxndWVzdF9kbWEgKmRtYSkKIHsKIAl1bnNpZ25lZCBpbnQgaSA9IDAsIGlkeCwgbGVuID0gMDsKQEAgLTg3LDggKzE0OCwxMyBAQAogCXJxX2Zvcl9lYWNoX2JpbyhiaW8sIHJlcSkgewogCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpZHgpIHsKKwkJCS8qIFdlIHRvbGQgdGhlIGJsb2NrIGxheWVyIG5vdCB0byBnaXZlIHVzIHRvbyBtYW55LiAqLwogCQkJQlVHX09OKGkgPT0gTEdVRVNUX01BWF9ETUFfU0VDVElPTlMpOworCQkJLyogSWYgd2UgaGFkIGEgemVyby1sZW5ndGggc2VnbWVudCwgaXQgd291bGQgbG9vayBsaWtlCisJCQkgKiB0aGUgZW5kIG9mIHRoZSBkYXRhIHJlZmVycmVkIHRvIGJ5IHRoZSAic3RydWN0CisJCQkgKiBsZ3Vlc3RfZG1hIiwgc28gbWFrZSBzdXJlIHRoYXQgZG9lc24ndCBoYXBwZW4uICovCiAJCQlCVUdfT04oIWJ2ZWMtPmJ2X2xlbik7CisJCQkvKiBDb252ZXJ0IHBhZ2UgJiBvZmZzZXQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzICovCiAJCQlkbWEtPmFkZHJbaV0gPSBwYWdlX3RvX3BoeXMoYnZlYy0+YnZfcGFnZSkKIAkJCQkrIGJ2ZWMtPmJ2X29mZnNldDsKIAkJCWRtYS0+bGVuW2ldID0gYnZlYy0+YnZfbGVuOwpAQCAtOTYsMjYgKzE2MiwzOSBAQAogCQkJaSsrOwogCQl9CiAJfQorCS8qIElmIHRoZSBhcnJheSBpc24ndCBmdWxsLCB3ZSBtYXJrIHRoZSBlbmQgd2l0aCBhIDAgbGVuZ3RoICovCiAJaWYgKGkgPCBMR1VFU1RfTUFYX0RNQV9TRUNUSU9OUykKIAkJZG1hLT5sZW5baV0gPSAwOwogCXJldHVybiBsZW47CiB9CiAKKy8qIFRoaXMgY3JlYXRlcyBhbiBlbXB0eSBETUEsIHVzZWZ1bCBmb3IgcHJvZGRpbmcgdGhlIEhvc3Qgd2l0aG91dCBzZW5kaW5nIGRhdGEKKyAqIChpZS4gd2hlbiB3ZSB3YW50IHRvIGRvIGEgcmVhZCkgKi8KIHN0YXRpYyB2b2lkIGVtcHR5X2RtYShzdHJ1Y3QgbGd1ZXN0X2RtYSAqZG1hKQogewogCWRtYS0+bGVuWzBdID0gMDsKIH0KIAorLypEOjQ3MCBTZXR0aW5nIHVwIGEgcmVxdWVzdCBpcyBmYWlybHkgZWFzeTogKi8KIHN0YXRpYyB2b2lkIHNldHVwX3JlcShzdHJ1Y3QgYmxvY2tkZXYgKmJkLAogCQkgICAgICBpbnQgdHlwZSwgc3RydWN0IHJlcXVlc3QgKnJlcSwgc3RydWN0IGxndWVzdF9kbWEgKmRtYSkKIHsKKwkvKiBUaGUgdHlwZSBpcyAxICh3cml0ZSkgb3IgMCAocmVhZCkuICovCiAJYmQtPmxiX3BhZ2UtPnR5cGUgPSB0eXBlOworCS8qIFRoZSBzZWN0b3Igb24gZGlzayB3aGVyZSB0aGUgcmVhZCBvciB3cml0ZSBzdGFydHMuICovCiAJYmQtPmxiX3BhZ2UtPnNlY3RvciA9IHJlcS0+c2VjdG9yOworCS8qIFRoZSByZXN1bHQgaXMgaW5pdGlhbGl6ZWQgdG8gMCAodW5maW5pc2hlZCkuICovCiAJYmQtPmxiX3BhZ2UtPnJlc3VsdCA9IDA7CisJLyogVGhlIGN1cnJlbnQgcmVxdWVzdCAoc28gd2UgY2FuIGVuZCBpdCBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIpLiAqLwogCWJkLT5yZXEgPSByZXE7CisJLyogVGhlIG51bWJlciBvZiBieXRlczogcmV0dXJuZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiByZXFfdG9fZG1hKCksCisJICogd2hpY2ggcGFja3MgdGhlIGJsb2NrIGxheWVyJ3MgInN0cnVjdCByZXF1ZXN0IiBpbnRvIG91ciAic3RydWN0CisJICogbGd1ZXN0X2RtYSIgKi8KIAliZC0+bGJfcGFnZS0+Ynl0ZXMgPSByZXFfdG9fZG1hKHJlcSwgZG1hKTsKIH0KIAorLypEOjQ1MCBXcml0ZSBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiB3ZSBwYWNrIHRoZSByZXF1ZXN0IGludG8gYSAic3RydWN0CisgKiBsZ3Vlc3RfZG1hIiwgdGhlbiB1c2UgU0VORF9ETUEgdG8gc2VuZCB0aGUgcmVxdWVzdC4gKi8KIHN0YXRpYyB2b2lkIGRvX3dyaXRlKHN0cnVjdCBibG9ja2RldiAqYmQsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IGxndWVzdF9kbWEgc2VuZDsKQEAgLTEyNiw2ICsyMDUsOSBAQAogCWxndWVzdF9zZW5kX2RtYShiZC0+cGh5c19hZGRyLCAmc2VuZCk7CiB9CiAKKy8qIFJlYWQgaXMgc2ltaWxhciB0byB3cml0ZSwgZXhjZXB0IHdlIHBhY2sgdGhlIHJlcXVlc3QgaW50byBvdXIgcmVjZWl2ZQorICogInN0cnVjdCBsZ3Vlc3RfZG1hIiBhbmQgc2VuZCB0aHJvdWdoIGFuIGVtcHR5IERNQSBqdXN0IHRvIHRlbGwgdGhlIEhvc3QgdGhhdAorICogdGhlcmUncyBhIHJlcXVlc3QgcGVuZGluZy4gKi8KIHN0YXRpYyB2b2lkIGRvX3JlYWQoc3RydWN0IGJsb2NrZGV2ICpiZCwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgbGd1ZXN0X2RtYSBwaW5nOwpAQCAtMTM3LDIxICsyMTksMzAgQEAKIAlsZ3Vlc3Rfc2VuZF9kbWEoYmQtPnBoeXNfYWRkciwgJnBpbmcpOwogfQogCi1zdGF0aWMgdm9pZCBkb19sZ2JfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCisvKkQ6NDQwIFRoaXMgd2hlcmUgcmVxdWVzdHMgY29tZSBpbjogd2UgZ2V0IGhhbmRlZCB0aGUgcmVxdWVzdCBxdWV1ZSBhbmQgYXJlCisgKiBleHBlY3RlZCB0byBwdWxsIGEgInN0cnVjdCByZXF1ZXN0IiBvZmYgaXQgdW50aWwgd2UndmUgZmluaXNoZWQgdGhlbSBvcgorICogd2UncmUgd2FpdGluZyBmb3IgYSByZXBseTogKi8KK3N0YXRpYyB2b2lkIGRvX2xnYl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCBibG9ja2RldiAqYmQ7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAogYWdhaW46CisJLyogVGhpcyBzb21ldGltZXMgcmV0dXJucyBOVUxMIGV2ZW4gb24gdGhlIHZlcnkgZmlyc3QgdGltZSBhcm91bmQuICBJCisJICogd29uZGVyIGlmIGl0J3Mgc29tZXRoaW5nIHRvIGRvIHdpdGggbGV0dGluZyBlbHZlcyBoYW5kbGUgdGhlIHJlcXVlc3QKKwkgKiBxdWV1ZS4uLiAqLwogCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CiAJaWYgKCFyZXEpCiAJCXJldHVybjsKIAorCS8qIFdlIGF0dGFjaGVkIHRoZSBzdHJ1Y3QgYmxvY2tkZXYgdG8gdGhlIGRpc2s6IGdldCBpdCBiYWNrICovCiAJYmQgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQkvKiBTb21ldGltZXMgd2UgZ2V0IHJlcGVhdGVkIHJlcXVlc3RzIGFmdGVyIGJsa19zdG9wX3F1ZXVlLiAqLworCS8qIFNvbWV0aW1lcyB3ZSBnZXQgcmVwZWF0ZWQgcmVxdWVzdHMgYWZ0ZXIgYmxrX3N0b3BfcXVldWUoKSwgYnV0IHdlCisJICogY2FuIG9ubHkgaGFuZGxlIG9uZSBhdCBhIHRpbWUuICovCiAJaWYgKGJkLT5yZXEpCiAJCXJldHVybjsKIAorCS8qIFdlIG9ubHkgZG8gcmVhZHMgYW5kIHdyaXRlczogbm8gdHJpY2t5IGJ1c2luZXNzISAqLwogCWlmICghYmxrX2ZzX3JlcXVlc3QocmVxKSkgewogCQlwcl9kZWJ1ZygiR290IG5vbi1jb21tYW5kIDB4JTA4eFxuIiwgcmVxLT5jbWRfdHlwZSk7CiAJCXJlcS0+ZXJyb3JzKys7CkBAIC0xNjQsMjAgKzI1NSwzMSBAQAogCWVsc2UKIAkJZG9fcmVhZChiZCwgcmVxKTsKIAotCS8qIFdhaXQgZm9yIGludGVycnVwdCB0byB0ZWxsIHVzIGl0J3MgZG9uZS4gKi8KKwkvKiBXZSd2ZSBwdXQgb3V0IHRoZSByZXF1ZXN0LCBzbyBzdG9wIGFueSBtb3JlIGNvbWluZyBpbiB1bnRpbCB3ZSBnZXQKKwkgKiBhbiBpbnRlcnJ1cHQsIHdoaWNoIHRha2VzIHVzIHRvIGxnYl9pcnEoKSB0byByZS1lbmFibGUgdGhlIHF1ZXVlLiAqLwogCWJsa19zdG9wX3F1ZXVlKHEpOwogfQogCisvKkQ6NDMwIFRoaXMgaXMgdGhlICJzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMiIHdlIGF0dGFjaCB0byB0aGUgZGlzayBhdAorICogdGhlIGVuZCBvZiBsZ3Vlc3RibGtfcHJvYmUoKS4gIEl0IGRvZXNuJ3Qgc2VlbSB0byB3YW50IG11Y2guICovCiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGxndWVzdGJsa19mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAorLypEOjQyNSBTZXR0aW5nIHVwIGEgZGlzayBkZXZpY2Ugc2VlbXMgdG8gaW52b2x2ZSBhIGxvdCBvZiBjb2RlLiAgSSdtIG5vdCBzdXJlCisgKiBxdWl0ZSB3aHkuICBJIGRvIGtub3cgdGhhdCB0aGUgSURFIGNvZGUgc2VudCB0d28gb3IgdGhyZWUgb2YgdGhlIG1haW50YWluZXJzCisgKiBpbnNhbmUsIHBlcmhhcHMgdGhpcyBpcyB0aGUgZnJpbmdlIG9mIHRoZSBzYW1lIGRpc2Vhc2U/CisgKgorICogQXMgaW4gdGhlIGNvbnNvbGUgY29kZSwgdGhlIHByb2JlIGZ1bmN0aW9uIGdldHMgaGFuZGVkIHRoZSBnZW5lcmljCisgKiBsZ3Vlc3RfZGV2aWNlIGZyb20gbGd1ZXN0X2J1cy5jOiAqLwogc3RhdGljIGludCBsZ3Vlc3RibGtfcHJvYmUoc3RydWN0IGxndWVzdF9kZXZpY2UgKmxnZGV2KQogewogCXN0cnVjdCBibG9ja2RldiAqYmQ7CiAJaW50IGVycjsKIAlpbnQgaXJxZmxhZ3MgPSBJUlFGX1NIQVJFRDsKIAorCS8qIEZpcnN0IHdlIGFsbG9jYXRlIG91ciBvd24gInN0cnVjdCBibG9ja2RldiIgYW5kIGluaXRpYWxpemUgdGhlIGVhc3kKKwkgKiBmaWVsZHMuICovCiAJYmQgPSBrbWFsbG9jKHNpemVvZigqYmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJkKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE4Nyw1OSArMjg5LDEwMCBAQAogCWJkLT5yZXEgPSBOVUxMOwogCWJkLT5kbWEudXNlZF9sZW4gPSAwOwogCWJkLT5kbWEubGVuWzBdID0gMDsKKwkvKiBUaGUgZGVzY3JpcHRvciBpbiB0aGUgbGd1ZXN0X2RldmljZXMgYXJyYXkgcHJvdmlkZWQgYnkgdGhlIEhvc3QKKwkgKiBnaXZlcyB0aGUgR3Vlc3QgdGhlIHBoeXNpY2FsIHBhZ2UgbnVtYmVyIG9mIHRoZSBkZXZpY2UncyBwYWdlLiAqLwogCWJkLT5waHlzX2FkZHIgPSAobGd1ZXN0X2RldmljZXNbbGdkZXYtPmluZGV4XS5wZm4gPDwgUEFHRV9TSElGVCk7CiAKKwkvKiBXZSB1c2UgbGd1ZXN0X21hcCgpIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSBwYWdlICovCiAJYmQtPmxiX3BhZ2UgPSBsZ3Vlc3RfbWFwKGJkLT5waHlzX2FkZHIsIDEpOwogCWlmICghYmQtPmxiX3BhZ2UpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfZnJlZV9iZDsKIAl9CiAKKwkvKiBXZSBuZWVkIGEgbWFqb3IgZGV2aWNlIG51bWJlcjogMCBtZWFucyAiYXNzaWduIG9uZSBkeW5hbWljYWxseSIuICovCiAJYmQtPm1ham9yID0gcmVnaXN0ZXJfYmxrZGV2KDAsICJsZ3Vlc3RibGsiKTsKIAlpZiAoYmQtPm1ham9yIDwgMCkgewogCQllcnIgPSBiZC0+bWFqb3I7CiAJCWdvdG8gb3V0X3VubWFwOwogCX0KIAorCS8qIFRoaXMgYWxsb2NhdGVzIGEgInN0cnVjdCBnZW5kaXNrIiB3aGVyZSB3ZSBwYWNrIGFsbCB0aGUgaW5mb3JtYXRpb24KKwkgKiBhYm91dCB0aGUgZGlzayB3aGljaCB0aGUgcmVzdCBvZiBMaW51eCBzZWVzLiAgV2UgYXNrIGZvciBvbmUgbWlub3IKKwkgKiBudW1iZXI7IEkgZG8gd29uZGVyIGlmIHdlIHNob3VsZCBiZSBhc2tpbmcgZm9yIG1vcmUuICovCiAJYmQtPmRpc2sgPSBhbGxvY19kaXNrKDEpOwogCWlmICghYmQtPmRpc2spIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5yZWdpc3Rlcl9ibGtkZXY7CiAJfQogCisJLyogRXZlcnkgZGlzayBuZWVkcyBhIHF1ZXVlIGZvciByZXF1ZXN0cyB0byBjb21lIGluOiB3ZSBzZXQgdXAgdGhlCisJICogcXVldWUgd2l0aCBhIGNhbGxiYWNrIGZ1bmN0aW9uICh0aGUgY29yZSBvZiBvdXIgZHJpdmVyKSBhbmQgdGhlIGxvY2sKKwkgKiB0byB1c2UuICovCiAJYmQtPmRpc2stPnF1ZXVlID0gYmxrX2luaXRfcXVldWUoZG9fbGdiX3JlcXVlc3QsICZiZC0+bG9jayk7CiAJaWYgKCFiZC0+ZGlzay0+cXVldWUpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfcHV0X2Rpc2s7CiAJfQogCi0JLyogV2UgY2FuIG9ubHkgaGFuZGxlIGEgY2VydGFpbiBudW1iZXIgb2Ygc2cgZW50cmllcyAqLworCS8qIFdlIGNhbiBvbmx5IGhhbmRsZSBhIGNlcnRhaW4gbnVtYmVyIG9mIHBvaW50ZXJzIGluIG91ciBTRU5EX0RNQQorCSAqIGNhbGwsIHNvIHdlIHNldCB0aGF0IHdpdGggYmxrX3F1ZXVlX21heF9od19zZWdtZW50cygpLiAgVGhpcyBpcyBub3QKKwkgKiB0byBiZSBjb25mdXNlZCB3aXRoIGJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cygpIG9mIGNvdXJzZSEgIEkKKwkgKiBrbm93LCB3aG8gY291bGQgcG9zc2libHkgY29uZnVzZSB0aGUgdHdvPworCSAqCisJICogV2VsbCwgaXQncyBzaW1wbGUgdG8gdGVsbCB0aGVtIGFwYXJ0OiB0aGlzIG9uZSBzZWVtcyB0byB3b3JrIGFuZCB0aGUKKwkgKiBvdGhlciBvbmUgZGlkbid0LiAqLwogCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMoYmQtPmRpc2stPnF1ZXVlLCBMR1VFU1RfTUFYX0RNQV9TRUNUSU9OUyk7Ci0JLyogQnVmZmVycyBtdXN0IG5vdCBjcm9zcyBwYWdlIGJvdW5kYXJpZXMgKi8KKworCS8qIER1ZSB0byB0ZWNobmljYWwgbGltaXRhdGlvbnMgb2Ygb3VyIEhvc3QgKGFuZCBzaW1wbGUgY29kaW5nKSB3ZQorCSAqIGNhbid0IGhhdmUgYSBzaW5nbGUgYnVmZmVyIHdoaWNoIGNyb3NzZXMgYSBwYWdlIGJvdW5kYXJ5LiAgVGVsbCBpdAorCSAqIGhlcmUuICBUaGlzIG1lYW5zIHRoYXQgb3VyIG1heGltdW0gcmVxdWVzdCBzaXplIGlzIDE2CisJICogKExHVUVTVF9NQVhfRE1BX1NFQ1RJT05TKSBwYWdlcy4gKi8KIAlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShiZC0+ZGlzay0+cXVldWUsIFBBR0VfU0laRS0xKTsKIAorCS8qIFdlIG5hbWUgb3VyIGRpc2s6IHRoaXMgYmVjb21lcyB0aGUgZGV2aWNlIG5hbWUgd2hlbiB1ZGV2IGRvZXMgaXRzCisJICogbWFnaWMgdGhpbmcgYW5kIGNyZWF0ZXMgdGhlIGRldmljZSBub2RlLCBzdWNoIGFzIC9kZXYvbGdiYS4KKwkgKiBuZXh0X2Jsb2NrX2luZGV4IGlzIGEgZ2xvYmFsIHdoaWNoIHN0YXJ0cyBhdCAnYScuICBVbmZvcnR1bmF0ZWx5CisJICogdGhpcyBzaW1wbGUgaW5jcmVtZW50IGxvZ2ljIG1lYW5zIHRoYXQgdGhlIDI3dGggZGlzayB3aWxsIGJlIGNhbGxlZAorCSAqICIvZGV2L2xnYnsiLiAgSW4gdGhhdCBjYXNlLCBJIHJlY29tbWVuZCBoYXZpbmcgYXQgbGVhc3QgMjkgZGlza3MsIHNvCisJICogeW91ciAvZGV2IGRpcmVjdG9yeSB3aWxsIGJlIGJhbGFuY2VkLiAqLwogCXNwcmludGYoYmQtPmRpc2stPmRpc2tfbmFtZSwgImxnYiVjIiwgbmV4dF9ibG9ja19pbmRleCsrKTsKKworCS8qIFdlIGxvb2sgdG8gdGhlIGRldmljZSBkZXNjcmlwdG9yIGFnYWluIHRvIHNlZSBpZiB0aGlzIGRldmljZSdzCisJICogaW50ZXJydXB0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmFuZG9tLiAgSWYgdGhleSBhcmUsIHdlIHRlbGwgdGhlIGlycQorCSAqIHN1YnN5c3RlbS4gIEF0IHRoZSBtb21lbnQgdGhpcyBiaXQgaXMgYWx3YXlzIHNldC4gKi8KIAlpZiAobGd1ZXN0X2RldmljZXNbbGdkZXYtPmluZGV4XS5mZWF0dXJlcyAmIExHVUVTVF9ERVZJQ0VfRl9SQU5ET01ORVNTKQogCQlpcnFmbGFncyB8PSBJUlFGX1NBTVBMRV9SQU5ET007CisKKwkvKiBOb3cgd2UgaGF2ZSB0aGUgbmFtZSBhbmQgaXJxZmxhZ3MsIHdlIGNhbiByZXF1ZXN0IHRoZSBpbnRlcnJ1cHQ7IHdlCisJICogZ2l2ZSBpdCB0aGUgInN0cnVjdCBibG9ja2RldiIgd2UgaGF2ZSBzZXQgdXAgdG8gcGFzcyB0byBsZ2JfaXJxKCkKKwkgKiB3aGVuIHRoZXJlIGlzIGFuIGludGVycnVwdC4gKi8KIAllcnIgPSByZXF1ZXN0X2lycShiZC0+aXJxLCBsZ2JfaXJxLCBpcnFmbGFncywgYmQtPmRpc2stPmRpc2tfbmFtZSwgYmQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2NsZWFudXBfcXVldWU7CiAKKwkvKiBXZSBiaW5kIG91ciBvbmUtZW50cnkgRE1BIHBvb2wgdG8gdGhlIGtleSBmb3IgdGhpcyBibG9jayBkZXZpY2Ugc28KKwkgKiB0aGUgSG9zdCBjYW4gcmVwbHkgdG8gb3VyIHJlcXVlc3RzLiAgVGhlIGtleSBpcyBlcXVhbCB0byB0aGUKKwkgKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UncyBwYWdlLCB3aGljaCBpcyBjb252ZW5pZW50bHkKKwkgKiB1bmlxdWUuICovCiAJZXJyID0gbGd1ZXN0X2JpbmRfZG1hKGJkLT5waHlzX2FkZHIsICZiZC0+ZG1hLCAxLCBiZC0+aXJxKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlX2lycTsKIAorCS8qIFdlIGZpbmlzaCBvdXIgZGlzayBpbml0aWFsaXphdGlvbiBhbmQgYWRkIHRoZSBkaXNrIHRvIHRoZSBzeXN0ZW0uICovCiAJYmQtPmRpc2stPm1ham9yID0gYmQtPm1ham9yOwogCWJkLT5kaXNrLT5maXJzdF9taW5vciA9IDA7CiAJYmQtPmRpc2stPnByaXZhdGVfZGF0YSA9IGJkOwogCWJkLT5kaXNrLT5mb3BzID0gJmxndWVzdGJsa19mb3BzOwotCS8qIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRpc2sgc2l6ZSBieSB0aGUgb3RoZXIgZW5kLiAqLworCS8qIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGRpc2sgc2l6ZSBieSB0aGUgTGF1bmNoZXIuICovCiAJc2V0X2NhcGFjaXR5KGJkLT5kaXNrLCBiZC0+bGJfcGFnZS0+bnVtX3NlY3RvcnMpOwogCWFkZF9kaXNrKGJkLT5kaXNrKTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXZpY2UgJWkgYXQgbWFqb3IgJWRcbiIsCiAJICAgICAgIGJkLT5kaXNrLT5kaXNrX25hbWUsIGxnZGV2LT5pbmRleCwgYmQtPm1ham9yKTsKIAorCS8qIFdlIGRvbid0IG5lZWQgdG8ga2VlcCB0aGUgInN0cnVjdCBibG9ja2RldiIgYXJvdW5kLCBidXQgaWYgd2UgZXZlcgorCSAqIGltcGxlbWVudGVkIGRldmljZSByZW1vdmFsLCB3ZSdkIG5lZWQgdGhpcy4gKi8KIAlsZ2Rldi0+cHJpdmF0ZSA9IGJkOwogCXJldHVybiAwOwogCkBAIC0yNTgsNiArNDAxLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKkQ6NDEwIFRoZSBib2lsZXJwbGF0ZSBjb2RlIGZvciByZWdpc3RlcmluZyB0aGUgbGd1ZXN0IGJsb2NrIGRyaXZlciBpcyBqdXN0CisgKiBsaWtlIHRoZSBjb25zb2xlOiAqLwogc3RhdGljIHN0cnVjdCBsZ3Vlc3RfZHJpdmVyIGxndWVzdGJsa19kcnYgPSB7CiAJLm5hbWUgPSAibGd1ZXN0YmxrIiwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggZTQyNWRhYS4uOWYwMTVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTUyOSw3ICs1MjksNyBAQAogCXJldHVybiBiaW87CiB9CiAKLXN0YXRpYyBpbnQgbG9vcF9tYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpvbGRfYmlvKQorc3RhdGljIGludCBsb29wX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqb2xkX2JpbykKIHsKIAlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gcS0+cXVldWVkYXRhOwogCWludCBydyA9IGJpb19ydyhvbGRfYmlvKTsKQEAgLTU1OCw3ICs1NTgsNyBAQAogLyoKICAqIGtpY2sgb2ZmIGlvIG9uIHRoZSB1bmRlcmx5aW5nIGFkZHJlc3Mgc3BhY2UKICAqLwotc3RhdGljIHZvaWQgbG9vcF91bnBsdWcocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgbG9vcF91bnBsdWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IHEtPnF1ZXVlZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggYzEyOTUxMC4uYmU5MmM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIHN0YXRpYyB2b2lkIG5iZF9lbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCWludCB1cHRvZGF0ZSA9IChyZXEtPmVycm9ycyA9PSAwKSA/IDEgOiAwOwotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHJlcS0+cTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IHJlcS0+cTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZHByaW50ayhEQkdfQkxLREVWLCAiJXM6IHJlcXVlc3QgJXA6ICVzXG4iLCByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwKQEAgLTQxMCw3ICs0MTAsNyBAQAogICogICB7IHByaW50ayggIldhcm5pbmc6IElnbm9yaW5nIHJlc3VsdCFcbiIpOyBuYmRfZW5kX3JlcXVlc3QoIHJlcSApOyB9CiAgKi8KIAotc3RhdGljIHZvaWQgZG9fbmJkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3N0YXRpYyB2b2lkIGRvX25iZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGNkLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYwppbmRleCAxZWViOGYyLi5iOGE5OTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiBzdGF0aWMgaW50IHBjZF9kZXRlY3Qodm9pZCk7CiBzdGF0aWMgdm9pZCBwY2RfcHJvYmVfY2FwYWJpbGl0aWVzKHZvaWQpOwogc3RhdGljIHZvaWQgZG9fcGNkX3JlYWRfZHJxKHZvaWQpOwotc3RhdGljIHZvaWQgZG9fcGNkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSk7CitzdGF0aWMgdm9pZCBkb19wY2RfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpOwogc3RhdGljIHZvaWQgZG9fcGNkX3JlYWQodm9pZCk7CiAKIHN0cnVjdCBwY2RfdW5pdCB7CkBAIC03MTMsNyArNzEzLDcgQEAKIC8qIEkvTyByZXF1ZXN0IHByb2Nlc3NpbmcgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcGNkX3F1ZXVlOwogCi1zdGF0aWMgdm9pZCBkb19wY2RfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQorc3RhdGljIHZvaWQgZG9fcGNkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCWlmIChwY2RfYnVzeSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGQuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BkLmMKaW5kZXggMzFlMDE0OC4uZGY4MTlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZC5jCkBAIC02OTgsNyArNjk4LDcgQEAKIAogLyogZW5kIG9mIGlvIHJlcXVlc3QgZW5naW5lICovCiAKLXN0YXRpYyB2b2lkIGRvX3BkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3N0YXRpYyB2b2lkIGRvX3BkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCWlmIChwZF9yZXEpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jCmluZGV4IDU4MjY1MDguLmNlZmZhNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGYuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAjZGVmaW5lIEFUQVBJX1dSSVRFXzEwCQkweDJhCiAKIHN0YXRpYyBpbnQgcGZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdm9pZCBkb19wZl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpOworc3RhdGljIHZvaWQgZG9fcGZfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpOwogc3RhdGljIGludCBwZl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgcGZfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKQEAgLTc2MCw3ICs3NjAsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9fcGZfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQorc3RhdGljIHZvaWQgZG9fcGZfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCiB7CiAJaWYgKHBmX2J1c3kpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKaW5kZXggMzFiZTMzZS4uZmFkYmZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKQEAgLTc1Miw3ICs3NTIsNyBAQAogICovCiBzdGF0aWMgaW50IHBrdF9nZW5lcmljX3BhY2tldChzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkLCBzdHJ1Y3QgcGFja2V0X2NvbW1hbmQgKmNnYykKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShwZC0+YmRldik7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShwZC0+YmRldik7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWludCByZXQgPSAwOwogCkBAIC05NzksNyArOTc5LDcgQEAKICAqIFNwZWNpYWwgY2FyZSBpcyBuZWVkZWQgaWYgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIGhhcyBhIHNtYWxsCiAgKiBtYXhfcGh5c19zZWdtZW50cyB2YWx1ZS4KICAqLwotc3RhdGljIGludCBwa3Rfc2V0X3NlZ21lbnRfbWVyZ2luZyhzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkLCByZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgaW50IHBrdF9zZXRfc2VnbWVudF9tZXJnaW5nKHN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWlmICgocGQtPnNldHRpbmdzLnNpemUgPDwgOSkgLyBDRF9GUkFNRVNJWkUgPD0gcS0+bWF4X3BoeXNfc2VnbWVudHMpIHsKIAkJLyoKQEAgLTIzMTQsNyArMjMxNCw3IEBACiB7CiAJaW50IHJldDsKIAlsb25nIGxiYTsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gcmUtb3BlbiB0aGUgY2Ryb20gZGV2aWNlIHdpdGhvdXQgT19OT05CTE9DSyB0byBiZSBhYmxlCkBAIC0yNDc3LDcgKzI0NzcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBrdF9tYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW50IHBrdF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKQEAgLTI2MjYsNyArMjYyNiw3IEBACiAKIAogCi1zdGF0aWMgaW50IHBrdF9tZXJnZV9idmVjKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYykKK3N0YXRpYyBpbnQgcGt0X21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpb192ZWMgKmJ2ZWMpCiB7CiAJc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCA9IHEtPnF1ZXVlZGF0YTsKIAlzZWN0b3JfdCB6b25lID0gWk9ORShiaW8tPmJpX3NlY3RvciwgcGQpOwpAQCAtMjY0Nyw3ICsyNjQ3LDcgQEAKIAogc3RhdGljIHZvaWQgcGt0X2luaXRfcXVldWUoc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBwZC0+ZGlzay0+cXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBwZC0+ZGlzay0+cXVldWU7CiAKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHEsIHBrdF9tYWtlX3JlcXVlc3QpOwogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHEsIENEX0ZSQU1FU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BzMmVzZGkuYyBiL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jCmluZGV4IDY4OGE0ZmIuLjNjNzk2ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jCisrKyBiL2RyaXZlcnMvYmxvY2svcHMyZXNkaS5jCkBAIC02NCw3ICs2NCw3IEBACiAKIHN0YXRpYyBpbnQgcHMyZXNkaV9nZW5pbml0KHZvaWQpOwogCi1zdGF0aWMgdm9pZCBkb19wczJlc2RpX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSk7CitzdGF0aWMgdm9pZCBkb19wczJlc2RpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKTsKIAogc3RhdGljIHZvaWQgcHMyZXNkaV9yZWFkd3JpdGUoaW50IGNtZCwgc3RydWN0IHJlcXVlc3QgKnJlcSk7CiAKQEAgLTQ3Myw3ICs0NzMsNyBAQAogfQogCiAvKiBzdHJhdGVneSByb3V0aW5lIHRoYXQgaGFuZGxlcyBtb3N0IG9mIHRoZSBJTyByZXF1ZXN0cyAqLwotc3RhdGljIHZvaWQgZG9fcHMyZXNkaV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpCitzdGF0aWMgdm9pZCBkb19wczJlc2RpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAJLyogc2luY2UsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGNsZWFyZWQgLSB0aGV5IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wczNkaXNrLmMgYi9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYwppbmRleCAxNzBmYjMzLi5hYThiODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYworKysgYi9kcml2ZXJzL2Jsb2NrL3BzM2Rpc2suYwpAQCAtMTkwLDcgKzE5MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBzM2Rpc2tfZG9fcmVxdWVzdChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgcmVxdWVzdF9xdWV1ZV90ICpxKQorCQkJICAgICAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAKQEAgLTIxMSw3ICsyMTEsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcHMzZGlza19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIHBzM2Rpc2tfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IHBzM2Rpc2tfcHJpdmF0ZSAqcHJpdiA9IGRldi0+c2JkLmNvcmUuZHJpdmVyX2RhdGE7CkBAIC00MDQsNyArNDA0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHMzZGlza19wcmVwYXJlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIHBzM2Rpc2tfcHJlcGFyZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYgPSBxLT5xdWV1ZWRhdGE7CiAKQEAgLTQxNCw3ICs0MTQsNyBAQAogCXJlcS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9GTFVTSDsKIH0KIAotc3RhdGljIGludCBwczNkaXNrX2lzc3VlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmdlbmRpc2ssCitzdGF0aWMgaW50IHBzM2Rpc2tfaXNzdWVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBnZW5kaXNrICpnZW5kaXNrLAogCQkJICAgICAgIHNlY3Rvcl90ICpzZWN0b3IpCiB7CiAJc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2ID0gcS0+cXVldWVkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9yZC5jIGIvZHJpdmVycy9ibG9jay9yZC5jCmluZGV4IGExNTEyZGEuLjY1MTUwYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JkLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogICogMTktSkFOLTE5OTggIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiAgQWRkZWQgZGV2ZnMgc3VwcG9ydAogICoKICAqLwotc3RhdGljIGludCByZF9tYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW50IHJkX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiaW8tPmJpX2JkZXY7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiBtYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3VudmRjLmMgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCmluZGV4IGQ1MGI4MjMuLjRkZmY0OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKKysrIGIvZHJpdmVycy9ibG9jay9zdW52ZGMuYwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgZG9fdmRjX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgZG9fdmRjX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKaW5kZXggMWE2NTk3OS4uYjRlNDYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zd2ltMy5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiBzdGF0aWMgdm9pZCBzd2ltM19zZWxlY3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBzZWwpOwogc3RhdGljIHZvaWQgc3dpbTNfYWN0aW9uKHN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzLCBpbnQgYWN0aW9uKTsKIHN0YXRpYyBpbnQgc3dpbTNfcmVhZGJpdChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgaW50IGJpdCk7Ci1zdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpOworc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpOwogc3RhdGljIHZvaWQgc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyk7CiBzdGF0aWMgdm9pZCBzZXRfdGltZW91dChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgaW50IG50aWNrcywKIAkJCXZvaWQgKCpwcm9jKSh1bnNpZ25lZCBsb25nKSk7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAlyZXR1cm4gKHN0YXQgJiBEQVRBKSA9PSAwOwogfQogCi1zdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpCitzdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKIHsKIAlpbnQgaTsKIAlmb3IoaT0wO2k8ZmxvcHB5X2NvdW50O2krKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3g4LmMgYi9kcml2ZXJzL2Jsb2NrL3N4OC5jCmluZGV4IDk0OWFlOTMuLjQwMjIwOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3g4LmMKKysrIGIvZHJpdmVycy9ibG9jay9zeDguYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJdW5zaWduZWQgaW50CQkJc3RhdGU7CiAJdTMyCQkJCWZ3X3ZlcjsKIAotCXJlcXVlc3RfcXVldWVfdAkJCSpvb2JfcTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkJKm9vYl9xOwogCXVuc2lnbmVkIGludAkJCW5fb29iOwogCiAJdW5zaWduZWQgaW50CQkJaHdfc2dfdXNlZDsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCiAJdW5zaWduZWQgaW50CQkJd2FpdF9xX3Byb2Q7CiAJdW5zaWduZWQgaW50CQkJd2FpdF9xX2NvbnM7Ci0JcmVxdWVzdF9xdWV1ZV90CQkJKndhaXRfcVtDQVJNX01BWF9XQUlUX1FdOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlCQkqd2FpdF9xW0NBUk1fTUFYX1dBSVRfUV07CiAKIAl1bnNpZ25lZCBpbnQJCQluX21zZ3M7CiAJdTY0CQkJCW1zZ19hbGxvYzsKQEAgLTc1Niw3ICs3NTYsNyBAQAogCWFzc2VydChyYyA9PSAwKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNhcm1fcHVzaF9xIChzdHJ1Y3QgY2FybV9ob3N0ICpob3N0LCByZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgaW5saW5lIHZvaWQgY2FybV9wdXNoX3EgKHN0cnVjdCBjYXJtX2hvc3QgKmhvc3QsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXVuc2lnbmVkIGludCBpZHggPSBob3N0LT53YWl0X3FfcHJvZCAlIENBUk1fTUFYX1dBSVRfUTsKIApAQCAtNzY4LDcgKzc2OCw3IEBACiAJQlVHX09OKGhvc3QtPndhaXRfcV9wcm9kID09IGhvc3QtPndhaXRfcV9jb25zKTsgLyogb3ZlcnJ1biAqLwogfQogCi1zdGF0aWMgaW5saW5lIHJlcXVlc3RfcXVldWVfdCAqY2FybV9wb3BfcShzdHJ1Y3QgY2FybV9ob3N0ICpob3N0KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqY2FybV9wb3BfcShzdHJ1Y3QgY2FybV9ob3N0ICpob3N0KQogewogCXVuc2lnbmVkIGludCBpZHg7CiAKQEAgLTc4Myw3ICs3ODMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2FybV9yb3VuZF9yb2JpbihzdHJ1Y3QgY2FybV9ob3N0ICpob3N0KQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNhcm1fcG9wX3EoaG9zdCk7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjYXJtX3BvcF9xKGhvc3QpOwogCWlmIChxKSB7CiAJCWJsa19zdGFydF9xdWV1ZShxKTsKIAkJVlBSSU5USygiU1RBUlRFRCBRVUVVRSAlcFxuIiwgcSk7CkBAIC04MDIsNyArODAyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGNhcm1fb29iX3JxX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIGNhcm1fb29iX3JxX2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCBjYXJtX2hvc3QgKmhvc3QgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IGNhcm1fcmVxdWVzdCAqY3JxOwpAQCAtODMzLDcgKzgzMyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBjYXJtX3JxX2ZuKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIGNhcm1fcnFfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IGNhcm1fcG9ydCAqcG9ydCA9IHEtPnF1ZXVlZGF0YTsKIAlzdHJ1Y3QgY2FybV9ob3N0ICpob3N0ID0gcG9ydC0+aG9zdDsKQEAgLTE0OTQsNyArMTQ5NCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQ0FSTV9NQVhfUE9SVFM7IGkrKykgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKLQkJcmVxdWVzdF9xdWV1ZV90ICpxOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAkJc3RydWN0IGNhcm1fcG9ydCAqcG9ydDsKIAogCQlwb3J0ID0gJmhvc3QtPnBvcnRbaV07CkBAIC0xNTM4LDcgKzE1MzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBDQVJNX01BWF9QT1JUUzsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaG9zdC0+cG9ydFtpXS5kaXNrOwogCQlpZiAoZGlzaykgewotCQkJcmVxdWVzdF9xdWV1ZV90ICpxID0gZGlzay0+cXVldWU7CisJCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRpc2stPnF1ZXVlOwogCiAJCQlpZiAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkKIAkJCQlkZWxfZ2VuZGlzayhkaXNrKTsKQEAgLTE1NzEsNyArMTU3MSw3IEBACiAJc3RydWN0IGNhcm1faG9zdCAqaG9zdDsKIAl1bnNpZ25lZCBpbnQgcGNpX2RhYzsKIAlpbnQgcmM7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCA4YjEzZDdkLi5jNTdkZDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC01MDMsNyArNTAzLDcgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCB1Yl9sdW4gKmx1bjsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnNjLT5sdW5zKSkgewogCQlwID0gc2MtPmx1bnMubmV4dDsKQEAgLTYxOSw3ICs2MTksNyBAQAogICogVGhlIHJlcXVlc3QgZnVuY3Rpb24gaXMgb3VyIG1haW4gZW50cnkgcG9pbnQKICAqLwogCi1zdGF0aWMgdm9pZCB1Yl9yZXF1ZXN0X2ZuKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIHViX3JlcXVlc3RfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IHViX2x1biAqbHVuID0gcS0+cXVldWVkYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKQEAgLTIyNzMsNyArMjI3Myw3IEBACiBzdGF0aWMgaW50IHViX3Byb2JlX2x1bihzdHJ1Y3QgdWJfZGV2ICpzYywgaW50IGxudW0pCiB7CiAJc3RydWN0IHViX2x1biAqbHVuOwotCXJlcXVlc3RfcXVldWVfdCAqcTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIAlpbnQgcmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdW1lbS5jIGIvZHJpdmVycy9ibG9jay91bWVtLmMKaW5kZXggZGVjNzRiZC4uNmI3YzAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91bWVtLmMKKysrIGIvZHJpdmVycy9ibG9jay91bWVtLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkJCSAgICAqLwogCXN0cnVjdCBiaW8JKmJpbywgKmN1cnJlbnRiaW8sICoqYmlvdGFpbDsKIAotCXJlcXVlc3RfcXVldWVfdCAqcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwogCiAJc3RydWN0IG1tX3BhZ2UgewogCQlkbWFfYWRkcl90CQlwYWdlX2RtYTsKQEAgLTM1Nyw3ICszNTcsNyBAQAogCXBhZ2UtPmJpb3RhaWwgPSAmIHBhZ2UtPmJpbzsKIH0KIAotc3RhdGljIHZvaWQgbW1fdW5wbHVnX2RldmljZShyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBtbV91bnBsdWdfZGV2aWNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCBjYXJkaW5mbyAqY2FyZCA9IHEtPnF1ZXVlZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTQxLDcgKzU0MSw3IEBACiAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX21ha2VfcmVxdWVzdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCi1zdGF0aWMgaW50IG1tX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgbW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGNhcmRpbmZvICpjYXJkID0gcS0+cXVldWVkYXRhOwogCXByX2RlYnVnKCJtbV9tYWtlX3JlcXVlc3QgJWxsdSAldVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKaW5kZXggZGFlMzk5MS4uODU5MTZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKKysrIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKQEAgLTQwMCw3ICs0MDAsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIHJlcXVlc3QgcHJvY2Vzc2luZyByb3V0aW5lCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3Zpb2Rhc2RfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBkb192aW9kYXNkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZC5jIGIvZHJpdmVycy9ibG9jay94ZC5jCmluZGV4IDBkOTdiN2UuLjYyNGQzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hkLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogfQogCiAvKiBkb194ZF9yZXF1ZXN0OiBoYW5kbGUgYW4gaW5jb21pbmcgcmVxdWVzdCAqLwotc3RhdGljIHZvaWQgZG9feGRfcmVxdWVzdCAocmVxdWVzdF9xdWV1ZV90ICogcSkKK3N0YXRpYyB2b2lkIGRvX3hkX3JlcXVlc3QgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hkLmggYi9kcml2ZXJzL2Jsb2NrL3hkLmgKaW5kZXggODJlMDkwZi4uY2ZmZDQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZC5oCisrKyBiL2RyaXZlcnMvYmxvY2sveGQuaApAQCAtMTA0LDcgKzEwNCw3IEBACiBzdGF0aWMgdV9jaGFyIHhkX2RldGVjdCAodV9jaGFyICpjb250cm9sbGVyLCB1bnNpZ25lZCBpbnQgKmFkZHJlc3MpOwogc3RhdGljIHVfY2hhciB4ZF9pbml0ZHJpdmVzICh2b2lkICgqaW5pdF9kcml2ZSkodV9jaGFyIGRyaXZlKSk7CiAKLXN0YXRpYyB2b2lkIGRvX3hkX3JlcXVlc3QgKHJlcXVlc3RfcXVldWVfdCAqIHEpOworc3RhdGljIHZvaWQgZG9feGRfcmVxdWVzdCAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKTsKIHN0YXRpYyBpbnQgeGRfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsc3RydWN0IGZpbGUgKmZpbGUsdW5zaWduZWQgaW50IGNtZCx1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgaW50IHhkX3JlYWR3cml0ZSAodV9jaGFyIG9wZXJhdGlvbixYRF9JTkZPICpkaXNrLGNoYXIgKmJ1ZmZlcix1X2ludCBibG9jayx1X2ludCBjb3VudCk7CiBzdGF0aWMgdm9pZCB4ZF9yZWNhbGlicmF0ZSAodV9jaGFyIGRyaXZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCmluZGV4IDY3NDZjMjkuLjk2NGU1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiAgKiBkb19ibGtpZl9yZXF1ZXN0CiAgKiAgcmVhZCBhIGJsb2NrOyByZXF1ZXN0IGlzIGluIGEgcmVxdWVzdCBxdWV1ZQogICovCi1zdGF0aWMgdm9pZCBkb19ibGtpZl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcnEpCitzdGF0aWMgdm9pZCBkb19ibGtpZl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSkKIHsKIAlzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbyA9IE5VTEw7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCiBzdGF0aWMgaW50IHhsdmJkX2luaXRfYmxrX3F1ZXVlKHN0cnVjdCBnZW5kaXNrICpnZCwgdTE2IHNlY3Rvcl9zaXplKQogewotCXJlcXVlc3RfcXVldWVfdCAqcnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxOwogCiAJcnEgPSBibGtfaW5pdF9xdWV1ZShkb19ibGtpZl9yZXF1ZXN0LCAmYmxraWZfaW9fbG9jayk7CiAJaWYgKHJxID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCmluZGV4IDczMmVjNjMuLmNiMjdlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCisrKyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCkBAIC00NTgsNyArNDU4LDcgQEAKIH0KIAogLyogR2V0IHRoZSBuZXh0IHJlYWQvd3JpdGUgcmVxdWVzdDsgZW5kaW5nIHJlcXVlc3RzIHRoYXQgd2UgZG9uJ3QgaGFuZGxlICovCi1zdHJ1Y3QgcmVxdWVzdCAqYWNlX2dldF9uZXh0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3N0cnVjdCByZXF1ZXN0ICphY2VfZ2V0X25leHRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIApAQCAtODI1LDcgKzgyNSw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEJsb2NrIG9wcwogICovCi1zdGF0aWMgdm9pZCBhY2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQorc3RhdGljIHZvaWQgYWNlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBxKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAJc3RydWN0IGFjZV9kZXZpY2UgKmFjZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svejJyYW0uYyBiL2RyaXZlcnMvYmxvY2svejJyYW0uYwppbmRleCBlNDBmYTk4Li4yZDU4NTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKKysrIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCkBAIC02Nyw3ICs2Nyw3IEBACiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHoyX2ZvcHM7CiBzdGF0aWMgc3RydWN0IGdlbmRpc2sgKnoycmFtX2dlbmRpc2s7CiAKLXN0YXRpYyB2b2lkIGRvX3oyX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgZG9fejJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCmluZGV4IDQ5OTAxOWIuLjY3ZWUzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYworKysgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKQEAgLTIwOTQsNyArMjA5NCw3IEBACiBzdGF0aWMgaW50IGNkcm9tX3JlYWRfY2RkYV9icGMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIF9fdTggX191c2VyICp1YnVmLAogCQkJICAgICAgIGludCBsYmEsIGludCBuZnJhbWVzKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNkaS0+ZGlzay0+cXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjZGktPmRpc2stPnF1ZXVlOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJdW5zaWduZWQgaW50IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYyBiL2RyaXZlcnMvY2Ryb20vdmlvY2QuYwppbmRleCA0NGNkN2IyLi5lNTE1NTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKKysrIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCkBAIC0zOTgsNyArMzk4LDcgQEAKIAogc3RhdGljIGludCByd3JlcTsKIAotc3RhdGljIHZvaWQgZG9fdmlvY2RfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBkb192aW9jZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggYzhkZmQxOC4uYjM5MTc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTEzMCw2ICsxMzAsNyBAQAogY29uZmlnIENZQ0xBREVTCiAJdHJpc3RhdGUgIkN5Y2xhZGVzIGFzeW5jIG11eCBzdXBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChQQ0kgfHwgSVNBKQorCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBDeWNsYWRlcyBaIGFuZCBZIG11bHRpc2VyaWFsIGJvYXJkcy4KIAkgIFlvdSB3b3VsZCBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gY29ubmVjdCBtb3JlIHRoYW4gdHdvIG1vZGVtcyB0bwpAQCAtNzI2LDcgKzcyNyw3IEBACiAKIGNvbmZpZyBSVEMKIAl0cmlzdGF0ZSAiRW5oYW5jZWQgUmVhbCBUaW1lIENsb2NrIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhUFBDICYmICFQQVJJU0MgJiYgIUlBNjQgJiYgIU02OEsgJiYgIVNQQVJDNjQgJiYgKCFTUEFSQzMyIHx8IFBDSSkgJiYgIUZSViAmJiAhQVJNICYmICFTVVBFUkggJiYgIVMzOTAKKwlkZXBlbmRzIG9uICFQUEMgJiYgIVBBUklTQyAmJiAhSUE2NCAmJiAhTTY4SyAmJiAhU1BBUkMgJiYgIUZSViAmJiAhQVJNICYmICFTVVBFUkggJiYgIVMzOTAKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgY3JlYXRlIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSAvZGV2L3J0YyB3aXRoCiAJICBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yIG51bWJlciAxMzUgdXNpbmcgbWtub2QgKCJtYW4gbWtub2QiKSwgeW91CkBAIC03NTAsNiArNzUxLDI4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMuCiAKK2NvbmZpZyBKU19SVEMKKwl0cmlzdGF0ZSAiRW5oYW5jZWQgUmVhbCBUaW1lIENsb2NrIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBTUEFSQzMyICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKKwkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKKwkgIHdpbGwgZ2V0IGFjY2VzcyB0byB0aGUgcmVhbCB0aW1lIGNsb2NrIChvciBoYXJkd2FyZSBjbG9jaykgYnVpbHQKKwkgIGludG8geW91ciBjb21wdXRlci4KKworCSAgRXZlcnkgUEMgaGFzIHN1Y2ggYSBjbG9jayBidWlsdCBpbi4gSXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUKKwkgIHNpZ25hbHMgZnJvbSBhcyBsb3cgYXMgMUh6IHVwIHRvIDgxOTJIeiwgYW5kIGNhbiBhbHNvIGJlIHVzZWQKKwkgIGFzIGEgMjQgaG91ciBhbGFybS4gSXQgcmVwb3J0cyBzdGF0dXMgaW5mb3JtYXRpb24gdmlhIHRoZSBmaWxlCisJICAvcHJvYy9kcml2ZXIvcnRjIGFuZCBpdHMgYmVoYXZpb3VyIGlzIHNldCBieSB2YXJpb3VzIGlvY3RscyBvbgorCSAgL2Rldi9ydGMuCisKKwkgIElmIHlvdSB0aGluayB5b3UgaGF2ZSBhIHVzZSBmb3Igc3VjaCBhIGRldmljZSAoc3VjaCBhcyBwZXJpb2RpYyBkYXRhCisJICBzYW1wbGluZyksIHRoZW4gc2F5IFkgaGVyZSwgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9ydGMudHh0PgorCSAgZm9yIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGpzLXJ0Yy4KKwogY29uZmlnIFNHSV9EUzEyODYKIAl0cmlzdGF0ZSAiU0dJIERTMTI4NiBSVEMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNHSV9JUDIyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggOGZlY2FmNC4uMjNiMjZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtMTA5LDYgKzEwOSw5IEBACiAKIG9iai0kKENPTkZJR19QUzNfRkxBU0gpCQkrPSBwczNmbGFzaC5vCiAKK29iai0kKENPTkZJR19KU19SVEMpCQkrPSBqcy1ydGMubworanMtcnRjLXkgPSBydGMubworCiAjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCiBjbGVhbi1maWxlcyA6PSBjb25zb2xlbWFwX2RlZnRibC5jIGRlZmtleW1hcC5jCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZwppbmRleCBhOWY5YzQ4Li43MTM1MzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2FncC9LY29uZmlnCkBAIC01MCw3ICs1MCw3IEBACiAKIGNvbmZpZyBBR1BfQU1ECiAJdHJpc3RhdGUgIkFNRCBJcm9uZ2F0ZSwgNzYxLCBhbmQgNzYyIGNoaXBzZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFHUCAmJiBYODZfMzIKKwlkZXBlbmRzIG9uIEFHUCAmJiAoWDg2XzMyIHx8IEFMUEhBKQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGdpdmVzIHlvdSBBR1Agc3VwcG9ydCBmb3IgdGhlIEdMWCBjb21wb25lbnQgb2YKIAkgIFggb24gQU1EIElyb25nYXRlLCA3NjEsIGFuZCA3NjIgY2hpcHNldHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2F0aS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCmluZGV4IDc4MGU1OWUuLmRhNzUxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jCkBAIC0xMjMsMjEgKzEyMywxNiBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5yX3RhYmxlczsgaSsrKSB7CiAJCWVudHJ5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0aV9wYWdlX21hcCksIEdGUF9LRVJORUwpOworCQl0YWJsZXNbaV0gPSBlbnRyeTsKIAkJaWYgKGVudHJ5ID09IE5VTEwpIHsKLQkJCXdoaWxlIChpID4gMCkgewotCQkJCWtmcmVlKHRhYmxlc1tpLTFdKTsKLQkJCQlpLS07Ci0JCQl9Ci0JCQlrZnJlZSh0YWJsZXMpOwogCQkJcmV0dmFsID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9Ci0JCXRhYmxlc1tpXSA9IGVudHJ5OwogCQlyZXR2YWwgPSBhdGlfY3JlYXRlX3BhZ2VfbWFwKGVudHJ5KTsKIAkJaWYgKHJldHZhbCAhPSAwKQogCQkJYnJlYWs7CiAJfQotCWF0aV9nZW5lcmljX3ByaXZhdGUubnVtX3RhYmxlcyA9IG5yX3RhYmxlczsKKwlhdGlfZ2VuZXJpY19wcml2YXRlLm51bV90YWJsZXMgPSBpOwogCWF0aV9nZW5lcmljX3ByaXZhdGUuZ2F0dF9wYWdlcyA9IHRhYmxlczsKIAogCWlmIChyZXR2YWwgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5jCmluZGV4IGZjYjRiMWIuLmVjZDQyNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYwpAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9hZ3BnYXJ0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJhZ3AuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwppbmRleCBjN2VkNjE3Li43NzkxZTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCmluZGV4IGQ1MzVjNDAuLjNkYjRmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCkBAIC0xMTcwLDcgKzExNzAsNiBAQAogCW1hcF9wYWdlX2ludG9fYWdwKHBhZ2UpOwogCiAJZ2V0X3BhZ2UocGFnZSk7Ci0JU2V0UGFnZUxvY2tlZChwYWdlKTsKIAlhdG9taWNfaW5jKCZhZ3BfYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOwogCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CiB9CkBAIC0xMTg3LDcgKzExODYsNiBAQAogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CiAJdW5tYXBfcGFnZV9mcm9tX2FncChwYWdlKTsKIAlwdXRfcGFnZShwYWdlKTsKLQl1bmxvY2tfcGFnZShwYWdlKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJYXRvbWljX2RlYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCmluZGV4IGExMjQwNjAuLjI5NGNkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtMjAsNyArMjAsOSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R19JRyAgICAgICAweDI5QTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNX0hCICAgICAgMHgyQTAwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTV9JRyAgICAgIDB4MkEwMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01FX0hCICAgICAweDJBMTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNRV9JRyAgICAgMHgyQTEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHTUVfSEIgICAgIDB4MjdBQwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01FX0lHICAgICAweDI3QUUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9HMzNfSEIgICAgICAgICAgMHgyOUMwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRzMzX0lHICAgICAgICAgIDB4MjlDMgpAQCAtMzMsNyArMzUsOCBAQAogICAgICAgICAgICAgICAgICBhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R18xX0hCIHx8IFwKICAgICAgICAgICAgICAgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NVFfSEIgfHwgXAogICAgICAgICAgICAgICAgICBhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R19IQiB8fCBcCi0gICAgICAgICAgICAgICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTV9IQikKKyAgICAgICAgICAgICAgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNX0hCIHx8IFwKKyAgICAgICAgICAgICAgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNRV9IQikKIAogI2RlZmluZSBJU19HMzMgKGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRzMzX0hCIHx8IFwKIAkJYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSEIgfHwgXApAQCAtMjEzLDcgKzIxNiw2IEBACiAJfQogCWdsb2JhbF9mbHVzaF90bGIoKTsKIAlnZXRfcGFnZShwYWdlKTsKLQlTZXRQYWdlTG9ja2VkKHBhZ2UpOwogCWF0b21pY19pbmMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CiAJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKIH0KQEAgLTIyOSw3ICsyMzEsNiBAQAogCWNoYW5nZV9wYWdlX2F0dHIocGFnZSwgNCwgUEFHRV9LRVJORUwpOwogCWdsb2JhbF9mbHVzaF90bGIoKTsKIAlwdXRfcGFnZShwYWdlKTsKLQl1bmxvY2tfcGFnZShwYWdlKTsKIAlfX2ZyZWVfcGFnZXMocGFnZSwgMik7CiAJYXRvbWljX2RlYygmYWdwX2JyaWRnZS0+Y3VycmVudF9tZW1vcnlfYWdwKTsKIH0KQEAgLTUyNyw2ICs1MjgsNyBAQAogCQkJICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5MTVHTV9IQiB8fAogCQkJICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHX0hCIHx8CiAJCQkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNX0hCIHx8CisJCQkgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNRV9IQiB8fAogCQkJICAgIElTX0k5NjUgfHwgSVNfRzMzKQogCQkJCWd0dF9lbnRyaWVzID0gTUIoNDgpIC0gS0Ioc2l6ZSk7CiAJCQllbHNlCkBAIC01MzgsNiArNTQwLDcgQEAKIAkJCSAgICBhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R01fSEIgfHwKIAkJCSAgICBhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R19IQiB8fAogCQkJICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHTV9IQiB8fAorCQkJICAgIGFncF9icmlkZ2UtPmRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHTUVfSEIgfHwKIAkJCSAgICBJU19JOTY1IHx8IElTX0czMykKIAkJCQlndHRfZW50cmllcyA9IE1CKDY0KSAtIEtCKHNpemUpOwogCQkJZWxzZQpAQCAtMTg0OCw5ICsxODUxLDkgQEAKIAkJTlVMTCwgJmludGVsXzkxNV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R19JRywgMCwgIjk0NUciLAogCQlOVUxMLCAmaW50ZWxfOTE1X2RyaXZlciB9LAotCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01fSUcsIDEsICI5NDVHTSIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01fSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHTV9JRywgMCwgIjk0NUdNIiwKIAkJTlVMTCwgJmludGVsXzkxNV9kcml2ZXIgfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDVHTV9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNRV9JRywgMCwgIjk0NUdNRSIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01FX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01FX0lHLCAwLCAiOTQ1R01FIiwKIAkJTlVMTCwgJmludGVsXzkxNV9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NDZHWl9IQiwgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NkdaX0lHLCAwLCAiOTQ2R1oiLAogCQlOVUxMLCAmaW50ZWxfaTk2NV9kcml2ZXIgfSwKQEAgLTE4NjAsOSArMTg2Myw5IEBACiAJCU5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHX0lHLCAwLCAiOTY1RyIsCiAJCU5VTEwsICZpbnRlbF9pOTY1X2RyaXZlciB9LAotCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNX0hCLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01fSUcsIDEsICI5NjVHTSIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01fSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTV9JRywgMCwgIjk2NUdNIiwKIAkJTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCi0JeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01fSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTUVfSUcsIDAsICI5NjVHTUUvR0xFIiwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTUVfSEIsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHTUVfSUcsIDAsICI5NjVHTUUvR0xFIiwKIAkJTlVMTCwgJmludGVsX2k5NjVfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzc1MDVfMCwgMCwgMCwgIkU3NTA1IiwgJmludGVsXzc1MDVfZHJpdmVyLCBOVUxMIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzcyMDVfMCwgMCwgMCwgIkU3MjA1IiwgJmludGVsXzc1MDVfZHJpdmVyLCBOVUxMIH0sCkBAIC0yMDUxLDExICsyMDU0LDEzIEBACiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdNX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R19IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01FX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ2R1pfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVHXzFfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVRX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R19IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNX0hCKSwKKwlJRChQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01FX0hCKSwKIAlJRChQQ0lfREVWSUNFX0lEX0lOVEVMX0czM19IQiksCiAJSUQoUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSEIpLAogCUlEKFBDSV9ERVZJQ0VfSURfSU5URUxfUTMzX0hCKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKaW5kZXggY2RhNjA4Yy4uOThjZjhhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKQEAgLTUxLDcgKzUxLDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlnZXRfcGFnZShwYWdlKTsKLQlTZXRQYWdlTG9ja2VkKHBhZ2UpOwogCWF0b21pY19pbmMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CiAJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ocGV0LmMgYi9kcml2ZXJzL2NoYXIvaHBldC5jCmluZGV4IGJhMGU3NGEuLjc3YmY0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ocGV0LmMKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICAubmFtZSAgICAgICAgICAgPSAiaHBldCIsCiAgICAgICAgIC5yYXRpbmcgICAgICAgICA9IDI1MCwKICAgICAgICAgLnJlYWQgICAgICAgICAgID0gcmVhZF9ocGV0LAotICAgICAgICAubWFzayAgICAgICAgICAgPSAweGZmZmZmZmZmZmZmZmZmZmYsCisgICAgICAgIC5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAogICAgICAgICAubXVsdCAgICAgICAgICAgPSAwLCAvKnRvIGJlIGNhbHVjbGF0ZWQqLwogICAgICAgICAuc2hpZnQgICAgICAgICAgPSAxMCwKICAgICAgICAgLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCkBAIC0xMDA3LDkgKzEwMDcsMTUgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBocGV0X2RldmljZV9pZHNbXSA9IHsKKwl7IlBOUDAxMDMiLCAwfSwKKwl7IiIsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgaHBldF9kZXZpY2VfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBocGV0X2FjcGlfZHJpdmVyID0gewogCS5uYW1lID0gImhwZXQiLAotCS5pZHMgPSAiUE5QMDEwMyIsCisJLmlkcyA9IGhwZXRfZGV2aWNlX2lkcywKIAkub3BzID0gewogCQkuYWRkID0gaHBldF9hY3BpX2FkZCwKIAkJLnJlbW92ZSA9IGhwZXRfYWNwaV9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2xndWVzdC5jIGIvZHJpdmVycy9jaGFyL2h2Y19sZ3Vlc3QuYwppbmRleCBlN2I4ODllLi5mZWVjY2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2xndWVzdC5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfbGd1ZXN0LmMKQEAgLTEsNiArMSwyMiBAQAotLyogU2ltcGxlIGNvbnNvbGUgZm9yIGxndWVzdC4KKy8qRDozMDAKKyAqIFRoZSBHdWVzdCBjb25zb2xlIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBSdXN0eSBSdXNzZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqIFRoaXMgaXMgYSB0cml2aWFsIGNvbnNvbGUgZHJpdmVyOiB3ZSB1c2UgbGd1ZXN0J3MgRE1BIG1lY2hhbmlzbSB0byBzZW5kCisgKiBieXRlcyBvdXQsIGFuZCByZWdpc3RlciBhIERNQSBidWZmZXIgdG8gcmVjZWl2ZSBieXRlcyBpbi4gIEl0IGlzIGFzc3VtZWQgdG8KKyAqIGJlIHByZXNlbnQgYW5kIGF2YWlsYWJsZSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBib290LgorICoKKyAqIFdyaXRpbmcgY29uc29sZSBkcml2ZXJzIGlzIG9uZSBvZiB0aGUgZmV3IHJlbWFpbmluZyBEYXJrIEFydHMgaW4gTGludXguCisgKiBGb3J0dW5hdGVseSBmb3IgdXMsIHRoZSBwYXRoIG9mIHZpcnR1YWwgY29uc29sZXMgaGFzIGJlZW4gd2VsbC10cm9kZGVuIGJ5CisgKiB0aGUgUG93ZXJQQyBmb2xrcywgd2hvIHdyb3RlICJodmNfY29uc29sZS5jIiB0byBnZW5lcmljYWxseSBzdXBwb3J0IGFueQorICogdmlydHVhbCBjb25zb2xlLiAgV2UgdXNlIHRoYXQgaW5mcmFzdHJ1Y3R1cmUgd2hpY2ggb25seSByZXF1aXJlcyB1cyB0byB3cml0ZQorICogdGhlIGJhc2ljIHB1dF9jaGFycyBhbmQgZ2V0X2NoYXJzIGZ1bmN0aW9ucyBhbmQgY2FsbCB0aGUgcmlnaHQgcmVnaXN0ZXIKKyAqIGZ1bmN0aW9ucy4KKyA6Ki8KKworLypNOjAwMiBUaGUgY29uc29sZSBjYW4gYmUgZmxvb2RlZDogd2hpbGUgdGhlIEd1ZXN0IGlzIHByb2Nlc3NpbmcgaW5wdXQgdGhlCisgKiBIb3N0IGNhbiBzZW5kIG1vcmUuICBCdWZmZXJpbmcgaW4gdGhlIEhvc3QgY291bGQgYWxsZXZpYXRlIHRoaXMsIGJ1dCBpdCBpcyBhCisgKiBkaWZmaWN1bHQgcHJvYmxlbSBpbiBnZW5lcmFsLiA6Ki8KKy8qIENvcHlyaWdodCAoQykgMjAwNiBSdXN0eSBSdXNzZWxsLCBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIxLDQ5ICszNyw4MSBAQAogI2luY2x1ZGUgPGxpbnV4L2xndWVzdF9idXMuaD4KICNpbmNsdWRlICJodmNfY29uc29sZS5oIgogCisvKkQ6MzQwIFRoaXMgaXMgb3VyIHNpbmdsZSBjb25zb2xlIGlucHV0IGJ1ZmZlciwgd2l0aCBhc3NvY2lhdGVkICJzdHJ1Y3QKKyAqIGxndWVzdF9kbWEiIHJlZmVycmluZyB0byBpdC4gIE5vdGUgdGhlIDAtdGVybWluYXRlZCBsZW5ndGggYXJyYXksIGFuZCB0aGUKKyAqIHVzZSBvZiBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgYnVmZmVyIGl0c2VsZi4gKi8KIHN0YXRpYyBjaGFyIGluYnVmWzI1Nl07CiBzdGF0aWMgc3RydWN0IGxndWVzdF9kbWEgY29uc19pbnB1dCA9IHsgLnVzZWRfbGVuID0gMCwKIAkJCQkJLmFkZHJbMF0gPSBfX3BhKGluYnVmKSwKIAkJCQkJLmxlblswXSA9IHNpemVvZihpbmJ1ZiksCiAJCQkJCS5sZW5bMV0gPSAwIH07CiAKKy8qRDozMTAgVGhlIHB1dF9jaGFycygpIGNhbGxiYWNrIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuCisgKgorICogRmlyc3Qgd2UgcHV0IHRoZSBwb2ludGVyIGFuZCBsZW5ndGggaW4gYSAic3RydWN0IGxndWVzdF9kbWEiOiB3ZSBvbmx5IGhhdmUKKyAqIG9uZSBwb2ludGVyLCBzbyB3ZSBzZXQgdGhlIHNlY29uZCBsZW5ndGggdG8gMC4gIFRoZW4gd2UgdXNlIFNFTkRfRE1BIHRvIHNlbmQKKyAqIHRoZSBkYXRhIHRvIChIb3N0KSBidWZmZXJzIGF0dGFjaGVkIHRvIHRoZSBjb25zb2xlIGtleS4gIFVzdWFsbHkgYSBkZXZpY2UncworICoga2V5IGlzIGEgcGh5c2ljYWwgYWRkcmVzcyB3aXRoaW4gdGhlIGRldmljZSdzIG1lbW9yeSwgYnV0IGJlY2F1c2UgdGhlCisgKiBjb25zb2xlIGRldmljZSBkb2Vzbid0IGhhdmUgYW55IGFzc29jaWF0ZWQgcGh5c2ljYWwgbWVtb3J5LCB3ZSB1c2UgdGhlCisgKiBMR1VFU1RfQ09OU09MRV9ETUFfS0VZIGNvbnN0YW50IChha2EgMCkuICovCiBzdGF0aWMgaW50IHB1dF9jaGFycyh1MzIgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGxndWVzdF9kbWEgZG1hOwogCi0JLyogRklYTUU6IHdoYXQgaWYgaXQncyBvdmVyIGEgcGFnZSBib3VuZGFyeT8gKi8KKwkvKiBGSVhNRTogRE1BIGJ1ZmZlcnMgaW4gYSAic3RydWN0IGxndWVzdF9kbWEiIGFyZSBub3QgYWxsb3dlZAorCSAqIHRvIGdvIG92ZXIgcGFnZSBib3VuZGFyaWVzLiAgVGhpcyBuZXZlciBzZWVtcyB0byBoYXBwZW4sCisJICogYnV0IGlmIGl0IGRpZCB3ZSdkIG5lZWQgdG8gZml4IHRoaXMgY29kZS4gKi8KIAlkbWEubGVuWzBdID0gY291bnQ7CiAJZG1hLmxlblsxXSA9IDA7CiAJZG1hLmFkZHJbMF0gPSBfX3BhKGJ1Zik7CiAKIAlsZ3Vlc3Rfc2VuZF9kbWEoTEdVRVNUX0NPTlNPTEVfRE1BX0tFWSwgJmRtYSk7CisJLyogV2UncmUgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSB3ZSB3cm90ZTogYWxsIG9mIGl0LiAqLwogCXJldHVybiBjb3VudDsKIH0KIAorLypEOjM1MCBnZXRfY2hhcnMoKSBpcyB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgaHZjX2NvbnNvbGUgaW5mcmFzdHJ1Y3R1cmUgd2hlbgorICogYW4gaW50ZXJydXB0IGlzIHJlY2VpdmVkLgorICoKKyAqIEZpcnN0bHkgd2Ugc2VlIGlmIG91ciBidWZmZXIgaGFzIGJlZW4gZmlsbGVkOiBpZiBub3QsIHdlIHJldHVybi4gIFRoZSByZXN0CisgKiBvZiB0aGUgY29kZSBkZWFscyB3aXRoIHRoZSBmYWN0IHRoYXQgdGhlIGh2Y19jb25zb2xlKCkgaW5mcmFzdHJ1Y3R1cmUgb25seQorICogYXNrcyB1cyBmb3IgMTYgYnl0ZXMgYXQgYSB0aW1lLiAgV2Uga2VlcCBhICJjb25zX29mZnNldCIgdmFyaWFibGUgZm9yCisgKiBwYXJ0aWFsbHktcmVhZCBidWZmZXJzLiAqLwogc3RhdGljIGludCBnZXRfY2hhcnModTMyIHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewogCXN0YXRpYyBpbnQgY29uc19vZmZzZXQ7CiAKKwkvKiBOb3RoaW5nIGxlZnQgdG8gc2VlIGhlcmUuLi4gKi8KIAlpZiAoIWNvbnNfaW5wdXQudXNlZF9sZW4pCiAJCXJldHVybiAwOwogCisJLyogWW91IHdhbnQgbW9yZSB0aGFuIHdlIGhhdmUgdG8gZ2l2ZT8gIFdlbGwsIHRyeSB3YW50aW5nIGxlc3MhICovCiAJaWYgKGNvbnNfaW5wdXQudXNlZF9sZW4gLSBjb25zX29mZnNldCA8IGNvdW50KQogCQljb3VudCA9IGNvbnNfaW5wdXQudXNlZF9sZW4gLSBjb25zX29mZnNldDsKIAorCS8qIENvcHkgYWNyb3NzIHRvIHRoZWlyIGJ1ZmZlciBhbmQgaW5jcmVtZW50IG9mZnNldC4gKi8KIAltZW1jcHkoYnVmLCBpbmJ1ZiArIGNvbnNfb2Zmc2V0LCBjb3VudCk7CiAJY29uc19vZmZzZXQgKz0gY291bnQ7CisKKwkvKiBGaW5pc2hlZD8gIFplcm8gb2Zmc2V0LCBhbmQgcmVzZXQgY29uc19pbnB1dCBzbyBIb3N0IHdpbGwgdXNlIGl0CisJICogYWdhaW4uICovCiAJaWYgKGNvbnNfb2Zmc2V0ID09IGNvbnNfaW5wdXQudXNlZF9sZW4pIHsKIAkJY29uc19vZmZzZXQgPSAwOwogCQljb25zX2lucHV0LnVzZWRfbGVuID0gMDsKIAl9CiAJcmV0dXJuIGNvdW50OwogfQorLyo6Ki8KIAogc3RhdGljIHN0cnVjdCBodl9vcHMgbGd1ZXN0X2NvbnMgPSB7CiAJLmdldF9jaGFycyA9IGdldF9jaGFycywKIAkucHV0X2NoYXJzID0gcHV0X2NoYXJzLAogfTsKIAorLypEOjMyMCBDb25zb2xlIGRyaXZlcnMgYXJlIGluaXRpYWxpemVkIHZlcnkgZWFybHkgc28gYm9vdCBtZXNzYWdlcyBjYW4gZ28KKyAqIG91dC4gIEF0IHRoaXMgc3RhZ2UsIHRoZSBjb25zb2xlIGlzIG91dHB1dC1vbmx5LiAgT3VyIGRyaXZlciBjaGVja3Mgd2UncmUgYQorICogR3Vlc3QsIGFuZCBpZiBzbyBoYW5kcyBodmNfaW5zdGFudGlhdGUoKSB0aGUgY29uc29sZSBudW1iZXIgKDApLCBwcmlvcml0eQorICogKDApLCBhbmQgdGhlIHN0cnVjdCBodl9vcHMgY29udGFpbmluZyB0aGUgcHV0X2NoYXJzKCkgZnVuY3Rpb24uICovCiBzdGF0aWMgaW50IF9faW5pdCBjb25zX2luaXQodm9pZCkKIHsKIAlpZiAoc3RyY21wKHBhcmF2aXJ0X29wcy5uYW1lLCAibGd1ZXN0IikgIT0gMCkKQEAgLTczLDIxICsxMjEsNDYgQEAKIH0KIGNvbnNvbGVfaW5pdGNhbGwoY29uc19pbml0KTsKIAorLypEOjM3MCBUbyBzZXQgdXAgYW5kIG1hbmFnZSBvdXIgdmlydHVhbCBjb25zb2xlLCB3ZSBjYWxsIGh2Y19hbGxvYygpIGFuZAorICogc3Rhc2ggdGhlIHJlc3VsdCBpbiB0aGUgcHJpdmF0ZSBwb2ludGVyIG9mIHRoZSAic3RydWN0IGxndWVzdF9kZXZpY2UiLgorICogU2luY2Ugd2UgbmV2ZXIgcmVtb3ZlIHRoZSBjb25zb2xlIGRldmljZSB3ZSBuZXZlciBuZWVkIHRoaXMgcG9pbnRlciBhZ2FpbiwKKyAqIGJ1dCB1c2luZyAtPnByaXZhdGUgaXMgY29uc2lkZXJlZCBnb29kIGZvcm0sIGFuZCB5b3UgbmV2ZXIga25vdyB3aG8ncyBnb2luZworICogdG8gY29weSB5b3VyIGRyaXZlci4KKyAqCisgKiBPbmNlIHRoZSBjb25zb2xlIGlzIHNldCB1cCwgd2UgYmluZCBvdXIgaW5wdXQgYnVmZmVyIHJlYWR5IGZvciBpbnB1dC4gKi8KIHN0YXRpYyBpbnQgbGd1ZXN0Y29uc19wcm9iZShzdHJ1Y3QgbGd1ZXN0X2RldmljZSAqbGdkZXYpCiB7CiAJaW50IGVycjsKIAorCS8qIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBodmNfYWxsb2MoKSBpcyB0aGUgdmlydHVhbCBjb25zb2xlIG51bWJlciwgc28KKwkgKiB3ZSB1c2UgemVyby4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGludGVycnVwdCBudW1iZXIuCisJICoKKwkgKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgYSAic3RydWN0IGh2X29wcyIgY29udGFpbmluZyB0aGUgcHV0X2NoYXJzKCkKKwkgKiBhbmQgZ2V0X2NoYXJzKCkgcG9pbnRlcnMuICBUaGUgZmluYWwgYXJndW1lbnQgaXMgdGhlIG91dHB1dCBidWZmZXIKKwkgKiBzaXplOiB3ZSB1c2UgMjU2IGFuZCBleHBlY3QgdGhlIEhvc3QgdG8gaGF2ZSByb29tIGZvciB1cyB0byBzZW5kCisJICogdGhhdCBtdWNoLiAqLwogCWxnZGV2LT5wcml2YXRlID0gaHZjX2FsbG9jKDAsIGxnZGV2X2lycShsZ2RldiksICZsZ3Vlc3RfY29ucywgMjU2KTsKIAlpZiAoSVNfRVJSKGxnZGV2LT5wcml2YXRlKSkKIAkJcmV0dXJuIFBUUl9FUlIobGdkZXYtPnByaXZhdGUpOwogCisJLyogV2UgYmluZCBhIHNpbmdsZSBETUEgYnVmZmVyIGF0IGtleSBMR1VFU1RfQ09OU09MRV9ETUFfS0VZLgorCSAqICJjb25zX2lucHV0IiBpcyB0aGF0IHN0YXRpY2FsbHktaW5pdGlhbGl6ZWQgZ2xvYmFsIERNQSBidWZmZXIgd2Ugc2F3CisJICogYWJvdmUsIGFuZCB3ZSBhbHNvIGdpdmUgdGhlIGludGVycnVwdCB3ZSB3YW50LiAqLwogCWVyciA9IGxndWVzdF9iaW5kX2RtYShMR1VFU1RfQ09OU09MRV9ETUFfS0VZLCAmY29uc19pbnB1dCwgMSwKIAkJCSAgICAgIGxnZGV2X2lycShsZ2RldikpOwogCWlmIChlcnIpCiAJCXByaW50aygibGd1ZXN0IGNvbnNvbGU6IGZhaWxlZCB0byBiaW5kIGJ1ZmZlci5cbiIpOwogCXJldHVybiBlcnI7CiB9CisvKiBOb3RlIHRoZSB1c2Ugb2YgbGdkZXZfaXJxKCkgZm9yIHRoZSBpbnRlcnJ1cHQgbnVtYmVyLiAgV2UgdGVsbCBodmNfYWxsb2MoKQorICogdG8gZXhwZWN0IGlucHV0IHdoZW4gdGhpcyBpbnRlcnJ1cHQgaXMgdHJpZ2dlcmVkLCBhbmQgdGhlbiB0ZWxsCisgKiBsZ3Vlc3RfYmluZF9kbWEoKSB0aGF0IGlzIHRoZSBpbnRlcnJ1cHQgdG8gc2VuZCB1cyB3aGVuIGlucHV0IGNvbWVzIGluLiAqLwogCisvKkQ6MzYwIEZyb20gbm93IG9uIHRoZSBjb25zb2xlIGRyaXZlciBmb2xsb3dzIHN0YW5kYXJkIEd1ZXN0IGRyaXZlciBmb3JtOgorICogcmVnaXN0ZXJfbGd1ZXN0X2RyaXZlcigpIHJlZ2lzdGVycyB0aGUgZGV2aWNlIHR5cGUgYW5kIHByb2JlIGZ1bmN0aW9uLCBhbmQKKyAqIHRoZSBwcm9iZSBmdW5jdGlvbiBzZXRzIHVwIHRoZSBkZXZpY2UuCisgKgorICogVGhlIHN0YW5kYXJkICJzdHJ1Y3QgbGd1ZXN0X2RyaXZlciI6ICovCiBzdGF0aWMgc3RydWN0IGxndWVzdF9kcml2ZXIgbGd1ZXN0Y29uc19kcnYgPSB7CiAJLm5hbWUgPSAibGd1ZXN0Y29ucyIsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC05NSw2ICsxNjgsNyBAQAogCS5wcm9iZSA9IGxndWVzdGNvbnNfcHJvYmUsCiB9OwogCisvKiBUaGUgc3RhbmRhcmQgaW5pdCBmdW5jdGlvbiAqLwogc3RhdGljIGludCBfX2luaXQgaHZjX2xndWVzdF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX2xndWVzdF9kcml2ZXIoJmxndWVzdGNvbnNfZHJ2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMgYi9kcml2ZXJzL2NoYXIvbW10aW1lci5jCmluZGV4IDZlNTVjZmIuLmU2MGE3NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMKKysrIGIvZHJpdmVycy9jaGFyL21tdGltZXIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbXRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21zcGVjLmMgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwppbmRleCBjNzE2ZWYwLi5jMDhhNDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXNwZWMuYworKysgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCAxNzI0YzQxLi45OGI2YjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpAQCAtOCw3ICs4LDcgQEAKIAlib29sICJFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gWDg2IHx8IE1JUFMgfHwgUFBDCisJZGVwZW5kcyBvbiBYODYgfHwgUFBDCiAJaGVscAogCSAgRURBQyBpcyBkZXNpZ25lZCB0byByZXBvcnQgZXJyb3JzIGluIHRoZSBjb3JlIHN5c3RlbS4KIAkgIFRoZXNlIGFyZSBsb3ctbGV2ZWwgZXJyb3JzIHRoYXQgYXJlIHJlcG9ydGVkIGluIHRoZSBDUFUgb3IKQEAgLTEyNiw3ICsxMjYsNyBAQAogY29uZmlnIEVEQUNfUEFTRU1JCiAJdHJpc3RhdGUgIlBBIFNlbWkgUFdSZmljaWVudCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kKLQlkZXBlbmRzIG9uIFBQQworCWRlcGVuZHMgb24gUFBDX1BBU0VNSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiBQQSBTZW1pCiAJICBQV1JmaWNpZW50LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKaW5kZXggNDQ3MWJlMy4uMDYzYTFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC0yMTQsNiArMjE0LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZGFjX21jX2ZyZWUpOwogCisKKy8qCisgKiBmaW5kX21jaV9ieV9kZXYKKyAqCisgKglzY2FuIGxpc3Qgb2YgY29udHJvbGxlcnMgbG9va2luZyBmb3IgdGhlIG9uZSB0aGF0IG1hbmFnZXMKKyAqCXRoZSAnZGV2JyBkZXZpY2UKKyAqLwogc3RhdGljIHN0cnVjdCBtZW1fY3RsX2luZm8gKmZpbmRfbWNpX2J5X2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwpAQCAtMjY4LDEyICsyNzUsNiBAQAogCWlmIChlZGFjX21jX2Fzc2VydF9lcnJvcl9jaGVja19hbmRfY2xlYXIoKSAmJiAobWNpLT5lZGFjX2NoZWNrICE9IE5VTEwpKQogCQltY2ktPmVkYWNfY2hlY2sobWNpKTsKIAotCS8qCi0JICogRklYTUU6IHRlbXAgcGxhY2UgaG9sZGVyIGZvciBQQ0kgY2hlY2tzLAotCSAqIGdvZXMgYXdheSB3aGVuIHdlIGJyZWFrIG91dCBQQ0kKLQkgKi8KLQllZGFjX3BjaV9kb19wYXJpdHlfY2hlY2soKTsKLQogCW11dGV4X3VubG9jaygmbWVtX2N0bHNfbXV0ZXgpOwogCiAJLyogUmVzY2hlZHVsZSAqLwpAQCAtMzE0LDM2ICszMTUsNTUgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0JLyogaWYgbm90IHJ1bm5pbmcgUE9MTCwgbGVhdmUgbm93ICovCi0JaWYgKG1jaS0+b3Bfc3RhdGUgPT0gT1BfUlVOTklOR19QT0xMKSB7Ci0JCXN0YXR1cyA9IGNhbmNlbF9kZWxheWVkX3dvcmsoJm1jaS0+d29yayk7Ci0JCWlmIChzdGF0dXMgPT0gMCkgewotCQkJZGVidWdmMCgiJXMoKSBub3QgY2FuY2VsZWQsIGZsdXNoIHRoZSBxdWV1ZVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJc3RhdHVzID0gY2FuY2VsX2RlbGF5ZWRfd29yaygmbWNpLT53b3JrKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJZGVidWdmMCgiJXMoKSBub3QgY2FuY2VsZWQsIGZsdXNoIHRoZSBxdWV1ZVxuIiwKKwkJCV9fZnVuY19fKTsKIAotCQkJLyogd29ya3EgaW5zdGFuY2UgbWlnaHQgYmUgcnVubmluZywgd2FpdCBmb3IgaXQgKi8KLQkJCWZsdXNoX3dvcmtxdWV1ZShlZGFjX3dvcmtxdWV1ZSk7Ci0JCX0KKwkJLyogd29ya3EgaW5zdGFuY2UgbWlnaHQgYmUgcnVubmluZywgd2FpdCBmb3IgaXQgKi8KKwkJZmx1c2hfd29ya3F1ZXVlKGVkYWNfd29ya3F1ZXVlKTsKIAl9CiB9CiAKIC8qCi0gKiBlZGFjX3Jlc2V0X2RlbGF5X3BlcmlvZAorICogZWRhY19tY19yZXNldF9kZWxheV9wZXJpb2QodW5zaWduZWQgbG9uZyB2YWx1ZSkKKyAqCisgKgl1c2VyIHNwYWNlIGhhcyB1cGRhdGVkIG91ciBwb2xsIHBlcmlvZCB2YWx1ZSwgbmVlZCB0bworICoJcmVzZXQgb3VyIHdvcmtxIGRlbGF5cwogICovCi1zdGF0aWMgdm9pZCBlZGFjX3Jlc2V0X2RlbGF5X3BlcmlvZChzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit2b2lkIGVkYWNfbWNfcmVzZXRfZGVsYXlfcGVyaW9kKGludCB2YWx1ZSkKIHsKLQkvKiBjYW5jZWwgdGhlIGN1cnJlbnQgd29ya3EgcmVxdWVzdCAqLwotCWVkYWNfbWNfd29ya3FfdGVhcmRvd24obWNpKTsKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKIAotCS8qIGxvY2sgdGhlIGxpc3Qgb2YgZGV2aWNlcyBmb3IgdGhlIG5ldyBzZXR1cCAqLwogCW11dGV4X2xvY2soJm1lbV9jdGxzX211dGV4KTsKIAotCS8qIHJlc3RhcnQgdGhlIHdvcmtxIHJlcXVlc3QsIHdpdGggbmV3IGRlbGF5IHZhbHVlICovCi0JZWRhY19tY193b3JrcV9zZXR1cChtY2ksIHZhbHVlKTsKKwkvKiBzY2FuIHRoZSBsaXN0IGFuZCB0dXJuIG9mZiBhbGwgd29ya3EgdGltZXJzLCBkb2luZyBzbyB1bmRlciBsb2NrCisJICovCisJbGlzdF9mb3JfZWFjaChpdGVtLCAmbWNfZGV2aWNlcykgeworCQltY2kgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBtZW1fY3RsX2luZm8sIGxpbmspOworCisJCWlmIChtY2ktPm9wX3N0YXRlID09IE9QX1JVTk5JTkdfUE9MTCkKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJm1jaS0+d29yayk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZtZW1fY3Rsc19tdXRleCk7CisKKworCS8qIHJlLXdhbGsgdGhlIGxpc3QsIGFuZCByZXNldCB0aGUgcG9sbCBkZWxheSAqLworCW11dGV4X2xvY2soJm1lbV9jdGxzX211dGV4KTsKKworCWxpc3RfZm9yX2VhY2goaXRlbSwgJm1jX2RldmljZXMpIHsKKwkJbWNpID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3QgbWVtX2N0bF9pbmZvLCBsaW5rKTsKKworCQllZGFjX21jX3dvcmtxX3NldHVwKG1jaSwgKHVuc2lnbmVkIGxvbmcpIHZhbHVlKTsKKwl9CiAKIAltdXRleF91bmxvY2soJm1lbV9jdGxzX211dGV4KTsKIH0KIAorCisKIC8qIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb24gZmFpbHVyZS4KICAqIEJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGNhbGxlciBtdXN0CiAgKiBhc3NpZ24gYSB1bmlxdWUgdmFsdWUgdG8gbWNpLT5tY19pZHguCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNfc3lzZnMuYwppbmRleCBjZDA5MGIwLi40YTA1NzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMKQEAgLTEyMiw2ICsxMjIsMjMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKKy8qCisgKiBtYyBwb2xsX21zZWMgdGltZSB2YWx1ZQorICovCitzdGF0aWMgc3NpemVfdCBwb2xsX21zZWNfaW50X3N0b3JlKHZvaWQgKnB0ciwgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJaW50ICp2YWx1ZSA9IChpbnQgKilwdHI7CisKKwlpZiAoaXNkaWdpdCgqYnVmZmVyKSkgeworCQkqdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDApOworCisJCS8qIG5vdGlmeSBlZGFjX21jIGVuZ2luZSB0byByZXNldCB0aGUgcG9sbCBwZXJpb2QgKi8KKwkJZWRhY19tY19yZXNldF9kZWxheV9wZXJpb2QoKnZhbHVlKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIAogLyogRURBQyBzeXNmcyBDU1JPVyBkYXRhIHN0cnVjdHVyZXMgYW5kIG1ldGhvZHMKICAqLwpAQCAtNzA0LDcgKzcyMSw3IEBACiAJU19JUlVHTyB8IFNfSVdVU1IsIG1lbWN0cmxfaW50X3Nob3csIG1lbWN0cmxfaW50X3N0b3JlKTsKIAogTUVNQ1RSTF9BVFRSKGVkYWNfbWNfcG9sbF9tc2VjLAotCVNfSVJVR08gfCBTX0lXVVNSLCBtZW1jdHJsX2ludF9zaG93LCBtZW1jdHJsX2ludF9zdG9yZSk7CisJU19JUlVHTyB8IFNfSVdVU1IsIG1lbWN0cmxfaW50X3Nob3csIHBvbGxfbXNlY19pbnRfc3RvcmUpOwogCiAvKiBCYXNlIEF0dHJpYnV0ZXMgb2YgdGhlIG1lbW9yeSBFQ0Mgb2JqZWN0ICovCiBzdGF0aWMgc3RydWN0IG1lbWN0cmxfZGV2X2F0dHJpYnV0ZSAqbWVtY3RybF9hdHRyW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tb2R1bGUuaCBiL2RyaXZlcnMvZWRhYy9lZGFjX21vZHVsZS5oCmluZGV4IGEyMTM0ZGYuLmNiYzQxOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21vZHVsZS5oCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21vZHVsZS5oCkBAIC01Miw2ICs1Miw4IEBACiBleHRlcm4gdm9pZCBlZGFjX2RldmljZV93b3JrcV90ZWFyZG93bihzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8gKmVkYWNfZGV2KTsKIGV4dGVybiB2b2lkIGVkYWNfZGV2aWNlX3Jlc2V0X2RlbGF5X3BlcmlvZChzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8KIAkJCQkJICAgKmVkYWNfZGV2LCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKK2V4dGVybiB2b2lkIGVkYWNfbWNfcmVzZXRfZGVsYXlfcGVyaW9kKGludCB2YWx1ZSk7CisKIGV4dGVybiB2b2lkICplZGFjX2FsaWduX3B0cih2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpOwogCiAvKgpAQCAtNjQsNiArNjYsMTAgQEAKIGV4dGVybiB2b2lkIGVkYWNfc3lzZnNfcGNpX3RlYXJkb3duKHZvaWQpOwogZXh0ZXJuIGludCBlZGFjX3BjaV9nZXRfY2hlY2tfZXJyb3JzKHZvaWQpOwogZXh0ZXJuIGludCBlZGFjX3BjaV9nZXRfcG9sbF9tc2VjKHZvaWQpOworZXh0ZXJuIHZvaWQgZWRhY19wY2lfcmVtb3ZlX3N5c2ZzKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpKTsKK2V4dGVybiB2b2lkIGVkYWNfcGNpX2hhbmRsZV9wZShzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSwgY29uc3QgY2hhciAqbXNnKTsKK2V4dGVybiB2b2lkIGVkYWNfcGNpX2hhbmRsZV9ucGUoc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICpwY2ksCisJCQkJY29uc3QgY2hhciAqbXNnKTsKICNlbHNlCQkJCS8qIENPTkZJR19QQ0kgKi8KIC8qIHByZS1wcm9jZXNzIHRoZXNlIGF3YXkgKi8KICNkZWZpbmUgZWRhY19wY2lfZG9fcGFyaXR5X2NoZWNrKCkKQEAgLTcyLDYgKzc4LDggQEAKICNkZWZpbmUgZWRhY19zeXNmc19wY2lfdGVhcmRvd24oKQogI2RlZmluZSBlZGFjX3BjaV9nZXRfY2hlY2tfZXJyb3JzKCkKICNkZWZpbmUgZWRhY19wY2lfZ2V0X3BvbGxfbXNlYygpCisjZGVmaW5lIGVkYWNfcGNpX2hhbmRsZV9wZSgpCisjZGVmaW5lIGVkYWNfcGNpX2hhbmRsZV9ucGUoKQogI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KIAogI2VuZGlmCQkJCS8qIF9fRURBQ19NT0RVTEVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCmluZGV4IGQ5Y2Q1ZTAuLjVkZWU5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCkBAIC0zMSwyMCArMzEsMTIgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoZWRhY19wY2lfY3Rsc19tdXRleCk7CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBlZGFjX3BjaV9saXN0ID0gTElTVF9IRUFEX0lOSVQoZWRhY19wY2lfbGlzdCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlZGFjX2xvY2tfcGNpX2xpc3Qodm9pZCkKLXsKLQltdXRleF9sb2NrKCZlZGFjX3BjaV9jdGxzX211dGV4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVkYWNfdW5sb2NrX3BjaV9saXN0KHZvaWQpCi17Ci0JbXV0ZXhfdW5sb2NrKCZlZGFjX3BjaV9jdGxzX211dGV4KTsKLX0KLQogLyoKLSAqIFRoZSBhbGxvYygpIGFuZCBmcmVlKCkgZnVuY3Rpb25zIGZvciB0aGUgJ2VkYWNfcGNpJyBjb250cm9sIGluZm8KLSAqIHN0cnVjdHVyZS4gVGhlIGNoaXAgZHJpdmVyIHdpbGwgYWxsb2NhdGUgb25lIG9mIHRoZXNlIGZvciBlYWNoCi0gKiBlZGFjX3BjaSBpdCBpcyBnb2luZyB0byBjb250cm9sL3JlZ2lzdGVyIHdpdGggdGhlIEVEQUMgQ09SRS4KKyAqIGVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvCisgKgorICoJVGhlIGFsbG9jKCkgZnVuY3Rpb24gZm9yIHRoZSAnZWRhY19wY2knIGNvbnRyb2wgaW5mbworICoJc3RydWN0dXJlLiBUaGUgY2hpcCBkcml2ZXIgd2lsbCBhbGxvY2F0ZSBvbmUgb2YgdGhlc2UgZm9yIGVhY2gKKyAqCWVkYWNfcGNpIGl0IGlzIGdvaW5nIHRvIGNvbnRyb2wvcmVnaXN0ZXIgd2l0aCB0aGUgRURBQyBDT1JFLgogICovCiBzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKmVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvKHVuc2lnbmVkIGludCBzel9wdnQsCiAJCQkJCQljb25zdCBjaGFyICplZGFjX3BjaV9uYW1lKQpAQCAtNTMsNDcgKzQ1LDU5IEBACiAJdm9pZCAqcHZ0OwogCXVuc2lnbmVkIGludCBzaXplOwogCisJZGVidWdmMSgiJXMoKVxuIiwgX19mdW5jX18pOworCiAJcGNpID0gKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqKTA7CiAJcHZ0ID0gZWRhY19hbGlnbl9wdHIoJnBjaVsxXSwgc3pfcHZ0KTsKIAlzaXplID0gKCh1bnNpZ25lZCBsb25nKXB2dCkgKyBzel9wdnQ7CiAKLQlpZiAoKHBjaSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJLyogQWxsb2MgdGhlIG5lZWRlZCBjb250cm9sIHN0cnVjdCBtZW1vcnkgKi8KKwlwY2kgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChwY2kgID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCisJLyogTm93IG11Y2ggcHJpdmF0ZSBzcGFjZSAqLwogCXB2dCA9IHN6X3B2dCA/ICgoY2hhciAqKXBjaSkgKyAoKHVuc2lnbmVkIGxvbmcpcHZ0KSA6IE5VTEw7CiAKIAlwY2ktPnB2dF9pbmZvID0gcHZ0OwotCiAJcGNpLT5vcF9zdGF0ZSA9IE9QX0FMTE9DOwogCiAJc25wcmludGYocGNpLT5uYW1lLCBzdHJsZW4oZWRhY19wY2lfbmFtZSkgKyAxLCAiJXMiLCBlZGFjX3BjaV9uYW1lKTsKIAogCXJldHVybiBwY2k7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvKTsKIAogLyoKICAqIGVkYWNfcGNpX2ZyZWVfY3RsX2luZm8oKQotICogCWZyZWVzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvKCkgZnVuY3Rpb24KKyAqCisgKglMYXN0IGFjdGlvbiBvbiB0aGUgcGNpIGNvbnRyb2wgc3RydWN0dXJlLgorICoKKyAqCWNhbGwgdGhlIHJlbW92ZSBzeXNmcyBpbmZvcm1hdG9uLCB3aGljaCB3aWxsIHVucmVnaXN0ZXIKKyAqCXRoaXMgY29udHJvbCBzdHJ1Y3QncyBrb2JqLiBXaGVuIHRoYXQga29iaidzIHJlZiBjb3VudAorICoJZ29lcyB0byB6ZXJvLCBpdHMgcmVsZWFzZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGwgYW5kIHRoZW4KKyAqCWtmcmVlKCkgdGhlIG1lbW9yeS4KICAqLwogdm9pZCBlZGFjX3BjaV9mcmVlX2N0bF9pbmZvKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpKQogewotCWtmcmVlKHBjaSk7Ci19CisJZGVidWdmMSgiJXMoKVxuIiwgX19mdW5jX18pOwogCisJZWRhY19wY2lfcmVtb3ZlX3N5c2ZzKHBjaSk7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChlZGFjX3BjaV9mcmVlX2N0bF9pbmZvKTsKIAogLyoKICAqIGZpbmRfZWRhY19wY2lfYnlfZGV2KCkKICAqIAlzY2FucyB0aGUgZWRhY19wY2kgbGlzdCBmb3IgYSBzcGVjaWZpYyAnc3RydWN0IGRldmljZSAqJworICoKKyAqCXJldHVybiBOVUxMIGlmIG5vdCBmb3VuZCwgb3IgcmV0dXJuIGNvbnRyb2wgc3RydWN0IHBvaW50ZXIKICAqLwogc3RhdGljIHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqZmluZF9lZGFjX3BjaV9ieV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpOwogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CiAKLQlkZWJ1Z2YzKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisJZGVidWdmMSgiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJbGlzdF9mb3JfZWFjaChpdGVtLCAmZWRhY19wY2lfbGlzdCkgewogCQlwY2kgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbywgbGluayk7CkBAIC0xMTgsMTAgKzEyMiwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sICppbnNlcnRfYmVmb3JlOwogCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcm92ZXI7CiAKKwlkZWJ1Z2YxKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKIAlpbnNlcnRfYmVmb3JlID0gJmVkYWNfcGNpX2xpc3Q7CiAKIAkvKiBEZXRlcm1pbmUgaWYgYWxyZWFkeSBvbiB0aGUgbGlzdCAqLwotCWlmICh1bmxpa2VseSgocm92ZXIgPSBmaW5kX2VkYWNfcGNpX2J5X2RldihwY2ktPmRldikpICE9IE5VTEwpKQorCXJvdmVyID0gZmluZF9lZGFjX3BjaV9ieV9kZXYocGNpLT5kZXYpOworCWlmICh1bmxpa2VseShyb3ZlciAhPSBOVUxMKSkKIAkJZ290byBmYWlsMDsKIAogCS8qIEluc2VydCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgJ3BjaV9pZHgnLCBzbyBmaW5kIHBvc2l0aW9uICovCkBAIC0xNTcsNiArMTY0LDggQEAKIAogLyoKICAqIGNvbXBsZXRlX2VkYWNfcGNpX2xpc3RfZGVsCisgKgorICoJUkNVIGNvbXBsZXRpb24gY2FsbGJhY2sgdG8gaW5kaWNhdGUgaXRlbSBpcyBkZWxldGVkCiAgKi8KIHN0YXRpYyB2b2lkIGNvbXBsZXRlX2VkYWNfcGNpX2xpc3RfZGVsKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKQEAgLTE2OSw2ICsxNzgsOCBAQAogCiAvKgogICogZGVsX2VkYWNfcGNpX2Zyb21fZ2xvYmFsX2xpc3QKKyAqCisgKglyZW1vdmUgdGhlIFBDSSBjb250cm9sIHN0cnVjdCBmcm9tIHRoZSBnbG9iYWwgbGlzdAogICovCiBzdGF0aWMgdm9pZCBkZWxfZWRhY19wY2lfZnJvbV9nbG9iYWxfbGlzdChzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKIHsKQEAgLTIwNywzNSArMjE4LDUyIEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoZWRhY19wY2lfZmluZCk7CiAKIC8qCiAgKiBlZGFjX3BjaV93b3JrcV9mdW5jdGlvbigpCi0gKiAJcGVyZm9ybXMgdGhlIG9wZXJhdGlvbiBzY2hlZHVsZWQgYnkgYSB3b3JrcSByZXF1ZXN0CisgKgorICogCXBlcmlvZGljIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIG9wZXJhdGlvbgorICoJc2NoZWR1bGVkIGJ5IGEgd29ya3EgcmVxdWVzdCwgZm9yIGEgZ2l2ZW4gUENJIGNvbnRyb2wgc3RydWN0CiAgKi8KIHN0YXRpYyB2b2lkIGVkYWNfcGNpX3dvcmtxX2Z1bmN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19yZXEpCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZF93b3JrID0gKHN0cnVjdCBkZWxheWVkX3dvcmsgKil3b3JrX3JlcTsKIAlzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSA9IHRvX2VkYWNfcGNpX2N0bF93b3JrKGRfd29yayk7CisJaW50IG1zZWM7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKIAotCWVkYWNfbG9ja19wY2lfbGlzdCgpOworCWRlYnVnZjMoIiVzKCkgY2hlY2tpbmdcbiIsIF9fZnVuY19fKTsKIAotCWlmICgocGNpLT5vcF9zdGF0ZSA9PSBPUF9SVU5OSU5HX1BPTEwpICYmCi0JCShwY2ktPmVkYWNfY2hlY2sgIT0gTlVMTCkgJiYgKGVkYWNfcGNpX2dldF9jaGVja19lcnJvcnMoKSkpCi0JCXBjaS0+ZWRhY19jaGVjayhwY2kpOworCW11dGV4X2xvY2soJmVkYWNfcGNpX2N0bHNfbXV0ZXgpOwogCi0JZWRhY191bmxvY2tfcGNpX2xpc3QoKTsKKwlpZiAocGNpLT5vcF9zdGF0ZSA9PSBPUF9SVU5OSU5HX1BPTEwpIHsKKwkJLyogd2UgbWlnaHQgYmUgaW4gUE9MTCBtb2RlLCBidXQgdGhlcmUgbWF5IE5PVCBiZSBhIHBvbGwgZnVuYworCQkgKi8KKwkJaWYgKChwY2ktPmVkYWNfY2hlY2sgIT0gTlVMTCkgJiYgZWRhY19wY2lfZ2V0X2NoZWNrX2Vycm9ycygpKQorCQkJcGNpLT5lZGFjX2NoZWNrKHBjaSk7CiAKLQkvKiBSZXNjaGVkdWxlICovCi0JcXVldWVfZGVsYXllZF93b3JrKGVkYWNfd29ya3F1ZXVlLCAmcGNpLT53b3JrLAotCQkJbXNlY3NfdG9famlmZmllcyhlZGFjX3BjaV9nZXRfcG9sbF9tc2VjKCkpKTsKKwkJLyogaWYgd2UgYXJlIG9uIGEgb25lIHNlY29uZCBwZXJpb2QsIHRoZW4gdXNlIHJvdW5kICovCisJCW1zZWMgPSBlZGFjX3BjaV9nZXRfcG9sbF9tc2VjKCk7CisJCWlmIChtc2VjID09IDEwMDApCisJCQlkZWxheSA9IHJvdW5kX2ppZmZpZXMobXNlY3NfdG9famlmZmllcyhtc2VjKSk7CisJCWVsc2UKKwkJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyhtc2VjKTsKKworCQkvKiBSZXNjaGVkdWxlIG9ubHkgaWYgd2UgYXJlIGluIFBPTEwgbW9kZSAqLworCQlxdWV1ZV9kZWxheWVkX3dvcmsoZWRhY193b3JrcXVldWUsICZwY2ktPndvcmssIGRlbGF5KTsKKwl9CisKKwltdXRleF91bmxvY2soJmVkYWNfcGNpX2N0bHNfbXV0ZXgpOwogfQogCiAvKgogICogZWRhY19wY2lfd29ya3Ffc2V0dXAoKQogICogCWluaXRpYWxpemUgYSB3b3JrcSBpdGVtIGZvciB0aGlzIGVkYWNfcGNpIGluc3RhbmNlCiAgKiAJcGFzc2luZyBpbiB0aGUgbmV3IGRlbGF5IHBlcmlvZCBpbiBtc2VjCisgKgorICoJbG9ja2luZyBtb2RlbDoKKyAqCQljYWxsZWQgd2hlbiAnZWRhY19wY2lfY3Rsc19tdXRleCcgaXMgbG9ja2VkCiAgKi8KIHN0YXRpYyB2b2lkIGVkYWNfcGNpX3dvcmtxX3NldHVwKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpLAogCQkJCSB1bnNpZ25lZCBpbnQgbXNlYykKQEAgLTI1NSw2ICsyODMsOCBAQAogewogCWludCBzdGF0dXM7CiAKKwlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKIAlzdGF0dXMgPSBjYW5jZWxfZGVsYXllZF93b3JrKCZwY2ktPndvcmspOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJZmx1c2hfd29ya3F1ZXVlKGVkYWNfd29ya3F1ZXVlKTsKQEAgLTI2MiwxOSArMjkyLDI1IEBACiAKIC8qCiAgKiBlZGFjX3BjaV9yZXNldF9kZWxheV9wZXJpb2QKKyAqCisgKgljYWxsZWQgd2l0aCBhIG5ldyBwZXJpb2QgdmFsdWUgZm9yIHRoZSB3b3JrcSBwZXJpb2QKKyAqCWEpIHN0b3AgY3VycmVudCB3b3JrcSB0aW1lcgorICoJYikgcmVzdGFydCB3b3JrcSB0aW1lciB3aXRoIG5ldyB2YWx1ZQogICovCiB2b2lkIGVkYWNfcGNpX3Jlc2V0X2RlbGF5X3BlcmlvZChzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSwKIAkJCQkgdW5zaWduZWQgbG9uZyB2YWx1ZSkKIHsKLQllZGFjX2xvY2tfcGNpX2xpc3QoKTsKKwlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAllZGFjX3BjaV93b3JrcV90ZWFyZG93bihwY2kpOwogCisJLyogbmVlZCB0byBsb2NrIGZvciB0aGUgc2V0dXAgKi8KKwltdXRleF9sb2NrKCZlZGFjX3BjaV9jdGxzX211dGV4KTsKKwogCWVkYWNfcGNpX3dvcmtxX3NldHVwKHBjaSwgdmFsdWUpOwogCi0JZWRhY191bmxvY2tfcGNpX2xpc3QoKTsKKwltdXRleF91bmxvY2soJmVkYWNfcGNpX2N0bHNfbXV0ZXgpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChlZGFjX3BjaV9yZXNldF9kZWxheV9wZXJpb2QpOwogCiAvKgpAQCAtMjk0LDE0ICszMzAsMTMgQEAKIAlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAlwY2ktPnBjaV9pZHggPSBlZGFjX2lkeDsKKwlwY2ktPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCi0JZWRhY19sb2NrX3BjaV9saXN0KCk7CisJbXV0ZXhfbG9jaygmZWRhY19wY2lfY3Rsc19tdXRleCk7CiAKIAlpZiAoYWRkX2VkYWNfcGNpX3RvX2dsb2JhbF9saXN0KHBjaSkpCiAJCWdvdG8gZmFpbDA7CiAKLQlwY2ktPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCiAJaWYgKGVkYWNfcGNpX2NyZWF0ZV9zeXNmcyhwY2kpKSB7CiAJCWVkYWNfcGNpX3ByaW50ayhwY2ksIEtFUk5fV0FSTklORywKIAkJCQkiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBwY2lcbiIpOwpAQCAtMzIzLDE2ICszNTgsMTYgQEAKIAkJCXBjaS0+Y3RsX25hbWUsCiAJCQlkZXZfbmFtZShwY2kpLCBlZGFjX29wX3N0YXRlX3RvX3N0cmluZyhwY2ktPm9wX3N0YXRlKSk7CiAKLQllZGFjX3VubG9ja19wY2lfbGlzdCgpOworCW11dGV4X3VubG9jaygmZWRhY19wY2lfY3Rsc19tdXRleCk7CiAJcmV0dXJuIDA7CiAKKwkvKiBlcnJvciB1bndpbmQgc3RhY2sgKi8KIGZhaWwxOgogCWRlbF9lZGFjX3BjaV9mcm9tX2dsb2JhbF9saXN0KHBjaSk7CiBmYWlsMDoKLQllZGFjX3VubG9ja19wY2lfbGlzdCgpOworCW11dGV4X3VubG9jaygmZWRhY19wY2lfY3Rsc19tdXRleCk7CiAJcmV0dXJuIDE7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGVkYWNfcGNpX2FkZF9kZXZpY2UpOwogCiAvKgpAQCAtMzU0LDIyICszODksMjUgQEAKIAogCWRlYnVnZjAoIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWVkYWNfbG9ja19wY2lfbGlzdCgpOworCW11dGV4X2xvY2soJmVkYWNfcGNpX2N0bHNfbXV0ZXgpOwogCi0JaWYgKChwY2kgPSBmaW5kX2VkYWNfcGNpX2J5X2RldihkZXYpKSA9PSBOVUxMKSB7Ci0JCWVkYWNfdW5sb2NrX3BjaV9saXN0KCk7CisJLyogZW5zdXJlIHRoZSBjb250cm9sIHN0cnVjdCBpcyBvbiB0aGUgZ2xvYmFsIGxpc3QKKwkgKiBpZiBub3QsIHRoZW4gbGVhdmUKKwkgKi8KKwlwY2kgPSBmaW5kX2VkYWNfcGNpX2J5X2RldihkZXYpOworCWlmIChwY2kgID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlZGFjX3BjaV9jdGxzX211dGV4KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcGNpLT5vcF9zdGF0ZSA9IE9QX09GRkxJTkU7CiAKLQllZGFjX3BjaV93b3JrcV90ZWFyZG93bihwY2kpOwotCi0JZWRhY19wY2lfcmVtb3ZlX3N5c2ZzKHBjaSk7Ci0KIAlkZWxfZWRhY19wY2lfZnJvbV9nbG9iYWxfbGlzdChwY2kpOwogCi0JZWRhY191bmxvY2tfcGNpX2xpc3QoKTsKKwltdXRleF91bmxvY2soJmVkYWNfcGNpX2N0bHNfbXV0ZXgpOworCisJLyogc3RvcCB0aGUgd29ya3EgdGltZXIgKi8KKwllZGFjX3BjaV93b3JrcV90ZWFyZG93bihwY2kpOwogCiAJZWRhY19wcmludGsoS0VSTl9JTkZPLCBFREFDX1BDSSwKIAkJIlJlbW92ZWQgZGV2aWNlICVkIGZvciAlcyAlczogREVWICVzXG4iLApAQCAtMzc3LDE0ICs0MTUsMjAgQEAKIAogCXJldHVybiBwY2k7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGVkYWNfcGNpX2RlbF9kZXZpY2UpOwogCisvKgorICogZWRhY19wY2lfZ2VuZXJpY19jaGVjaworICoKKyAqCWEgR2VuZXJpYyBwYXJpdHkgY2hlY2sgQVBJCisgKi8KIHZvaWQgZWRhY19wY2lfZ2VuZXJpY19jaGVjayhzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKIHsKKwlkZWJ1Z2Y0KCIlcygpXG4iLCBfX2Z1bmNfXyk7CiAJZWRhY19wY2lfZG9fcGFyaXR5X2NoZWNrKCk7CiB9CiAKKy8qIGZyZWUgcnVubmluZyBpbnN0YW5jZSBpbmRleCBjb3VudGVyICovCiBzdGF0aWMgaW50IGVkYWNfcGNpX2lkeDsKICNkZWZpbmUgRURBQ19QQ0lfR0VOQ1RMX05BTUUJIkVEQUMgUENJIGNvbnRyb2xsZXIiCiAKQEAgLTM5Miw2ICs0MzYsMTcgQEAKIAlpbnQgZWRhY19pZHg7CiB9OwogCisvKgorICogZWRhY19wY2lfY3JlYXRlX2dlbmVyaWNfY3RsCisgKgorICoJQSBnZW5lcmljIGNvbnN0cnVjdG9yIGZvciBhIFBDSSBwYXJpdHkgcG9sbGluZyBkZXZpY2UKKyAqCVNvbWUgc3lzdGVtcyBoYXZlIG1vcmUgdGhhbiBvbmUgZG9tYWluIG9mIFBDSSBidXNzZXMuCisgKglGb3Igc3lzdGVtcyB3aXRoIG9uZSBkb21haW4sIHRoZW4gdGhpcyBBUEkgd2lsbAorICoJcHJvdmlkZSBmb3IgYSBnZW5lcmljIHBvbGxlci4KKyAqCisgKglUaGlzIHJvdXRpbmUgY2FsbHMgdGhlIGVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvKCkgZm9yCisgKgl0aGUgZ2VuZXJpYyBkZXZpY2UsIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAqLwogc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICplZGFjX3BjaV9jcmVhdGVfZ2VuZXJpY19jdGwoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkJY29uc3QgY2hhciAqbW9kX25hbWUpCiB7CkBAIC00MjEsMTMgKzQ3NiwxOCBAQAogCiAJcmV0dXJuIHBjaTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoZWRhY19wY2lfY3JlYXRlX2dlbmVyaWNfY3RsKTsKIAorLyoKKyAqIGVkYWNfcGNpX3JlbGVhc2VfZ2VuZXJpY19jdGwKKyAqCisgKglUaGUgcmVsZWFzZSBmdW5jdGlvbiBvZiBhIGdlbmVyaWMgRURBQyBQQ0kgcG9sbGluZyBkZXZpY2UKKyAqLwogdm9pZCBlZGFjX3BjaV9yZWxlYXNlX2dlbmVyaWNfY3RsKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpKQogeworCWRlYnVnZjAoIiVzKCkgcGNpIG1vZD0lc1xuIiwgX19mdW5jX18sIHBjaS0+bW9kX25hbWUpOworCiAJZWRhY19wY2lfZGVsX2RldmljZShwY2ktPmRldik7CiAJZWRhY19wY2lfZnJlZV9jdGxfaW5mbyhwY2kpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChlZGFjX3BjaV9yZWxlYXNlX2dlbmVyaWNfY3RsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKaW5kZXggZmFjOTRjYS4uNjlmNWRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKQEAgLTEzLDIyICsxMywyNSBAQAogI2luY2x1ZGUgImVkYWNfY29yZS5oIgogI2luY2x1ZGUgImVkYWNfbW9kdWxlLmgiCiAKKy8qIFR1cm4gb2ZmIHRoaXMgd2hvbGUgZmVhdHVyZSBpZiBQQ0kgaXMgbm90IGNvbmZpZ3VyZWQgKi8KICNpZmRlZiBDT05GSUdfUENJCiAKICNkZWZpbmUgRURBQ19QQ0lfU1lNTElOSwkiZGV2aWNlIgogCi1zdGF0aWMgaW50IGNoZWNrX3BjaV9lcnJvcnM7CS8qIGRlZmF1bHQgWUVTIGNoZWNrIFBDSSBwYXJpdHkgKi8KLXN0YXRpYyBpbnQgZWRhY19wY2lfcGFuaWNfb25fcGU7CS8qIGRlZmF1bHQgbm8gcGFuaWMgb24gUENJIFBhcml0eSAqLwotc3RhdGljIGludCBlZGFjX3BjaV9sb2dfcGUgPSAxOwkvKiBsb2cgUENJIHBhcml0eSBlcnJvcnMgKi8KKy8qIGRhdGEgdmFyaWFibGVzIGV4cG9ydGVkIHZpYSBzeXNmcyAqLworc3RhdGljIGludCBjaGVja19wY2lfZXJyb3JzOwkJLyogZGVmYXVsdCBOTyBjaGVjayBQQ0kgcGFyaXR5ICovCitzdGF0aWMgaW50IGVkYWNfcGNpX3BhbmljX29uX3BlOwkvKiBkZWZhdWx0IE5PIHBhbmljIG9uIFBDSSBQYXJpdHkgKi8KK3N0YXRpYyBpbnQgZWRhY19wY2lfbG9nX3BlID0gMTsJCS8qIGxvZyBQQ0kgcGFyaXR5IGVycm9ycyAqLwogc3RhdGljIGludCBlZGFjX3BjaV9sb2dfbnBlID0gMTsJLyogbG9nIFBDSSBub24tcGFyaXR5IGVycm9yIGVycm9ycyAqLworc3RhdGljIGludCBlZGFjX3BjaV9wb2xsX21zZWMgPSAxMDAwOwkvKiBvbmUgc2Vjb25kIHdvcmtxIHBlcmlvZCAqLworCiBzdGF0aWMgYXRvbWljX3QgcGNpX3Bhcml0eV9jb3VudCA9IEFUT01JQ19JTklUKDApOwogc3RhdGljIGF0b21pY190IHBjaV9ub25wYXJpdHlfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBpbnQgZWRhY19wY2lfcG9sbF9tc2VjID0gMTAwMDsKIAotc3RhdGljIHN0cnVjdCBrb2JqZWN0IGVkYWNfcGNpX2tvYmo7CS8qIC9zeXMvZGV2aWNlcy9zeXN0ZW0vZWRhYy9wY2kgKi8KLXN0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiBlZGFjX3BjaV9rb2JqX2NvbXBsZXRlOworc3RhdGljIHN0cnVjdCBrb2JqZWN0IGVkYWNfcGNpX3RvcF9tYWluX2tvYmo7CiBzdGF0aWMgYXRvbWljX3QgZWRhY19wY2lfc3lzZnNfcmVmY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKIAorLyogZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGRhdGEgdmFyaWFibGVzICovCiBpbnQgZWRhY19wY2lfZ2V0X2NoZWNrX2Vycm9ycyh2b2lkKQogewogCXJldHVybiBjaGVja19wY2lfZXJyb3JzOwpAQCAtNzQsMTcgKzc3LDIyIEBACiB7CiAJc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICpwY2k7CiAKLQlkZWJ1Z2YxKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisJZGVidWdmMCgiJXMoKVxuIiwgX19mdW5jX18pOwogCisJLyogRm9ybSBwb2ludGVyIHRvIGNvbnRhaW5pbmcgc3RydWN0LCB0aGUgcGNpIGNvbnRyb2wgc3RydWN0ICovCiAJcGNpID0gdG9faW5zdGFuY2Uoa29iaik7Ci0JY29tcGxldGUoJnBjaS0+a29ial9jb21wbGV0ZSk7CisKKwkvKiBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IG9uIHRvcCBtYWluIGtvYmogKi8KKwlrb2JqZWN0X3B1dCgmZWRhY19wY2lfdG9wX21haW5fa29iaik7CisKKwlrZnJlZShwY2kpOwkvKiBGcmVlIHRoZSBjb250cm9sIHN0cnVjdCAqLwogfQogCiAvKiBpbnN0YW5jZSBzcGVjaWZpYyBhdHRyaWJ1dGUgc3RydWN0dXJlICovCiBzdHJ1Y3QgaW5zdGFuY2VfYXR0cmlidXRlIHsKIAlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0JIHNzaXplX3QoKnNob3cpIChzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKiwgY2hhciAqKTsKLQkgc3NpemVfdCgqc3RvcmUpIChzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworCXNzaXplX3QoKnNob3cpIChzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKiwgY2hhciAqKTsKKwlzc2l6ZV90KCpzdG9yZSkgKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiB9OwogCiAvKiBGdW5jdGlvbiB0byAnc2hvdycgZmllbGRzIGZyb20gdGhlIGVkYWNfcGNpICdpbnN0YW5jZScgc3RydWN0dXJlICovCkBAIC0xMTIsNiArMTIwLDcgQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorLyogZnNfb3BzIHRhYmxlICovCiBzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBwY2lfaW5zdGFuY2Vfb3BzID0gewogCS5zaG93ID0gZWRhY19wY2lfaW5zdGFuY2Vfc2hvdywKIAkuc3RvcmUgPSBlZGFjX3BjaV9pbnN0YW5jZV9zdG9yZQpAQCAtMTM0LDQ4ICsxNDMsODIgQEAKIAlOVUxMCiB9OwogCi0vKiB0aGUga3R5cGUgZm9yIHBjaSBpbnN0YW5jZSAqLworLyogdGhlIGt0eXBlIGZvciBhIHBjaSBpbnN0YW5jZSAqLwogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfcGNpX2luc3RhbmNlID0gewogCS5yZWxlYXNlID0gZWRhY19wY2lfaW5zdGFuY2VfcmVsZWFzZSwKIAkuc3lzZnNfb3BzID0gJnBjaV9pbnN0YW5jZV9vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSAoc3RydWN0IGF0dHJpYnV0ZSAqKilwY2lfaW5zdGFuY2VfYXR0ciwKIH07CiAKKy8qCisgKiBlZGFjX3BjaV9jcmVhdGVfaW5zdGFuY2Vfa29iagorICoKKyAqCWNvbnN0cnVjdCBvbmUgRURBQyBQQ0kgaW5zdGFuY2UncyBrb2JqZWN0IGZvciB1c2UKKyAqLwogc3RhdGljIGludCBlZGFjX3BjaV9jcmVhdGVfaW5zdGFuY2Vfa29iaihzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSwgaW50IGlkeCkKIHsKKwlzdHJ1Y3Qga29iamVjdCAqbWFpbl9rb2JqOwogCWludCBlcnI7CiAKLQlwY2ktPmtvYmoucGFyZW50ID0gJmVkYWNfcGNpX2tvYmo7CisJZGVidWdmMCgiJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogU2V0IHRoZSBwYXJlbnQgYW5kIHRoZSBpbnN0YW5jZSdzIGt0eXBlICovCisJcGNpLT5rb2JqLnBhcmVudCA9ICZlZGFjX3BjaV90b3BfbWFpbl9rb2JqOwogCXBjaS0+a29iai5rdHlwZSA9ICZrdHlwZV9wY2lfaW5zdGFuY2U7CiAKIAllcnIgPSBrb2JqZWN0X3NldF9uYW1lKCZwY2ktPmtvYmosICJwY2klZCIsIGlkeCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCS8qIEZpcnN0IGJ1bXAgdGhlIHJlZiBjb3VudCBvbiB0aGUgdG9wIG1haW4ga29iaiwgd2hpY2ggd2lsbAorCSAqIHRyYWNrIHRoZSBudW1iZXIgb2YgUENJIGluc3RhbmNlcyB3ZSBoYXZlLCBhbmQgdGh1cyBuZXN0CisJICogcHJvcGVybHkgb24ga2VlcGluZyB0aGUgbW9kdWxlIGxvYWRlZAorCSAqLworCW1haW5fa29iaiA9IGtvYmplY3RfZ2V0KCZlZGFjX3BjaV90b3BfbWFpbl9rb2JqKTsKKwlpZiAoIW1haW5fa29iaikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwkvKiBBbmQgbm93IHJlZ2lzdGVyIHRoaXMgbmV3IGtvYmplY3QgdW5kZXIgdGhlIG1haW4ga29iaiAqLwogCWVyciA9IGtvYmplY3RfcmVnaXN0ZXIoJnBjaS0+a29iaik7CiAJaWYgKGVyciAhPSAwKSB7CiAJCWRlYnVnZjIoIiVzKCkgZmFpbGVkIHRvIHJlZ2lzdGVyIGluc3RhbmNlIHBjaSVkXG4iLAogCQkJX19mdW5jX18sIGlkeCk7Ci0JCXJldHVybiBlcnI7CisJCWtvYmplY3RfcHV0KCZlZGFjX3BjaV90b3BfbWFpbl9rb2JqKTsKKwkJZ290byBlcnJvcl9vdXQ7CiAJfQogCiAJZGVidWdmMSgiJXMoKSBSZWdpc3RlciBpbnN0YW5jZSAncGNpJWQnIGtvYmplY3RcbiIsIF9fZnVuY19fLCBpZHgpOwogCiAJcmV0dXJuIDA7CisKKwkvKiBFcnJvciB1bndpbmQgc3RhdGNrICovCitlcnJvcl9vdXQ6CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQKLWVkYWNfcGNpX2RlbGV0ZV9pbnN0YW5jZV9rb2JqKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpLCBpbnQgaWR4KQorLyoKKyAqIGVkYWNfcGNpX3VucmVnaXN0ZXJfc3lzZnNfaW5zdGFuY2Vfa29iagorICoKKyAqCXVucmVnaXN0ZXIgdGhlIGtvYmogZm9yIHRoZSBFREFDIFBDSSBpbnN0YW5jZQorICovCit2b2lkIGVkYWNfcGNpX3VucmVnaXN0ZXJfc3lzZnNfaW5zdGFuY2Vfa29iaihzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKIHsKLQlpbml0X2NvbXBsZXRpb24oJnBjaS0+a29ial9jb21wbGV0ZSk7CisJZGVidWdmMCgiJXMoKVxuIiwgX19mdW5jX18pOworCisJLyogVW5yZWdpc3RlciB0aGUgaW5zdGFuY2Uga29iamVjdCBhbmQgYWxsb3cgaXRzIHJlbGVhc2UKKwkgKiBmdW5jdGlvbiByZWxlYXNlIHRoZSBtYWluIHJlZmVyZW5jZSBjb3VudCBhbmQgdGhlbgorCSAqIGtmcmVlIHRoZSBtZW1vcnkKKwkgKi8KIAlrb2JqZWN0X3VucmVnaXN0ZXIoJnBjaS0+a29iaik7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmcGNpLT5rb2JqX2NvbXBsZXRlKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVEQUMgUENJIHN5c2ZzIHJvb3QgKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgdG9fZWRhY3BjaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvLCBrb2JqKQogI2RlZmluZSB0b19lZGFjcGNpX2F0dHIoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCBlZGFjX3BjaV9hdHRyLCBhdHRyKQogCisvKiBzaW1wbGUgc2hvdy9zdG9yZSBmdW5jdGlvbnMgZm9yIGF0dHJpYnV0ZXMgKi8KIHN0YXRpYyBzc2l6ZV90IGVkYWNfcGNpX2ludF9zaG93KHZvaWQgKnB0ciwgY2hhciAqYnVmZmVyKQogewogCWludCAqdmFsdWUgPSBwdHI7CkBAIC0yNjcsMTE4ICszMTAsMTg5IEBACiAJTlVMTCwKIH07CiAKLS8qIE5vIG1lbW9yeSB0byByZWxlYXNlICovCi1zdGF0aWMgdm9pZCBlZGFjX3BjaV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQorLyoKKyAqIGVkYWNfcGNpX3JlbGVhc2VfbWFpbl9rb2JqCisgKgorICoJVGhpcyByZWxlYXNlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQgdG8gdGhlCisgKglwYXNzZWQga29iaiBnb2VzIHRvIHplcm8uCisgKgorICoJVGhpcyBrb2JqIGlzIHRoZSAnbWFpbicga29iamVjdCB0aGF0IEVEQUMgUENJIGluc3RhbmNlcworICoJbGluayB0bywgYW5kIHRodXMgcHJvdmlkZSBmb3IgcHJvcGVyIG5lc3RpbmcgY291bnRzCisgKi8KK3N0YXRpYyB2b2lkIGVkYWNfcGNpX3JlbGVhc2VfbWFpbl9rb2JqKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpOwogCi0JcGNpID0gdG9fZWRhY3BjaShrb2JqKTsKKwlkZWJ1Z2YwKCIlcygpIGhlcmUgdG8gbW9kdWxlX3B1dChUSElTX01PRFVMRSlcbiIsIF9fZnVuY19fKTsKIAotCWRlYnVnZjEoIiVzKClcbiIsIF9fZnVuY19fKTsKLQljb21wbGV0ZSgmcGNpLT5rb2JqX2NvbXBsZXRlKTsKKwkvKiBsYXN0IHJlZmVyZW5jZSB0byB0b3AgRURBQyBQQ0kga29iamVjdCBoYXMgYmVlbiByZW1vdmVkLAorCSAqIE5PVyByZWxlYXNlIG91ciByZWYgY291bnQgb24gdGhlIGNvcmUgbW9kdWxlCisJICovCisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2VkYWNfcGNpID0gewotCS5yZWxlYXNlID0gZWRhY19wY2lfcmVsZWFzZSwKKy8qIGt0eXBlIHN0cnVjdCBmb3IgdGhlIEVEQUMgUENJIG1haW4ga29iaiAqLworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfZWRhY19wY2lfbWFpbl9rb2JqID0geworCS5yZWxlYXNlID0gZWRhY19wY2lfcmVsZWFzZV9tYWluX2tvYmosCiAJLnN5c2ZzX29wcyA9ICZlZGFjX3BjaV9zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSAoc3RydWN0IGF0dHJpYnV0ZSAqKillZGFjX3BjaV9hdHRyLAogfTsKIAogLyoqCi0gKiBlZGFjX3N5c2ZzX3BjaV9zZXR1cCgpCisgKiBlZGFjX3BjaV9tYWluX2tvYmpfc2V0dXAoKQogICoKICAqCXNldHVwIHRoZSBzeXNmcyBmb3IgRURBQyBQQ0kgYXR0cmlidXRlcwogICoJYXNzdW1lcyBlZGFjX2NsYXNzIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQKICAqLwotaW50IGVkYWNfcGNpX3JlZ2lzdGVyX21haW5fa29iaih2b2lkKQoraW50IGVkYWNfcGNpX21haW5fa29ial9zZXR1cCh2b2lkKQogewogCWludCBlcnI7CiAJc3RydWN0IHN5c2Rldl9jbGFzcyAqZWRhY19jbGFzczsKIAotCWRlYnVnZjEoIiVzKClcbiIsIF9fZnVuY19fKTsKKwlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKKwkvKiBjaGVjayBhbmQgY291bnQgaWYgd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIG1haW4ga29iamVjdCAqLworCWlmIChhdG9taWNfaW5jX3JldHVybigmZWRhY19wY2lfc3lzZnNfcmVmY291bnQpICE9IDEpCisJCXJldHVybiAwOworCisJLyogRmlyc3QgdGltZSwgc28gY3JlYXRlIHRoZSBtYWluIGtvYmplY3QgYW5kIGl0cworCSAqIGNvbnRyb2xzIGFuZCBhdHJpYnV0ZXMKKwkgKi8KIAllZGFjX2NsYXNzID0gZWRhY19nZXRfZWRhY19jbGFzcygpOwogCWlmIChlZGFjX2NsYXNzID09IE5VTEwpIHsKIAkJZGVidWdmMSgiJXMoKSBubyBlZGFjX2NsYXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGRlY3JlbWVudF9jb3VudF9mYWlsOwogCX0KIAotCWVkYWNfcGNpX2tvYmoua3R5cGUgPSAma3R5cGVfZWRhY19wY2k7CisJLyogTmVlZCB0aGUga29iamVjdCBob29rIHVwcywgYW5kIG5hbWUgc2V0dGluZyAqLworCWVkYWNfcGNpX3RvcF9tYWluX2tvYmoua3R5cGUgPSAma3R5cGVfZWRhY19wY2lfbWFpbl9rb2JqOworCWVkYWNfcGNpX3RvcF9tYWluX2tvYmoucGFyZW50ID0gJmVkYWNfY2xhc3MtPmtzZXQua29iajsKIAotCWVkYWNfcGNpX2tvYmoucGFyZW50ID0gJmVkYWNfY2xhc3MtPmtzZXQua29iajsKLQotCWVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmVkYWNfcGNpX2tvYmosICJwY2kiKTsKKwllcnIgPSBrb2JqZWN0X3NldF9uYW1lKCZlZGFjX3BjaV90b3BfbWFpbl9rb2JqLCAicGNpIik7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBkZWNyZW1lbnRfY291bnRfZmFpbDsKKworCS8qIEJ1bXAgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGlzIG1vZHVsZSB0byBlbnN1cmUgdGhlCisJICogbW9kdWxlcyBpc24ndCB1bmxvYWRlZCB1bnRpbCB3ZSBkZWNvbnN0cnVjdCB0aGUgdG9wCisJICogbGV2ZWwgbWFpbiBrb2JqIGZvciBFREFDIFBDSQorCSAqLworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CisJCWRlYnVnZjEoIiVzKCkgdHJ5X21vZHVsZV9nZXQoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBkZWNyZW1lbnRfY291bnRfZmFpbDsKKwl9CiAKIAkvKiBJbnN0YW5zdGlhdGUgdGhlIHBjaSBvYmplY3QgKi8KIAkvKiBGSVhNRTogbWF5YmUgbmV3IHN5c2Rldl9jcmVhdGVfc3ViZGlyKCkgKi8KLQllcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZlZGFjX3BjaV9rb2JqKTsKLQorCWVyciA9IGtvYmplY3RfcmVnaXN0ZXIoJmVkYWNfcGNpX3RvcF9tYWluX2tvYmopOwogCWlmIChlcnIpIHsKIAkJZGVidWdmMSgiRmFpbGVkIHRvIHJlZ2lzdGVyICcuLi4vZWRhYy9wY2knXG4iKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBrb2JqZWN0X3JlZ2lzdGVyX2ZhaWw7CiAJfQogCisJLyogQXQgdGhpcyBwb2ludCwgdG8gJ3JlbGVhc2UnIHRoZSB0b3AgbGV2ZWwga29iamVjdAorCSAqIGZvciBFREFDIFBDSSwgdGhlbiBlZGFjX3BjaV9tYWluX2tvYmpfdGVhcmRvd24oKQorCSAqIG11c3QgYmUgdXNlZCwgZm9yIHJlc291cmNlcyB0byBiZSBjbGVhbmVkIHVwIHByb3Blcmx5CisJICovCiAJZGVidWdmMSgiUmVnaXN0ZXJlZCAnLi4uL2VkYWMvcGNpJyBrb2JqZWN0XG4iKTsKIAogCXJldHVybiAwOworCisJLyogRXJyb3IgdW53aW5kIHN0YXRjayAqLwora29iamVjdF9yZWdpc3Rlcl9mYWlsOgorCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCitkZWNyZW1lbnRfY291bnRfZmFpbDoKKwkvKiBpZiBhcmUgb24gdGhpcyBlcnJvciBleGl0LCBub3RoaW5nIHRvIHRlYXIgZG93biAqLworCWF0b21pY19kZWMoJmVkYWNfcGNpX3N5c2ZzX3JlZmNvdW50KTsKKworCXJldHVybiBlcnI7CiB9CiAKIC8qCi0gKiBlZGFjX3BjaV91bnJlZ2lzdGVyX21haW5fa29iaigpCisgKiBlZGFjX3BjaV9tYWluX2tvYmpfdGVhcmRvd24oKQogICoKLSAqCXBlcmZvcm0gdGhlIHN5c2ZzIHRlYXJkb3duIGZvciB0aGUgUENJIGF0dHJpYnV0ZXMKKyAqCWlmIG5vIGxvbmdlciBsaW5rZWQgKG5lZWRlZCkgcmVtb3ZlIHRoZSB0b3AgbGV2ZWwgRURBQyBQQ0kKKyAqCWtvYmplY3Qgd2l0aCBpdHMgY29udHJvbHMgYW5kIGF0dHJpYnV0ZXMKICAqLwotdm9pZCBlZGFjX3BjaV91bnJlZ2lzdGVyX21haW5fa29iaih2b2lkKQorc3RhdGljIHZvaWQgZWRhY19wY2lfbWFpbl9rb2JqX3RlYXJkb3duKHZvaWQpCiB7CiAJZGVidWdmMCgiJXMoKVxuIiwgX19mdW5jX18pOwotCWluaXRfY29tcGxldGlvbigmZWRhY19wY2lfa29ial9jb21wbGV0ZSk7Ci0Ja29iamVjdF91bnJlZ2lzdGVyKCZlZGFjX3BjaV9rb2JqKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZlZGFjX3BjaV9rb2JqX2NvbXBsZXRlKTsKKworCS8qIERlY3JlbWVudCB0aGUgY291bnQgYW5kIG9ubHkgaWYgbm8gbW9yZSBjb250cm9sbGVyIGluc3RhbmNlcworCSAqIGFyZSBjb25uZWN0ZWQgcGVyZm9ybSB0aGUgdW5yZWdpc3RlcmF0aW9uIG9mIHRoZSB0b3AgbGV2ZWwKKwkgKiBtYWluIGtvYmoKKwkgKi8KKwlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmVkYWNfcGNpX3N5c2ZzX3JlZmNvdW50KSA9PSAwKSB7CisJCWRlYnVnZjAoIiVzKCkgY2FsbGVkIGtvYmplY3RfdW5yZWdpc3RlciBvbiBtYWluIGtvYmpcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWtvYmplY3RfdW5yZWdpc3RlcigmZWRhY19wY2lfdG9wX21haW5fa29iaik7CisJfQogfQogCisvKgorICoKKyAqIGVkYWNfcGNpX2NyZWF0ZV9zeXNmcworICoKKyAqCUNyZWF0ZSB0aGUgY29udHJvbHMvYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBFREFDIFBDSSBkZXZpY2UKKyAqLwogaW50IGVkYWNfcGNpX2NyZWF0ZV9zeXNmcyhzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBrb2JqZWN0ICplZGFjX2tvYmogPSAmcGNpLT5rb2JqOwogCi0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZlZGFjX3BjaV9zeXNmc19yZWZjb3VudCkgPT0gMSkgewotCQllcnIgPSBlZGFjX3BjaV9yZWdpc3Rlcl9tYWluX2tvYmooKTsKLQkJaWYgKGVycikgewotCQkJYXRvbWljX2RlYygmZWRhY19wY2lfc3lzZnNfcmVmY291bnQpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCWVyciA9IGVkYWNfcGNpX2NyZWF0ZV9pbnN0YW5jZV9rb2JqKHBjaSwgcGNpLT5wY2lfaWR4KTsKLQlpZiAoZXJyKSB7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmZWRhY19wY2lfc3lzZnNfcmVmY291bnQpID09IDApCi0JCQllZGFjX3BjaV91bnJlZ2lzdGVyX21haW5fa29iaigpOwotCX0KLQogCWRlYnVnZjAoIiVzKCkgaWR4PSVkXG4iLCBfX2Z1bmNfXywgcGNpLT5wY2lfaWR4KTsKIAorCS8qIGNyZWF0ZSB0aGUgdG9wIG1haW4gRURBQyBQQ0kga29iamVjdCwgSUYgbmVlZGVkICovCisJZXJyID0gZWRhY19wY2lfbWFpbl9rb2JqX3NldHVwKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0aGlzIGluc3RhbmNlJ3Mga29iamVjdCB1bmRlciB0aGUgTUFJTiBrb2JqZWN0ICovCisJZXJyID0gZWRhY19wY2lfY3JlYXRlX2luc3RhbmNlX2tvYmoocGNpLCBwY2ktPnBjaV9pZHgpOworCWlmIChlcnIpCisJCWdvdG8gdW5yZWdpc3Rlcl9jbGVhbnVwOworCiAJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoZWRhY19rb2JqLCAmcGNpLT5kZXYtPmtvYmosIEVEQUNfUENJX1NZTUxJTkspOwogCWlmIChlcnIpIHsKIAkJZGVidWdmMCgiJXMoKSBzeXNmc19jcmVhdGVfbGluaygpIHJldHVybmVkIGVycj0gJWRcbiIsCiAJCQlfX2Z1bmNfXywgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBzeW1saW5rX2ZhaWw7CiAJfQogCiAJcmV0dXJuIDA7CisKKwkvKiBFcnJvciB1bndpbmQgc3RhY2sgKi8KK3N5bWxpbmtfZmFpbDoKKwllZGFjX3BjaV91bnJlZ2lzdGVyX3N5c2ZzX2luc3RhbmNlX2tvYmoocGNpKTsKKwordW5yZWdpc3Rlcl9jbGVhbnVwOgorCWVkYWNfcGNpX21haW5fa29ial90ZWFyZG93bigpOworCisJcmV0dXJuIGVycjsKIH0KIAorLyoKKyAqIGVkYWNfcGNpX3JlbW92ZV9zeXNmcworICoKKyAqCXJlbW92ZSB0aGUgY29udHJvbHMgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoaXMgRURBQyBQQ0kgZGV2aWNlCisgKi8KIHZvaWQgZWRhY19wY2lfcmVtb3ZlX3N5c2ZzKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpKQogewotCWRlYnVnZjAoIiVzKClcbiIsIF9fZnVuY19fKTsKKwlkZWJ1Z2YwKCIlcygpIGluZGV4PSVkXG4iLCBfX2Z1bmNfXywgcGNpLT5wY2lfaWR4KTsKIAotCWVkYWNfcGNpX2RlbGV0ZV9pbnN0YW5jZV9rb2JqKHBjaSwgcGNpLT5wY2lfaWR4KTsKLQorCS8qIFJlbW92ZSB0aGUgc3ltbGluayAqLwogCXN5c2ZzX3JlbW92ZV9saW5rKCZwY2ktPmtvYmosIEVEQUNfUENJX1NZTUxJTkspOwogCi0JaWYgKGF0b21pY19kZWNfcmV0dXJuKCZlZGFjX3BjaV9zeXNmc19yZWZjb3VudCkgPT0gMCkKLQkJZWRhY19wY2lfdW5yZWdpc3Rlcl9tYWluX2tvYmooKTsKKwkvKiByZW1vdmUgdGhpcyBQQ0kgaW5zdGFuY2UncyBzeXNmcyBlbnRyaWVzICovCisJZWRhY19wY2lfdW5yZWdpc3Rlcl9zeXNmc19pbnN0YW5jZV9rb2JqKHBjaSk7CisKKwkvKiBDYWxsIHRoZSBtYWluIHVucmVnaXN0ZXIgZnVuY3Rpb24sIHdoaWNoIHdpbGwgZGV0ZXJtaW5lCisJICogaWYgdGhpcyAncGNpJyBpcyB0aGUgbGFzdCBpbnN0YW5jZS4KKwkgKiBJZiBpdCBpcywgdGhlIG1haW4ga29iamVjdCB3aWxsIGJlIHVucmVnaXN0ZXJlZCBhcyBhIHJlc3VsdAorCSAqLworCWRlYnVnZjAoIiVzKCkgY2FsbGluZyBlZGFjX3BjaV9tYWluX2tvYmpfdGVhcmRvd24oKVxuIiwgX19mdW5jX18pOworCWVkYWNfcGNpX21haW5fa29ial90ZWFyZG93bigpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBlcnJvciBoYW5kbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDE0LDEzICs1MjgsMTQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi10eXBlZGVmIHZvaWQgKCpwY2lfcGFyaXR5X2NoZWNrX2ZuX3QpIChzdHJ1Y3QgcGNpX2RldiAqIGRldik7CiAKIC8qIENsZWFyIGFueSBQQ0kgcGFyaXR5IGVycm9ycyBsb2dnZWQgYnkgdGhpcyBkZXZpY2UuICovCiBzdGF0aWMgdm9pZCBlZGFjX3BjaV9kZXZfcGFyaXR5X2NsZWFyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTggaGVhZGVyX3R5cGU7CiAKKwlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKIAlnZXRfcGNpX3Bhcml0eV9zdGF0dXMoZGV2LCAwKTsKIAogCS8qIHJlYWQgdGhlIGRldmljZSBUWVBFLCBsb29raW5nIGZvciBicmlkZ2VzICovCkBAIC00MzMsMTcgKzU0OCwyOCBAQAogLyoKICAqICBQQ0kgUGFyaXR5IHBvbGxpbmcKICAqCisgKglGdWNudGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBwYXJpdHkgc3RhdHVzCisgKglhbmQgZGVjb2RlIGl0CisgKgogICovCiBzdGF0aWMgdm9pZCBlZGFjX3BjaV9kZXZfcGFyaXR5X3Rlc3Qoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBzdGF0dXM7CiAJdTggaGVhZGVyX3R5cGU7CiAKLQkvKiByZWFkIHRoZSBTVEFUVVMgcmVnaXN0ZXIgb24gdGhpcyBkZXZpY2UKLQkgKi8KKwkvKiBzdG9wIGFueSBpbnRlcnJ1cHRzIHVudGlsIHdlIGNhbiBhY3F1aXJlIHRoZSBzdGF0dXMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiByZWFkIHRoZSBTVEFUVVMgcmVnaXN0ZXIgb24gdGhpcyBkZXZpY2UgKi8KIAlzdGF0dXMgPSBnZXRfcGNpX3Bhcml0eV9zdGF0dXMoZGV2LCAwKTsKIAotCWRlYnVnZjIoIlBDSSBTVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXYtPmRldi5idXNfaWQpOworCS8qIHJlYWQgdGhlIGRldmljZSBUWVBFLCBsb29raW5nIGZvciBicmlkZ2VzICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZWFkZXJfdHlwZSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlkZWJ1Z2Y0KCJQQ0kgU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2LT5kZXYuYnVzX2lkKTsKIAogCS8qIGNoZWNrIHRoZSBzdGF0dXMgcmVnIGZvciBlcnJvcnMgKi8KIAlpZiAoc3RhdHVzKSB7CkBAIC00NzEsMTYgKzU5NywxNCBAQAogCQl9CiAJfQogCi0JLyogcmVhZCB0aGUgZGV2aWNlIFRZUEUsIGxvb2tpbmcgZm9yIGJyaWRnZXMgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9IRUFERVJfVFlQRSwgJmhlYWRlcl90eXBlKTsKIAotCWRlYnVnZjIoIlBDSSBIRUFERVIgVFlQRT0gMHglMDJ4ICVzXG4iLCBoZWFkZXJfdHlwZSwgZGV2LT5kZXYuYnVzX2lkKTsKKwlkZWJ1Z2Y0KCJQQ0kgSEVBREVSIFRZUEU9IDB4JTAyeCAlc1xuIiwgaGVhZGVyX3R5cGUsIGRldi0+ZGV2LmJ1c19pZCk7CiAKIAlpZiAoKGhlYWRlcl90eXBlICYgMHg3RikgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewogCQkvKiBPbiBicmlkZ2VzLCBuZWVkIHRvIGV4YW1pbmUgc2Vjb25kYXJ5IHN0YXR1cyByZWdpc3RlciAgKi8KIAkJc3RhdHVzID0gZ2V0X3BjaV9wYXJpdHlfc3RhdHVzKGRldiwgMSk7CiAKLQkJZGVidWdmMigiUENJIFNFQ19TVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXYtPmRldi5idXNfaWQpOworCQlkZWJ1Z2Y0KCJQQ0kgU0VDX1NUQVRVUz0gMHglMDR4ICVzXG4iLCBzdGF0dXMsIGRldi0+ZGV2LmJ1c19pZCk7CiAKIAkJLyogY2hlY2sgdGhlIHNlY29uZGFyeSBzdGF0dXMgcmVnIGZvciBlcnJvcnMgKi8KIAkJaWYgKHN0YXR1cykgewpAQCAtNTEwLDkgKzYzNCwxMiBAQAogCX0KIH0KIAorLyogcmVkdWNlIHNvbWUgY29tcGxleGl0eSBpbiBkZWZpbml0aW9uIG9mIHRoZSBpdGVyYXRvciAqLwordHlwZWRlZiB2b2lkICgqcGNpX3Bhcml0eV9jaGVja19mbl90KSAoc3RydWN0IHBjaV9kZXYgKmRldik7CisKIC8qCiAgKiBwY2lfZGV2IHBhcml0eSBsaXN0IGl0ZXJhdG9yCi0gKglTY2FuIHRoZSBQQ0kgZGV2aWNlIGxpc3QgZm9yIG9uZSBpdGVyYXRpb24sIGxvb2tpbmcgZm9yIFNFUlJPUnMKKyAqCVNjYW4gdGhlIFBDSSBkZXZpY2UgbGlzdCBmb3Igb25lIHBhc3MsIGxvb2tpbmcgZm9yIFNFUlJPUnMKICAqCU1hc3RlciBQYXJpdHkgRVJST1JTIG9yIFBhcml0eSBFUlJPUnMgb24gcHJpbWFyeSBvciBzZWNvbmRhcnkgZGV2aWNlcwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZWRhY19wY2lfZGV2X3Bhcml0eV9pdGVyYXRvcihwY2lfcGFyaXR5X2NoZWNrX2ZuX3QgZm4pCkBAIC01MzUsMjIgKzY2MiwyMiBAQAogICovCiB2b2lkIGVkYWNfcGNpX2RvX3Bhcml0eV9jaGVjayh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGJlZm9yZV9jb3VudDsKIAogCWRlYnVnZjMoIiVzKClcbiIsIF9fZnVuY19fKTsKIAorCS8qIGlmIHBvbGljeSBoYXMgUENJIGNoZWNrIG9mZiwgbGVhdmUgbm93ICovCiAJaWYgKCFjaGVja19wY2lfZXJyb3JzKQogCQlyZXR1cm47CiAKIAliZWZvcmVfY291bnQgPSBhdG9taWNfcmVhZCgmcGNpX3Bhcml0eV9jb3VudCk7CiAKIAkvKiBzY2FuIGFsbCBQQ0kgZGV2aWNlcyBsb29raW5nIGZvciBhIFBhcml0eSBFcnJvciBvbiBkZXZpY2VzIGFuZAotCSAqIGJyaWRnZXMKKwkgKiBicmlkZ2VzLgorCSAqIFRoZSBpdGVyYXRvciBjYWxscyBwY2lfZ2V0X2RldmljZSgpIHdoaWNoIG1pZ2h0IHNsZWVwLCB0aHVzCisJICogd2UgY2Fubm90IGRpc2FibGUgaW50ZXJydXB0cyBpbiB0aGlzIHNjYW4uCiAJICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWVkYWNfcGNpX2Rldl9wYXJpdHlfaXRlcmF0b3IoZWRhY19wY2lfZGV2X3Bhcml0eV90ZXN0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAkvKiBPbmx5IGlmIG9wZXJhdG9yIGhhcyBzZWxlY3RlZCBwYW5pYyBvbiBQQ0kgRXJyb3IgKi8KIAlpZiAoZWRhY19wY2lfZ2V0X3BhbmljX29uX3BlKCkpIHsKQEAgLTU2MCw2ICs2ODcsMTIgQEAKIAl9CiB9CiAKKy8qCisgKiBlZGFjX3BjaV9jbGVhcl9wYXJpdHlfZXJyb3JzCisgKgorICoJZnVuY3Rpb24gdG8gcGVyZm9ybSBhbiBpdGVyYXRpb24gb3ZlciB0aGUgUENJIGRldmljZXMKKyAqCWFuZCBjbGVhcm4gdGhlaXIgY3VycmVudCBzdGF0dXMKKyAqLwogdm9pZCBlZGFjX3BjaV9jbGVhcl9wYXJpdHlfZXJyb3JzKHZvaWQpCiB7CiAJLyogQ2xlYXIgYW55IFBDSSBidXMgcGFyaXR5IGVycm9ycyB0aGF0IGRldmljZXMgaW5pdGlhbGx5IGhhdmUgbG9nZ2VkCkBAIC01NjcsNiArNzAwLDEyIEBACiAJICovCiAJZWRhY19wY2lfZGV2X3Bhcml0eV9pdGVyYXRvcihlZGFjX3BjaV9kZXZfcGFyaXR5X2NsZWFyKTsKIH0KKworLyoKKyAqIGVkYWNfcGNpX2hhbmRsZV9wZQorICoKKyAqCUNhbGxlZCB0byBoYW5kbGUgYSBQQVJJVFkgRVJST1IgZXZlbnQKKyAqLwogdm9pZCBlZGFjX3BjaV9oYW5kbGVfcGUoc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICpwY2ksIGNvbnN0IGNoYXIgKm1zZykKIHsKIApAQCAtNTg0LDkgKzcyMywxNCBAQAogCSAqLwogCWVkYWNfcGNpX2RvX3Bhcml0eV9jaGVjaygpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChlZGFjX3BjaV9oYW5kbGVfcGUpOwogCisKKy8qCisgKiBlZGFjX3BjaV9oYW5kbGVfbnBlCisgKgorICoJQ2FsbGVkIHRvIGhhbmRsZSBhIE5PTi1QQVJJVFkgRVJST1IgZXZlbnQKKyAqLwogdm9pZCBlZGFjX3BjaV9oYW5kbGVfbnBlKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpLCBjb25zdCBjaGFyICptc2cpCiB7CiAKQEAgLTYwNCw3ICs3NDgsNiBAQAogCSAqLwogCWVkYWNfcGNpX2RvX3Bhcml0eV9jaGVjaygpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChlZGFjX3BjaV9oYW5kbGVfbnBlKTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pMzAwMF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaTMwMDBfZWRhYy5jCmluZGV4IDBlY2ZkYzQuLmU4OTVmOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pMzAwMF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2kzMDAwX2VkYWMuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJdW5zaWduZWQgY2hhciAqYzBkcmEgPSBkcmEsICpjMWRyYSA9ICZkcmFbSTMwMDBfUkFOS1NfUEVSX0NIQU5ORUwgLyAyXTsKIAl1bnNpZ25lZCBjaGFyICpjMGRyYiA9IGRyYiwgKmMxZHJiID0gJmRyYltJMzAwMF9SQU5LU19QRVJfQ0hBTk5FTF07CiAJdW5zaWduZWQgbG9uZyBtY2hiYXI7Ci0Jdm9pZCAqd2luZG93OworCXZvaWQgX19pb21lbSAqd2luZG93OwogCiAJZGVidWdmMCgiTUM6ICVzKClcbiIsIF9fZnVuY19fKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwppbmRleCBkYTE2NDc4Li4xODQyZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZwpAQCAtOTIsOSArOTIsOSBAQAogCiBjb25maWcgSTJDX0JMQUNLRklOX1RXSQogCXRyaXN0YXRlICJCbGFja2ZpbiBUV0kgSTJDIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCRjUzNCB8fCBCRjUzNiB8fCBCRjUzNworCWRlcGVuZHMgb24gQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcgfHwgQkY1NHgKIAloZWxwCi0JICBUaGlzIGlzIHRoZSBUV0kgSTJDIGRldmljZSBkcml2ZXIgZm9yIEJsYWNrZmluIDUzNC81MzYvNTM3LgorCSAgVGhpcyBpcyB0aGUgVFdJIEkyQyBkZXZpY2UgZHJpdmVyIGZvciBCbGFja2ZpbiA1MzQvNTM2LzUzNy81NHguCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtYmZpbi10d2kuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTY4Mi5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZHMxNjgyLmMKaW5kZXggNTg3OWYwZi4uOWU5NDU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvZHMxNjgyLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZHMxNjgyLmMKQEAgLTc1LDcgKzc1LDggQEAKIAkvKiBTcGVjaWFsIGNhc2U6IHRoZSAzMiBiaXQgcmVncyBhcmUgdGltZSB2YWx1ZXMgd2l0aCAxLzRzCiAJICogcmVzb2x1dGlvbiwgc2NhbGUgdGhlbSB1cCB0byBtaWxsaXNlY29uZHMgKi8KIAlpZiAoc2F0dHItPm5yID09IDQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsICgodTY0KSBsZTMyX3RvX2NwdSh2YWwpKSAqIDI1MCk7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsCisJCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylsZTMyX3RvX2NwdSh2YWwpKSAqIDI1MCk7CiAKIAkvKiBGb3JtYXQgdGhlIG91dHB1dCBzdHJpbmcgYW5kIHJldHVybiAjIG9mIGJ5dGVzICovCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxpXG4iLCAobG9uZylsZTMyX3RvX2NwdSh2YWwpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCmluZGV4IDNjM2YyZWIuLjUwM2ZmZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJCQkvKiBSRVZJU0lUOiAgdGhpcyBtaWdodCBuZWVkIGl0cyBvd24gd29ya3F1ZXVlCiAJCQkgKiBwbHVzIHR3ZWFrcyBpbmNsdWRpbmcgZGVhZGxvY2sgYXZvaWRhbmNlIC4uLgogCQkJICogYWxzbyBuZWVkcyB0byBnZXQgZXJyb3IgaGFuZGxpbmcgYW5kIHByb2JhYmx5Ci0JCQkgKiBhbiAjaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKKwkJCSAqIGFuICNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KIAkJCSAqLwogCQkJaGliZXJuYXRlKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKaW5kZXggMTQ4NmViMi4uY2E4NDM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTMwNzEsNyArMzA3MSw3IEBACiAvKgogICogc3RhbmRhcmQgcHJlcF9ycV9mbiB0aGF0IGJ1aWxkcyAxMCBieXRlIGNtZHMKICAqLwotc3RhdGljIGludCBpZGVfY2Ryb21fcHJlcF9mcyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyBpbnQgaWRlX2Nkcm9tX3ByZXBfZnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlpbnQgaGFyZF9zZWN0ID0gcXVldWVfaGFyZHNlY3Rfc2l6ZShxKTsKIAlsb25nIGJsb2NrID0gKGxvbmcpcnEtPmhhcmRfc2VjdG9yIC8gKGhhcmRfc2VjdCA+PiA5KTsKQEAgLTMxMzcsNyArMzEzNyw3IEBACiAJcmV0dXJuIEJMS1BSRVBfT0s7CiB9CiAKLXN0YXRpYyBpbnQgaWRlX2Nkcm9tX3ByZXBfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgaW50IGlkZV9jZHJvbV9wcmVwX2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaWYgKGJsa19mc19yZXF1ZXN0KHJxKSkKIAkJcmV0dXJuIGlkZV9jZHJvbV9wcmVwX2ZzKHEsIHJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IGIxMzA0YTcuLjVjZTQyMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtNjc5LDcgKzY3OSw3IEBACiB9OwogI2VuZGlmCS8qIENPTkZJR19JREVfUFJPQ19GUyAqLwogCi1zdGF0aWMgdm9pZCBpZGVkaXNrX3ByZXBhcmVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBpZGVkaXNrX3ByZXBhcmVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBxLT5xdWV1ZWRhdGE7CiAKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCXJxLT5idWZmZXIgPSBycS0+Y21kOwogfQogCi1zdGF0aWMgaW50IGlkZWRpc2tfaXNzdWVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKK3N0YXRpYyBpbnQgaWRlZGlza19pc3N1ZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCiAJCQkgICAgICAgc2VjdG9yX3QgKmVycm9yX3NlY3RvcikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBxLT5xdWV1ZWRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCmluZGV4IDQ4NGM1MGU3Li5hYTlmNWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaW8uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW8uYwpAQCAtMTMyNyw3ICsxMzI3LDcgQEAKIC8qCiAgKiBQYXNzZXMgdGhlIHN0dWZmIHRvIGlkZV9kb19yZXF1ZXN0CiAgKi8KLXZvaWQgZG9faWRlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQordm9pZCBkb19pZGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBxLT5xdWV1ZWRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKaW5kZXggNWE0YzVlYS4uM2EyYTlhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKQEAgLTk0NSw3ICs5NDUsNyBAQAogICovCiBzdGF0aWMgaW50IGlkZV9pbml0X3F1ZXVlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwogCWludCBtYXhfc2VjdG9ycyA9IDI1NjsKIAlpbnQgbWF4X3NnX2VudHJpZXMgPSBQUkRfRU5UUklFUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jIGIvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKaW5kZXggOGYyZGI4ZC4uOGUwNWQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMKQEAgLTY1Miw3ICs2NTIsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9faGRfcmVxdWVzdCAocmVxdWVzdF9xdWV1ZV90ICogcSkKK3N0YXRpYyB2b2lkIGRvX2hkX3JlcXVlc3QgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKIHsKIAlkaXNhYmxlX2lycShIRF9JUlEpOwogCWhkX3JlcXVlc3QoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9zY2NfcGF0YS5jIGIvZHJpdmVycy9pZGUvcGNpL3NjY19wYXRhLmMKaW5kZXggZjY2OGQyMy4uYmYxOWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NjY19wYXRhLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3NjY19wYXRhLmMKQEAgLTU1MSw4ICs1NTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKIAl1bnNpZ25lZCBsb25nIGN0bF9zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDApOwogCXVuc2lnbmVkIGxvbmcgZG1hX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMSk7Ci0Jdm9pZCAqY3RsX2FkZHI7Ci0Jdm9pZCAqZG1hX2FkZHI7CisJdm9pZCBfX2lvbWVtICpjdGxfYWRkcjsKKwl2b2lkIF9faW9tZW0gKmRtYV9hZGRyOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9IV0lGUzsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCmluZGV4IDMzNmU1ZmYuLmNhZGYwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCkBAIC0yNjc3LDcgKzI2NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhdzEzOTRfaXNvX3BhY2tldHMzMiBfX3VzZXIgKmFyZykKIHsKIAljb21wYXRfdXB0cl90IGluZm9zMzI7Ci0Jdm9pZCAqaW5mb3M7CisJdm9pZCBfX3VzZXIgKmluZm9zOwogCWxvbmcgZXJyID0gLUVGQVVMVDsKIAlzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0cyBfX3VzZXIgKmRzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0cykpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9xcC5jCmluZGV4IDQyMGMxMzguLjAxZDA3ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9xcC5jCkBAIC01MDYsNiArNTA2LDcgQEAKIAlxcC0+c2VuZF9zZ2xfZGVwdGggPSBxcF9hdHRycy0+Y2FwLm1heF9zZW5kX3NnZTsKIAlxcC0+cmRtYV93cml0ZV9zZ2xfZGVwdGggPSBxcF9hdHRycy0+Y2FwLm1heF9zZW5kX3NnZTsKIAlxcC0+cmVjdl9zZ2xfZGVwdGggPSBxcF9hdHRycy0+Y2FwLm1heF9yZWN2X3NnZTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxcC0+d2FpdCk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBTUSBNUSAqLwogCXFfc2l6ZSA9IGJlMzJfdG9fY3B1KHJlcGx5LT5zcV9kZXB0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NsYXNzZXMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY2xhc3Nlcy5oCmluZGV4IDM3MjVhYTguLmI1ZTk2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY2xhc3Nlcy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY2xhc3Nlcy5oCkBAIC0zMjIsNiArMzIyLDcgQEAKIGV4dGVybiBpbnQgZWhjYV9wb3J0X2FjdF90aW1lOwogZXh0ZXJuIGludCBlaGNhX3VzZV9ocF9tcjsKIGV4dGVybiBpbnQgZWhjYV9zY2FsaW5nX2NvZGU7CitleHRlcm4gaW50IGVoY2FfbXJfbGFyZ2VwYWdlOwogCiBzdHJ1Y3QgaXB6dV9xdWV1ZV9yZXNwIHsKIAl1MzIgcWVfc2l6ZTsgICAgICAvKiBxdWV1ZSBlbnRyeSBzaXplICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbXJtdy5jCmluZGV4IGMxYjg2OGIuLmQ5N2VkYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbXJtdy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbXJtdy5jCkBAIC00MCwxMCArNDAsMTAgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlIDxyZG1hL2liX3VtZW0uaD4KLQogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAKKyNpbmNsdWRlIDxyZG1hL2liX3VtZW0uaD4KKwogI2luY2x1ZGUgImVoY2FfaXZlcmJzLmgiCiAjaW5jbHVkZSAiZWhjYV9tcm13LmgiCiAjaW5jbHVkZSAiaGNwX2lmLmgiCkBAIC02NCw4ICs2NCw2IEBACiAJRUhDQV9NUl9QR1NJWkUxNk0gPSAweDEwMDAwMDBMCiB9OwogCi1leHRlcm4gaW50IGVoY2FfbXJfbGFyZ2VwYWdlOwotCiBzdGF0aWMgdTMyIGVoY2FfZW5jb2RlX2h3cGFnZV9zaXplKHUzMiBwZ3NpemUpCiB7CiAJdTMyIGlkeCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3BkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3BkLmMKaW5kZXggM2RhZmQ3Zi4uNDNiY2YwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9wZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcGQuYwpAQCAtODgsNyArODgsNiBAQAogCXUzMiBjdXJfcGlkID0gY3VycmVudC0+dGdpZDsKIAlzdHJ1Y3QgZWhjYV9wZCAqbXlfcGQgPSBjb250YWluZXJfb2YocGQsIHN0cnVjdCBlaGNhX3BkLCBpYl9wZCk7CiAJaW50IGksIGxlZnRvdmVycyA9IDA7Ci0JZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzbWFsbF9xcF9jYWNoZTsKIAlzdHJ1Y3QgaXB6X3NtYWxsX3F1ZXVlX3BhZ2UgKnBhZ2UsICp0bXA7CiAKIAlpZiAobXlfcGQtPmliX3BkLnVvYmplY3QgJiYgbXlfcGQtPmliX3BkLnVvYmplY3QtPmNvbnRleHQgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaGNwX2lmLmMKaW5kZXggZmRiZmViZS4uMjRmNDU0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaGNwX2lmLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaGNwX2lmLmMKQEAgLTc1OCw3ICs3NTgsNiBAQAogCQkJICAgICBjb25zdCB1NjQgbG9naWNhbF9hZGRyZXNzX29mX3BhZ2UsCiAJCQkgICAgIGNvbnN0IHU2NCBjb3VudCkKIHsKLQlleHRlcm4gaW50IGVoY2FfZGVidWdfbGV2ZWw7CiAJdTY0IHJldDsKIAogCWlmICh1bmxpa2VseShlaGNhX2RlYnVnX2xldmVsID49IDIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9pcHpfcHRfZm4uaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oCmluZGV4IGM2OTM3YTAuLmE4MDEyNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oCkBAIC01NCw2ICs1NCw4IEBACiBzdHJ1Y3QgZWhjYV9wZDsKIHN0cnVjdCBpcHpfc21hbGxfcXVldWVfcGFnZTsKIAorZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzbWFsbF9xcF9jYWNoZTsKKwogLyogc3RydWN0IGdlbmVyaWMgZWhjYSBwYWdlICovCiBzdHJ1Y3QgaXB6X3BhZ2UgewogCXU4IGVudHJpZXNbRUhDQV9QQUdFU0laRV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfY29tbW9uLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfY29tbW9uLmgKaW5kZXggYjRiNzg2ZC4uNmFkODIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9jb21tb24uaApAQCAtMTAwLDggKzEwMCw3IEBACiAJX191NjQgc3BzX2h3ZXJyczsKIAkvKiBudW1iZXIgb2YgdGltZXMgSUIgbGluayBjaGFuZ2VkIHN0YXRlIHVuZXhwZWN0ZWRseSAqLwogCV9fdTY0IHNwc19pYmxpbms7Ci0JLyoga2VybmVsIHJlY2VpdmUgaW50ZXJydXB0cyB0aGF0IGRpZG4ndCByZWFkIGludHN0YXQgKi8KLQlfX3U2NCBzcHNfZmFzdHJjdmludDsKKwlfX3U2NCBzcHNfdW51c2VkOyAvKiB3YXMgZmFzdHJjdmludCwgbm8gbG9uZ2VyIGltcGxlbWVudGVkICovCiAJLyogbnVtYmVyIG9mIGtlcm5lbCAocG9ydDApIHBhY2tldHMgcmVjZWl2ZWQgKi8KIAlfX3U2NCBzcHNfcG9ydDBwa3RzOwogCS8qIG51bWJlciBvZiAiZXRoZXJuZXQiIHBhY2tldHMgc2VudCBieSBkcml2ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGlhZy5jCmluZGV4IGE2OThmMTkuLmNmMjVjZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCmluZGV4IDA5YzVmZDguLjZjY2JhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKQEAgLTc0MCw3ICs3NDAsNyBAQAogCSAqIHBpb2F2YWlsIHVwZGF0ZXMgdG8gbWVtb3J5IHRvIHN0b3AuCiAJICovCiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zZW5kY3RybCwKLQkJCSBzZW5kb3JpZyAmIH5JUEFUSF9TX1BJT0JVRkFWQUlMVVBEKTsKKwkJCSBzZW5kb3JpZyAmIH5JTkZJTklQQVRIX1NfUElPQlVGQVZBSUxVUEQpOwogCXNlbmRvcmlnID0gaXBhdGhfcmVhZF9rcmVnNjQoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3Jfc2NyYXRjaCk7CiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zZW5kY3RybCwKIAkJCSBkZC0+aXBhdGhfc2VuZGN0cmwpOwpAQCAtMTYxNCw3ICsxNjE0LDcgQEAKICAqIGl0J3Mgc2FmZXIgdG8gYWx3YXlzIGRvIGl0LgogICogUElPQXZhaWwgYml0cyBhcmUgdXBkYXRlZCBieSB0aGUgY2hpcCBhcyBpZiBub3JtYWwgc2VuZCBoYWQgaGFwcGVuZWQuCiAgKi8KLXZvaWQgaXBhdGhfY2FuY2VsX3NlbmRzKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKK3ZvaWQgaXBhdGhfY2FuY2VsX3NlbmRzKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCwgaW50IHJlc3RvcmVfc2VuZGN0cmwpCiB7CiAJaXBhdGhfZGJnKCJDYW5jZWxsaW5nIGFsbCBpbi1wcm9ncmVzcyBzZW5kIGJ1ZmZlcnNcbiIpOwogCWRkLT5pcGF0aF9sYXN0Y2FuY2VsID0gamlmZmllcytIWi8yOyAvKiBza2lwIGFybWxhdW5jaCBlcnJzIGEgYml0ICovCkBAIC0xNjI3LDYgKzE2MjcsOSBAQAogCWlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NjcmF0Y2gpOwogCWlwYXRoX2Rpc2FybV9waW9idWZzKGRkLCAwLAogCQkodW5zaWduZWQpKGRkLT5pcGF0aF9waW9iY250MmsgKyBkZC0+aXBhdGhfcGlvYmNudDRrKSk7CisJaWYgKHJlc3RvcmVfc2VuZGN0cmwpIC8qIGVsc2UgZG9uZSBieSBjYWxsZXIgbGF0ZXIgKi8KKwkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zZW5kY3RybCwKKwkJCQkgZGQtPmlwYXRoX3NlbmRjdHJsKTsKIAogCS8qIGFuZCBhZ2FpbiwgYmUgc3VyZSBhbGwgaGF2ZSBoaXQgdGhlIGNoaXAgKi8KIAlpcGF0aF9yZWFkX2tyZWc2NChkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zY3JhdGNoKTsKQEAgLTE2NTUsNyArMTY1OCw3IEBACiAJLyogZmx1c2ggYWxsIHF1ZXVlZCBzZW5kcyB3aGVuIGdvaW5nIHRvIERPV04gb3IgSU5JVCwgdG8gYmUgc3VyZSB0aGF0CiAJICogdGhleSBkb24ndCBibG9jayBNQUQgcGFja2V0cyAqLwogCWlmICghbGlua2NtZCB8fCBsaW5rY21kID09IElORklOSVBBVEhfSUJDQ19MSU5LQ01EX0lOSVQpCi0JCWlwYXRoX2NhbmNlbF9zZW5kcyhkZCk7CisJCWlwYXRoX2NhbmNlbF9zZW5kcyhkZCwgMSk7CiAKIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2liY2N0cmwsCiAJCQkgZGQtPmlwYXRoX2liY2N0cmwgfCB3aGljaCk7CkBAIC0yMDAwLDcgKzIwMDMsNyBAQAogCiAJaXBhdGhfc2V0X2liX2xzdGF0ZShkZCwgSU5GSU5JUEFUSF9JQkNDX0xJTktJTklUQ01EX0RJU0FCTEUgPDwKIAkJCSAgICBJTkZJTklQQVRIX0lCQ0NfTElOS0lOSVRDTURfU0hJRlQpOwotCWlwYXRoX2NhbmNlbF9zZW5kcyhkZCk7CisJaXBhdGhfY2FuY2VsX3NlbmRzKGRkLCAwKTsKIAogCS8qIGRpc2FibGUgSUJDICovCiAJZGQtPmlwYXRoX2NvbnRyb2wgJj0gfklORklOSVBBVEhfQ19MSU5LRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMjAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTIwLmMKaW5kZXggOTg2OGNjZC4uNWI2YWM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMjAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjEyMC5jCkBAIC0zMjEsNiArMzIxLDggQEAKIAkJICAgICAgICA8PCBJTkZJTklQQVRIX0hXRV9UWEVNRU1QQVJJVFlFUlJfU0hJRlQpCiAKIHN0YXRpYyBpbnQgaXBhdGhfcGVfdHhlX3JlY292ZXIoc3RydWN0IGlwYXRoX2RldmRhdGEgKik7CitzdGF0aWMgdm9pZCBpcGF0aF9wZV9wdXRfdGlkXzIoc3RydWN0IGlwYXRoX2RldmRhdGEgKiwgdTY0IF9faW9tZW0gKiwKKwkJCSAgICAgICB1MzIsIHVuc2lnbmVkIGxvbmcpOwogCiAvKioKICAqIGlwYXRoX3BlX2hhbmRsZV9od2Vycm9ycyAtIGRpc3BsYXkgaGFyZHdhcmUgZXJyb3JzLgpAQCAtNTU1LDggKzU1NywxMSBAQAogCQlpcGF0aF9kZXZfZXJyKGRkLCAiVW5zdXBwb3J0ZWQgSW5maW5pUGF0aCBoYXJkd2FyZSByZXZpc2lvbiAldS4ldSFcbiIsCiAJCQkgICAgICBkZC0+aXBhdGhfbWFqcmV2LCBkZC0+aXBhdGhfbWlucmV2KTsKIAkJcmV0ID0gMTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZXQgPSAwOworCQlpZiAoZGQtPmlwYXRoX21pbnJldiA+PSAyKQorCQkJZGQtPmlwYXRoX2ZfcHV0X3RpZCA9IGlwYXRoX3BlX3B1dF90aWRfMjsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIyMCw3ICsxMjI1LDcgQEAKIAkJIHBvcnQgKiBkZC0+aXBhdGhfcmN2dGlkY250ICogc2l6ZW9mKCp0aWRiYXNlKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGQtPmlwYXRoX3JjdnRpZGNudDsgaSsrKQotCQlpcGF0aF9wZV9wdXRfdGlkKGRkLCAmdGlkYmFzZVtpXSwgUkNWSFFfUkNWX1RZUEVfRVhQRUNURUQsCisJCWRkLT5pcGF0aF9mX3B1dF90aWQoZGQsICZ0aWRiYXNlW2ldLCBSQ1ZIUV9SQ1ZfVFlQRV9FWFBFQ1RFRCwKIAkJCQkgdGlkaW52KTsKIAogCXRpZGJhc2UgPSAodTY0IF9faW9tZW0gKikKQEAgLTEyMjksNyArMTIzNCw3IEBACiAJCSBwb3J0ICogZGQtPmlwYXRoX3JjdmVncmNudCAqIHNpemVvZigqdGlkYmFzZSkpOwogCiAJZm9yIChpID0gMDsgaSA8IGRkLT5pcGF0aF9yY3ZlZ3JjbnQ7IGkrKykKLQkJaXBhdGhfcGVfcHV0X3RpZChkZCwgJnRpZGJhc2VbaV0sIFJDVkhRX1JDVl9UWVBFX0VBR0VSLAorCQlkZC0+aXBhdGhfZl9wdXRfdGlkKGRkLCAmdGlkYmFzZVtpXSwgUkNWSFFfUkNWX1RZUEVfRUFHRVIsCiAJCQkJIHRpZGludik7CiB9CiAKQEAgLTEzOTUsMTAgKzE0MDAsMTEgQEAKIAlkZC0+aXBhdGhfZl9xdWlldF9zZXJkZXMgPSBpcGF0aF9wZV9xdWlldF9zZXJkZXM7CiAJZGQtPmlwYXRoX2ZfYnJpbmd1cF9zZXJkZXMgPSBpcGF0aF9wZV9icmluZ3VwX3NlcmRlczsKIAlkZC0+aXBhdGhfZl9jbGVhcl90aWRzID0gaXBhdGhfcGVfY2xlYXJfdGlkczsKLQlpZiAoZGQtPmlwYXRoX21pbnJldiA+PSAyKQotCQlkZC0+aXBhdGhfZl9wdXRfdGlkID0gaXBhdGhfcGVfcHV0X3RpZF8yOwotCWVsc2UKLQkJZGQtPmlwYXRoX2ZfcHV0X3RpZCA9IGlwYXRoX3BlX3B1dF90aWQ7CisJLyoKKwkgKiB0aGlzIG1heSBnZXQgY2hhbmdlZCBhZnRlciB3ZSByZWFkIHRoZSBjaGlwIHJldmlzaW9uLAorCSAqIGJ1dCB3ZSBzdGFydCB3aXRoIHRoZSBzYWZlIHZlcnNpb24gZm9yIGFsbCByZXZzCisJICovCisJZGQtPmlwYXRoX2ZfcHV0X3RpZCA9IGlwYXRoX3BlX3B1dF90aWQ7CiAJZGQtPmlwYXRoX2ZfY2xlYW51cCA9IGlwYXRoX3NldHVwX3BlX2NsZWFudXA7CiAJZGQtPmlwYXRoX2Zfc2V0ZXh0bGVkID0gaXBhdGhfc2V0dXBfcGVfc2V0ZXh0bGVkOwogCWRkLT5pcGF0aF9mX2dldF9iYXNlX2luZm8gPSBpcGF0aF9wZV9nZXRfYmFzZV9pbmZvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2luaXRfY2hpcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2luaXRfY2hpcC5jCmluZGV4IDQ5OTUxZDUuLjlkZDBiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbml0X2NoaXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKQEAgLTc4Miw3ICs3ODIsNyBAQAogCSAqIEZvbGxvd3MgZWFybHlfaW5pdCBiZWNhdXNlIHNvbWUgY2hpcHMgaGF2ZSB0byBpbml0aWFsaXplCiAJICogUElPIGJ1ZmZlcnMgaW4gZWFybHlfaW5pdCB0byBhdm9pZCBmYWxzZSBwYXJpdHkgZXJyb3JzLgogCSAqLwotCWlwYXRoX2NhbmNlbF9zZW5kcyhkZCk7CisJaXBhdGhfY2FuY2VsX3NlbmRzKGRkLCAwKTsKIAogCS8qIGVhcmx5X2luaXQgc2V0cyByY3ZoZHJlbnRzaXplIGFuZCByY3ZoZHJzaXplLCBzbyB0aGlzIG11c3QgYmUKIAkgKiBkb25lIGFmdGVyIGVhcmx5X2luaXQgKi8KQEAgLTg1MSwxMyArODUxLDE0IEBACiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9od2Vycm1hc2ssCiAJCQkgZGQtPmlwYXRoX2h3ZXJybWFzayk7CiAKLQlkZC0+aXBhdGhfbWFza2VkZXJycyA9IGRkLT5pcGF0aF9pZ25vcmVkZXJyczsKIAkvKiBjbGVhciBhbGwgKi8KIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2Vycm9yY2xlYXIsIC0xTEwpOwogCS8qIGVuYWJsZSBlcnJvcnMgdGhhdCBhcmUgbWFza2VkLCBhdCBsZWFzdCB0aGlzIGZpcnN0IHRpbWUuICovCiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9lcnJvcm1hc2ssCiAJCQkgfmRkLT5pcGF0aF9tYXNrZWRlcnJzKTsKLQkvKiBjbGVhciBhbnkgaW50ZXJydXBzIHVwIHRvIHRoaXMgcG9pbnQgKGludHMgc3RpbGwgbm90IGVuYWJsZWQpICovCisJZGQtPmlwYXRoX2Vycm9ybWFzayA9IGlwYXRoX3JlYWRfa3JlZzY0KGRkLAorCQlkZC0+aXBhdGhfa3JlZ3MtPmtyX2Vycm9ybWFzayk7CisJLyogY2xlYXIgYW55IGludGVycnVwdHMgdXAgdG8gdGhpcyBwb2ludCAoaW50cyBzdGlsbCBub3QgZW5hYmxlZCkgKi8KIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2ludGNsZWFyLCAtMUxMKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYwppbmRleCAxZmQ5MWM1Li5iMjlmZTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbnRyLmMKQEAgLTMwMyw3ICszMDMsNyBAQAogCQkgKiBGbHVzaCBhbGwgcXVldWVkIHNlbmRzIHdoZW4gbGluayB3ZW50IHRvIERPV04gb3IgSU5JVCwKIAkJICogdG8gYmUgc3VyZSB0aGF0IHRoZXkgZG9uJ3QgYmxvY2sgU01BIGFuZCBvdGhlciBNQUQgcGFja2V0cwogCQkgKi8KLQkJaXBhdGhfY2FuY2VsX3NlbmRzKGRkKTsKKwkJaXBhdGhfY2FuY2VsX3NlbmRzKGRkLCAxKTsKIAl9CiAJZWxzZSBpZiAobHN0YXRlID09IElQQVRIX0lCU1RBVEVfSU5JVCB8fCBsc3RhdGUgPT0gSVBBVEhfSUJTVEFURV9BUk0gfHwKIAkgICAgbHN0YXRlID09IElQQVRIX0lCU1RBVEVfQUNUSVZFKSB7CkBAIC01MTcsMTAgKzUxNyw3IEBACiAKIAlzdXBwX21zZ3MgPSBoYW5kbGVfZnJlcXVlbnRfZXJyb3JzKGRkLCBlcnJzLCBtc2csICZub3ByaW50KTsKIAotCS8qCi0JICogZG9uJ3QgcmVwb3J0IGVycm9ycyB0aGF0IGFyZSBtYXNrZWQgKGluY2x1ZGVzIHRob3NlIGFsd2F5cwotCSAqIGlnbm9yZWQpCi0JICovCisJLyogZG9uJ3QgcmVwb3J0IGVycm9ycyB0aGF0IGFyZSBtYXNrZWQgKi8KIAllcnJzICY9IH5kZC0+aXBhdGhfbWFza2VkZXJyczsKIAogCS8qIGRvIHRoZXNlIGZpcnN0LCB0aGV5IGFyZSBtb3N0IGltcG9ydGFudCAqLwpAQCAtNTY2LDE5ICs1NjMsMTkgQEAKIAkJICogb25lcyBvbiB0aGlzIHBhcnRpY3VsYXIgaW50ZXJydXB0LCB3aGljaCBhbHNvIGlzbid0IGdyZWF0CiAJCSAqLwogCQlkZC0+aXBhdGhfbWFza2VkZXJycyB8PSBkZC0+aXBhdGhfbGFzdGVycm9yIHwgZXJyczsKKwkJZGQtPmlwYXRoX2Vycm9ybWFzayAmPSB+ZGQtPmlwYXRoX21hc2tlZGVycnM7CiAJCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfZXJyb3JtYXNrLAotCQkJCSB+ZGQtPmlwYXRoX21hc2tlZGVycnMpOworCQkJZGQtPmlwYXRoX2Vycm9ybWFzayk7CiAJCXNfaXNlcnIgPSBpcGF0aF9kZWNvZGVfZXJyKG1zZywgc2l6ZW9mIG1zZywKLQkJCQkgKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYgfmRkLT4KLQkJCQkgIGlwYXRoX2lnbm9yZWRlcnJzKSk7CisJCQlkZC0+aXBhdGhfbWFza2VkZXJycyk7CiAKLQkJaWYgKChkZC0+aXBhdGhfbWFza2VkZXJycyAmIH5kZC0+aXBhdGhfaWdub3JlZGVycnMpICYKKwkJaWYgKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYKIAkJCX4oSU5GSU5JUEFUSF9FX1JSQ1ZFR1JGVUxMIHwKIAkJCUlORklOSVBBVEhfRV9SUkNWSERSRlVMTCB8IElORklOSVBBVEhfRV9QS1RFUlJTKSkKIAkJCWlwYXRoX2Rldl9lcnIoZGQsICJUZW1wb3JhcmlseSBkaXNhYmxpbmcgIgogCQkJICAgICJlcnJvcihzKSAlbGx4IHJlcG9ydGluZzsgdG9vIGZyZXF1ZW50ICglcylcbiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYKLQkJCQl+ZGQtPmlwYXRoX2lnbm9yZWRlcnJzKSwgbXNnKTsKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRkLT5pcGF0aF9tYXNrZWRlcnJzLAorCQkJCW1zZyk7CiAJCWVsc2UgewogCQkJLyoKIAkJCSAqIHJjdmVncmZ1bGwgYW5kIHJjdmhkcnFmdWxsIGFyZSAibm9ybWFsIiwKQEAgLTc5MywxOSArNzkwLDIyIEBACiAJLyogZGlzYWJsZSBlcnJvciBpbnRlcnJ1cHRzLCB0byBhdm9pZCBjb25mdXNpb24gKi8KIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2Vycm9ybWFzaywgMFVMTCk7CiAKKwkvKiBhbHNvIGRpc2FibGUgaW50ZXJydXB0czsgZXJyb3JtYXNrIGlzIHNvbWV0aW1lcyBvdmVyd3JpdGVuICovCisJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9pbnRtYXNrLCAwVUxMKTsKKwogCS8qCiAJICogY2xlYXIgYWxsIHNlbmRzLCBiZWNhdXNlIHRoZXkgaGF2ZSBtYXkgYmVlbgogCSAqIGNvbXBsZXRlZCBieSB1c2VyY29kZSB3aGlsZSBpbiBmcmVlemUgbW9kZSwgYW5kCiAJICogdGhlcmVmb3JlIHdvdWxkIG5vdCBiZSBzZW50LCBhbmQgZXZlbnR1YWxseQogCSAqIG1pZ2h0IGNhdXNlIHRoZSBwcm9jZXNzIHRvIHJ1biBvdXQgb2YgYnVmcwogCSAqLwotCWlwYXRoX2NhbmNlbF9zZW5kcyhkZCk7CisJaXBhdGhfY2FuY2VsX3NlbmRzKGRkLCAwKTsKIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2NvbnRyb2wsCiAJCQkgZGQtPmlwYXRoX2NvbnRyb2wpOwogCiAJLyogZW5zdXJlIHBpbyBhdmFpbCB1cGRhdGVzIGNvbnRpbnVlICovCiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zZW5kY3RybCwKLQkJIGRkLT5pcGF0aF9zZW5kY3RybCAmIH5JUEFUSF9TX1BJT0JVRkFWQUlMVVBEKTsKKwkJIGRkLT5pcGF0aF9zZW5kY3RybCAmIH5JTkZJTklQQVRIX1NfUElPQlVGQVZBSUxVUEQpOwogCWlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NjcmF0Y2gpOwogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3Jfc2VuZGN0cmwsCiAJCSBkZC0+aXBhdGhfc2VuZGN0cmwpOwpAQCAtODE3LDcgKzgxNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IGRkLT5pcGF0aF9waW9hdnJlZ3M7IGkrKykgewogCQkvKiBkZWFsIHdpdGggNjExMCBjaGlwIGJ1ZyAqLwogCQlpbSA9IGkgPiAzID8gKChpJjEpID8gaS0xIDogaSsxKSA6IGk7Ci0JCXZhbCA9IGlwYXRoX3JlYWRfa3JlZzY0KGRkLCAweDEwMDArKGltKnNpemVvZih1NjQpKSk7CisJCXZhbCA9IGlwYXRoX3JlYWRfa3JlZzY0KGRkLCAoMHgxMDAwL3NpemVvZih1NjQpKStpbSk7CiAJCWRkLT5pcGF0aF9waW9hdmFpbHJlZ3NfZG1hW2ldID0gZGQtPmlwYXRoX3Bpb2F2YWlsc2hhZG93W2ldCiAJCQk9IGxlNjRfdG9fY3B1KHZhbCk7CiAJfQpAQCAtODMyLDcgKzgzMiw4IEBACiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9lcnJvcmNsZWFyLAogCQlFX1NQS1RfRVJSU19JR05PUkUpOwogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfZXJyb3JtYXNrLAotCQl+ZGQtPmlwYXRoX21hc2tlZGVycnMpOworCQlkZC0+aXBhdGhfZXJyb3JtYXNrKTsKKwlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2ludG1hc2ssIC0xTEwpOwogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfaW50Y2xlYXIsIDBVTEwpOwogfQogCkBAIC0xMDAyLDcgKzEwMDMsNiBAQAogCXUzMiBpc3RhdCwgY2hrMHJjdiA9IDA7CiAJaXBhdGhfZXJyX3QgZXN0YXQgPSAwOwogCWlycXJldHVybl90IHJldDsKLQl1MzIgb2xkaGVhZCwgY3VydGFpbDsKIAlzdGF0aWMgdW5zaWduZWQgdW5leHBlY3RlZCA9IDA7CiAJc3RhdGljIGNvbnN0IHUzMiBwb3J0MHJiaXRzID0gKDFVPDxJTkZJTklQQVRIX0lfUkNWQVZBSUxfU0hJRlQpIHwKIAkJICgxVTw8SU5GSU5JUEFUSF9JX1JDVlVSR19TSElGVCk7CkBAIC0xMDM1LDM2ICsxMDM1LDYgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCS8qCi0JICogV2UgdHJ5IHRvIGF2b2lkIHJlYWRpbmcgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIsIHNpbmNlCi0JICogdGhhdCdzIGEgUElPIHJlYWQsIGFuZCBzdGFsbHMgdGhlIHByb2Nlc3NvciBmb3IgdXAgdG8gYWJvdXQKLQkgKiB+MC4yNSB1c2VjLiBUaGUgaWRlYSBpcyB0aGF0IGlmIHdlIHByb2Nlc3NlZCBhIHBvcnQwIHBhY2tldCwKLQkgKiB3ZSBibGluZGx5IGNsZWFyIHRoZSAgcG9ydCAwIHJlY2VpdmUgaW50ZXJydXB0IGJpdHMsIGFuZCBub3RoaW5nCi0JICogZWxzZSwgdGhlbiByZXR1cm4uICBJZiBvdGhlciBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLCB0aGUgY2hpcAotCSAqIHdpbGwgcmUtaW50ZXJydXB0IHVzIGFzIHNvb24gYXMgd2Ugd3JpdGUgdGhlIGludGNsZWFyIHJlZ2lzdGVyLgotCSAqIFdlIHRoZW4gd29uJ3QgcHJvY2VzcyBhbnkgbW9yZSBrZXJuZWwgcGFja2V0cyAoaWYgbm90IHRoZSAybmQKLQkgKiB0aW1lLCB0aGVuIHRoZSAzcmQgb3IgNHRoKSBhbmQgd2UnbGwgdGhlbiBoYW5kbGUgdGhlIG90aGVyCi0JICogaW50ZXJydXB0cy4gICBXZSBjbGVhciB0aGUgaW50ZXJydXB0cyBmaXJzdCBzbyB0aGF0IHdlIGRvbid0Ci0JICogbG9zZSBpbnRyIGZvciBsYXRlciBwYWNrZXRzIHRoYXQgYXJyaXZlIHdoaWxlIHdlIGFyZSBwcm9jZXNzaW5nLgotCSAqLwotCW9sZGhlYWQgPSBkZC0+aXBhdGhfcG9ydDBoZWFkOwotCWN1cnRhaWwgPSAodTMyKWxlNjRfdG9fY3B1KCpkZC0+aXBhdGhfaGRycXRhaWxwdHIpOwotCWlmIChvbGRoZWFkICE9IGN1cnRhaWwpIHsKLQkJaWYgKGRkLT5pcGF0aF9mbGFncyAmIElQQVRIX0dQSU9fSU5UUikgewotCQkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9ncGlvX2NsZWFyLAotCQkJCQkgKHU2NCkgKDEgPDwgSVBBVEhfR1BJT19QT1JUMF9CSVQpKTsKLQkJCWlzdGF0ID0gcG9ydDByYml0cyB8IElORklOSVBBVEhfSV9HUElPOwotCQl9Ci0JCWVsc2UKLQkJCWlzdGF0ID0gcG9ydDByYml0czsKLQkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9pbnRjbGVhciwgaXN0YXQpOwotCQlpcGF0aF9rcmVjZWl2ZShkZCk7Ci0JCWlmIChvbGRoZWFkICE9IGRkLT5pcGF0aF9wb3J0MGhlYWQpIHsKLQkJCWlwYXRoX3N0YXRzLnNwc19mYXN0cmN2aW50Kys7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KIAlpc3RhdCA9IGlwYXRoX3JlYWRfa3JlZzMyKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2ludHN0YXR1cyk7CiAKIAlpZiAodW5saWtlbHkoIWlzdGF0KSkgewpAQCAtMTIyNSw3ICsxMTk1LDYgQEAKIAkJaGFuZGxlX2xheWVyX3Bpb2F2YWlsKGRkKTsKIAl9CiAKLWRvbmU6CiAJcmV0ID0gSVJRX0hBTkRMRUQ7CiAKIGJhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2VybmVsLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2VybmVsLmgKaW5kZXggYWNlNjNlZi4uN2E3OTY2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tlcm5lbC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXJuZWwuaApAQCAtMjYxLDE4ICsyNjEsMTAgQEAKIAkgKiBsaW1pdGluZyBvZiBod2Vycm9yIHJlcG9ydGluZwogCSAqLwogCWlwYXRoX2Vycl90IGlwYXRoX2xhc3Rod2Vycm9yOwotCS8qCi0JICogZXJyb3JzIG1hc2tlZCBiZWNhdXNlIHRoZXkgb2NjdXIgdG9vIGZhc3QsIGFsc28gaW5jbHVkZXMgZXJyb3JzCi0JICogdGhhdCBhcmUgYWx3YXlzIGlnbm9yZWQgKGlwYXRoX2lnbm9yZWRlcnJzKQotCSAqLworCS8qIGVycm9ycyBtYXNrZWQgYmVjYXVzZSB0aGV5IG9jY3VyIHRvbyBmYXN0ICovCiAJaXBhdGhfZXJyX3QgaXBhdGhfbWFza2VkZXJyczsKIAkvKiB0aW1lIGluIGppZmZpZXMgYXQgd2hpY2ggdG8gcmUtZW5hYmxlIG1hc2tlZGVycnMgKi8KIAl1bnNpZ25lZCBsb25nIGlwYXRoX3VubWFza3RpbWU7Ci0JLyoKLQkgKiBlcnJvcnMgYWx3YXlzIGlnbm9yZWQgKG1hc2tlZCksIGF0IGxlYXN0IGZvciBhIGdpdmVuCi0JICogY2hpcC9kZXZpY2UsIGJlY2F1c2UgdGhleSBhcmUgd3Jvbmcgb3Igbm90IHVzZWZ1bAotCSAqLwotCWlwYXRoX2Vycl90IGlwYXRoX2lnbm9yZWRlcnJzOwogCS8qIGNvdW50IG9mIGVncmZ1bGwgZXJyb3JzLCBjb21iaW5lZCBmb3IgYWxsIHBvcnRzICovCiAJdTY0IGlwYXRoX2xhc3RfdGlkZnVsbDsKIAkvKiBmb3IgaXBhdGhfcWNoZWNrKCkgKi8KQEAgLTQzNiw2ICs0MjgsNyBAQAogCXU2NCBpcGF0aF9sYXN0aWJjc3RhdDsKIAkvKiBod2Vycm1hc2sgc2hhZG93ICovCiAJaXBhdGhfZXJyX3QgaXBhdGhfaHdlcnJtYXNrOworCWlwYXRoX2Vycl90IGlwYXRoX2Vycm9ybWFzazsgLyogZXJyb3JtYXNrIHNoYWRvdyAqLwogCS8qIGludGVycnVwdCBjb25maWcgcmVnIHNoYWRvdyAqLwogCXU2NCBpcGF0aF9pbnRjb25maWc7CiAJLyoga3Jfc2VuZHBpb2J1ZmJhc2UgdmFsdWUgKi8KQEAgLTY4Myw3ICs2NzYsNyBAQAogCiB2b2lkIGlwYXRoX2Rpc2FybV9waW9idWZzKHN0cnVjdCBpcGF0aF9kZXZkYXRhICosIHVuc2lnbmVkIGZpcnN0LAogCQkJICB1bnNpZ25lZCBjbnQpOwotdm9pZCBpcGF0aF9jYW5jZWxfc2VuZHMoc3RydWN0IGlwYXRoX2RldmRhdGEgKik7Cit2b2lkIGlwYXRoX2NhbmNlbF9zZW5kcyhzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqLCBpbnQpOwogCiBpbnQgaXBhdGhfY3JlYXRlX3JjdmhkcnEoc3RydWN0IGlwYXRoX2RldmRhdGEgKiwgc3RydWN0IGlwYXRoX3BvcnRkYXRhICopOwogdm9pZCBpcGF0aF9mcmVlX3BkZGF0YShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqLCBzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3RhdHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zdGF0cy5jCmluZGV4IDczZWQxN2QuLmJhZTRmNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zdGF0cy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zdGF0cy5jCkBAIC0xOTYsNiArMTk2LDQ1IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBpcGF0aF9jaGtfZXJyb3JtYXNrKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKK3sKKwlzdGF0aWMgdTMyIGZpeGVkOworCXUzMiBjdHJsOworCXVuc2lnbmVkIGxvbmcgZXJyb3JtYXNrOworCXVuc2lnbmVkIGxvbmcgaHdlcnJzOworCisJaWYgKCFkZC0+aXBhdGhfZXJyb3JtYXNrIHx8ICEoZGQtPmlwYXRoX2ZsYWdzICYgSVBBVEhfSU5JVFRFRCkpCisJCXJldHVybjsKKworCWVycm9ybWFzayA9IGlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2Vycm9ybWFzayk7CisKKwlpZiAoZXJyb3JtYXNrID09IGRkLT5pcGF0aF9lcnJvcm1hc2spCisJCXJldHVybjsKKwlmaXhlZCsrOworCisJaHdlcnJzID0gaXBhdGhfcmVhZF9rcmVnNjQoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfaHdlcnJzdGF0dXMpOworCWN0cmwgPSBpcGF0aF9yZWFkX2tyZWczMihkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9jb250cm9sKTsKKworCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfZXJyb3JtYXNrLAorCQlkZC0+aXBhdGhfZXJyb3JtYXNrKTsKKworCWlmICgoaHdlcnJzICYgZGQtPmlwYXRoX2h3ZXJybWFzaykgfHwKKwkJKGN0cmwgJiBJTkZJTklQQVRIX0NfRlJFRVpFTU9ERSkpIHsKKwkJLyogZm9yY2UgcmUtaW50ZXJydXB0IG9mIHBlbmRpbmcgZXZlbnRzLCBqdXN0IGluIGNhc2UgKi8KKwkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9od2VycmNsZWFyLCAwVUxMKTsKKwkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9lcnJvcmNsZWFyLCAwVUxMKTsKKwkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9pbnRjbGVhciwgMFVMTCk7CisJCWRldl9pbmZvKCZkZC0+cGNpZGV2LT5kZXYsCisJCQkiZXJyb3JtYXNrIGZpeGVkKCV1KSAlbHggLT4gJWx4LCBjdHJsICV4IGh3ZXJyICVseFxuIiwKKwkJCWZpeGVkLCBlcnJvcm1hc2ssICh1bnNpZ25lZCBsb25nKWRkLT5pcGF0aF9lcnJvcm1hc2ssCisJCQljdHJsLCBod2VycnMpOworCX0gZWxzZQorCQlpcGF0aF9kYmcoImVycm9ybWFzayBmaXhlZCgldSkgJWx4IC0+ICVseCwgbm8gZnJlZXplXG4iLAorCQkJZml4ZWQsIGVycm9ybWFzaywKKwkJCSh1bnNpZ25lZCBsb25nKWRkLT5pcGF0aF9lcnJvcm1hc2spOworfQorCisKIC8qKgogICogaXBhdGhfZ2V0X2Zhc3RzdGF0cyAtIGdldCB3b3JkIGNvdW50ZXJzIGZyb20gY2hpcCBiZWZvcmUgdGhleSBvdmVyZmxvdwogICogQG9wYXF1ZSAtIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgaW5maW5pcGF0aCBkZXZpY2UgaXBhdGhfZGV2ZGF0YQpAQCAtMjUxLDE0ICsyOTAsMTMgQEAKIAkJZGQtPmlwYXRoX2xhc3RlcnJvciA9IDA7CiAJaWYgKGRkLT5pcGF0aF9sYXN0aHdlcnJvcikKIAkJZGQtPmlwYXRoX2xhc3Rod2Vycm9yID0gMDsKLQlpZiAoKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYgfmRkLT5pcGF0aF9pZ25vcmVkZXJycykKKwlpZiAoZGQtPmlwYXRoX21hc2tlZGVycnMKIAkgICAgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBkZC0+aXBhdGhfdW5tYXNrdGltZSkpIHsKIAkJY2hhciBlYnVmWzI1Nl07CiAJCWludCBpc2VycjsKIAkJaXNlcnIgPSBpcGF0aF9kZWNvZGVfZXJyKGVidWYsIHNpemVvZiBlYnVmLAotCQkJCSAoZGQtPmlwYXRoX21hc2tlZGVycnMgJiB+ZGQtPgotCQkJCSAgaXBhdGhfaWdub3JlZGVycnMpKTsKLQkJaWYgKChkZC0+aXBhdGhfbWFza2VkZXJycyAmIH5kZC0+aXBhdGhfaWdub3JlZGVycnMpICYKKwkJCWRkLT5pcGF0aF9tYXNrZWRlcnJzKTsKKwkJaWYgKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYKIAkJCQl+KElORklOSVBBVEhfRV9SUkNWRUdSRlVMTCB8IElORklOSVBBVEhfRV9SUkNWSERSRlVMTCB8CiAJCQkJSU5GSU5JUEFUSF9FX1BLVEVSUlMgKSkKIAkJCWlwYXRoX2Rldl9lcnIoZGQsICJSZS1lbmFibGluZyBtYXNrZWQgZXJyb3JzICIKQEAgLTI3OCw5ICszMTYsMTIgQEAKIAkJCQlpcGF0aF9jZGJnKEVSUlBLVCwgIlJlLWVuYWJsaW5nIHBhY2tldCIKIAkJCQkJCSIgcHJvYmxlbSBpbnRlcnJ1cHQgKCVzKVxuIiwgZWJ1Zik7CiAJCX0KLQkJZGQtPmlwYXRoX21hc2tlZGVycnMgPSBkZC0+aXBhdGhfaWdub3JlZGVycnM7CisKKwkJLyogcmUtZW5hYmxlIG1hc2tlZCBlcnJvcnMgKi8KKwkJZGQtPmlwYXRoX2Vycm9ybWFzayB8PSBkZC0+aXBhdGhfbWFza2VkZXJyczsKIAkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9lcnJvcm1hc2ssCi0JCQkJIH5kZC0+aXBhdGhfbWFza2VkZXJycyk7CisJCQlkZC0+aXBhdGhfZXJyb3JtYXNrKTsKKwkJZGQtPmlwYXRoX21hc2tlZGVycnMgPSAwOwogCX0KIAogCS8qIGxpbWl0IHFmdWxsIG1lc3NhZ2VzIHRvIH5vbmUgcGVyIG1pbnV0ZSBwZXIgcG9ydCAqLwpAQCAtMjk0LDYgKzMzNSw3IEBACiAJCX0KIAl9CiAKKwlpcGF0aF9jaGtfZXJyb3JtYXNrKGRkKTsKIGRvbmU6CiAJbW9kX3RpbWVyKCZkZC0+aXBhdGhfc3RhdHNfdGltZXIsIGppZmZpZXMgKyBIWiAqIDUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKaW5kZXggZjYzMTVkZi4uYmEwNDI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCkBAIC0xMjA5LDcgKzEyMDksNiBAQAogCW1lbWNweShkc2VnLT5hdiwgJnRvX21haCh3ci0+d3IudWQuYWgpLT5hdiwgc2l6ZW9mIChzdHJ1Y3QgbWx4NF9hdikpOwogCWRzZWctPmRxcG4gPSBjcHVfdG9fYmUzMih3ci0+d3IudWQucmVtb3RlX3Fwbik7CiAJZHNlZy0+cWtleSA9IGNwdV90b19iZTMyKHdyLT53ci51ZC5yZW1vdGVfcWtleSk7Ci0KIH0KIAogc3RhdGljIHZvaWQgc2V0X2RhdGFfc2VnKHN0cnVjdCBtbHg0X3dxZV9kYXRhX3NlZyAqZHNlZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCmluZGV4IDVkYjMxNDMuLmJhZDhkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYwpAQCAtNTQ4LDYgKzU0OCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGlzY3NpX2lzZXJfc2h0ID0geworCS5tb2R1bGUgICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiaVNDU0kgSW5pdGlhdG9yIG92ZXIgaVNFUiwgdi4iIERSVl9WRVIsCiAJLnF1ZXVlY29tbWFuZCAgICAgICAgICAgPSBpc2NzaV9xdWV1ZWNvbW1hbmQsCiAJLmNhbl9xdWV1ZQkJPSBJU0NTSV9ERUZfWE1JVF9DTURTX01BWCAtIDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYXRsYXNfYnRucy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2F0bGFzX2J0bnMuYwppbmRleCAwYWNjM2ExLi5lNDNlOTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvYXRsYXNfYnRucy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGxhc19idG5zLmMKQEAgLTMxLDcgKzMxLDYgQEAKIAogI2RlZmluZSBBQ1BJX0FUTEFTX05BTUUJCQkiQXRsYXMgQUNQSSIKICNkZWZpbmUgQUNQSV9BVExBU19DTEFTUwkJIkF0bGFzIgotI2RlZmluZSBBQ1BJX0FUTEFTX0JVVFRPTl9ISUQJCSJBU0lNMDAwMCIKIAogc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIApAQCAtMTMwLDEwICsxMjksMTYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGF0bGFzX2RldmljZV9pZHNbXSA9IHsKKwl7IkFTSU0wMDAwIiwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGF0bGFzX2RldmljZV9pZHMpOworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGF0bGFzX2FjcGlfZHJpdmVyID0gewogCS5uYW1lCT0gQUNQSV9BVExBU19OQU1FLAogCS5jbGFzcwk9IEFDUElfQVRMQVNfQ0xBU1MsCi0JLmlkcwk9IEFDUElfQVRMQVNfQlVUVE9OX0hJRCwKKwkuaWRzCT0gYXRsYXNfZGV2aWNlX2lkcywKIAkub3BzCT0gewogCQkuYWRkCT0gYXRsYXNfYWNwaV9idXR0b25fYWRkLAogCQkucmVtb3ZlCT0gYXRsYXNfYWNwaV9idXR0b25fcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnCmluZGV4IGFkZWY0NDcuLjVjZTYzMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcKQEAgLTIxLDcgKzIxLDcgQEAKIGNvbmZpZyBTRVJJT19JODA0MgogCXRyaXN0YXRlICJpODA0MiBQQyBLZXlib2FyZCBjb250cm9sbGVyIiBpZiBFTUJFRERFRCB8fCAhWDg2CiAJZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiAhUEFSSVNDICYmICghQVJNIHx8IEFSQ0hfU0hBUksgfHwgRk9PVEJSSURHRV9IT1NUKSAmJiAhTTY4SworCWRlcGVuZHMgb24gIVBBUklTQyAmJiAoIUFSTSB8fCBBUkNIX1NIQVJLIHx8IEZPT1RCUklER0VfSE9TVCkgJiYgIU02OEsgJiYgIUJGSU4KIAktLS1oZWxwLS0tCiAJICBpODA0MiBpcyB0aGUgY2hpcCBvdmVyIHdoaWNoIHRoZSBzdGFuZGFyZCBBVCBrZXlib2FyZCBhbmQgUFMvMgogCSAgbW91c2UgYXJlIGNvbm5lY3RlZCB0byB0aGUgY29tcHV0ZXIuIElmIHlvdSB1c2UgdGhlc2UgZGV2aWNlcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL2t2bV9tYWluLmMgYi9kcml2ZXJzL2t2bS9rdm1fbWFpbi5jCmluZGV4IGJjYmU2ODMuLjk2ODU2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMva3ZtL2t2bV9tYWluLmMKKysrIGIvZHJpdmVycy9rdm0va3ZtX21haW4uYwpAQCAtMjk3LDkgKzI5Nyw2IEBACiAJa3ZtX2lvX2J1c19pbml0KCZrdm0tPnBpb19idXMpOwogCXNwaW5fbG9ja19pbml0KCZrdm0tPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZrdm0tPmFjdGl2ZV9tbXVfcGFnZXMpOwotCXNwaW5fbG9jaygma3ZtX2xvY2spOwotCWxpc3RfYWRkKCZrdm0tPnZtX2xpc3QsICZ2bV9saXN0KTsKLQlzcGluX3VubG9jaygma3ZtX2xvY2spOwogCWt2bV9pb19idXNfaW5pdCgma3ZtLT5tbWlvX2J1cyk7CiAJZm9yIChpID0gMDsgaSA8IEtWTV9NQVhfVkNQVVM7ICsraSkgewogCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSAma3ZtLT52Y3B1c1tpXTsKQEAgLTMwOSw2ICszMDYsOSBAQAogCQl2Y3B1LT5rdm0gPSBrdm07CiAJCXZjcHUtPm1tdS5yb290X2hwYSA9IElOVkFMSURfUEFHRTsKIAl9CisJc3Bpbl9sb2NrKCZrdm1fbG9jayk7CisJbGlzdF9hZGQoJmt2bS0+dm1fbGlzdCwgJnZtX2xpc3QpOworCXNwaW5fdW5sb2NrKCZrdm1fbG9jayk7CiAJcmV0dXJuIGt2bTsKIH0KIApAQCAtMTA3MCwxOCArMTA3MCwxNiBAQAogCQlyZXR1cm4gMDsKIAltYXJrX3BhZ2VfZGlydHkodmNwdS0+a3ZtLCBncGEgPj4gUEFHRV9TSElGVCk7CiAJdmlydCA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQlpZiAobWVtY21wKHZpcnQgKyBvZmZzZXRfaW5fcGFnZShncGEpLCB2YWwsIGJ5dGVzKSkgewotCQlrdm1fbW11X3B0ZV93cml0ZSh2Y3B1LCBncGEsIHZpcnQgKyBvZmZzZXQsIHZhbCwgYnl0ZXMpOwotCQltZW1jcHkodmlydCArIG9mZnNldF9pbl9wYWdlKGdwYSksIHZhbCwgYnl0ZXMpOwotCX0KKwlrdm1fbW11X3B0ZV93cml0ZSh2Y3B1LCBncGEsIHZpcnQgKyBvZmZzZXQsIHZhbCwgYnl0ZXMpOworCW1lbWNweSh2aXJ0ICsgb2Zmc2V0X2luX3BhZ2UoZ3BhKSwgdmFsLCBieXRlcyk7CiAJa3VubWFwX2F0b21pYyh2aXJ0LCBLTV9VU0VSMCk7CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQodW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCSAgIGNvbnN0IHZvaWQgKnZhbCwKLQkJCQkgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkJICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCitzdGF0aWMgaW50IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCQkgICBjb25zdCB2b2lkICp2YWwsCisJCQkJCSAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCQkJICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7CiAJc3RydWN0IGt2bV92Y3B1ICAgICAgKnZjcHUgPSBjdHh0LT52Y3B1OwogCXN0cnVjdCBrdm1faW9fZGV2aWNlICptbWlvX2RldjsKQEAgLTExMTMsNiArMTExMSwyNiBAQAogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogfQogCitzdGF0aWMgaW50IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICBjb25zdCB2b2lkICp2YWwsCisJCQkJICAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCSAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCS8qIENyb3NzaW5nIGEgcGFnZSBib3VuZGFyeT8gKi8KKwlpZiAoKChhZGRyICsgYnl0ZXMgLSAxKSBeIGFkZHIpICYgUEFHRV9NQVNLKSB7CisJCWludCByYywgbm93OworCisJCW5vdyA9IC1hZGRyICYgflBBR0VfTUFTSzsKKwkJcmMgPSBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZF9vbmVwYWdlKGFkZHIsIHZhbCwgbm93LCBjdHh0KTsKKwkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCisJCQlyZXR1cm4gcmM7CisJCWFkZHIgKz0gbm93OworCQl2YWwgKz0gbm93OworCQlieXRlcyAtPSBub3c7CisJfQorCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZF9vbmVwYWdlKGFkZHIsIHZhbCwgYnl0ZXMsIGN0eHQpOworfQorCiBzdGF0aWMgaW50IGVtdWxhdG9yX2NtcHhjaGdfZW11bGF0ZWQodW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgY29uc3Qgdm9pZCAqb2xkLAogCQkJCSAgICAgY29uc3Qgdm9pZCAqbmV3LApAQCAtMjQxNCw5ICsyNDMyLDkgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChlbnRyeSAmJiAoZW50cnktPmVkeCAmIEVGRVJfTlgpICYmICEoZWZlciAmIEVGRVJfTlgpKSB7CisJaWYgKGVudHJ5ICYmIChlbnRyeS0+ZWR4ICYgKDEgPDwgMjApKSAmJiAhKGVmZXIgJiBFRkVSX05YKSkgewogCQllbnRyeS0+ZWR4ICY9IH4oMSA8PCAyMCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIjogZ3Vlc3QgTlggY2FwYWJpbGl0eSByZW1vdmVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBndWVzdCBOWCBjYXBhYmlsaXR5IHJlbW92ZWRcbiIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0veDg2X2VtdWxhdGUuYyBiL2RyaXZlcnMva3ZtL3g4Nl9lbXVsYXRlLmMKaW5kZXggMWI4MDBmYy4uMWY5NzljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9rdm0veDg2X2VtdWxhdGUuYworKysgYi9kcml2ZXJzL2t2bS94ODZfZW11bGF0ZS5jCkBAIC0xMTc4LDYgKzExNzgsOCBAQAogdHdvYnl0ZV9pbnNuOgogCXN3aXRjaCAoYikgewogCWNhc2UgMHgwMTogLyogbGdkdCwgbGlkdCwgbG1zdyAqLworCQkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KKwkJbm9fd2IgPSAxOwogCQlzd2l0Y2ggKG1vZHJtX3JlZykgewogCQkJdTE2IHNpemU7CiAJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9LY29uZmlnIGIvZHJpdmVycy9sZ3Vlc3QvS2NvbmZpZwppbmRleCA0M2Q5MDFmLi44ODgyMDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGd1ZXN0L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgTEdVRVNUCiAJdHJpc3RhdGUgIkxpbnV4IGh5cGVydmlzb3IgZXhhbXBsZSBjb2RlIgotCWRlcGVuZHMgb24gWDg2ICYmIFBBUkFWSVJUICYmIE5FVCAmJiBFWFBFUklNRU5UQUwgJiYgIVg4Nl9QQUUKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQVJBVklSVCAmJiBFWFBFUklNRU5UQUwgJiYgIVg4Nl9QQUUKIAlzZWxlY3QgTEdVRVNUX0dVRVNUCiAJc2VsZWN0IEhWQ19EUklWRVIKIAktLS1oZWxwLS0tCkBAIC0xOCwzICsxOCwxMSBAQAogCSAgVGhlIGd1ZXN0IG5lZWRzIGNvZGUgYnVpbHQtaW4sIGV2ZW4gaWYgdGhlIGhvc3QgaGFzIGxndWVzdAogCSAgc3VwcG9ydCBhcyBhIG1vZHVsZS4gIFRoZSBkcml2ZXJzIGFyZSB0aW55LCBzbyB3ZSBidWlsZCB0aGVtCiAJICBpbiB0b28uCisKK2NvbmZpZyBMR1VFU1RfTkVUCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIExHVUVTVF9HVUVTVCAmJiBORVQKKworY29uZmlnIExHVUVTVF9CTE9DSworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBMR1VFU1RfR1VFU1QgJiYgQkxPQ0sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L01ha2VmaWxlIGIvZHJpdmVycy9sZ3Vlc3QvTWFrZWZpbGUKaW5kZXggNTUzODJjNy4uZTUwNDc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9sZ3Vlc3QvTWFrZWZpbGUKQEAgLTUsMyArNSwxNSBAQAogb2JqLSQoQ09ORklHX0xHVUVTVCkJKz0gbGcubwogbGcteSA6PSBjb3JlLm8gaHlwZXJjYWxscy5vIHBhZ2VfdGFibGVzLm8gaW50ZXJydXB0c19hbmRfdHJhcHMubyBcCiAJc2VnbWVudHMubyBpby5vIGxndWVzdF91c2VyLm8gc3dpdGNoZXIubworCitQcmVwYXJhdGlvbiBQcmVwYXJhdGlvbiE6IFBSRUZJWD1QCitHdWVzdDogUFJFRklYPUcKK0RyaXZlcnM6IFBSRUZJWD1ECitMYXVuY2hlcjogUFJFRklYPUwKK0hvc3Q6IFBSRUZJWD1ICitTd2l0Y2hlcjogUFJFRklYPVMKK01hc3Rlcnk6IFBSRUZJWD1NCitCZWVyOgorCUBmb3IgZiBpbiBQcmVwYXJhdGlvbiBHdWVzdCBEcml2ZXJzIExhdW5jaGVyIEhvc3QgU3dpdGNoZXIgTWFzdGVyeTsgZG8gZWNobyAiez09LSAkJGYgLT09fSI7IG1ha2UgLXMgJCRmOyBkb25lOyBlY2hvICJ7PT0tPT19IgorUHJlcGFyYXRpb24gUHJlcGFyYXRpb24hIEd1ZXN0IERyaXZlcnMgTGF1bmNoZXIgSG9zdCBTd2l0Y2hlciBNYXN0ZXJ5OgorCUBzaCAuLi8uLi9Eb2N1bWVudGF0aW9uL2xndWVzdC9leHRyYWN0ICQoUFJFRklYKSBgZmluZCAuLi8uLi8qIC1uYW1lICcqLltjaFNdJyAtd2hvbGVuYW1lICcqbGd1ZXN0KidgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9SRUFETUUgYi9kcml2ZXJzL2xndWVzdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkYjM5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGd1ZXN0L1JFQURNRQpAQCAtMCwwICsxLDQ3IEBACitXZWxjb21lLCBmcmllbmQgcmVhZGVyLCB0byBsZ3Vlc3QuCisKK0xndWVzdCBpcyBhbiBhZHZlbnR1cmUsIHdpdGggeW91LCB0aGUgcmVhZGVyLCBhcyBIZXJvLiAgSSBjYW4ndCB0aGluayBvZiBtYW55Cis1MDAwLWxpbmUgcHJvamVjdHMgd2hpY2ggb2ZmZXIgYm90aCBzdWNoIGNhcGFiaWxpdHkgYW5kIGdsaW1wc2VzIG9mIGZ1dHVyZQorcG90ZW50aWFsOyBpdCBpcyBhbiBleGNpdGluZyB0aW1lIHRvIGJlIGRlbHZpbmcgaW50byB0aGUgc291cmNlIQorCitCdXQgYmUgd2FybmVkOyB0aGlzIGlzIGFuIGFyZHVvdXMgam91cm5leSBvZiBzZXZlcmFsIGhvdXJzIG9yIG1vcmUhICBBbmQgYXMgd2UKK2tub3csIGFsbCB0cnVlIEhlcm9lcyBhcmUgZHJpdmVuIGJ5IGEgTm9ibGUgR29hbC4gIFRodXMgSSBvZmZlciBhIEJlZXIgKG9yCitlcXVpdmFsZW50KSB0byBhbnlvbmUgSSBtZWV0IHdobyBoYXMgY29tcGxldGVkIHRoaXMgZG9jdW1lbnRhdGlvbi4KKworU28gZ2V0IGNvbWZvcnRhYmxlIGFuZCBrZWVwIHlvdXIgd2l0cyBhYm91dCB5b3UgKGJvdGggcXVpY2sgYW5kIGh1bW9yb3VzKS4KK0Fsb25nIHlvdXIgd2F5IHRvIHRoZSBOb2JsZSBHb2FsLCB5b3Ugd2lsbCBhbHNvIGdhaW4gbWFzdGVybHkgaW5zaWdodCBpbnRvCitsZ3Vlc3QsIGFuZCBoeXBlcnZpc29ycyBhbmQgeDg2IHZpcnR1YWxpemF0aW9uIGluIGdlbmVyYWwuCisKK091ciBRdWVzdCBpcyBpbiBzZXZlbiBwYXJ0czogKGJlc3QgcmVhZCB3aXRoIEMgaGlnaGxpZ2h0aW5nIHR1cm5lZCBvbikKKworSSkgUHJlcGFyYXRpb24KKwktIEluIHdoaWNoIG91ciBwb3RlbnRpYWwgaGVybyBpcyBmbG93biBxdWlja2x5IG92ZXIgdGhlIGxhbmRzY2FwZSBmb3IgYQorCSAgdGFzdGUgb2YgaXRzIHNjb3BlLiAgU3VpdGFibGUgZm9yIHRoZSBhcm1jaGFpciBjb2RlcnMgYW5kIG90aGVyIHN1Y2gKKwkgIHBlcnNvbnMgb2YgZmFpbnQgY29uc3RpdHV0aW9uLgorCitJSSkgR3Vlc3QKKwktIFdoZXJlIHdlIGVuY291bnRlciB0aGUgZmlyc3QgdGFudGFsaXNpbmcgd2lzcHMgb2YgY29kZSwgYW5kIGNvbWUgdG8KKwkgIHVuZGVyc3RhbmQgdGhlIGRldGFpbHMgb2YgdGhlIGxpZmUgb2YgYSBHdWVzdCBrZXJuZWwuCisKK0lJSSkgRHJpdmVycworCS0gV2hlcmVieSB0aGUgR3Vlc3QgZmluZHMgaXRzIHZvaWNlIGFuZCBiZWNvbWUgdXNlZnVsLCBhbmQgb3VyCisJICB1bmRlcnN0YW5kaW5nIG9mIHRoZSBHdWVzdCBpcyBjb21wbGV0ZWQuCisKK0lWKSBMYXVuY2hlcgorCS0gV2hlcmUgd2UgdHJhY2UgYmFjayB0byB0aGUgY3JlYXRpb24gb2YgdGhlIEd1ZXN0LCBhbmQgdGh1cyBiZWdpbiBvdXIKKwkgIHVuZGVyc3RhbmRpbmcgb2YgdGhlIEhvc3QuCisKK1YpIEhvc3QKKwktIFdoZXJlIHdlIG1hc3RlciB0aGUgSG9zdCBjb2RlLCB0aHJvdWdoIGEgbG9uZyBhbmQgdG9ydHVvdXMgam91cm5leS4KKwkgIEluZGVlZCwgaXQgaXMgaGVyZSB0aGF0IG91ciBoZXJvIGlzIHRlc3RlZCBpbiB0aGUgQml0IG9mIERlc3BhaXIuCisKK1ZJKSBTd2l0Y2hlcgorCS0gV2hlcmUgb3VyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVydHdpbmVkIG5hdHVyZSBvZiBHdWVzdHMgYW5kIEhvc3RzCisJICBpcyBjb21wbGV0ZWQuCisKK1ZJSSkgTWFzdGVyeQorCS0gV2hlcmUgb3VyIGZ1bGx5IGZsZWRnZWQgaGVybyBncmFwcGxlcyB3aXRoIHRoZSBHcmVhdCBRdWVzdGlvbjoKKwkgICJXaGF0IG5leHQ/IgorCittYWtlIFByZXBhcmF0aW9uIQorUnVzdHkgUnVzc2VsbC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYyBiL2RyaXZlcnMvbGd1ZXN0L2NvcmUuYwppbmRleCBjZTkwOWVjLi4wYTQ2ZTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9jb3JlLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvY29yZS5jCkBAIC0xLDUgKzEsOCBAQAotLyogV29ybGQncyBzaW1wbGVzdCBoeXBlcnZpc29yLCB0byB0ZXN0IHBhcmF2aXJ0X29wcyBhbmQgc2hvdwotICogdW5iZWxpZXZlcnMgdGhhdCB2aXJ0dWFsaXphdGlvbiBpcyB0aGUgZnV0dXJlLiAgUGx1cywgaXQncyBmdW4hICovCisvKlA6NDAwIFRoaXMgY29udGFpbnMgcnVuX2d1ZXN0KCkgd2hpY2ggYWN0dWFsbHkgY2FsbHMgaW50byB0aGUgSG9zdDwtPkd1ZXN0CisgKiBTd2l0Y2hlciBhbmQgYW5hbHl6ZXMgdGhlIHJldHVybiwgc3VjaCBhcyBkZXRlcm1pbmluZyBpZiB0aGUgR3Vlc3Qgd2FudHMgdGhlCisgKiBIb3N0IHRvIGRvIHNvbWV0aGluZy4gIFRoaXMgZmlsZSBhbHNvIGNvbnRhaW5zIHVzZWZ1bCBoZWxwZXIgcm91dGluZXMsIGFuZCBhCisgKiBjb3VwbGUgb2Ygbm9uLW9idmlvdXMgc2V0dXAgYW5kIHRlYXJkb3duIHBpZWNlcyB3aGljaCB3ZXJlIGltcGxlbWVudGVkIGFmdGVyCisgKiBkYXlzIG9mIGRlYnVnZ2luZyBwYWluLiA6Ki8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KQEAgLTYxLDExICs2NCwzMyBAQAogCQkgIChTV0lUQ0hFUl9BRERSICsgU0hBUkVEX1NXSVRDSEVSX1BBR0VTKlBBR0VfU0laRSkpW2NwdV0pOwogfQogCisvKkg6MDEwIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBTd2l0Y2hlciBhdCBhIGhpZ2ggdmlydHVhbCBhZGRyZXNzLiAgUmVtZW1iZXIgdGhlCisgKiBTd2l0Y2hlciBpcyBhIGZldyBodW5kcmVkIGJ5dGVzIG9mIGFzc2VtYmxlciBjb2RlIHdoaWNoIGFjdHVhbGx5IGNoYW5nZXMgdGhlCisgKiBDUFUgdG8gcnVuIHRoZSBHdWVzdCwgYW5kIHRoZW4gY2hhbmdlcyBiYWNrIHRvIHRoZSBIb3N0IHdoZW4gYSB0cmFwIG9yCisgKiBpbnRlcnJ1cHQgaGFwcGVucy4KKyAqCisgKiBUaGUgU3dpdGNoZXIgY29kZSBtdXN0IGJlIGF0IHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgR3Vlc3QgYXMgdGhlCisgKiBIb3N0IHNpbmNlIGl0IHdpbGwgYmUgcnVubmluZyBhcyB0aGUgc3dpdGNob3ZlciBvY2N1cnMuCisgKgorICogVHJ5aW5nIHRvIG1hcCBtZW1vcnkgYXQgYSBwYXJ0aWN1bGFyIGFkZHJlc3MgaXMgYW4gdW51c3VhbCB0aGluZyB0byBkbywgc28KKyAqIGl0J3Mgbm90IGEgc2ltcGxlIG9uZS1saW5lci4gIFdlIGFsc28gc2V0IHVwIHRoZSBwZXItY3B1IHBhcnRzIG9mIHRoZQorICogU3dpdGNoZXIgaGVyZS4KKyAqLwogc3RhdGljIF9faW5pdCBpbnQgbWFwX3N3aXRjaGVyKHZvaWQpCiB7CiAJaW50IGksIGVycjsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOwogCisJLyoKKwkgKiBNYXAgdGhlIFN3aXRjaGVyIGluIHRvIGhpZ2ggbWVtb3J5LgorCSAqCisJICogSXQgdHVybnMgb3V0IHRoYXQgaWYgd2UgY2hvb3NlIHRoZSBhZGRyZXNzIDB4RkZDMDAwMDAgKDRNQiB1bmRlciB0aGUKKwkgKiB0b3AgdmlydHVhbCBhZGRyZXNzKSwgaXQgbWFrZXMgc2V0dGluZyB1cCB0aGUgcGFnZSB0YWJsZXMgcmVhbGx5CisJICogZWFzeS4KKwkgKi8KKworCS8qIFdlIGFsbG9jYXRlIGFuIGFycmF5IG9mICJzdHJ1Y3QgcGFnZSJzLiAgbWFwX3ZtX2FyZWEoKSB3YW50cyB0aGUKKwkgKiBwYWdlcyBpbiB0aGlzIGZvcm0sIHJhdGhlciB0aGFuIGp1c3QgYW4gYXJyYXkgb2YgcG9pbnRlcnMuICovCiAJc3dpdGNoZXJfcGFnZSA9IGttYWxsb2Moc2l6ZW9mKHN3aXRjaGVyX3BhZ2VbMF0pKlRPVEFMX1NXSVRDSEVSX1BBR0VTLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghc3dpdGNoZXJfcGFnZSkgewpAQCAtNzMsNiArOTgsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBOb3cgd2UgYWN0dWFsbHkgYWxsb2NhdGUgdGhlIHBhZ2VzLiAgVGhlIEd1ZXN0IHdpbGwgc2VlIHRoZXNlIHBhZ2VzLAorCSAqIHNvIHdlIG1ha2Ugc3VyZSB0aGV5J3JlIHplcm9lZC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgVE9UQUxfU1dJVENIRVJfUEFHRVM7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmICghYWRkcikgewpAQCAtODIsNiArMTA5LDkgQEAKIAkJc3dpdGNoZXJfcGFnZVtpXSA9IHZpcnRfdG9fcGFnZShhZGRyKTsKIAl9CiAKKwkvKiBOb3cgd2UgcmVzZXJ2ZSB0aGUgInZpcnR1YWwgbWVtb3J5IGFyZWEiIHdlIHdhbnQ6IDB4RkZDMDAwMDAKKwkgKiAoU1dJVENIRVJfQUREUikuICBXZSBtaWdodCBub3QgZ2V0IGl0IGluIHRoZW9yeSwgYnV0IGluIHByYWN0aWNlCisJICogaXQncyB3b3JrZWQgc28gZmFyLiAqLwogCXN3aXRjaGVyX3ZtYSA9IF9fZ2V0X3ZtX2FyZWEoVE9UQUxfU1dJVENIRVJfUEFHRVMgKiBQQUdFX1NJWkUsCiAJCQkJICAgICAgIFZNX0FMTE9DLCBTV0lUQ0hFUl9BRERSLCBWTUFMTE9DX0VORCk7CiAJaWYgKCFzd2l0Y2hlcl92bWEpIHsKQEAgLTkwLDQ5ICsxMjAsMTA1IEBACiAJCWdvdG8gZnJlZV9wYWdlczsKIAl9CiAKKwkvKiBUaGlzIGNvZGUgYWN0dWFsbHkgc2V0cyB1cCB0aGUgcGFnZXMgd2UndmUgYWxsb2NhdGVkIHRvIGFwcGVhciBhdAorCSAqIFNXSVRDSEVSX0FERFIuICBtYXBfdm1fYXJlYSgpIHRha2VzIHRoZSB2bWEgd2UgYWxsb2NhdGVkIGFib3ZlLCB0aGUKKwkgKiBraW5kIG9mIHBhZ2VzIHdlJ3JlIG1hcHBpbmcgKGtlcm5lbCBwYWdlcyksIGFuZCBhIHBvaW50ZXIgdG8gb3VyCisJICogYXJyYXkgb2Ygc3RydWN0IHBhZ2VzLiAgSXQgaW5jcmVtZW50cyB0aGF0IHBvaW50ZXIsIGJ1dCB3ZSBkb24ndAorCSAqIGNhcmUuICovCiAJcGFnZXAgPSBzd2l0Y2hlcl9wYWdlOwogCWVyciA9IG1hcF92bV9hcmVhKHN3aXRjaGVyX3ZtYSwgUEFHRV9LRVJORUwsICZwYWdlcCk7CiAJaWYgKGVycikgewogCQlwcmludGsoImxndWVzdDogbWFwX3ZtX2FyZWEgZmFpbGVkOiAlaVxuIiwgZXJyKTsKIAkJZ290byBmcmVlX3ZtYTsKIAl9CisKKwkvKiBOb3cgdGhlIHN3aXRjaGVyIGlzIG1hcHBlZCBhdCB0aGUgcmlnaHQgYWRkcmVzcywgd2UgY2FuJ3QgZmFpbCEKKwkgKiBDb3B5IGluIHRoZSBjb21waWxlZC1pbiBTd2l0Y2hlciBjb2RlIChmcm9tIHN3aXRjaGVyLlMpLiAqLwogCW1lbWNweShzd2l0Y2hlcl92bWEtPmFkZHIsIHN0YXJ0X3N3aXRjaGVyX3RleHQsCiAJICAgICAgIGVuZF9zd2l0Y2hlcl90ZXh0IC0gc3RhcnRfc3dpdGNoZXJfdGV4dCk7CiAKLQkvKiBGaXggdXAgSURUIGVudHJpZXMgdG8gcG9pbnQgaW50byBjb3BpZWQgdGV4dC4gKi8KKwkvKiBNb3N0IG9mIHRoZSBzd2l0Y2hlci5TIGRvZXNuJ3QgY2FyZSB0aGF0IGl0J3MgYmVlbiBtb3ZlZDsgb24gSW50ZWwsCisJICoganVtcHMgYXJlIHJlbGF0aXZlLCBhbmQgaXQgZG9lc24ndCBhY2Nlc3MgYW55IHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwKKwkgKiBjb2RlIG9yIGRhdGEuCisJICoKKwkgKiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhlIGludGVycnVwdCBoYW5kbGVycyBpbiBzd2l0Y2hlci5TOiB0aGVpcgorCSAqIGFkZHJlc3NlcyBhcmUgcGxhY2VkIGluIGEgdGFibGUgKGRlZmF1bHRfaWR0X2VudHJpZXMpLCBzbyB3ZSBuZWVkIHRvCisJICogdXBkYXRlIHRoZSB0YWJsZSB3aXRoIHRoZSBuZXcgYWRkcmVzc2VzLiAgc3dpdGNoZXJfb2Zmc2V0KCkgaXMgYQorCSAqIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJ1aWx0aW4KKwkgKiBzd2l0Y2hlciBjb2RlIGFuZCB0aGUgaGlnaC1tYXBwZWQgY29weSB3ZSBqdXN0IG1hZGUuICovCiAJZm9yIChpID0gMDsgaSA8IElEVF9FTlRSSUVTOyBpKyspCiAJCWRlZmF1bHRfaWR0X2VudHJpZXNbaV0gKz0gc3dpdGNoZXJfb2Zmc2V0KCk7CiAKKwkvKgorCSAqIFNldCB1cCB0aGUgU3dpdGNoZXIncyBwZXItY3B1IGFyZWFzLgorCSAqCisJICogRWFjaCBDUFUgZ2V0cyB0d28gcGFnZXMgb2YgaXRzIG93biB3aXRoaW4gdGhlIGhpZ2gtbWFwcGVkIHJlZ2lvbgorCSAqIChha2EuICJzdHJ1Y3QgbGd1ZXN0X3BhZ2VzIikuICBNdWNoIG9mIHRoaXMgY2FuIGJlIGluaXRpYWxpemVkIG5vdywKKwkgKiBidXQgc29tZSBkZXBlbmRzIG9uIHdoYXQgR3Vlc3Qgd2UgYXJlIHJ1bm5pbmcgKHdoaWNoIGlzIHNldCB1cCBpbgorCSAqIGNvcHlfaW5fZ3Vlc3RfaW5mbygpKS4KKwkgKi8KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQkvKiBsZ3Vlc3RfcGFnZXMoKSByZXR1cm5zIHRoaXMgQ1BVJ3MgdHdvIHBhZ2VzLiAqLwogCQlzdHJ1Y3QgbGd1ZXN0X3BhZ2VzICpwYWdlcyA9IGxndWVzdF9wYWdlcyhpKTsKKwkJLyogVGhpcyBpcyBhIGNvbnZlbmllbmNlIHBvaW50ZXIgdG8gbWFrZSB0aGUgY29kZSBmaXQgb25lCisJCSAqIHN0YXRlbWVudCB0byBhIGxpbmUuICovCiAJCXN0cnVjdCBsZ3Vlc3Rfcm9fc3RhdGUgKnN0YXRlID0gJnBhZ2VzLT5zdGF0ZTsKIAotCQkvKiBUaGVzZSBmaWVsZHMgYXJlIHN0YXRpYzogcmVzdCBkb25lIGluIGNvcHlfaW5fZ3Vlc3RfaW5mbyAqLworCQkvKiBUaGUgR2xvYmFsIERlc2NyaXB0b3IgVGFibGU6IHRoZSBIb3N0IGhhcyBhIGRpZmZlcmVudCBvbmUKKwkJICogZm9yIGVhY2ggQ1BVLiAgV2Uga2VlcCBhIGRlc2NyaXB0b3IgZm9yIHRoZSBHRFQgd2hpY2ggc2F5cworCQkgKiB3aGVyZSBpdCBpcyBhbmQgaG93IGJpZyBpdCBpcyAodGhlIHNpemUgaXMgYWN0dWFsbHkgdGhlIGxhc3QKKwkJICogYnl0ZSwgbm90IHRoZSBzaXplLCBoZW5jZSB0aGUgIi0xIikuICovCiAJCXN0YXRlLT5ob3N0X2dkdF9kZXNjLnNpemUgPSBHRFRfU0laRS0xOwogCQlzdGF0ZS0+aG9zdF9nZHRfZGVzYy5hZGRyZXNzID0gKGxvbmcpZ2V0X2NwdV9nZHRfdGFibGUoaSk7CisKKwkJLyogQWxsIENQVXMgb24gdGhlIEhvc3QgdXNlIHRoZSBzYW1lIEludGVycnVwdCBEZXNjcmlwdG9yCisJCSAqIFRhYmxlLCBzbyB3ZSBqdXN0IHVzZSBzdG9yZV9pZHQoKSwgd2hpY2ggZ2V0cyB0aGlzIENQVSdzIElEVAorCQkgKiBkZXNjcmlwdG9yLiAqLwogCQlzdG9yZV9pZHQoJnN0YXRlLT5ob3N0X2lkdF9kZXNjKTsKKworCQkvKiBUaGUgZGVzY3JpcHRvcnMgZm9yIHRoZSBHdWVzdCdzIEdEVCBhbmQgSURUIGNhbiBiZSBmaWxsZWQKKwkJICogb3V0IG5vdywgdG9vLiAgV2UgY29weSB0aGUgR0RUICYgSURUIGludG8gLT5ndWVzdF9nZHQgYW5kCisJCSAqIC0+Z3Vlc3RfaWR0IGJlZm9yZSBhY3R1YWxseSBydW5uaW5nIHRoZSBHdWVzdC4gKi8KIAkJc3RhdGUtPmd1ZXN0X2lkdF9kZXNjLnNpemUgPSBzaXplb2Yoc3RhdGUtPmd1ZXN0X2lkdCktMTsKIAkJc3RhdGUtPmd1ZXN0X2lkdF9kZXNjLmFkZHJlc3MgPSAobG9uZykmc3RhdGUtPmd1ZXN0X2lkdDsKIAkJc3RhdGUtPmd1ZXN0X2dkdF9kZXNjLnNpemUgPSBzaXplb2Yoc3RhdGUtPmd1ZXN0X2dkdCktMTsKIAkJc3RhdGUtPmd1ZXN0X2dkdF9kZXNjLmFkZHJlc3MgPSAobG9uZykmc3RhdGUtPmd1ZXN0X2dkdDsKKworCQkvKiBXZSBrbm93IHdoZXJlIHdlIHdhbnQgdGhlIHN0YWNrIHRvIGJlIHdoZW4gdGhlIEd1ZXN0IGVudGVycworCQkgKiB0aGUgc3dpdGNoZXI6IGluIHBhZ2VzLT5yZWdzLiAgVGhlIHN0YWNrIGdyb3dzIHVwd2FyZHMsIHNvCisJCSAqIHdlIHN0YXJ0IGl0IGF0IHRoZSBlbmQgb2YgdGhhdCBzdHJ1Y3R1cmUuICovCiAJCXN0YXRlLT5ndWVzdF90c3MuZXNwMCA9IChsb25nKSgmcGFnZXMtPnJlZ3MgKyAxKTsKKwkJLyogQW5kIHRoaXMgaXMgdGhlIEdEVCBlbnRyeSB0byB1c2UgZm9yIHRoZSBzdGFjazogd2Uga2VlcCBhCisJCSAqIGNvdXBsZSBvZiBzcGVjaWFsIExHVUVTVCBlbnRyaWVzLiAqLwogCQlzdGF0ZS0+Z3Vlc3RfdHNzLnNzMCA9IExHVUVTVF9EUzsKLQkJLyogTm8gSS9PIGZvciB5b3UhICovCisKKwkJLyogeDg2IGNhbiBoYXZlIGEgZmluZWdyYWluZWQgYml0bWFwIHdoaWNoIGluZGljYXRlcyB3aGF0IEkvTworCQkgKiBwb3J0cyB0aGUgcHJvY2VzcyBjYW4gdXNlLiAgV2Ugc2V0IGl0IHRvIHRoZSBlbmQgb2Ygb3VyCisJCSAqIHN0cnVjdHVyZSwgbWVhbmluZyAibm9uZSIuICovCiAJCXN0YXRlLT5ndWVzdF90c3MuaW9fYml0bWFwX2Jhc2UgPSBzaXplb2Yoc3RhdGUtPmd1ZXN0X3Rzcyk7CisKKwkJLyogU29tZSBHRFQgZW50cmllcyBhcmUgdGhlIHNhbWUgYWNyb3NzIGFsbCBHdWVzdHMsIHNvIHdlIGNhbgorCQkgKiBzZXQgdGhlbSB1cCBub3cuICovCiAJCXNldHVwX2RlZmF1bHRfZ2R0X2VudHJpZXMoc3RhdGUpOworCQkvKiBNb3N0IElEVCBlbnRyaWVzIGFyZSB0aGUgc2FtZSBmb3IgYWxsIEd1ZXN0cywgdG9vLiovCiAJCXNldHVwX2RlZmF1bHRfaWR0X2VudHJpZXMoc3RhdGUsIGRlZmF1bHRfaWR0X2VudHJpZXMpOwogCi0JCS8qIFNldHVwIExHVUVTVCBzZWdtZW50cyBvbiBhbGwgY3B1cyAqLworCQkvKiBUaGUgSG9zdCBuZWVkcyB0byBiZSBhYmxlIHRvIHVzZSB0aGUgTEdVRVNUIHNlZ21lbnRzIG9uIHRoaXMKKwkJICogQ1BVLCB0b28sIHNvIHB1dCB0aGVtIGluIHRoZSBIb3N0IEdEVC4gKi8KIAkJZ2V0X2NwdV9nZHRfdGFibGUoaSlbR0RUX0VOVFJZX0xHVUVTVF9DU10gPSBGVUxMX0VYRUNfU0VHTUVOVDsKIAkJZ2V0X2NwdV9nZHRfdGFibGUoaSlbR0RUX0VOVFJZX0xHVUVTVF9EU10gPSBGVUxMX1NFR01FTlQ7CiAJfQogCi0JLyogSW5pdGlhbGl6ZSBlbnRyeSBwb2ludCBpbnRvIHN3aXRjaGVyLiAqLworCS8qIEluIHRoZSBTd2l0Y2hlciwgd2Ugd2FudCB0aGUgJWNzIHNlZ21lbnQgcmVnaXN0ZXIgdG8gdXNlIHRoZQorCSAqIExHVUVTVF9DUyBHRFQgZW50cnk6IHdlJ3ZlIHB1dCB0aGF0IGluIHRoZSBIb3N0IGFuZCBHdWVzdCBHRFRzLCBzbworCSAqIGl0IHdpbGwgYmUgdW5kaXN0dXJiZWQgd2hlbiB3ZSBzd2l0Y2guICBUbyBjaGFuZ2UgJWNzIGFuZCBqdW1wIHdlCisJICogbmVlZCB0aGlzIHN0cnVjdHVyZSB0byBmZWVkIHRvIEludGVsJ3MgImxjYWxsIiBpbnN0cnVjdGlvbi4gKi8KIAlsZ3Vlc3RfZW50cnkub2Zmc2V0ID0gKGxvbmcpc3dpdGNoX3RvX2d1ZXN0ICsgc3dpdGNoZXJfb2Zmc2V0KCk7CiAJbGd1ZXN0X2VudHJ5LnNlZ21lbnQgPSBMR1VFU1RfQ1M7CiAKIAlwcmludGsoS0VSTl9JTkZPICJsZ3Vlc3Q6IG1hcHBlZCBzd2l0Y2hlciBhdCAlcFxuIiwKIAkgICAgICAgc3dpdGNoZXJfdm1hLT5hZGRyKTsKKwkvKiBBbmQgd2Ugc3VjY2VlZGVkLi4uICovCiAJcmV0dXJuIDA7CiAKIGZyZWVfdm1hOgpAQCAtMTQ2LDM1ICsyMzIsNTggQEAKIG91dDoKIAlyZXR1cm4gZXJyOwogfQorLyo6Ki8KIAorLyogQ2xlYW5pbmcgdXAgdGhlIG1hcHBpbmcgd2hlbiB0aGUgbW9kdWxlIGlzIHVubG9hZGVkIGlzIGFsbW9zdC4uLgorICogdG9vIGVhc3kuICovCiBzdGF0aWMgdm9pZCB1bm1hcF9zd2l0Y2hlcih2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwogCisJLyogdnVubWFwKCkgdW5kb2VzICpib3RoKiBtYXBfdm1fYXJlYSgpIGFuZCBfX2dldF92bV9hcmVhKCkuICovCiAJdnVubWFwKHN3aXRjaGVyX3ZtYS0+YWRkcik7CisJLyogTm93IHdlIGp1c3QgbmVlZCB0byBmcmVlIHRoZSBwYWdlcyB3ZSBjb3BpZWQgdGhlIHN3aXRjaGVyIGludG8gKi8KIAlmb3IgKGkgPSAwOyBpIDwgVE9UQUxfU1dJVENIRVJfUEFHRVM7IGkrKykKIAkJX19mcmVlX3BhZ2VzKHN3aXRjaGVyX3BhZ2VbaV0sIDApOwogfQogCi0vKiBJTi9PVVQgaW5zbnM6IGVub3VnaCB0byBnZXQgdXMgcGFzdCBib290LXRpbWUgcHJvYmluZy4gKi8KKy8qSDoxMzAgT3VyIEd1ZXN0IGlzIHVzdWFsbHkgc28gd2VsbCBiZWhhdmVkOyBpdCBuZXZlciB0cmllcyB0byBkbyB0aGluZ3MgaXQKKyAqIGlzbid0IGFsbG93ZWQgdG8uICBVbmZvcnR1bmF0ZWx5LCAic3RydWN0IHBhcmF2aXJ0X29wcyIgaXNuJ3QgcXVpdGUKKyAqIGNvbXBsZXRlLCBiZWNhdXNlIGl0IGRvZXNuJ3QgY29udGFpbiByZXBsYWNlbWVudHMgZm9yIHRoZSBJbnRlbCBJL08KKyAqIGluc3RydWN0aW9ucy4gIEFzIGEgcmVzdWx0LCB0aGUgR3Vlc3Qgc29tZXRpbWVzIGZ1bWJsZXMgYWNyb3NzIG9uZSBkdXJpbmcKKyAqIHRoZSBib290IHByb2Nlc3MgYXMgaXQgcHJvYmVzIGZvciB2YXJpb3VzIHRoaW5ncyB3aGljaCBhcmUgdXN1YWxseSBhdHRhY2hlZAorICogdG8gYSBQQy4KKyAqCisgKiBXaGVuIHRoZSBHdWVzdCB1c2VzIG9uZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMsIHdlIGdldCB0cmFwICMxMyAoR2VuZXJhbAorICogUHJvdGVjdGlvbiBGYXVsdCkgYW5kIGNvbWUgaGVyZS4gIFdlIHNlZSBpZiBpdCdzIG9uZSBvZiB0aG9zZSB0cm91Ymxlc29tZQorICogaW5zdHJ1Y3Rpb25zIGFuZCBza2lwIG92ZXIgaXQuICBXZSByZXR1cm4gdHJ1ZSBpZiB3ZSBkaWQuICovCiBzdGF0aWMgaW50IGVtdWxhdGVfaW5zbihzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKIAl1OCBpbnNuOwogCXVuc2lnbmVkIGludCBpbnNubGVuID0gMCwgaW4gPSAwLCBzaGlmdCA9IDA7CisJLyogVGhlIGVpcCBjb250YWlucyB0aGUgKnZpcnR1YWwqIGFkZHJlc3Mgb2YgdGhlIEd1ZXN0J3MgaW5zdHJ1Y3Rpb246CisJICogZ3Vlc3RfcGEganVzdCBzdWJ0cmFjdHMgdGhlIEd1ZXN0J3MgcGFnZV9vZmZzZXQuICovCiAJdW5zaWduZWQgbG9uZyBwaHlzYWRkciA9IGd1ZXN0X3BhKGxnLCBsZy0+cmVncy0+ZWlwKTsKIAotCS8qIFRoaXMgb25seSB3b3JrcyBmb3IgYWRkcmVzc2VzIGluIGxpbmVhciBtYXBwaW5nLi4uICovCisJLyogVGhlIGd1ZXN0X3BhKCkgZnVuY3Rpb24gb25seSB3b3JrcyBmb3IgR3Vlc3Qga2VybmVsIGFkZHJlc3NlcywgYnV0CisJICogdGhhdCdzIGFsbCB3ZSdyZSB0cnlpbmcgdG8gZG8gYW55d2F5LiAqLwogCWlmIChsZy0+cmVncy0+ZWlwIDwgbGctPnBhZ2Vfb2Zmc2V0KQogCQlyZXR1cm4gMDsKKworCS8qIERlY29kaW5nIHg4NiBpbnN0cnVjdGlvbnMgaXMgaWNreS4gKi8KIAlsZ3JlYWQobGcsICZpbnNuLCBwaHlzYWRkciwgMSk7CiAKLQkvKiBPcGVyYW5kIHNpemUgcHJlZml4IG1lYW5zIGl0J3MgYWN0dWFsbHkgZm9yIGF4LiAqLworCS8qIDB4NjYgaXMgYW4gIm9wZXJhbmQgcHJlZml4Ii4gIEl0IG1lYW5zIGl0J3MgdXNpbmcgdGhlIHVwcGVyIDE2IGJpdHMKKwkgICBvZiB0aGUgZWF4IHJlZ2lzdGVyLiAqLwogCWlmIChpbnNuID09IDB4NjYpIHsKIAkJc2hpZnQgPSAxNjsKKwkJLyogVGhlIGluc3RydWN0aW9uIGlzIDEgYnl0ZSBzbyBmYXIsIHJlYWQgdGhlIG5leHQgYnl0ZS4gKi8KIAkJaW5zbmxlbiA9IDE7CiAJCWxncmVhZChsZywgJmluc24sIHBoeXNhZGRyICsgaW5zbmxlbiwgMSk7CiAJfQogCisJLyogV2UgY2FuIGlnbm9yZSB0aGUgbG93ZXIgYml0IGZvciB0aGUgbW9tZW50IGFuZCBkZWNvZGUgdGhlIDQgb3Bjb2RlcworCSAqIHdlIG5lZWQgdG8gZW11bGF0ZS4gKi8KIAlzd2l0Y2ggKGluc24gJiAweEZFKSB7CiAJY2FzZSAweEU0OiAvKiBpbiAgICAgPG5leHQgYnl0ZT4sJWFsICovCiAJCWluc25sZW4gKz0gMjsKQEAgLTE5MSw5ICszMDAsMTMgQEAKIAkJaW5zbmxlbiArPSAxOwogCQlicmVhazsKIAlkZWZhdWx0OgorCQkvKiBPSywgd2UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMsIGNhbid0IGVtdWxhdGUuICovCiAJCXJldHVybiAwOwogCX0KIAorCS8qIElmIGl0IHdhcyBhbiAiSU4iIGluc3RydWN0aW9uLCB0aGV5IGV4cGVjdCB0aGUgcmVzdWx0IHRvIGJlIHJlYWQKKwkgKiBpbnRvICVlYXgsIHNvIHdlIGNoYW5nZSAlZWF4LiAgV2UgYWx3YXlzIHJldHVybiBhbGwtb25lcywgd2hpY2gKKwkgKiB0cmFkaXRpb25hbGx5IG1lYW5zICJ0aGVyZSdzIG5vdGhpbmcgdGhlcmUiLiAqLwogCWlmIChpbikgewogCQkvKiBMb3dlciBiaXQgdGVsbHMgaXMgd2hldGhlciBpdCdzIGEgMTYgb3IgMzIgYml0IGFjY2VzcyAqLwogCQlpZiAoaW5zbiAmIDB4MSkKQEAgLTIwMSwyOCArMzE0LDQ2IEBACiAJCWVsc2UKIAkJCWxnLT5yZWdzLT5lYXggfD0gKDB4RkZGRiA8PCBzaGlmdCk7CiAJfQorCS8qIEZpbmFsbHksIHdlJ3ZlICJkb25lIiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIG1vdmUgcGFzdCBpdC4gKi8KIAlsZy0+cmVncy0+ZWlwICs9IGluc25sZW47CisJLyogU3VjY2VzcyEgKi8KIAlyZXR1cm4gMTsKIH0KKy8qOiovCiAKKy8qTDozMDUKKyAqIERlYWxpbmcgV2l0aCBHdWVzdCBNZW1vcnkuCisgKgorICogV2hlbiB0aGUgR3Vlc3QgZ2l2ZXMgdXMgKHdoYXQgaXQgdGhpbmtzIGlzKSBhIHBoeXNpY2FsIGFkZHJlc3MsIHdlIGNhbiB1c2UKKyAqIHRoZSBub3JtYWwgY29weV9mcm9tX3VzZXIoKSAmIGNvcHlfdG9fdXNlcigpIG9uIHRoYXQgYWRkcmVzczogcmVtZW1iZXIsCisgKiBHdWVzdCBwaHlzaWNhbCA9PSBMYXVuY2hlciB2aXJ0dWFsLgorICoKKyAqIEJ1dCB3ZSBjYW4ndCB0cnVzdCB0aGUgR3Vlc3Q6IGl0IG1pZ2h0IGJlIHRyeWluZyB0byBhY2Nlc3MgdGhlIExhdW5jaGVyCisgKiBjb2RlLiAgV2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSByYW5nZSBpcyBiZWxvdyB0aGUgcGZuX2xpbWl0IHRoZSBMYXVuY2hlcgorICogZ2F2ZSB1cy4gIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgYWRkciArIGxlbiBkb2Vzbid0IGdpdmUgdXMgYSBmYWxzZQorICogcG9zaXRpdmUgYnkgb3ZlcmZsb3dpbmcsIHRvby4gKi8KIGludCBsZ3Vlc3RfYWRkcmVzc19vayhjb25zdCBzdHJ1Y3QgbGd1ZXN0ICpsZywKIAkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlyZXR1cm4gKGFkZHIrbGVuKSAvIFBBR0VfU0laRSA8IGxnLT5wZm5fbGltaXQgJiYgKGFkZHIrbGVuID49IGFkZHIpOwogfQogCi0vKiBKdXN0IGxpa2UgZ2V0X3VzZXIsIGJ1dCBkb24ndCBsZXQgZ3Vlc3QgYWNjZXNzIGxndWVzdCBiaW5hcnkuICovCisvKiBUaGlzIGlzIGEgY29udmVuaWVudCByb3V0aW5lIHRvIGdldCBhIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBHdWVzdCAoYSB2ZXJ5CisgKiBjb21tb24gb3BlcmF0aW9uKS4gIEhlcmUgd2UgY2FuIHNlZSBob3cgdXNlZnVsIHRoZSBraWxsX2xndWVzdCgpIHJvdXRpbmUgd2UKKyAqIG1ldCBpbiB0aGUgTGF1bmNoZXIgY2FuIGJlOiB3ZSByZXR1cm4gYSByYW5kb20gdmFsdWUgKDApIGluc3RlYWQgb2YgbmVlZGluZworICogdG8gcmV0dXJuIGFuIGVycm9yLiAqLwogdTMyIGxncmVhZF91MzIoc3RydWN0IGxndWVzdCAqbGcsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAl1MzIgdmFsID0gMDsKIAotCS8qIERvbid0IGxldCB0aGVtIGFjY2VzcyBsZ3Vlc3QgYmluYXJ5ICovCisJLyogRG9uJ3QgbGV0IHRoZW0gYWNjZXNzIGxndWVzdCBiaW5hcnkuICovCiAJaWYgKCFsZ3Vlc3RfYWRkcmVzc19vayhsZywgYWRkciwgc2l6ZW9mKHZhbCkpCiAJICAgIHx8IGdldF91c2VyKHZhbCwgKHUzMiBfX3VzZXIgKilhZGRyKSAhPSAwKQogCQlraWxsX2d1ZXN0KGxnLCAiYmFkIHJlYWQgYWRkcmVzcyAlI2x4IiwgYWRkcik7CiAJcmV0dXJuIHZhbDsKIH0KIAorLyogU2FtZSB0aGluZyBmb3Igd3JpdGluZyBhIHZhbHVlLiAqLwogdm9pZCBsZ3dyaXRlX3UzMihzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyBhZGRyLCB1MzIgdmFsKQogewogCWlmICghbGd1ZXN0X2FkZHJlc3Nfb2sobGcsIGFkZHIsIHNpemVvZih2YWwpKQpAQCAtMjMwLDYgKzM2MSw5IEBACiAJCWtpbGxfZ3Vlc3QobGcsICJiYWQgd3JpdGUgYWRkcmVzcyAlI2x4IiwgYWRkcik7CiB9CiAKKy8qIFRoaXMgcm91dGluZSBpcyBtb3JlIGdlbmVyaWMsIGFuZCBjb3BpZXMgYSByYW5nZSBvZiBHdWVzdCBieXRlcyBpbnRvIGEKKyAqIGJ1ZmZlci4gIElmIHRoZSBjb3B5X2Zyb21fdXNlcigpIGZhaWxzLCB3ZSBmaWxsIHRoZSBidWZmZXIgd2l0aCB6ZXJvZXMsIHNvCisgKiB0aGUgY2FsbGVyIGRvZXNuJ3QgZW5kIHVwIHVzaW5nIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeS4gKi8KIHZvaWQgbGdyZWFkKHN0cnVjdCBsZ3Vlc3QgKmxnLCB2b2lkICpiLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGJ5dGVzKQogewogCWlmICghbGd1ZXN0X2FkZHJlc3Nfb2sobGcsIGFkZHIsIGJ5dGVzKQpAQCAtMjQwLDYgKzM3NCw3IEBACiAJfQogfQogCisvKiBTaW1pbGFybHksIG91ciBnZW5lcmljIHJvdXRpbmUgdG8gY29weSBpbnRvIGEgcmFuZ2Ugb2YgR3Vlc3QgYnl0ZXMuICovCiB2b2lkIGxnd3JpdGUoc3RydWN0IGxndWVzdCAqbGcsIHVuc2lnbmVkIGxvbmcgYWRkciwgY29uc3Qgdm9pZCAqYiwKIAkgICAgIHVuc2lnbmVkIGJ5dGVzKQogewpAQCAtMjQ3LDYgKzM4Miw3IEBACiAJICAgIHx8IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhZGRyLCBiLCBieXRlcykgIT0gMCkKIAkJa2lsbF9ndWVzdChsZywgImJhZCB3cml0ZSBhZGRyZXNzICUjbHggbGVuICV1IiwgYWRkciwgYnl0ZXMpOwogfQorLyogKGVuZCBvZiBtZW1vcnkgYWNjZXNzIGhlbHBlciByb3V0aW5lcykgOiovCiAKIHN0YXRpYyB2b2lkIHNldF90cyh2b2lkKQogewpAQCAtMjU3LDU0ICszOTMsMTA4IEBACiAJCXdyaXRlX2NyMChjcjB8OCk7CiB9CiAKKy8qUzowMTAKKyAqIFdlIGFyZSBnZXR0aW5nIGNsb3NlIHRvIHRoZSBTd2l0Y2hlci4KKyAqCisgKiBSZW1lbWJlciB0aGF0IGVhY2ggQ1BVIGhhcyB0d28gcGFnZXMgd2hpY2ggYXJlIHZpc2libGUgdG8gdGhlIEd1ZXN0IHdoZW4gaXQKKyAqIHJ1bnMgb24gdGhhdCBDUFUuICBUaGlzIGhhcyB0byBjb250YWluIHRoZSBzdGF0ZSBmb3IgdGhhdCBHdWVzdDogd2UgY29weSB0aGUKKyAqIHN0YXRlIGluIGp1c3QgYmVmb3JlIHdlIHJ1biB0aGUgR3Vlc3QuCisgKgorICogRWFjaCBHdWVzdCBoYXMgImNoYW5nZWQiIGZsYWdzIHdoaWNoIGluZGljYXRlIHdoYXQgaGFzIGNoYW5nZWQgaW4gdGhlIEd1ZXN0CisgKiBzaW5jZSBpdCBsYXN0IHJhbi4gIFdlIHNhdyB0aGlzIHNldCBpbiBpbnRlcnJ1cHRzX2FuZF90cmFwcy5jIGFuZAorICogc2VnbWVudHMuYy4KKyAqLwogc3RhdGljIHZvaWQgY29weV9pbl9ndWVzdF9pbmZvKHN0cnVjdCBsZ3Vlc3QgKmxnLCBzdHJ1Y3QgbGd1ZXN0X3BhZ2VzICpwYWdlcykKIHsKKwkvKiBDb3B5aW5nIGFsbCB0aGlzIGRhdGEgY2FuIGJlIHF1aXRlIGV4cGVuc2l2ZS4gIFdlIHVzdWFsbHkgcnVuIHRoZQorCSAqIHNhbWUgR3Vlc3Qgd2UgcmFuIGxhc3QgdGltZSAoYW5kIHRoYXQgR3Vlc3QgaGFzbid0IHJ1biBhbnl3aGVyZSBlbHNlCisJICogbWVhbndoaWxlKS4gIElmIHRoYXQncyBub3QgdGhlIGNhc2UsIHdlIHByZXRlbmQgZXZlcnl0aGluZyBpbiB0aGUKKwkgKiBHdWVzdCBoYXMgY2hhbmdlZC4gKi8KIAlpZiAoX19nZXRfY3B1X3ZhcihsYXN0X2d1ZXN0KSAhPSBsZyB8fCBsZy0+bGFzdF9wYWdlcyAhPSBwYWdlcykgewogCQlfX2dldF9jcHVfdmFyKGxhc3RfZ3Vlc3QpID0gbGc7CiAJCWxnLT5sYXN0X3BhZ2VzID0gcGFnZXM7CiAJCWxnLT5jaGFuZ2VkID0gQ0hBTkdFRF9BTEw7CiAJfQogCi0JLyogVGhlc2UgYXJlIHByZXR0eSBjaGVhcCwgc28gd2UgZG8gdGhlbSB1bmNvbmRpdGlvbmFsbHkuICovCisJLyogVGhlc2UgY29waWVzIGFyZSBwcmV0dHkgY2hlYXAsIHNvIHdlIGRvIHRoZW0gdW5jb25kaXRpb25hbGx5OiAqLworCS8qIFNhdmUgdGhlIGN1cnJlbnQgSG9zdCB0b3AtbGV2ZWwgcGFnZSBkaXJlY3RvcnkuICovCiAJcGFnZXMtPnN0YXRlLmhvc3RfY3IzID0gX19wYShjdXJyZW50LT5tbS0+cGdkKTsKKwkvKiBTZXQgdXAgdGhlIEd1ZXN0J3MgcGFnZSB0YWJsZXMgdG8gc2VlIHRoaXMgQ1BVJ3MgcGFnZXMgKGFuZCBubworCSAqIG90aGVyIENQVSdzIHBhZ2VzKS4gKi8KIAltYXBfc3dpdGNoZXJfaW5fZ3Vlc3QobGcsIHBhZ2VzKTsKKwkvKiBTZXQgdXAgdGhlIHR3byAiVFNTIiBtZW1iZXJzIHdoaWNoIHRlbGwgdGhlIENQVSB3aGF0IHN0YWNrIHRvIHVzZQorCSAqIGZvciB0cmFwcyB3aGljaCBkbyBkaXJlY3RseSBpbnRvIHRoZSBHdWVzdCAoaWUuIHRyYXBzIGF0IHByaXZpbGVnZQorCSAqIGxldmVsIDEpLiAqLwogCXBhZ2VzLT5zdGF0ZS5ndWVzdF90c3MuZXNwMSA9IGxnLT5lc3AxOwogCXBhZ2VzLT5zdGF0ZS5ndWVzdF90c3Muc3MxID0gbGctPnNzMTsKIAotCS8qIENvcHkgZGlyZWN0IHRyYXAgZW50cmllcy4gKi8KKwkvKiBDb3B5IGRpcmVjdC10by1HdWVzdCB0cmFwIGVudHJpZXMuICovCiAJaWYgKGxnLT5jaGFuZ2VkICYgQ0hBTkdFRF9JRFQpCiAJCWNvcHlfdHJhcHMobGcsIHBhZ2VzLT5zdGF0ZS5ndWVzdF9pZHQsIGRlZmF1bHRfaWR0X2VudHJpZXMpOwogCi0JLyogQ29weSBhbGwgR0RUIGVudHJpZXMgYnV0IHRoZSBUU1MuICovCisJLyogQ29weSBhbGwgR0RUIGVudHJpZXMgd2hpY2ggdGhlIEd1ZXN0IGNhbiBjaGFuZ2UuICovCiAJaWYgKGxnLT5jaGFuZ2VkICYgQ0hBTkdFRF9HRFQpCiAJCWNvcHlfZ2R0KGxnLCBwYWdlcy0+c3RhdGUuZ3Vlc3RfZ2R0KTsKIAkvKiBJZiBvbmx5IHRoZSBUTFMgZW50cmllcyBoYXZlIGNoYW5nZWQsIGNvcHkgdGhlbS4gKi8KIAllbHNlIGlmIChsZy0+Y2hhbmdlZCAmIENIQU5HRURfR0RUX1RMUykKIAkJY29weV9nZHRfdGxzKGxnLCBwYWdlcy0+c3RhdGUuZ3Vlc3RfZ2R0KTsKIAorCS8qIE1hcmsgdGhlIEd1ZXN0IGFzIHVuY2hhbmdlZCBmb3IgbmV4dCB0aW1lLiAqLwogCWxnLT5jaGFuZ2VkID0gMDsKIH0KIAorLyogRmluYWxseTogdGhlIGNvZGUgdG8gYWN0dWFsbHkgY2FsbCBpbnRvIHRoZSBTd2l0Y2hlciB0byBydW4gdGhlIEd1ZXN0LiAqLwogc3RhdGljIHZvaWQgcnVuX2d1ZXN0X29uY2Uoc3RydWN0IGxndWVzdCAqbGcsIHN0cnVjdCBsZ3Vlc3RfcGFnZXMgKnBhZ2VzKQogeworCS8qIFRoaXMgaXMgYSBkdW1teSB2YWx1ZSB3ZSBuZWVkIGZvciBHQ0MncyBzYWtlLiAqLwogCXVuc2lnbmVkIGludCBjbG9iYmVyOwogCisJLyogQ29weSB0aGUgZ3Vlc3Qtc3BlY2lmaWMgaW5mb3JtYXRpb24gaW50byB0aGlzIENQVSdzICJzdHJ1Y3QKKwkgKiBsZ3Vlc3RfcGFnZXMiLiAqLwogCWNvcHlfaW5fZ3Vlc3RfaW5mbyhsZywgcGFnZXMpOwogCi0JLyogUHV0IGVmbGFncyBvbiBzdGFjaywgbGNhbGwgZG9lcyByZXN0OiBzdWl0YWJsZSBmb3IgaXJldCByZXR1cm4uICovCisJLyogTm93OiB3ZSBwdXNoIHRoZSAiZWZsYWdzIiByZWdpc3RlciBvbiB0aGUgc3RhY2ssIHRoZW4gZG8gYW4gImxjYWxsIi4KKwkgKiBUaGlzIGlzIGhvdyB3ZSBjaGFuZ2UgZnJvbSB1c2luZyB0aGUga2VybmVsIGNvZGUgc2VnbWVudCB0byB1c2luZworCSAqIHRoZSBkZWRpY2F0ZWQgbGd1ZXN0IGNvZGUgc2VnbWVudCwgYXMgd2VsbCBhcyBqdW1waW5nIGludG8gdGhlCisJICogU3dpdGNoZXIuCisJICoKKwkgKiBUaGUgbGNhbGwgYWxzbyBwdXNoZXMgdGhlIG9sZCBjb2RlIHNlZ21lbnQgKEtFUk5FTF9DUykgb250byB0aGUKKwkgKiBzdGFjaywgdGhlbiB0aGUgYWRkcmVzcyBvZiB0aGlzIGNhbGwuICBUaGlzIHN0YWNrIGxheW91dCBoYXBwZW5zIHRvCisJICogZXhhY3RseSBtYXRjaCB0aGUgc3RhY2sgb2YgYW4gaW50ZXJydXB0Li4uICovCiAJYXNtIHZvbGF0aWxlKCJwdXNoZjsgbGNhbGwgKmxndWVzdF9lbnRyeSIKKwkJICAgICAvKiBUaGlzIGlzIGhvdyB3ZSB0ZWxsIEdDQyB0aGF0ICVlYXggKCJhIikgYW5kICVlYnggKCJiIikKKwkJICAgICAgKiBhcmUgY2hhbmdlZCBieSB0aGlzIHJvdXRpbmUuICBUaGUgIj0iIG1lYW5zIG91dHB1dC4gKi8KIAkJICAgICA6ICI9YSIoY2xvYmJlciksICI9YiIoY2xvYmJlcikKKwkJICAgICAvKiAlZWF4IGNvbnRhaW5zIHRoZSBwYWdlcyBwb2ludGVyLiAgKCIwIiByZWZlcnMgdG8gdGhlCisJCSAgICAgICogMC10aCBhcmd1bWVudCBhYm92ZSwgaWUgImEiKS4gICVlYnggY29udGFpbnMgdGhlCisJCSAgICAgICogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgR3Vlc3QncyB0b3AtbGV2ZWwgcGFnZQorCQkgICAgICAqIGRpcmVjdG9yeS4gKi8KIAkJICAgICA6ICIwIihwYWdlcyksICIxIihfX3BhKGxnLT5wZ2RpcnNbbGctPnBnZGlkeF0ucGdkaXIpKQorCQkgICAgIC8qIFdlIHRlbGwgZ2NjIHRoYXQgYWxsIHRoZXNlIHJlZ2lzdGVycyBjb3VsZCBjaGFuZ2UsCisJCSAgICAgICogd2hpY2ggbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRoZW0gaW4KKwkJICAgICAgKiB0aGUgU3dpdGNoZXIuICovCiAJCSAgICAgOiAibWVtb3J5IiwgIiVlZHgiLCAiJWVjeCIsICIlZWRpIiwgIiVlc2kiKTsKIH0KKy8qOiovCiAKKy8qSDowMzAgTGV0J3MganVtcCBzdHJhaWdodCB0byB0aGUgdGhlIG1haW4gbG9vcCB3aGljaCBydW5zIHRoZSBHdWVzdC4KKyAqIFJlbWVtYmVyLCB0aGlzIGlzIGNhbGxlZCBieSB0aGUgTGF1bmNoZXIgcmVhZGluZyAvZGV2L2xndWVzdCwgYW5kIHdlIGtlZXAKKyAqIGdvaW5nIGFyb3VuZCBhbmQgYXJvdW5kIHVudGlsIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zLiAqLwogaW50IHJ1bl9ndWVzdChzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnVzZXIpCiB7CisJLyogV2Ugc3RvcCBydW5uaW5nIG9uY2UgdGhlIEd1ZXN0IGlzIGRlYWQuICovCiAJd2hpbGUgKCFsZy0+ZGVhZCkgeworCQkvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhpcywgb3RoZXJ3aXNlIGdjYyBjb21wbGFpbnMuICBJdCdzCisJCSAqIG5vdCAoeWV0KSBjbGV2ZXIgZW5vdWdoIHRvIHNlZSB0aGF0IGl0J3MgaW5pdGlhbGl6ZWQgd2hlbiB3ZQorCQkgKiBuZWVkIGl0LiAqLwogCQl1bnNpZ25lZCBpbnQgY3IyID0gMDsgLyogRGFtbiBnY2MgKi8KIAotCQkvKiBIeXBlcmNhbGxzIGZpcnN0OiB3ZSBtaWdodCBoYXZlIGJlZW4gb3V0IHRvIHVzZXJzcGFjZSAqLworCQkvKiBGaXJzdCB3ZSBydW4gYW55IGh5cGVyY2FsbHMgdGhlIEd1ZXN0IHdhbnRzIGRvbmU6IGVpdGhlciBpbgorCQkgKiB0aGUgaHlwZXJjYWxsIHJpbmcgaW4gInN0cnVjdCBsZ3Vlc3RfZGF0YSIsIG9yIGRpcmVjdGx5IGJ5CisJCSAqIHVzaW5nIGludCAzMSAoTEdVRVNUX1RSQVBfRU5UUlkpLiAqLwogCQlkb19oeXBlcmNhbGxzKGxnKTsKKwkJLyogSXQncyBwb3NzaWJsZSB0aGUgR3Vlc3QgZGlkIGEgU0VORF9ETUEgaHlwZXJjYWxsIHRvIHRoZQorCQkgKiBMYXVuY2hlciwgaW4gd2hpY2ggY2FzZSB3ZSByZXR1cm4gZnJvbSB0aGUgcmVhZCgpIG5vdy4gKi8KIAkJaWYgKGxnLT5kbWFfaXNfcGVuZGluZykgewogCQkJaWYgKHB1dF91c2VyKGxnLT5wZW5kaW5nX2RtYSwgdXNlcikgfHwKIAkJCSAgICBwdXRfdXNlcihsZy0+cGVuZGluZ19rZXksIHVzZXIrMSkpCkBAIC0zMTIsNiArNTAyLDcgQEAKIAkJCXJldHVybiBzaXplb2YodW5zaWduZWQgbG9uZykqMjsKIAkJfQogCisJCS8qIENoZWNrIGZvciBzaWduYWxzICovCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKQEAgLTMxOSw3NyArNTEwLDE1NCBAQAogCQlpZiAobGctPmJyZWFrX291dCkKIAkJCXJldHVybiAtRUFHQUlOOwogCisJCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW50ZXJydXB0cyB3aGljaCBjYW4gYmUgZGVsaXZlcmVkCisJCSAqIG5vdzogaWYgc28sIHRoaXMgc2V0cyB1cCB0aGUgaGFuZGVyIHRvIGJlIGV4ZWN1dGVkIHdoZW4gd2UKKwkJICogbmV4dCBydW4gdGhlIEd1ZXN0LiAqLwogCQltYXliZV9kb19pbnRlcnJ1cHQobGcpOwogCisJCS8qIEFsbCBsb25nLWxpdmVkIGtlcm5lbCBsb29wcyBuZWVkIHRvIGNoZWNrIHdpdGggdGhpcyBob3JyaWJsZQorCQkgKiB0aGluZyBjYWxsZWQgdGhlIGZyZWV6ZXIuICBJZiB0aGUgSG9zdCBpcyB0cnlpbmcgdG8gc3VzcGVuZCwKKwkJICogaXQgc3RvcHMgdXMuICovCiAJCXRyeV90b19mcmVlemUoKTsKIAorCQkvKiBKdXN0IG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoZSBHdWVzdCBpcyBzdGlsbCBhbGl2ZS4gIE9uZSBvZgorCQkgKiB0aG9zZSBoeXBlcmNhbGxzIGNvdWxkIGhhdmUgYmVlbiBmYXRhbCwgZm9yIGV4YW1wbGUuICovCiAJCWlmIChsZy0+ZGVhZCkKIAkJCWJyZWFrOwogCisJCS8qIElmIHRoZSBHdWVzdCBhc2tlZCB0byBiZSBzdG9wcGVkLCB3ZSBzbGVlcC4gIFRoZSBHdWVzdCdzCisJCSAqIGNsb2NrIHRpbWVyIG9yIExIQ0FMTF9CUkVBSyBmcm9tIHRoZSBXYWtlciB3aWxsIHdha2UgdXMuICovCiAJCWlmIChsZy0+aGFsdGVkKSB7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc2NoZWR1bGUoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJLyogT0ssIG5vdyB3ZSdyZSByZWFkeSB0byBqdW1wIGludG8gdGhlIEd1ZXN0LiAgRmlyc3Qgd2UgcHV0IHVwCisJCSAqIHRoZSAiRG8gTm90IERpc3R1cmIiIHNpZ246ICovCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQkJLyogRXZlbiBpZiAqd2UqIGRvbid0IHdhbnQgRlBVIHRyYXAsIGd1ZXN0IG1pZ2h0Li4uICovCisJCS8qIFJlbWVtYmVyIHRoZSBhd2Z1bGx5LW5hbWVkIFRTIGJpdD8gIElmIHRoZSBHdWVzdCBoYXMgYXNrZWQKKwkJICogdG8gc2V0IGl0IHdlIHNldCBpdCBub3csIHNvIHdlIGNhbiB0cmFwIGFuZCBwYXNzIHRoYXQgdHJhcAorCQkgKiB0byB0aGUgR3Vlc3QgaWYgaXQgdXNlcyB0aGUgRlBVLiAqLwogCQlpZiAobGctPnRzKQogCQkJc2V0X3RzKCk7CiAKLQkJLyogRG9uJ3QgbGV0IEd1ZXN0IGRvIFNZU0VOVEVSOiB3ZSBjYW4ndCBoYW5kbGUgaXQuICovCisJCS8qIFNZU0VOVEVSIGlzIGFuIG9wdGltaXplZCB3YXkgb2YgZG9pbmcgc3lzdGVtIGNhbGxzLiAgV2UKKwkJICogY2FuJ3QgYWxsb3cgaXQgYmVjYXVzZSBpdCBhbHdheXMganVtcHMgdG8gcHJpdmlsZWdlIGxldmVsIDAuCisJCSAqIEEgbm9ybWFsIEd1ZXN0IHdvbid0IHRyeSBpdCBiZWNhdXNlIHdlIGRvbid0IGFkdmVydGlzZSBpdCBpbgorCQkgKiBDUFVJRCwgYnV0IGEgbWFsaWNpb3VzIEd1ZXN0IChvciBtYWxpY2lvdXMgR3Vlc3QgdXNlcnNwYWNlCisJCSAqIHByb2dyYW0pIGNvdWxkLCBzbyB3ZSB0ZWxsIHRoZSBDUFUgdG8gZGlzYWJsZSBpdCBiZWZvcmUKKwkJICogcnVubmluZyB0aGUgR3Vlc3QuICovCiAJCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU0VQKSkKIAkJCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCAwLCAwKTsKIAorCQkvKiBOb3cgd2UgYWN0dWFsbHkgcnVuIHRoZSBHdWVzdC4gIEl0IHdpbGwgcG9wIGJhY2sgb3V0IHdoZW4KKwkJICogc29tZXRoaW5nIGludGVyZXN0aW5nIGhhcHBlbnMsIGFuZCB3ZSBjYW4gZXhhbWluZSBpdHMKKwkJICogcmVnaXN0ZXJzIHRvIHNlZSB3aGF0IGl0IHdhcyBkb2luZy4gKi8KIAkJcnVuX2d1ZXN0X29uY2UobGcsIGxndWVzdF9wYWdlcyhyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CiAKLQkJLyogU2F2ZSBjcjIgbm93IGlmIHdlIHBhZ2UtZmF1bHRlZC4gKi8KKwkJLyogVGhlICJyZWdzIiBwb2ludGVyIGNvbnRhaW5zIHR3byBleHRyYSBlbnRyaWVzIHdoaWNoIGFyZSBub3QKKwkJICogcmVhbGx5IHJlZ2lzdGVyczogYSB0cmFwIG51bWJlciB3aGljaCBzYXlzIHdoYXQgaW50ZXJydXB0IG9yCisJCSAqIHRyYXAgbWFkZSB0aGUgc3dpdGNoZXIgY29kZSBjb21lIGJhY2ssIGFuZCBhbiBlcnJvciBjb2RlCisJCSAqIHdoaWNoIHNvbWUgdHJhcHMgc2V0LiAgKi8KKworCQkvKiBJZiB0aGUgR3Vlc3QgcGFnZSBmYXVsdGVkLCB0aGVuIHRoZSBjcjIgcmVnaXN0ZXIgd2lsbCB0ZWxsCisJCSAqIHVzIHRoZSBiYWQgdmlydHVhbCBhZGRyZXNzLiAgV2UgaGF2ZSB0byBncmFiIHRoaXMgbm93LAorCQkgKiBiZWNhdXNlIG9uY2Ugd2UgcmUtZW5hYmxlIGludGVycnVwdHMgYW4gaW50ZXJydXB0IGNvdWxkCisJCSAqIGZhdWx0IGFuZCB0aHVzIG92ZXJ3cml0ZSBjcjIsIG9yIHdlIGNvdWxkIGV2ZW4gbW92ZSBvZmYgdG8gYQorCQkgKiBkaWZmZXJlbnQgQ1BVLiAqLwogCQlpZiAobGctPnJlZ3MtPnRyYXBudW0gPT0gMTQpCiAJCQljcjIgPSByZWFkX2NyMigpOworCQkvKiBTaW1pbGFybHksIGlmIHdlIHRvb2sgYSB0cmFwIGJlY2F1c2UgdGhlIEd1ZXN0IHVzZWQgdGhlIEZQVSwKKwkJICogd2UgaGF2ZSB0byByZXN0b3JlIHRoZSBGUFUgaXQgZXhwZWN0cyB0byBzZWUuICovCiAJCWVsc2UgaWYgKGxnLT5yZWdzLT50cmFwbnVtID09IDcpCiAJCQltYXRoX3N0YXRlX3Jlc3RvcmUoKTsKIAorCQkvKiBSZXN0b3JlIFNZU0VOVEVSIGlmIGl0J3Mgc3VwcG9zZWQgdG8gYmUgb24uICovCiAJCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU0VQKSkKIAkJCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCBfX0tFUk5FTF9DUywgMCk7CisKKwkJLyogTm93IHdlJ3JlIHJlYWR5IHRvIGJlIGludGVycnVwdGVkIG9yIG1vdmVkIHRvIG90aGVyIENQVXMgKi8KIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCisJCS8qIE9LLCBzbyB3aGF0IGhhcHBlbmVkPyAqLwogCQlzd2l0Y2ggKGxnLT5yZWdzLT50cmFwbnVtKSB7CiAJCWNhc2UgMTM6IC8qIFdlJ3ZlIGludGVyY2VwdGVkIGEgR1BGLiAqLworCQkJLyogQ2hlY2sgaWYgdGhpcyB3YXMgb25lIG9mIHRob3NlIGFubm95aW5nIElOIG9yIE9VVAorCQkJICogaW5zdHJ1Y3Rpb25zIHdoaWNoIHdlIG5lZWQgdG8gZW11bGF0ZS4gIElmIHNvLCB3ZQorCQkJICoganVzdCBnbyBiYWNrIGludG8gdGhlIEd1ZXN0IGFmdGVyIHdlJ3ZlIGRvbmUgaXQuICovCiAJCQlpZiAobGctPnJlZ3MtPmVycmNvZGUgPT0gMCkgewogCQkJCWlmIChlbXVsYXRlX2luc24obGcpKQogCQkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIDE0OiAvKiBXZSd2ZSBpbnRlcmNlcHRlZCBhIHBhZ2UgZmF1bHQuICovCisJCQkvKiBUaGUgR3Vlc3QgYWNjZXNzZWQgYSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCB3YXNuJ3QKKwkJCSAqIG1hcHBlZC4gIFRoaXMgaGFwcGVucyBhIGxvdDogd2UgZG9uJ3QgYWN0dWFsbHkgc2V0CisJCQkgKiB1cCBtb3N0IG9mIHRoZSBwYWdlIHRhYmxlcyBmb3IgdGhlIEd1ZXN0IGF0IGFsbCB3aGVuCisJCQkgKiB3ZSBzdGFydDogYXMgaXQgcnVucyBpdCBhc2tzIGZvciBtb3JlIGFuZCBtb3JlLCBhbmQKKwkJCSAqIHdlIHNldCB0aGVtIHVwIGFzIHJlcXVpcmVkLiBJbiB0aGlzIGNhc2UsIHdlIGRvbid0CisJCQkgKiBldmVuIHRlbGwgdGhlIEd1ZXN0IHRoYXQgdGhlIGZhdWx0IGhhcHBlbmVkLgorCQkJICoKKwkJCSAqIFRoZSBlcnJjb2RlIHRlbGxzIHdoZXRoZXIgdGhpcyB3YXMgYSByZWFkIG9yIGEKKwkJCSAqIHdyaXRlLCBhbmQgd2hldGhlciBrZXJuZWwgb3IgdXNlcnNwYWNlIGNvZGUuICovCiAJCQlpZiAoZGVtYW5kX3BhZ2UobGcsIGNyMiwgbGctPnJlZ3MtPmVycmNvZGUpKQogCQkJCWNvbnRpbnVlOwogCi0JCQkvKiBJZiBsZ3Vlc3RfZGF0YSBpcyBOVUxMLCB0aGlzIHdvbid0IGh1cnQuICovCisJCQkvKiBPSywgaXQncyByZWFsbHkgbm90IHRoZXJlIChvciBub3QgT0spOiB0aGUgR3Vlc3QKKwkJCSAqIG5lZWRzIHRvIGtub3cuICBXZSB3cml0ZSBvdXQgdGhlIGNyMiB2YWx1ZSBzbyBpdAorCQkJICoga25vd3Mgd2hlcmUgdGhlIGZhdWx0IG9jY3VycmVkLgorCQkJICoKKwkJCSAqIE5vdGUgdGhhdCBpZiB0aGUgR3Vlc3Qgd2VyZSByZWFsbHkgbWVzc2VkIHVwLCB0aGlzCisJCQkgKiBjb3VsZCBoYXBwZW4gYmVmb3JlIGl0J3MgZG9uZSB0aGUgSU5JVElBTElaRQorCQkJICogaHlwZXJjYWxsLCBzbyBsZy0+bGd1ZXN0X2RhdGEgd2lsbCBiZSBOVUxMLCBzbworCQkJICogJmxnLT5sZ3Vlc3RfZGF0YS0+Y3IyIHdpbGwgYmUgYWRkcmVzcyA4LiAgV3JpdGluZworCQkJICogaW50byB0aGF0IGFkZHJlc3Mgd29uJ3QgaHVydCB0aGUgSG9zdCBhdCBhbGwsCisJCQkgKiB0aG91Z2guICovCiAJCQlpZiAocHV0X3VzZXIoY3IyLCAmbGctPmxndWVzdF9kYXRhLT5jcjIpKQogCQkJCWtpbGxfZ3Vlc3QobGcsICJXcml0aW5nIGNyMiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgNzogLyogV2UndmUgaW50ZXJjZXB0ZWQgYSBEZXZpY2UgTm90IEF2YWlsYWJsZSBmYXVsdC4gKi8KLQkJCS8qIElmIHRoZXkgZG9uJ3Qgd2FudCB0byBrbm93LCBqdXN0IGFic29yYiBpdC4gKi8KKwkJCS8qIElmIHRoZSBHdWVzdCBkb2Vzbid0IHdhbnQgdG8ga25vdywgd2UgYWxyZWFkeQorCQkJICogcmVzdG9yZWQgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQsIHNvIHdlIGp1c3QKKwkJCSAqIGNvbnRpbnVlIHdpdGhvdXQgdGVsbGluZyBpdC4gKi8KIAkJCWlmICghbGctPnRzKQogCQkJCWNvbnRpbnVlOwogCQkJYnJlYWs7Ci0JCWNhc2UgMzIgLi4uIDI1NTogLyogUmVhbCBpbnRlcnJ1cHQsIGZhbGwgdGhydSAqLworCQljYXNlIDMyIC4uLiAyNTU6CisJCQkvKiBUaGVzZSB2YWx1ZXMgbWVhbiBhIHJlYWwgaW50ZXJydXB0IG9jY3VycmVkLCBpbgorCQkJICogd2hpY2ggY2FzZSB0aGUgSG9zdCBoYW5kbGVyIGhhcyBhbHJlYWR5IGJlZW4gcnVuLgorCQkJICogV2UganVzdCBkbyBhIGZyaWVuZGx5IGNoZWNrIGlmIGFub3RoZXIgcHJvY2VzcworCQkJICogc2hvdWxkIG5vdyBiZSBydW4sIHRoZW4gZmFsbCB0aHJvdWdoIHRvIGxvb3AKKwkJCSAqIGFyb3VuZDogKi8KIAkJCWNvbmRfcmVzY2hlZCgpOwogCQljYXNlIExHVUVTVF9UUkFQX0VOVFJZOiAvKiBIYW5kbGVkIGF0IHRvcCBvZiBsb29wICovCiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIElmIHdlIGdldCBoZXJlLCBpdCdzIGEgdHJhcCB0aGUgR3Vlc3Qgd2FudHMgdG8ga25vdworCQkgKiBhYm91dC4gKi8KIAkJaWYgKGRlbGl2ZXJfdHJhcChsZywgbGctPnJlZ3MtPnRyYXBudW0pKQogCQkJY29udGludWU7CiAKKwkJLyogSWYgdGhlIEd1ZXN0IGRvZXNuJ3QgaGF2ZSBhIGhhbmRsZXIgKGVpdGhlciBpdCBoYXNuJ3QKKwkJICogcmVnaXN0ZXJlZCBhbnkgeWV0LCBvciBpdCdzIG9uZSBvZiB0aGUgZmF1bHRzIHdlIGRvbid0IGxldAorCQkgKiBpdCBoYW5kbGUpLCBpdCBkaWVzIHdpdGggYSBjcnlwdGljIGVycm9yIG1lc3NhZ2UuICovCiAJCWtpbGxfZ3Vlc3QobGcsICJ1bmhhbmRsZWQgdHJhcCAlbGkgYXQgJSNseCAoJSNseCkiLAogCQkJICAgbGctPnJlZ3MtPnRyYXBudW0sIGxnLT5yZWdzLT5laXAsCiAJCQkgICBsZy0+cmVncy0+dHJhcG51bSA9PSAxNCA/IGNyMiA6IGxnLT5yZWdzLT5lcnJjb2RlKTsKIAl9CisJLyogVGhlIEd1ZXN0IGlzIGRlYWQgPT4gIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiICovCiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKKy8qIE5vdyB3ZSBjYW4gbG9vayBhdCBlYWNoIG9mIHRoZSByb3V0aW5lcyB0aGlzIGNhbGxzLCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mCisgKiBjb21wbGV4aXR5OiBkb19oeXBlcmNhbGxzKCksIGVtdWxhdGVfaW5zbigpLCBtYXliZV9kb19pbnRlcnJ1cHQoKSwKKyAqIGRlbGl2ZXJfdHJhcCgpIGFuZCBkZW1hbmRfcGFnZSgpLiAgQWZ0ZXIgYWxsIHRob3NlLCB3ZSdsbCBiZSByZWFkeSB0bworICogZXhhbWluZSB0aGUgU3dpdGNoZXIsIGFuZCBvdXIgcGhpbG9zb3BoaWNhbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBIb3N0L0d1ZXN0CisgKiBkdWFsaXR5IHdpbGwgYmUgY29tcGxldGUuIDoqLworCiBpbnQgZmluZF9mcmVlX2d1ZXN0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC00MDcsNTUgKzY3NSw5NiBAQAogCQl3cml0ZV9jcjQocmVhZF9jcjQoKSAmIH5YODZfQ1I0X1BHRSk7CiB9CiAKKy8qSDowMDAKKyAqIFdlbGNvbWUgdG8gdGhlIEhvc3QhCisgKgorICogQnkgdGhpcyBwb2ludCB5b3VyIGJyYWluIGhhcyBiZWVuIHRpY2tsZWQgYnkgdGhlIEd1ZXN0IGNvZGUgYW5kIG51bWJlZCBieQorICogdGhlIExhdW5jaGVyIGNvZGU7IHByZXBhcmUgZm9yIGl0IHRvIGJlIHN0cmV0Y2hlZCBieSB0aGUgSG9zdCBjb2RlLiAgVGhpcyBpcworICogdGhlIGhlYXJ0LiAgTGV0J3MgYmVnaW4gYXQgdGhlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHRoZSBIb3N0J3MgbGcKKyAqIG1vZHVsZS4KKyAqLwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKKwkvKiBMZ3Vlc3QgY2FuJ3QgcnVuIHVuZGVyIFhlbiwgVk1JIG9yIGl0c2VsZi4gIEl0IGRvZXMgVHJpY2t5IFN0dWZmLiAqLwogCWlmIChwYXJhdmlydF9lbmFibGVkKCkpIHsKIAkJcHJpbnRrKCJsZ3Vlc3QgaXMgYWZyYWlkIG9mICVzXG4iLCBwYXJhdmlydF9vcHMubmFtZSk7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCisJLyogRmlyc3Qgd2UgcHV0IHRoZSBTd2l0Y2hlciB1cCBpbiB2ZXJ5IGhpZ2ggdmlydHVhbCBtZW1vcnkuICovCiAJZXJyID0gbWFwX3N3aXRjaGVyKCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIHBhZ2V0YWJsZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEd1ZXN0cy4gKi8KIAllcnIgPSBpbml0X3BhZ2V0YWJsZXMoc3dpdGNoZXJfcGFnZSwgU0hBUkVEX1NXSVRDSEVSX1BBR0VTKTsKIAlpZiAoZXJyKSB7CiAJCXVubWFwX3N3aXRjaGVyKCk7CiAJCXJldHVybiBlcnI7CiAJfQorCisJLyogVGhlIEkvTyBzdWJzeXN0ZW0gbmVlZHMgc29tZSB0aGluZ3MgaW5pdGlhbGl6ZWQuICovCiAJbGd1ZXN0X2lvX2luaXQoKTsKIAorCS8qIC9kZXYvbGd1ZXN0IG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQuICovCiAJZXJyID0gbGd1ZXN0X2RldmljZV9pbml0KCk7CiAJaWYgKGVycikgewogCQlmcmVlX3BhZ2V0YWJsZXMoKTsKIAkJdW5tYXBfc3dpdGNoZXIoKTsKIAkJcmV0dXJuIGVycjsKIAl9CisKKwkvKiBGaW5hbGx5LCB3ZSBuZWVkIHRvIHR1cm4gb2ZmICJQYWdlIEdsb2JhbCBFbmFibGUiLiAgUEdFIGlzIGFuCisJICogb3B0aW1pemF0aW9uIHdoZXJlIHBhZ2UgdGFibGUgZW50cmllcyBhcmUgc3BlY2lhbGx5IG1hcmtlZCB0byBzaG93CisJICogdGhleSBuZXZlciBjaGFuZ2UuICBUaGUgSG9zdCBrZXJuZWwgbWFya3MgYWxsIHRoZSBrZXJuZWwgcGFnZXMgdGhpcworCSAqIHdheSBiZWNhdXNlIGl0J3MgYWx3YXlzIHByZXNlbnQsIGV2ZW4gd2hlbiB1c2Vyc3BhY2UgaXMgcnVubmluZy4KKwkgKgorCSAqIExndWVzdCBicmVha3MgdGhpczogdW5iZWtub3duc3QgdG8gdGhlIHJlc3Qgb2YgdGhlIEhvc3Qga2VybmVsLCB3ZQorCSAqIHN3aXRjaCB0byB0aGUgR3Vlc3Qga2VybmVsLiAgSWYgeW91IGRvbid0IGRpc2FibGUgdGhpcyBvbiBhbGwgQ1BVcywKKwkgKiB5b3UnbGwgZ2V0IHJlYWxseSB3ZWlyZCBidWdzIHRoYXQgeW91J2xsIGNoYXNlIGZvciB0d28gZGF5cy4KKwkgKgorCSAqIEkgdXNlZCB0byB0dXJuIFBHRSBvZmYgZXZlcnkgdGltZSB3ZSBzd2l0Y2hlZCB0byB0aGUgR3Vlc3QgYW5kIGJhY2sKKwkgKiBvbiB3aGVuIHdlIHJldHVybiwgYnV0IHRoYXQgc2xvd2VkIHRoZSBTd2l0Y2hlciBkb3duIG5vdGljaWJseS4gKi8KKworCS8qIFdlIGRvbid0IG5lZWQgdGhlIGNvbXBsZXhpdHkgb2YgQ1BVcyBjb21pbmcgYW5kIGdvaW5nIHdoaWxlIHdlJ3JlCisJICogZG9pbmcgdGhpcy4gKi8KIAlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJaWYgKGNwdV9oYXNfcGdlKSB7IC8qIFdlIGhhdmUgYSBicm9hZGVyIGlkZWEgb2YgImdsb2JhbCIuICovCisJCS8qIFJlbWVtYmVyIHRoYXQgdGhpcyB3YXMgb3JpZ2luYWxseSBzZXQgKGZvciBjbGVhbnVwKS4gKi8KIAkJY3B1X2hhZF9wZ2UgPSAxOworCQkvKiBhZGp1c3RfcGdlIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHNldHMgb3IgdW5zZXRzIHRoZSBQR0UKKwkJICogYml0IG9uIGl0cyBDUFUsIGRlcGVuZGluZyBvbiB0aGUgYXJndW1lbnQgKDAgPT0gdW5zZXQpLiAqLwogCQlvbl9lYWNoX2NwdShhZGp1c3RfcGdlLCAodm9pZCAqKTAsIDAsIDEpOworCQkvKiBUdXJuIG9mZiB0aGUgZmVhdHVyZSBpbiB0aGUgZ2xvYmFsIGZlYXR1cmUgc2V0LiAqLwogCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfUEdFLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKIAl9CiAJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CisKKwkvKiBBbGwgZ29vZCEgKi8KIAlyZXR1cm4gMDsKIH0KIAorLyogQ2xlYW5pbmcgdXAgaXMganVzdCB0aGUgc2FtZSBjb2RlLCBiYWNrd2FyZHMuICBXaXRoIGEgbGl0dGxlIEZyZW5jaC4gKi8KIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJbGd1ZXN0X2RldmljZV9yZW1vdmUoKTsKIAlmcmVlX3BhZ2V0YWJsZXMoKTsKIAl1bm1hcF9zd2l0Y2hlcigpOworCisJLyogSWYgd2UgaGFkIFBHRSBiZWZvcmUgd2Ugc3RhcnRlZCwgdHVybiBpdCBiYWNrIG9uIG5vdy4gKi8KIAlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJaWYgKGNwdV9oYWRfcGdlKSB7CiAJCXNldF9iaXQoWDg2X0ZFQVRVUkVfUEdFLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwkJLyogYWRqdXN0X3BnZSdzIGFyZ3VtZW50ICIxIiBtZWFucyBzZXQgUEdFLiAqLwogCQlvbl9lYWNoX2NwdShhZGp1c3RfcGdlLCAodm9pZCAqKTEsIDAsIDEpOwogCX0KIAl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0KIAorLyogVGhlIEhvc3Qgc2lkZSBvZiBsZ3Vlc3QgY2FuIGJlIGEgbW9kdWxlLiAgVGhpcyBpcyBhIG5pY2Ugd2F5IGZvciBwZW9wbGUgdG8KKyAqIHBsYXkgd2l0aCBpdC4gICovCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvaHlwZXJjYWxscy5jIGIvZHJpdmVycy9sZ3Vlc3QvaHlwZXJjYWxscy5jCmluZGV4IGVhNTJjYTQuLmRiNmNhYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2h5cGVyY2FsbHMuYworKysgYi9kcml2ZXJzL2xndWVzdC9oeXBlcmNhbGxzLmMKQEAgLTEsNSArMSwxMCBAQAotLyogIEFjdHVhbCBoeXBlcmNhbGxzLCB3aGljaCBhbGxvdyBndWVzdHMgdG8gYWN0dWFsbHkgZG8gc29tZXRoaW5nLgotICAgIENvcHlyaWdodCAoQykgMjAwNiBSdXN0eSBSdXNzZWxsIElCTSBDb3Jwb3JhdGlvbgorLypQOjUwMCBKdXN0IGFzIHVzZXJzcGFjZSBwcm9ncmFtcyByZXF1ZXN0IGtlcm5lbCBvcGVyYXRpb25zIHRocm91Z2ggYSBzeXN0ZW0KKyAqIGNhbGwsIHRoZSBHdWVzdCByZXF1ZXN0cyBIb3N0IG9wZXJhdGlvbnMgdGhyb3VnaCBhICJoeXBlcmNhbGwiLiAgWW91IG1pZ2h0CisgKiBub3RpY2UgdGhpcyBub21lbmNsYXR1cmUgZG9lc24ndCByZWFsbHkgZm9sbG93IGFueSBsb2dpYywgYnV0IHRoZSBuYW1lIGhhcworICogYmVlbiBhcm91bmQgZm9yIGxvbmcgZW5vdWdoIHRoYXQgd2UncmUgc3R1Y2sgd2l0aCBpdC4gIEFzIHlvdSdkIGV4cGVjdCwgdGhpcworICogY29kZSBpcyBiYXNpY2FsbHkgYSBvbmUgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuIDoqLworCisvKiAgQ29weXJpZ2h0IChDKSAyMDA2IFJ1c3R5IFJ1c3NlbGwgSUJNIENvcnBvcmF0aW9uCiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yMywzNyArMjgsNTUgQEAKICNpbmNsdWRlIDxpcnFfdmVjdG9ycy5oPgogI2luY2x1ZGUgImxnLmgiCiAKKy8qSDoxMjAgVGhpcyBpcyB0aGUgY29yZSBoeXBlcmNhbGwgcm91dGluZTogd2hlcmUgdGhlIEd1ZXN0IGdldHMgd2hhdCBpdAorICogd2FudHMuICBPciBnZXRzIGtpbGxlZC4gIE9yLCBpbiB0aGUgY2FzZSBvZiBMSENBTExfQ1JBU0gsIGJvdGguCisgKgorICogUmVtZW1iZXIgZnJvbSB0aGUgR3Vlc3Q6ICVlYXggPT0gd2hpY2ggY2FsbCB0byBtYWtlLCBhbmQgdGhlIGFyZ3VtZW50cyBhcmUKKyAqIHBhY2tlZCBpbnRvICVlZHgsICVlYnggYW5kICVlY3ggaWYgbmVlZGVkLiAqLwogc3RhdGljIHZvaWQgZG9faGNhbGwoc3RydWN0IGxndWVzdCAqbGcsIHN0cnVjdCBsZ3Vlc3RfcmVncyAqcmVncykKIHsKIAlzd2l0Y2ggKHJlZ3MtPmVheCkgewogCWNhc2UgTEhDQUxMX0ZMVVNIX0FTWU5DOgorCQkvKiBUaGlzIGNhbGwgZG9lcyBub3RoaW5nLCBleGNlcHQgYnkgYnJlYWtpbmcgb3V0IG9mIHRoZSBHdWVzdAorCQkgKiBpdCBtYWtlcyB1cyBwcm9jZXNzIGFsbCB0aGUgYXN5bmNocm9ub3VzIGh5cGVyY2FsbHMuICovCiAJCWJyZWFrOwogCWNhc2UgTEhDQUxMX0xHVUVTVF9JTklUOgorCQkvKiBZb3UgY2FuJ3QgZ2V0IGhlcmUgdW5sZXNzIHlvdSdyZSBhbHJlYWR5IGluaXRpYWxpemVkLiAgRG9uJ3QKKwkJICogZG8gdGhhdC4gKi8KIAkJa2lsbF9ndWVzdChsZywgImFscmVhZHkgaGF2ZSBsZ3Vlc3RfZGF0YSIpOwogCQlicmVhazsKIAljYXNlIExIQ0FMTF9DUkFTSDogeworCQkvKiBDcmFzaCBpcyBzdWNoIGEgdHJpdmlhbCBoeXBlcmNhbGwgdGhhdCB3ZSBkbyBpdCBpbiBmb3VyCisJCSAqIGxpbmVzIHJpZ2h0IGhlcmUuICovCiAJCWNoYXIgbXNnWzEyOF07CisJCS8qIElmIHRoZSBsZ3JlYWQgZmFpbHMsIGl0IHdpbGwgY2FsbCBraWxsX2d1ZXN0KCkgaXRzZWxmOyB0aGUKKwkJICoga2lsbF9ndWVzdCgpIHdpdGggdGhlIG1lc3NhZ2Ugd2lsbCBiZSBpZ25vcmVkLiAqLwogCQlsZ3JlYWQobGcsIG1zZywgcmVncy0+ZWR4LCBzaXplb2YobXNnKSk7CiAJCW1zZ1tzaXplb2YobXNnKS0xXSA9ICdcMCc7CiAJCWtpbGxfZ3Vlc3QobGcsICJDUkFTSDogJXMiLCBtc2cpOwogCQlicmVhazsKIAl9CiAJY2FzZSBMSENBTExfRkxVU0hfVExCOgorCQkvKiBGTFVTSF9UTEIgY29tZXMgaW4gdHdvIGZsYXZvcnMsIGRlcGVuZGluZyBvbiB0aGUKKwkJICogYXJndW1lbnQ6ICovCiAJCWlmIChyZWdzLT5lZHgpCiAJCQlndWVzdF9wYWdldGFibGVfY2xlYXJfYWxsKGxnKTsKIAkJZWxzZQogCQkJZ3Vlc3RfcGFnZXRhYmxlX2ZsdXNoX3VzZXIobGcpOwogCQlicmVhazsKLQljYXNlIExIQ0FMTF9HRVRfV0FMTENMT0NLOiB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0czsKLQkJa3RpbWVfZ2V0X3JlYWxfdHMoJnRzKTsKLQkJcmVncy0+ZWF4ID0gdHMudHZfc2VjOwotCQlicmVhazsKLQl9CiAJY2FzZSBMSENBTExfQklORF9ETUE6CisJCS8qIEJJTkRfRE1BIHJlYWxseSB3YW50cyBmb3VyIGFyZ3VtZW50cywgYnV0IGl0J3MgdGhlIG9ubHkgY2FsbAorCQkgKiB3aGljaCBkb2VzLiAgU28gdGhlIEd1ZXN0IHBhY2tzIHRoZSBudW1iZXIgb2YgYnVmZmVycyBhbmQKKwkJICogdGhlIGludGVycnVwdCBudW1iZXIgaW50byB0aGUgZmluYWwgYXJndW1lbnQsIGFuZCB3ZSBkZWNvZGUKKwkJICogaXQgaGVyZS4gIFRoaXMgY2FuIGxlZ2l0aW1hdGVseSBmYWlsLCBzaW5jZSB3ZSBjdXJyZW50bHkKKwkJICogcGxhY2UgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIERNQSBwb29scyBhIEd1ZXN0IGNhbiBoYXZlLgorCQkgKiBTbyB3ZSByZXR1cm4gdHJ1ZSBvciBmYWxzZSBmcm9tIHRoaXMgY2FsbC4gKi8KIAkJcmVncy0+ZWF4ID0gYmluZF9kbWEobGcsIHJlZ3MtPmVkeCwgcmVncy0+ZWJ4LAogCQkJCSAgICAgcmVncy0+ZWN4ID4+IDgsIHJlZ3MtPmVjeCAmIDB4RkYpOwogCQlicmVhazsKKworCS8qIEFsbCB0aGVzZSBjYWxscyBzaW1wbHkgcGFzcyB0aGUgYXJndW1lbnRzIHRocm91Z2ggdG8gdGhlIHJpZ2h0CisJICogcm91dGluZXMuICovCiAJY2FzZSBMSENBTExfU0VORF9ETUE6CiAJCXNlbmRfZG1hKGxnLCByZWdzLT5lZHgsIHJlZ3MtPmVieCk7CiAJCWJyZWFrOwpAQCAtODEsMTAgKzEwNCwxMyBAQAogCWNhc2UgTEhDQUxMX1NFVF9DTE9DS0VWRU5UOgogCQlndWVzdF9zZXRfY2xvY2tldmVudChsZywgcmVncy0+ZWR4KTsKIAkJYnJlYWs7CisKIAljYXNlIExIQ0FMTF9UUzoKKwkJLyogVGhpcyBzZXRzIHRoZSBUUyBmbGFnLCBhcyB3ZSBzYXcgdXNlZCBpbiBydW5fZ3Vlc3QoKS4gKi8KIAkJbGctPnRzID0gcmVncy0+ZWR4OwogCQlicmVhazsKIAljYXNlIExIQ0FMTF9IQUxUOgorCQkvKiBTaW1pbGFybHksIHRoaXMgc2V0cyB0aGUgaGFsdGVkIGZsYWcgZm9yIHJ1bl9ndWVzdCgpLiAqLwogCQlsZy0+aGFsdGVkID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTkyLDI1ICsxMTgsNDIgQEAKIAl9CiB9CiAKLS8qIFdlIGFsd2F5cyBkbyBxdWV1ZWQgY2FsbHMgYmVmb3JlIGFjdHVhbCBoeXBlcmNhbGwuICovCisvKiBBc3luY2hyb25vdXMgaHlwZXJjYWxscyBhcmUgZWFzeTogd2UganVzdCBsb29rIGluIHRoZSBhcnJheSBpbiB0aGUgR3Vlc3QncworICogInN0cnVjdCBsZ3Vlc3RfZGF0YSIgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IG5ldyBvbmVzIG1hcmtlZCAicmVhZHkiLgorICoKKyAqIFdlIGFyZSBjYXJlZnVsIHRvIGRvIHRoZXNlIGluIG9yZGVyOiBvYnZpb3VzbHkgd2UgcmVzcGVjdCB0aGUgb3JkZXIgdGhlCisgKiBHdWVzdCBwdXQgdGhlbSBpbiB0aGUgcmluZywgYnV0IHdlIGFsc28gcHJvbWlzZSB0aGUgR3Vlc3QgdGhhdCB0aGV5IHdpbGwKKyAqIGhhcHBlbiBiZWZvcmUgYW55IG5vcm1hbCBoeXBlcmNhbGwgKHdoaWNoIGlzIHdoeSB3ZSBjaGVjayB0aGlzIGJlZm9yZQorICogY2hlY2tpbmcgZm9yIGEgbm9ybWFsIGhjYWxsKS4gKi8KIHN0YXRpYyB2b2lkIGRvX2FzeW5jX2hjYWxscyhzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1OCBzdFtMSENBTExfUklOR19TSVpFXTsKIAorCS8qIEZvciBzaW1wbGljaXR5LCB3ZSBjb3B5IHRoZSBlbnRpcmUgY2FsbCBzdGF0dXMgYXJyYXkgaW4gYXQgb25jZS4gKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoJnN0LCAmbGctPmxndWVzdF9kYXRhLT5oY2FsbF9zdGF0dXMsIHNpemVvZihzdCkpKQogCQlyZXR1cm47CiAKKworCS8qIFdlIHByb2Nlc3MgInN0cnVjdCBsZ3Vlc3RfZGF0YSJzIGhjYWxsc1tdIHJpbmcgb25jZS4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdCk7IGkrKykgewogCQlzdHJ1Y3QgbGd1ZXN0X3JlZ3MgcmVnczsKKwkJLyogV2UgcmVtZW1iZXIgd2hlcmUgd2Ugd2VyZSB1cCB0byBmcm9tIGxhc3QgdGltZS4gIFRoaXMgbWFrZXMKKwkJICogc3VyZSB0aGF0IHRoZSBoeXBlcmNhbGxzIGFyZSBkb25lIGluIHRoZSBvcmRlciB0aGUgR3Vlc3QKKwkJICogcGxhY2VzIHRoZW0gaW4gdGhlIHJpbmcuICovCiAJCXVuc2lnbmVkIGludCBuID0gbGctPm5leHRfaGNhbGw7CiAKKwkJLyogMHhGRiBtZWFucyB0aGVyZSdzIG5vIGNhbGwgaGVyZSAoeWV0KS4gKi8KIAkJaWYgKHN0W25dID09IDB4RkYpCiAJCQlicmVhazsKIAorCQkvKiBPSywgd2UgaGF2ZSBoeXBlcmNhbGwuICBJbmNyZW1lbnQgdGhlICJuZXh0X2hjYWxsIiBjdXJzb3IsCisJCSAqIGFuZCB3cmFwIGJhY2sgdG8gMCBpZiB3ZSByZWFjaCB0aGUgZW5kLiAqLwogCQlpZiAoKytsZy0+bmV4dF9oY2FsbCA9PSBMSENBTExfUklOR19TSVpFKQogCQkJbGctPm5leHRfaGNhbGwgPSAwOwogCisJCS8qIFdlIGNvcHkgdGhlIGh5cGVyY2FsbCBhcmd1bWVudHMgaW50byBhIGZha2UgcmVnaXN0ZXIKKwkJICogc3RydWN0dXJlLiAgVGhpcyBtYWtlcyBsaWZlIHNpbXBsZSBmb3IgZG9faGNhbGwoKS4gKi8KIAkJaWYgKGdldF91c2VyKHJlZ3MuZWF4LCAmbGctPmxndWVzdF9kYXRhLT5oY2FsbHNbbl0uZWF4KQogCQkgICAgfHwgZ2V0X3VzZXIocmVncy5lZHgsICZsZy0+bGd1ZXN0X2RhdGEtPmhjYWxsc1tuXS5lZHgpCiAJCSAgICB8fCBnZXRfdXNlcihyZWdzLmVjeCwgJmxnLT5sZ3Vlc3RfZGF0YS0+aGNhbGxzW25dLmVjeCkKQEAgLTExOSw3NCArMTYyLDEzOSBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQkvKiBEbyB0aGUgaHlwZXJjYWxsLCBzYW1lIGFzIGEgbm9ybWFsIG9uZS4gKi8KIAkJZG9faGNhbGwobGcsICZyZWdzKTsKKworCQkvKiBNYXJrIHRoZSBoeXBlcmNhbGwgZG9uZS4gKi8KIAkJaWYgKHB1dF91c2VyKDB4RkYsICZsZy0+bGd1ZXN0X2RhdGEtPmhjYWxsX3N0YXR1c1tuXSkpIHsKIAkJCWtpbGxfZ3Vlc3QobGcsICJXcml0aW5nIHJlc3VsdCBmb3IgYXN5bmMgaHlwZXJjYWxsIik7CiAJCQlicmVhazsKIAkJfQogCisgCQkvKiBTdG9wIGRvaW5nIGh5cGVyY2FsbHMgaWYgd2UndmUganVzdCBkb25lIGEgRE1BIHRvIHRoZQorCQkgKiBMYXVuY2hlcjogaXQgbmVlZHMgdG8gc2VydmljZSB0aGlzIGZpcnN0LiAqLwogCQlpZiAobGctPmRtYV9pc19wZW5kaW5nKQogCQkJYnJlYWs7CiAJfQogfQogCisvKiBMYXN0IG9mIGFsbCwgd2UgbG9vayBhdCB3aGF0IGhhcHBlbnMgZmlyc3Qgb2YgYWxsLiAgVGhlIHZlcnkgZmlyc3QgdGltZSB0aGUKKyAqIEd1ZXN0IG1ha2VzIGEgaHlwZXJjYWxsLCB3ZSBlbmQgdXAgaGVyZSB0byBzZXQgdGhpbmdzIHVwOiAqLwogc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKIAl1MzIgdHNjX3NwZWVkOwogCisJLyogWW91IGNhbid0IGRvIGFueXRoaW5nIHVudGlsIHlvdSdyZSBpbml0aWFsaXplZC4gIFRoZSBHdWVzdCBrbm93cyB0aGUKKwkgKiBydWxlcywgc28gd2UncmUgdW5mb3JnaXZpbmcgaGVyZS4gKi8KIAlpZiAobGctPnJlZ3MtPmVheCAhPSBMSENBTExfTEdVRVNUX0lOSVQpIHsKIAkJa2lsbF9ndWVzdChsZywgImh5cGVyY2FsbCAlbGkgYmVmb3JlIExHVUVTVF9JTklUIiwKIAkJCSAgIGxnLT5yZWdzLT5lYXgpOwogCQlyZXR1cm47CiAJfQogCi0JLyogV2Ugb25seSB0ZWxsIHRoZSBndWVzdCB0byB1c2UgdGhlIFRTQyBpZiBpdCdzIHJlbGlhYmxlLiAqLworCS8qIFdlIGluc2lzdCB0aGF0IHRoZSBUaW1lIFN0YW1wIENvdW50ZXIgZXhpc3QgYW5kIGRvZXNuJ3QgY2hhbmdlIHdpdGgKKwkgKiBjcHUgZnJlcXVlbmN5LiAgU29tZSBkZXZpb3VzIGNoaXAgbWFudWZhY3R1cmVycyBkZWNpZGVkIHRoYXQgVFNDCisJICogY2hhbmdlcyBjb3VsZCBiZSBoYW5kbGVkIGluIHNvZnR3YXJlLiAgSSBkZWNpZGVkIHRoYXQgdGltZSBnb2luZworCSAqIGJhY2t3YXJkcyBtaWdodCBiZSBnb29kIGZvciBiZW5jaG1hcmtzLCBidXQgaXQncyBiYWQgZm9yIHVzZXJzLgorCSAqCisJICogV2UgYWxzbyBpbnNpc3QgdGhhdCB0aGUgVFNDIGJlIHN0YWJsZTogdGhlIGtlcm5lbCBkZXRlY3RzIHVucmVsaWFibGUKKwkgKiBUU0NzIGZvciBpdHMgb3duIHB1cnBvc2VzLCBhbmQgd2UgdXNlIHRoYXQgaGVyZS4gKi8KIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQykgJiYgIWNoZWNrX3RzY191bnN0YWJsZSgpKQogCQl0c2Nfc3BlZWQgPSB0c2Nfa2h6OwogCWVsc2UKIAkJdHNjX3NwZWVkID0gMDsKIAorCS8qIFRoZSBwb2ludGVyIHRvIHRoZSBHdWVzdCdzICJzdHJ1Y3QgbGd1ZXN0X2RhdGEiIGlzIHRoZSBvbmx5CisJICogYXJndW1lbnQuICovCiAJbGctPmxndWVzdF9kYXRhID0gKHN0cnVjdCBsZ3Vlc3RfZGF0YSBfX3VzZXIgKilsZy0+cmVncy0+ZWR4OwotCS8qIFdlIGNoZWNrIGhlcmUgc28gd2UgY2FuIHNpbXBseSBjb3B5X3RvX3VzZXIvZnJvbV91c2VyICovCisJLyogSWYgd2UgY2hlY2sgdGhlIGFkZHJlc3MgdGhleSBnYXZlIGlzIE9LIG5vdywgd2UgY2FuIHNpbXBseQorCSAqIGNvcHlfdG9fdXNlci9mcm9tX3VzZXIgZnJvbSBub3cgb24gcmF0aGVyIHRoYW4gdXNpbmcgbGdyZWFkL2xnd3JpdGUuCisJICogSSBwdXQgdGhpcyBpbiB0byBzaG93IHRoYXQgSSdtIG5vdCBpbW11bmUgdG8gd3JpdGluZyBzdHVwaWQKKwkgKiBvcHRpbWl6YXRpb25zLiAqLwogCWlmICghbGd1ZXN0X2FkZHJlc3Nfb2sobGcsIGxnLT5yZWdzLT5lZHgsIHNpemVvZigqbGctPmxndWVzdF9kYXRhKSkpIHsKIAkJa2lsbF9ndWVzdChsZywgImJhZCBndWVzdCBwYWdlICVwIiwgbGctPmxndWVzdF9kYXRhKTsKIAkJcmV0dXJuOwogCX0KKwkvKiBUaGUgR3Vlc3QgdGVsbHMgdXMgd2hlcmUgd2UncmUgbm90IHRvIGRlbGl2ZXIgaW50ZXJydXB0cyBieSBwdXR0aW5nCisJICogdGhlIHJhbmdlIG9mIGFkZHJlc3NlcyBpbnRvICJzdHJ1Y3QgbGd1ZXN0X2RhdGEiLiAqLwogCWlmIChnZXRfdXNlcihsZy0+bm9pcnFfc3RhcnQsICZsZy0+bGd1ZXN0X2RhdGEtPm5vaXJxX3N0YXJ0KQogCSAgICB8fCBnZXRfdXNlcihsZy0+bm9pcnFfZW5kLCAmbGctPmxndWVzdF9kYXRhLT5ub2lycV9lbmQpCi0JICAgIC8qIFdlIHJlc2VydmUgdGhlIHRvcCBwZ2QgZW50cnkuICovCisJICAgIC8qIFdlIHRlbGwgdGhlIEd1ZXN0IHRoYXQgaXQgY2FuJ3QgdXNlIHRoZSB0b3AgNE1CIG9mIHZpcnR1YWwKKwkgICAgICogYWRkcmVzc2VzIHVzZWQgYnkgdGhlIFN3aXRjaGVyLiAqLwogCSAgICB8fCBwdXRfdXNlcig0VSoxMDI0KjEwMjQsICZsZy0+bGd1ZXN0X2RhdGEtPnJlc2VydmVfbWVtKQogCSAgICB8fCBwdXRfdXNlcih0c2Nfc3BlZWQsICZsZy0+bGd1ZXN0X2RhdGEtPnRzY19raHopCisJICAgIC8qIFdlIGFsc28gZ2l2ZSB0aGUgR3Vlc3QgYSB1bmlxdWUgaWQsIGFzIHVzZWQgaW4gbGd1ZXN0X25ldC5jLiAqLwogCSAgICB8fCBwdXRfdXNlcihsZy0+Z3Vlc3RpZCwgJmxnLT5sZ3Vlc3RfZGF0YS0+Z3Vlc3RpZCkpCiAJCWtpbGxfZ3Vlc3QobGcsICJiYWQgZ3Vlc3QgcGFnZSAlcCIsIGxnLT5sZ3Vlc3RfZGF0YSk7CiAKLQkvKiBUaGlzIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSB0aGUgYWJvdmUgYWNjZXNzZXMgbWlnaHQgaGF2ZQotCSAqIGJlZW4gdGhlIGZpcnN0IHdyaXRlIHRvIGEgR3Vlc3QgcGFnZS4gIFRoaXMgbWF5IGhhdmUgY2F1c2VkCi0JICogYSBjb3B5LW9uLXdyaXRlIGZhdWx0LCBidXQgdGhlIEd1ZXN0IG1pZ2h0IGJlIHJlZmVycmluZyB0bwotCSAqIHRoZSBvbGQgKHJlYWQtb25seSkgcGFnZS4gKi8KKwkvKiBXZSB3cml0ZSB0aGUgY3VycmVudCB0aW1lIGludG8gdGhlIEd1ZXN0J3MgZGF0YSBwYWdlIG9uY2Ugbm93LiAqLworCXdyaXRlX3RpbWVzdGFtcChsZyk7CisKKwkvKiBUaGlzIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSB0aGUgYWJvdmUgYWNjZXNzZXMgbWlnaHQgaGF2ZSBiZWVuIHRoZQorCSAqIGZpcnN0IHdyaXRlIHRvIGEgR3Vlc3QgcGFnZS4gIFRoaXMgbWF5IGhhdmUgY2F1c2VkIGEgY29weS1vbi13cml0ZQorCSAqIGZhdWx0LCBidXQgdGhlIEd1ZXN0IG1pZ2h0IGJlIHJlZmVycmluZyB0byB0aGUgb2xkIChyZWFkLW9ubHkpCisJICogcGFnZS4gKi8KIAlndWVzdF9wYWdldGFibGVfY2xlYXJfYWxsKGxnKTsKIH0KKy8qIE5vdyB3ZSd2ZSBleGFtaW5lZCB0aGUgaHlwZXJjYWxsIGNvZGU7IG91ciBHdWVzdCBjYW4gbWFrZSByZXF1ZXN0cy4gIFRoZXJlCisgKiBpcyBvbmUgb3RoZXIgd2F5IHdlIGNhbiBkbyB0aGluZ3MgZm9yIHRoZSBHdWVzdCwgYXMgd2Ugc2VlIGluCisgKiBlbXVsYXRlX2luc24oKS4gKi8KIAotLyogRXZlbiBpZiB3ZSBnbyBvdXQgdG8gdXNlcnNwYWNlIGFuZCBjb21lIGJhY2ssIHdlIGRvbid0IHdhbnQgdG8gZG8KLSAqIHRoZSBoeXBlcmNhbGwgYWdhaW4uICovCisvKkg6MTEwIFRyaWNreSBwb2ludDogd2UgbWFyayB0aGUgaHlwZXJjYWxsIGFzICJkb25lIiBvbmNlIHdlJ3ZlIGRvbmUgaXQuCisgKiBOb3JtYWxseSB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoaXM6IHRoZSBHdWVzdCB3aWxsIHJ1biBhZ2FpbiBhbmQgdXBkYXRlIHRoZQorICogdHJhcCBudW1iZXIgYmVmb3JlIHdlIGNvbWUgYmFjayBhcm91bmQgdGhlIHJ1bl9ndWVzdCgpIGxvb3AgdG8KKyAqIGRvX2h5cGVyY2FsbHMoKS4KKyAqCisgKiBIb3dldmVyLCBpZiB3ZSBhcmUgc2lnbmFsbGVkIG9yIHRoZSBHdWVzdCBzZW5kcyBETUEgdG8gdGhlIExhdW5jaGVyLCB0aGF0CisgKiBsb29wIHdpbGwgZXhpdCB3aXRob3V0IHJ1bm5pbmcgdGhlIEd1ZXN0LiAgV2hlbiBpdCBjb21lcyBiYWNrIGl0IHdvdWxkIHRyeQorICogdG8gcmUtcnVuIHRoZSBoeXBlcmNhbGwuICovCiBzdGF0aWMgdm9pZCBjbGVhcl9oY2FsbChzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKIAlsZy0+cmVncy0+dHJhcG51bSA9IDI1NTsKIH0KIAorLypIOjEwMAorICogSHlwZXJjYWxscworICoKKyAqIFJlbWVtYmVyIGZyb20gdGhlIEd1ZXN0LCBoeXBlcmNhbGxzIGNvbWUgaW4gdHdvIGZsYXZvcnM6IG5vcm1hbCBhbmQKKyAqIGFzeW5jaHJvbm91cy4gIFRoaXMgZmlsZSBoYW5kbGVzIGJvdGggb2YgdHlwZXMuCisgKi8KIHZvaWQgZG9faHlwZXJjYWxscyhzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKKwkvKiBOb3QgaW5pdGlhbGl6ZWQgeWV0PyAqLwogCWlmICh1bmxpa2VseSghbGctPmxndWVzdF9kYXRhKSkgeworCQkvKiBEaWQgdGhlIEd1ZXN0IG1ha2UgYSBoeXBlcmNhbGw/ICBXZSBtaWdodCBoYXZlIGNvbWUgYmFjayBmb3IKKwkJICogc29tZSBvdGhlciByZWFzb24gKGFuIGludGVycnVwdCwgYSBkaWZmZXJlbnQgdHJhcCkuICovCiAJCWlmIChsZy0+cmVncy0+dHJhcG51bSA9PSBMR1VFU1RfVFJBUF9FTlRSWSkgeworCQkJLyogU2V0IHVwIHRoZSAic3RydWN0IGxndWVzdF9kYXRhIiAqLwogCQkJaW5pdGlhbGl6ZShsZyk7CisJCQkvKiBUaGUgaHlwZXJjYWxsIGlzIGRvbmUuICovCiAJCQljbGVhcl9oY2FsbChsZyk7CiAJCX0KIAkJcmV0dXJuOwogCX0KIAorCS8qIFRoZSBHdWVzdCBoYXMgaW5pdGlhbGl6ZWQuCisJICoKKwkgKiBMb29rIGluIHRoZSBoeXBlcmNhbGwgcmluZyBmb3IgdGhlIGFzeW5jIGh5cGVyY2FsbHM6ICovCiAJZG9fYXN5bmNfaGNhbGxzKGxnKTsKKworCS8qIElmIHdlIHN0b3BwZWQgcmVhZGluZyB0aGUgaHlwZXJjYWxsIHJpbmcgYmVjYXVzZSB0aGUgR3Vlc3QgZGlkIGEKKwkgKiBTRU5EX0RNQSB0byB0aGUgTGF1bmNoZXIsIHdlIHdhbnQgdG8gcmV0dXJuIG5vdy4gIE90aGVyd2lzZSBpZiB0aGUKKwkgKiBHdWVzdCBhc2tlZCB1cyB0byBkbyBhIGh5cGVyY2FsbCwgd2UgZG8gaXQuICovCiAJaWYgKCFsZy0+ZG1hX2lzX3BlbmRpbmcgJiYgbGctPnJlZ3MtPnRyYXBudW0gPT0gTEdVRVNUX1RSQVBfRU5UUlkpIHsKIAkJZG9faGNhbGwobGcsIGxnLT5yZWdzKTsKKwkJLyogVGhlIGh5cGVyY2FsbCBpcyBkb25lLiAqLwogCQljbGVhcl9oY2FsbChsZyk7CiAJfQogfQorCisvKiBUaGlzIHJvdXRpbmUgc3VwcGxpZXMgdGhlIEd1ZXN0IHdpdGggdGltZTogaXQncyB1c2VkIGZvciB3YWxsY2xvY2sgdGltZSBhdAorICogaW5pdGlhbCBib290IGFuZCBhcyBhIHJvdWdoIHRpbWUgc291cmNlIGlmIHRoZSBUU0MgaXNuJ3QgYXZhaWxhYmxlLiAqLwordm9pZCB3cml0ZV90aW1lc3RhbXAoc3RydWN0IGxndWVzdCAqbGcpCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlrdGltZV9nZXRfcmVhbF90cygmbm93KTsKKwlpZiAocHV0X3VzZXIobm93LCAmbGctPmxndWVzdF9kYXRhLT50aW1lKSkKKwkJa2lsbF9ndWVzdChsZywgIldyaXRpbmcgdGltZXN0YW1wIik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9pbnRlcnJ1cHRzX2FuZF90cmFwcy5jIGIvZHJpdmVycy9sZ3Vlc3QvaW50ZXJydXB0c19hbmRfdHJhcHMuYwppbmRleCBiZWUwMjliLi40OTc4N2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9pbnRlcnJ1cHRzX2FuZF90cmFwcy5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2ludGVycnVwdHNfYW5kX3RyYXBzLmMKQEAgLTEsMTAwICsxLDE2MCBAQAorLypQOjgwMCBJbnRlcnJ1cHRzICh0cmFwcykgYXJlIGNvbXBsaWNhdGVkIGVub3VnaCB0byBlYXJuIHRoZWlyIG93biBmaWxlLgorICogVGhlcmUgYXJlIHRocmVlIGNsYXNzZXMgb2YgaW50ZXJydXB0czoKKyAqCisgKiAxKSBSZWFsIGhhcmR3YXJlIGludGVycnVwdHMgd2hpY2ggb2NjdXIgd2hpbGUgd2UncmUgcnVubmluZyB0aGUgR3Vlc3QsCisgKiAyKSBJbnRlcnJ1cHRzIGZvciB2aXJ0dWFsIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlIEd1ZXN0LCBhbmQKKyAqIDMpIFRyYXBzIGFuZCBmYXVsdHMgZnJvbSB0aGUgR3Vlc3QuCisgKgorICogUmVhbCBoYXJkd2FyZSBpbnRlcnJ1cHRzIG11c3QgYmUgZGVsaXZlcmVkIHRvIHRoZSBIb3N0LCBub3QgdGhlIEd1ZXN0LgorICogVmlydHVhbCBpbnRlcnJ1cHRzIG11c3QgYmUgZGVsaXZlcmVkIHRvIHRoZSBHdWVzdCwgYnV0IHdlIG1ha2UgdGhlbSBsb29rCisgKiBqdXN0IGxpa2UgcmVhbCBoYXJkd2FyZSB3b3VsZCBkZWxpdmVyIHRoZW0uICBUcmFwcyBmcm9tIHRoZSBHdWVzdCBjYW4gYmUgc2V0CisgKiB1cCB0byBnbyBkaXJlY3RseSBiYWNrIGludG8gdGhlIEd1ZXN0LCBidXQgc29tZXRpbWVzIHRoZSBIb3N0IHdhbnRzIHRvIHNlZQorICogdGhlbSBmaXJzdCwgc28gd2UgYWxzbyBoYXZlIGEgd2F5IG9mICJyZWZsZWN0aW5nIiB0aGVtIGludG8gdGhlIEd1ZXN0IGFzIGlmCisgKiB0aGV5IGhhZCBiZWVuIGRlbGl2ZXJlZCB0byBpdCBkaXJlY3RseS4gOiovCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgImxnLmgiCiAKKy8qIFRoZSBhZGRyZXNzIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBzcGxpdCBpbnRvIHR3byBiaXRzOiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWR0X2FkZHJlc3ModTMyIGxvLCB1MzIgaGkpCiB7CiAJcmV0dXJuIChsbyAmIDB4MDAwMEZGRkYpIHwgKGhpICYgMHhGRkZGMDAwMCk7CiB9CiAKKy8qIFRoZSAidHlwZSIgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGEgNCBiaXQgZmllbGQ6IHdlIG9ubHkgc3VwcG9ydCBhCisgKiBjb3VwbGUgb2YgdHlwZXMuICovCiBzdGF0aWMgaW50IGlkdF90eXBlKHUzMiBsbywgdTMyIGhpKQogewogCXJldHVybiAoaGkgPj4gOCkgJiAweEY7CiB9CiAKKy8qIEFuIElEVCBlbnRyeSBjYW4ndCBiZSB1c2VkIHVubGVzcyB0aGUgInByZXNlbnQiIGJpdCBpcyBzZXQuICovCiBzdGF0aWMgaW50IGlkdF9wcmVzZW50KHUzMiBsbywgdTMyIGhpKQogewogCXJldHVybiAoaGkgJiAweDgwMDApOwogfQogCisvKiBXZSBuZWVkIGEgaGVscGVyIHRvICJwdXNoIiBhIHZhbHVlIG9udG8gdGhlIEd1ZXN0J3Mgc3RhY2ssIHNpbmNlIHRoYXQncyBhCisgKiBiaWcgcGFydCBvZiB3aGF0IGRlbGl2ZXJpbmcgYW4gaW50ZXJydXB0IGRvZXMuICovCiBzdGF0aWMgdm9pZCBwdXNoX2d1ZXN0X3N0YWNrKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1bnNpZ25lZCBsb25nICpnc3RhY2ssIHUzMiB2YWwpCiB7CisJLyogU3RhY2sgZ3Jvd3MgdXB3YXJkczogbW92ZSBzdGFjayB0aGVuIHdyaXRlIHZhbHVlLiAqLwogCSpnc3RhY2sgLT0gNDsKIAlsZ3dyaXRlX3UzMihsZywgKmdzdGFjaywgdmFsKTsKIH0KIAorLypIOjIxMCBUaGUgc2V0X2d1ZXN0X2ludGVycnVwdCgpIHJvdXRpbmUgYWN0dWFsbHkgZGVsaXZlcnMgdGhlIGludGVycnVwdCBvcgorICogdHJhcC4gIFRoZSBtZWNoYW5pY3Mgb2YgZGVsaXZlcmluZyB0cmFwcyBhbmQgaW50ZXJydXB0cyB0byB0aGUgR3Vlc3QgYXJlIHRoZQorICogc2FtZSwgZXhjZXB0IHNvbWUgdHJhcHMgaGF2ZSBhbiAiZXJyb3IgY29kZSIgd2hpY2ggZ2V0cyBwdXNoZWQgb250byB0aGUKKyAqIHN0YWNrIGFzIHdlbGw6IHRoZSBjYWxsZXIgdGVsbHMgdXMgaWYgdGhpcyBpcyBvbmUuCisgKgorICogImxvIiBhbmQgImhpIiBhcmUgdGhlIHR3byBwYXJ0cyBvZiB0aGUgSW50ZXJydXB0IERlc2NyaXB0b3IgVGFibGUgZm9yIHRoaXMKKyAqIGludGVycnVwdCBvciB0cmFwLiAgSXQncyBzcGxpdCBpbnRvIHR3byBwYXJ0cyBmb3IgdHJhZGl0aW9uYWwgcmVhc29uczogZ2NjCisgKiBvbiBpMzg2IHVzZWQgdG8gYmUgZnJpZ2h0ZW5lZCBieSA2NCBiaXQgbnVtYmVycy4KKyAqCisgKiBXZSBzZXQgdXAgdGhlIHN0YWNrIGp1c3QgbGlrZSB0aGUgQ1BVIGRvZXMgZm9yIGEgcmVhbCBpbnRlcnJ1cHQsIHNvIGl0J3MKKyAqIGlkZW50aWNhbCBmb3IgdGhlIEd1ZXN0IChhbmQgdGhlIHN0YW5kYXJkICJpcmV0IiBpbnN0cnVjdGlvbiB3aWxsIHVuZG8KKyAqIGl0KS4gKi8KIHN0YXRpYyB2b2lkIHNldF9ndWVzdF9pbnRlcnJ1cHQoc3RydWN0IGxndWVzdCAqbGcsIHUzMiBsbywgdTMyIGhpLCBpbnQgaGFzX2VycikKIHsKIAl1bnNpZ25lZCBsb25nIGdzdGFjazsKIAl1MzIgZWZsYWdzLCBzcywgaXJxX2VuYWJsZTsKIAotCS8qIElmIHRoZXkgd2FudCBhIHJpbmcgY2hhbmdlLCB3ZSB1c2UgbmV3IHN0YWNrIGFuZCBwdXNoIG9sZCBzcy9lc3AgKi8KKwkvKiBUaGVyZSBhcmUgdHdvIGNhc2VzIGZvciBpbnRlcnJ1cHRzOiBvbmUgd2hlcmUgdGhlIEd1ZXN0IGlzIGFscmVhZHkKKwkgKiBpbiB0aGUga2VybmVsLCBhbmQgYSBtb3JlIGNvbXBsZXggb25lIHdoZXJlIHRoZSBHdWVzdCBpcyBpbgorCSAqIHVzZXJzcGFjZS4gIFdlIGNoZWNrIHRoZSBwcml2aWxlZ2UgbGV2ZWwgdG8gZmluZCBvdXQuICovCiAJaWYgKChsZy0+cmVncy0+c3MmMHgzKSAhPSBHVUVTVF9QTCkgeworCQkvKiBUaGUgR3Vlc3QgdG9sZCB1cyB0aGVpciBrZXJuZWwgc3RhY2sgd2l0aCB0aGUgU0VUX1NUQUNLCisJCSAqIGh5cGVyY2FsbDogYm90aCB0aGUgdmlydHVhbCBhZGRyZXNzIGFuZCB0aGUgc2VnbWVudCAqLwogCQlnc3RhY2sgPSBndWVzdF9wYShsZywgbGctPmVzcDEpOwogCQlzcyA9IGxnLT5zczE7CisJCS8qIFdlIHB1c2ggdGhlIG9sZCBzdGFjayBzZWdtZW50IGFuZCBwb2ludGVyIG9udG8gdGhlIG5ldworCQkgKiBzdGFjazogd2hlbiB0aGUgR3Vlc3QgZG9lcyBhbiAiaXJldCIgYmFjayBmcm9tIHRoZSBpbnRlcnJ1cHQKKwkJICogaGFuZGxlciB0aGUgQ1BVIHdpbGwgbm90aWNlIHRoZXkncmUgZHJvcHBpbmcgcHJpdmlsZWdlCisJCSAqIGxldmVscyBhbmQgZXhwZWN0IHRoZXNlIGhlcmUuICovCiAJCXB1c2hfZ3Vlc3Rfc3RhY2sobGcsICZnc3RhY2ssIGxnLT5yZWdzLT5zcyk7CiAJCXB1c2hfZ3Vlc3Rfc3RhY2sobGcsICZnc3RhY2ssIGxnLT5yZWdzLT5lc3ApOwogCX0gZWxzZSB7CisJCS8qIFdlJ3JlIHN0YXlpbmcgb24gdGhlIHNhbWUgR3Vlc3QgKGtlcm5lbCkgc3RhY2suICovCiAJCWdzdGFjayA9IGd1ZXN0X3BhKGxnLCBsZy0+cmVncy0+ZXNwKTsKIAkJc3MgPSBsZy0+cmVncy0+c3M7CiAJfQogCi0JLyogV2UgdXNlIElGIGJpdCBpbiBlZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBpcnFzIHdlcmUgZW5hYmxlZAotCSAgIChpdCdzIGFsd2F5cyAxLCBzaW5jZSBpcnFzIGFyZSBlbmFibGVkIHdoZW4gZ3Vlc3QgaXMgcnVubmluZykuICovCisJLyogUmVtZW1iZXIgdGhhdCB3ZSBuZXZlciBsZXQgdGhlIEd1ZXN0IGFjdHVhbGx5IGRpc2FibGUgaW50ZXJydXB0cywgc28KKwkgKiB0aGUgIkludGVycnVwdCBGbGFnIiBiaXQgaXMgYWx3YXlzIHNldC4gIFdlIGNvcHkgdGhhdCBiaXQgZnJvbSB0aGUKKwkgKiBHdWVzdCdzICJpcnFfZW5hYmxlZCIgZmllbGQgaW50byB0aGUgZWZsYWdzIHdvcmQ6IHRoZSBHdWVzdCBjb3BpZXMKKwkgKiBpdCBiYWNrIGluICJsZ3Vlc3RfaXJldCIuICovCiAJZWZsYWdzID0gbGctPnJlZ3MtPmVmbGFnczsKIAlpZiAoZ2V0X3VzZXIoaXJxX2VuYWJsZSwgJmxnLT5sZ3Vlc3RfZGF0YS0+aXJxX2VuYWJsZWQpID09IDAKIAkgICAgJiYgIShpcnFfZW5hYmxlICYgWDg2X0VGTEFHU19JRikpCiAJCWVmbGFncyAmPSB+WDg2X0VGTEFHU19JRjsKIAorCS8qIEFuIGludGVycnVwdCBpcyBleHBlY3RlZCB0byBwdXNoIHRocmVlIHRoaW5ncyBvbiB0aGUgc3RhY2s6IHRoZSBvbGQKKwkgKiAiZWZsYWdzIiB3b3JkLCB0aGUgb2xkIGNvZGUgc2VnbWVudCwgYW5kIHRoZSBvbGQgaW5zdHJ1Y3Rpb24KKwkgKiBwb2ludGVyLiAqLwogCXB1c2hfZ3Vlc3Rfc3RhY2sobGcsICZnc3RhY2ssIGVmbGFncyk7CiAJcHVzaF9ndWVzdF9zdGFjayhsZywgJmdzdGFjaywgbGctPnJlZ3MtPmNzKTsKIAlwdXNoX2d1ZXN0X3N0YWNrKGxnLCAmZ3N0YWNrLCBsZy0+cmVncy0+ZWlwKTsKIAorCS8qIEZvciB0aGUgc2l4IHRyYXBzIHdoaWNoIHN1cHBseSBhbiBlcnJvciBjb2RlLCB3ZSBwdXNoIHRoYXQsIHRvby4gKi8KIAlpZiAoaGFzX2VycikKIAkJcHVzaF9ndWVzdF9zdGFjayhsZywgJmdzdGFjaywgbGctPnJlZ3MtPmVycmNvZGUpOwogCi0JLyogQ2hhbmdlIHRoZSByZWFsIHN0YWNrIHNvIHN3aXRjaGVyIHJldHVybnMgdG8gdHJhcCBoYW5kbGVyICovCisJLyogTm93IHdlJ3ZlIHB1c2hlZCBhbGwgdGhlIG9sZCBzdGF0ZSwgd2UgY2hhbmdlIHRoZSBzdGFjaywgdGhlIGNvZGUKKwkgKiBzZWdtZW50IGFuZCB0aGUgYWRkcmVzcyB0byBleGVjdXRlLiAqLwogCWxnLT5yZWdzLT5zcyA9IHNzOwogCWxnLT5yZWdzLT5lc3AgPSBnc3RhY2sgKyBsZy0+cGFnZV9vZmZzZXQ7CiAJbGctPnJlZ3MtPmNzID0gKF9fS0VSTkVMX0NTfEdVRVNUX1BMKTsKIAlsZy0+cmVncy0+ZWlwID0gaWR0X2FkZHJlc3MobG8sIGhpKTsKIAotCS8qIERpc2FibGUgaW50ZXJydXB0cyBmb3IgYW4gaW50ZXJydXB0IGdhdGUuICovCisJLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBpbnRlcnJ1cHQgaGFuZGxlcnM6IDB4RSBpcyBhbiAiaW50ZXJydXB0CisJICogZ2F0ZSIgd2hpY2ggZXhwZWN0cyBpbnRlcnJ1cHRzIHRvIGJlIGRpc2FibGVkIG9uIGVudHJ5LiAqLwogCWlmIChpZHRfdHlwZShsbywgaGkpID09IDB4RSkKIAkJaWYgKHB1dF91c2VyKDAsICZsZy0+bGd1ZXN0X2RhdGEtPmlycV9lbmFibGVkKSkKIAkJCWtpbGxfZ3Vlc3QobGcsICJEaXNhYmxpbmcgaW50ZXJydXB0cyIpOwogfQogCisvKkg6MjAwCisgKiBWaXJ0dWFsIEludGVycnVwdHMuCisgKgorICogbWF5YmVfZG9faW50ZXJydXB0KCkgZ2V0cyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGVudHJ5IHRvIHRoZSBHdWVzdCwgdG8gc2VlIGlmCisgKiB3ZSBzaG91bGQgZGl2ZXJ0IHRoZSBHdWVzdCB0byBydW5uaW5nIGFuIGludGVycnVwdCBoYW5kbGVyLiAqLwogdm9pZCBtYXliZV9kb19pbnRlcnJ1cHQoc3RydWN0IGxndWVzdCAqbGcpCiB7CiAJdW5zaWduZWQgaW50IGlycTsKIAlERUNMQVJFX0JJVE1BUChibGssIExHVUVTVF9JUlFTKTsKIAlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmlkdDsKIAorCS8qIElmIHRoZSBHdWVzdCBoYXNuJ3QgZXZlbiBpbml0aWFsaXplZCB5ZXQsIHdlIGNhbiBkbyBub3RoaW5nLiAqLwogCWlmICghbGctPmxndWVzdF9kYXRhKQogCQlyZXR1cm47CiAKLQkvKiBNYXNrIG91dCBhbnkgaW50ZXJydXB0cyB0aGV5IGhhdmUgYmxvY2tlZC4gKi8KKwkvKiBUYWtlIG91ciAiaXJxc19wZW5kaW5nIiBhcnJheSBhbmQgcmVtb3ZlIGFueSBpbnRlcnJ1cHRzIHRoZSBHdWVzdAorCSAqIHdhbnRzIGJsb2NrZWQ6IHRoZSByZXN1bHQgZW5kcyB1cCBpbiAiYmxrIi4gKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoJmJsaywgbGctPmxndWVzdF9kYXRhLT5ibG9ja2VkX2ludGVycnVwdHMsCiAJCQkgICBzaXplb2YoYmxrKSkpCiAJCXJldHVybjsKIAogCWJpdG1hcF9hbmRub3QoYmxrLCBsZy0+aXJxc19wZW5kaW5nLCBibGssIExHVUVTVF9JUlFTKTsKIAorCS8qIEZpbmQgdGhlIGZpcnN0IGludGVycnVwdC4gKi8KIAlpcnEgPSBmaW5kX2ZpcnN0X2JpdChibGssIExHVUVTVF9JUlFTKTsKKwkvKiBOb25lPyAgTm90aGluZyB0byBkbyAqLwogCWlmIChpcnEgPj0gTEdVRVNUX0lSUVMpCiAJCXJldHVybjsKIAorCS8qIFRoZXkgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYW4gaXJldCwgd2hlcmUgdGhleSBhc2tlZCB1cyBuZXZlciB0bworCSAqIGRlbGl2ZXIgaW50ZXJydXB0cy4gKi8KIAlpZiAobGctPnJlZ3MtPmVpcCA+PSBsZy0+bm9pcnFfc3RhcnQgJiYgbGctPnJlZ3MtPmVpcCA8IGxnLT5ub2lycV9lbmQpCiAJCXJldHVybjsKIAotCS8qIElmIHRoZXkncmUgaGFsdGVkLCB3ZSByZS1lbmFibGUgaW50ZXJydXB0cy4gKi8KKwkvKiBJZiB0aGV5J3JlIGhhbHRlZCwgaW50ZXJydXB0cyByZXN0YXJ0IHRoZW0uICovCiAJaWYgKGxnLT5oYWx0ZWQpIHsKIAkJLyogUmUtZW5hYmxlIGludGVycnVwdHMuICovCiAJCWlmIChwdXRfdXNlcihYODZfRUZMQUdTX0lGLCAmbGctPmxndWVzdF9kYXRhLT5pcnFfZW5hYmxlZCkpCiAJCQlraWxsX2d1ZXN0KGxnLCAiUmUtZW5hYmxpbmcgaW50ZXJydXB0cyIpOwogCQlsZy0+aGFsdGVkID0gMDsKIAl9IGVsc2UgewotCQkvKiBNYXliZSB0aGV5IGhhdmUgaW50ZXJydXB0cyBkaXNhYmxlZD8gKi8KKwkJLyogT3RoZXJ3aXNlIHdlIGNoZWNrIGlmIHRoZXkgaGF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkLiAqLwogCQl1MzIgaXJxX2VuYWJsZWQ7CiAJCWlmIChnZXRfdXNlcihpcnFfZW5hYmxlZCwgJmxnLT5sZ3Vlc3RfZGF0YS0+aXJxX2VuYWJsZWQpKQogCQkJaXJxX2VuYWJsZWQgPSAwOwpAQCAtMTAyLDExMiArMTYyLDIxOCBAQAogCQkJcmV0dXJuOwogCX0KIAorCS8qIExvb2sgYXQgdGhlIElEVCBlbnRyeSB0aGUgR3Vlc3QgZ2F2ZSB1cyBmb3IgdGhpcyBpbnRlcnJ1cHQuICBUaGUKKwkgKiBmaXJzdCAzMiAoRklSU1RfRVhURVJOQUxfVkVDVE9SKSBlbnRyaWVzIGFyZSBmb3IgdHJhcHMsIHNvIHdlIHNraXAKKwkgKiBvdmVyIHRoZW0uICovCiAJaWR0ID0gJmxnLT5pZHRbRklSU1RfRVhURVJOQUxfVkVDVE9SK2lycV07CisJLyogSWYgdGhleSBkb24ndCBoYXZlIGEgaGFuZGxlciAoeWV0PyksIHdlIGp1c3QgaWdub3JlIGl0ICovCiAJaWYgKGlkdF9wcmVzZW50KGlkdC0+YSwgaWR0LT5iKSkgeworCQkvKiBPSywgbWFyayBpdCBubyBsb25nZXIgcGVuZGluZyBhbmQgZGVsaXZlciBpdC4gKi8KIAkJY2xlYXJfYml0KGlycSwgbGctPmlycXNfcGVuZGluZyk7CisJCS8qIHNldF9ndWVzdF9pbnRlcnJ1cHQoKSB0YWtlcyB0aGUgaW50ZXJydXB0IGRlc2NyaXB0b3IgYW5kIGEKKwkJICogZmxhZyB0byBzYXkgd2hldGhlciB0aGlzIGludGVycnVwdCBwdXNoZXMgYW4gZXJyb3IgY29kZSBvbnRvCisJCSAqIHRoZSBzdGFjayBhcyB3ZWxsOiB2aXJ0dWFsIGludGVycnVwdHMgbmV2ZXIgZG8uICovCiAJCXNldF9ndWVzdF9pbnRlcnJ1cHQobGcsIGlkdC0+YSwgaWR0LT5iLCAwKTsKIAl9CisKKwkvKiBFdmVyeSB0aW1lIHdlIGRlbGl2ZXIgYW4gaW50ZXJydXB0LCB3ZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUKKwkgKiBHdWVzdCdzIGxndWVzdF9kYXRhIHN0cnVjdC4gIEl0IHdvdWxkIGJlIGJldHRlciBmb3IgdGhlIEd1ZXN0IGlmIHdlCisJICogZGlkIHRoaXMgbW9yZSBvZnRlbiwgYnV0IGl0IGNhbiBhY3R1YWxseSBiZSBxdWl0ZSBzbG93OiBkb2luZyBpdAorCSAqIGhlcmUgaXMgYSBjb21wcm9taXNlIHdoaWNoIG1lYW5zIGF0IGxlYXN0IGl0IGdldHMgdXBkYXRlZCBldmVyeQorCSAqIHRpbWVyIGludGVycnVwdC4gKi8KKwl3cml0ZV90aW1lc3RhbXAobGcpOwogfQogCisvKkg6MjIwIE5vdyB3ZSd2ZSBnb3QgdGhlIHJvdXRpbmVzIHRvIGRlbGl2ZXIgaW50ZXJydXB0cywgZGVsaXZlcmluZyB0cmFwcworICogbGlrZSBwYWdlIGZhdWx0IGlzIGVhc3kuICBUaGUgb25seSB0cmljayBpcyB0aGF0IEludGVsIGRlY2lkZWQgdGhhdCBzb21lCisgKiB0cmFwcyBzaG91bGQgaGF2ZSBlcnJvciBjb2RlczogKi8KIHN0YXRpYyBpbnQgaGFzX2Vycih1bnNpZ25lZCBpbnQgdHJhcCkKIHsKIAlyZXR1cm4gKHRyYXAgPT0gOCB8fCAodHJhcCA+PSAxMCAmJiB0cmFwIDw9IDE0KSB8fCB0cmFwID09IDE3KTsKIH0KIAorLyogZGVsaXZlcl90cmFwKCkgcmV0dXJucyB0cnVlIGlmIGl0IGNvdWxkIGRlbGl2ZXIgdGhlIHRyYXAuICovCiBpbnQgZGVsaXZlcl90cmFwKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1bnNpZ25lZCBpbnQgbnVtKQogewogCXUzMiBsbyA9IGxnLT5pZHRbbnVtXS5hLCBoaSA9IGxnLT5pZHRbbnVtXS5iOwogCisJLyogRWFybHkgb24gdGhlIEd1ZXN0IGhhc24ndCBzZXQgdGhlIElEVCBlbnRyaWVzIChvciBtYXliZSBpdCBwdXQgYQorCSAqIGJvZ3VzIG9uZSBpbik6IGlmIHdlIGZhaWwgaGVyZSwgdGhlIEd1ZXN0IHdpbGwgYmUga2lsbGVkLiAqLwogCWlmICghaWR0X3ByZXNlbnQobG8sIGhpKSkKIAkJcmV0dXJuIDA7CiAJc2V0X2d1ZXN0X2ludGVycnVwdChsZywgbG8sIGhpLCBoYXNfZXJyKG51bSkpOwogCXJldHVybiAxOwogfQogCisvKkg6MjUwIEhlcmUncyB0aGUgaGFyZCBwYXJ0OiByZXR1cm5pbmcgdG8gdGhlIEhvc3QgZXZlcnkgdGltZSBhIHRyYXAgaGFwcGVucworICogYW5kIHRoZW4gY2FsbGluZyBkZWxpdmVyX3RyYXAoKSBhbmQgcmUtZW50ZXJpbmcgdGhlIEd1ZXN0IGlzIHNsb3cuCisgKiBQYXJ0aWN1bGFybHkgYmVjYXVzZSBHdWVzdCB1c2Vyc3BhY2Ugc3lzdGVtIGNhbGxzIGFyZSB0cmFwcyAodHJhcCAxMjgpLgorICoKKyAqIFNvIHdlJ2QgbGlrZSB0byBzZXQgdXAgdGhlIElEVCB0byB0ZWxsIHRoZSBDUFUgdG8gZGVsaXZlciB0cmFwcyBkaXJlY3RseQorICogaW50byB0aGUgR3Vlc3QuICBUaGlzIGlzIHBvc3NpYmxlLCBidXQgdGhlIGNvbXBsZXhpdGllcyBjYXVzZSB0aGUgc2l6ZSBvZgorICogdGhpcyBmaWxlIHRvIGRvdWJsZSEgIEhvd2V2ZXIsIDE1MCBsaW5lcyBvZiBjb2RlIGlzIHdvcnRoIHdyaXRpbmcgZm9yIHRha2luZworICogc3lzdGVtIGNhbGxzIGRvd24gZnJvbSAxNzUwbnMgdG8gMjcwbnMuICBQbHVzLCBpZiBsZ3Vlc3QgZGlkbid0IGRvIGl0LCBhbGwKKyAqIHRoZSBvdGhlciBoeXBlcnZpc29ycyB3b3VsZCB0ZWFzZSBpdC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyBpZiBhIHRyYXAgY2FuIGJlIGRlbGl2ZXJlZCBkaXJlY3RseS4gKi8KIHN0YXRpYyBpbnQgZGlyZWN0X3RyYXAoY29uc3Qgc3RydWN0IGxndWVzdCAqbGcsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKnRyYXAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtKQogewotCS8qIEhhcmR3YXJlIGludGVycnVwdHMgZG9uJ3QgZ28gdG8gZ3Vlc3QgKGV4Y2VwdCBzeXNjYWxsKS4gKi8KKwkvKiBIYXJkd2FyZSBpbnRlcnJ1cHRzIGRvbid0IGdvIHRvIHRoZSBHdWVzdCBhdCBhbGwgKGV4Y2VwdCBzeXN0ZW0KKwkgKiBjYWxsKS4gKi8KIAlpZiAobnVtID49IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiAmJiBudW0gIT0gU1lTQ0FMTF9WRUNUT1IpCiAJCXJldHVybiAwOwogCi0JLyogV2UgaW50ZXJjZXB0IHBhZ2UgZmF1bHQgKGRlbWFuZCBzaGFkb3cgcGFnaW5nICYgY3IyIHNhdmluZykKLQkgICBwcm90ZWN0aW9uIGZhdWx0IChpbi9vdXQgZW11bGF0aW9uKSBhbmQgZGV2aWNlIG5vdAotCSAgIGF2YWlsYWJsZSAoVFMgaGFuZGxpbmcpLCBhbmQgaHlwZXJjYWxsICovCisJLyogVGhlIEhvc3QgbmVlZHMgdG8gc2VlIHBhZ2UgZmF1bHRzIChmb3Igc2hhZG93IHBhZ2luZyBhbmQgdG8gc2F2ZSB0aGUKKwkgKiBmYXVsdCBhZGRyZXNzKSwgZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0cyAoaW4vb3V0IGVtdWxhdGlvbikgYW5kCisJICogZGV2aWNlIG5vdCBhdmFpbGFibGUgKFRTIGhhbmRsaW5nKSwgYW5kIG9mIGNvdXJzZSwgdGhlIGh5cGVyY2FsbAorCSAqIHRyYXAuICovCiAJaWYgKG51bSA9PSAxNCB8fCBudW0gPT0gMTMgfHwgbnVtID09IDcgfHwgbnVtID09IExHVUVTVF9UUkFQX0VOVFJZKQogCQlyZXR1cm4gMDsKIAotCS8qIEludGVycnVwdCBnYXRlcyAoMHhFKSBvciBub3QgcHJlc2VudCAoMHgwKSBjYW4ndCBnbyBkaXJlY3QuICovCisJLyogT25seSB0cmFwIGdhdGVzICh0eXBlIDE1KSBjYW4gZ28gZGlyZWN0IHRvIHRoZSBHdWVzdC4gIEludGVycnVwdAorCSAqIGdhdGVzICh0eXBlIDE0KSBkaXNhYmxlIGludGVycnVwdHMgYXMgdGhleSBhcmUgZW50ZXJlZCwgd2hpY2ggd2UKKwkgKiBuZXZlciBsZXQgdGhlIEd1ZXN0IGRvLiAgTm90IHByZXNlbnQgZW50cmllcyAodHlwZSAweDApIGFsc28gY2FuJ3QKKwkgKiBnbyBkaXJlY3QsIG9mIGNvdXJzZSA4KSAqLwogCXJldHVybiBpZHRfdHlwZSh0cmFwLT5hLCB0cmFwLT5iKSA9PSAweEY7CiB9CisvKjoqLwogCisvKk06MDA1IFRoZSBHdWVzdCBoYXMgdGhlIGFiaWxpdHkgdG8gdHVybiBpdHMgaW50ZXJydXB0IGdhdGVzIGludG8gdHJhcCBnYXRlcywKKyAqIGlmIGl0IGlzIGNhcmVmdWwuICBUaGUgSG9zdCB3aWxsIGxldCB0cmFwIGdhdGVzIGNhbiBnbyBkaXJlY3RseSB0byB0aGUKKyAqIEd1ZXN0LCBidXQgdGhlIEd1ZXN0IG5lZWRzIHRoZSBpbnRlcnJ1cHRzIGF0b21pY2FsbHkgZGlzYWJsZWQgZm9yIGFuCisgKiBpbnRlcnJ1cHQgZ2F0ZS4gIEl0IGNhbiBkbyB0aGlzIGJ5IHBvaW50aW5nIHRoZSB0cmFwIGdhdGUgYXQgaW5zdHJ1Y3Rpb25zCisgKiB3aXRoaW4gbm9pcnFfc3RhcnQgYW5kIG5vaXJxX2VuZCwgd2hlcmUgaXQgY2FuIHNhZmVseSBkaXNhYmxlIGludGVycnVwdHMuICovCisKKy8qTTowMDYgVGhlIEd1ZXN0cyBkbyBub3QgdXNlIHRoZSBzeXNlbnRlciAoZmFzdCBzeXN0ZW0gY2FsbCkgaW5zdHJ1Y3Rpb24sCisgKiBiZWNhdXNlIGl0J3MgaGFyZGNvZGVkIHRvIGVudGVyIHByaXZpbGVnZSBsZXZlbCAwIGFuZCBzbyBjYW4ndCBnbyBkaXJlY3QuCisgKiBJdCdzIGFib3V0IHR3aWNlIGFzIGZhc3QgYXMgdGhlIG9sZGVyICJpbnQgMHg4MCIgc3lzdGVtIGNhbGwsIHNvIGl0IG1pZ2h0CisgKiBzdGlsbCBiZSB3b3J0aHdoaWxlIHRvIGhhbmRsZSBpdCBpbiB0aGUgU3dpdGNoZXIgYW5kIGxjYWxsIGRvd24gdG8gdGhlCisgKiBHdWVzdC4gIFRoZSBzeXNlbnRlciBzZW1hbnRpY3MgYXJlIGhhaXJ5IHRobzogc2VhcmNoIGZvciB0aGF0IGtleXdvcmQgaW4KKyAqIGVudHJ5LlMgOiovCisKKy8qSDoyNjAgV2hlbiB3ZSBtYWtlIHRyYXBzIGdvIGRpcmVjdGx5IGludG8gdGhlIEd1ZXN0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorICogdGhlIGtlcm5lbCBzdGFjayBpcyB2YWxpZCAoaWUuIG1hcHBlZCBpbiB0aGUgcGFnZSB0YWJsZXMpLiAgT3RoZXJ3aXNlLCB0aGUKKyAqIENQVSB0cnlpbmcgdG8gZGVsaXZlciB0aGUgdHJhcCB3aWxsIGZhdWx0IHdoaWxlIHRyeWluZyB0byBwdXNoIHRoZSBpbnRlcnJ1cHQKKyAqIHdvcmRzIG9uIHRoZSBzdGFjazogdGhpcyBpcyBjYWxsZWQgYSBkb3VibGUgZmF1bHQsIGFuZCBpdCBmb3JjZXMgdXMgdG8ga2lsbAorICogdGhlIEd1ZXN0LgorICoKKyAqIFdoaWNoIGlzIGRlZXBseSB1bmZhaXIsIGJlY2F1c2UgKGxpdGVyYWxseSEpIGl0IHdhc24ndCB0aGUgR3Vlc3RzJyBmYXVsdC4gKi8KIHZvaWQgcGluX3N0YWNrX3BhZ2VzKHN0cnVjdCBsZ3Vlc3QgKmxnKQogewogCXVuc2lnbmVkIGludCBpOwogCisJLyogRGVwZW5kaW5nIG9uIHRoZSBDT05GSUdfNEtTVEFDS1Mgb3B0aW9uLCB0aGUgR3Vlc3QgY2FuIGhhdmUgb25lIG9yCisJICogdHdvIHBhZ2VzIG9mIHN0YWNrIHNwYWNlLiAqLwogCWZvciAoaSA9IDA7IGkgPCBsZy0+c3RhY2tfcGFnZXM7IGkrKykKKwkJLyogVGhlIHN0YWNrIGdyb3dzICp1cHdhcmRzKiwgaGVuY2UgdGhlIHN1YnRyYWN0aW9uICovCiAJCXBpbl9wYWdlKGxnLCBsZy0+ZXNwMSAtIGkgKiBQQUdFX1NJWkUpOwogfQogCisvKiBEaXJlY3QgdHJhcHMgYWxzbyBtZWFuIHRoYXQgd2UgbmVlZCB0byBrbm93IHdoZW5ldmVyIHRoZSBHdWVzdCB3YW50cyB0byB1c2UKKyAqIGEgZGlmZmVyZW50IGtlcm5lbCBzdGFjaywgc28gd2UgY2FuIGNoYW5nZSB0aGUgSURUIGVudHJpZXMgdG8gdXNlIHRoYXQKKyAqIHN0YWNrLiAgVGhlIElEVCBlbnRyaWVzIGV4cGVjdCBhIHZpcnR1YWwgYWRkcmVzcywgc28gdW5saWtlIG1vc3QgYWRkcmVzc2VzCisgKiB0aGUgR3Vlc3QgZ2l2ZXMgdXMsIHRoZSAiZXNwIiAoc3RhY2sgcG9pbnRlcikgdmFsdWUgaGVyZSBpcyB2aXJ0dWFsLCBub3QKKyAqIHBoeXNpY2FsLgorICoKKyAqIEluIExpbnV4IGVhY2ggcHJvY2VzcyBoYXMgaXRzIG93biBrZXJuZWwgc3RhY2ssIHNvIHRoaXMgaGFwcGVucyBhIGxvdDogd2UKKyAqIGNoYW5nZSBzdGFja3Mgb24gZWFjaCBjb250ZXh0IHN3aXRjaC4gKi8KIHZvaWQgZ3Vlc3Rfc2V0X3N0YWNrKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1MzIgc2VnLCB1MzIgZXNwLCB1bnNpZ25lZCBpbnQgcGFnZXMpCiB7Ci0JLyogWW91IGNhbm5vdCBoYXZlIGEgc3RhY2sgc2VnbWVudCB3aXRoIHByaXYgbGV2ZWwgMC4gKi8KKwkvKiBZb3UgYXJlIG5vdCBhbGxvd2QgaGF2ZSBhIHN0YWNrIHNlZ21lbnQgd2l0aCBwcml2aWxlZ2UgbGV2ZWwgMDogYmFkCisJICogR3Vlc3QhICovCiAJaWYgKChzZWcgJiAweDMpICE9IEdVRVNUX1BMKQogCQlraWxsX2d1ZXN0KGxnLCAiYmFkIHN0YWNrIHNlZ21lbnQgJWkiLCBzZWcpOworCS8qIFdlIG9ubHkgZXhwZWN0IG9uZSBvciB0d28gc3RhY2sgcGFnZXMuICovCiAJaWYgKHBhZ2VzID4gMikKIAkJa2lsbF9ndWVzdChsZywgImJhZCBzdGFjayBwYWdlcyAldSIsIHBhZ2VzKTsKKwkvKiBTYXZlIHdoZXJlIHRoZSBzdGFjayBpcywgYW5kIGhvdyBtYW55IHBhZ2VzICovCiAJbGctPnNzMSA9IHNlZzsKIAlsZy0+ZXNwMSA9IGVzcDsKIAlsZy0+c3RhY2tfcGFnZXMgPSBwYWdlczsKKwkvKiBNYWtlIHN1cmUgdGhlIG5ldyBzdGFjayBwYWdlcyBhcmUgbWFwcGVkICovCiAJcGluX3N0YWNrX3BhZ2VzKGxnKTsKIH0KIAotLyogU2V0IHVwIHRyYXAgaW4gSURULiAqLworLyogQWxsIHRoaXMgcmVmZXJlbmNlIHRvIG1hcHBpbmcgc3RhY2tzIGxlYWRzIHVzIG5lYXRseSBpbnRvIHRoZSBvdGhlciBjb21wbGV4CisgKiBwYXJ0IG9mIHRoZSBIb3N0OiBwYWdlIHRhYmxlIGhhbmRsaW5nLiAqLworCisvKkg6MjM1IFRoaXMgaXMgdGhlIHJvdXRpbmUgd2hpY2ggYWN0dWFsbHkgY2hlY2tzIHRoZSBHdWVzdCdzIElEVCBlbnRyeSBhbmQKKyAqIHRyYW5zZmVycyBpdCBpbnRvIG91ciBlbnRyeSBpbiAic3RydWN0IGxndWVzdCI6ICovCiBzdGF0aWMgdm9pZCBzZXRfdHJhcChzdHJ1Y3QgbGd1ZXN0ICpsZywgc3RydWN0IGRlc2Nfc3RydWN0ICp0cmFwLAogCQkgICAgIHVuc2lnbmVkIGludCBudW0sIHUzMiBsbywgdTMyIGhpKQogewogCXU4IHR5cGUgPSBpZHRfdHlwZShsbywgaGkpOwogCisJLyogV2UgemVyby1vdXQgYSBub3QtcHJlc2VudCBlbnRyeSAqLwogCWlmICghaWR0X3ByZXNlbnQobG8sIGhpKSkgewogCQl0cmFwLT5hID0gdHJhcC0+YiA9IDA7CiAJCXJldHVybjsKIAl9CiAKKwkvKiBXZSBvbmx5IHN1cHBvcnQgaW50ZXJydXB0IGFuZCB0cmFwIGdhdGVzLiAqLwogCWlmICh0eXBlICE9IDB4RSAmJiB0eXBlICE9IDB4RikKIAkJa2lsbF9ndWVzdChsZywgImJhZCBJRFQgdHlwZSAlaSIsIHR5cGUpOwogCisJLyogV2Ugb25seSBjb3B5IHRoZSBoYW5kbGVyIGFkZHJlc3MsIHByZXNlbnQgYml0LCBwcml2aWxlZ2UgbGV2ZWwgYW5kCisJICogdHlwZS4gIFRoZSBwcml2aWxlZ2UgbGV2ZWwgY29udHJvbHMgd2hlcmUgdGhlIHRyYXAgY2FuIGJlIHRyaWdnZXJlZAorCSAqIG1hbnVhbGx5IHdpdGggYW4gImludCIgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzdWFsbHkgR1VFU1RfUEwsCisJICogZXhjZXB0IGZvciBzeXN0ZW0gY2FsbHMgd2hpY2ggdXNlcnNwYWNlIGNhbiB1c2UuICovCiAJdHJhcC0+YSA9ICgoX19LRVJORUxfQ1N8R1VFU1RfUEwpPDwxNikgfCAobG8mMHgwMDAwRkZGRik7CiAJdHJhcC0+YiA9IChoaSYweEZGRkZFRjAwKTsKIH0KIAorLypIOjIzMCBXaGlsZSB3ZSdyZSBoZXJlLCBkZWFsaW5nIHdpdGggZGVsaXZlcmluZyB0cmFwcyBhbmQgaW50ZXJydXB0cyB0byB0aGUKKyAqIEd1ZXN0LCB3ZSBtaWdodCBhcyB3ZWxsIGNvbXBsZXRlIHRoZSBwaWN0dXJlOiBob3cgdGhlIEd1ZXN0IHRlbGxzIHVzIHdoZXJlCisgKiBpdCB3YW50cyB0aGVtIHRvIGdvLiAgVGhpcyB3b3VsZCBiZSBzaW1wbGUsIGV4Y2VwdCBtYWtpbmcgdHJhcHMgZmFzdAorICogcmVxdWlyZXMgc29tZSB0cmlja3MuCisgKgorICogV2Ugc2F3IHRoZSBHdWVzdCBzZXR0aW5nIEludGVycnVwdCBEZXNjcmlwdG9yIFRhYmxlIChJRFQpIGVudHJpZXMgd2l0aCB0aGUKKyAqIExIQ0FMTF9MT0FEX0lEVF9FTlRSWSBoeXBlcmNhbGwgYmVmb3JlOiB0aGF0IGNvbWVzIGhlcmUuICovCiB2b2lkIGxvYWRfZ3Vlc3RfaWR0X2VudHJ5KHN0cnVjdCBsZ3Vlc3QgKmxnLCB1bnNpZ25lZCBpbnQgbnVtLCB1MzIgbG8sIHUzMiBoaSkKIHsKLQkvKiBHdWVzdCBuZXZlciBoYW5kbGVzOiBOTUksIGRvdWJsZWZhdWx0LCBoeXBlcmNhbGwsIHNwdXJpb3VzIGlycS4gKi8KKwkvKiBHdWVzdCBuZXZlciBoYW5kbGVzOiBOTUksIGRvdWJsZWZhdWx0LCBzcHVyaW91cyBpbnRlcnJ1cHQgb3IKKwkgKiBoeXBlcmNhbGwuICBXZSBpZ25vcmUgd2hlbiBpdCB0cmllcyB0byBzZXQgdGhlbS4gKi8KIAlpZiAobnVtID09IDIgfHwgbnVtID09IDggfHwgbnVtID09IDE1IHx8IG51bSA9PSBMR1VFU1RfVFJBUF9FTlRSWSkKIAkJcmV0dXJuOwogCisJLyogTWFyayB0aGUgSURUIGFzIGNoYW5nZWQ6IG5leHQgdGltZSB0aGUgR3Vlc3QgcnVucyB3ZSdsbCBrbm93IHdlIGhhdmUKKwkgKiB0byBjb3B5IHRoaXMgYWdhaW4uICovCiAJbGctPmNoYW5nZWQgfD0gQ0hBTkdFRF9JRFQ7CisKKwkvKiBUaGUgSURUIHdoaWNoIHdlIGtlZXAgaW4gInN0cnVjdCBsZ3Vlc3QiIG9ubHkgY29udGFpbnMgMzIgZW50cmllcworCSAqIGZvciB0aGUgdHJhcHMgYW5kIExHVUVTVF9JUlFTICgzMikgZW50cmllcyBmb3IgaW50ZXJydXB0cy4gIFdlCisJICogaWdub3JlIGF0dGVtcHRzIHRvIHNldCBoYW5kbGVycyBmb3IgaGlnaGVyIGludGVycnVwdCBudW1iZXJzLCBleGNlcHQKKwkgKiBmb3IgdGhlIHN5c3RlbSBjYWxsICJpbnRlcnJ1cHQiIGF0IDEyODogd2UgaGF2ZSBhIHNwZWNpYWwgSURUIGVudHJ5CisJICogZm9yIHRoYXQuICovCiAJaWYgKG51bSA8IEFSUkFZX1NJWkUobGctPmlkdCkpCiAJCXNldF90cmFwKGxnLCAmbGctPmlkdFtudW1dLCBudW0sIGxvLCBoaSk7CiAJZWxzZSBpZiAobnVtID09IFNZU0NBTExfVkVDVE9SKQogCQlzZXRfdHJhcChsZywgJmxnLT5zeXNjYWxsX2lkdCwgbnVtLCBsbywgaGkpOwogfQogCisvKiBUaGUgZGVmYXVsdCBlbnRyeSBmb3IgZWFjaCBpbnRlcnJ1cHQgcG9pbnRzIGludG8gdGhlIFN3aXRjaGVyIHJvdXRpbmVzIHdoaWNoCisgKiBzaW1wbHkgcmV0dXJuIHRvIHRoZSBIb3N0LiAgVGhlIHJ1bl9ndWVzdCgpIGxvb3Agd2lsbCB0aGVuIGNhbGwKKyAqIGRlbGl2ZXJfdHJhcCgpIHRvIGJvdW5jZSBpdCBiYWNrIGludG8gdGhlIEd1ZXN0LiAqLwogc3RhdGljIHZvaWQgZGVmYXVsdF9pZHRfZW50cnkoc3RydWN0IGRlc2Nfc3RydWN0ICppZHQsCiAJCQkgICAgICBpbnQgdHJhcCwKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgaGFuZGxlcikKIHsKKwkvKiBBIHByZXNlbnQgaW50ZXJydXB0IGdhdGUuICovCiAJdTMyIGZsYWdzID0gMHg4ZTAwOwogCi0JLyogVGhleSBjYW4ndCAiaW50IiBpbnRvIGFueSBvZiB0aGVtIGV4Y2VwdCBoeXBlcmNhbGwuICovCisJLyogU2V0IHRoZSBwcml2aWxlZ2UgbGV2ZWwgb24gdGhlIGVudHJ5IGZvciB0aGUgaHlwZXJjYWxsOiB0aGlzIGFsbG93cworCSAqIHRoZSBHdWVzdCB0byB1c2UgdGhlICJpbnQiIGluc3RydWN0aW9uIHRvIHRyaWdnZXIgaXQuICovCiAJaWYgKHRyYXAgPT0gTEdVRVNUX1RSQVBfRU5UUlkpCiAJCWZsYWdzIHw9IChHVUVTVF9QTCA8PCAxMyk7CiAKKwkvKiBOb3cgcGFjayBpdCBpbnRvIHRoZSBJRFQgZW50cnkgaW4gaXRzIHdlaXJkIGZvcm1hdC4gKi8KIAlpZHQtPmEgPSAoTEdVRVNUX0NTPDwxNikgfCAoaGFuZGxlciYweDAwMDBGRkZGKTsKIAlpZHQtPmIgPSAoaGFuZGxlciYweEZGRkYwMDAwKSB8IGZsYWdzOwogfQogCisvKiBXaGVuIHRoZSBHdWVzdCBmaXJzdCBzdGFydHMsIHdlIHB1dCBkZWZhdWx0IGVudHJpZXMgaW50byB0aGUgSURULiAqLwogdm9pZCBzZXR1cF9kZWZhdWx0X2lkdF9lbnRyaWVzKHN0cnVjdCBsZ3Vlc3Rfcm9fc3RhdGUgKnN0YXRlLAogCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmRlZikKIHsKQEAgLTIxNywxOSArMzgzLDI1IEBACiAJCWRlZmF1bHRfaWR0X2VudHJ5KCZzdGF0ZS0+Z3Vlc3RfaWR0W2ldLCBpLCBkZWZbaV0pOwogfQogCisvKkg6MjQwIFdlIGRvbid0IHVzZSB0aGUgSURUIGVudHJpZXMgaW4gdGhlICJzdHJ1Y3QgbGd1ZXN0IiBkaXJlY3RseSwgaW5zdGVhZAorICogd2UgY29weSB0aGVtIGludG8gdGhlIElEVCB3aGljaCB3ZSd2ZSBzZXQgdXAgZm9yIEd1ZXN0cyBvbiB0aGlzIENQVSwganVzdAorICogYmVmb3JlIHdlIHJ1biB0aGUgR3Vlc3QuICBUaGlzIHJvdXRpbmUgZG9lcyB0aGF0IGNvcHkuICovCiB2b2lkIGNvcHlfdHJhcHMoY29uc3Qgc3RydWN0IGxndWVzdCAqbGcsIHN0cnVjdCBkZXNjX3N0cnVjdCAqaWR0LAogCQljb25zdCB1bnNpZ25lZCBsb25nICpkZWYpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQkvKiBBbGwgaGFyZHdhcmUgaW50ZXJydXB0cyBhcmUgc2FtZSB3aGF0ZXZlciB0aGUgZ3Vlc3Q6IG9ubHkgdGhlCi0JICogdHJhcHMgbWlnaHQgYmUgZGlmZmVyZW50LiAqLworCS8qIFdlIGNhbiBzaW1wbHkgY29weSB0aGUgZGlyZWN0IHRyYXBzLCBvdGhlcndpc2Ugd2UgdXNlIHRoZSBkZWZhdWx0CisJICogb25lcyBpbiB0aGUgU3dpdGNoZXI6IHRoZXkgd2lsbCByZXR1cm4gdG8gdGhlIEhvc3QuICovCiAJZm9yIChpID0gMDsgaSA8IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUjsgaSsrKSB7CiAJCWlmIChkaXJlY3RfdHJhcChsZywgJmxnLT5pZHRbaV0sIGkpKQogCQkJaWR0W2ldID0gbGctPmlkdFtpXTsKIAkJZWxzZQogCQkJZGVmYXVsdF9pZHRfZW50cnkoJmlkdFtpXSwgaSwgZGVmW2ldKTsKIAl9CisKKwkvKiBEb24ndCBmb3JnZXQgdGhlIHN5c3RlbSBjYWxsIHRyYXAhICBUaGUgSURUIGVudHJpZXMgZm9yIG90aGVyCisJICogaW50ZXJ1cHRzIG5ldmVyIGNoYW5nZSwgc28gbm8gbmVlZCB0byBjb3B5IHRoZW0uICovCiAJaSA9IFNZU0NBTExfVkVDVE9SOwogCWlmIChkaXJlY3RfdHJhcChsZywgJmxnLT5zeXNjYWxsX2lkdCwgaSkpCiAJCWlkdFtpXSA9IGxnLT5zeXNjYWxsX2lkdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2lvLmMgYi9kcml2ZXJzL2xndWVzdC9pby5jCmluZGV4IGM4ZWI3OTIuLmVhNjg2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2lvLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvaW8uYwpAQCAtMSw1ICsxLDkgQEAKLS8qIFNpbXBsZSBJL08gbW9kZWwgZm9yIGd1ZXN0cywgYmFzZWQgb24gc2hhcmVkIG1lbW9yeS4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBSdXN0eSBSdXNzZWxsIElCTSBDb3Jwb3JhdGlvbgorLypQOjMwMCBUaGUgSS9PIG1lY2hhbmlzbSBpbiBsZ3Vlc3QgaXMgc2ltcGxlIHlldCBmbGV4aWJsZSwgYWxsb3dpbmcgdGhlIEd1ZXN0CisgKiB0byB0YWxrIHRvIHRoZSBMYXVuY2hlciBvciBkaXJlY3RseSB0byBhbm90aGVyIEd1ZXN0LiAgSXQgdXNlcyBmYW1pbGlhcgorICogY29uY2VwdHMgb2YgRE1BIGFuZCBpbnRlcnJ1cHRzLCBwbHVzIHNvbWUgbmVhdCBjb2RlIHN0b2xlbiBmcm9tCisgKiBmdXRleGVzLi4uIDoqLworCisvKiBDb3B5cmlnaHQgKEMpIDIwMDYgUnVzdHkgUnVzc2VsbCBJQk0gQ29ycG9yYXRpb24KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjMsOCArMjcsMzYgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSAibGcuaCIKIAorLypMOjMwMAorICogSS9PCisgKgorICogR2V0dGluZyBkYXRhIGluIGFuZCBvdXQgb2YgdGhlIEd1ZXN0IGlzIHF1aXRlIGFuIGFydC4gIFRoZXJlIGFyZSBudW1lcm91cworICogd2F5cyB0byBkbyBpdCwgYW5kIHRoZXkgYWxsIHN1Y2sgZGlmZmVyZW50bHkuICBXZSB0cnkgdG8ga2VlcCB0aGluZ3MgZmFpcmx5CisgKiBjbG9zZSB0byAicmVhbCIgaGFyZHdhcmUgc28gb3VyIEd1ZXN0J3MgZHJpdmVycyBkb24ndCBsb29rIGxpa2UgYW4gYWxpZW4KKyAqIHZpc2l0YXRpb24gaW4gdGhlIG1pZGRsZSBvZiB0aGUgTGludXggY29kZSwgYW5kIHlldCBtYWtlIHN1cmUgdGhhdCBHdWVzdHMKKyAqIGNhbiB0YWxrIGRpcmVjdGx5IHRvIG90aGVyIEd1ZXN0cywgbm90IGp1c3QgdGhlIExhdW5jaGVyLgorICoKKyAqIFRvIGRvIHRoaXMsIHRoZSBHdWVzdCBnaXZlcyB1cyBhIGtleSB3aGVuIGl0IGJpbmRzIG9yIHNlbmRzIERNQSBidWZmZXJzLgorICogVGhlIGtleSBjb3JyZXNwb25kcyB0byBhICJwaHlzaWNhbCIgYWRkcmVzcyBpbnNpZGUgdGhlIEd1ZXN0IChpZS4gYSB2aXJ0dWFsCisgKiBhZGRyZXNzIGluc2lkZSB0aGUgTGF1bmNoZXIgcHJvY2VzcykuICBXZSBkb24ndCwgaG93ZXZlciwgdXNlIHRoaXMga2V5CisgKiBkaXJlY3RseS4KKyAqCisgKiBXZSB3YW50IEd1ZXN0cyB3aGljaCBzaGFyZSBtZW1vcnkgdG8gYmUgYWJsZSB0byBETUEgdG8gZWFjaCBvdGhlcjogdHdvCisgKiBMYXVuY2hlcnMgY2FuIG1tYXAgbWVtb3J5IHRoZSBzYW1lIGZpbGUsIHRoZW4gdGhlIEd1ZXN0cyBjYW4gY29tbXVuaWNhdGUuCisgKiBGb3J0dW5hdGVseSwgdGhlIGZ1dGV4IGNvZGUgcHJvdmlkZXMgdXMgd2l0aCBhIHdheSB0byBnZXQgYSAidW5pb24KKyAqIGZ1dGV4X2tleSIgY29ycmVzcG9uZGluZyB0byB0aGUgbWVtb3J5IGx5aW5nIGF0IGEgdmlydHVhbCBhZGRyZXNzOiBpZiB0aGUKKyAqIHR3byBwcm9jZXNzZXMgc2hhcmUgbWVtb3J5LCB0aGUgInVuaW9uIGZ1dGV4X2tleSIgZm9yIHRoYXQgbWVtb3J5IHdpbGwgbWF0Y2gKKyAqIGV2ZW4gaWYgdGhlIG1lbW9yeSBpcyBtYXBwZWQgYXQgZGlmZmVyZW50IGFkZHJlc3NlcyBpbiBlYWNoLiAgU28gd2UgYWx3YXlzCisgKiBjb252ZXJ0IHRoZSBrZXlzIHRvICJ1bmlvbiBmdXRleF9rZXkicyB0byBjb21wYXJlIHRoZW0uCisgKgorICogQmVmb3JlIHdlIGRpdmUgaW50byB0aGlzIHRob3VnaCwgd2UgbmVlZCB0byBsb29rIGF0IGFub3RoZXIgc2V0IG9mIGhlbHBlcgorICogcm91dGluZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBIb3N0IGtlcm5lbCBjb2RlIHRvIGFjY2VzcyBHdWVzdCBtZW1vcnkuCisgOiovCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBkbWFfaGFzaFs2MV07CiAKKy8qIEFuIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IG9mIHRoZSBMaW51eCBkb3VibGUtbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24gaXMKKyAqIHRoYXQgdGhlcmUncyBubyBnb29kIHdheSB0byBzdGF0aWNhbGx5IGluaXRpYWxpemUgYW4gYXJyYXkgb2YgbGlua2VkCisgKiBsaXN0cy4gKi8KIHZvaWQgbGd1ZXN0X2lvX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTU2LDYgKzg4LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qTDozMzAgVGhpcyBpcyBvdXIgaGFzaCBmdW5jdGlvbiwgdXNpbmcgdGhlIHdvbmRlcmZ1bCBKZW5raW5zIGhhc2guCisgKgorICogVGhlIGZ1dGV4IGtleSBpcyBhIHVuaW9uIHdpdGggdGhyZWUgcGFydHM6IGFuIHVuc2lnbmVkIGxvbmcgd29yZCwgYSBwb2ludGVyLAorICogYW5kIGFuIGludCAib2Zmc2V0Ii4gIFdlIGNvdWxkIHVzZSBqaGFzaF8yd29yZHMoKSB3aGljaCB0YWtlcyB0aHJlZSB1MzJzLgorICogKE9rLCB0aGUgaGFzaCBmdW5jdGlvbnMgYXJlIGdyZWF0OiB0aGUgbmFtaW5nIHN1Y2tzIHRob3VnaCkuCisgKgorICogSXQncyBuaWNlIHRvIGJlIHBvcnRhYmxlIHRvIDY0LWJpdCBwbGF0Zm9ybXMsIHNvIHdlIHVzZSB0aGUgbW9yZSBnZW5lcmljCisgKiBqaGFzaDIoKSwgd2hpY2ggdGFrZXMgYW4gYXJyYXkgb2YgdTMyLCB0aGUgbnVtYmVyIG9mIHUzMnMsIGFuZCBhbiBpbml0aWFsCisgKiB1MzIgdG8gcm9sbCBpbi4gIFRoaXMgaXMgdWdsaWVyLCBidXQgYnJlYWtzIGRvd24gdG8gYWxtb3N0IHRoZSBzYW1lIGNvZGUgb24KKyAqIDMyLWJpdCBwbGF0Zm9ybXMgbGlrZSB0aGlzIG9uZS4KKyAqCisgKiBXZSB3YW50IGEgcG9zaXRpb24gaW4gdGhlIGFycmF5LCBzbyB3ZSBtb2R1bG8gQVJSQVlfU0laRShkbWFfaGFzaCkgKGllLiA2MSkuCisgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaChjb25zdCB1bmlvbiBmdXRleF9rZXkgKmtleSkKIHsKIAlyZXR1cm4gamhhc2gyKCh1MzIqKSZrZXktPmJvdGgud29yZCwKQEAgLTY0LDYgKzEwOSw5IEBACiAJCSUgQVJSQVlfU0laRShkbWFfaGFzaCk7CiB9CiAKKy8qIFRoaXMgaXMgYSBjb252ZW5pZW5jZSByb3V0aW5lIHRvIGNvbXBhcmUgdHdvIGtleXMuICBJdCdzIGEgbXVjaCBiZW1vYW5lZCBDCisgKiB3ZWFrbmVzcyB0aGF0IGl0IGRvZXNuJ3QgYWxsb3cgJz09JyBvbiBzdHJ1Y3R1cmVzIG9yIHVuaW9ucywgc28gd2UgaGF2ZSB0bworICogb3Blbi1jb2RlIGl0IGxpa2UgdGhpcy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGtleV9lcShjb25zdCB1bmlvbiBmdXRleF9rZXkgKmEsIGNvbnN0IHVuaW9uIGZ1dGV4X2tleSAqYikKIHsKIAlyZXR1cm4gKGEtPmJvdGgud29yZCA9PSBiLT5ib3RoLndvcmQKQEAgLTcxLDIyICsxMTksMzYgQEAKIAkJJiYgYS0+Ym90aC5vZmZzZXQgPT0gYi0+Ym90aC5vZmZzZXQpOwogfQogCi0vKiBNdXN0IGhvbGQgcmVhZCBsb2NrIG9uIGRtYWluZm8gb3duZXIncyBjdXJyZW50LT5tbS0+bW1hcF9zZW0gKi8KKy8qTDozNjAgT0ssIHdoZW4gd2UgbmVlZCB0byBhY3R1YWxseSBmcmVlIHVwIGEgR3Vlc3QncyBETUEgYXJyYXkgd2UgZG8gc2V2ZXJhbAorICogdGhpbmdzLCBzbyB3ZSBoYXZlIGEgY29udmVuaWVudCBmdW5jdGlvbiB0byBkbyBpdC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBhIHJlYWQgbG9jayBvbiBkbWFpbmZvIG93bmVyJ3MgY3VycmVudC0+bW0tPm1tYXBfc2VtCisgKiBmb3IgdGhlIGRyb3BfZnV0ZXhfa2V5X3JlZnMoKS4gKi8KIHN0YXRpYyB2b2lkIHVubGlua19kbWEoc3RydWN0IGxndWVzdF9kbWFfaW5mbyAqZG1haW5mbykKIHsKKwkvKiBZb3UgbG9ja2VkIHRoaXMgdG9vLCByaWdodD8gKi8KIAlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmbGd1ZXN0X2xvY2spKTsKKwkvKiBUaGlzIGlzIGhvdyB3ZSBrbm93IHRoYXQgdGhlIGVudHJ5IGlzIGZyZWUuICovCiAJZG1haW5mby0+aW50ZXJydXB0ID0gMDsKKwkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgaGFzaCB0YWJsZS4gKi8KIAlsaXN0X2RlbCgmZG1haW5mby0+bGlzdCk7CisJLyogRHJvcCB0aGUgcmVmZXJlbmNlcyB3ZSB3ZXJlIGhvbGRpbmcgKHRvIHRoZSBpbm9kZSBvciBtbSkuICovCiAJZHJvcF9mdXRleF9rZXlfcmVmcygmZG1haW5mby0+a2V5KTsKIH0KIAorLypMOjM1MCBUaGlzIGlzIHRoZSByb3V0aW5lIHdoaWNoIHdlIGNhbGwgd2hlbiB0aGUgR3Vlc3QgYXNrcyB0byB1bnJlZ2lzdGVyIGEKKyAqIERNQSBhcnJheSBhdHRhY2hlZCB0byBhIGdpdmVuIGtleS4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJyYXkgd2FzIGZvdW5kLiAqLwogc3RhdGljIGludCB1bmJpbmRfZG1hKHN0cnVjdCBsZ3Vlc3QgKmxnLAogCQkgICAgICBjb25zdCB1bmlvbiBmdXRleF9rZXkgKmtleSwKIAkJICAgICAgdW5zaWduZWQgbG9uZyBkbWFzKQogewogCWludCBpLCByZXQgPSAwOwogCisJLyogV2UgZG9uJ3QgYm90aGVyIHdpdGggdGhlIGhhc2ggdGFibGUsIGp1c3QgbG9vayB0aHJvdWdoIGFsbCB0aGlzCisJICogR3Vlc3QncyBETUEgYXJyYXlzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBMR1VFU1RfTUFYX0RNQTsgaSsrKSB7CisJCS8qIEluIHRoZW9yeSBpdCBjb3VsZCBoYXZlIG1vcmUgdGhhbiBvbmUgYXJyYXkgb24gdGhlIHNhbWUga2V5LAorCQkgKiBvciBvbmUgYXJyYXkgb24gbXVsdGlwbGUga2V5cywgc28gd2UgY2hlY2sgYm90aCAqLwogCQlpZiAoa2V5X2VxKGtleSwgJmxnLT5kbWFbaV0ua2V5KSAmJiBkbWFzID09IGxnLT5kbWFbaV0uZG1hcykgewogCQkJdW5saW5rX2RtYSgmbGctPmRtYVtpXSk7CiAJCQlyZXQgPSAxOwpAQCAtOTYsNTEgKzE1OCw5MSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qTDozNDAgQklORF9ETUE6IHRoaXMgaXMgdGhlIGh5cGVyY2FsbCB3aGljaCBzZXRzIHVwIGFuIGFycmF5IG9mICJzdHJ1Y3QKKyAqIGxndWVzdF9kbWEiIGZvciByZWNlaXZpbmcgSS9PLgorICoKKyAqIFRoZSBHdWVzdCB3YW50cyB0byBiaW5kIGFuIGFycmF5IG9mICJzdHJ1Y3QgbGd1ZXN0X2RtYSJzIHRvIGEgcGFydGljdWxhciBrZXkKKyAqIHRvIHJlY2VpdmUgaW5wdXQuICBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBHdWVzdCBpcyBzZXR0aW5nIHVwIGEgbmV3CisgKiBkZXZpY2UsIHNvIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSB2ZXJ5IGZhc3QuCisgKgorICogSXQgcmV0dXJucyAxIG9uIGEgc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24gKGl0IGNhbiBmYWlsIGlmIHdlIGhpdCB0aGUgbGltaXQKKyAqIG9mIHJlZ2lzdHJhdGlvbnMgZm9yIHRoaXMgR3Vlc3QpLgorICovCiBpbnQgYmluZF9kbWEoc3RydWN0IGxndWVzdCAqbGcsCiAJICAgICB1bnNpZ25lZCBsb25nIHVrZXksIHVuc2lnbmVkIGxvbmcgZG1hcywgdTE2IG51bWRtYXMsIHU4IGludGVycnVwdCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0ID0gMDsKIAl1bmlvbiBmdXRleF9rZXkga2V5OworCS8qIEZ1dGV4IGNvZGUgbmVlZHMgdGhlIG1tYXBfc2VtLiAqLwogCXN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQgPSAmY3VycmVudC0+bW0tPm1tYXBfc2VtOwogCisJLyogSW52YWxpZCBpbnRlcnJ1cHQ/ICAoV2UgY291bGQga2lsbCB0aGUgZ3Vlc3QgaGVyZSkuICovCiAJaWYgKGludGVycnVwdCA+PSBMR1VFU1RfSVJRUykKIAkJcmV0dXJuIDA7CiAKKwkvKiBXZSBuZWVkIHRvIGdyYWIgdGhlIEJpZyBMZ3Vlc3QgTG9jaywgYmVjYXVzZSBvdGhlciBHdWVzdHMgbWF5IGJlCisJICogdHJ5aW5nIHRvIGxvb2sgdGhyb3VnaCB0aGlzIEd1ZXN0J3MgRE1BcyB0byBzZW5kIHNvbWV0aGluZyB3aGlsZQorCSAqIHdlJ3JlIGRvaW5nIHRoaXMuICovCiAJbXV0ZXhfbG9jaygmbGd1ZXN0X2xvY2spOwogCWRvd25fcmVhZChmc2hhcmVkKTsKIAlpZiAoZ2V0X2Z1dGV4X2tleSgodTMyIF9fdXNlciAqKXVrZXksIGZzaGFyZWQsICZrZXkpICE9IDApIHsKIAkJa2lsbF9ndWVzdChsZywgImJhZCBkbWEga2V5ICUjbHgiLCB1a2V5KTsKIAkJZ290byB1bmxvY2s7CiAJfQorCisJLyogV2Ugd2FudCB0byBrZWVwIHRoaXMga2V5IHZhbGlkIG9uY2Ugd2UgZHJvcCBtbWFwX3NlbSwgc28gd2UgaGF2ZSB0bworCSAqIGhvbGQgYSByZWZlcmVuY2UuICovCiAJZ2V0X2Z1dGV4X2tleV9yZWZzKCZrZXkpOwogCisJLyogSWYgdGhlIEd1ZXN0IHNwZWNpZmllZCBhbiBpbnRlcnJ1cHQgb2YgMCwgdGhhdCBtZWFucyB0aGV5IHdhbnQgdG8KKwkgKiB1bnJlZ2lzdGVyIHRoaXMgYXJyYXkgb2YgInN0cnVjdCBsZ3Vlc3RfZG1hInMuICovCiAJaWYgKGludGVycnVwdCA9PSAwKQogCQlyZXQgPSB1bmJpbmRfZG1hKGxnLCAma2V5LCBkbWFzKTsKIAllbHNlIHsKKwkJLyogTG9vayB0aHJvdWdoIHRoaXMgR3Vlc3QncyBkbWEgYXJyYXkgZm9yIGFuIHVudXNlZCBlbnRyeS4gKi8KIAkJZm9yIChpID0gMDsgaSA8IExHVUVTVF9NQVhfRE1BOyBpKyspIHsKKwkJCS8qIElmIHRoZSBpbnRlcnJ1cHQgaXMgbm9uLXplcm8sIHRoZSBlbnRyeSBpcyBhbHJlYWR5CisJCQkgKiB1c2VkLiAqLwogCQkJaWYgKGxnLT5kbWFbaV0uaW50ZXJydXB0KQogCQkJCWNvbnRpbnVlOwogCisJCQkvKiBPSywgYSBmcmVlIG9uZSEgIEZpbGwgb24gb3VyIGRldGFpbHMuICovCiAJCQlsZy0+ZG1hW2ldLmRtYXMgPSBkbWFzOwogCQkJbGctPmRtYVtpXS5udW1fZG1hcyA9IG51bWRtYXM7CiAJCQlsZy0+ZG1hW2ldLm5leHRfZG1hID0gMDsKIAkJCWxnLT5kbWFbaV0ua2V5ID0ga2V5OwogCQkJbGctPmRtYVtpXS5ndWVzdGlkID0gbGctPmd1ZXN0aWQ7CiAJCQlsZy0+ZG1hW2ldLmludGVycnVwdCA9IGludGVycnVwdDsKKworCQkJLyogTm93IHdlIGFkZCBpdCB0byB0aGUgaGFzaCB0YWJsZTogdGhlIHBvc2l0aW9uCisJCQkgKiBkZXBlbmRzIG9uIHRoZSBmdXRleCBrZXkgdGhhdCB3ZSBnb3QuICovCiAJCQlsaXN0X2FkZCgmbGctPmRtYVtpXS5saXN0LCAmZG1hX2hhc2hbaGFzaCgma2V5KV0pOworCQkJLyogU3VjY2VzcyEgKi8KIAkJCXJldCA9IDE7CiAJCQlnb3RvIHVubG9jazsKIAkJfQogCX0KKwkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIHNsb3QgdG8gcHV0IHRoZSBrZXkgaW4sIGRyb3AgdGhlIHJlZmVyZW5jZQorCSAqIGFnYWluLiAqLwogCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJmtleSk7CiB1bmxvY2s6CisJLyogVW5sb2NrIGFuZCBvdXQuICovCiAgCXVwX3JlYWQoZnNoYXJlZCk7CiAJbXV0ZXhfdW5sb2NrKCZsZ3Vlc3RfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotLyogbGdyZWFkIGZyb20gYW5vdGhlciBndWVzdCAqLworLypMOjM4NSBOb3RlIHRoYXQgb3VyIHJvdXRpbmVzIHRvIGFjY2VzcyBhIGRpZmZlcmVudCBHdWVzdCdzIG1lbW9yeSBhcmUgY2FsbGVkCisgKiBsZ3JlYWRfb3RoZXIoKSBhbmQgbGd3cml0ZV9vdGhlcigpOiB0aGVzZSBuYW1lcyBlbXBoYXNpemUgdGhhdCB0aGV5IGFyZSBvbmx5CisgKiB1c2VkIHdoZW4gdGhlIEd1ZXN0IGlzICpub3QqIHRoZSBjdXJyZW50IEd1ZXN0LgorICoKKyAqIFRoZSBpbnRlcmZhY2UgZm9yIGNvcHlpbmcgZnJvbSBhbm90aGVyIHByb2Nlc3MncyBtZW1vcnkgaXMgY2FsbGVkCisgKiBhY2Nlc3NfcHJvY2Vzc192bSgpLCB3aXRoIGEgZmluYWwgYXJndW1lbnQgb2YgMCBmb3IgYSByZWFkLCBhbmQgMSBmb3IgYQorICogd3JpdGUuCisgKgorICogV2UgbmVlZCBsZ3JlYWRfb3RoZXIoKSB0byByZWFkIHRoZSBkZXN0aW5hdGlvbiBHdWVzdCdzICJzdHJ1Y3QgbGd1ZXN0X2RtYSIKKyAqIGFycmF5LiAqLwogc3RhdGljIGludCBsZ3JlYWRfb3RoZXIoc3RydWN0IGxndWVzdCAqbGcsCiAJCQl2b2lkICpidWYsIHUzMiBhZGRyLCB1bnNpZ25lZCBieXRlcykKIHsKQEAgLTE1Myw3ICsyNTUsOCBAQAogCXJldHVybiAxOwogfQogCi0vKiBsZ3dyaXRlIHRvIGFub3RoZXIgZ3Vlc3QgKi8KKy8qICJsZ3dyaXRlKCkiIHRvIGFub3RoZXIgR3Vlc3Q6IHVzZWQgdG8gdXBkYXRlIHRoZSBkZXN0aW5hdGlvbiAidXNlZF9sZW4iIG9uY2UKKyAqIHdlJ3ZlIHRyYW5zZmVycmVkIGRhdGEgaW50byB0aGUgYnVmZmVyLiAqLwogc3RhdGljIGludCBsZ3dyaXRlX290aGVyKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1MzIgYWRkciwKIAkJCSBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGJ5dGVzKQogewpAQCAtMTY2LDYgKzI2OSwxNSBAQAogCXJldHVybiAxOwogfQogCisvKkw6NDAwIFRoaXMgaXMgdGhlIGdlbmVyaWMgZW5naW5lIHdoaWNoIGNvcGllcyBmcm9tIGEgc291cmNlICJzdHJ1Y3QKKyAqIGxndWVzdF9kbWEiIGZyb20gdGhpcyBHdWVzdCBpbnRvIGFub3RoZXIgR3Vlc3QncyAic3RydWN0IGxndWVzdF9kbWEiLiAgVGhlCisgKiBkZXN0aW5hdGlvbiBHdWVzdCdzIHBhZ2VzIGhhdmUgYWxyZWFkeSBiZWVuIG1hcHBlZCwgYXMgY29udGFpbmVkIGluIHRoZQorICogcGFnZXMgYXJyYXkuCisgKgorICogSWYgeW91J3JlIHdvbmRlcmluZyBpZiB0aGVyZSdzIGEgbmljZSAiY29weSBmcm9tIG9uZSBwcm9jZXNzIHRvIGFub3RoZXIiCisgKiByb3V0aW5lLCBzbyB3YXMgSS4gIEJ1dCBMaW51eCBpc24ndCByZWFsbHkgc2V0IHVwIHRvIGNvcHkgYmV0d2VlbiB0d28KKyAqIHVucmVsYXRlZCBwcm9jZXNzZXMsIHNvIHdlIGhhdmUgdG8gd3JpdGUgaXQgb3Vyc2VsdmVzLgorICovCiBzdGF0aWMgdTMyIGNvcHlfZGF0YShzdHJ1Y3QgbGd1ZXN0ICpzcmNsZywKIAkJICAgICBjb25zdCBzdHJ1Y3QgbGd1ZXN0X2RtYSAqc3JjLAogCQkgICAgIGNvbnN0IHN0cnVjdCBsZ3Vlc3RfZG1hICpkc3QsCkBAIC0xNzQsMzMgKzI4Niw1OSBAQAogCXVuc2lnbmVkIGludCB0b3RsZW4sIHNpLCBkaSwgc3Jjb2ZmLCBkc3RvZmY7CiAJdm9pZCAqbWFkZHIgPSBOVUxMOwogCisJLyogV2UgcmV0dXJuIHRoZSB0b3RhbCBsZW5ndGggdHJhbnNmZXJyZWQuICovCiAJdG90bGVuID0gMDsKKworCS8qIFdlIGtlZXAgaW5kZXhlcyBpbnRvIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uICJzdHJ1Y3QgbGd1ZXN0X2RtYSIsCisJICogYW5kIGFuIG9mZnNldCB3aXRoaW4gZWFjaCByZWdpb24uICovCiAJc2kgPSBkaSA9IDA7CiAJc3Jjb2ZmID0gZHN0b2ZmID0gMDsKKworCS8qIFdlIGxvb3AgdW50aWwgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBpcyBleGhhdXN0ZWQuICovCiAJd2hpbGUgKHNpIDwgTEdVRVNUX01BWF9ETUFfU0VDVElPTlMgJiYgc3JjLT5sZW5bc2ldCiAJICAgICAgICYmIGRpIDwgTEdVRVNUX01BWF9ETUFfU0VDVElPTlMgJiYgZHN0LT5sZW5bZGldKSB7CisJCS8qIFdlIGNhbiBvbmx5IHRyYW5zZmVyIHRoZSByZXN0IG9mIHRoZSBzcmMgYnVmZmVyLCBvciBhcyBtdWNoCisJCSAqIGFzIHdpbGwgZml0IGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KIAkJdTMyIGxlbiA9IG1pbihzcmMtPmxlbltzaV0gLSBzcmNvZmYsIGRzdC0+bGVuW2RpXSAtIGRzdG9mZik7CiAKKwkJLyogRm9yIHN5c3RlbXMgdXNpbmcgImhpZ2htZW0iIHdlIG5lZWQgdG8gdXNlIGttYXAoKSB0byBhY2Nlc3MKKwkJICogdGhlIHBhZ2Ugd2Ugd2FudC4gIFdlIG9mdGVuIHVzZSB0aGUgc2FtZSBwYWdlIG92ZXIgYW5kIG92ZXIsCisJCSAqIHNvIHJhdGhlciB0aGFuIGttYXAoKSBpdCBvbiBldmVyeSBsb29wLCB3ZSBzZXQgdGhlIG1hZGRyCisJCSAqIHBvaW50ZXIgdG8gTlVMTCB3aGVuIHdlIG5lZWQgdG8gbW92ZSB0byB0aGUgbmV4dAorCQkgKiBkZXN0aW5hdGlvbiBwYWdlLiAqLwogCQlpZiAoIW1hZGRyKQogCQkJbWFkZHIgPSBrbWFwKHBhZ2VzW2RpXSk7CiAKLQkJLyogRklYTUU6IFRoaXMgaXMgbm90IGNvbXBsZXRlbHkgcG9ydGFibGUsIHNpbmNlCi0JCSAgIGFyY2hzIGRvIGRpZmZlcmVudCB0aGluZ3MgZm9yIGNvcHlfdG9fdXNlcl9wYWdlLiAqLworCQkvKiBDb3B5IGRpcmVjdGx5IGZyb20gKHRoaXMgR3Vlc3Qncykgc291cmNlIGFkZHJlc3MgdG8gdGhlCisJCSAqIGRlc3RpbmF0aW9uIEd1ZXN0J3Mga21hcCgpZWQgYnVmZmVyLiAgTm90ZSB0aGF0IG1hZGRyIHBvaW50cworCQkgKiB0byB0aGUgc3RhcnQgb2YgdGhlIHBhZ2U6IHdlIG5lZWQgdG8gYWRkIHRoZSBvZmZzZXQgb2YgdGhlCisJCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlci4gKi8KKworCQkvKiBGSVhNRTogVGhpcyBpcyBub3QgY29tcGxldGVseSBwb3J0YWJsZS4gIEkgbG9va2VkIGF0CisJCSAqIGNvcHlfdG9fdXNlcl9wYWdlKCksIGFuZCBzb21lIGFyY2gncyBzZWVtIHRvIG5lZWQgc3BlY2lhbAorCQkgKiBmbHVzaGVzLiAgeDg2IGlzIGZpbmUuICovCiAJCWlmIChjb3B5X2Zyb21fdXNlcihtYWRkciArIChkc3QtPmFkZHJbZGldICsgZHN0b2ZmKSVQQUdFX1NJWkUsCiAJCQkJICAgKHZvaWQgX191c2VyICopc3JjLT5hZGRyW3NpXSwgbGVuKSAhPSAwKSB7CisJCQkvKiBJZiBhIGNvcHkgZmFpbGVkLCBpdCdzIHRoZSBzb3VyY2UncyBmYXVsdC4gKi8KIAkJCWtpbGxfZ3Vlc3Qoc3JjbGcsICJiYWQgYWRkcmVzcyBpbiBzZW5kaW5nIERNQSIpOwogCQkJdG90bGVuID0gMDsKIAkJCWJyZWFrOwogCQl9CiAKKwkJLyogSW5jcmVtZW50IHRoZSB0b3RhbCBhbmQgc3JjICYgZHN0IG9mZnNldHMgKi8KIAkJdG90bGVuICs9IGxlbjsKIAkJc3Jjb2ZmICs9IGxlbjsKIAkJZHN0b2ZmICs9IGxlbjsKKworCQkvKiBQcmVzdW1hYmx5IHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3JjIG9yIGRlc3QgYnVmZmVyczogKi8KIAkJaWYgKHNyY29mZiA9PSBzcmMtPmxlbltzaV0pIHsKKwkJCS8qIE1vdmUgdG8gdGhlIG5leHQgYnVmZmVyIGF0IG9mZnNldCAwICovCiAJCQlzaSsrOwogCQkJc3Jjb2ZmID0gMDsKIAkJfQogCQlpZiAoZHN0b2ZmID09IGRzdC0+bGVuW2RpXSkgeworCQkJLyogV2UgbmVlZCB0byB1bm1hcCB0aGF0IGRlc3RpbmF0aW9uIHBhZ2UgYW5kIHJlc2V0CisJCQkgKiBtYWRkciByZWFkeSBmb3IgdGhlIG5leHQgb25lLiAqLwogCQkJa3VubWFwKHBhZ2VzW2RpXSk7CiAJCQltYWRkciA9IE5VTEw7CiAJCQlkaSsrOwpAQCAtMjA4LDEzICszNDYsMTUgQEAKIAkJfQogCX0KIAorCS8qIElmIHdlIHN0aWxsIGhhZCBhIHBhZ2UgbWFwcGVkIGF0IHRoZSBlbmQsIHVubWFwIG5vdy4gKi8KIAlpZiAobWFkZHIpCiAJCWt1bm1hcChwYWdlc1tkaV0pOwogCiAJcmV0dXJuIHRvdGxlbjsKIH0KIAotLyogU3JjIGlzIHVzLCBpZS4gY3VycmVudC4gKi8KKy8qTDozOTAgVGhpcyBpcyBob3cgd2UgdHJhbnNmZXIgYSAic3RydWN0IGxndWVzdF9kbWEiIGZyb20gdGhlIHNvdXJjZSBHdWVzdAorICogKHRoZSBjdXJyZW50IEd1ZXN0IHdoaWNoIGNhbGxlZCBTRU5EX0RNQSkgdG8gYW5vdGhlciBHdWVzdC4gKi8KIHN0YXRpYyB1MzIgZG9fZG1hKHN0cnVjdCBsZ3Vlc3QgKnNyY2xnLCBjb25zdCBzdHJ1Y3QgbGd1ZXN0X2RtYSAqc3JjLAogCQkgIHN0cnVjdCBsZ3Vlc3QgKmRzdGxnLCBjb25zdCBzdHJ1Y3QgbGd1ZXN0X2RtYSAqZHN0KQogewpAQCAtMjIyLDIzICszNjIsMzEgQEAKIAl1MzIgcmV0OwogCXN0cnVjdCBwYWdlICpwYWdlc1tMR1VFU1RfTUFYX0RNQV9TRUNUSU9OU107CiAKKwkvKiBXZSBjaGVjayB0aGF0IGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiAic3RydWN0IGxndWVzdF9kbWEicyBhcmUKKwkgKiB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBHdWVzdHMgKi8KIAlpZiAoIWNoZWNrX2RtYV9saXN0KGRzdGxnLCBkc3QpIHx8ICFjaGVja19kbWFfbGlzdChzcmNsZywgc3JjKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBGaXJzdCBnZXQgdGhlIGRlc3RpbmF0aW9uIHBhZ2VzICovCisJLyogV2UgbmVlZCB0byBtYXAgdGhlIHBhZ2VzIHdoaWNoIGNvcnJlc3BvbmQgdG8gZWFjaCBwYXJ0cyBvZgorCSAqIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgTEdVRVNUX01BWF9ETUFfU0VDVElPTlM7IGkrKykgewogCQlpZiAoZHN0LT5sZW5baV0gPT0gMCkKIAkJCWJyZWFrOworCQkvKiBnZXRfdXNlcl9wYWdlcygpIGlzIGEgY29tcGxpY2F0ZWQgZnVuY3Rpb24sIGVzcGVjaWFsbHkgc2luY2UKKwkJICogd2Ugb25seSB3YW50IGEgc2luZ2xlIHBhZ2UuICBCdXQgaXQgd29ya3MsIGFuZCByZXR1cm5zIHRoZQorCQkgKiBudW1iZXIgb2YgcGFnZXMuICBOb3RlIHRoYXQgd2UncmUgaG9sZGluZyB0aGUgZGVzdGluYXRpb24ncworCQkgKiBtbWFwX3NlbSwgYXMgZ2V0X3VzZXJfcGFnZXMoKSByZXF1aXJlcy4gKi8KIAkJaWYgKGdldF91c2VyX3BhZ2VzKGRzdGxnLT50c2ssIGRzdGxnLT5tbSwKIAkJCQkgICBkc3QtPmFkZHJbaV0sIDEsIDEsIDEsIHBhZ2VzK2ksIE5VTEwpCiAJCSAgICAhPSAxKSB7CisJCQkvKiBUaGlzIG1lYW5zIHRoZSBkZXN0aW5hdGlvbiBnYXZlIHVzIGEgYm9ndXMgYnVmZmVyICovCiAJCQlraWxsX2d1ZXN0KGRzdGxnLCAiRXJyb3IgbWFwcGluZyBETUEgcGFnZXMiKTsKIAkJCXJldCA9IDA7CiAJCQlnb3RvIGRyb3BfcGFnZXM7CiAJCX0KIAl9CiAKLQkvKiBOb3cgY29weSB1bnRpbCB3ZSBydW4gb3V0IG9mIHNyYyBvciBkc3QuICovCisJLyogTm93IGNvcHkgdGhlIGRhdGEgdW50aWwgd2UgcnVuIG91dCBvZiBzcmMgb3IgZHN0LiAqLwogCXJldCA9IGNvcHlfZGF0YShzcmNsZywgc3JjLCBkc3QsIHBhZ2VzKTsKIAogZHJvcF9wYWdlczoKQEAgLTI0Nyw2ICszOTUsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKkw6MzgwIFRyYW5zZmVycmluZyBkYXRhIGZyb20gb25lIEd1ZXN0IHRvIGFub3RoZXIgaXMgbm90IGFzIHNpbXBsZSBhcyBJJ2QKKyAqIGxpa2UuICBXZSd2ZSBmb3VuZCB0aGUgInN0cnVjdCBsZ3Vlc3RfZG1hX2luZm8iIGJvdW5kIHRvIHRoZSBzYW1lIGFkZHJlc3MgYXMKKyAqIHRoZSBzZW5kLCB3ZSBuZWVkIHRvIGNvcHkgaW50byBpdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2FzIGVtcHR5LiAqLwogc3RhdGljIGludCBkbWFfdHJhbnNmZXIoc3RydWN0IGxndWVzdCAqc3JjbGcsCiAJCQl1bnNpZ25lZCBsb25nIHVkbWEsCiAJCQlzdHJ1Y3QgbGd1ZXN0X2RtYV9pbmZvICpkc3QpCkBAIC0yNTUsMTUgKzQwOCwyMyBAQAogCXN0cnVjdCBsZ3Vlc3QgKmRzdGxnOwogCXUzMiBpLCBkbWEgPSAwOwogCisJLyogRnJvbSB0aGUgInN0cnVjdCBsZ3Vlc3RfZG1hX2luZm8iIHdlIGZvdW5kIGluIHRoZSBoYXNoLCBncmFiIHRoZQorCSAqIEd1ZXN0LiAqLwogCWRzdGxnID0gJmxndWVzdHNbZHN0LT5ndWVzdGlkXTsKLQkvKiBHZXQgb3VyIGRtYSBsaXN0LiAqLworCS8qIFJlYWQgaW4gdGhlIHNvdXJjZSAic3RydWN0IGxndWVzdF9kbWEiIGhhbmRlZCB0byBTRU5EX0RNQS4gKi8KIAlsZ3JlYWQoc3JjbGcsICZzcmNfZG1hLCB1ZG1hLCBzaXplb2Yoc3JjX2RtYSkpOwogCi0JLyogV2UgY2FuJ3QgZGVhZGxvY2sgYWdhaW5zdCB0aGVtIGRtYWluZyB0byB1cywgYmVjYXVzZSB0aGlzCi0JICogaXMgYWxsIHVuZGVyIHRoZSBsZ3Vlc3RfbG9jay4gKi8KKwkvKiBXZSBuZWVkIHRoZSBkZXN0aW5hdGlvbidzIG1tYXBfc2VtLCBhbmQgd2UgYWxyZWFkeSBob2xkIHRoZSBzb3VyY2UncworCSAqIG1tYXBfc2VtIGZvciB0aGUgZnV0ZXgga2V5IGxvb2t1cC4gIE5vcm1hbGx5IHRoaXMgd291bGQgc3VnZ2VzdCB0aGF0CisJICogd2UgY291bGQgZGVhZGxvY2sgaWYgdGhlIGRlc3RpbmF0aW9uIEd1ZXN0IHdhcyB0cnlpbmcgdG8gc2VuZCB0bworCSAqIHRoaXMgc291cmNlIEd1ZXN0IGF0IHRoZSBzYW1lIHRpbWUsIHdoaWNoIGlzIGFub3RoZXIgcmVhc29uIHRoYXQgYWxsCisJICogSS9PIGlzIGRvbmUgdW5kZXIgdGhlIGJpZyBsZ3Vlc3RfbG9jay4gKi8KIAlkb3duX3JlYWQoJmRzdGxnLT5tbS0+bW1hcF9zZW0pOwogCisJLyogTG9vayB0aHJvdWdoIHRoZSBkZXN0aW5hdGlvbiBETUEgYXJyYXkgZm9yIGFuIGF2YWlsYWJsZSBidWZmZXIuICovCiAJZm9yIChpID0gMDsgaSA8IGRzdC0+bnVtX2RtYXM7IGkrKykgeworCQkvKiBXZSBrZWVwIGEgIm5leHRfZG1hIiBwb2ludGVyIHdoaWNoIG9mdGVuIGhlbHBzIHVzIGF2b2lkCisJCSAqIGxvb2tpbmcgYXQgbG90cyBvZiBwcmV2aW91c2x5LWZpbGxlZCBlbnRyaWVzLiAqLwogCQlkbWEgPSAoZHN0LT5uZXh0X2RtYSArIGkpICUgZHN0LT5udW1fZG1hczsKIAkJaWYgKCFsZ3JlYWRfb3RoZXIoZHN0bGcsICZkc3RfZG1hLAogCQkJCSAgZHN0LT5kbWFzICsgZG1hICogc2l6ZW9mKHN0cnVjdCBsZ3Vlc3RfZG1hKSwKQEAgLTI3MywzMCArNDM0LDQ2IEBACiAJCWlmICghZHN0X2RtYS51c2VkX2xlbikKIAkJCWJyZWFrOwogCX0KKworCS8qIElmIHdlIGZvdW5kIGEgYnVmZmVyLCB3ZSBkbyB0aGUgYWN0dWFsIGRhdGEgY29weS4gKi8KIAlpZiAoaSAhPSBkc3QtPm51bV9kbWFzKSB7CiAJCXVuc2lnbmVkIGxvbmcgdXNlZF9sZW5wOwogCQl1bnNpZ25lZCBpbnQgcmV0OwogCiAJCXJldCA9IGRvX2RtYShzcmNsZywgJnNyY19kbWEsIGRzdGxnLCAmZHN0X2RtYSk7Ci0JCS8qIFB1dCB1c2VkIGxlbmd0aCBpbiBzcmMuICovCisJCS8qIFB1dCB1c2VkIGxlbmd0aCBpbiB0aGUgc291cmNlICJzdHJ1Y3QgbGd1ZXN0X2RtYSIncyB1c2VkX2xlbgorCQkgKiBmaWVsZC4gIEl0J3MgYSBsaXR0bGUgdHJpY2t5IHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhhdCBpcywKKwkJICogdGhvdWdoLiAqLwogCQlsZ3dyaXRlX3UzMihzcmNsZywKIAkJCSAgICB1ZG1hK29mZnNldG9mKHN0cnVjdCBsZ3Vlc3RfZG1hLCB1c2VkX2xlbiksIHJldCk7CisJCS8qIFRyYW5mZXJyaW5nIDAgYnl0ZXMgaXMgT0sgaWYgdGhlIHNvdXJjZSBidWZmZXIgd2FzIGVtcHR5LiAqLwogCQlpZiAocmV0ID09IDAgJiYgc3JjX2RtYS5sZW5bMF0gIT0gMCkKIAkJCWdvdG8gZmFpbDsKIAotCQkvKiBNYWtlIHN1cmUgZGVzdGluYXRpb24gc2VlcyBjb250ZW50cyBiZWZvcmUgbGVuZ3RoLiAqLworCQkvKiBUaGUgZGVzdGluYXRpb24gR3Vlc3QgbWlnaHQgYmUgcnVubmluZyBvbiBhIGRpZmZlcmVudCBDUFU6CisJCSAqIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgd2lsbCBzZWUgdGhlICJ1c2VkX2xlbiIgZmllbGQKKwkJICogY2hhbmdlIHRvIG5vbi16ZXJvICphZnRlciogaXQgc2VlcyB0aGUgZGF0YSB3ZSBjb3BpZWQgaW50bworCQkgKiB0aGUgYnVmZmVyLiAgSGVuY2UgYSB3cml0ZSBtZW1vcnkgYmFycmllci4gKi8KIAkJd21iKCk7CisJCS8qIEZpZ3VyaW5nIG91dCB3aGVyZSB0aGUgZGVzdGluYXRpb24ncyB1c2VkX2xlbiBmaWVsZCBmb3IgdGhpcworCQkgKiAic3RydWN0IGxndWVzdF9kbWEiIGluIHRoZSBhcnJheSBpcyBhbHNvIGEgbGl0dGxlIHVnbHkuICovCiAJCXVzZWRfbGVucCA9IGRzdC0+ZG1hcwogCQkJKyBkbWEgKiBzaXplb2Yoc3RydWN0IGxndWVzdF9kbWEpCiAJCQkrIG9mZnNldG9mKHN0cnVjdCBsZ3Vlc3RfZG1hLCB1c2VkX2xlbik7CiAJCWxnd3JpdGVfb3RoZXIoZHN0bGcsIHVzZWRfbGVucCwgJnJldCwgc2l6ZW9mKHJldCkpOworCQkvKiBNb3ZlIHRoZSBjdXJzb3IgZm9yIG5leHQgdGltZS4gKi8KIAkJZHN0LT5uZXh0X2RtYSsrOwogCX0KICAJdXBfcmVhZCgmZHN0bGctPm1tLT5tbWFwX3NlbSk7CiAKLQkvKiBEbyB0aGlzIGxhc3Qgc28gZHN0IGRvZXNuJ3Qgc2ltcGx5IHNsZWVwIG9uIGxvY2suICovCisJLyogV2UgdHJpZ2dlciB0aGUgZGVzdGluYXRpb24gaW50ZXJydXB0LCBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbiB3YXMKKwkgKiBlbXB0eSBhbmQgd2UgZGlkbid0IHRyYW5zZmVyIGFueXRoaW5nOiB0aGlzIGdpdmVzIHRoZW0gYSBjaGFuY2UgdG8KKwkgKiB3YWtlIHVwIGFuZCByZWZpbGwuICovCiAJc2V0X2JpdChkc3QtPmludGVycnVwdCwgZHN0bGctPmlycXNfcGVuZGluZyk7CisJLyogV2FrZSB1cCB0aGUgZGVzdGluYXRpb24gcHJvY2Vzcy4gKi8KIAl3YWtlX3VwX3Byb2Nlc3MoZHN0bGctPnRzayk7CisJLyogSWYgd2UgcGFzc2VkIHRoZSBsYXN0ICJzdHJ1Y3QgbGd1ZXN0X2RtYSIsIHRoZSByZWNlaXZlIGhhZCBubworCSAqIGJ1ZmZlcnMgbGVmdC4gKi8KIAlyZXR1cm4gaSA9PSBkc3QtPm51bV9kbWFzOwogCiBmYWlsOgpAQCAtMzA0LDYgKzQ4MSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qTDozNzAgVGhpcyBpcyB0aGUgY291bnRlci1zaWRlIHRvIHRoZSBCSU5EX0RNQSBoeXBlcmNhbGw7IHRoZSBTRU5EX0RNQQorICogaHlwZXJjYWxsLiAgV2UgZmluZCBvdXQgd2hvJ3MgbGlzdGVuaW5nLCBhbmQgc2VuZCB0byB0aGVtLiAqLwogdm9pZCBzZW5kX2RtYShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyB1a2V5LCB1bnNpZ25lZCBsb25nIHVkbWEpCiB7CiAJdW5pb24gZnV0ZXhfa2V5IGtleTsKQEAgLTMxMywzMSArNDkyLDQzIEBACiBhZ2FpbjoKIAltdXRleF9sb2NrKCZsZ3Vlc3RfbG9jayk7CiAJZG93bl9yZWFkKGZzaGFyZWQpOworCS8qIEdldCB0aGUgZnV0ZXgga2V5IGZvciB0aGUga2V5IHRoZSBHdWVzdCBnYXZlIHVzICovCiAJaWYgKGdldF9mdXRleF9rZXkoKHUzMiBfX3VzZXIgKil1a2V5LCBmc2hhcmVkLCAma2V5KSAhPSAwKSB7CiAJCWtpbGxfZ3Vlc3QobGcsICJiYWQgc2VuZGluZyBETUEga2V5Iik7CiAJCWdvdG8gdW5sb2NrOwogCX0KLQkvKiBTaGFyZWQgbWFwcGluZz8gIExvb2sgZm9yIG90aGVyIGd1ZXN0cy4uLiAqLworCS8qIFNpbmNlIHRoZSBrZXkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQsIHRoZSBmdXRleCBrZXkgdXNlcyB0aGUgbG93ZXIKKwkgKiBiaXQgb2YgdGhlICJvZmZzZXQiIGZpZWxkICh3aGljaCB3b3VsZCBhbHdheXMgYmUgMCkgdG8gaW5kaWNhdGUgYQorCSAqIG1hcHBpbmcgd2hpY2ggaXMgc2hhcmVkIHdpdGggb3RoZXIgcHJvY2Vzc2VzIChpZS4gR3Vlc3RzKS4gKi8KIAlpZiAoa2V5LnNoYXJlZC5vZmZzZXQgJiAxKSB7CiAJCXN0cnVjdCBsZ3Vlc3RfZG1hX2luZm8gKmk7CisJCS8qIExvb2sgdGhyb3VnaCB0aGUgaGFzaCBmb3Igb3RoZXIgR3Vlc3RzLiAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZkbWFfaGFzaFtoYXNoKCZrZXkpXSwgbGlzdCkgeworCQkJLyogRG9uJ3Qgc2VuZCB0byBvdXJzZWx2ZXMuICovCiAJCQlpZiAoaS0+Z3Vlc3RpZCA9PSBsZy0+Z3Vlc3RpZCkKIAkJCQljb250aW51ZTsKIAkJCWlmICgha2V5X2VxKCZrZXksICZpLT5rZXkpKQogCQkJCWNvbnRpbnVlOwogCisJCQkvKiBJZiBkbWFfdHJhbnNmZXIoKSB0ZWxscyB1cyB0aGUgZGVzdGluYXRpb24gaGFzIG5vCisJCQkgKiBhdmFpbGFibGUgYnVmZmVycywgd2UgaW5jcmVtZW50ICJlbXB0eSIuICovCiAJCQllbXB0eSArPSBkbWFfdHJhbnNmZXIobGcsIHVkbWEsIGkpOwogCQkJYnJlYWs7CiAJCX0KKwkJLyogSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGVtcHR5LCB3ZSByZWxlYXNlIG91ciBsb2NrcyBhbmQKKwkJICogZ2l2ZSB0aGUgZGVzdGluYXRpb24gR3Vlc3QgYSBicmllZiBjaGFuY2UgdG8gcmVzdG9jay4gKi8KIAkJaWYgKGVtcHR5ID09IDEpIHsKIAkJCS8qIEdpdmUgYW55IHJlY2lwaWVudHMgb25lIGNoYW5jZSB0byByZXN0b2NrLiAqLwogCQkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAkJCW11dGV4X3VubG9jaygmbGd1ZXN0X2xvY2spOworCQkJLyogTmV4dCB0aW1lLCB3ZSB3b24ndCB0cnkgYWdhaW4uICovCiAJCQllbXB0eSsrOwogCQkJZ290byBhZ2FpbjsKIAkJfQogCX0gZWxzZSB7Ci0JCS8qIFByaXZhdGUgbWFwcGluZzogdGVsbCBvdXIgdXNlcnNwYWNlLiAqLworCQkvKiBQcml2YXRlIG1hcHBpbmc6IEd1ZXN0IGlzIHNlbmRpbmcgdG8gaXRzIExhdW5jaGVyLiAgV2Ugc2V0CisJCSAqIHRoZSAiZG1hX2lzX3BlbmRpbmciIGZsYWcgc28gdGhhdCB0aGUgbWFpbiBsb29wIHdpbGwgZXhpdAorCQkgKiBhbmQgdGhlIExhdW5jaGVyJ3MgcmVhZCgpIGZyb20gL2Rldi9sZ3Vlc3Qgd2lsbCByZXR1cm4uICovCiAJCWxnLT5kbWFfaXNfcGVuZGluZyA9IDE7CiAJCWxnLT5wZW5kaW5nX2RtYSA9IHVkbWE7CiAJCWxnLT5wZW5kaW5nX2tleSA9IHVrZXk7CkBAIC0zNDYsNiArNTM3LDcgQEAKIAl1cF9yZWFkKGZzaGFyZWQpOwogCW11dGV4X3VubG9jaygmbGd1ZXN0X2xvY2spOwogfQorLyo6Ki8KIAogdm9pZCByZWxlYXNlX2FsbF9kbWEoc3RydWN0IGxndWVzdCAqbGcpCiB7CkBAIC0zNjEsNyArNTUzLDE4IEBACiAJdXBfcmVhZCgmbGctPm1tLT5tbWFwX3NlbSk7CiB9CiAKLS8qIFVzZXJzcGFjZSB3YW50cyBhIGRtYSBidWZmZXIgZnJvbSB0aGlzIGd1ZXN0LiAqLworLypNOjAwNyBXZSBvbmx5IHJldHVybiBhIHNpbmdsZSBETUEgYnVmZmVyIHRvIHRoZSBMYXVuY2hlciwgYnV0IGl0IHdvdWxkIGJlCisgKiBtb3JlIGVmZmljaWVudCB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRpcmUgYXJyYXkgb2YgRE1BIGJ1ZmZlcnMsIHdoaWNoCisgKiBpdCBjYW4gY2FjaGUgYW5kIGNob29zZSBvbmUgd2hlbmV2ZXIgaXQgd2FudHMuCisgKgorICogQ3VycmVudGx5IHRoZSBMYXVuY2hlciB1c2VzIGEgd3JpdGUgdG8gL2Rldi9sZ3Vlc3QsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgKiB0aGUgYWRkcmVzcyBvZiB0aGUgRE1BIHN0cnVjdHVyZSB3aXRoIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIHBsYWNlZCBpbgorICogZG1hLT51c2VkX2xlbi4gIElmIHdlIHdhbnRlZCB0byByZXR1cm4gdGhlIGVudGlyZSBhcnJheSwgd2UgbmVlZCB0byByZXR1cm4KKyAqIHRoZSBhZGRyZXNzLCBhcnJheSBzaXplIGFuZCBpbnRlcnJ1cHQgbnVtYmVyOiB0aGlzIHNlZW1zIHRvIHJlcXVpcmUgYW4KKyAqIGlvY3RsKCkuIDoqLworCisvKkw6MzIwIFRoaXMgcm91dGluZSBsb29rcyBmb3IgYSBETUEgYnVmZmVyIHJlZ2lzdGVyZWQgYnkgdGhlIEd1ZXN0IG9uIHRoZQorICogZ2l2ZW4ga2V5ICh1c2luZyB0aGUgQklORF9ETUEgaHlwZXJjYWxsKS4gKi8KIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9idWZmZXIoc3RydWN0IGxndWVzdCAqbGcsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgdWtleSwgdW5zaWduZWQgbG9uZyAqaW50ZXJydXB0KQogewpAQCAtMzcwLDE1ICs1NzMsMjkgQEAKIAlzdHJ1Y3QgbGd1ZXN0X2RtYV9pbmZvICppOwogCXN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQgPSAmY3VycmVudC0+bW0tPm1tYXBfc2VtOwogCisJLyogVGFrZSB0aGUgQmlnIExndWVzdCBMb2NrIHRvIHN0b3Agb3RoZXIgR3Vlc3RzIHNlbmRpbmcgdGhpcyBHdWVzdCBETUEKKwkgKiBhdCB0aGUgc2FtZSB0aW1lLiAqLwogCW11dGV4X2xvY2soJmxndWVzdF9sb2NrKTsKKwkvKiBUbyBtYXRjaCBiZXR3ZWVuIEd1ZXN0cyBzaGFyaW5nIHRoZSBzYW1lIHVuZGVybHlpbmcgbWVtb3J5IHdlIHN0ZWFsCisJICogY29kZSBmcm9tIHRoZSBmdXRleCBpbmZyYXN0cnVjdHVyZS4gIFRoaXMgcmVxdWlyZXMgdGhhdCB3ZSBob2xkIHRoZQorCSAqICJtbWFwX3NlbSIgZm9yIG91ciBwcm9jZXNzICh0aGUgTGF1bmNoZXIpLCBhbmQgcGFzcyBpdCB0byB0aGUgZnV0ZXgKKwkgKiBjb2RlLiAqLwogCWRvd25fcmVhZChmc2hhcmVkKTsKKworCS8qIFRoaXMgY2FuIGZhaWwgaWYgaXQncyBub3QgYSB2YWxpZCBhZGRyZXNzLCBvciBpZiB0aGUgYWRkcmVzcyBpcyBub3QKKwkgKiBkaXZpc2libGUgYnkgNCAodGhlIGZ1dGV4IGNvZGUgbmVlZHMgdGhhdCwgd2UgZG9uJ3QgcmVhbGx5KS4gKi8KIAlpZiAoZ2V0X2Z1dGV4X2tleSgodTMyIF9fdXNlciAqKXVrZXksIGZzaGFyZWQsICZrZXkpICE9IDApIHsKIAkJa2lsbF9ndWVzdChsZywgImJhZCByZWdpc3RlcmVkIERNQSBidWZmZXIiKTsKIAkJZ290byB1bmxvY2s7CiAJfQorCS8qIFNlYXJjaCB0aGUgaGFzaCB0YWJsZSBmb3IgbWF0Y2hpbmcgZW50cmllcyAodGhlIExhdW5jaGVyIGNhbiBvbmx5CisJICogc2VuZCB0byBpdHMgb3duIEd1ZXN0IGZvciB0aGUgbW9tZW50LCBzbyB0aGUgZW50cnkgbXVzdCBiZSBmb3IgdGhpcworCSAqIEd1ZXN0KSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmRtYV9oYXNoW2hhc2goJmtleSldLCBsaXN0KSB7CiAJCWlmIChrZXlfZXEoJmtleSwgJmktPmtleSkgJiYgaS0+Z3Vlc3RpZCA9PSBsZy0+Z3Vlc3RpZCkgewogCQkJdW5zaWduZWQgaW50IGo7CisJCQkvKiBMb29rIHRocm91Z2ggdGhlIHJlZ2lzdGVyZWQgRE1BIGFycmF5IGZvciBhbgorCQkJICogYXZhaWxhYmxlIGJ1ZmZlci4gKi8KIAkJCWZvciAoaiA9IDA7IGogPCBpLT5udW1fZG1hczsgaisrKSB7CiAJCQkJc3RydWN0IGxndWVzdF9kbWEgZG1hOwogCkBAIC0zODcsNiArNjA0LDggQEAKIAkJCQlpZiAoZG1hLnVzZWRfbGVuID09IDApCiAJCQkJCWJyZWFrOwogCQkJfQorCQkJLyogU3RvcmUgdGhlIGludGVycnVwdCB0aGUgR3Vlc3Qgd2FudHMgd2hlbiB0aGUgYnVmZmVyCisJCQkgKiBpcyB1c2VkLiAqLwogCQkJKmludGVycnVwdCA9IGktPmludGVycnVwdDsKIAkJCWJyZWFrOwogCQl9CkBAIC0zOTYsNCArNjE1LDEyIEBACiAJbXV0ZXhfdW5sb2NrKCZsZ3Vlc3RfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KKy8qOiovCiAKKy8qTDo0MTAgVGhpcyByZWFsbHkgaGFzIGNvbXBsZXRlZCB0aGUgTGF1bmNoZXIuICBOb3Qgb25seSBoYXZlIHdlIG5vdyBmaW5pc2hlZAorICogdGhlIGxvbmdlc3QgY2hhcHRlciBpbiBvdXIgam91cm5leSwgYnV0IHRoaXMgYWxzbyBtZWFucyB3ZSBhcmUgb3ZlciBoYWxmd2F5CisgKiB0aHJvdWdoIQorICoKKyAqIEVub3VnaCBwcmV2YXJpY2F0aW5nIGFyb3VuZCB0aGUgYnVzaDogaXQgaXMgdGltZSBmb3IgdXMgdG8gZGl2ZSBpbnRvIHRoZQorICogY29yZSBvZiB0aGUgSG9zdCwgaW4gIm1ha2UgSG9zdCIuCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xnLmggYi9kcml2ZXJzL2xndWVzdC9sZy5oCmluZGV4IDNlMmRkZmIuLjY0ZjBhYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xnLmgKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGcuaApAQCAtNTgsOSArNTgsMTggQEAKIAl1OCBpbnRlcnJ1cHQ7IAkvKiAwIHdoZW4gbm90IHJlZ2lzdGVyZWQgKi8KIH07CiAKLS8qIFdlIGhhdmUgc2VwYXJhdGUgdHlwZXMgZm9yIHRoZSBndWVzdCdzIHB0ZXMgJiBwZ2RzIGFuZCB0aGUgc2hhZG93IHB0ZXMgJgotICogcGdkcy4gIFNpbmNlIHRoaXMgaG9zdCBtaWdodCB1c2UgdGhyZWUtbGV2ZWwgcGFnZXRhYmxlcyBhbmQgdGhlIGd1ZXN0IGFuZAotICogc2hhZG93IHBhZ2V0YWJsZXMgZG9uJ3QsIHdlIGNhbid0IHVzZSB0aGUgbm9ybWFsIHB0ZV90L3BnZF90LiAqLworLypIOjMxMCBUaGUgcGFnZS10YWJsZSBjb2RlIG93ZXMgYSBncmVhdCBkZWJ0IG9mIGdyYXRpdHVkZSB0byBBbmRpIEtsZWVuLiAgSGUKKyAqIHJldmlld2VkIHRoZSBvcmlnaW5hbCBjb2RlIHdoaWNoIHVzZWQgInUzMiIgZm9yIGFsbCBwYWdlIHRhYmxlIGVudHJpZXMsIGFuZAorICogaW5zaXN0ZWQgdGhhdCBpdCB3b3VsZCBiZSBmYXIgY2xlYXJlciB3aXRoIGV4cGxpY2l0IHR5cGluZy4gIEkgdGhvdWdodCBpdAorICogd2FzIG92ZXJraWxsLCBidXQgaGUgd2FzIHJpZ2h0OiBpdCBpcyBtdWNoIGNsZWFyZXIgdGhhbiBpdCB3YXMgYmVmb3JlLgorICoKKyAqIFdlIGhhdmUgc2VwYXJhdGUgdHlwZXMgZm9yIHRoZSBHdWVzdCdzIHB0ZXMgJiBwZ2RzIGFuZCB0aGUgc2hhZG93IHB0ZXMgJgorICogcGdkcy4gIFRoZXJlJ3MgYWxyZWFkeSBhIExpbnV4IHR5cGUgZm9yIHRoZXNlIChwdGVfdCBhbmQgcGdkX3QpIGJ1dCB0aGV5CisgKiBjaGFuZ2UgZGVwZW5kaW5nIG9uIGtlcm5lbCBjb25maWcgb3B0aW9ucyAoUEFFKS4gKi8KKworLyogRWFjaCBlbnRyeSBpcyBpZGVudGljYWw6IGxvd2VyIDEyIGJpdHMgb2YgZmxhZ3MgYW5kIHVwcGVyIDIwIGJpdHMgZm9yIHRoZQorICogInBhZ2UgZnJhbWUgbnVtYmVyIiAoMCA9PSBmaXJzdCBwaHlzaWNhbCBwYWdlLCBldGMpLiAgVGhleSBhcmUgZGlmZmVyZW50CisgKiB0eXBlcyBzbyB0aGUgY29tcGlsZXIgd2lsbCB3YXJuIHVzIGlmIHdlIG1peCB0aGVtIGltcHJvcGVybHkuICovCiB0eXBlZGVmIHVuaW9uIHsKIAlzdHJ1Y3QgeyB1bnNpZ25lZCBmbGFnczoxMiwgcGZuOjIwOyB9OwogCXN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgdmFsOyB9IHJhdzsKQEAgLTc3LDggKzg2LDEyIEBACiAJc3RydWN0IHsgdW5zaWduZWQgZmxhZ3M6MTIsIHBmbjoyMDsgfTsKIAlzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHZhbDsgfSByYXc7CiB9IGdwdGVfdDsKKworLyogV2UgaGF2ZSB0d28gY29udmVuaWVudCBtYWNyb3MgdG8gY29udmVydCBhICJyYXciIHZhbHVlIGFzIGhhbmRlZCB0byB1cyBieQorICogdGhlIEd1ZXN0IGludG8gdGhlIGNvcnJlY3QgR3Vlc3QgUEdEIG9yIFBURSB0eXBlLiAqLwogI2RlZmluZSBta2dwdGUoX3ZhbCkgKChncHRlX3Qpey5yYXcudmFsID0gX3ZhbH0pCiAjZGVmaW5lIG1rZ3BnZChfdmFsKSAoKGdwZ2RfdCl7LnJhdy52YWwgPSBfdmFsfSkKKy8qOiovCiAKIHN0cnVjdCBwZ2RpcgogewpAQCAtMjQzLDcgKzI1NiwzMiBAQAogCiAvKiBoeXBlcmNhbGxzLmM6ICovCiB2b2lkIGRvX2h5cGVyY2FsbHMoc3RydWN0IGxndWVzdCAqbGcpOwordm9pZCB3cml0ZV90aW1lc3RhbXAoc3RydWN0IGxndWVzdCAqbGcpOwogCisvKkw6MDM1CisgKiBMZXQncyBzdGVwIGFzaWRlIGZvciB0aGUgbW9tZW50LCB0byBzdHVkeSBvbmUgaW1wb3J0YW50IHJvdXRpbmUgdGhhdCdzIHVzZWQKKyAqIHdpZGVseSBpbiB0aGUgSG9zdCBjb2RlLgorICoKKyAqIFRoZXJlIGFyZSBtYW55IGNhc2VzIHdoZXJlIHRoZSBHdWVzdCBkb2VzIHNvbWV0aGluZyBpbnZhbGlkLCBsaWtlIHBhc3MgY3JhcAorICogdG8gYSBoeXBlcmNhbGwuICBTaW5jZSBvbmx5IHRoZSBHdWVzdCBrZXJuZWwgY2FuIG1ha2UgaHlwZXJjYWxscywgaXQncyBxdWl0ZQorICogYWNjZXB0YWJsZSB0byBzaW1wbHkgdGVybWluYXRlIHRoZSBHdWVzdCBhbmQgZ2l2ZSB0aGUgTGF1bmNoZXIgYSBuaWNlbHkKKyAqIGZvcm1hdHRlZCByZWFzb24uICBJdCdzIGFsc28gc2ltcGxlciBmb3IgdGhlIEd1ZXN0IGl0c2VsZiwgd2hpY2ggZG9lc24ndAorICogbmVlZCB0byBjaGVjayBtb3N0IGh5cGVyY2FsbHMgZm9yICJzdWNjZXNzIjsgaWYgeW91J3JlIHN0aWxsIHJ1bm5pbmcsIGl0CisgKiBzdWNjZWVkZWQuCisgKgorICogT25jZSB0aGlzIGlzIGNhbGxlZCwgdGhlIEd1ZXN0IHdpbGwgbmV2ZXIgcnVuIGFnYWluLCBzbyBtb3N0IEhvc3QgY29kZSBjYW4KKyAqIGNhbGwgdGhpcyB0aGVuIGNvbnRpbnVlIGFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLiAgVGhpcyBtZWFucyBtYW55CisgKiBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSB0byBleHBsaWNpdGx5IHJldHVybiBhbiBlcnJvciBjb2RlLCB3aGljaCBrZWVwcyB0aGUKKyAqIGNvZGUgc2ltcGxlLgorICoKKyAqIEl0IGFsc28gbWVhbnMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2U6IG9ubHkgdGhlIGZpcnN0IG9uZSBpcworICogcmVtZW1iZXJlZC4gIFRoZSBvbmx5IHRyaWNrIGlzIHRoYXQgd2Ugc3RpbGwgbmVlZCB0byBraWxsIHRoZSBHdWVzdCBldmVuIGlmCisgKiB3ZSBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgdGhlIHJlYXNvbi4gIExpbnV4IGhhcyBhIG5lYXQgd2F5IG9mCisgKiBwYWNraW5nIGVycm9yIGNvZGVzIGludG8gaW52YWxpZCBwb2ludGVycywgc28gd2UgdXNlIHRoYXQgaGVyZS4KKyAqCisgKiBMaWtlIGFueSBtYWNybyB3aGljaCB1c2VzIGFuICJpZiIsIGl0IGlzIHNhZmVseSB3cmFwcGVkIGluIGEgcnVuLW9uY2UgImRvIHsKKyAqIH0gd2hpbGUoMCkiLgorICovCiAjZGVmaW5lIGtpbGxfZ3Vlc3QobGcsIGZtdC4uLikJCQkJCVwKIGRvIHsJCQkJCQkJCVwKIAlpZiAoIShsZyktPmRlYWQpIHsJCQkJCVwKQEAgLTI1Miw2ICsyOTAsNyBAQAogCQkJKGxnKS0+ZGVhZCA9IEVSUl9QVFIoLUVOT01FTSk7CQlcCiAJfQkJCQkJCQlcCiB9IHdoaWxlKDApCisvKiAoRW5kIG9mIGFzaWRlKSA6Ki8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGd1ZXN0X3BhKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1bnNpZ25lZCBsb25nIHZhZGRyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0LmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3QuYwppbmRleCAxOGRhZGUwLi4xYmMxNTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3QuYworKysgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3QuYwpAQCAtMSw2ICsxLDMyIEBACi0vKgotICogTGd1ZXN0IHNwZWNpZmljIHBhcmF2aXJ0LW9wcyBpbXBsZW1lbnRhdGlvbgorLypQOjAxMAorICogQSBoeXBlcnZpc29yIGFsbG93cyBtdWx0aXBsZSBPcGVyYXRpbmcgU3lzdGVtcyB0byBydW4gb24gYSBzaW5nbGUgbWFjaGluZS4KKyAqIFRvIHF1b3RlIERhdmlkIFdoZWVsZXI6ICJBbnkgcHJvYmxlbSBpbiBjb21wdXRlciBzY2llbmNlIGNhbiBiZSBzb2x2ZWQgd2l0aAorICogYW5vdGhlciBsYXllciBvZiBpbmRpcmVjdGlvbi4iCiAgKgorICogV2Uga2VlcCB0aGluZ3Mgc2ltcGxlIGluIHR3byB3YXlzLiAgRmlyc3QsIHdlIHN0YXJ0IHdpdGggYSBub3JtYWwgTGludXgKKyAqIGtlcm5lbCBhbmQgaW5zZXJ0IGEgbW9kdWxlIChsZy5rbykgd2hpY2ggYWxsb3dzIHVzIHRvIHJ1biBvdGhlciBMaW51eAorICoga2VybmVscyB0aGUgc2FtZSB3YXkgd2UnZCBydW4gcHJvY2Vzc2VzLiAgV2UgY2FsbCB0aGUgZmlyc3Qga2VybmVsIHRoZSBIb3N0LAorICogYW5kIHRoZSBvdGhlcnMgdGhlIEd1ZXN0cy4gIFRoZSBwcm9ncmFtIHdoaWNoIHNldHMgdXAgYW5kIGNvbmZpZ3VyZXMgR3Vlc3RzCisgKiAoc3VjaCBhcyB0aGUgZXhhbXBsZSBpbiBEb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QuYykgaXMgY2FsbGVkIHRoZQorICogTGF1bmNoZXIuCisgKgorICogU2Vjb25kbHksIHdlIG9ubHkgcnVuIHNwZWNpYWxseSBtb2RpZmllZCBHdWVzdHMsIG5vdCBub3JtYWwga2VybmVscy4gIFdoZW4KKyAqIHlvdSBzZXQgQ09ORklHX0xHVUVTVCB0byAneScgb3IgJ20nLCB0aGlzIGF1dG9tYXRpY2FsbHkgc2V0cworICogQ09ORklHX0xHVUVTVF9HVUVTVD15LCB3aGljaCBjb21waWxlcyB0aGlzIGZpbGUgaW50byB0aGUga2VybmVsIHNvIGl0IGtub3dzCisgKiBob3cgdG8gYmUgYSBHdWVzdC4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHVzZSB0aGUgc2FtZSBrZXJuZWwgeW91IGJvb3QKKyAqIG5vcm1hbGx5IChpZS4gYXMgYSBIb3N0KSBhcyBhIEd1ZXN0LgorICoKKyAqIFRoZXNlIEd1ZXN0cyBrbm93IHRoYXQgdGhleSBjYW5ub3QgZG8gcHJpdmlsZWdlZCBvcGVyYXRpb25zLCBzdWNoIGFzIGRpc2FibGUKKyAqIGludGVycnVwdHMsIGFuZCB0aGF0IHRoZXkgaGF2ZSB0byBhc2sgdGhlIEhvc3QgdG8gZG8gc3VjaCB0aGluZ3MgZXhwbGljaXRseS4KKyAqIFRoaXMgZmlsZSBjb25zaXN0cyBvZiBhbGwgdGhlIHJlcGxhY2VtZW50cyBmb3Igc3VjaCBsb3ctbGV2ZWwgbmF0aXZlCisgKiBoYXJkd2FyZSBvcGVyYXRpb25zOiB0aGVzZSBzcGVjaWFsIEd1ZXN0IHZlcnNpb25zIGNhbGwgdGhlIEhvc3QuCisgKgorICogU28gaG93IGRvZXMgdGhlIGtlcm5lbCBrbm93IGl0J3MgYSBHdWVzdD8gIFRoZSBHdWVzdCBzdGFydHMgYXQgYSBzcGVjaWFsCisgKiBlbnRyeSBwb2ludCBtYXJrZWQgd2l0aCBhIG1hZ2ljIHN0cmluZywgd2hpY2ggc2V0cyB1cCBhIGZldyB0aGluZ3MgdGhlbgorICogY2FsbHMgaGVyZS4gIFdlIHJlcGxhY2UgdGhlIG5hdGl2ZSBmdW5jdGlvbnMgaW4gInN0cnVjdCBwYXJhdmlydF9vcHMiCisgKiB3aXRoIG91ciBHdWVzdCB2ZXJzaW9ucywgdGhlbiBib290IGxpa2Ugbm9ybWFsLiA6Ki8KKworLyoKICAqIENvcHlyaWdodCAoQykgMjAwNiwgUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiBJQk0gQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTQwLDYgKzY2LDEyIEBACiAjaW5jbHVkZSA8YXNtL21jZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCisvKkc6MDEwIFdlbGNvbWUgdG8gdGhlIEd1ZXN0IQorICoKKyAqIFRoZSBHdWVzdCBpbiBvdXIgdGFsZSBpcyBhIHNpbXBsZSBjcmVhdHVyZTogaWRlbnRpY2FsIHRvIHRoZSBIb3N0IGJ1dAorICogYmVoYXZpbmcgaW4gc2ltcGxpZmllZCBidXQgZXF1aXZhbGVudCB3YXlzLiAgSW4gcGFydGljdWxhciwgdGhlIEd1ZXN0IGlzIHRoZQorICogc2FtZSBrZXJuZWwgYXMgdGhlIEhvc3QgKG9yIGF0IGxlYXN0LCBidWlsdCBmcm9tIHRoZSBzYW1lIHNvdXJjZSBjb2RlKS4gOiovCisKIC8qIERlY2xhcmF0aW9ucyBmb3IgZGVmaW5pdGlvbnMgaW4gbGd1ZXN0X2d1ZXN0LlMgKi8KIGV4dGVybiBjaGFyIGxndWVzdF9ub2lycV9zdGFydFtdLCBsZ3Vlc3Rfbm9pcnFfZW5kW107CiBleHRlcm4gY29uc3QgY2hhciBsZ3N0YXJ0X2NsaVtdLCBsZ2VuZF9jbGlbXTsKQEAgLTU4LDcgKzkwLDI2IEBACiBzdHJ1Y3QgbGd1ZXN0X2RldmljZV9kZXNjICpsZ3Vlc3RfZGV2aWNlczsKIHN0YXRpYyBjeWNsZV90IGNsb2NrX2Jhc2U7CiAKLXN0YXRpYyBlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBsYXp5X21vZGU7CisvKkc6MDM1IE5vdGljZSB0aGUgbGF6eV9oY2FsbCgpIGFib3ZlLCByYXRoZXIgdGhhbiBoY2FsbCgpLiAgVGhpcyBpcyBvdXIgZmlyc3QKKyAqIHJlYWwgb3B0aW1pemF0aW9uIHRyaWNrIQorICoKKyAqIFdoZW4gbGF6eV9tb2RlIGlzIHNldCwgaXQgbWVhbnMgd2UncmUgYWxsb3dlZCB0byBkZWZlciBhbGwgaHlwZXJjYWxscyBhbmQgZG8KKyAqIHRoZW0gYXMgYSBiYXRjaCB3aGVuIGxhenlfbW9kZSBpcyBldmVudHVhbGx5IHR1cm5lZCBvZmYuICBCZWNhdXNlIGh5cGVyY2FsbHMKKyAqIGFyZSByZWFzb25hYmx5IGV4cGVuc2l2ZSwgYmF0Y2hpbmcgdGhlbSB1cCBtYWtlcyBzZW5zZS4gIEZvciBleGFtcGxlLCBhCisgKiBsYXJnZSBtbWFwIG1pZ2h0IHVwZGF0ZSBkb3plbnMgb2YgcGFnZSB0YWJsZSBlbnRyaWVzOiB0aGF0IGNvZGUgY2FsbHMKKyAqIGxndWVzdF9sYXp5X21vZGUoUEFSQVZJUlRfTEFaWV9NTVUpLCBkb2VzIHRoZSBkb3plbiB1cGRhdGVzLCB0aGVuIGNhbGxzCisgKiBsZ3Vlc3RfbGF6eV9tb2RlKFBBUkFWSVJUX0xBWllfTk9ORSkuCisgKgorICogU28sIHdoZW4gd2UncmUgaW4gbGF6eSBtb2RlLCB3ZSBjYWxsIGFzeW5jX2h5cGVyY2FsbCgpIHRvIHN0b3JlIHRoZSBjYWxsIGZvcgorICogZnV0dXJlIHByb2Nlc3NpbmcuICBXaGVuIGxhenkgbW9kZSBpcyB0dXJuZWQgb2ZmIHdlIGlzc3VlIGEgaHlwZXJjYWxsIHRvCisgKiBmbHVzaCB0aGUgc3RvcmVkIGNhbGxzLgorICoKKyAqIFRoZXJlJ3MgYWxzbyBhIGhhY2sgd2hlcmUgIm1vZGUiIGlzIHNldCB0byAiUEFSQVZJUlRfTEFaWV9GTFVTSCIgd2hpY2gKKyAqIGluZGljYXRlcyB3ZSdyZSB0byBmbHVzaCBhbnkgb3V0c3RhbmRpbmcgY2FsbHMgaW1tZWRpYXRlbHkuICBUaGlzIGlzIHVzZWQKKyAqIHdoZW4gYW4gaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhIGttYXBfYXRvbWljKCk6IHRoZSBwYWdlIHRhYmxlIGNoYW5nZXMgbXVzdAorICogaGFwcGVuIGltbWVkaWF0ZWx5IGV2ZW4gaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGJhdGNoLiAgVXN1YWxseSB3ZSdyZQorICogbm90LCB0aG91Z2gsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gKi8KK3N0YXRpYyBlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBsYXp5X21vZGU7IC8qIE5vdGU6IG5vdCBTTVAtc2FmZSEgKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9sYXp5X21vZGUoZW51bSBwYXJhdmlydF9sYXp5X21vZGUgbW9kZSkKIHsKIAlpZiAobW9kZSA9PSBQQVJBVklSVF9MQVpZX0ZMVVNIKSB7CkBAIC04Miw2ICsxMzMsMTYgQEAKIAkJYXN5bmNfaGNhbGwoY2FsbCwgYXJnMSwgYXJnMiwgYXJnMyk7CiB9CiAKKy8qIGFzeW5jX2hjYWxsKCkgaXMgcHJldHR5IHNpbXBsZTogSSdtIHF1aXRlIHByb3VkIG9mIGl0IHJlYWxseS4gIFdlIGhhdmUgYQorICogcmluZyBidWZmZXIgb2Ygc3RvcmVkIGh5cGVyY2FsbHMgd2hpY2ggdGhlIEhvc3Qgd2lsbCBydW4gdGhvdWdoIG5leHQgdGltZSB3ZQorICogZG8gYSBub3JtYWwgaHlwZXJjYWxsLiAgRWFjaCBlbnRyeSBpbiB0aGUgcmluZyBoYXMgNCBzbG90cyBmb3IgdGhlIGh5cGVyY2FsbAorICogYXJndW1lbnRzLCBhbmQgYSAiaGNhbGxfc3RhdHVzIiB3b3JkIHdoaWNoIGlzIDAgaWYgdGhlIGNhbGwgaXMgcmVhZHkgdG8gZ28sCisgKiBhbmQgMjU1IG9uY2UgdGhlIEhvc3QgaGFzIGZpbmlzaGVkIHdpdGggaXQuCisgKgorICogSWYgd2UgY29tZSBhcm91bmQgdG8gYSBzbG90IHdoaWNoIGhhc24ndCBiZWVuIGZpbmlzaGVkLCB0aGVuIHRoZSB0YWJsZSBpcworICogZnVsbCBhbmQgd2UganVzdCBtYWtlIHRoZSBoeXBlcmNhbGwgZGlyZWN0bHkuICBUaGlzIGhhcyB0aGUgbmljZSBzaWRlCisgKiBlZmZlY3Qgb2YgY2F1c2luZyB0aGUgSG9zdCB0byBydW4gYWxsIHRoZSBzdG9yZWQgY2FsbHMgaW4gdGhlIHJpbmcgYnVmZmVyCisgKiB3aGljaCBlbXB0aWVzIGl0IGZvciBuZXh0IHRpbWUhICovCiB2b2lkIGFzeW5jX2hjYWxsKHVuc2lnbmVkIGxvbmcgY2FsbCwKIAkJIHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyLCB1bnNpZ25lZCBsb25nIGFyZzMpCiB7CkBAIC04OSw2ICsxNTAsOSBAQAogCXN0YXRpYyB1bnNpZ25lZCBpbnQgbmV4dF9jYWxsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgaWYgbm90IGFscmVhZHkgZGlzYWJsZWQ6IHdlIGRvbid0IHdhbnQgYW4KKwkgKiBpbnRlcnJ1cHQgaGFuZGxlciBtYWtpbmcgYSBoeXBlcmNhbGwgd2hpbGUgd2UncmUgYWxyZWFkeSBkb2luZworCSAqIG9uZSEgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKGxndWVzdF9kYXRhLmhjYWxsX3N0YXR1c1tuZXh0X2NhbGxdICE9IDB4RkYpIHsKIAkJLyogVGFibGUgZnVsbCwgc28gZG8gbm9ybWFsIGhjYWxsIHdoaWNoIHdpbGwgZmx1c2ggdGFibGUuICovCkBAIC05OCw3ICsxNjIsNyBAQAogCQlsZ3Vlc3RfZGF0YS5oY2FsbHNbbmV4dF9jYWxsXS5lZHggPSBhcmcxOwogCQlsZ3Vlc3RfZGF0YS5oY2FsbHNbbmV4dF9jYWxsXS5lYnggPSBhcmcyOwogCQlsZ3Vlc3RfZGF0YS5oY2FsbHNbbmV4dF9jYWxsXS5lY3ggPSBhcmczOwotCQkvKiBNYWtlIHN1cmUgaG9zdCBzZWVzIGFyZ3VtZW50cyBiZWZvcmUgInZhbGlkIiBmbGFnLiAqLworCQkvKiBBcmd1bWVudHMgbXVzdCBhbGwgYmUgd3JpdHRlbiBiZWZvcmUgd2UgbWFyayBpdCB0byBnbyAqLwogCQl3bWIoKTsKIAkJbGd1ZXN0X2RhdGEuaGNhbGxfc3RhdHVzW25leHRfY2FsbF0gPSAwOwogCQlpZiAoKytuZXh0X2NhbGwgPT0gTEhDQUxMX1JJTkdfU0laRSkKQEAgLTEwNiw5ICsxNzAsMTQgQEAKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQorLyo6Ki8KIAorLyogV3JhcHBlcnMgZm9yIHRoZSBTRU5EX0RNQSBhbmQgQklORF9ETUEgaHlwZXJjYWxscy4gIFRoaXMgaXMgbWFpbmx5IGJlY2F1c2UKKyAqIEplZmYgR2FyemlrIGNvbXBsYWluZWQgdGhhdCBfX3BhKCkgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBkcml2ZXJzLCBhbmQgdGhpcworICogaGVscHMgcmVtb3ZlIG1vc3Qgb2YgdGhlbS4gICBCdXQgYWxzbywgaXQgd3JhcHMgc29tZSB1Z2xpbmVzcy4gKi8KIHZvaWQgbGd1ZXN0X3NlbmRfZG1hKHVuc2lnbmVkIGxvbmcga2V5LCBzdHJ1Y3QgbGd1ZXN0X2RtYSAqZG1hKQogeworCS8qIFRoZSBoY2FsbCBtaWdodCBub3Qgd3JpdGUgdGhpcyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyAqLwogCWRtYS0+dXNlZF9sZW4gPSAwOwogCWhjYWxsKExIQ0FMTF9TRU5EX0RNQSwga2V5LCBfX3BhKGRtYSksIDApOwogfQpAQCAtMTE2LDExICsxODUsMTYgQEAKIGludCBsZ3Vlc3RfYmluZF9kbWEodW5zaWduZWQgbG9uZyBrZXksIHN0cnVjdCBsZ3Vlc3RfZG1hICpkbWFzLAogCQkgICAgdW5zaWduZWQgaW50IG51bSwgdTggaXJxKQogeworCS8qIFRoaXMgaXMgdGhlIG9ubHkgaHlwZXJjYWxsIHdoaWNoIGFjdHVhbGx5IHdhbnRzIDUgYXJndW1lbnRzLCBhbmQgd2UKKwkgKiBvbmx5IHN1cHBvcnQgNC4gIEZvcnR1bmF0ZWx5IHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGlzIGFsd2F5cyBsZXNzCisJICogdGhhbiAyNTYsIHNvIHdlIGNhbiBwYWNrIGl0IHdpdGggdGhlIG51bWJlciBvZiBkbWFzIGluIHRoZSBmaW5hbAorCSAqIGFyZ3VtZW50LiAgKi8KIAlpZiAoIWhjYWxsKExIQ0FMTF9CSU5EX0RNQSwga2V5LCBfX3BhKGRtYXMpLCAobnVtIDw8IDgpIHwgaXJxKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CiB9CiAKKy8qIFVuYmluZGluZyBpcyB0aGUgc2FtZSBoeXBlcmNhbGwgYXMgYmluZGluZywgYnV0IHdpdGggMCBudW0gJiBpcnEuICovCiB2b2lkIGxndWVzdF91bmJpbmRfZG1hKHVuc2lnbmVkIGxvbmcga2V5LCBzdHJ1Y3QgbGd1ZXN0X2RtYSAqZG1hcykKIHsKIAloY2FsbChMSENBTExfQklORF9ETUEsIGtleSwgX19wYShkbWFzKSwgMCk7CkBAIC0xMzgsMzUgKzIxMiw3MyBAQAogCWlvdW5tYXAoKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopYWRkcik7CiB9CiAKKy8qRzowMzMKKyAqIEhlcmUgYXJlIG91ciBmaXJzdCBuYXRpdmUtaW5zdHJ1Y3Rpb24gcmVwbGFjZW1lbnRzOiBmb3VyIGZ1bmN0aW9ucyBmb3IKKyAqIGludGVycnVwdCBjb250cm9sLgorICoKKyAqIFRoZSBzaW1wbGVzdCB3YXkgb2YgaW1wbGVtZW50aW5nIHRoZXNlIHdvdWxkIGJlIHRvIGhhdmUgInR1cm4gaW50ZXJydXB0cworICogb2ZmIiBhbmQgInR1cm4gaW50ZXJydXB0cyBvbiIgaHlwZXJjYWxscy4gIFVuZm9ydHVuYXRlbHksIHRoaXMgaXMgdG9vIHNsb3c6CisgKiB0aGVzZSBhcmUgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbmx5IGNhbGxlZCBmdW5jdGlvbnMgb2YgdGhvc2Ugd2Ugb3ZlcnJpZGUuCisgKgorICogU28gaW5zdGVhZCB3ZSBrZWVwIGFuICJpcnFfZW5hYmxlZCIgZmllbGQgaW5zaWRlIG91ciAic3RydWN0IGxndWVzdF9kYXRhIiwKKyAqIHdoaWNoIHRoZSBHdWVzdCBjYW4gdXBkYXRlIHdpdGggYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBUaGUgSG9zdCBrbm93cyB0bworICogY2hlY2sgdGhlcmUgd2hlbiBpdCB3YW50cyB0byBkZWxpdmVyIGFuIGludGVycnVwdC4KKyAqLworCisvKiBzYXZlX2ZsYWdzKCkgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBwcm9jZXNzb3Igc3RhdGUgKGllLiAiZWZsYWdzIikuICBUaGUKKyAqIGVmbGFncyB3b3JkIGNvbnRhaW5zIGFsbCBraW5kIG9mIHN0dWZmLCBidXQgaW4gcHJhY3RpY2UgTGludXggb25seSBjYXJlcworICogYWJvdXQgdGhlIGludGVycnVwdCBmbGFnLiAgT3VyICJzYXZlX2ZsYWdzKCkiIGp1c3QgcmV0dXJucyB0aGF0LiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZV9mbCh2b2lkKQogewogCXJldHVybiBsZ3Vlc3RfZGF0YS5pcnFfZW5hYmxlZDsKIH0KIAorLyogInJlc3RvcmVfZmxhZ3MiIGp1c3Qgc2V0cyB0aGUgZmxhZ3MgYmFjayB0byB0aGUgdmFsdWUgZ2l2ZW4uICovCiBzdGF0aWMgdm9pZCByZXN0b3JlX2ZsKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JLyogRklYTUU6IENoZWNrIGlmIGludGVycnVwdCBwZW5kaW5nLi4uICovCiAJbGd1ZXN0X2RhdGEuaXJxX2VuYWJsZWQgPSBmbGFnczsKIH0KIAorLyogSW50ZXJydXB0cyBnbyBvZmYuLi4gKi8KIHN0YXRpYyB2b2lkIGlycV9kaXNhYmxlKHZvaWQpCiB7CiAJbGd1ZXN0X2RhdGEuaXJxX2VuYWJsZWQgPSAwOwogfQogCisvKiBJbnRlcnJ1cHRzIGdvIG9uLi4uICovCiBzdGF0aWMgdm9pZCBpcnFfZW5hYmxlKHZvaWQpCiB7Ci0JLyogRklYTUU6IENoZWNrIGlmIGludGVycnVwdCBwZW5kaW5nLi4uICovCiAJbGd1ZXN0X2RhdGEuaXJxX2VuYWJsZWQgPSBYODZfRUZMQUdTX0lGOwogfQorLyo6Ki8KKy8qTTowMDMgTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIGZvciBvdXRzdGFuZGluZyBpbnRlcnJ1cHRzIHdoZW4gd2UgcmUtZW5hYmxlCisgKiB0aGVtIChvciB3aGVuIHdlIHVubWFzayBhbiBpbnRlcnJ1cHQpLiAgVGhpcyBzZWVtcyB0byB3b3JrIGZvciB0aGUgbW9tZW50LAorICogc2luY2UgaW50ZXJydXB0cyBhcmUgcmFyZSBhbmQgd2UnbGwganVzdCBnZXQgdGhlIGludGVycnVwdCBvbiB0aGUgbmV4dCB0aW1lcgorICogdGljaywgYnV0IHdoZW4gd2UgdHVybiBvbiBDT05GSUdfTk9fSFosIHdlIHNob3VsZCByZXZpc2l0IHRoaXMuICBPbmUgd2F5CisgKiB3b3VsZCBiZSB0byBwdXQgdGhlICJpcnFfZW5hYmxlZCIgZmllbGQgaW4gYSBwYWdlIGJ5IGl0c2VsZiwgYW5kIGhhdmUgdGhlCisgKiBIb3N0IHdyaXRlLXByb3RlY3QgaXQgd2hlbiBhbiBpbnRlcnJ1cHQgY29tZXMgaW4gd2hlbiBpcnFzIGFyZSBkaXNhYmxlZC4KKyAqIFRoZXJlIHdpbGwgdGhlbiBiZSBhIHBhZ2UgZmF1bHQgYXMgc29vbiBhcyBpbnRlcnJ1cHRzIGFyZSByZS1lbmFibGVkLiA6Ki8KIAorLypHOjAzNAorICogVGhlIEludGVycnVwdCBEZXNjcmlwdG9yIFRhYmxlIChJRFQpLgorICoKKyAqIFRoZSBJRFQgdGVsbHMgdGhlIHByb2Nlc3NvciB3aGF0IHRvIGRvIHdoZW4gYW4gaW50ZXJydXB0IGNvbWVzIGluLiAgRWFjaAorICogZW50cnkgaW4gdGhlIHRhYmxlIGlzIGEgNjQtYml0IGRlc2NyaXB0b3I6IHRoaXMgaG9sZHMgdGhlIHByaXZpbGVnZSBsZXZlbCwKKyAqIGFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIsIGFuZC4uLiB3ZWxsLCB3aG8gY2FyZXM/ICBUaGUgR3Vlc3QganVzdCBhc2tzIHRoZQorICogSG9zdCB0byBtYWtlIHRoZSBjaGFuZ2UgYW55d2F5LCBiZWNhdXNlIHRoZSBIb3N0IGNvbnRyb2xzIHRoZSByZWFsIElEVC4KKyAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X3dyaXRlX2lkdF9lbnRyeShzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LAogCQkJCSAgIGludCBlbnRyeW51bSwgdTMyIGxvdywgdTMyIGhpZ2gpCiB7CisJLyogS2VlcCB0aGUgbG9jYWwgY29weSB1cCB0byBkYXRlLiAqLwogCXdyaXRlX2R0X2VudHJ5KGR0LCBlbnRyeW51bSwgbG93LCBoaWdoKTsKKwkvKiBUZWxsIEhvc3QgYWJvdXQgdGhpcyBuZXcgZW50cnkuICovCiAJaGNhbGwoTEhDQUxMX0xPQURfSURUX0VOVFJZLCBlbnRyeW51bSwgbG93LCBoaWdoKTsKIH0KIAorLyogQ2hhbmdpbmcgdG8gYSBkaWZmZXJlbnQgSURUIGlzIHZlcnkgcmFyZTogd2Uga2VlcCB0aGUgSURUIHVwLXRvLWRhdGUgZXZlcnkKKyAqIHRpbWUgaXQgaXMgd3JpdHRlbiwgc28gd2UgY2FuIHNpbXBseSBsb29wIHRocm91Z2ggYWxsIGVudHJpZXMgYW5kIHRlbGwgdGhlCisgKiBIb3N0IGFib3V0IHRoZW0uICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3RfbG9hZF9pZHQoY29uc3Qgc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTE3NiwxMiArMjg4LDI5IEBACiAJCWhjYWxsKExIQ0FMTF9MT0FEX0lEVF9FTlRSWSwgaSwgaWR0W2ldLmEsIGlkdFtpXS5iKTsKIH0KIAorLyoKKyAqIFRoZSBHbG9iYWwgRGVzY3JpcHRvciBUYWJsZS4KKyAqCisgKiBUaGUgSW50ZWwgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYW5vdGhlciB0YWJsZSwgY2FsbGVkIHRoZSBHbG9iYWwgRGVzY3JpcHRvcgorICogVGFibGUgKEdEVCkuICBZb3UgdGVsbCB0aGUgQ1BVIHdoZXJlIGl0IGlzIChhbmQgaXRzIHNpemUpIHVzaW5nIHRoZSAibGdkdCIKKyAqIGluc3RydWN0aW9uLCBhbmQgdGhlbiBzZXZlcmFsIG90aGVyIGluc3RydWN0aW9ucyByZWZlciB0byBlbnRyaWVzIGluIHRoZQorICogdGFibGUuICBUaGVyZSBhcmUgdGhyZWUgZW50cmllcyB3aGljaCB0aGUgU3dpdGNoZXIgbmVlZHMsIHNvIHRoZSBIb3N0IHNpbXBseQorICogY29udHJvbHMgdGhlIGVudGlyZSB0aGluZyBhbmQgdGhlIEd1ZXN0IGFza3MgaXQgdG8gbWFrZSBjaGFuZ2VzIHVzaW5nIHRoZQorICogTE9BRF9HRFQgaHlwZXJjYWxsLgorICoKKyAqIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHRoZSBJRFQgY29kZSB3aGVyZSB3ZSBoYXZlIGEgTE9BRF9JRFRfRU5UUlkKKyAqIGh5cGVyY2FsbCBhbmQgdXNlIHRoYXQgcmVwZWF0ZWRseSB0byBsb2FkIGEgbmV3IElEVC4gIEkgZG9uJ3QgdGhpbmsgaXQKKyAqIHJlYWxseSBtYXR0ZXJzLCBidXQgd291bGRuJ3QgaXQgYmUgbmljZSBpZiB0aGV5IHdlcmUgdGhlIHNhbWU/CisgKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9sb2FkX2dkdChjb25zdCBzdHJ1Y3QgWGd0X2Rlc2Nfc3RydWN0ICpkZXNjKQogewogCUJVR19PTigoZGVzYy0+c2l6ZSsxKS84ICE9IEdEVF9FTlRSSUVTKTsKIAloY2FsbChMSENBTExfTE9BRF9HRFQsIF9fcGEoZGVzYy0+YWRkcmVzcyksIEdEVF9FTlRSSUVTLCAwKTsKIH0KIAorLyogRm9yIGEgc2luZ2xlIEdEVCBlbnRyeSB3aGljaCBjaGFuZ2VzLCB3ZSBkbyB0aGUgbGF6eSB0aGluZzogYWx0ZXIgb3VyIEdEVCwKKyAqIHRoZW4gdGVsbCB0aGUgSG9zdCB0byByZWxvYWQgdGhlIGVudGlyZSB0aGluZy4gIFRoaXMgb3BlcmF0aW9uIGlzIHNvIHJhcmUKKyAqIHRoYXQgdGhpcyBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBpcyByZWFzb25hYmxlLiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X3dyaXRlX2dkdF9lbnRyeShzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LAogCQkJCSAgIGludCBlbnRyeW51bSwgdTMyIGxvdywgdTMyIGhpZ2gpCiB7CkBAIC0xODksMTkgKzMxOCw1OCBAQAogCWhjYWxsKExIQ0FMTF9MT0FEX0dEVCwgX19wYShkdCksIEdEVF9FTlRSSUVTLCAwKTsKIH0KIAorLyogT0ssIEkgbGllZC4gIFRoZXJlIGFyZSB0aHJlZSAidGhyZWFkIGxvY2FsIHN0b3JhZ2UiIEdEVCBlbnRyaWVzIHdoaWNoIGNoYW5nZQorICogb24gZXZlcnkgY29udGV4dCBzd2l0Y2ggKHRoZXNlIHRocmVlIGVudHJpZXMgYXJlIGhvdyBnbGliYyBpbXBsZW1lbnRzCisgKiBfX3RocmVhZCB2YXJpYWJsZXMpLiAgU28gd2UgaGF2ZSBhIGh5cGVyY2FsbCBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgY2FzZS4gKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9sb2FkX3RscyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlsYXp5X2hjYWxsKExIQ0FMTF9MT0FEX1RMUywgX19wYSgmdC0+dGxzX2FycmF5KSwgY3B1LCAwKTsKIH0KKy8qOiovCiAKKy8qRzowMzggVGhhdCdzIGVub3VnaCBleGNpdGVtZW50IGZvciBub3csIGJhY2sgdG8gcGxvdWdoaW5nIHRocm91Z2ggZWFjaCBvZgorICogdGhlIHBhcmF2aXJ0X29wcyAod2UncmUgYWJvdXQgMS8zIG9mIHRoZSB3YXkgdGhyb3VnaCkuCisgKgorICogVGhpcyBpcyB0aGUgTG9jYWwgRGVzY3JpcHRvciBUYWJsZSwgYW5vdGhlciB3ZWlyZCBJbnRlbCB0aGluZ3kuICBMaW51eCBvbmx5CisgKiB1c2VzIHRoaXMgZm9yIHNvbWUgc3RyYW5nZSBhcHBsaWNhdGlvbnMgbGlrZSBXaW5lLiAgV2UgZG9uJ3QgZG8gYW55dGhpbmcKKyAqIGhlcmUsIHNvIHRoZXknbGwgZ2V0IGFuIGluZm9ybWF0aXZlIGFuZCBmcmllbmRseSBTZWdtZW50YXRpb24gRmF1bHQuICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3Rfc2V0X2xkdChjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBlbnRyaWVzKQogewogfQogCisvKiBUaGlzIGxvYWRzIGEgR0RUIGVudHJ5IGludG8gdGhlICJUYXNrIFJlZ2lzdGVyIjogdGhhdCBlbnRyeSBwb2ludHMgdG8gYQorICogc3RydWN0dXJlIGNhbGxlZCB0aGUgVGFzayBTdGF0ZSBTZWdtZW50LiAgU29tZSBjb21tZW50cyBzY2F0dGVyZWQgdGhvdWdoIHRoZQorICoga2VybmVsIGNvZGUgaW5kaWNhdGUgdGhhdCB0aGlzIHVzZWQgZm9yIHRhc2sgc3dpdGNoaW5nIGluIGFnZXMgcGFzdCwgYWxvbmcKKyAqIHdpdGggYmxvb2Qgc2FjcmlmaWNlIGFuZCBhc3Ryb2xvZ3kuCisgKgorICogTm93IHRoZXJlJ3Mgbm90aGluZyBpbnRlcmVzdGluZyBpbiBoZXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IHRvbGQgZWxzZXdoZXJlLgorICogQnV0IHRoZSBuYXRpdmUgdmVyc2lvbiB1c2VzIHRoZSAibHRyIiBpbnN0cnVjdGlvbiwgd2hpY2ggbWFrZXMgdGhlIEhvc3QKKyAqIGNvbXBsYWluIHRvIHRoZSBHdWVzdCBhYm91dCBhIFNlZ21lbnRhdGlvbiBGYXVsdCBhbmQgaXQnbGwgb29wcy4gIFNvIHdlCisgKiBvdmVycmlkZSB0aGUgbmF0aXZlIHZlcnNpb24gd2l0aCBhIGRvLW5vdGhpbmcgdmVyc2lvbi4gKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9sb2FkX3RyX2Rlc2Modm9pZCkKIHsKIH0KIAorLyogVGhlICJjcHVpZCIgaW5zdHJ1Y3Rpb24gaXMgYSB3YXkgb2YgcXVlcnlpbmcgYm90aCB0aGUgQ1BVIGlkZW50aXR5CisgKiAobWFudWZhY3R1cmVyLCBtb2RlbCwgZXRjKSBhbmQgaXRzIGZlYXR1cmVzLiAgSXQgd2FzIGludHJvZHVjZWQgYmVmb3JlIHRoZQorICogUGVudGl1bSBpbiAxOTkzIGFuZCBrZWVwcyBnZXR0aW5nIGV4dGVuZGVkIGJ5IGJvdGggSW50ZWwgYW5kIEFNRC4gIEFzIHlvdQorICogbWlnaHQgaW1hZ2luZSwgYWZ0ZXIgYSBkZWNhZGUgYW5kIGEgaGFsZiB0aGlzIHRyZWF0bWVudCwgaXQgaXMgbm93IGEgZ2lhbnQKKyAqIGJhbGwgb2YgaGFpci4gIEl0cyBlbnRyeSBpbiB0aGUgY3VycmVudCBJbnRlbCBtYW51YWwgcnVucyB0byAyOCBwYWdlcy4KKyAqCisgKiBUaGlzIGluc3RydWN0aW9uIGV2ZW4gaXQgaGFzIGl0cyBvd24gV2lraXBlZGlhIGVudHJ5LiAgVGhlIFdpa2lwZWRpYSBlbnRyeQorICogaGFzIGJlZW4gdHJhbnNsYXRlZCBpbnRvIDQgbGFuZ3VhZ2VzLiAgSSBhbSBub3QgbWFraW5nIHRoaXMgdXAhCisgKgorICogV2UgY291bGQgZ2V0IGZ1bmt5IGhlcmUgYW5kIGlkZW50aWZ5IG91cnNlbHZlcyBhcyAiR2VudWluZUxndWVzdCIsIGJ1dAorICogaW5zdGVhZCB3ZSBqdXN0IHVzZSB0aGUgcmVhbCAiY3B1aWQiIGluc3RydWN0aW9uLiAgVGhlbiBJIHByZXR0eSBtdWNoIHR1cm5lZAorICogb2ZmIGZlYXR1cmUgYml0cyB1bnRpbCB0aGUgR3Vlc3QgYm9vdGVkLiAgKERvbid0IHNheSB0aGF0OiB5b3UnbGwgZGFtYWdlCisgKiBsZ3Vlc3Qgc2FsZXMhKSAgU2h1dCB1cCwgaW5uZXIgdm9pY2UhICAoSGV5LCBqdXN0IHBvaW50aW5nIG91dCB0aGF0IHRoaXMgaXMKKyAqIGhhcmRseSBmdXR1cmUgcHJvb2YuKSAgTm9vbmUncyBsaXN0ZW5pbmchICBUaGV5IGRvbid0IGxpa2UgeW91IGFueXdheSwKKyAqIHBhcmVudGhldGljIHdlaXJkbyEKKyAqCisgKiBSZXBsYWNpbmcgdGhlIGNwdWlkIHNvIHdlIGNhbiB0dXJuIGZlYXR1cmVzIG9mZiBpcyBncmVhdCBmb3IgdGhlIGtlcm5lbCwgYnV0CisgKiBhbnlvbmUgKGluY2x1ZGluZyB1c2Vyc3BhY2UpIGNhbiBqdXN0IHVzZSB0aGUgcmF3ICJjcHVpZCIgaW5zdHJ1Y3Rpb24gYW5kCisgKiB0aGUgSG9zdCB3b24ndCBldmVuIG5vdGljZSBzaW5jZSBpdCBpc24ndCBwcml2aWxlZ2VkLiAgU28gd2UgdHJ5IG5vdCB0byBnZXQKKyAqIHRvbyB3b3JrZWQgdXAgYWJvdXQgaXQuICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3RfY3B1aWQodW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LAogCQkJIHVuc2lnbmVkIGludCAqZWN4LCB1bnNpZ25lZCBpbnQgKmVkeCkKIHsKQEAgLTIxNCwyMSArMzgyLDQzIEBACiAJCSplY3ggJj0gMHgwMDAwMjIwMTsKIAkJLyogU1NFLCBTU0UyLCBGWFNSLCBNTVgsIENNT1YsIENNUFhDSEc4QiwgRlBVLiAqLwogCQkqZWR4ICY9IDB4MDc4MDgxMDE7Ci0JCS8qIEhvc3Qgd2FudHMgdG8ga25vdyB3aGVuIHdlIGZsdXNoIGtlcm5lbCBwYWdlczogc2V0IFBHRS4gKi8KKwkJLyogVGhlIEhvc3QgY2FuIGRvIGEgbmljZSBvcHRpbWl6YXRpb24gaWYgaXQga25vd3MgdGhhdCB0aGUKKwkJICoga2VybmVsIG1hcHBpbmdzIChhZGRyZXNzZXMgYWJvdmUgMHhDMDAwMDAwMCBvciB3aGF0ZXZlcgorCQkgKiBQQUdFX09GRlNFVCBpcyBzZXQgdG8pIGhhdmVuJ3QgY2hhbmdlZC4gIEJ1dCBMaW51eCBjYWxscworCQkgKiBmbHVzaF90bGJfdXNlcigpIGZvciBib3RoIHVzZXIgYW5kIGtlcm5lbCBtYXBwaW5ncyB1bmxlc3MKKwkJICogdGhlIFBhZ2UgR2xvYmFsIEVuYWJsZSAoUEdFKSBmZWF0dXJlIGJpdCBpcyBzZXQuICovCiAJCSplZHggfD0gMHgwMDAwMjAwMDsKIAkJYnJlYWs7CiAJY2FzZSAweDgwMDAwMDAwOgogCQkvKiBGdXR1cmVwcm9vZiB0aGlzIGEgbGl0dGxlOiBpZiB0aGV5IGFzayBob3cgbXVjaCBleHRlbmRlZAotCQkgKiBwcm9jZXNzb3IgaW5mb3JtYXRpb24sIGxpbWl0IGl0IHRvIGtub3duIGZpZWxkcy4gKi8KKwkJICogcHJvY2Vzc29yIGluZm9ybWF0aW9uIHRoZXJlIGlzLCBsaW1pdCBpdCB0byBrbm93biBmaWVsZHMuICovCiAJCWlmICgqZWF4ID4gMHg4MDAwMDAwOCkKIAkJCSplYXggPSAweDgwMDAwMDA4OwogCQlicmVhazsKIAl9CiB9CiAKKy8qIEludGVsIGhhcyBmb3VyIGNvbnRyb2wgcmVnaXN0ZXJzLCBpbWFnaW5hdGl2ZWx5IG5hbWVkIGNyMCwgY3IyLCBjcjMgYW5kIGNyNC4KKyAqIEkgYXNzdW1lIHRoZXJlJ3MgYSBjcjEsIGJ1dCBpdCBoYXNuJ3QgYm90aGVyZWQgdXMgeWV0LCBzbyB3ZSdsbCBub3QgYm90aGVyCisgKiBpdC4gIFRoZSBIb3N0IG5lZWRzIHRvIGtub3cgd2hlbiB0aGUgR3Vlc3Qgd2FudHMgdG8gY2hhbmdlIHRoZW0sIHNvIHdlIGhhdmUKKyAqIGEgd2hvbGUgc2VyaWVzIG9mIGZ1bmN0aW9ucyBsaWtlIHJlYWRfY3IwKCkgYW5kIHdyaXRlX2NyMCgpLgorICoKKyAqIFdlIHN0YXJ0IHdpdGggQ1IwLiAgQ1IwIGFsbG93cyB5b3UgdG8gdHVybiBvbiBhbmQgb2ZmIGFsbCBraW5kcyBvZiBiYXNpYworICogZmVhdHVyZXMsIGJ1dCBMaW51eCBvbmx5IHJlYWxseSBjYXJlcyBhYm91dCBvbmU6IHRoZSBob3JyaWZpY2FsbHktbmFtZWQgVGFzaworICogU3dpdGNoZWQgKFRTKSBiaXQgYXQgYml0IDMgKGllLiA4KQorICoKKyAqIFdoYXQgZG9lcyB0aGUgVFMgYml0IGRvPyAgV2VsbCwgaXQgY2F1c2VzIHRoZSBDUFUgdG8gdHJhcCAoaW50ZXJydXB0IDcpIGlmCisgKiB0aGUgZmxvYXRpbmcgcG9pbnQgdW5pdCBpcyB1c2VkLiAgV2hpY2ggYWxsb3dzIHVzIHRvIHJlc3RvcmUgRlBVIHN0YXRlCisgKiBsYXppbHkgYWZ0ZXIgYSB0YXNrIHN3aXRjaCwgYW5kIExpbnV4IHVzZXMgdGhhdCBncmF0ZWZ1bGx5LCBidXQgd291bGRuJ3QgYQorICogbmFtZSBsaWtlICJGUFVUUkFQIGJpdCIgYmUgYSBsaXR0bGUgbGVzcyBjcnlwdGljPworICoKKyAqIFdlIHN0b3JlIGNyMCAoYW5kIGNyMykgbG9jYWxseSwgYmVjYXVzZSB0aGUgSG9zdCBuZXZlciBjaGFuZ2VzIGl0LiAgVGhlCisgKiBHdWVzdCBzb21ldGltZXMgd2FudHMgdG8gcmVhZCBpdCBhbmQgd2UnZCBwcmVmZXIgbm90IHRvIGJvdGhlciB0aGUgSG9zdAorICogdW5uZWNlc3NhcmlseS4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfY3IwLCBjdXJyZW50X2NyMzsKIHN0YXRpYyB2b2lkIGxndWVzdF93cml0ZV9jcjAodW5zaWduZWQgbG9uZyB2YWwpCiB7CisJLyogOCA9PSBUUyBiaXQuICovCiAJbGF6eV9oY2FsbChMSENBTExfVFMsIHZhbCAmIDgsIDAsIDApOwogCWN1cnJlbnRfY3IwID0gdmFsOwogfQpAQCAtMjM4LDE3ICs0MjgsMjUgQEAKIAlyZXR1cm4gY3VycmVudF9jcjA7CiB9CiAKKy8qIEludGVsIHByb3ZpZGVkIGEgc3BlY2lhbCBpbnN0cnVjdGlvbiB0byBjbGVhciB0aGUgVFMgYml0IGZvciBwZW9wbGUgdG9vIGNvb2wKKyAqIHRvIHVzZSB3cml0ZV9jcjAoKSB0byBkbyBpdC4gIFRoaXMgImNsdHMiIGluc3RydWN0aW9uIGlzIGZhc3RlciwgYmVjYXVzZSBhbGwKKyAqIHRoZSB2b3dlbHMgaGF2ZSBiZWVuIG9wdGltaXplZCBvdXQuICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3RfY2x0cyh2b2lkKQogewogCWxhenlfaGNhbGwoTEhDQUxMX1RTLCAwLCAwLCAwKTsKIAljdXJyZW50X2NyMCAmPSB+OFU7CiB9CiAKKy8qIENSMiBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsYXN0IHBhZ2UgZmF1bHQsIHdoaWNoIHRoZSBHdWVzdCBvbmx5IGV2ZXIKKyAqIHJlYWRzLiAgVGhlIEhvc3Qga2luZGx5IHdyaXRlcyB0aGlzIGludG8gb3VyICJzdHJ1Y3QgbGd1ZXN0X2RhdGEiLCBzbyB3ZQorICoganVzdCByZWFkIGl0IG91dCBvZiB0aGVyZS4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxndWVzdF9yZWFkX2NyMih2b2lkKQogewogCXJldHVybiBsZ3Vlc3RfZGF0YS5jcjI7CiB9CiAKKy8qIENSMyBpcyB0aGUgY3VycmVudCB0b3BsZXZlbCBwYWdldGFibGUgcGFnZTogdGhlIHByaW5jaXBsZSBpcyB0aGUgc2FtZSBhcworICogY3IwLiAgS2VlcCBhIGxvY2FsIGNvcHksIGFuZCB0ZWxsIHRoZSBIb3N0IHdoZW4gaXQgY2hhbmdlcy4gKi8KIHN0YXRpYyB2b2lkIGxndWVzdF93cml0ZV9jcjModW5zaWduZWQgbG9uZyBjcjMpCiB7CiAJbGF6eV9oY2FsbChMSENBTExfTkVXX1BHVEFCTEUsIGNyMywgMCwgMCk7CkBAIC0yNjAsNyArNDU4LDcgQEAKIAlyZXR1cm4gY3VycmVudF9jcjM7CiB9CiAKLS8qIFVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgUEdFLCBidXQgd2UgZG9uJ3QgY2FyZS4gKi8KKy8qIENSNCBpcyB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBQR0UsIGJ1dCB3ZSBkb24ndCBjYXJlLiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGd1ZXN0X3JlYWRfY3I0KHZvaWQpCiB7CiAJcmV0dXJuIDA7CkBAIC0yNzAsNiArNDY4LDU5IEBACiB7CiB9CiAKKy8qCisgKiBQYWdlIFRhYmxlIEhhbmRsaW5nLgorICoKKyAqIE5vdyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byB0YWtlIGEgcmVzdCBhbmQgZ3JhYiBhIGNvZmZlZSBvciBzaW1pbGFybHkKKyAqIHJlbGF4aW5nIHN0aW11bGFudC4gIFRoZSBlYXN5IHBhcnRzIGFyZSBiZWhpbmQgdXMsIGFuZCB0aGUgdHJlayBncmFkdWFsbHkKKyAqIHdpbmRzIHVwaGlsbCBmcm9tIGhlcmUuCisgKgorICogUXVpY2sgcmVmcmVzaGVyOiBtZW1vcnkgaXMgZGl2aWRlZCBpbnRvICJwYWdlcyIgb2YgNDA5NiBieXRlcyBlYWNoLiAgVGhlIENQVQorICogbWFwcyB2aXJ0dWFsIGFkZHJlc3NlcyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgdXNpbmcgInBhZ2UgdGFibGVzIi4gIFdlIGNvdWxkCisgKiB1c2Ugb25lIGh1Z2UgaW5kZXggb2YgMSBtaWxsaW9uIGVudHJpZXM6IGVhY2ggYWRkcmVzcyBpcyA0IGJ5dGVzLCBzbyB0aGF0J3MKKyAqIDEwMjQgcGFnZXMganVzdCB0byBob2xkIHRoZSBwYWdlIHRhYmxlcy4gICBCdXQgc2luY2UgbW9zdCB2aXJ0dWFsIGFkZHJlc3NlcworICogYXJlIHVudXNlZCwgd2UgdXNlIGEgdHdvIGxldmVsIGluZGV4IHdoaWNoIHNhdmVzIHNwYWNlLiAgVGhlIENSMyByZWdpc3RlcgorICogY29udGFpbnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHRvcCBsZXZlbCAicGFnZSBkaXJlY3RvcnkiIHBhZ2UsIHdoaWNoCisgKiBjb250YWlucyBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgdXAgdG8gMTAyNCBzZWNvbmQtbGV2ZWwgcGFnZXMuICBFYWNoIG9mIHRoZXNlCisgKiBzZWNvbmQgbGV2ZWwgcGFnZXMgY29udGFpbnMgdXAgdG8gMTAyNCBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgYWN0dWFsIHBhZ2VzLAorICogb3IgUGFnZSBUYWJsZSBFbnRyaWVzIChQVEVzKS4KKyAqCisgKiBIZXJlJ3MgYSBkaWFncmFtLCB3aGVyZSBhcnJvd3MgaW5kaWNhdGUgcGh5c2ljYWwgYWRkcmVzc2VzOgorICoKKyAqIENSMyAtLS0+ICstLS0tLS0tLS0rCisgKgkgICAgfCAgCSAgIC0tLS0tLS0tLT4rLS0tLS0tLS0tKworICoJICAgIHwJICAgICAgfAkgICAgIHwgUEFERFIxICB8CisgKgkgIFRvcC1sZXZlbCAgIHwJICAgICB8IFBBRERSMiAgfAorICoJICAoUE1EKSBwYWdlICB8CSAgICAgfCAJICAgICAgIHwKKyAqCSAgICB8CSAgICAgIHwJICAgTG93ZXItbGV2ZWwgfAorICoJICAgIHwJICAgICAgfAkgICAoUFRFKSBwYWdlICB8CisgKgkgICAgfAkgICAgICB8CSAgICAgfAkgICAgICAgfAorICoJICAgICAgLi4uLiAgICAJICAgICAJIC4uLi4KKyAqCisgKiBTbyB0byBjb252ZXJ0IGEgdmlydHVhbCBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcywgd2UgbG9vayB1cCB0aGUgdG9wCisgKiBsZXZlbCwgd2hpY2ggcG9pbnRzIHVzIHRvIHRoZSBzZWNvbmQgbGV2ZWwsIHdoaWNoIGdpdmVzIHVzIHRoZSBwaHlzaWNhbAorICogYWRkcmVzcyBvZiB0aGF0IHBhZ2UuICBJZiB0aGUgdG9wIGxldmVsIGVudHJ5IHdhcyBub3QgcHJlc2VudCwgb3IgdGhlIHNlY29uZAorICogbGV2ZWwgZW50cnkgd2FzIG5vdCBwcmVzZW50LCB0aGVuIHRoZSB2aXJ0dWFsIGFkZHJlc3MgaXMgaW52YWxpZCAod2UKKyAqIHNheSAidGhlIHBhZ2Ugd2FzIG5vdCBtYXBwZWQiKS4KKyAqCisgKiBQdXQgYW5vdGhlciB3YXksIGEgMzItYml0IHZpcnR1YWwgYWRkcmVzcyBpcyBkaXZpZGVkIHVwIGxpa2Ugc286CisgKgorICogIDEgMSAwIDAgMCAwIDAgMCAwIDAgMCAxIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAorICogfDwtLS0tIDEwIGJpdHMgLS0tLT58PC0tLS0gMTAgYml0cyAtLS0tPnw8LS0tLS0tIDEyIGJpdHMgLS0tLS0tPnwKKyAqICAgIEluZGV4IGludG8gdG9wICAgICBJbmRleCBpbnRvIHNlY29uZCAgICAgIE9mZnNldCB3aXRoaW4gcGFnZQorICogIHBhZ2UgZGlyZWN0b3J5IHBhZ2UgICAgcGFnZXRhYmxlIHBhZ2UKKyAqCisgKiBUaGUga2VybmVsIHNwZW5kcyBhIGxvdCBvZiB0aW1lIGNoYW5naW5nIGJvdGggdGhlIHRvcC1sZXZlbCBwYWdlIGRpcmVjdG9yeQorICogYW5kIGxvd2VyLWxldmVsIHBhZ2V0YWJsZSBwYWdlcy4gIFRoZSBHdWVzdCBkb2Vzbid0IGtub3cgcGh5c2ljYWwgYWRkcmVzc2VzLAorICogc28gd2hpbGUgaXQgbWFpbnRhaW5zIHRoZXNlIHBhZ2UgdGFibGVzIGV4YWN0bHkgbGlrZSBub3JtYWwsIGl0IGFsc28gbmVlZHMKKyAqIHRvIGtlZXAgdGhlIEhvc3QgaW5mb3JtZWQgd2hlbmV2ZXIgaXQgbWFrZXMgYSBjaGFuZ2U6IHRoZSBIb3N0IHdpbGwgY3JlYXRlCisgKiB0aGUgcmVhbCBwYWdlIHRhYmxlcyBiYXNlZCBvbiB0aGUgR3Vlc3RzJy4KKyAqLworCisvKiBUaGUgR3Vlc3QgY2FsbHMgdGhpcyB0byBzZXQgYSBzZWNvbmQtbGV2ZWwgZW50cnkgKHB0ZSksIGllLiB0byBtYXAgYSBwYWdlCisgKiBpbnRvIGEgcHJvY2VzcycgYWRkcmVzcyBzcGFjZS4gIFdlIHNldCB0aGUgZW50cnkgdGhlbiB0ZWxsIHRoZSBIb3N0IHRoZQorICogdG9wbGV2ZWwgYW5kIGFkZHJlc3MgdGhpcyBjb3JyZXNwb25kcyB0by4gIFRoZSBHdWVzdCB1c2VzIG9uZSBwYWdldGFibGUgcGVyCisgKiBwcm9jZXNzLCBzbyB3ZSBuZWVkIHRvIHRlbGwgdGhlIEhvc3Qgd2hpY2ggb25lIHdlJ3JlIGNoYW5naW5nIChtbS0+cGdkKS4gKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9zZXRfcHRlX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQogewpAQCAtMjc3LDcgKzUyOCw5IEBACiAJbGF6eV9oY2FsbChMSENBTExfU0VUX1BURSwgX19wYShtbS0+cGdkKSwgYWRkciwgcHRldmFsLnB0ZV9sb3cpOwogfQogCi0vKiBXZSBvbmx5IHN1cHBvcnQgdHdvLWxldmVsIHBhZ2V0YWJsZXMgYXQgdGhlIG1vbWVudC4gKi8KKy8qIFRoZSBHdWVzdCBjYWxscyB0aGlzIHRvIHNldCBhIHRvcC1sZXZlbCBlbnRyeS4gIEFnYWluLCB3ZSBzZXQgdGhlIGVudHJ5IHRoZW4KKyAqIHRlbGwgdGhlIEhvc3Qgd2hpY2ggdG9wLWxldmVsIHBhZ2Ugd2UgY2hhbmdlZCwgYW5kIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgd2UKKyAqIGNoYW5nZWQuICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3Rfc2V0X3BtZChwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKQogewogCSpwbWRwID0gcG1kdmFsOwpAQCAtMjg1LDcgKzUzOCwxNSBAQAogCQkgICAoX19wYShwbWRwKSYoUEFHRV9TSVpFLTEpKS80LCAwKTsKIH0KIAotLyogRklYTUU6IEVsaW1pbmF0ZSBhbGwgY2FsbGVycyBvZiB0aGlzLiAqLworLyogVGhlcmUgYXJlIGEgY291cGxlIG9mIGxlZ2FjeSBwbGFjZXMgd2hlcmUgdGhlIGtlcm5lbCBzZXRzIGEgUFRFLCBidXQgd2UKKyAqIGRvbid0IGtub3cgdGhlIHRvcCBsZXZlbCBhbnkgbW9yZS4gIFRoaXMgaXMgdXNlbGVzcyBmb3IgdXMsIHNpbmNlIHdlIGRvbid0CisgKiBrbm93IHdoaWNoIHBhZ2V0YWJsZSBpcyBjaGFuZ2luZyBvciB3aGF0IGFkZHJlc3MsIHNvIHdlIGp1c3QgdGVsbCB0aGUgSG9zdAorICogdG8gZm9yZ2V0IGFsbCBvZiB0aGVtLiAgRm9ydHVuYXRlbHksIHRoaXMgaXMgdmVyeSByYXJlLgorICoKKyAqIC4uLiBleGNlcHQgaW4gZWFybHkgYm9vdCB3aGVuIHRoZSBrZXJuZWwgc2V0cyB1cCB0aGUgaW5pdGlhbCBwYWdldGFibGVzLAorICogd2hpY2ggbWFrZXMgYm9vdGluZyBhc3RvbmlzaGluZ2x5IHNsb3cuICBTbyB3ZSBkb24ndCBldmVuIHRlbGwgdGhlIEhvc3QKKyAqIGFueXRoaW5nIGNoYW5nZWQgdW50aWwgd2UndmUgZG9uZSB0aGUgZmlyc3QgcGFnZSB0YWJsZSBzd2l0Y2guCisgKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9zZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCiB7CiAJKnB0ZXAgPSBwdGV2YWw7CkBAIC0yOTQsMjIgKzU1NSw1MSBAQAogCQlsYXp5X2hjYWxsKExIQ0FMTF9GTFVTSF9UTEIsIDEsIDAsIDApOwogfQogCisvKiBVbmZvcnR1bmF0ZWx5IGZvciBMZ3Vlc3QsIHRoZSBwYXJhdmlydF9vcHMgZm9yIHBhZ2UgdGFibGVzIHdlcmUgYmFzZWQgb24KKyAqIG5hdGl2ZSBwYWdlIHRhYmxlIG9wZXJhdGlvbnMuICBPbiBuYXRpdmUgaGFyZHdhcmUgeW91IGNhbiBzZXQgYSBuZXcgcGFnZQorICogdGFibGUgZW50cnkgd2hlbmV2ZXIgeW91IHdhbnQsIGJ1dCBpZiB5b3Ugd2FudCB0byByZW1vdmUgb25lIHlvdSBoYXZlIHRvIGRvCisgKiBhIFRMQiBmbHVzaCAoYSBUTEIgaXMgYSBsaXR0bGUgY2FjaGUgb2YgcGFnZSB0YWJsZSBlbnRyaWVzIGtlcHQgYnkgdGhlIENQVSkuCisgKgorICogU28gdGhlIGxndWVzdF9zZXRfcHRlX2F0KCkgYW5kIGxndWVzdF9zZXRfcG1kKCkgZnVuY3Rpb25zIGFib3ZlIGFyZSBvbmx5CisgKiBjYWxsZWQgd2hlbiBhIHZhbGlkIGVudHJ5IGlzIHdyaXR0ZW4sIG5vdCB3aGVuIGl0J3MgcmVtb3ZlZCAoaWUuIG1hcmtlZCBub3QKKyAqIHByZXNlbnQpLiAgSW5zdGVhZCwgdGhpcyBpcyB3aGVyZSB3ZSBjb21lIHdoZW4gdGhlIEd1ZXN0IHdhbnRzIHRvIHJlbW92ZSBhCisgKiBwYWdlIHRhYmxlIGVudHJ5OiB3ZSB0ZWxsIHRoZSBIb3N0IHRvIHNldCB0aGF0IGVudHJ5IHRvIDAgKGllLiB0aGUgcHJlc2VudAorICogYml0IGlzIHplcm8pLiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X2ZsdXNoX3RsYl9zaW5nbGUodW5zaWduZWQgbG9uZyBhZGRyKQogewotCS8qIFNpbXBseSBzZXQgaXQgdG8gemVybywgYW5kIGl0IHdpbGwgZmF1bHQgYmFjayBpbi4gKi8KKwkvKiBTaW1wbHkgc2V0IGl0IHRvIHplcm86IGlmIGl0IHdhcyBub3QsIGl0IHdpbGwgZmF1bHQgYmFjayBpbi4gKi8KIAlsYXp5X2hjYWxsKExIQ0FMTF9TRVRfUFRFLCBjdXJyZW50X2NyMywgYWRkciwgMCk7CiB9CiAKKy8qIFRoaXMgaXMgd2hhdCBoYXBwZW5zIGFmdGVyIHRoZSBHdWVzdCBoYXMgcmVtb3ZlZCBhIGxhcmdlIG51bWJlciBvZiBlbnRyaWVzLgorICogVGhpcyB0ZWxscyB0aGUgSG9zdCB0aGF0IGFueSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIGZvciB1c2Vyc3BhY2UgbWlnaHQKKyAqIGhhdmUgY2hhbmdlZCwgaWUuIHZpcnR1YWwgYWRkcmVzc2VzIGJlbG93IFBBR0VfT0ZGU0VULiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X2ZsdXNoX3RsYl91c2VyKHZvaWQpCiB7CiAJbGF6eV9oY2FsbChMSENBTExfRkxVU0hfVExCLCAwLCAwLCAwKTsKIH0KIAorLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUga2VybmVsIHBhZ2UgdGFibGVzIGhhdmUgY2hhbmdlZC4gIFRoYXQncyBub3QgdmVyeQorICogY29tbW9uICh1bmxlc3MgdGhlIEd1ZXN0IGlzIHVzaW5nIGhpZ2htZW0sIHdoaWNoIG1ha2VzIHRoZSBHdWVzdCBleHRyZW1lbHkKKyAqIHNsb3cpLCBzbyBpdCdzIHdvcnRoIHNlcGFyYXRpbmcgdGhpcyBmcm9tIHRoZSB1c2VyIGZsdXNoaW5nIGFib3ZlLiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X2ZsdXNoX3RsYl9rZXJuZWwodm9pZCkKIHsKIAlsYXp5X2hjYWxsKExIQ0FMTF9GTFVTSF9UTEIsIDEsIDAsIDApOwogfQogCisvKgorICogVGhlIFVuYWR2YW5jZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyLgorICoKKyAqIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBpbXBsZW1lbnQgdGhlIHNpbXBsZXN0IHBvc3NpYmxlIGludGVycnVwdCBjb250cm9sbGVyLgorICogSSBzcGVudCBzb21lIHRpbWUgbG9va2luZyB0aG91Z2ggcm91dGluZXMgbGlrZSBzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIsCisgKiBzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZSwgc2V0X2lycV9jaGlwX2RhdGEgYW5kIHNldF9waGFzZXJzX3RvX3N0dW4gYW5kCisgKiBJICp0aGluayogdGhpcyBpcyBhcyBzaW1wbGUgYXMgaXQgZ2V0cy4KKyAqCisgKiBXZSBjYW4gdGVsbCB0aGUgSG9zdCB3aGF0IGludGVycnVwdHMgd2Ugd2FudCBibG9ja2VkIHJlYWR5IGZvciB1c2luZyB0aGUKKyAqIGxndWVzdF9kYXRhLmludGVycnVwdHMgYml0bWFwLCBzbyBkaXNhYmxpbmcgKGFrYSAibWFza2luZyIpIHRoZW0gaXMgYXMKKyAqIHNpbXBsZSBhcyBzZXR0aW5nIGEgYml0LiAgV2UgZG9uJ3QgYWN0dWFsbHkgImFjayIgaW50ZXJydXB0cyBhcyBzdWNoLCB3ZQorICoganVzdCBtYXNrIGFuZCB1bm1hc2sgdGhlbS4gIEkgd29uZGVyIGlmIHdlIHNob3VsZCBiZSBjbGV2ZXJlcj8KKyAqLwogc3RhdGljIHZvaWQgZGlzYWJsZV9sZ3Vlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc2V0X2JpdChpcnEsIGxndWVzdF9kYXRhLmJsb2NrZWRfaW50ZXJydXB0cyk7CkBAIC0zMTgsOSArNjA4LDkgQEAKIHN0YXRpYyB2b2lkIGVuYWJsZV9sZ3Vlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJY2xlYXJfYml0KGlycSwgbGd1ZXN0X2RhdGEuYmxvY2tlZF9pbnRlcnJ1cHRzKTsKLQkvKiBGSVhNRTogSWYgaXQncyBwZW5kaW5nPyAqLwogfQogCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGxndWVzdCBJUlEgY29udHJvbGxlci4gKi8KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbGd1ZXN0X2lycV9jb250cm9sbGVyID0gewogCS5uYW1lCQk9ICJsZ3Vlc3QiLAogCS5tYXNrCQk9IGRpc2FibGVfbGd1ZXN0X2lycSwKQEAgLTMyOCw2ICs2MTgsMTAgQEAKIAkudW5tYXNrCQk9IGVuYWJsZV9sZ3Vlc3RfaXJxLAogfTsKIAorLyogVGhpcyBzZXRzIHVwIHRoZSBJbnRlcnJ1cHQgRGVzY3JpcHRvciBUYWJsZSAoSURUKSBlbnRyeSBmb3IgZWFjaCBoYXJkd2FyZQorICogaW50ZXJydXB0IChleGNlcHQgMTI4LCB3aGljaCBpcyB1c2VkIGZvciBzeXN0ZW0gY2FsbHMpLCBhbmQgdGhlbiB0ZWxscyB0aGUKKyAqIExpbnV4IGluZnJhc3RydWN0dXJlIHRoYXQgZWFjaCBpbnRlcnJ1cHQgaXMgY29udHJvbGxlZCBieSBvdXIgbGV2ZWwtYmFzZWQKKyAqIGxndWVzdCBpbnRlcnJ1cHQgY29udHJvbGxlci4gKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBsZ3Vlc3RfaW5pdF9JUlEodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTM0MCwyMCArNjM0LDUxIEBACiAJCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAJCX0KIAl9CisJLyogVGhpcyBjYWxsIGlzIHJlcXVpcmVkIHRvIHNldCB1cCBmb3IgNGsgc3RhY2tzLCB3aGVyZSB3ZSBoYXZlCisJICogc2VwYXJhdGUgc3RhY2tzIGZvciBoYXJkIGFuZCBzb2Z0IGludGVycnVwdHMuICovCiAJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CiB9CiAKKy8qCisgKiBUaW1lLgorICoKKyAqIEl0IHdvdWxkIGJlIGZhciBiZXR0ZXIgZm9yIGV2ZXJ5b25lIGlmIHRoZSBHdWVzdCBoYWQgaXRzIG93biBjbG9jaywgYnV0CisgKiB1bnRpbCB0aGVuIHRoZSBIb3N0IGdpdmVzIHVzIHRoZSB0aW1lIG9uIGV2ZXJ5IGludGVycnVwdC4KKyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGd1ZXN0X2dldF93YWxsY2xvY2sodm9pZCkKIHsKLQlyZXR1cm4gaGNhbGwoTEhDQUxMX0dFVF9XQUxMQ0xPQ0ssIDAsIDAsIDApOworCXJldHVybiBsZ3Vlc3RfZGF0YS50aW1lLnR2X3NlYzsKIH0KIAogc3RhdGljIGN5Y2xlX3QgbGd1ZXN0X2Nsb2NrX3JlYWQodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIHNlYywgbnNlYzsKKworCS8qIElmIHRoZSBIb3N0IHRlbGxzIHRoZSBUU0Mgc3BlZWQsIHdlIGNhbiB0cnVzdCB0aGF0LiAqLwogCWlmIChsZ3Vlc3RfZGF0YS50c2Nfa2h6KQogCQlyZXR1cm4gbmF0aXZlX3JlYWRfdHNjKCk7Ci0JZWxzZQotCQlyZXR1cm4gamlmZmllczsKKworCS8qIElmIHdlIGNhbid0IHVzZSB0aGUgVFNDLCB3ZSByZWFkIHRoZSB0aW1lIHZhbHVlIHdyaXR0ZW4gYnkgdGhlIEhvc3QuCisJICogU2luY2UgaXQncyBpbiB0d28gcGFydHMgKHNlY29uZHMgYW5kIG5hbm9zZWNvbmRzKSwgd2UgcmlzayByZWFkaW5nCisJICogaXQganVzdCBhcyBpdCdzIGNoYW5naW5nIGZyb20gOTkgJiAwLjk5OTk5OTk5OSB0byAxMDAgYW5kIDAsIGFuZAorCSAqIGdldHRpbmcgOTkgYW5kIDAuICBBcyBMaW51eCB0ZW5kcyB0byBjb21lIGFwYXJ0IHVuZGVyIHRoZSBzdHJlc3Mgb2YKKwkgKiB0aW1lIHRyYXZlbCwgd2UgbXVzdCBiZSBjYXJlZnVsOiAqLworCWRvIHsKKwkJLyogRmlyc3Qgd2UgcmVhZCB0aGUgc2Vjb25kcyBwYXJ0LiAqLworCQlzZWMgPSBsZ3Vlc3RfZGF0YS50aW1lLnR2X3NlYzsKKwkJLyogVGhpcyByZWFkIG1lbW9yeSBiYXJyaWVyIHRlbGxzIHRoZSBjb21waWxlciBhbmQgdGhlIENQVSB0aGF0CisJCSAqIHRoaXMgY2FuJ3QgYmUgcmVvcmRlcmVkOiB3ZSBoYXZlIHRvIGNvbXBsZXRlIHRoZSBhYm92ZQorCQkgKiBiZWZvcmUgZ29pbmcgb24uICovCisJCXJtYigpOworCQkvKiBOb3cgd2UgcmVhZCB0aGUgbmFub3NlY29uZHMgcGFydC4gKi8KKwkJbnNlYyA9IGxndWVzdF9kYXRhLnRpbWUudHZfbnNlYzsKKwkJLyogTWFrZSBzdXJlIHdlJ3ZlIGRvbmUgdGhhdC4gKi8KKwkJcm1iKCk7CisJCS8qIE5vdyBpZiB0aGUgc2Vjb25kcyBwYXJ0IGhhcyBjaGFuZ2VkLCB0cnkgYWdhaW4uICovCisJfSB3aGlsZSAodW5saWtlbHkobGd1ZXN0X2RhdGEudGltZS50dl9zZWMgIT0gc2VjKSk7CisKKwkvKiBPdXIgbm9uLVRTQyBjbG9jayBpcyBpbiByZWFsIG5hbm9zZWNvbmRzLiAqLworCXJldHVybiBzZWMqMTAwMDAwMDAwMFVMTCArIG5zZWM7CiB9CiAKIC8qIFRoaXMgaXMgd2hhdCB3ZSB0ZWxsIHRoZSBrZXJuZWwgaXMgb3VyIGNsb2Nrc291cmNlLiAgKi8KQEAgLTM2MSw4ICs2ODYsMTEgQEAKIAkubmFtZQkJPSAibGd1ZXN0IiwKIAkucmF0aW5nCQk9IDQwMCwKIAkucmVhZAkJPSBsZ3Vlc3RfY2xvY2tfcmVhZCwKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKKwkubXVsdAkJPSAxLAogfTsKIAorLyogVGhlICJzY2hlZHVsZXIgY2xvY2siIGlzIGp1c3Qgb3VyIHJlYWwgY2xvY2ssIGFkanVzdGVkIHRvIHN0YXJ0IGF0IHplcm8gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbGd1ZXN0X3NjaGVkX2Nsb2NrKHZvaWQpCiB7CiAJcmV0dXJuIGN5YzJucygmbGd1ZXN0X2Nsb2NrLCBsZ3Vlc3RfY2xvY2tfcmVhZCgpIC0gY2xvY2tfYmFzZSk7CkBAIC00MjgsMzQgKzc1Niw1NSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorLyogQXQgc29tZSBwb2ludCBpbiB0aGUgYm9vdCBwcm9jZXNzLCB3ZSBnZXQgYXNrZWQgdG8gc2V0IHVwIG91ciB0aW1pbmcKKyAqIGluZnJhc3RydWN0dXJlLiAgVGhlIGtlcm5lbCBkb2Vzbid0IGV4cGVjdCB0aW1lciBpbnRlcnJ1cHRzIGJlZm9yZSB0aGlzLCBidXQKKyAqIHdlIGNsZXZlcmx5IGluaXRpYWxpemVkIHRoZSAiYmxvY2tlZF9pbnRlcnJ1cHRzIiBmaWVsZCBvZiAic3RydWN0CisgKiBsZ3Vlc3RfZGF0YSIgc28gdGhhdCB0aW1lciBpbnRlcnJ1cHRzIHdlcmUgYmxvY2tlZCB1bnRpbCBub3cuICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3RfdGltZV9pbml0KHZvaWQpCiB7CisJLyogU2V0IHVwIHRoZSB0aW1lciBpbnRlcnJ1cHQgKDApIHRvIGdvIHRvIG91ciBzaW1wbGUgdGltZXIgcm91dGluZSAqLwogCXNldF9pcnFfaGFuZGxlcigwLCBsZ3Vlc3RfdGltZV9pcnEpOwogCi0JLyogV2UgdXNlIHRoZSBUU0MgaWYgdGhlIEhvc3QgdGVsbHMgdXMgd2UgY2FuLCBvdGhlcndpc2UgYSBkdW1iCi0JICogamlmZmllcy1iYXNlZCBjbG9jay4gKi8KKwkvKiBPdXIgY2xvY2sgc3RydWN0dXJlIGxvb2sgbGlrZSBhcmNoL2kzODYva2VybmVsL3RzYy5jIGlmIHdlIGNhbiB1c2UKKwkgKiB0aGUgVFNDLCBvdGhlcndpc2UgaXQncyBhIGR1bWIgbmFub3NlY29uZC1yZXNvbHV0aW9uIGNsb2NrLiAgRWl0aGVyCisJICogd2F5LCB0aGUgInJhdGluZyIgaXMgaW5pdGlhbGl6ZWQgc28gaGlnaCB0aGF0IGl0J3MgYWx3YXlzIGNob3NlbgorCSAqIG92ZXIgYW55IG90aGVyIGNsb2Nrc291cmNlLiAqLwogCWlmIChsZ3Vlc3RfZGF0YS50c2Nfa2h6KSB7CiAJCWxndWVzdF9jbG9jay5zaGlmdCA9IDIyOwogCQlsZ3Vlc3RfY2xvY2subXVsdCA9IGNsb2Nrc291cmNlX2toejJtdWx0KGxndWVzdF9kYXRhLnRzY19raHosCiAJCQkJCQkJIGxndWVzdF9jbG9jay5zaGlmdCk7Ci0JCWxndWVzdF9jbG9jay5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCk7CiAJCWxndWVzdF9jbG9jay5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTOwotCX0gZWxzZSB7Ci0JCS8qIFRvIHVuZGVyc3RhbmQgdGhpcywgc3RhcnQgYXQga2VybmVsL3RpbWUvamlmZmllcy5jLi4uICovCi0JCWxndWVzdF9jbG9jay5zaGlmdCA9IDg7Ci0JCWxndWVzdF9jbG9jay5tdWx0ID0gKCgodTY0KU5TRUNfUEVSX1NFQzw8OCkvQUNUSFopIDw8IDg7Ci0JCWxndWVzdF9jbG9jay5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMik7CiAJfQogCWNsb2NrX2Jhc2UgPSBsZ3Vlc3RfY2xvY2tfcmVhZCgpOwogCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZsZ3Vlc3RfY2xvY2spOwogCi0JLyogV2UgY2FuJ3Qgc2V0IGNwdW1hc2sgaW4gdGhlIGluaXRpYWxpemVyOiBkYW1uIEMgbGltaXRhdGlvbnMhICovCisJLyogTm93IHdlJ3ZlIHNldCB1cCBvdXIgY2xvY2ssIHdlIGNhbiB1c2UgaXQgYXMgdGhlIHNjaGVkdWxlciBjbG9jayAqLworCXBhcmF2aXJ0X29wcy5zY2hlZF9jbG9jayA9IGxndWVzdF9zY2hlZF9jbG9jazsKKworCS8qIFdlIGNhbid0IHNldCBjcHVtYXNrIGluIHRoZSBpbml0aWFsaXplcjogZGFtbiBDIGxpbWl0YXRpb25zISAgU2V0IGl0CisJICogaGVyZSBhbmQgcmVnaXN0ZXIgb3VyIHRpbWVyIGRldmljZS4gKi8KIAlsZ3Vlc3RfY2xvY2tldmVudC5jcHVtYXNrID0gY3B1bWFza19vZl9jcHUoMCk7CiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZsZ3Vlc3RfY2xvY2tldmVudCk7CiAKKwkvKiBGaW5hbGx5LCB3ZSB1bmJsb2NrIHRoZSB0aW1lciBpbnRlcnJ1cHQuICovCiAJZW5hYmxlX2xndWVzdF9pcnEoMCk7CiB9CiAKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGJpdHMgYW5kIHBpZWNlcy4KKyAqCisgKiBIZXJlIGlzIGFuIG9kZGJhbGwgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgd2hpY2ggdGhlIEd1ZXN0IG5lZWRzIGZvciB0aGluZ3MKKyAqIHRvIHdvcmsuICBUaGV5J3JlIHByZXR0eSBzaW1wbGUuCisgKi8KKworLyogVGhlIEd1ZXN0IG5lZWRzIHRvIHRlbGwgdGhlIGhvc3Qgd2hhdCBzdGFjayBpdCBleHBlY3RzIHRyYXBzIHRvIHVzZS4gIEZvcgorICogbmF0aXZlIGhhcmR3YXJlLCB0aGlzIGlzIHBhcnQgb2YgdGhlIFRhc2sgU3RhdGUgU2VnbWVudCBtZW50aW9uZWQgYWJvdmUgaW4KKyAqIGxndWVzdF9sb2FkX3RyX2Rlc2MoKSwgYnV0IHRvIGhlbHAgaHlwZXJ2aXNvcnMgdGhlcmUncyB0aGlzIHNwZWNpYWwgY2FsbC4KKyAqCisgKiBXZSB0ZWxsIHRoZSBIb3N0IHRoZSBzZWdtZW50IHdlIHdhbnQgdG8gdXNlIChfX0tFUk5FTF9EUyBpcyB0aGUga2VybmVsIGRhdGEKKyAqIHNlZ21lbnQpLCB0aGUgcHJpdmlsZWdlIGxldmVsICh3ZSdyZSBwcml2aWxlZ2UgbGV2ZWwgMSwgdGhlIEhvc3QgaXMgMCBhbmQKKyAqIHdpbGwgbm90IHRvbGVyYXRlIHVzIHRyeWluZyB0byB1c2UgdGhhdCksIHRoZSBzdGFjayBwb2ludGVyLCBhbmQgdGhlIG51bWJlcgorICogb2YgcGFnZXMgaW4gdGhlIHN0YWNrLiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X2xvYWRfZXNwMChzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzLAogCQkJCSAgICAgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkKIHsKQEAgLTQ2MywxNSArODEyLDMxIEBACiAJCSAgIFRIUkVBRF9TSVpFL1BBR0VfU0laRSk7CiB9CiAKKy8qIExldCdzIGp1c3Qgc2F5LCBJIHdvdWxkbid0IGRvIGRlYnVnZ2luZyB1bmRlciBhIEd1ZXN0LiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X3NldF9kZWJ1Z3JlZyhpbnQgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCiB7CiAJLyogRklYTUU6IEltcGxlbWVudCAqLwogfQogCisvKiBUaGVyZSBhcmUgdGltZXMgd2hlbiB0aGUga2VybmVsIHdhbnRzIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIG1lbW9yeSB3cml0ZXMgYXJlCisgKiBjYXVnaHQgaW4gdGhlIGNhY2hlICh0aGF0IHRoZXkndmUgYWxsIHJlYWNoZWQgcmVhbCBoYXJkd2FyZSBkZXZpY2VzKS4gIFRoaXMKKyAqIGRvZXNuJ3QgbWF0dGVyIGZvciB0aGUgR3Vlc3Qgd2hpY2ggaGFzIHZpcnR1YWwgaGFyZHdhcmUuCisgKgorICogT24gdGhlIFBlbnRpdW0gNCBhbmQgYWJvdmUsIGNwdWlkKCkgaW5kaWNhdGVzIHRoYXQgdGhlIENhY2hlIExpbmUgRmx1c2gKKyAqIChjbGZsdXNoKSBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIHRoZSBrZXJuZWwgdXNlcyB0aGF0LiAgT3RoZXJ3aXNlLCBpdAorICogdXNlcyB0aGUgb2xkZXIgIldyaXRlIEJhY2sgYW5kIEludmFsaWRhdGUgQ2FjaGUiICh3YmludmQpIGluc3RydWN0aW9uLgorICogVW5saWtlIGNsZmx1c2gsIHdiaW52ZCBjYW4gb25seSBiZSBydW4gYXQgcHJpdmlsZWdlIGxldmVsIDAuICBTbyB3ZSBjYW4KKyAqIGlnbm9yZSBjbGZsdXNoLCBidXQgcmVwbGFjZSB3YmludmQuCisgKi8KIHN0YXRpYyB2b2lkIGxndWVzdF93YmludmQodm9pZCkKIHsKIH0KIAorLyogSWYgdGhlIEd1ZXN0IGV4cGVjdHMgdG8gaGF2ZSBhbiBBZHZhbmNlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIsCisgKiB3ZSBwbGF5IGR1bWIgYnkgaWdub3Jpbmcgd3JpdGVzIGFuZCByZXR1cm5pbmcgMCBmb3IgcmVhZHMuICBTbyBpdCdzIG5vCisgKiBsb25nZXIgUHJvZ3JhbW1hYmxlIG5vciBDb250cm9sbGluZyBhbnl0aGluZywgYW5kIEkgZG9uJ3QgdGhpbmsgOCBsaW5lcyBvZgorICogY29kZSBxdWFsaWZpZXMgZm9yIEFkdmFuY2VkLiAgSXQgd2lsbCBhbHNvIG5ldmVyIGludGVycnVwdCBhbnl0aGluZy4gIEl0CisgKiBkb2VzLCBob3dldmVyLCBhbGxvdyB1cyB0byBnZXQgdGhyb3VnaCB0aGUgTGludXggYm9vdCBjb2RlLiAqLwogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogc3RhdGljIHZvaWQgbGd1ZXN0X2FwaWNfd3JpdGUodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGxvbmcgdikKIHsKQEAgLTQ4MywxOSArODQ4LDMyIEBACiB9CiAjZW5kaWYKIAorLyogU1RPUCEgIFVudGlsIGFuIGludGVycnVwdCBjb21lcyBpbi4gKi8KIHN0YXRpYyB2b2lkIGxndWVzdF9zYWZlX2hhbHQodm9pZCkKIHsKIAloY2FsbChMSENBTExfSEFMVCwgMCwgMCwgMCk7CiB9CiAKKy8qIFBlcmhhcHMgQ1JBU0ggaXNuJ3QgdGhlIGJlc3QgbmFtZSBmb3IgdGhpcyBoeXBlcmNhbGwsIGJ1dCB3ZSB1c2UgaXQgdG8gZ2V0IGEKKyAqIG1lc3NhZ2Ugb3V0IHdoZW4gd2UncmUgY3Jhc2hpbmcgYXMgd2VsbCBhcyBlbGVnYW50IHRlcm1pbmF0aW9uIGxpa2UgcG93ZXJpbmcKKyAqIG9mZi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIEhvc3QgYWx3YXlzIHByZWZlcnMgdGhhdCB0aGUgR3Vlc3Qgc3BlYWsgaW4gcGh5c2ljYWwgYWRkcmVzc2VzCisgKiByYXRoZXIgdGhhbiB2aXJ0dWFsIGFkZHJlc3Nlcywgc28gd2UgdXNlIF9fcGEoKSBoZXJlLiAqLwogc3RhdGljIHZvaWQgbGd1ZXN0X3Bvd2VyX29mZih2b2lkKQogewogCWhjYWxsKExIQ0FMTF9DUkFTSCwgX19wYSgiUG93ZXIgZG93biIpLCAwLCAwKTsKIH0KIAorLyoKKyAqIFBhbmljaW5nLgorICoKKyAqIERvbid0LiAgQnV0IGlmIHlvdSBkaWQsIHRoaXMgaXMgd2hhdCBoYXBwZW5zLgorICovCiBzdGF0aWMgaW50IGxndWVzdF9wYW5pYyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGwsIHZvaWQgKnApCiB7CiAJaGNhbGwoTEhDQUxMX0NSQVNILCBfX3BhKHApLCAwLCAwKTsKKwkvKiBUaGUgaGNhbGwgd29uJ3QgcmV0dXJuLCBidXQgdG8ga2VlcCBnY2MgaGFwcHksIHdlJ3JlICJkb25lIi4gKi8KIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKQEAgLTUwMywxNSArODgxLDQ1IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBsZ3Vlc3RfcGFuaWMKIH07CiAKKy8qIFNldHRpbmcgdXAgbWVtb3J5IGlzIGZhaXJseSBlYXN5LiAqLwogc3RhdGljIF9faW5pdCBjaGFyICpsZ3Vlc3RfbWVtb3J5X3NldHVwKHZvaWQpCiB7Ci0JLyogV2UgZG8gdGhpcyBoZXJlIGJlY2F1c2UgbG9ja2NoZWNrIGJhcmZzIGlmIGJlZm9yZSBzdGFydF9rZXJuZWwgKi8KKwkvKiBXZSBkbyB0aGlzIGhlcmUgYW5kIG5vdCBlYXJsaWVyIGJlY2F1c2UgbG9ja2NoZWNrIGJhcmZzIGlmIHdlIGRvIGl0CisJICogYmVmb3JlIHN0YXJ0X2tlcm5lbCgpICovCiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmcGFuaWNlZCk7CiAKKwkvKiBUaGUgTGludXggYm9vdGxvYWRlciBoZWFkZXIgY29udGFpbnMgYW4gImU4MjAiIG1lbW9yeSBtYXA6IHRoZQorCSAqIExhdW5jaGVyIHBvcHVsYXRlZCB0aGUgZmlyc3QgZW50cnkgd2l0aCBvdXIgbWVtb3J5IGxpbWl0LiAqLwogCWFkZF9tZW1vcnlfcmVnaW9uKEU4MjBfTUFQLT5hZGRyLCBFODIwX01BUC0+c2l6ZSwgRTgyMF9NQVAtPnR5cGUpOworCisJLyogVGhpcyBzdHJpbmcgaXMgZm9yIHRoZSBib290IG1lc3NhZ2VzLiAqLwogCXJldHVybiAiTEdVRVNUIjsKIH0KIAorLypHOjA1MAorICogUGF0Y2hpbmcgKFBvd2VyZnVsbHkgUGxhY2F0aW5nIFBlcmZvcm1hbmNlIFBlZGFudHMpCisgKgorICogV2UgaGF2ZSBhbHJlYWR5IHNlZW4gdGhhdCAic3RydWN0IHBhcmF2aXJ0X29wcyIgbGV0cyB1cyByZXBsYWNlIHNpbXBsZQorICogbmF0aXZlIGluc3RydWN0aW9ucyB3aXRoIGNhbGxzIHRvIHRoZSBhcHByb3ByaWF0ZSBiYWNrIGVuZCBhbGwgdGhyb3VnaG91dAorICogdGhlIGtlcm5lbC4gIFRoaXMgYWxsb3dzIHRoZSBzYW1lIGtlcm5lbCB0byBydW4gYXMgYSBHdWVzdCBhbmQgYXMgYSBuYXRpdmUKKyAqIGtlcm5lbCwgYnV0IGl0J3Mgc2xvdyBiZWNhdXNlIG9mIGFsbCB0aGUgaW5kaXJlY3QgYnJhbmNoZXMuCisgKgorICogUmVtZW1iZXIgdGhhdCBEYXZpZCBXaGVlbGVyIHF1b3RlIGFib3V0ICJBbnkgcHJvYmxlbSBpbiBjb21wdXRlciBzY2llbmNlIGNhbgorICogYmUgc29sdmVkIHdpdGggYW5vdGhlciBsYXllciBvZiBpbmRpcmVjdGlvbiI/ICBUaGUgcmVzdCBvZiB0aGF0IHF1b3RlIGlzCisgKiAiLi4uIEJ1dCB0aGF0IHVzdWFsbHkgd2lsbCBjcmVhdGUgYW5vdGhlciBwcm9ibGVtLiIgIFRoaXMgaXMgdGhlIGZpcnN0IG9mCisgKiB0aG9zZSBwcm9ibGVtcy4KKyAqCisgKiBPdXIgY3VycmVudCBzb2x1dGlvbiBpcyB0byBhbGxvdyB0aGUgcGFyYXZpcnQgYmFjayBlbmQgdG8gb3B0aW9uYWxseSBwYXRjaAorICogb3ZlciB0aGUgaW5kaXJlY3QgY2FsbHMgdG8gcmVwbGFjZSB0aGVtIHdpdGggc29tZXRoaW5nIG1vcmUgZWZmaWNpZW50LiAgV2UKKyAqIHBhdGNoIHRoZSBmb3VyIG1vc3QgY29tbW9ubHkgY2FsbGVkIGZ1bmN0aW9uczogZGlzYWJsZSBpbnRlcnJ1cHRzLCBlbmFibGUKKyAqIGludGVycnVwdHMsIHJlc3RvcmUgaW50ZXJydXB0cyBhbmQgc2F2ZSBpbnRlcnJ1cHRzLiAgV2UgdXN1YWxseSBoYXZlIDEwCisgKiBieXRlcyB0byBwYXRjaCBpbnRvOiB0aGUgR3Vlc3QgdmVyc2lvbnMgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgc21hbGwgZW5vdWdoCisgKiB0aGF0IHdlIGNhbiBmaXQgY29tZm9ydGFibHkuCisgKgorICogRmlyc3Qgd2UgbmVlZCBhc3NlbWJseSB0ZW1wbGF0ZXMgb2YgZWFjaCBvZiB0aGUgcGF0Y2hhYmxlIEd1ZXN0IG9wZXJhdGlvbnMsCisgKiBhbmQgdGhlc2UgYXJlIGluIGxndWVzdF9hc20uUy4gKi8KKworLypHOjA2MCBXZSBjb25zdHJ1Y3QgYSB0YWJsZSBmcm9tIHRoZSBhc3NlbWJsZXIgdGVtcGxhdGVzOiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBsZ3Vlc3RfaW5zbnMKIHsKIAljb25zdCBjaGFyICpzdGFydCwgKmVuZDsKQEAgLTUyMSwzNSArOTI5LDUyIEBACiAJW1BBUkFWSVJUX1BBVENIKHJlc3RvcmVfZmwpXSA9IHsgbGdzdGFydF9wb3BmLCBsZ2VuZF9wb3BmIH0sCiAJW1BBUkFWSVJUX1BBVENIKHNhdmVfZmwpXSA9IHsgbGdzdGFydF9wdXNoZiwgbGdlbmRfcHVzaGYgfSwKIH07CisKKy8qIE5vdyBvdXIgcGF0Y2ggcm91dGluZSBpcyBmYWlybHkgc2ltcGxlIChiYXNlZCBvbiB0aGUgbmF0aXZlIG9uZSBpbgorICogcGFyYXZpcnQuYykuICBJZiB3ZSBoYXZlIGEgcmVwbGFjZW1lbnQsIHdlIGNvcHkgaXQgaW4gYW5kIHJldHVybiBob3cgbXVjaCBvZgorICogdGhlIGF2YWlsYWJsZSBzcGFjZSB3ZSB1c2VkLiAqLwogc3RhdGljIHVuc2lnbmVkIGxndWVzdF9wYXRjaCh1OCB0eXBlLCB1MTYgY2xvYmJlciwgdm9pZCAqaW5zbnMsIHVuc2lnbmVkIGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgaW5zbl9sZW47CiAKLQkvKiBEb24ndCB0b3VjaCBpdCBpZiB3ZSBkb24ndCBoYXZlIGEgcmVwbGFjZW1lbnQgKi8KKwkvKiBEb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGlmIHdlIGRvbid0IGhhdmUgYSByZXBsYWNlbWVudCAqLwogCWlmICh0eXBlID49IEFSUkFZX1NJWkUobGd1ZXN0X2luc25zKSB8fCAhbGd1ZXN0X2luc25zW3R5cGVdLnN0YXJ0KQogCQlyZXR1cm4gcGFyYXZpcnRfcGF0Y2hfZGVmYXVsdCh0eXBlLCBjbG9iYmVyLCBpbnNucywgbGVuKTsKIAogCWluc25fbGVuID0gbGd1ZXN0X2luc25zW3R5cGVdLmVuZCAtIGxndWVzdF9pbnNuc1t0eXBlXS5zdGFydDsKIAotCS8qIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBmaXQgcmVwbGFjZW1lbnQuICovCisJLyogU2ltaWxhcmx5IGlmIHdlIGNhbid0IGZpdCByZXBsYWNlbWVudCAoc2hvdWxkbid0IGhhcHBlbiwgYnV0IGxldCdzCisJICogYmUgdGhvcm91Z2gpLiAqLwogCWlmIChsZW4gPCBpbnNuX2xlbikKIAkJcmV0dXJuIHBhcmF2aXJ0X3BhdGNoX2RlZmF1bHQodHlwZSwgY2xvYmJlciwgaW5zbnMsIGxlbik7CiAKKwkvKiBDb3B5IGluIG91ciBpbnN0cnVjdGlvbnMuICovCiAJbWVtY3B5KGluc25zLCBsZ3Vlc3RfaW5zbnNbdHlwZV0uc3RhcnQsIGluc25fbGVuKTsKIAlyZXR1cm4gaW5zbl9sZW47CiB9CiAKKy8qRzowMzAgT25jZSB3ZSBnZXQgdG8gbGd1ZXN0X2luaXQoKSwgd2Uga25vdyB3ZSdyZSBhIEd1ZXN0LiAgVGhlIHBhcmF2aXJ0X29wcworICogc3RydWN0dXJlIGluIHRoZSBrZXJuZWwgcHJvdmlkZXMgYSBzaW5nbGUgcG9pbnQgZm9yIChhbG1vc3QpIGV2ZXJ5IHJvdXRpbmUKKyAqIHdlIGhhdmUgdG8gb3ZlcnJpZGUgdG8gYXZvaWQgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbnMuICovCiBfX2luaXQgdm9pZCBsZ3Vlc3RfaW5pdCh2b2lkICpib290KQogewotCS8qIENvcHkgYm9vdCBwYXJhbWV0ZXJzIGZpcnN0LiAqLworCS8qIENvcHkgYm9vdCBwYXJhbWV0ZXJzIGZpcnN0OiB0aGUgTGF1bmNoZXIgcHV0IHRoZSBwaHlzaWNhbCBsb2NhdGlvbgorCSAqIGluICVlc2ksIGFuZCBoZWFkLlMgY29udmVydGVkIHRoYXQgdG8gYSB2aXJ0dWFsIGFkZHJlc3MgYW5kIGhhbmRlZAorCSAqIGl0IHRvIHVzLiAqLwogCW1lbWNweSgmYm9vdF9wYXJhbXMsIGJvb3QsIFBBUkFNX1NJWkUpOworCS8qIFRoZSBib290IHBhcmFtZXRlcnMgYWxzbyB0ZWxsIHVzIHdoZXJlIHRoZSBjb21tYW5kLWxpbmUgaXM6IHNhdmUKKwkgKiB0aGF0LCB0b28uICovCiAJbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCBfX3ZhKGJvb3RfcGFyYW1zLmhkci5jbWRfbGluZV9wdHIpLAogCSAgICAgICBDT01NQU5EX0xJTkVfU0laRSk7CiAKKwkvKiBXZSdyZSB1bmRlciBsZ3Vlc3QsIHBhcmF2aXJ0IGlzIGVuYWJsZWQsIGFuZCB3ZSdyZSBydW5uaW5nIGF0CisJICogcHJpdmlsZWdlIGxldmVsIDEsIG5vdCAwIGFzIG5vcm1hbC4gKi8KIAlwYXJhdmlydF9vcHMubmFtZSA9ICJsZ3Vlc3QiOwogCXBhcmF2aXJ0X29wcy5wYXJhdmlydF9lbmFibGVkID0gMTsKIAlwYXJhdmlydF9vcHMua2VybmVsX3JwbCA9IDE7CiAKKwkvKiBXZSBzZXQgdXAgYWxsIHRoZSBsZ3Vlc3Qgb3ZlcnJpZGVzIGZvciBzZW5zaXRpdmUgb3BlcmF0aW9ucy4gIFRoZXNlCisJICogYXJlIGRldGFpbGVkIHdpdGggdGhlIG9wZXJhdGlvbnMgdGhlbXNlbHZlcy4gKi8KIAlwYXJhdmlydF9vcHMuc2F2ZV9mbCA9IHNhdmVfZmw7CiAJcGFyYXZpcnRfb3BzLnJlc3RvcmVfZmwgPSByZXN0b3JlX2ZsOwogCXBhcmF2aXJ0X29wcy5pcnFfZGlzYWJsZSA9IGlycV9kaXNhYmxlOwpAQCAtNTkyLDIxICsxMDE3LDUwIEBACiAJcGFyYXZpcnRfb3BzLnRpbWVfaW5pdCA9IGxndWVzdF90aW1lX2luaXQ7CiAJcGFyYXZpcnRfb3BzLnNldF9sYXp5X21vZGUgPSBsZ3Vlc3RfbGF6eV9tb2RlOwogCXBhcmF2aXJ0X29wcy53YmludmQgPSBsZ3Vlc3Rfd2JpbnZkOwotCXBhcmF2aXJ0X29wcy5zY2hlZF9jbG9jayA9IGxndWVzdF9zY2hlZF9jbG9jazsKKwkvKiBOb3cgaXMgYSBnb29kIHRpbWUgdG8gbG9vayBhdCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucworCSAqIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIHJlc3Qgb2YgbGd1ZXN0X2luaXQoKS4gKi8KIAorCS8qRzowNzAgTm93IHdlJ3ZlIHNlZW4gYWxsIHRoZSBwYXJhdmlydF9vcHMsIHdlIHJldHVybiB0bworCSAqIGxndWVzdF9pbml0KCkgd2hlcmUgdGhlIHJlc3Qgb2YgdGhlIGZhaXJseSBjaGFvdGljIGJvb3Qgc2V0dXAKKwkgKiBvY2N1cnMuCisJICoKKwkgKiBUaGUgSG9zdCBleHBlY3RzIG91ciBmaXJzdCBoeXBlcmNhbGwgdG8gdGVsbCBpdCB3aGVyZSBvdXIgInN0cnVjdAorCSAqIGxndWVzdF9kYXRhIiBpcywgc28gd2UgZG8gdGhhdCBmaXJzdC4gKi8KIAloY2FsbChMSENBTExfTEdVRVNUX0lOSVQsIF9fcGEoJmxndWVzdF9kYXRhKSwgMCwgMCk7CiAKLQkvKiBXZSB1c2UgdG9wIG9mIG1lbSBmb3IgaW5pdGlhbCBwYWdldGFibGVzLiAqLworCS8qIFRoZSBuYXRpdmUgYm9vdCBjb2RlIHNldHMgdXAgaW5pdGlhbCBwYWdlIHRhYmxlcyBpbW1lZGlhdGVseSBhZnRlcgorCSAqIHRoZSBrZXJuZWwgaXRzZWxmLCBhbmQgc2V0cyBpbml0X3BnX3RhYmxlc19lbmQgc28gdGhleSdyZSBub3QKKwkgKiBjbG9iYmVyZWQuICBUaGUgTGF1bmNoZXIgcGxhY2VzIG91ciBpbml0aWFsIHBhZ2V0YWJsZXMgc29tZXdoZXJlIGF0CisJICogdGhlIHRvcCBvZiBvdXIgcGh5c2ljYWwgbWVtb3J5LCBzbyB3ZSBkb24ndCBuZWVkIGV4dHJhIHNwYWNlOiBzZXQKKwkgKiBpbml0X3BnX3RhYmxlc19lbmQgdG8gdGhlIGVuZCBvZiB0aGUga2VybmVsLiAqLwogCWluaXRfcGdfdGFibGVzX2VuZCA9IF9fcGEocGcwKTsKIAorCS8qIExvYWQgdGhlICVmcyBzZWdtZW50IHJlZ2lzdGVyICh0aGUgcGVyLWNwdSBzZWdtZW50IHJlZ2lzdGVyKSB3aXRoCisJICogdGhlIG5vcm1hbCBkYXRhIHNlZ21lbnQgdG8gZ2V0IHRocm91Z2ggYm9vdGluZy4gKi8KIAlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZnMiIDogOiAiciIgKF9fS0VSTkVMX0RTKSA6ICJtZW1vcnkiKTsKIAorCS8qIENsZWFyIHRoZSBwYXJ0IG9mIHRoZSBrZXJuZWwgZGF0YSB3aGljaCBpcyBleHBlY3RlZCB0byBiZSB6ZXJvLgorCSAqIE5vcm1hbGx5IGl0IHdpbGwgYmUgYW55d2F5LCBidXQgaWYgd2UncmUgbG9hZGluZyBmcm9tIGEgYnpJbWFnZSB3aXRoCisJICogQ09ORklHX1JFTE9DQVRBTEU9eSwgdGhlIHJlbG9jYXRpb25zIHdpbGwgYmUgc2l0dGluZyBoZXJlLiAqLworCW1lbXNldChfX2Jzc19zdGFydCwgMCwgX19ic3Nfc3RvcCAtIF9fYnNzX3N0YXJ0KTsKKworCS8qIFRoZSBIb3N0IHVzZXMgdGhlIHRvcCBvZiB0aGUgR3Vlc3QncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZQorCSAqIEhvc3Q8LT5HdWVzdCBTd2l0Y2hlciwgYW5kIGl0IHRlbGxzIHVzIGhvdyBtdWNoIGl0IG5lZWRzIGluCisJICogbGd1ZXN0X2RhdGEucmVzZXJ2ZV9tZW0sIHNldCB1cCBvbiB0aGUgTEdVRVNUX0lOSVQgaHlwZXJjYWxsLiAqLwogCXJlc2VydmVfdG9wX2FkZHJlc3MobGd1ZXN0X2RhdGEucmVzZXJ2ZV9tZW0pOwogCisJLyogSWYgd2UgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgbG9jayBkZXBlbmRlbmN5IGNoZWNrZXIgbm93LCBpdCBjcmFzaGVzCisJICogcGFyYXZpcnRfZGlzYWJsZV9pb3NwYWNlLiAqLwogCWxvY2tkZXBfaW5pdCgpOwogCisJLyogVGhlIElERSBjb2RlIHNwZW5kcyBhYm91dCAzIHNlY29uZHMgcHJvYmluZyBmb3IgZGlza3M6IGlmIHdlIHJlc2VydmUKKwkgKiBhbGwgdGhlIEkvTyBwb3J0cyB1cCBmcm9udCBpdCBjYW4ndCBnZXQgdGhlbSBhbmQgc28gZG9lc24ndCBwcm9iZS4KKwkgKiBPdGhlciBkZXZpY2UgZHJpdmVycyBhcmUgc2ltaWxhciAoYnV0IGxlc3Mgc2V2ZXJlKS4gIFRoaXMgY3V0cyB0aGUKKwkgKiBrZXJuZWwgYm9vdCB0aW1lIG9uIG15IG1hY2hpbmUgZnJvbSA0LjEgc2Vjb25kcyB0byAwLjQ1IHNlY29uZHMuICovCiAJcGFyYXZpcnRfZGlzYWJsZV9pb3NwYWNlKCk7CiAKKwkvKiBUaGlzIGlzIG1lc3N5IENQVSBzZXR1cCBzdHVmZiB3aGljaCB0aGUgbmF0aXZlIGJvb3QgY29kZSBkb2VzIGJlZm9yZQorCSAqIHN0YXJ0X2tlcm5lbCwgc28gd2UgaGF2ZSB0byBkbywgdG9vOiAqLwogCWNwdV9kZXRlY3QoJm5ld19jcHVfZGF0YSk7CiAJLyogaGVhZC5TIHVzdWFsbHkgc2V0cyB1cCB0aGUgZmlyc3QgY2FwYWJpbGl0eSB3b3JkLCBzbyBkbyBpdCBoZXJlLiAqLwogCW5ld19jcHVfZGF0YS54ODZfY2FwYWJpbGl0eVswXSA9IGNwdWlkX2VkeCgxKTsKQEAgLTYxNywxNCArMTA3MSwyNyBAQAogI2lmZGVmIENPTkZJR19YODZfTUNFCiAJbWNlX2Rpc2FibGVkID0gMTsKICNlbmRpZgotCiAjaWZkZWYgQ09ORklHX0FDUEkKIAlhY3BpX2Rpc2FibGVkID0gMTsKIAlhY3BpX2h0ID0gMDsKICNlbmRpZgogCisJLyogV2Ugc2V0IHRoZSBwZXJmZXJyZWQgY29uc29sZSB0byAiaHZjIi4gIFRoaXMgaXMgdGhlICJoeXBlcnZpc29yCisJICogdmlydHVhbCBjb25zb2xlIiBkcml2ZXIgd3JpdHRlbiBieSB0aGUgUG93ZXJQQyBwZW9wbGUsIHdoaWNoIHdlIGFsc28KKwkgKiBhZGFwdGVkIGZvciBsZ3Vlc3QncyB1c2UuICovCiAJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodmMiLCAwLCBOVUxMKTsKIAorCS8qIExhc3Qgb2YgYWxsLCB3ZSBzZXQgdGhlIHBvd2VyIG1hbmFnZW1lbnQgcG93ZXJvZmYgaG9vayB0byBwb2ludCB0bworCSAqIHRoZSBHdWVzdCByb3V0aW5lIHRvIHBvd2VyIG9mZi4gKi8KIAlwbV9wb3dlcl9vZmYgPSBsZ3Vlc3RfcG93ZXJfb2ZmOworCisJLyogTm93IHdlJ3JlIHNldCB1cCwgY2FsbCBzdGFydF9rZXJuZWwoKSBpbiBpbml0L21haW4uYyBhbmQgd2UgcHJvY2VlZAorCSAqIHRvIGJvb3QgYXMgbm9ybWFsLiAgSXQgbmV2ZXIgcmV0dXJucy4gKi8KIAlzdGFydF9rZXJuZWwoKTsKIH0KKy8qCisgKiBUaGlzIG1hcmtzIHRoZSBlbmQgb2Ygc3RhZ2UgSUkgb2Ygb3VyIGpvdXJuZXksIFRoZSBHdWVzdC4KKyAqCisgKiBJdCBpcyBub3cgdGltZSBmb3IgdXMgdG8gZXhwbG9yZSB0aGUgbm9va3MgYW5kIGNyYW5uaWVzIG9mIHRoZSB0aHJlZSBHdWVzdAorICogZGV2aWNlcyBhbmQgY29tcGxldGUgb3VyIHVuZGVyc3RhbmRpbmcgb2YgdGhlIEd1ZXN0IGluICJtYWtlIERyaXZlcnMiLgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfYXNtLlMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfYXNtLlMKaW5kZXggYTNkYmYyMi4uZjE4MmM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2FzbS5TCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9hc20uUwpAQCAtNCwxNSArNCwxNSBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KIAotLyoKLSAqIFRoaXMgaXMgd2hlcmUgd2UgYmVnaW46IHdlIGhhdmUgYSBtYWdpYyBzaWduYXR1cmUgd2hpY2ggdGhlIGxhdW5jaGVyIGxvb2tzCi0gKiBmb3IuICBUaGUgcGxhbiBpcyB0aGF0IHRoZSBMaW51eCBib290IHByb3RvY29sIHdpbGwgYmUgZXh0ZW5kZWQgd2l0aCBhCisvKkc6MDIwIFRoaXMgaXMgd2hlcmUgd2UgYmVnaW46IHdlIGhhdmUgYSBtYWdpYyBzaWduYXR1cmUgd2hpY2ggdGhlIGxhdW5jaGVyCisgKiBsb29rcyBmb3IuICBUaGUgcGxhbiBpcyB0aGF0IHRoZSBMaW51eCBib290IHByb3RvY29sIHdpbGwgYmUgZXh0ZW5kZWQgd2l0aCBhCiAgKiAicGxhdGZvcm0gdHlwZSIgZmllbGQgd2hpY2ggd2lsbCBndWlkZSB1cyBoZXJlIGZyb20gdGhlIG5vcm1hbCBlbnRyeSBwb2ludCwKLSAqIGJ1dCBmb3IgdGhlIG1vbWVudCB0aGlzIHN1ZmZpY2VzLiAgV2UgcGFzcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBib290Ci0gKiBpbmZvIHRvIGxndWVzdF9pbml0KCkuCisgKiBidXQgZm9yIHRoZSBtb21lbnQgdGhpcyBzdWZmaWNlcy4gIFRoZSBub3JtYWwgYm9vdCBjb2RlIHVzZXMgJWVzaSBmb3IgdGhlCisgKiBib290IGhlYWRlciwgc28gd2UgZG8gdG9vLiAgV2UgY29udmVydCBpdCB0byBhIHZpcnR1YWwgYWRkcmVzcyBieSBhZGRpbmcKKyAqIFBBR0VfT0ZGU0VULCBhbmQgaGFuZCBpdCB0byBsZ3Vlc3RfaW5pdCgpIGFzIGl0cyBhcmd1bWVudCAoaWUuICVlYXgpLgogICoKLSAqIFdlIHB1dCBpdCBpbiAuaW5pdC50ZXh0IHdpbGwgYmUgZGlzY2FyZGVkIGFmdGVyIGJvb3QuCi0gKi8KKyAqIFRoZSAuc2VjdGlvbiBsaW5lIHB1dHMgdGhpcyBjb2RlIGluIC5pbml0LnRleHQgc28gaXQgd2lsbCBiZSBkaXNjYXJkZWQgYWZ0ZXIKKyAqIGJvb3QuICovCiAuc2VjdGlvbiAuaW5pdC50ZXh0LCAiYXgiLCBAcHJvZ2JpdHMKIC5hc2NpaSAiR2VudWluZUxndWVzdCIKIAkvKiBTZXQgdXAgaW5pdGlhbCBzdGFjay4gKi8KQEAgLTIxLDcgKzIxLDkgQEAKIAlhZGRsICRfX1BBR0VfT0ZGU0VULCAlZWF4CiAJam1wIGxndWVzdF9pbml0CiAKLS8qIFRoZSB0ZW1wbGF0ZXMgZm9yIGlubGluZSBwYXRjaGluZy4gKi8KKy8qRzowNTUgV2UgY3JlYXRlIGEgbWFjcm8gd2hpY2ggcHV0cyB0aGUgYXNzZW1ibGVyIGNvZGUgYmV0d2VlbiBsZ3N0YXJ0XyBhbmQKKyAqIGxnZW5kXyBtYXJrZXJzLiAgVGhlc2UgdGVtcGxhdGVzIGVuZCB1cCBpbiB0aGUgLmluaXQudGV4dCBzZWN0aW9uLCBzbyB0aGV5CisgKiBhcmUgZGlzY2FyZGVkIGFmdGVyIGJvb3QuICovCiAjZGVmaW5lIExHVUVTVF9QQVRDSChuYW1lLCBpbnNucy4uLikJCQlcCiAJbGdzdGFydF8jI25hbWU6CWluc25zOyBsZ2VuZF8jI25hbWU6OwkJXAogCS5nbG9ibCBsZ3N0YXJ0XyMjbmFtZTsgLmdsb2JsIGxnZW5kXyMjbmFtZQpAQCAtMzAsMjQgKzMyLDYxIEBACiBMR1VFU1RfUEFUQ0goc3RpLCBtb3ZsICRYODZfRUZMQUdTX0lGLCBsZ3Vlc3RfZGF0YStMR1VFU1RfREFUQV9pcnFfZW5hYmxlZCkKIExHVUVTVF9QQVRDSChwb3BmLCBtb3ZsICVlYXgsIGxndWVzdF9kYXRhK0xHVUVTVF9EQVRBX2lycV9lbmFibGVkKQogTEdVRVNUX1BBVENIKHB1c2hmLCBtb3ZsIGxndWVzdF9kYXRhK0xHVUVTVF9EQVRBX2lycV9lbmFibGVkLCAlZWF4KQorLyo6Ki8KIAogLnRleHQKIC8qIFRoZXNlIGRlbWFyayB0aGUgRUlQIHJhbmdlIHdoZXJlIGhvc3Qgc2hvdWxkIG5ldmVyIGRlbGl2ZXIgaW50ZXJydXB0cy4gKi8KIC5nbG9iYWwgbGd1ZXN0X25vaXJxX3N0YXJ0CiAuZ2xvYmFsIGxndWVzdF9ub2lycV9lbmQKIAotLyoKLSAqIFdlIG1vdmUgZWZsYWdzIHdvcmQgdG8gbGd1ZXN0X2RhdGEuaXJxX2VuYWJsZWQgdG8gcmVzdG9yZSBpbnRlcnJ1cHQgc3RhdGUuCi0gKiBGb3IgcGFnZSBmYXVsdHMsIGdwZnMgYW5kIHZpcnR1YWwgaW50ZXJydXB0cywgdGhlIGh5cGVydmlzb3IgaGFzIHNhdmVkCi0gKiBlZmxhZ3MgbWFudWFsbHksIG90aGVyd2lzZSBpdCB3YXMgZGVsaXZlcmVkIGRpcmVjdGx5IGFuZCBzbyBlZmxhZ3MgcmVmbGVjdHMKLSAqIHRoZSByZWFsIG1hY2hpbmUgSUYgc3RhdGUsIGllLiBpbnRlcnJ1cHRzIG9uLiAgU2luY2UgdGhlIGtlcm5lbCBhbHdheXMgZGllcwotICogaWYgaXQgdGFrZXMgc3VjaCBhIHRyYXAgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFueXdheSwgdHVybmluZyBpbnRlcnJ1cHRzCi0gKiBiYWNrIG9uIHVuY29uZGl0aW9uYWxseSBoZXJlIGlzIE9LLgotICovCisvKk06MDA0IFdoZW4gdGhlIEhvc3QgcmVmbGVjdHMgYSB0cmFwIG9yIGluamVjdHMgYW4gaW50ZXJydXB0IGludG8gdGhlIEd1ZXN0LAorICogaXQgc2V0cyB0aGUgZWZsYWdzIGludGVycnVwdCBiaXQgb24gdGhlIHN0YWNrIGJhc2VkIG9uCisgKiBsZ3Vlc3RfZGF0YS5pcnFfZW5hYmxlZCwgc28gdGhlIEd1ZXN0IGlyZXQgbG9naWMgZG9lcyB0aGUgcmlnaHQgdGhpbmcgd2hlbgorICogcmVzdG9yaW5nIGl0LiAgSG93ZXZlciwgd2hlbiB0aGUgSG9zdCBzZXRzIHRoZSBHdWVzdCB1cCBmb3IgZGlyZWN0IHRyYXBzLAorICogc3VjaCBhcyBzeXN0ZW0gY2FsbHMsIHRoZSBwcm9jZXNzb3IgaXMgdGhlIG9uZSB0byBwdXNoIGVmbGFncyBvbnRvIHRoZQorICogc3RhY2ssIGFuZCB0aGUgaW50ZXJydXB0IGJpdCB3aWxsIGJlIDEgKGluIHJlYWxpdHksIGludGVycnVwdHMgYXJlIGFsd2F5cworICogZW5hYmxlZCBpbiB0aGUgR3Vlc3QpLgorICoKKyAqIFRoaXMgdHVybnMgb3V0IHRvIGJlIGhhcm1sZXNzOiB0aGUgb25seSB0cmFwIHdoaWNoIHNob3VsZCBoYXBwZW4gdW5kZXIgTGludXgKKyAqIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBpcyBQYWdlIEZhdWx0IChkdWUgdG8gb3VyIGxhenkgbWFwcGluZyBvZiB2bWFsbG9jCisgKiByZWdpb25zKSwgd2hpY2ggaGFzIHRvIGJlIHJlZmxlY3RlZCB0aHJvdWdoIHRoZSBIb3N0IGFueXdheS4gIElmIGFub3RoZXIKKyAqIHRyYXAgKmRvZXMqIGdvIG9mZiB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgR3Vlc3Qgd2lsbCBwYW5pYywgYW5kCisgKiB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBpcmV0ISA6Ki8KKworLypHOjA0NSBUaGVyZSBpcyBvbmUgZmluYWwgcGFyYXZpcnRfb3AgdGhhdCB0aGUgR3Vlc3QgaW1wbGVtZW50cywgYW5kIGdsYW5jaW5nCisgKiBhdCBpdCB5b3UgY2FuIHNlZSB3aHkgSSBsZWZ0IGl0IHRvIGxhc3QuICBJdCdzICpjb29sKiEgIEl0J3MgaW4gKmFzc2VtYmxlciohCisgKgorICogVGhlICJpcmV0IiBpbnN0cnVjdGlvbiBpcyB1c2VkIHRvIHJldHVybiBmcm9tIGFuIGludGVycnVwdCBvciB0cmFwLiAgVGhlCisgKiBzdGFjayBsb29rcyBsaWtlIHRoaXM6CisgKiAgIG9sZCBhZGRyZXNzCisgKiAgIG9sZCBjb2RlIHNlZ21lbnQgJiBwcml2aWxlZ2UgbGV2ZWwKKyAqICAgb2xkIHByb2Nlc3NvciBmbGFncyAoImVmbGFncyIpCisgKgorICogVGhlICJpcmV0IiBpbnN0cnVjdGlvbiBwb3BzIHRob3NlIHZhbHVlcyBvZmYgdGhlIHN0YWNrIGFuZCByZXN0b3JlcyB0aGVtIGFsbAorICogYXQgb25jZS4gIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdCBlZmxhZ3MgaW5jbHVkZXMgdGhlIEludGVycnVwdCBGbGFnIHdoaWNoCisgKiB0aGUgR3Vlc3QgY2FuJ3QgY2hhbmdlOiB0aGUgQ1BVIHdpbGwgc2ltcGx5IGlnbm9yZSBpdCB3aGVuIHdlIGRvIGFuICJpcmV0Ii4KKyAqIFNvIHdlIGhhdmUgdG8gY29weSBlZmxhZ3MgZnJvbSB0aGUgc3RhY2sgdG8gbGd1ZXN0X2RhdGEuaXJxX2VuYWJsZWQgYmVmb3JlCisgKiB3ZSBkbyB0aGUgImlyZXQiLgorICoKKyAqIFRoZXJlIGFyZSB0d28gcHJvYmxlbXMgd2l0aCB0aGlzOiBmaXJzdGx5LCB3ZSBuZWVkIHRvIHVzZSBhIHJlZ2lzdGVyIHRvIGRvCisgKiB0aGUgY29weSBhbmQgc2Vjb25kbHksIHRoZSB3aG9sZSB0aGluZyBuZWVkcyB0byBiZSBhdG9taWMuICBUaGUgZmlyc3QKKyAqIHByb2JsZW0gaXMgZWFzeSB0byBzb2x2ZTogcHVzaCAlZWF4IG9uIHRoZSBzdGFjayBzbyB3ZSBjYW4gdXNlIGl0LCBhbmQgdGhlbgorICogcmVzdG9yZSBpdCBhdCB0aGUgZW5kIGp1c3QgYmVmb3JlIHRoZSByZWFsICJpcmV0Ii4KKyAqCisgKiBUaGUgc2Vjb25kIGlzIGhhcmRlcjogY29weWluZyBlZmxhZ3MgdG8gbGd1ZXN0X2RhdGEuaXJxX2VuYWJsZWQgd2lsbCB0dXJuCisgKiBpbnRlcnJ1cHRzIG9uIGJlZm9yZSB3ZSdyZSBmaW5pc2hlZCwgc28gd2UgY291bGQgYmUgaW50ZXJydXB0ZWQgYmVmb3JlIHdlCisgKiByZXR1cm4gdG8gdXNlcnNwYWNlIG9yIHdoZXJldmVyLiAgT3VyIHNvbHV0aW9uIHRvIHRoaXMgaXMgdG8gc3Vycm91bmQgdGhlCisgKiBjb2RlIHdpdGggbGd1ZXN0X25vaXJxX3N0YXJ0OiBhbmQgbGd1ZXN0X25vaXJxX2VuZDogbGFiZWxzLiAgV2UgdGVsbCB0aGUKKyAqIEhvc3QgdGhhdCBpdCBpcyAqbmV2ZXIqIHRvIGludGVycnVwdCB1cyB0aGVyZSwgZXZlbiBpZiBpbnRlcnJ1cHRzIHNlZW0gdG8gYmUKKyAqIGVuYWJsZWQuICovCiBFTlRSWShsZ3Vlc3RfaXJldCkKIAlwdXNobAklZWF4CiAJbW92bAkxMiglZXNwKSwgJWVheAogbGd1ZXN0X25vaXJxX3N0YXJ0OgorCS8qIE5vdGUgdGhlICVzczogc2VnbWVudCBwcmVmaXggaGVyZS4gIE5vcm1hbCBkYXRhIGFjY2Vzc2VzIHVzZSB0aGUKKwkgKiAiZHMiIHNlZ21lbnQsIGJ1dCB0aGF0IHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzdG9yZWQgZm9yIHdoYXRldmVyCisJICogd2UncmUgcmV0dXJuaW5nIHRvIChzdWNoIGFzIHVzZXJzcGFjZSk6IHdlIGNhbid0IHRydXN0IGl0LiAgVGhlICVzczoKKwkgKiBwcmVmaXggbWFrZXMgc3VyZSB3ZSB1c2UgdGhlIHN0YWNrIHNlZ21lbnQsIHdoaWNoIGlzIHN0aWxsIHZhbGlkLiAqLwogCW1vdmwJJWVheCwlc3M6bGd1ZXN0X2RhdGErTEdVRVNUX0RBVEFfaXJxX2VuYWJsZWQKIAlwb3BsCSVlYXgKIAlpcmV0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfYnVzLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfYnVzLmMKaW5kZXggMThkNmFiMi4uNTVhNzk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2J1cy5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9idXMuYwpAQCAtMSwzICsxLDYgQEAKKy8qUDowNTAgTGd1ZXN0IGd1ZXN0cyB1c2UgYSB2ZXJ5IHNpbXBsZSBidXMgZm9yIGRldmljZXMuICBJdCdzIGEgc2ltcGxlIGFycmF5CisgKiBvZiBkZXZpY2UgZGVzY3JpcHRvcnMgY29udGFpbmVkIGp1c3QgYWJvdmUgdGhlIHRvcCBvZiBub3JtYWwgbWVtb3J5LiAgVGhlCisgKiBsZ3Vlc3QgYnVzIGlzIDgwJSB0ZWRpb3VzIGJvaWxlcnBsYXRlIGNvZGUuIDoqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbGd1ZXN0X2J1cy5oPgpAQCAtNDMsNiArNDYsMTAgQEAKIAlfX0FUVFJfTlVMTAogfTsKIAorLypEOjEzMCBUaGUgZ2VuZXJpYyBidXMgaW5mcmFzdHJ1Y3R1cmUgcmVxdWlyZXMgYSBmdW5jdGlvbiB3aGljaCBzYXlzIHdoZXRoZXIgYQorICogZGV2aWNlIG1hdGNoZXMgYSBkcml2ZXIuICBGb3IgdXMsIGl0IGlzIHNpbXBsZTogInN0cnVjdCBsZ3Vlc3RfZHJpdmVyIgorICogY29udGFpbnMgYSAiZGV2aWNlX3R5cGUiIGZpZWxkIHdoaWNoIGluZGljYXRlcyB3aGF0IHR5cGUgb2YgZGV2aWNlIGl0IGNhbgorICogaGFuZGxlLCBzbyB3ZSBqdXN0IGNhc3QgdGhlIGFyZ3MgYW5kIGNvbXBhcmU6ICovCiBzdGF0aWMgaW50IGxndWVzdF9kZXZfbWF0Y2goc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCiB7CiAJc3RydWN0IGxndWVzdF9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihfZGV2LHN0cnVjdCBsZ3Vlc3RfZGV2aWNlLGRldik7CkBAIC01MCw2ICs1Nyw3IEBACiAKIAlyZXR1cm4gKGRydi0+ZGV2aWNlX3R5cGUgPT0gbGd1ZXN0X2RldmljZXNbZGV2LT5pbmRleF0udHlwZSk7CiB9CisvKjoqLwogCiBzdHJ1Y3QgbGd1ZXN0X2J1cyB7CiAJc3RydWN0IGJ1c190eXBlIGJ1czsKQEAgLTY4LDExICs3NiwyNCBAQAogCX0KIH07CiAKKy8qRDoxNDAgVGhpcyBpcyB0aGUgY2FsbGJhY2sgd2hpY2ggb2NjdXJzIG9uY2UgdGhlIGJ1cyBpbmZyYXN0cnVjdHVyZSBtYXRjaGVzCisgKiB1cCBhIGRldmljZSBhbmQgZHJpdmVyLCBpZS4gaW4gcmVzcG9uc2UgdG8gYWRkX2xndWVzdF9kZXZpY2UoKSBjYWxsaW5nCisgKiBkZXZpY2VfcmVnaXN0ZXIoKSwgb3IgcmVnaXN0ZXJfbGd1ZXN0X2RyaXZlcigpIGNhbGxpbmcgZHJpdmVyX3JlZ2lzdGVyKCkuCisgKgorICogQXQgdGhlIG1vbWVudCBpdCdzIGFsd2F5cyB0aGUgbGF0dGVyOiB0aGUgZGV2aWNlcyBhcmUgYWRkZWQgZmlyc3QsIHNpbmNlCisgKiBzY2FuX2RldmljZXMoKSBpcyBjYWxsZWQgZnJvbSBhICJjb3JlX2luaXRjYWxsIiwgYW5kIHRoZSBkcml2ZXJzIHRoZW1zZWx2ZXMKKyAqIGNhbGxlZCBsYXRlciBhcyBhIG5vcm1hbCAiaW5pdGNhbGwiLiAgQnV0IGl0IHdvdWxkIHdvcmsgdGhlIG90aGVyIHdheSB0b28uCisgKgorICogU28gbm93IHdlIGhhdmUgdGhlIGhhcHB5IGNvdXBsZSwgd2UgYWRkIHRoZSBzdGF0dXMgYml0IHRvIGluZGljYXRlIHRoYXQgd2UKKyAqIGZvdW5kIGEgZHJpdmVyLiAgSWYgdGhlIGRyaXZlciB0cnVseSBsb3ZlcyB0aGUgZGV2aWNlLCBpdCB3aWxsIHJldHVybgorICogaGFwcGluZXNzIGZyb20gaXRzIHByb2JlIGZ1bmN0aW9uIChvaywgcGVyaGFwcyB0aGlzIHdhc24ndCBteSBncmVhdGVzdAorICogYW5hbG9neSksIGFuZCB3ZSBzZXQgdGhlIGZpbmFsICJkcml2ZXIgb2siIGJpdCBzbyB0aGUgSG9zdCBzZWVzIGl0J3MgYWxsCisgKiBncmVlbi4gKi8KIHN0YXRpYyBpbnQgbGd1ZXN0X2Rldl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewogCWludCByZXQ7Ci0Jc3RydWN0IGxndWVzdF9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihfZGV2LHN0cnVjdCBsZ3Vlc3RfZGV2aWNlLGRldik7Ci0Jc3RydWN0IGxndWVzdF9kcml2ZXIgKmRydiA9IGNvbnRhaW5lcl9vZihkZXYtPmRldi5kcml2ZXIsCisJc3RydWN0IGxndWVzdF9kZXZpY2UqZGV2ID0gY29udGFpbmVyX29mKF9kZXYsc3RydWN0IGxndWVzdF9kZXZpY2UsZGV2KTsKKwlzdHJ1Y3QgbGd1ZXN0X2RyaXZlcipkcnYgPSBjb250YWluZXJfb2YoZGV2LT5kZXYuZHJpdmVyLAogCQkJCQkJc3RydWN0IGxndWVzdF9kcml2ZXIsIGRydik7CiAKIAlsZ3Vlc3RfZGV2aWNlc1tkZXYtPmluZGV4XS5zdGF0dXMgfD0gTEdVRVNUX0RFVklDRV9TX0RSSVZFUjsKQEAgLTgyLDYgKzEwMywxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIFRoZSBsYXN0IHBhcnQgb2YgdGhlIGJ1cyBpbmZyYXN0cnVjdHVyZSBpcyB0aGUgZnVuY3Rpb24gbGd1ZXN0IGRyaXZlcnMgdXNlCisgKiB0byByZWdpc3RlciB0aGVtc2VsdmVzLiAgRmlyc3RseSwgd2UgZG8gbm90aGluZyBpZiB0aGVyZSdzIG5vIGxndWVzdCBidXMKKyAqIChpZS4gdGhpcyBpcyBub3QgYSBHdWVzdCksIG90aGVyd2lzZSB3ZSBmaWxsIGluIHRoZSBlbWJlZGRlZCBnZW5lcmljICJzdHJ1Y3QKKyAqIGRyaXZlciIgZmllbGRzIGFuZCBjYWxsIHRoZSBnZW5lcmljIGRyaXZlcl9yZWdpc3RlcigpLiAqLwogaW50IHJlZ2lzdGVyX2xndWVzdF9kcml2ZXIoc3RydWN0IGxndWVzdF9kcml2ZXIgKmRydikKIHsKIAlpZiAoIWxndWVzdF9kZXZpY2VzKQpAQCAtOTQsMTIgKzExOSwzNiBAQAogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcnYpOwogfQorCisvKiBBdCB0aGUgbW9tZW50IHdlIGJ1aWxkIGFsbCB0aGUgZHJpdmVycyBpbnRvIHRoZSBrZXJuZWwgYmVjYXVzZSB0aGV5J3JlIHNvCisgKiBzaW1wbGU6IDgxNDQgYnl0ZXMgZm9yIGFsbCB0aHJlZSBvZiB0aGVtIGFzIEkgdHlwZSB0aGlzLiAgQW5kIGFzIHRoZSBjb25zb2xlCisgKiByZWFsbHkgbmVlZHMgdG8gYmUgYnVpbHQgaW4sIGl0J3MgYWN0dWFsbHkgb25seSAzNTI3IGJ5dGVzIGZvciB0aGUgbmV0d29yaworICogYW5kIGJsb2NrIGRyaXZlcnMuCisgKgorICogSWYgdGhleSBnZXQgY29tcGxleCBpdCB3aWxsIG1ha2Ugc2Vuc2UgZm9yIHRoZW0gdG8gYmUgbW9kdWxhcml6ZWQsIHNvIHdlCisgKiBuZWVkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoZSBzeW1ib2wuCisgKgorICogSSBkb24ndCB0aGluayBub24tR1BMIG1vZHVsZXMgbWFrZSBzZW5zZSwgc28gaXQncyBhIEdQTC1vbmx5IGV4cG9ydC4KKyAqLwogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfbGd1ZXN0X2RyaXZlcik7CiAKKy8qRDoxMjAgVGhpcyBpcyB0aGUgY29yZSBvZiB0aGUgbGd1ZXN0IGJ1czogYWN0dWFsbHkgYWRkaW5nIGEgbmV3IGRldmljZS4KKyAqIEl0J3MgYSBzZXBhcmF0ZSBmdW5jdGlvbiBiZWNhdXNlIGl0J3MgbmVhdGVyIHRoYXQgd2F5LCBhbmQgYmVjYXVzZSBhbgorICogZWFybGllciB2ZXJzaW9uIG9mIHRoZSBjb2RlIHN1cHBvcnRlZCBob3RwbHVnIGFuZCB1bnBsdWcuICBUaGV5IHdlcmUgcmVtb3ZlZAorICogZWFybHkgb24gYmVjYXVzZSB0aGV5IHdlcmUgbmV2ZXIgdXNlZC4KKyAqCisgKiBBcyBBbmRyZXcgVHJpZGdlbGwgc2F5cywgIlVudGVzdGVkIGNvZGUgaXMgYnVnZ3kgY29kZSIuCisgKgorICogSXQncyB3b3J0aCByZWFkaW5nIHRoaXMgY2FyZWZ1bGx5OiB3ZSBzdGFydCB3aXRoIGFuIGluZGV4IGludG8gdGhlIGFycmF5IG9mCisgKiAic3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyJzIGluZGljYXRpbmcgdGhlIGRldmljZSB3aGljaCBpcyBuZXc6ICovCiBzdGF0aWMgdm9pZCBhZGRfbGd1ZXN0X2RldmljZSh1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGxndWVzdF9kZXZpY2UgKm5ldzsKIAorCS8qIEVhY2ggInN0cnVjdCBsZ3Vlc3RfZGV2aWNlX2Rlc2MiIGhhcyBhICJzdGF0dXMiIGZpZWxkLCB3aGljaCB0aGUKKwkgKiBHdWVzdCB1cGRhdGVzIGFzIHRoZSBkZXZpY2UgaXMgcHJvYmVkLiAgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBIb3N0CisJICogY2FuIGxvb2sgYXQgdGhlc2UgYml0cyB0byB0ZWxsIHdoYXQgcGFydCBvZiBkZXZpY2Ugc2V0dXAgZmFpbGVkLAorCSAqIGV2ZW4gaWYgdGhlIGNvbnNvbGUgaXNuJ3QgYXZhaWxhYmxlLiAqLwogCWxndWVzdF9kZXZpY2VzW2luZGV4XS5zdGF0dXMgfD0gTEdVRVNUX0RFVklDRV9TX0FDS05PV0xFREdFOwogCW5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZ3Vlc3RfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXcpIHsKQEAgLTEwOCwxMiArMTU3LDE3IEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBUaGUgInN0cnVjdCBsZ3Vlc3RfZGV2aWNlIiBzZXR1cCBpcyBwcmV0dHkgc3RyYWlnaHQtZm9yd2FyZCBleGFtcGxlCisJICogY29kZS4gKi8KIAluZXctPmluZGV4ID0gaW5kZXg7CiAJbmV3LT5wcml2YXRlID0gTlVMTDsKIAltZW1zZXQoJm5ldy0+ZGV2LCAwLCBzaXplb2YobmV3LT5kZXYpKTsKIAluZXctPmRldi5wYXJlbnQgPSAmbGd1ZXN0X2J1cy5kZXY7CiAJbmV3LT5kZXYuYnVzID0gJmxndWVzdF9idXMuYnVzOwogCXNwcmludGYobmV3LT5kZXYuYnVzX2lkLCAiJXUiLCBpbmRleCk7CisKKwkvKiBkZXZpY2VfcmVnaXN0ZXIoKSBjYXVzZXMgdGhlIGJ1cyBpbmZyYXN0cnVjdHVyZSB0byBsb29rIGZvciBhCisJICogbWF0Y2hpbmcgZHJpdmVyLiAqLwogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJm5ldy0+ZGV2KSAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0VNRVJHICJDYW5ub3QgcmVnaXN0ZXIgbGd1ZXN0IGRldmljZSAldVxuIiwgaW5kZXgpOwogCQlsZ3Vlc3RfZGV2aWNlc1tpbmRleF0uc3RhdHVzIHw9IExHVUVTVF9ERVZJQ0VfU19GQUlMRUQ7CkBAIC0xMjEsNiArMTc1LDkgQEAKIAl9CiB9CiAKKy8qRDoxMTAgc2Nhbl9kZXZpY2VzKCkgc2ltcGx5IGl0ZXJhdGVzIHRocm91Z2ggdGhlIGRldmljZSBhcnJheS4gIFRoZSB0eXBlIDAKKyAqIGlzIHJlc2VydmVkIHRvIG1lYW4gIm5vIGRldmljZSIsIGFuZCBhbnl0aGluZyBlbHNlIG1lYW5zIHdlIGhhdmUgZm91bmQgYQorICogZGV2aWNlOiBhZGQgaXQuICovCiBzdGF0aWMgdm9pZCBzY2FuX2RldmljZXModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTEzMCwxMiArMTg3LDIzIEBACiAJCQlhZGRfbGd1ZXN0X2RldmljZShpKTsKIH0KIAorLypEOjEwMCBGYWlybHkgZWFybHkgaW4gYm9vdCwgbGd1ZXN0X2J1c19pbml0KCkgaXMgY2FsbGVkIHRvIHNldCB1cCB0aGUgbGd1ZXN0CisgKiBidXMuICBXZSBjaGVjayB0aGF0IHdlIGFyZSBhIEd1ZXN0IGJ5IGNoZWNraW5nIHBhcmF2aXJ0X29wcy5uYW1lOiB0aGVyZSBhcmUKKyAqIG90aGVyIHdheXMgb2YgY2hlY2tpbmcsIGJ1dCB0aGlzIHNlZW1zIG1vc3Qgb2J2aW91cyB0byBtZS4KKyAqCisgKiBTbyB3ZSBjYW4gYWNjZXNzIHRoZSBhcnJheSBvZiAic3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyJzIGVhc2lseSwgd2UgbWFwCisgKiB0aGF0IG1lbW9yeSBhbmQgc3RvcmUgdGhlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCAibGd1ZXN0X2RldmljZXMiLiAgVGhlbiB3ZQorICogcmVnaXN0ZXIgdGhlIGJ1cyB3aXRoIHRoZSBjb3JlLiAgRG9pbmcgdHdvIHJlZ2lzdHJhdGlvbnMgc2VlbXMgY2x1bmt5IHRvIG1lLAorICogYnV0IGl0IHNlZW1zIHRvIGJlIHRoZSBjb3JyZWN0IHN5c2ZzIGluY2FudGF0aW9uLgorICoKKyAqIEZpbmFsbHkgd2UgY2FsbCBzY2FuX2RldmljZXMoKSB3aGljaCBhZGRzIGFsbCB0aGUgZGV2aWNlcyBmb3VuZCBpbiB0aGUKKyAqICJzdHJ1Y3QgbGd1ZXN0X2RldmljZV9kZXNjIiBhcnJheS4gKi8KIHN0YXRpYyBpbnQgX19pbml0IGxndWVzdF9idXNfaW5pdCh2b2lkKQogewogCWlmIChzdHJjbXAocGFyYXZpcnRfb3BzLm5hbWUsICJsZ3Vlc3QiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCS8qIERldmljZXMgYXJlIGluIHBhZ2UgYWJvdmUgdG9wIG9mICJub3JtYWwiIG1lbS4gKi8KKwkvKiBEZXZpY2VzIGFyZSBpbiBhIHNpbmdsZSBwYWdlIGFib3ZlIHRvcCBvZiAibm9ybWFsIiBtZW0gKi8KIAlsZ3Vlc3RfZGV2aWNlcyA9IGxndWVzdF9tYXAobWF4X3Bmbjw8UEFHRV9TSElGVCwgMSk7CiAKIAlpZiAoYnVzX3JlZ2lzdGVyKCZsZ3Vlc3RfYnVzLmJ1cykgIT0gMApAQCAtMTQ1LDQgKzIxMyw1IEBACiAJc2Nhbl9kZXZpY2VzKCk7CiAJcmV0dXJuIDA7CiB9CisvKiBEbyB0aGlzIGFmdGVyIGNvcmUgc3R1ZmYsIGJlZm9yZSBkZXZpY2VzLiAqLwogcG9zdGNvcmVfaW5pdGNhbGwobGd1ZXN0X2J1c19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfdXNlci5jCmluZGV4IGU5MGQ3YTcuLjgwZDFiNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF91c2VyLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X3VzZXIuYwpAQCAtMSwzNiArMSw3MCBAQAotLyogVXNlcnNwYWNlIGNvbnRyb2wgb2YgdGhlIGd1ZXN0LCB2aWEgL2Rldi9sZ3Vlc3QuICovCisvKlA6MjAwIFRoaXMgY29udGFpbnMgYWxsIHRoZSAvZGV2L2xndWVzdCBjb2RlLCB3aGVyZWJ5IHRoZSB1c2Vyc3BhY2UgbGF1bmNoZXIKKyAqIGNvbnRyb2xzIGFuZCBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgR3Vlc3QuICBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IHdyaXRlIHdpbGwKKyAqIHRlbGwgdXMgdGhlIG1lbW9yeSBzaXplLCBwYWdldGFibGUsIGVudHJ5IHBvaW50IGFuZCBrZXJuZWwgYWRkcmVzcyBvZmZzZXQuCisgKiBBIHJlYWQgd2lsbCBydW4gdGhlIEd1ZXN0IHVudGlsIGEgc2lnbmFsIGlzIHBlbmRpbmcgKC1FSU5UUiksIG9yIHRoZSBHdWVzdAorICogZG9lcyBhIERNQSBvdXQgdG8gdGhlIExhdW5jaGVyLiAgV3JpdGVzIGFyZSBhbHNvIHVzZWQgdG8gZ2V0IGEgRE1BIGJ1ZmZlcgorICogcmVnaXN0ZXJlZCBieSB0aGUgR3Vlc3QgYW5kIHRvIHNlbmQgdGhlIEd1ZXN0IGFuIGludGVycnVwdC4gOiovCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgImxnLmgiCiAKKy8qTDowMzAgc2V0dXBfcmVncygpIGRvZXNuJ3QgcmVhbGx5IGJlbG9uZyBpbiB0aGlzIGZpbGUsIGJ1dCBpdCBnaXZlcyB1cyBhbgorICogZWFybHkgZ2xpbXBzZSBkZWVwZXIgaW50byB0aGUgSG9zdCBzbyBpdCdzIHdvcnRoIGhhdmluZyBoZXJlLgorICoKKyAqIE1vc3Qgb2YgdGhlIEd1ZXN0J3MgcmVnaXN0ZXJzIGFyZSBsZWZ0IGFsb25lOiB3ZSB1c2VkIGdldF96ZXJvZWRfcGFnZSgpIHRvCisgKiBhbGxvY2F0ZSB0aGUgc3RydWN0dXJlLCBzbyB0aGV5IHdpbGwgYmUgMC4gKi8KIHN0YXRpYyB2b2lkIHNldHVwX3JlZ3Moc3RydWN0IGxndWVzdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHN0YXJ0KQogewotCS8qIFdyaXRlIG91dCBzdGFjayBpbiBmb3JtYXQgbGd1ZXN0IGV4cGVjdHMsIHNvIHdlIGNhbiBzd2l0Y2ggdG8gaXQuICovCisJLyogVGhlcmUgYXJlIGZvdXIgInNlZ21lbnQiIHJlZ2lzdGVycyB3aGljaCB0aGUgR3Vlc3QgbmVlZHMgdG8gYm9vdDoKKwkgKiBUaGUgImNvZGUgc2VnbWVudCIgcmVnaXN0ZXIgKGNzKSByZWZlcnMgdG8gdGhlIGtlcm5lbCBjb2RlIHNlZ21lbnQKKwkgKiBfX0tFUk5FTF9DUywgYW5kIHRoZSAiZGF0YSIsICJleHRyYSIgYW5kICJzdGFjayIgc2VnbWVudCByZWdpc3RlcnMKKwkgKiByZWZlciB0byB0aGUga2VybmVsIGRhdGEgc2VnbWVudCBfX0tFUk5FTF9EUy4KKwkgKgorCSAqIFRoZSBwcml2aWxlZ2UgbGV2ZWwgaXMgcGFja2VkIGludG8gdGhlIGxvd2VyIGJpdHMuICBUaGUgR3Vlc3QgcnVucworCSAqIGF0IHByaXZpbGVnZSBsZXZlbCAxIChHVUVTVF9QTCkuKi8KIAlyZWdzLT5kcyA9IHJlZ3MtPmVzID0gcmVncy0+c3MgPSBfX0tFUk5FTF9EU3xHVUVTVF9QTDsKIAlyZWdzLT5jcyA9IF9fS0VSTkVMX0NTfEdVRVNUX1BMOwotCXJlZ3MtPmVmbGFncyA9IDB4MjAyOyAJLyogSW50ZXJydXB0cyBlbmFibGVkLiAqLworCisJLyogVGhlICJlZmxhZ3MiIHJlZ2lzdGVyIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgZmxhZ3MuICBCaXQgMSAoMHgwMDIpCisJICogaXMgc3VwcG9zZWQgdG8gYWx3YXlzIGJlICIxIi4gIEJpdCA5ICgweDIwMCkgY29udHJvbHMgd2hldGhlcgorCSAqIGludGVycnVwdHMgYXJlIGVuYWJsZWQuICBXZSBhbHdheXMgbGVhdmUgaW50ZXJydXB0cyBlbmFibGVkIHdoaWxlCisJICogcnVubmluZyB0aGUgR3Vlc3QuICovCisJcmVncy0+ZWZsYWdzID0gMHgyMDI7CisKKwkvKiBUaGUgIkV4dGVuZGVkIEluc3RydWN0aW9uIFBvaW50ZXIiIHJlZ2lzdGVyIHNheXMgd2hlcmUgdGhlIEd1ZXN0IGlzCisJICogcnVubmluZy4gKi8KIAlyZWdzLT5laXAgPSBzdGFydDsKLQkvKiBlc2kgcG9pbnRzIHRvIG91ciBib290IGluZm9ybWF0aW9uIChwaHlzaWNhbCBhZGRyZXNzIDApICovCisKKwkvKiAlZXNpIHBvaW50cyB0byBvdXIgYm9vdCBpbmZvcm1hdGlvbiwgYXQgcGh5c2ljYWwgYWRkcmVzcyAwLCBzbyBkb24ndAorCSAqIHRvdWNoIGl0LiAqLwogfQogCi0vKiArIGFkZHIgKi8KKy8qTDozMTAgVG8gc2VuZCBETUEgaW50byB0aGUgR3Vlc3QsIHRoZSBMYXVuY2hlciBuZWVkcyB0byBiZSBhYmxlIHRvIGFzayBmb3IgYQorICogRE1BIGJ1ZmZlci4gIFRoaXMgaXMgZG9uZSBieSB3cml0aW5nIExIUkVRX0dFVERNQSBhbmQgdGhlIGtleSB0bworICogL2Rldi9sZ3Vlc3QuICovCiBzdGF0aWMgbG9uZyB1c2VyX2dldF9kbWEoc3RydWN0IGxndWVzdCAqbGcsIGNvbnN0IHUzMiBfX3VzZXIgKmlucHV0KQogewogCXVuc2lnbmVkIGxvbmcga2V5LCB1ZG1hLCBpcnE7CiAKKwkvKiBGZXRjaCB0aGUga2V5IHRoZXkgd3JvdGUgdG8gdXMuICovCiAJaWYgKGdldF91c2VyKGtleSwgaW5wdXQpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOworCS8qIExvb2sgZm9yIGEgZnJlZSBHdWVzdCBETUEgYnVmZmVyIGJvdW5kIHRvIHRoYXQga2V5LiAqLwogCXVkbWEgPSBnZXRfZG1hX2J1ZmZlcihsZywga2V5LCAmaXJxKTsKIAlpZiAoIXVkbWEpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JLyogV2UgcHV0IGlycSBudW1iZXIgaW4gdWRtYS0+dXNlZF9sZW4uICovCisJLyogV2UgbmVlZCB0byB0ZWxsIHRoZSBMYXVuY2hlciB3aGF0IGludGVycnVwdCB0aGUgR3Vlc3QgZXhwZWN0cyBhZnRlcgorCSAqIHRoZSBidWZmZXIgaXMgZmlsbGVkLiAgV2Ugc3Rhc2ggaXQgaW4gdWRtYS0+dXNlZF9sZW4uICovCiAJbGd3cml0ZV91MzIobGcsIHVkbWEgKyBvZmZzZXRvZihzdHJ1Y3QgbGd1ZXN0X2RtYSwgdXNlZF9sZW4pLCBpcnEpOworCisJLyogVGhlIChndWVzdC1waHlzaWNhbCkgYWRkcmVzcyBvZiB0aGUgRE1BIGJ1ZmZlciBpcyByZXR1cm5lZCBmcm9tCisJICogdGhlIHdyaXRlKCkuICovCiAJcmV0dXJuIHVkbWE7CiB9CiAKLS8qIFRvIGZvcmNlIHRoZSBHdWVzdCB0byBzdG9wIHJ1bm5pbmcgYW5kIHJldHVybiB0byB0aGUgTGF1bmNoZXIsIHRoZQorLypMOjMxNSBUbyBmb3JjZSB0aGUgR3Vlc3QgdG8gc3RvcCBydW5uaW5nIGFuZCByZXR1cm4gdG8gdGhlIExhdW5jaGVyLCB0aGUKICAqIFdha2VyIHNldHMgd3JpdGVzIExIUkVRX0JSRUFLIGFuZCB0aGUgdmFsdWUgIjEiIHRvIC9kZXYvbGd1ZXN0LiAgVGhlCiAgKiBMYXVuY2hlciB0aGVuIHdyaXRlcyBMSFJFUV9CUkVBSyBhbmQgIjAiIHRvIHJlbGVhc2UgdGhlIFdha2VyLiAqLwogc3RhdGljIGludCBicmVha19ndWVzdF9vdXQoc3RydWN0IGxndWVzdCAqbGcsIGNvbnN0IHUzMiBfX3VzZXIgKmlucHV0KQpAQCAtNTQsNyArODgsOCBAQAogCX0KIH0KIAotLyogKyBpcnEgKi8KKy8qTDowNTAgU2VuZGluZyBhbiBpbnRlcnJ1cHQgaXMgZG9uZSBieSB3cml0aW5nIExIUkVRX0lSUSBhbmQgYW4gaW50ZXJydXB0CisgKiBudW1iZXIgdG8gL2Rldi9sZ3Vlc3QuICovCiBzdGF0aWMgaW50IHVzZXJfc2VuZF9pcnEoc3RydWN0IGxndWVzdCAqbGcsIGNvbnN0IHUzMiBfX3VzZXIgKmlucHV0KQogewogCXUzMiBpcnE7CkBAIC02MywxNCArOTgsMTkgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKGlycSA+PSBMR1VFU1RfSVJRUykKIAkJcmV0dXJuIC1FSU5WQUw7CisJLyogTmV4dCB0aW1lIHRoZSBHdWVzdCBydW5zLCB0aGUgY29yZSBjb2RlIHdpbGwgc2VlIGlmIGl0IGNhbiBkZWxpdmVyCisJICogdGhpcyBpbnRlcnJ1cHQuICovCiAJc2V0X2JpdChpcnEsIGxnLT5pcnFzX3BlbmRpbmcpOwogCXJldHVybiAwOwogfQogCisvKkw6MDQwIE9uY2Ugb3VyIEd1ZXN0IGlzIGluaXRpYWxpemVkLCB0aGUgTGF1bmNoZXIgbWFrZXMgaXQgcnVuIGJ5IHJlYWRpbmcKKyAqIGZyb20gL2Rldi9sZ3Vlc3QuICovCiBzdGF0aWMgc3NpemVfdCByZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlciwgc2l6ZV90IHNpemUsbG9mZl90Km8pCiB7CiAJc3RydWN0IGxndWVzdCAqbGcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKKwkvKiBZb3UgbXVzdCB3cml0ZSBMSFJFUV9JTklUSUFMSVpFIGZpcnN0ISAqLwogCWlmICghbGcpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03OCwyNyArMTE4LDUyIEBACiAJaWYgKGN1cnJlbnQgIT0gbGctPnRzaykKIAkJcmV0dXJuIC1FUEVSTTsKIAorCS8qIElmIHRoZSBndWVzdCBpcyBhbHJlYWR5IGRlYWQsIHdlIGluZGljYXRlIHdoeSAqLwogCWlmIChsZy0+ZGVhZCkgewogCQlzaXplX3QgbGVuOwogCisJCS8qIGxnLT5kZWFkIGVpdGhlciBjb250YWlucyBhbiBlcnJvciBjb2RlLCBvciBhIHN0cmluZy4gKi8KIAkJaWYgKElTX0VSUihsZy0+ZGVhZCkpCiAJCQlyZXR1cm4gUFRSX0VSUihsZy0+ZGVhZCk7CiAKKwkJLyogV2UgY2FuIG9ubHkgcmV0dXJuIGFzIG11Y2ggYXMgdGhlIGJ1ZmZlciB0aGV5IHJlYWQgd2l0aC4gKi8KIAkJbGVuID0gbWluKHNpemUsIHN0cmxlbihsZy0+ZGVhZCkrMSk7CiAJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgbGctPmRlYWQsIGxlbikgIT0gMCkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gbGVuOwogCX0KIAorCS8qIElmIHdlIHJldHVybmVkIGZyb20gcmVhZCgpIGxhc3QgdGltZSBiZWNhdXNlIHRoZSBHdWVzdCBzZW50IERNQSwKKwkgKiBjbGVhciB0aGUgZmxhZy4gKi8KIAlpZiAobGctPmRtYV9pc19wZW5kaW5nKQogCQlsZy0+ZG1hX2lzX3BlbmRpbmcgPSAwOwogCisJLyogUnVuIHRoZSBHdWVzdCB1bnRpbCBzb21ldGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVucy4gKi8KIAlyZXR1cm4gcnVuX2d1ZXN0KGxnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil1c2VyKTsKIH0KIAotLyogVGFrZTogcGZubGltaXQsIHBnZGlyLCBzdGFydCwgcGFnZW9mZnNldC4gKi8KKy8qTDowMjAgVGhlIGluaXRpYWxpemF0aW9uIHdyaXRlIHN1cHBsaWVzIDQgMzItYml0IHZhbHVlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgKiAzMi1iaXQgTEhSRVFfSU5JVElBTElaRSB2YWx1ZSkuICBUaGVzZSBhcmU6CisgKgorICogcGZubGltaXQ6IFRoZSBoaWdoZXN0IChHdWVzdC1waHlzaWNhbCkgcGFnZSBudW1iZXIgdGhlIEd1ZXN0IHNob3VsZCBiZQorICogYWxsb3dlZCB0byBhY2Nlc3MuICBUaGUgTGF1bmNoZXIgaGFzIHRvIGxpdmUgaW4gR3Vlc3QgbWVtb3J5LCBzbyBpdCBzZXRzCisgKiB0aGlzIHRvIGVuc3VyZSB0aGUgR3Vlc3QgY2FuJ3QgcmVhY2ggaXQuCisgKgorICogcGdkaXI6IFRoZSAoR3Vlc3QtcGh5c2ljYWwpIGFkZHJlc3Mgb2YgdGhlIHRvcCBvZiB0aGUgaW5pdGlhbCBHdWVzdAorICogcGFnZXRhYmxlcyAod2hpY2ggYXJlIHNldCB1cCBieSB0aGUgTGF1bmNoZXIpLgorICoKKyAqIHN0YXJ0OiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSAoImVpcCIgaW4geDg2LXNwZWFrKS4KKyAqCisgKiBwYWdlX29mZnNldDogVGhlIFBBR0VfT0ZGU0VUIGNvbnN0YW50IGluIHRoZSBHdWVzdCBrZXJuZWwuICBXZSBzaG91bGQKKyAqIHByb2JhYmx5IHdlYW4gdGhlIGNvZGUgb2ZmIHRoaXMsIGJ1dCBpdCdzIGEgdmVyeSB1c2VmdWwgY29uc3RhbnQhICBBbnkKKyAqIGFkZHJlc3MgYWJvdmUgdGhpcyBpcyB3aXRoaW4gdGhlIEd1ZXN0IGtlcm5lbCwgYW5kIGFueSBrZXJuZWwgYWRkcmVzcyBjYW4KKyAqIHF1aWNrbHkgY29udmVydGVkIGZyb20gcGh5c2ljYWwgdG8gdmlydHVhbCBieSBhZGRpbmcgUEFHRV9PRkZTRVQuICBJdCdzCisgKiAweEMwMDAwMDAwICgzRykgYnkgZGVmYXVsdCwgYnV0IGl0J3MgY29uZmlndXJhYmxlIGF0IGtlcm5lbCBidWlsZCB0aW1lLgorICovCiBzdGF0aWMgaW50IGluaXRpYWxpemUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHUzMiBfX3VzZXIgKmlucHV0KQogeworCS8qICJzdHJ1Y3QgbGd1ZXN0IiBjb250YWlucyBldmVyeXRoaW5nIHdlICh0aGUgSG9zdCkga25vdyBhYm91dCBhCisJICogR3Vlc3QuICovCiAJc3RydWN0IGxndWVzdCAqbGc7CiAJaW50IGVyciwgaTsKIAl1MzIgYXJnc1s0XTsKQEAgLTEwNiw3ICsxNzEsNyBAQAogCS8qIFdlIGdyYWIgdGhlIEJpZyBMZ3Vlc3QgbG9jaywgd2hpY2ggcHJvdGVjdHMgdGhlIGdsb2JhbCBhcnJheQogCSAqICJsZ3Vlc3RzIiBhbmQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGluaXRpYWxpemF0aW9ucy4gKi8KIAltdXRleF9sb2NrKCZsZ3Vlc3RfbG9jayk7Ci0KKwkvKiBZb3UgY2FuJ3QgaW5pdGlhbGl6ZSB0d2ljZSEgIENsb3NlIHRoZSBkZXZpY2UgYW5kIHN0YXJ0IGFnYWluLi4uICovCiAJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkgewogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gdW5sb2NrOwpAQCAtMTE3LDM3ICsxODIsNzAgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCisJLyogRmluZCBhbiB1bnVzZWQgZ3Vlc3QuICovCiAJaSA9IGZpbmRfZnJlZV9ndWVzdCgpOwogCWlmIChpIDwgMCkgewogCQllcnIgPSAtRU5PU1BDOwogCQlnb3RvIHVubG9jazsKIAl9CisJLyogT0ssIHdlIGhhdmUgYW4gaW5kZXggaW50byB0aGUgImxndWVzdCIgYXJyYXk6ICJsZyIgaXMgYSBjb252ZW5pZW50CisJICogcG9pbnRlci4gKi8KIAlsZyA9ICZsZ3Vlc3RzW2ldOworCisJLyogUG9wdWxhdGUgdGhlIGVhc3kgZmllbGRzIG9mIG91ciAic3RydWN0IGxndWVzdCIgKi8KIAlsZy0+Z3Vlc3RpZCA9IGk7CiAJbGctPnBmbl9saW1pdCA9IGFyZ3NbMF07CiAJbGctPnBhZ2Vfb2Zmc2V0ID0gYXJnc1szXTsKKworCS8qIFdlIG5lZWQgYSBjb21wbGV0ZSBwYWdlIGZvciB0aGUgR3Vlc3QgcmVnaXN0ZXJzOiB0aGV5IGFyZSBhY2Nlc3NpYmxlCisJICogdG8gdGhlIEd1ZXN0IGFuZCB3ZSBjYW4gb25seSBncmFudCBpdCBhY2Nlc3MgdG8gd2hvbGUgcGFnZXMuICovCiAJbGctPnJlZ3NfcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWxnLT5yZWdzX3BhZ2UpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byByZWxlYXNlX2d1ZXN0OwogCX0KKwkvKiBXZSBhY3R1YWxseSBwdXQgdGhlIHJlZ2lzdGVycyBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLiAqLwogCWxnLT5yZWdzID0gKHZvaWQgKilsZy0+cmVnc19wYWdlICsgUEFHRV9TSVpFIC0gc2l6ZW9mKCpsZy0+cmVncyk7CiAKKwkvKiBJbml0aWFsaXplIHRoZSBHdWVzdCdzIHNoYWRvdyBwYWdlIHRhYmxlcywgdXNpbmcgdGhlIHRvcGxldmVsCisJICogYWRkcmVzcyB0aGUgTGF1bmNoZXIgZ2F2ZSB1cy4gIFRoaXMgYWxsb2NhdGVzIG1lbW9yeSwgc28gY2FuCisJICogZmFpbC4gKi8KIAllcnIgPSBpbml0X2d1ZXN0X3BhZ2V0YWJsZShsZywgYXJnc1sxXSk7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX3JlZ3M7CiAKKwkvKiBOb3cgd2UgaW5pdGlhbGl6ZSB0aGUgR3Vlc3QncyByZWdpc3RlcnMsIGhhbmRpbmcgaXQgdGhlIHN0YXJ0CisJICogYWRkcmVzcy4gKi8KIAlzZXR1cF9yZWdzKGxnLT5yZWdzLCBhcmdzWzJdKTsKKworCS8qIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBHRFQgZW50cmllcyB0aGUgR3Vlc3QgZXhwZWN0cyB3aGVuIGZpcnN0CisJICogYm9vdGluZy4gKi8KIAlzZXR1cF9ndWVzdF9nZHQobGcpOworCisJLyogVGhlIHRpbWVyIGZvciBsZ3Vlc3QncyBjbG9jayBuZWVkcyBpbml0aWFsaXphdGlvbi4gKi8KIAlpbml0X2Nsb2NrZGV2KGxnKTsKKworCS8qIFdlIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBMYXVuY2hlciB0YXNrIChpZS4gY3VycmVudCB0YXNrKSBmb3Igd2hlbgorCSAqIG90aGVyIEd1ZXN0cyB3YW50IHRvIHdha2UgdGhpcyBvbmUgKGludGVyLUd1ZXN0IEkvTykuICovCiAJbGctPnRzayA9IGN1cnJlbnQ7CisJLyogV2UgbmVlZCB0byBrZWVwIGEgcG9pbnRlciB0byB0aGUgTGF1bmNoZXIncyBtZW1vcnkgbWFwLCBiZWNhdXNlIGlmCisJICogdGhlIExhdW5jaGVyIGRpZXMgd2UgbmVlZCB0byBjbGVhbiBpdCB1cC4gIElmIHdlIGRvbid0IGtlZXAgYQorCSAqIHJlZmVyZW5jZSwgaXQgaXMgZGVzdHJveWVkIGJlZm9yZSBjbG9zZSgpIGlzIGNhbGxlZC4gKi8KIAlsZy0+bW0gPSBnZXRfdGFza19tbShsZy0+dHNrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHF1ZXVlIGZvciB0aGUgd2FrZXIgdG8gd2FpdCBvbiAqLwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxnLT5icmVha193cSk7CisKKwkvKiBXZSByZW1lbWJlciB3aGljaCBDUFUncyBwYWdlcyB0aGlzIEd1ZXN0IHVzZWQgbGFzdCwgZm9yIG9wdGltaXphdGlvbgorCSAqIHdoZW4gdGhlIHNhbWUgR3Vlc3QgcnVucyBvbiB0aGUgc2FtZSBDUFUgdHdpY2UuICovCiAJbGctPmxhc3RfcGFnZXMgPSBOVUxMOworCisJLyogV2Uga2VlcCBvdXIgInN0cnVjdCBsZ3Vlc3QiIGluIHRoZSBmaWxlJ3MgcHJpdmF0ZV9kYXRhLiAqLwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGxnOwogCiAJbXV0ZXhfdW5sb2NrKCZsZ3Vlc3RfbG9jayk7CiAKKwkvKiBBbmQgYmVjYXVzZSB0aGlzIGlzIGEgd3JpdGUoKSBjYWxsLCB3ZSByZXR1cm4gdGhlIGxlbmd0aCB1c2VkLiAqLwogCXJldHVybiBzaXplb2YoYXJncyk7CiAKIGZyZWVfcmVnczoKQEAgLTE1OSw5ICsyNTcsMTUgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKkw6MDEwIFRoZSBmaXJzdCBvcGVyYXRpb24gdGhlIExhdW5jaGVyIGRvZXMgbXVzdCBiZSBhIHdyaXRlLiAgQWxsIHdyaXRlcworICogc3RhcnQgd2l0aCBhIDMyIGJpdCBudW1iZXI6IGZvciB0aGUgZmlyc3Qgd3JpdGUgdGhpcyBtdXN0IGJlCisgKiBMSFJFUV9JTklUSUFMSVpFIHRvIHNldCB1cCB0aGUgR3Vlc3QuICBBZnRlciB0aGF0IHRoZSBMYXVuY2hlciBjYW4gdXNlCisgKiB3cml0ZXMgb2Ygb3RoZXIgdmFsdWVzIHRvIGdldCBETUEgYnVmZmVycyBhbmQgc2VuZCBpbnRlcnJ1cHRzLiAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICppbnB1dCwKIAkJICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpvZmYpCiB7CisJLyogT25jZSB0aGUgZ3Vlc3QgaXMgaW5pdGlhbGl6ZWQsIHdlIGhvbGQgdGhlICJzdHJ1Y3QgbGd1ZXN0IiBpbiB0aGUKKwkgKiBmaWxlIHByaXZhdGUgZGF0YS4gKi8KIAlzdHJ1Y3QgbGd1ZXN0ICpsZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAl1MzIgcmVxOwogCkBAIC0xNjksOCArMjczLDExIEBACiAJCXJldHVybiAtRUZBVUxUOwogCWlucHV0ICs9IHNpemVvZihyZXEpOwogCisJLyogSWYgeW91IGhhdmVuJ3QgaW5pdGlhbGl6ZWQsIHlvdSBtdXN0IGRvIHRoYXQgZmlyc3QuICovCiAJaWYgKHJlcSAhPSBMSFJFUV9JTklUSUFMSVpFICYmICFsZykKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPbmNlIHRoZSBHdWVzdCBpcyBkZWFkLCBhbGwgeW91IGNhbiBkbyBpcyByZWFkKCkgd2h5IGl0IGRpZWQuICovCiAJaWYgKGxnICYmIGxnLT5kZWFkKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTkyLDMzICsyOTksNzIgQEAKIAl9CiB9CiAKKy8qTDowNjAgVGhlIGZpbmFsIHBpZWNlIG9mIGludGVyZmFjZSBjb2RlIGlzIHRoZSBjbG9zZSgpIHJvdXRpbmUuICBJdCByZXZlcnNlcworICogZXZlcnl0aGluZyBkb25lIGluIGluaXRpYWxpemUoKS4gIFRoaXMgaXMgdXN1YWxseSBjYWxsZWQgYmVjYXVzZSB0aGUKKyAqIExhdW5jaGVyIGV4aXRlZC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGNsb3NlIHJvdXRpbmUgcmV0dXJucyAwIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyOiBpdCBjYW4ndAorICogcmVhbGx5IGZhaWwsIGJ1dCBpdCBjYW4gd2hpbmUuICBJIGJsYW1lIFN1biBmb3IgdGhpcyB3YXJ0LCBhbmQgSyZSIEMgZm9yCisgKiBsZXR0aW5nIHRoZW0gZG8gaXQuIDoqLwogc3RhdGljIGludCBjbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgbGd1ZXN0ICpsZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAorCS8qIElmIHdlIG5ldmVyIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCwgdGhlcmUncyBub3RoaW5nIHRvIGNsZWFuIHVwICovCiAJaWYgKCFsZykKIAkJcmV0dXJuIDA7CiAKKwkvKiBXZSBuZWVkIHRoZSBiaWcgbG9jaywgdG8gcHJvdGVjdCBmcm9tIGludGVyLWd1ZXN0IEkvTyBhbmQgb3RoZXIKKwkgKiBMYXVuY2hlcnMgaW5pdGlhbGl6aW5nIGd1ZXN0cy4gKi8KIAltdXRleF9sb2NrKCZsZ3Vlc3RfbG9jayk7CiAJLyogQ2FuY2VscyB0aGUgaHJ0aW1lciBzZXQgdmlhIExIQ0FMTF9TRVRfQ0xPQ0tFVkVOVC4gKi8KIAlocnRpbWVyX2NhbmNlbCgmbGctPmhydCk7CisJLyogRnJlZSBhbnkgRE1BIGJ1ZmZlcnMgdGhlIEd1ZXN0IGhhZCBib3VuZC4gKi8KIAlyZWxlYXNlX2FsbF9kbWEobGcpOworCS8qIEZyZWUgdXAgdGhlIHNoYWRvdyBwYWdlIHRhYmxlcyBmb3IgdGhlIEd1ZXN0LiAqLwogCWZyZWVfZ3Vlc3RfcGFnZXRhYmxlKGxnKTsKKwkvKiBOb3cgYWxsIHRoZSBtZW1vcnkgY2xlYW51cHMgYXJlIGRvbmUsIGl0J3Mgc2FmZSB0byByZWxlYXNlIHRoZQorCSAqIExhdW5jaGVyJ3MgbWVtb3J5IG1hbmFnZW1lbnQgc3RydWN0dXJlLiAqLwogCW1tcHV0KGxnLT5tbSk7CisJLyogSWYgbGctPmRlYWQgZG9lc24ndCBjb250YWluIGFuIGVycm9yIGNvZGUgaXQgd2lsbCBiZSBOVUxMIG9yIGEKKwkgKiBrbWFsbG9jKCllZCBzdHJpbmcsIGVpdGhlciBvZiB3aGljaCBpcyBvayB0byBoYW5kIHRvIGtmcmVlKCkuICovCiAJaWYgKCFJU19FUlIobGctPmRlYWQpKQogCQlrZnJlZShsZy0+ZGVhZCk7CisJLyogV2UgY2FuIGZyZWUgdXAgdGhlIHJlZ2lzdGVyIHBhZ2Ugd2UgYWxsb2NhdGVkLiAqLwogCWZyZWVfcGFnZShsZy0+cmVnc19wYWdlKTsKKwkvKiBXZSBjbGVhciB0aGUgZW50aXJlIHN0cnVjdHVyZSwgd2hpY2ggYWxzbyBtYXJrcyBpdCBhcyBmcmVlIGZvciB0aGUKKwkgKiBuZXh0IHVzZXIuICovCiAJbWVtc2V0KGxnLCAwLCBzaXplb2YoKmxnKSk7CisJLyogUmVsZWFzZSBsb2NrIGFuZCBleGl0LiAqLwogCW11dGV4X3VubG9jaygmbGd1ZXN0X2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKKy8qTDowMDAKKyAqIFdlbGNvbWUgdG8gb3VyIGpvdXJuZXkgdGhyb3VnaCB0aGUgTGF1bmNoZXIhCisgKgorICogVGhlIExhdW5jaGVyIGlzIHRoZSBIb3N0IHVzZXJzcGFjZSBwcm9ncmFtIHdoaWNoIHNldHMgdXAsIHJ1bnMgYW5kIHNlcnZpY2VzCisgKiB0aGUgR3Vlc3QuICBJbiBmYWN0LCBtYW55IGNvbW1lbnRzIGluIHRoZSBEcml2ZXJzIHdoaWNoIHJlZmVyIHRvICJ0aGUgSG9zdCIKKyAqIGRvaW5nIHRoaW5ncyBhcmUgaW5hY2N1cmF0ZTogdGhlIExhdW5jaGVyIGRvZXMgYWxsIHRoZSBkZXZpY2UgaGFuZGxpbmcgZm9yCisgKiB0aGUgR3Vlc3QuICBUaGUgR3Vlc3QgY2FuJ3QgdGVsbCB3aGF0J3MgZG9uZSBieSB0aGUgdGhlIExhdW5jaGVyIGFuZCB3aGF0IGJ5CisgKiB0aGUgSG9zdC4KKyAqCisgKiBKdXN0IHRvIGNvbmZ1c2UgeW91OiB0byB0aGUgSG9zdCBrZXJuZWwsIHRoZSBMYXVuY2hlciAqaXMqIHRoZSBHdWVzdCBhbmQgd2UKKyAqIHNoYWxsIHNlZSBtb3JlIG9mIHRoYXQgbGF0ZXIuCisgKgorICogV2UgYmVnaW4gb3VyIHVuZGVyc3RhbmRpbmcgd2l0aCB0aGUgSG9zdCBrZXJuZWwgaW50ZXJmYWNlIHdoaWNoIHRoZSBMYXVuY2hlcgorICogdXNlczogcmVhZGluZyBhbmQgd3JpdGluZyBhIGNoYXJhY3RlciBkZXZpY2UgY2FsbGVkIC9kZXYvbGd1ZXN0LiAgQWxsIHRoZQorICogd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCksIHdyaXRlKCkgYW5kIGNsb3NlKCkgcm91dGluZXM6ICovCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsZ3Vlc3RfZm9wcyA9IHsKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCiAJLnJlbGVhc2UgPSBjbG9zZSwKIAkud3JpdGUJID0gd3JpdGUsCiAJLnJlYWQJID0gcmVhZCwKIH07CisKKy8qIFRoaXMgaXMgYSB0ZXh0Ym9vayBleGFtcGxlIG9mIGEgIm1pc2MiIGNoYXJhY3RlciBkZXZpY2UuICBQb3B1bGF0ZSBhICJzdHJ1Y3QKKyAqIG1pc2NkZXZpY2UiIGFuZCByZWdpc3RlciBpdCB3aXRoIG1pc2NfcmVnaXN0ZXIoKS4gKi8KIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBsZ3Vlc3RfZGV2ID0gewogCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKIAkubmFtZQk9ICJsZ3Vlc3QiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvcGFnZV90YWJsZXMuYyBiL2RyaXZlcnMvbGd1ZXN0L3BhZ2VfdGFibGVzLmMKaW5kZXggMWIwYmEwOS4uYjdhOTI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvcGFnZV90YWJsZXMuYworKysgYi9kcml2ZXJzL2xndWVzdC9wYWdlX3RhYmxlcy5jCkBAIC0xLDUgKzEsMTEgQEAKLS8qIFNoYWRvdyBwYWdlIHRhYmxlIG9wZXJhdGlvbnMuCi0gKiBDb3B5cmlnaHQgKEMpIFJ1c3R5IFJ1c3NlbGwgSUJNIENvcnBvcmF0aW9uIDIwMDYuCisvKlA6NzAwIFRoZSBwYWdldGFibGUgY29kZSwgb24gdGhlIG90aGVyIGhhbmQsIHN0aWxsIHNob3dzIHRoZSBzY2FycyBvZgorICogcHJldmlvdXMgZW5jb3VudGVycy4gIEl0J3MgZnVuY3Rpb25hbCwgYW5kIGFzIG5lYXQgYXMgaXQgY2FuIGJlIGluIHRoZQorICogY2lyY3Vtc3RhbmNlcywgYnV0IGJlIHdhcnksIGZvciB0aGVzZSB0aGluZ3MgYXJlIHN1YnRsZSBhbmQgYnJlYWsgZWFzaWx5LgorICogVGhlIEd1ZXN0IHByb3ZpZGVzIGEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nLCBidXQgd2UgY2FuIG5laXRoZXIgdHJ1c3QKKyAqIGl0IG5vciB1c2UgaXQ6IHdlIHZlcmlmeSBhbmQgY29udmVydCBpdCBoZXJlIHRvIHBvaW50IHRoZSBoYXJkd2FyZSB0byB0aGUKKyAqIGFjdHVhbCBHdWVzdCBwYWdlcyB3aGVuIHJ1bm5pbmcgdGhlIEd1ZXN0LiA6Ki8KKworLyogQ29weXJpZ2h0IChDKSBSdXN0eSBSdXNzZWxsIElCTSBDb3Jwb3JhdGlvbiAyMDA2LgogICogR1BMIHYyIGFuZCBhbnkgbGF0ZXIgdmVyc2lvbiAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTksMzggKzE1LDk2IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSAibGcuaCIKIAorLypNOjAwOCBXZSBob2xkIHJlZmVyZW5jZSB0byBwYWdlcywgd2hpY2ggcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIHN3YXBwZWQuCisgKiBJdCdkIGJlIG5pY2UgdG8gaGF2ZSBhIGNhbGxiYWNrIGluIHRoZSAic3RydWN0IG1tX3N0cnVjdCIgd2hlbiBMaW51eCB3YW50cworICogdG8gc3dhcCBvdXQuICBJZiB3ZSBoYWQgdGhpcywgYW5kIGEgc2hyaW5rZXIgY2FsbGJhY2sgdG8gdHJpbSBQVEUgcGFnZXMsIHdlCisgKiBjb3VsZCBwcm9iYWJseSBjb25zaWRlciBsYXVuY2hpbmcgR3Vlc3RzIGFzIG5vbi1yb290LiA6Ki8KKworLypIOjMwMAorICogVGhlIFBhZ2UgVGFibGUgQ29kZQorICoKKyAqIFdlIHVzZSB0d28tbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBHdWVzdC4gIElmIHlvdSdyZSBub3QgZW50aXJlbHkKKyAqIGNvbWZvcnRhYmxlIHdpdGggdmlydHVhbCBhZGRyZXNzZXMsIHBoeXNpY2FsIGFkZHJlc3NlcyBhbmQgcGFnZSB0YWJsZXMgdGhlbgorICogSSByZWNvbW1lbmQgeW91IHJldmlldyBsZ3Vlc3QuYydzICJQYWdlIFRhYmxlIEhhbmRsaW5nIiAod2l0aCBkaWFncmFtcyEpLgorICoKKyAqIFRoZSBHdWVzdCBrZWVwcyBwYWdlIHRhYmxlcywgYnV0IHdlIG1haW50YWluIHRoZSBhY3R1YWwgb25lcyBoZXJlOiB0aGVzZSBhcmUKKyAqIGNhbGxlZCAic2hhZG93IiBwYWdlIHRhYmxlcy4gIFdoaWNoIGlzIGEgdmVyeSBHdWVzdC1jZW50cmljIG5hbWU6IHRoZXNlIGFyZQorICogdGhlIHJlYWwgcGFnZSB0YWJsZXMgdGhlIENQVSB1c2VzLCBhbHRob3VnaCB3ZSBrZWVwIHRoZW0gdXAgdG8gZGF0ZSB0bworICogcmVmbGVjdCB0aGUgR3Vlc3Qncy4gIChTZWUgd2hhdCBJIG1lYW4gYWJvdXQgd2VpcmQgbmFtaW5nPyAgU2luY2Ugd2hlbiBkbworICogc2hhZG93cyByZWZsZWN0IGFueXRoaW5nPykKKyAqCisgKiBBbnl3YXksIHRoaXMgaXMgdGhlIG1vc3QgY29tcGxpY2F0ZWQgcGFydCBvZiB0aGUgSG9zdCBjb2RlLiAgVGhlcmUgYXJlIHNldmVuCisgKiBwYXJ0cyB0byB0aGlzOgorICogIChpKSBTZXR0aW5nIHVwIGEgcGFnZSB0YWJsZSBlbnRyeSBmb3IgdGhlIEd1ZXN0IHdoZW4gaXQgZmF1bHRzLAorICogIChpaSkgU2V0dGluZyB1cCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBmb3IgdGhlIEd1ZXN0IHN0YWNrLAorICogIChpaWkpIFNldHRpbmcgdXAgYSBwYWdlIHRhYmxlIGVudHJ5IHdoZW4gdGhlIEd1ZXN0IHRlbGxzIHVzIGl0IGhhcyBjaGFuZ2VkLAorICogIChpdikgU3dpdGNoaW5nIHBhZ2UgdGFibGVzLAorICogICh2KSBGbHVzaGluZyAodGhvd2luZyBhd2F5KSBwYWdlIHRhYmxlcywKKyAqICAodmkpIE1hcHBpbmcgdGhlIFN3aXRjaGVyIHdoZW4gdGhlIEd1ZXN0IGlzIGFib3V0IHRvIHJ1biwKKyAqICAodmlpKSBTZXR0aW5nIHVwIHRoZSBwYWdlIHRhYmxlcyBpbml0aWFsbHkuCisgOiovCisKKy8qIFBhZ2VzIGEgNGsgbG9uZywgYW5kIGVhY2ggcGFnZSB0YWJsZSBlbnRyeSBpcyA0IGJ5dGVzIGxvbmcsIGdpdmluZyB1cyAxMDI0CisgKiAob3IgMl4xMCkgZW50cmllcyBwZXIgcGFnZS4gKi8KICNkZWZpbmUgUFRFU19QRVJfUEFHRV9TSElGVCAxMAogI2RlZmluZSBQVEVTX1BFUl9QQUdFICgxIDw8IFBURVNfUEVSX1BBR0VfU0hJRlQpCisKKy8qIDEwMjQgZW50cmllcyBpbiBhIHBhZ2UgdGFibGUgcGFnZSBtYXBzIDEwMjQgcGFnZXM6IDRNQi4gIFRoZSBTd2l0Y2hlciBpcworICogY29udmVuaWVudGx5IHBsYWNlZCBhdCB0aGUgdG9wIDRNQiwgc28gaXQgdXNlcyBhIHNlcGFyYXRlLCBjb21wbGV0ZSBQVEUKKyAqIHBhZ2UuICAqLwogI2RlZmluZSBTV0lUQ0hFUl9QR0RfSU5ERVggKFBURVNfUEVSX1BBR0UgLSAxKQogCisvKiBXZSBhY3R1YWxseSBuZWVkIGEgc2VwYXJhdGUgUFRFIHBhZ2UgZm9yIGVhY2ggQ1BVLiAgUmVtZW1iZXIgdGhhdCBhZnRlciB0aGUKKyAqIFN3aXRjaGVyIGNvZGUgaXRzZWxmIGNvbWVzIHR3byBwYWdlcyBmb3IgZWFjaCBDUFUsIGFuZCB3ZSBkb24ndCB3YW50IHRoaXMKKyAqIENQVSdzIGd1ZXN0IHRvIHNlZSB0aGUgcGFnZXMgb2YgYW55IG90aGVyIENQVS4gKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzcHRlX3QgKiwgc3dpdGNoZXJfcHRlX3BhZ2VzKTsKICNkZWZpbmUgc3dpdGNoZXJfcHRlX3BhZ2UoY3B1KSBwZXJfY3B1KHN3aXRjaGVyX3B0ZV9wYWdlcywgY3B1KQogCisvKkg6MzIwIFdpdGggb3VyIHNoYWRvdyBhbmQgR3Vlc3QgdHlwZXMgZXN0YWJsaXNoZWQsIHdlIG5lZWQgdG8gZGVhbCB3aXRoCisgKiB0aGVtOiB0aGUgcGFnZSB0YWJsZSBjb2RlIGlzIGN1cmx5IGVub3VnaCB0byBuZWVkIGhlbHBlciBmdW5jdGlvbnMgdG8ga2VlcAorICogaXQgY2xlYXIgYW5kIGNsZWFuLgorICoKKyAqIFRoZSBmaXJzdCBoZWxwZXIgdGFrZXMgYSB2aXJ0dWFsIGFkZHJlc3MsIGFuZCBzYXlzIHdoaWNoIGVudHJ5IGluIHRoZSB0b3AKKyAqIGxldmVsIHBhZ2UgdGFibGUgZGVhbHMgd2l0aCB0aGF0IGFkZHJlc3MuICBTaW5jZSBlYWNoIHRvcCBsZXZlbCBlbnRyeSBkZWFscworICogd2l0aCA0TSwgdGhpcyBlZmZlY3RpdmVseSBkaXZpZGVzIGJ5IDRNLiAqLwogc3RhdGljIHVuc2lnbmVkIHZhZGRyX3RvX3BnZF9pbmRleCh1bnNpZ25lZCBsb25nIHZhZGRyKQogewogCXJldHVybiB2YWRkciA+PiAoUEFHRV9TSElGVCArIFBURVNfUEVSX1BBR0VfU0hJRlQpOwogfQogCi0vKiBUaGVzZSBhY2Nlc3MgdGhlIHNoYWRvdyB2ZXJzaW9ucyAoaWUuIHRoZSBvbmVzIHVzZWQgYnkgdGhlIENQVSkuICovCisvKiBUaGVyZSBhcmUgdHdvIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gcG9pbnRlcnMgdG8gdGhlIHNoYWRvdyAoYWthICJyZWFsIikKKyAqIHBhZ2UgdGFibGVzLgorICoKKyAqIHNwZ2RfYWRkcigpIHRha2VzIHRoZSB2aXJ0dWFsIGFkZHJlc3MgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB0b3AtbGV2ZWwKKyAqIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciB0aGF0IGFkZHJlc3MuICBTaW5jZSB3ZSBrZWVwIHRyYWNrIG9mIHNldmVyYWwgcGFnZQorICogdGFibGVzLCB0aGUgImkiIGFyZ3VtZW50IHRlbGxzIHVzIHdoaWNoIG9uZSB3ZSdyZSBpbnRlcmVzdGVkIGluIChpdCdzCisgKiB1c3VhbGx5IHRoZSBjdXJyZW50IG9uZSkuICovCiBzdGF0aWMgc3BnZF90ICpzcGdkX2FkZHIoc3RydWN0IGxndWVzdCAqbGcsIHUzMiBpLCB1bnNpZ25lZCBsb25nIHZhZGRyKQogewogCXVuc2lnbmVkIGludCBpbmRleCA9IHZhZGRyX3RvX3BnZF9pbmRleCh2YWRkcik7CiAKKwkvKiBXZSBraWxsIGFueSBHdWVzdCB0cnlpbmcgdG8gdG91Y2ggdGhlIFN3aXRjaGVyIGFkZHJlc3Nlcy4gKi8KIAlpZiAoaW5kZXggPj0gU1dJVENIRVJfUEdEX0lOREVYKSB7CiAJCWtpbGxfZ3Vlc3QobGcsICJhdHRlbXB0IHRvIGFjY2VzcyBzd2l0Y2hlciBwYWdlcyIpOwogCQlpbmRleCA9IDA7CiAJfQorCS8qIFJldHVybiBhIHBvaW50ZXIgaW5kZXgndGggcGdkIGVudHJ5IGZvciB0aGUgaSd0aCBwYWdlIHRhYmxlLiAqLwogCXJldHVybiAmbGctPnBnZGlyc1tpXS5wZ2RpcltpbmRleF07CiB9CiAKKy8qIFRoaXMgcm91dGluZSB0aGVuIHRha2VzIHRoZSBQR0QgZW50cnkgZ2l2ZW4gYWJvdmUsIHdoaWNoIGNvbnRhaW5zIHRoZQorICogYWRkcmVzcyBvZiB0aGUgUFRFIHBhZ2UuICBJdCB0aGVuIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBQVEUgZW50cnkgZm9yIHRoZQorICogZ2l2ZW4gYWRkcmVzcy4gKi8KIHN0YXRpYyBzcHRlX3QgKnNwdGVfYWRkcihzdHJ1Y3QgbGd1ZXN0ICpsZywgc3BnZF90IHNwZ2QsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7CiAJc3B0ZV90ICpwYWdlID0gX192YShzcGdkLnBmbiA8PCBQQUdFX1NISUZUKTsKKwkvKiBZb3Ugc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBpZiB0aGUgUEdEIGVudHJ5IHdhc24ndCB2YWxpZCAqLwogCUJVR19PTighKHNwZ2QuZmxhZ3MgJiBfUEFHRV9QUkVTRU5UKSk7CiAJcmV0dXJuICZwYWdlWyh2YWRkciA+PiBQQUdFX1NISUZUKSAlIFBURVNfUEVSX1BBR0VdOwogfQogCi0vKiBUaGVzZSBhY2Nlc3MgdGhlIGd1ZXN0IHZlcnNpb25zLiAqLworLyogVGhlc2UgdHdvIGZ1bmN0aW9ucyBqdXN0IGxpa2UgdGhlIGFib3ZlIHR3bywgZXhjZXB0IHRoZXkgYWNjZXNzIHRoZSBHdWVzdAorICogcGFnZSB0YWJsZXMuICBIZW5jZSB0aGV5IHJldHVybiBhIEd1ZXN0IGFkZHJlc3MuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBncGdkX2FkZHIoc3RydWN0IGxndWVzdCAqbGcsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7CiAJdW5zaWduZWQgaW50IGluZGV4ID0gdmFkZHIgPj4gKFBBR0VfU0hJRlQgKyBQVEVTX1BFUl9QQUdFX1NISUZUKTsKQEAgLTU1LDEyICsxMTksMjQgQEAKIAlyZXR1cm4gZ3BhZ2UgKyAoKHZhZGRyPj5QQUdFX1NISUZUKSAlIFBURVNfUEVSX1BBR0UpICogc2l6ZW9mKGdwdGVfdCk7CiB9CiAKLS8qIERvIGEgdmlydHVhbCAtPiBwaHlzaWNhbCBtYXBwaW5nIG9uIGEgdXNlciBwYWdlLiAqLworLypIOjM1MCBUaGlzIHJvdXRpbmUgdGFrZXMgYSBwYWdlIG51bWJlciBnaXZlbiBieSB0aGUgR3Vlc3QgYW5kIGNvbnZlcnRzIGl0IHRvCisgKiBhbiBhY3R1YWwsIHBoeXNpY2FsIHBhZ2UgbnVtYmVyLiAgSXQgY2FuIGZhaWwgZm9yIHNldmVyYWwgcmVhc29uczogdGhlCisgKiB2aXJ0dWFsIGFkZHJlc3MgbWlnaHQgbm90IGJlIG1hcHBlZCBieSB0aGUgTGF1bmNoZXIsIHRoZSB3cml0ZSBmbGFnIGlzIHNldAorICogYW5kIHRoZSBwYWdlIGlzIHJlYWQtb25seSwgb3IgdGhlIHdyaXRlIGZsYWcgd2FzIHNldCBhbmQgdGhlIHBhZ2Ugd2FzCisgKiBzaGFyZWQgc28gaGFkIHRvIGJlIGNvcGllZCwgYnV0IHdlIHJhbiBvdXQgb2YgbWVtb3J5LgorICoKKyAqIFRoaXMgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UsIHNvIHJlbGVhc2VfcHRlKCkgaXMgY2FyZWZ1bCB0bworICogcHV0IHRoYXQgYmFjay4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9wZm4odW5zaWduZWQgbG9uZyB2aXJ0cGZuLCBpbnQgd3JpdGUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CisJLyogVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgZmFpbHVyZS4gKi8KIAl1bnNpZ25lZCBsb25nIHJldCA9IC0xVUw7CiAKKwkvKiBnZXRfdXNlcl9wYWdlcygpIGlzIGEgY29tcGxleCBpbnRlcmZhY2U6IGl0IGdldHMgdGhlICJzdHJ1Y3QKKwkgKiB2bV9hcmVhX3N0cnVjdCIgYW5kICJzdHJ1Y3QgcGFnZSIgYXNzb2NhdGVkIHdpdGggYSByYW5nZSBvZiBwYWdlcy4KKwkgKiBJdCBhbHNvIG5lZWRzIHRoZSB0YXNrJ3MgbW1hcF9zZW0gaGVsZCwgYW5kIGlzIG5vdCB2ZXJ5IHF1aWNrLgorCSAqIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBwYWdlcyBpdCBnb3QuICovCiAJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWlmIChnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgdmlydHBmbiA8PCBQQUdFX1NISUZULAogCQkJICAgMSwgd3JpdGUsIDEsICZwYWdlLCBOVUxMKSA9PSAxKQpAQCAtNjksMjggKzE0NSw0NyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qSDozNDAgQ29udmVydGluZyBhIEd1ZXN0IHBhZ2UgdGFibGUgZW50cnkgdG8gYSBzaGFkb3cgKGllLiByZWFsKSBwYWdlIHRhYmxlCisgKiBlbnRyeSBjYW4gYmUgYSBsaXR0bGUgdHJpY2t5LiAgVGhlIGZsYWdzIGFyZSAoYWxtb3N0KSB0aGUgc2FtZSwgYnV0IHRoZQorICogR3Vlc3QgUFRFIGNvbnRhaW5zIGEgdmlydHVhbCBwYWdlIG51bWJlcjogdGhlIENQVSBuZWVkcyB0aGUgcmVhbCBwYWdlCisgKiBudW1iZXIuICovCiBzdGF0aWMgc3B0ZV90IGdwdGVfdG9fc3B0ZShzdHJ1Y3QgbGd1ZXN0ICpsZywgZ3B0ZV90IGdwdGUsIGludCB3cml0ZSkKIHsKIAlzcHRlX3Qgc3B0ZTsKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAotCS8qIFdlIGlnbm9yZSB0aGUgZ2xvYmFsIGZsYWcuICovCisJLyogVGhlIEd1ZXN0IHNldHMgdGhlIGdsb2JhbCBmbGFnLCBiZWNhdXNlIGl0IHRoaW5rcyB0aGF0IGl0IGlzIHVzaW5nCisJICogUEdFLiAgV2Ugb25seSB0b2xkIGl0IHRvIHVzZSBQR0Ugc28gaXQgd291bGQgdGVsbCB1cyB3aGV0aGVyIGl0IHdhcworCSAqIGZsdXNoaW5nIGEga2VybmVsIG1hcHBpbmcgb3IgYSB1c2Vyc3BhY2UgbWFwcGluZy4gIFdlIGRvbid0IGFjdHVhbGx5CisJICogdXNlIHRoZSBnbG9iYWwgYml0LCBzbyB0aHJvdyBpdCBhd2F5LiAqLwogCXNwdGUuZmxhZ3MgPSAoZ3B0ZS5mbGFncyAmIH5fUEFHRV9HTE9CQUwpOworCisJLyogV2UgbmVlZCBhIHRlbXBvcmFyeSAidW5zaWduZWQgbG9uZyIgdmFyaWFibGUgdG8gaG9sZCB0aGUgYW5zd2VyIGZyb20KKwkgKiBnZXRfcGZuKCksIGJlY2F1c2UgaXQgcmV0dXJucyAweEZGRkZGRkZGIG9uIGZhaWx1cmUsIHdoaWNoIHdvdWxkbid0CisJICogZml0IGluIHNwdGUucGZuLiAgZ2V0X3BmbigpIGZpbmRzIHRoZSByZWFsIHBoeXNpY2FsIG51bWJlciBvZiB0aGUKKwkgKiBwYWdlLCBnaXZlbiB0aGUgdmlydHVhbCBudW1iZXIuICovCiAJcGZuID0gZ2V0X3BmbihncHRlLnBmbiwgd3JpdGUpOwogCWlmIChwZm4gPT0gLTFVTCkgewogCQlraWxsX2d1ZXN0KGxnLCAiZmFpbGVkIHRvIGdldCBwYWdlICV1IiwgZ3B0ZS5wZm4pOwotCQkvKiBNdXN0IG5vdCBwdXRfcGFnZSgpIGJvZ3VzIHBhZ2Ugb24gY2xlYW51cC4gKi8KKwkJLyogV2hlbiB3ZSBkZXN0cm95IHRoZSBHdWVzdCwgd2UnbGwgZ28gdGhyb3VnaCB0aGUgc2hhZG93IHBhZ2UKKwkJICogdGFibGVzIGFuZCByZWxlYXNlX3B0ZSgpIHRoZW0uICBNYWtlIHN1cmUgd2UgZG9uJ3QgdGhpbmsKKwkJICogdGhpcyBvbmUgaXMgdmFsaWQhICovCiAJCXNwdGUuZmxhZ3MgPSAwOwogCX0KKwkvKiBOb3cgd2UgYXNzaWduIHRoZSBwYWdlIG51bWJlciwgYW5kIG91ciBzaGFkb3cgUFRFIGlzIGNvbXBsZXRlLiAqLwogCXNwdGUucGZuID0gcGZuOwogCXJldHVybiBzcHRlOwogfQogCisvKkg6NDYwIEFuZCB0byBjb21wbGV0ZSB0aGUgY2hhaW4sIHJlbGVhc2VfcHRlKCkgbG9va3MgbGlrZSB0aGlzOiAqLwogc3RhdGljIHZvaWQgcmVsZWFzZV9wdGUoc3B0ZV90IHB0ZSkKIHsKKwkvKiBSZW1lbWJlciB0aGF0IGdldF91c2VyX3BhZ2VzKCkgdG9vayBhIHJlZmVyZW5jZSB0byB0aGUgcGFnZSwgaW4KKwkgKiBnZXRfcGZuKCk/ICBXZSBoYXZlIHRvIHB1dCBpdCBiYWNrIG5vdy4gKi8KIAlpZiAocHRlLmZsYWdzICYgX1BBR0VfUFJFU0VOVCkKIAkJcHV0X3BhZ2UocGZuX3RvX3BhZ2UocHRlLnBmbikpOwogfQorLyo6Ki8KIAogc3RhdGljIHZvaWQgY2hlY2tfZ3B0ZShzdHJ1Y3QgbGd1ZXN0ICpsZywgZ3B0ZV90IGdwdGUpCiB7CkBAIC0xMDQsMTEgKzE5OSwxNiBAQAogCQlraWxsX2d1ZXN0KGxnLCAiYmFkIHBhZ2UgZGlyZWN0b3J5IGVudHJ5Iik7CiB9CiAKLS8qIEZJWE1FOiBXZSBob2xkIHJlZmVyZW5jZSB0byBwYWdlcywgd2hpY2ggcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nCi0gICBzd2FwcGVkLiAgSXQnZCBiZSBuaWNlIHRvIGhhdmUgYSBjYWxsYmFjayB3aGVuIExpbnV4IHdhbnRzIHRvIHN3YXAgb3V0LiAqLwotCi0vKiBXZSBmYXVsdCBwYWdlcyBpbiwgd2hpY2ggYWxsb3dzIHVzIHRvIHVwZGF0ZSBhY2Nlc3NlZC9kaXJ0eSBiaXRzLgotICogUmV0dXJuIHRydWUgaWYgd2UgZ290IHBhZ2UuICovCisvKkg6MzMwCisgKiAoaSkgU2V0dGluZyB1cCBhIHBhZ2UgdGFibGUgZW50cnkgZm9yIHRoZSBHdWVzdCB3aGVuIGl0IGZhdWx0cworICoKKyAqIFdlIHNhdyB0aGlzIGNhbGwgaW4gcnVuX2d1ZXN0KCk6IHdoZW4gd2Ugc2VlIGEgcGFnZSBmYXVsdCBpbiB0aGUgR3Vlc3QsIHdlCisgKiBjb21lIGhlcmUuICBUaGF0J3MgYmVjYXVzZSB3ZSBvbmx5IHNldCB1cCB0aGUgc2hhZG93IHBhZ2UgdGFibGVzIGxhemlseSBhcworICogdGhleSdyZSBuZWVkZWQsIHNvIHdlIGdldCBwYWdlIGZhdWx0cyBhbGwgdGhlIHRpbWUgYW5kIHF1aWV0bHkgZml4IHRoZW0gdXAKKyAqIGFuZCByZXR1cm4gdG8gdGhlIEd1ZXN0IHdpdGhvdXQgaXQga25vd2luZy4KKyAqCisgKiBJZiB3ZSBmaXhlZCB1cCB0aGUgZmF1bHQgKGllLiB3ZSBtYXBwZWQgdGhlIGFkZHJlc3MpLCB0aGlzIHJvdXRpbmUgcmV0dXJucworICogdHJ1ZS4gKi8KIGludCBkZW1hbmRfcGFnZShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyB2YWRkciwgaW50IGVycmNvZGUpCiB7CiAJZ3BnZF90IGdwZ2Q7CkBAIC0xMTcsMTA2ICsyMTcsMTYxIEBACiAJZ3B0ZV90IGdwdGU7CiAJc3B0ZV90ICpzcHRlOwogCisJLyogRmlyc3Qgc3RlcDogZ2V0IHRoZSB0b3AtbGV2ZWwgR3Vlc3QgcGFnZSB0YWJsZSBlbnRyeS4gKi8KIAlncGdkID0gbWtncGdkKGxncmVhZF91MzIobGcsIGdwZ2RfYWRkcihsZywgdmFkZHIpKSk7CisJLyogVG9wbGV2ZWwgbm90IHByZXNlbnQ/ICBXZSBjYW4ndCBtYXAgaXQgaW4uICovCiAJaWYgKCEoZ3BnZC5mbGFncyAmIF9QQUdFX1BSRVNFTlQpKQogCQlyZXR1cm4gMDsKIAorCS8qIE5vdyBsb29rIGF0IHRoZSBtYXRjaGluZyBzaGFkb3cgZW50cnkuICovCiAJc3BnZCA9IHNwZ2RfYWRkcihsZywgbGctPnBnZGlkeCwgdmFkZHIpOwogCWlmICghKHNwZ2QtPmZsYWdzICYgX1BBR0VfUFJFU0VOVCkpIHsKLQkJLyogR2V0IGEgcGFnZSBvZiBQVEVzIGZvciB0aGVtLiAqLworCQkvKiBObyBzaGFkb3cgZW50cnk6IGFsbG9jYXRlIGEgbmV3IHNoYWRvdyBQVEUgcGFnZS4gKi8KIAkJdW5zaWduZWQgbG9uZyBwdGVwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQkvKiBGSVhNRTogU3RlYWwgZnJvbSBzZWxmIGluIHRoaXMgY2FzZT8gKi8KKwkJLyogVGhpcyBpcyBub3QgcmVhbGx5IHRoZSBHdWVzdCdzIGZhdWx0LCBidXQga2lsbGluZyBpdCBpcworCQkgKiBzaW1wbGUgZm9yIHRoaXMgY29ybmVyIGNhc2UuICovCiAJCWlmICghcHRlcGFnZSkgewogCQkJa2lsbF9ndWVzdChsZywgIm91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBwdGUgcGFnZSIpOwogCQkJcmV0dXJuIDA7CiAJCX0KKwkJLyogV2UgY2hlY2sgdGhhdCB0aGUgR3Vlc3QgcGdkIGlzIE9LLiAqLwogCQljaGVja19ncGdkKGxnLCBncGdkKTsKKwkJLyogQW5kIHdlIGNvcHkgdGhlIGZsYWdzIHRvIHRoZSBzaGFkb3cgUEdEIGVudHJ5LiAgVGhlIHBhZ2UKKwkJICogbnVtYmVyIGluIHRoZSBzaGFkb3cgUEdEIGlzIHRoZSBwYWdlIHdlIGp1c3QgYWxsb2NhdGVkLiAqLwogCQlzcGdkLT5yYXcudmFsID0gKF9fcGEocHRlcGFnZSkgfCBncGdkLmZsYWdzKTsKIAl9CiAKKwkvKiBPSywgbm93IHdlIGxvb2sgYXQgdGhlIGxvd2VyIGxldmVsIGluIHRoZSBHdWVzdCBwYWdlIHRhYmxlOiBrZWVwIGl0cworCSAqIGFkZHJlc3MsIGJlY2F1c2Ugd2UgbWlnaHQgdXBkYXRlIGl0IGxhdGVyLiAqLwogCWdwdGVfcHRyID0gZ3B0ZV9hZGRyKGxnLCBncGdkLCB2YWRkcik7CiAJZ3B0ZSA9IG1rZ3B0ZShsZ3JlYWRfdTMyKGxnLCBncHRlX3B0cikpOwogCi0JLyogTm8gcGFnZT8gKi8KKwkvKiBJZiB0aGlzIHBhZ2UgaXNuJ3QgaW4gdGhlIEd1ZXN0IHBhZ2UgdGFibGVzLCB3ZSBjYW4ndCBwYWdlIGl0IGluLiAqLwogCWlmICghKGdwdGUuZmxhZ3MgJiBfUEFHRV9QUkVTRU5UKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBXcml0ZSB0byByZWFkLW9ubHkgcGFnZT8gKi8KKwkvKiBDaGVjayB0aGV5J3JlIG5vdCB0cnlpbmcgdG8gd3JpdGUgdG8gYSBwYWdlIHRoZSBHdWVzdCB3YW50cworCSAqIHJlYWQtb25seSAoYml0IDIgb2YgZXJyY29kZSA9PSB3cml0ZSkuICovCiAJaWYgKChlcnJjb2RlICYgMikgJiYgIShncHRlLmZsYWdzICYgX1BBR0VfUlcpKQogCQlyZXR1cm4gMDsKIAotCS8qIFVzZXIgYWNjZXNzIHRvIGEgbm9uLXVzZXIgcGFnZT8gKi8KKwkvKiBVc2VyIGFjY2VzcyB0byBhIGtlcm5lbCBwYWdlPyAoYml0IDMgPT0gdXNlciBhY2Nlc3MpICovCiAJaWYgKChlcnJjb2RlICYgNCkgJiYgIShncHRlLmZsYWdzICYgX1BBR0VfVVNFUikpCiAJCXJldHVybiAwOwogCisJLyogQ2hlY2sgdGhhdCB0aGUgR3Vlc3QgUFRFIGZsYWdzIGFyZSBPSywgYW5kIHRoZSBwYWdlIG51bWJlciBpcyBiZWxvdworCSAqIHRoZSBwZm5fbGltaXQgKGllLiBub3QgbWFwcGluZyB0aGUgTGF1bmNoZXIgYmluYXJ5KS4gKi8KIAljaGVja19ncHRlKGxnLCBncHRlKTsKKwkvKiBBZGQgdGhlIF9QQUdFX0FDQ0VTU0VEIGFuZCAoZm9yIGEgd3JpdGUpIF9QQUdFX0RJUlRZIGZsYWcgKi8KIAlncHRlLmZsYWdzIHw9IF9QQUdFX0FDQ0VTU0VEOwogCWlmIChlcnJjb2RlICYgMikKIAkJZ3B0ZS5mbGFncyB8PSBfUEFHRV9ESVJUWTsKIAotCS8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgb2xkIHB0ZS4gKi8KKwkvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIHNoYWRvdyBQVEUgZW50cnkgd2UncmUgZ29pbmcgdG8gc2V0LiAqLwogCXNwdGUgPSBzcHRlX2FkZHIobGcsICpzcGdkLCB2YWRkcik7CisJLyogSWYgdGhlcmUgd2FzIGEgdmFsaWQgc2hhZG93IFBURSBlbnRyeSBoZXJlIGJlZm9yZSwgd2UgcmVsZWFzZSBpdC4KKwkgKiBUaGlzIGNhbiBoYXBwZW4gd2l0aCBhIHdyaXRlIHRvIGEgcHJldmlvdXNseSByZWFkLW9ubHkgZW50cnkuICovCiAJcmVsZWFzZV9wdGUoKnNwdGUpOwogCi0JLyogV2UgZG9uJ3QgbWFrZSBpdCB3cml0YWJsZSBpZiB0aGlzIGlzbid0IGEgd3JpdGU6IGxhdGVyCi0JICogd3JpdGUgd2lsbCBmYXVsdCBzbyB3ZSBjYW4gc2V0IGRpcnR5IGJpdCBpbiBndWVzdC4gKi8KKwkvKiBJZiB0aGlzIGlzIGEgd3JpdGUsIHdlIGluc2lzdCB0aGF0IHRoZSBHdWVzdCBwYWdlIGlzIHdyaXRhYmxlICh0aGUKKwkgKiBmaW5hbCBhcmcgdG8gZ3B0ZV90b19zcHRlKCkpLiAqLwogCWlmIChncHRlLmZsYWdzICYgX1BBR0VfRElSVFkpCiAJCSpzcHRlID0gZ3B0ZV90b19zcHRlKGxnLCBncHRlLCAxKTsKIAllbHNlIHsKKwkJLyogSWYgdGhpcyBpcyBhIHJlYWQsIGRvbid0IHNldCB0aGUgIndyaXRhYmxlIiBiaXQgaW4gdGhlIHBhZ2UKKwkJICogdGFibGUgZW50cnksIGV2ZW4gaWYgdGhlIEd1ZXN0IHNheXMgaXQncyB3cml0YWJsZS4gIFRoYXQgd2F5CisJCSAqIHdlIGNvbWUgYmFjayBoZXJlIHdoZW4gYSB3cml0ZSBkb2VzIGFjdHVhbGx5IG9jdXIsIHNvIHdlIGNhbgorCQkgKiB1cGRhdGUgdGhlIEd1ZXN0J3MgX1BBR0VfRElSVFkgZmxhZy4gKi8KIAkJZ3B0ZV90IHJvX2dwdGUgPSBncHRlOwogCQlyb19ncHRlLmZsYWdzICY9IH5fUEFHRV9SVzsKIAkJKnNwdGUgPSBncHRlX3RvX3NwdGUobGcsIHJvX2dwdGUsIDApOwogCX0KIAotCS8qIE5vdyB3ZSB1cGRhdGUgZGlydHkvYWNjZXNzZWQgb24gZ3Vlc3QuICovCisJLyogRmluYWxseSwgd2Ugd3JpdGUgdGhlIEd1ZXN0IFBURSBlbnRyeSBiYWNrOiB3ZSd2ZSBzZXQgdGhlCisJICogX1BBR0VfQUNDRVNTRUQgYW5kIG1heWJlIHRoZSBfUEFHRV9ESVJUWSBmbGFncy4gKi8KIAlsZ3dyaXRlX3UzMihsZywgZ3B0ZV9wdHIsIGdwdGUucmF3LnZhbCk7CisKKwkvKiBXZSBzdWNjZWVkZWQgaW4gbWFwcGluZyB0aGUgcGFnZSEgKi8KIAlyZXR1cm4gMTsKIH0KIAotLyogVGhpcyBpcyBtdWNoIGZhc3RlciB0aGFuIHRoZSBmdWxsIGRlbWFuZF9wYWdlIGxvZ2ljLiAqLworLypIOjM2MCAoaWkpIFNldHRpbmcgdXAgdGhlIHBhZ2UgdGFibGUgZW50cnkgZm9yIHRoZSBHdWVzdCBzdGFjay4KKyAqCisgKiBSZW1lbWJlciBwaW5fc3RhY2tfcGFnZXMoKSB3aGljaCBtYWtlcyBzdXJlIHRoZSBzdGFjayBpcyBtYXBwZWQ/ICBJdCBjb3VsZAorICogc2ltcGx5IGNhbGwgZGVtYW5kX3BhZ2UoKSwgYnV0IGFzIHdlJ3ZlIHNlZW4gdGhhdCBsb2dpYyBpcyBxdWl0ZSBsb25nLCBhbmQKKyAqIHVzdWFsbHkgdGhlIHN0YWNrIHBhZ2VzIGFyZSBhbHJlYWR5IG1hcHBlZCBhbnl3YXksIHNvIGl0J3Mgbm90IHJlcXVpcmVkLgorICoKKyAqIFRoaXMgaXMgYSBxdWljayB2ZXJzaW9uIHdoaWNoIGFuc3dlcnMgdGhlIHF1ZXN0aW9uOiBpcyB0aGlzIHZpcnR1YWwgYWRkcmVzcworICogbWFwcGVkIGJ5IHRoZSBzaGFkb3cgcGFnZSB0YWJsZXMsIGFuZCBpcyBpdCB3cml0YWJsZT8gKi8KIHN0YXRpYyBpbnQgcGFnZV93cml0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyB2YWRkcikKIHsKIAlzcGdkX3QgKnNwZ2Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCS8qIExvb2sgYXQgdGhlIHRvcCBsZXZlbCBlbnRyeTogaXMgaXQgcHJlc2VudD8gKi8KIAlzcGdkID0gc3BnZF9hZGRyKGxnLCBsZy0+cGdkaWR4LCB2YWRkcik7CiAJaWYgKCEoc3BnZC0+ZmxhZ3MgJiBfUEFHRV9QUkVTRU5UKSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBDaGVjayB0aGUgZmxhZ3Mgb24gdGhlIHB0ZSBlbnRyeSBpdHNlbGY6IGl0IG11c3QgYmUgcHJlc2VudCBhbmQKKwkgKiB3cml0YWJsZS4gKi8KIAlmbGFncyA9IHNwdGVfYWRkcihsZywgKnNwZ2QsIHZhZGRyKS0+ZmxhZ3M7CiAJcmV0dXJuIChmbGFncyAmIChfUEFHRV9QUkVTRU5UfF9QQUdFX1JXKSkgPT0gKF9QQUdFX1BSRVNFTlR8X1BBR0VfUlcpOwogfQogCisvKiBTbywgd2hlbiBwaW5fc3RhY2tfcGFnZXMoKSBhc2tzIHVzIHRvIHBpbiBhIHBhZ2UsIHdlIGNoZWNrIGlmIGl0J3MgYWxyZWFkeQorICogaW4gdGhlIHBhZ2UgdGFibGVzLCBhbmQgaWYgbm90LCB3ZSBjYWxsIGRlbWFuZF9wYWdlKCkgd2l0aCBlcnJvciBjb2RlIDIKKyAqIChtZWFuaW5nICJ3cml0ZSIpLiAqLwogdm9pZCBwaW5fcGFnZShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyB2YWRkcikKIHsKIAlpZiAoIXBhZ2Vfd3JpdGFibGUobGcsIHZhZGRyKSAmJiAhZGVtYW5kX3BhZ2UobGcsIHZhZGRyLCAyKSkKIAkJa2lsbF9ndWVzdChsZywgImJhZCBzdGFjayBwYWdlICUjbHgiLCB2YWRkcik7CiB9CiAKKy8qSDo0NTAgSWYgd2UgY2hhc2UgZG93biB0aGUgcmVsZWFzZV9wZ2QoKSBjb2RlLCBpdCBsb29rcyBsaWtlIHRoaXM6ICovCiBzdGF0aWMgdm9pZCByZWxlYXNlX3BnZChzdHJ1Y3QgbGd1ZXN0ICpsZywgc3BnZF90ICpzcGdkKQogeworCS8qIElmIHRoZSBlbnRyeSdzIG5vdCBwcmVzZW50LCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVsZWFzZS4gKi8KIAlpZiAoc3BnZC0+ZmxhZ3MgJiBfUEFHRV9QUkVTRU5UKSB7CiAJCXVuc2lnbmVkIGludCBpOworCQkvKiBDb252ZXJ0aW5nIHRoZSBwZm4gdG8gZmluZCB0aGUgYWN0dWFsIFBURSBwYWdlIGlzIGVhc3k6IHR1cm4KKwkJICogdGhlIHBhZ2UgbnVtYmVyIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIGNvbnZlcnQgdG8gYQorCQkgKiB2aXJ0dWFsIGFkZHJlc3MgKGVhc3kgZm9yIGtlcm5lbCBwYWdlcyBsaWtlIHRoaXMgb25lKS4gKi8KIAkJc3B0ZV90ICpwdGVwYWdlID0gX192YShzcGdkLT5wZm4gPDwgUEFHRV9TSElGVCk7CisJCS8qIEZvciBlYWNoIGVudHJ5IGluIHRoZSBwYWdlLCB3ZSBtaWdodCBuZWVkIHRvIHJlbGVhc2UgaXQuICovCiAJCWZvciAoaSA9IDA7IGkgPCBQVEVTX1BFUl9QQUdFOyBpKyspCiAJCQlyZWxlYXNlX3B0ZShwdGVwYWdlW2ldKTsKKwkJLyogTm93IHdlIGNhbiBmcmVlIHRoZSBwYWdlIG9mIFBURXMgKi8KIAkJZnJlZV9wYWdlKChsb25nKXB0ZXBhZ2UpOworCQkvKiBBbmQgemVybyBvdXQgdGhlIFBHRCBlbnRyeSB3ZSB3ZSBuZXZlciByZWxlYXNlIGl0IHR3aWNlLiAqLwogCQlzcGdkLT5yYXcudmFsID0gMDsKIAl9CiB9CiAKKy8qSDo0NDAgKHYpIEZsdXNoaW5nICh0aG93aW5nIGF3YXkpIHBhZ2UgdGFibGVzLAorICoKKyAqIFdlIHNhdyBmbHVzaF91c2VyX21hcHBpbmdzKCkgY2FsbGVkIHdoZW4gd2UgcmUtdXNlZCBhIHRvcC1sZXZlbCBwZ2RpciBwYWdlLgorICogSXQgc2ltcGx5IHJlbGVhc2VzIGV2ZXJ5IFBURSBwYWdlIGZyb20gMCB1cCB0byB0aGUga2VybmVsIGFkZHJlc3MuICovCiBzdGF0aWMgdm9pZCBmbHVzaF91c2VyX21hcHBpbmdzKHN0cnVjdCBsZ3Vlc3QgKmxnLCBpbnQgaWR4KQogewogCXVuc2lnbmVkIGludCBpOworCS8qIFJlbGVhc2UgZXZlcnkgcGdkIGVudHJ5IHVwIHRvIHRoZSBrZXJuZWwncyBhZGRyZXNzLiAqLwogCWZvciAoaSA9IDA7IGkgPCB2YWRkcl90b19wZ2RfaW5kZXgobGctPnBhZ2Vfb2Zmc2V0KTsgaSsrKQogCQlyZWxlYXNlX3BnZChsZywgbGctPnBnZGlyc1tpZHhdLnBnZGlyICsgaSk7CiB9CiAKKy8qIFRoZSBHdWVzdCBhbHNvIGhhcyBhIGh5cGVyY2FsbCB0byBkbyB0aGlzIG1hbnVhbGx5OiBpdCdzIHVzZWQgd2hlbiBhIGxhcmdlCisgKiBudW1iZXIgb2YgbWFwcGluZ3MgaGF2ZSBiZWVuIGNoYW5nZWQuICovCiB2b2lkIGd1ZXN0X3BhZ2V0YWJsZV9mbHVzaF91c2VyKHN0cnVjdCBsZ3Vlc3QgKmxnKQogeworCS8qIERyb3AgdGhlIHVzZXJzcGFjZSBwYXJ0IG9mIHRoZSBjdXJyZW50IHBhZ2UgdGFibGUuICovCiAJZmx1c2hfdXNlcl9tYXBwaW5ncyhsZywgbGctPnBnZGlkeCk7CiB9CisvKjoqLwogCisvKiBXZSBrZWVwIHNldmVyYWwgcGFnZSB0YWJsZXMuICBUaGlzIGlzIGEgc2ltcGxlIHJvdXRpbmUgdG8gZmluZCB0aGUgcGFnZQorICogdGFibGUgKGlmIGFueSkgY29ycmVzcG9uZGluZyB0byB0aGlzIHRvcC1sZXZlbCBhZGRyZXNzIHRoZSBHdWVzdCBoYXMgZ2l2ZW4KKyAqIHVzLiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX3BnZGlyKHN0cnVjdCBsZ3Vlc3QgKmxnLCB1bnNpZ25lZCBsb25nIHBndGFibGUpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0yMjYsMjEgKzM4MSwzMCBAQAogCXJldHVybiBpOwogfQogCisvKkg6NDM1IEFuZCB0aGlzIGlzIHVzLCBjcmVhdGluZyB0aGUgbmV3IHBhZ2UgZGlyZWN0b3J5LiAgSWYgd2UgcmVhbGx5IGRvCisgKiBhbGxvY2F0ZSBhIG5ldyBvbmUgKGFuZCBzbyB0aGUga2VybmVsIHBhcnRzIGFyZSBub3QgdGhlcmUpLCB3ZSBzZXQKKyAqIGJsYW5rX3BnZGlyLiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBuZXdfcGdkaXIoc3RydWN0IGxndWVzdCAqbGcsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGNyMywKIAkJCSAgICAgIGludCAqYmxhbmtfcGdkaXIpCiB7CiAJdW5zaWduZWQgaW50IG5leHQ7CiAKKwkvKiBXZSBwaWNrIG9uZSBlbnRyeSBhdCByYW5kb20gdG8gdGhyb3cgb3V0LiAgQ2hvb3NpbmcgdGhlIExlYXN0CisJICogUmVjZW50bHkgVXNlZCBtaWdodCBiZSBiZXR0ZXIsIGJ1dCB0aGlzIGlzIGVhc3kuICovCiAJbmV4dCA9IHJhbmRvbTMyKCkgJSBBUlJBWV9TSVpFKGxnLT5wZ2RpcnMpOworCS8qIElmIGl0J3MgbmV2ZXIgYmVlbiBhbGxvY2F0ZWQgYXQgYWxsIGJlZm9yZSwgdHJ5IG5vdy4gKi8KIAlpZiAoIWxnLT5wZ2RpcnNbbmV4dF0ucGdkaXIpIHsKIAkJbGctPnBnZGlyc1tuZXh0XS5wZ2RpciA9IChzcGdkX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCS8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLCBqdXN0IGtlZXAgdXNpbmcgdGhlIG9uZSB3ZSBoYXZlICovCiAJCWlmICghbGctPnBnZGlyc1tuZXh0XS5wZ2RpcikKIAkJCW5leHQgPSBsZy0+cGdkaWR4OwogCQllbHNlCi0JCQkvKiBUaGVyZSBhcmUgbm8gbWFwcGluZ3M6IHlvdSdsbCBuZWVkIHRvIHJlLXBpbiAqLworCQkJLyogVGhpcyBpcyBhIGJsYW5rIHBhZ2UsIHNvIHRoZXJlIGFyZSBubyBrZXJuZWwKKwkJCSAqIG1hcHBpbmdzOiBjYWxsZXIgbXVzdCBtYXAgdGhlIHN0YWNrISAqLwogCQkJKmJsYW5rX3BnZGlyID0gMTsKIAl9CisJLyogUmVjb3JkIHdoaWNoIEd1ZXN0IHRvcGxldmVsIHRoaXMgc2hhZG93cy4gKi8KIAlsZy0+cGdkaXJzW25leHRdLmNyMyA9IGNyMzsKIAkvKiBSZWxlYXNlIGFsbCB0aGUgbm9uLWtlcm5lbCBtYXBwaW5ncy4gKi8KIAlmbHVzaF91c2VyX21hcHBpbmdzKGxnLCBuZXh0KTsKQEAgLTI0OCw4MiArNDEyLDE2MSBAQAogCXJldHVybiBuZXh0OwogfQogCisvKkg6NDMwIChpdikgU3dpdGNoaW5nIHBhZ2UgdGFibGVzCisgKgorICogVGhpcyBpcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgR3Vlc3QgY2hhbmdlcyBwYWdlIHRhYmxlcyAoaWUuIGNoYW5nZXMgdGhlCisgKiB0b3AtbGV2ZWwgcGdkaXIpLiAgVGhpcyBoYXBwZW5zIG9uIGFsbW9zdCBldmVyeSBjb250ZXh0IHN3aXRjaC4gKi8KIHZvaWQgZ3Vlc3RfbmV3X3BhZ2V0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyBwZ3RhYmxlKQogewogCWludCBuZXdwZ2RpciwgcmVwaW4gPSAwOwogCisJLyogTG9vayB0byBzZWUgaWYgd2UgaGF2ZSB0aGlzIG9uZSBhbHJlYWR5LiAqLwogCW5ld3BnZGlyID0gZmluZF9wZ2RpcihsZywgcGd0YWJsZSk7CisJLyogSWYgbm90LCB3ZSBhbGxvY2F0ZSBvciBtdWcgYW4gZXhpc3Rpbmcgb25lOiBpZiBpdCdzIGEgZnJlc2ggb25lLAorCSAqIHJlcGluIGdldHMgc2V0IHRvIDEuICovCiAJaWYgKG5ld3BnZGlyID09IEFSUkFZX1NJWkUobGctPnBnZGlycykpCiAJCW5ld3BnZGlyID0gbmV3X3BnZGlyKGxnLCBwZ3RhYmxlLCAmcmVwaW4pOworCS8qIENoYW5nZSB0aGUgY3VycmVudCBwZ2QgaW5kZXggdG8gdGhlIG5ldyBvbmUuICovCiAJbGctPnBnZGlkeCA9IG5ld3BnZGlyOworCS8qIElmIGl0IHdhcyBjb21wbGV0ZWx5IGJsYW5rLCB3ZSBtYXAgaW4gdGhlIEd1ZXN0IGtlcm5lbCBzdGFjayAqLwogCWlmIChyZXBpbikKIAkJcGluX3N0YWNrX3BhZ2VzKGxnKTsKIH0KIAorLypIOjQ3MCBGaW5hbGx5LCBhIHJvdXRpbmUgd2hpY2ggdGhyb3dzIGF3YXkgZXZlcnl0aGluZzogYWxsIFBHRCBlbnRyaWVzIGluIGFsbAorICogdGhlIHNoYWRvdyBwYWdlIHRhYmxlcy4gIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGRlc3Ryb3kgdGhlIEd1ZXN0LiAqLwogc3RhdGljIHZvaWQgcmVsZWFzZV9hbGxfcGFnZXRhYmxlcyhzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAorCS8qIEV2ZXJ5IHNoYWRvdyBwYWdldGFibGUgdGhpcyBHdWVzdCBoYXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsZy0+cGdkaXJzKTsgaSsrKQogCQlpZiAobGctPnBnZGlyc1tpXS5wZ2RpcikKKwkJCS8qIEV2ZXJ5IFBHRCBlbnRyeSBleGNlcHQgdGhlIFN3aXRjaGVyIGF0IHRoZSB0b3AgKi8KIAkJCWZvciAoaiA9IDA7IGogPCBTV0lUQ0hFUl9QR0RfSU5ERVg7IGorKykKIAkJCQlyZWxlYXNlX3BnZChsZywgbGctPnBnZGlyc1tpXS5wZ2RpciArIGopOwogfQogCisvKiBXZSBhbHNvIHRocm93IGF3YXkgZXZlcnl0aGluZyB3aGVuIGEgR3Vlc3QgdGVsbHMgdXMgaXQncyBjaGFuZ2VkIGEga2VybmVsCisgKiBtYXBwaW5nLiAgU2luY2Uga2VybmVsIG1hcHBpbmdzIGFyZSBpbiBldmVyeSBwYWdlIHRhYmxlLCBpdCdzIGVhc2llc3QgdG8KKyAqIHRocm93IHRoZW0gYWxsIGF3YXkuICBUaGlzIGlzIGFtYXppbmdseSBzbG93LCBidXQgdGhhbmtmdWxseSByYXJlLiAqLwogdm9pZCBndWVzdF9wYWdldGFibGVfY2xlYXJfYWxsKHN0cnVjdCBsZ3Vlc3QgKmxnKQogewogCXJlbGVhc2VfYWxsX3BhZ2V0YWJsZXMobGcpOworCS8qIFdlIG5lZWQgdGhlIEd1ZXN0IGtlcm5lbCBzdGFjayBtYXBwZWQgYWdhaW4uICovCiAJcGluX3N0YWNrX3BhZ2VzKGxnKTsKIH0KIAorLypIOjQyMCBUaGlzIGlzIHRoZSByb3V0aW5lIHdoaWNoIGFjdHVhbGx5IHNldHMgdGhlIHBhZ2UgdGFibGUgZW50cnkgZm9yIHRoZW4KKyAqICJpZHgiJ3RoIHNoYWRvdyBwYWdlIHRhYmxlLgorICoKKyAqIE5vcm1hbGx5LCB3ZSBjYW4ganVzdCB0aHJvdyBvdXQgdGhlIG9sZCBlbnRyeSBhbmQgcmVwbGFjZSBpdCB3aXRoIDA6IGlmIHRoZXkKKyAqIHVzZSBpdCBkZW1hbmRfcGFnZSgpIHdpbGwgcHV0IHRoZSBuZXcgZW50cnkgaW4uICBXZSBuZWVkIHRvIGRvIHRoaXMgYW55d2F5OgorICogVGhlIEd1ZXN0IGV4cGVjdHMgX1BBR0VfQUNDRVNTRUQgdG8gYmUgc2V0IG9uIGl0cyBQVEUgdGhlIGZpcnN0IHRpbWUgYSBwYWdlCisgKiBpcyByZWFkIGZyb20sIGFuZCBfUEFHRV9ESVJUWSB3aGVuIGl0J3Mgd3JpdHRlbiB0by4KKyAqCisgKiBCdXQgQXZpIEtpdml0eSBwb2ludGVkIG91dCB0aGF0IG1vc3QgT3BlcmF0aW5nIFN5c3RlbXMgKExpbnV4IGluY2x1ZGVkKSBzZXQKKyAqIHRoZXNlIGJpdHMgb24gUFRFcyBpbW1lZGlhdGVseSBhbnl3YXkuICBUaGlzIGlzIGRvbmUgdG8gc2F2ZSB0aGUgQ1BVIGZyb20KKyAqIGhhdmluZyB0byB1cGRhdGUgdGhlbSwgYnV0IGl0IGhlbHBzIHVzIHRoZSBzYW1lIHdheTogaWYgdGhleSBzZXQKKyAqIF9QQUdFX0FDQ0VTU0VEIHRoZW4gd2UgY2FuIHB1dCBhIHJlYWQtb25seSBQVEUgZW50cnkgaW4gaW1tZWRpYXRlbHksIGFuZCBpZgorICogdGhleSBzZXQgX1BBR0VfRElSVFkgdGhlbiB3ZSBjYW4gcHV0IGEgd3JpdGFibGUgUFRFIGVudHJ5IGluIGltbWVkaWF0ZWx5LgorICovCiBzdGF0aWMgdm9pZCBkb19zZXRfcHRlKHN0cnVjdCBsZ3Vlc3QgKmxnLCBpbnQgaWR4LAogCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWRkciwgZ3B0ZV90IGdwdGUpCiB7CisJLyogTG9vayB1cCB0aGUgbWF0Y2hpbmcgc2hhZG93IHBhZ2UgZGlyZWN0b3QgZW50cnkuICovCiAJc3BnZF90ICpzcGdkID0gc3BnZF9hZGRyKGxnLCBpZHgsIHZhZGRyKTsKKworCS8qIElmIHRoZSB0b3AgbGV2ZWwgaXNuJ3QgcHJlc2VudCwgdGhlcmUncyBubyBlbnRyeSB0byB1cGRhdGUuICovCiAJaWYgKHNwZ2QtPmZsYWdzICYgX1BBR0VfUFJFU0VOVCkgeworCQkvKiBPdGhlcndpc2UsIHdlIHN0YXJ0IGJ5IHJlbGVhc2luZyB0aGUgZXhpc3RpbmcgZW50cnkuICovCiAJCXNwdGVfdCAqc3B0ZSA9IHNwdGVfYWRkcihsZywgKnNwZ2QsIHZhZGRyKTsKIAkJcmVsZWFzZV9wdGUoKnNwdGUpOworCisJCS8qIElmIHRoZXkncmUgc2V0dGluZyB0aGlzIGVudHJ5IGFzIGRpcnR5IG9yIGFjY2Vzc2VkLCB3ZSBtaWdodAorCQkgKiBhcyB3ZWxsIHB1dCB0aGF0IGVudHJ5IHRoZXkndmUgZ2l2ZW4gdXMgaW4gbm93LiAgVGhpcyBzaGF2ZXMKKwkJICogMTAlIG9mZiBhIGNvcHktb24td3JpdGUgbWljcm8tYmVuY2htYXJrLiAqLwogCQlpZiAoZ3B0ZS5mbGFncyAmIChfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEKSkgewogCQkJY2hlY2tfZ3B0ZShsZywgZ3B0ZSk7CiAJCQkqc3B0ZSA9IGdwdGVfdG9fc3B0ZShsZywgZ3B0ZSwgZ3B0ZS5mbGFncyZfUEFHRV9ESVJUWSk7CiAJCX0gZWxzZQorCQkJLyogT3RoZXJ3aXNlIHdlIGNhbiBkZW1hbmRfcGFnZSgpIGl0IGluIGxhdGVyLiAqLwogCQkJc3B0ZS0+cmF3LnZhbCA9IDA7CiAJfQogfQogCisvKkg6NDEwIFVwZGF0aW5nIGEgUFRFIGVudHJ5IGlzIGEgbGl0dGxlIHRyaWNraWVyLgorICoKKyAqIFdlIGtlZXAgdHJhY2sgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgcGFnZSB0YWJsZXMgKHRoZSBHdWVzdCB1c2VzIG9uZSBmb3IgZWFjaAorICogcHJvY2Vzcywgc28gaXQgbWFrZXMgc2Vuc2UgdG8gY2FjaGUgYXQgbGVhc3QgYSBmZXcpLiAgRWFjaCBvZiB0aGVzZSBoYXZlCisgKiBpZGVudGljYWwga2VybmVsIHBhcnRzOiBpZS4gZXZlcnkgbWFwcGluZyBhYm92ZSBQQUdFX09GRlNFVCBpcyB0aGUgc2FtZSBmb3IKKyAqIGFsbCBwcm9jZXNzZXMuICBTbyB3aGVuIHRoZSBwYWdlIHRhYmxlIGFib3ZlIHRoYXQgYWRkcmVzcyBjaGFuZ2VzLCB3ZSB1cGRhdGUKKyAqIGFsbCB0aGUgcGFnZSB0YWJsZXMsIG5vdCBqdXN0IHRoZSBjdXJyZW50IG9uZS4gIFRoaXMgaXMgcmFyZS4KKyAqCisgKiBUaGUgYmVuZWZpdCBpcyB0aGF0IHdoZW4gd2UgaGF2ZSB0byB0cmFjayBhIG5ldyBwYWdlIHRhYmxlLCB3ZSBjYW4gY29weSBrZWVwCisgKiBhbGwgdGhlIGtlcm5lbCBtYXBwaW5ncy4gIFRoaXMgc3BlZWRzIHVwIGNvbnRleHQgc3dpdGNoIGltbWVuc2VseS4gKi8KIHZvaWQgZ3Vlc3Rfc2V0X3B0ZShzdHJ1Y3QgbGd1ZXN0ICpsZywKIAkJICAgdW5zaWduZWQgbG9uZyBjcjMsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIGdwdGVfdCBncHRlKQogewotCS8qIEtlcm5lbCBtYXBwaW5ncyBtdXN0IGJlIGNoYW5nZWQgb24gYWxsIHRvcCBsZXZlbHMuICovCisJLyogS2VybmVsIG1hcHBpbmdzIG11c3QgYmUgY2hhbmdlZCBvbiBhbGwgdG9wIGxldmVscy4gIFNsb3csIGJ1dAorCSAqIGRvZXNuJ3QgaGFwcGVuIG9mdGVuLiAqLwogCWlmICh2YWRkciA+PSBsZy0+cGFnZV9vZmZzZXQpIHsKIAkJdW5zaWduZWQgaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxnLT5wZ2RpcnMpOyBpKyspCiAJCQlpZiAobGctPnBnZGlyc1tpXS5wZ2RpcikKIAkJCQlkb19zZXRfcHRlKGxnLCBpLCB2YWRkciwgZ3B0ZSk7CiAJfSBlbHNlIHsKKwkJLyogSXMgdGhpcyBwYWdlIHRhYmxlIG9uZSB3ZSBoYXZlIGEgc2hhZG93IGZvcj8gKi8KIAkJaW50IHBnZGlyID0gZmluZF9wZ2RpcihsZywgY3IzKTsKIAkJaWYgKHBnZGlyICE9IEFSUkFZX1NJWkUobGctPnBnZGlycykpCisJCQkvKiBJZiBzbywgZG8gdGhlIHVwZGF0ZS4gKi8KIAkJCWRvX3NldF9wdGUobGcsIHBnZGlyLCB2YWRkciwgZ3B0ZSk7CiAJfQogfQogCisvKkg6NDAwCisgKiAoaWlpKSBTZXR0aW5nIHVwIGEgcGFnZSB0YWJsZSBlbnRyeSB3aGVuIHRoZSBHdWVzdCB0ZWxscyB1cyBpdCBoYXMgY2hhbmdlZC4KKyAqCisgKiBKdXN0IGxpa2Ugd2UgZGlkIGluIGludGVycnVwdHNfYW5kX3RyYXBzLmMsIGl0IG1ha2VzIHNlbnNlIGZvciB1cyB0byBkZWFsCisgKiB3aXRoIHRoZSBvdGhlciBzaWRlIG9mIHBhZ2UgdGFibGVzIHdoaWxlIHdlJ3JlIGhlcmU6IHdoYXQgaGFwcGVucyB3aGVuIHRoZQorICogR3Vlc3QgYXNrcyBmb3IgYSBwYWdlIHRhYmxlIHRvIGJlIHVwZGF0ZWQ/CisgKgorICogV2UgYWxyZWFkeSBzYXcgdGhhdCBkZW1hbmRfcGFnZSgpIHdpbGwgZmlsbCBpbiB0aGUgc2hhZG93IHBhZ2UgdGFibGVzIHdoZW4KKyAqIG5lZWRlZCwgc28gd2UgY2FuIHNpbXBseSByZW1vdmUgc2hhZG93IHBhZ2UgdGFibGUgZW50cmllcyB3aGVuZXZlciB0aGUgR3Vlc3QKKyAqIHRlbGxzIHVzIHRoZXkndmUgY2hhbmdlZC4gIFdoZW4gdGhlIEd1ZXN0IHRyaWVzIHRvIHVzZSB0aGUgbmV3IGVudHJ5IGl0IHdpbGwKKyAqIGZhdWx0IGFuZCBkZW1hbmRfcGFnZSgpIHdpbGwgZml4IGl0IHVwLgorICoKKyAqIFNvIHdpdGggdGhhdCBpbiBtaW5kIGhlcmUncyBvdXIgY29kZSB0byB0byB1cGRhdGUgYSAodG9wLWxldmVsKSBQR0QgZW50cnk6CisgKi8KIHZvaWQgZ3Vlc3Rfc2V0X3BtZChzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyBjcjMsIHUzMiBpZHgpCiB7CiAJaW50IHBnZGlyOwogCisJLyogVGhlIGtlcm5lbCBzZWVtcyB0byB0cnkgdG8gaW5pdGlhbGl6ZSB0aGlzIGVhcmx5IG9uOiB3ZSBpZ25vcmUgaXRzCisJICogYXR0ZW1wdHMgdG8gbWFwIG92ZXIgdGhlIFN3aXRjaGVyLiAqLwogCWlmIChpZHggPj0gU1dJVENIRVJfUEdEX0lOREVYKQogCQlyZXR1cm47CiAKKwkvKiBJZiB0aGV5J3JlIHRhbGtpbmcgYWJvdXQgYSBwYWdlIHRhYmxlIHdlIGhhdmUgYSBzaGFkb3cgZm9yLi4uICovCiAJcGdkaXIgPSBmaW5kX3BnZGlyKGxnLCBjcjMpOwogCWlmIChwZ2RpciA8IEFSUkFZX1NJWkUobGctPnBnZGlycykpCisJCS8qIC4uLiB0aHJvdyBpdCBhd2F5LiAqLwogCQlyZWxlYXNlX3BnZChsZywgbGctPnBnZGlyc1twZ2Rpcl0ucGdkaXIgKyBpZHgpOwogfQogCisvKkg6NTAwICh2aWkpIFNldHRpbmcgdXAgdGhlIHBhZ2UgdGFibGVzIGluaXRpYWxseS4KKyAqCisgKiBXaGVuIGEgR3Vlc3QgaXMgZmlyc3QgY3JlYXRlZCwgdGhlIExhdW5jaGVyIHRlbGxzIHVzIHdoZXJlIHRoZSB0b3BsZXZlbCBvZgorICogaXRzIGZpcnN0IHBhZ2UgdGFibGUgaXMuICBXZSBzZXQgc29tZSB0aGluZ3MgdXAgaGVyZTogKi8KIGludCBpbml0X2d1ZXN0X3BhZ2V0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyBwZ3RhYmxlKQogewotCS8qIFdlIGFzc3VtZSB0aGlzIGluIGZsdXNoX3VzZXJfbWFwcGluZ3MsIHNvIGNoZWNrIG5vdyAqLworCS8qIEluIGZsdXNoX3VzZXJfbWFwcGluZ3MoKSB3ZSBsb29wIGZyb20gMCB0bworCSAqICJ2YWRkcl90b19wZ2RfaW5kZXgobGctPnBhZ2Vfb2Zmc2V0KSIuICBUaGlzIGFzc3VtZXMgaXQgd29uJ3QgaGl0CisJICogdGhlIFN3aXRjaGVyIG1hcHBpbmdzLCBzbyBjaGVjayB0aGF0IG5vdy4gKi8KIAlpZiAodmFkZHJfdG9fcGdkX2luZGV4KGxnLT5wYWdlX29mZnNldCkgPj0gU1dJVENIRVJfUEdEX0lOREVYKQogCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBXZSBzdGFydCBvbiB0aGUgZmlyc3Qgc2hhZG93IHBhZ2UgdGFibGUsIGFuZCBnaXZlIGl0IGEgYmxhbmsgUEdECisJICogcGFnZS4gKi8KIAlsZy0+cGdkaWR4ID0gMDsKIAlsZy0+cGdkaXJzW2xnLT5wZ2RpZHhdLmNyMyA9IHBndGFibGU7CiAJbGctPnBnZGlyc1tsZy0+cGdkaWR4XS5wZ2RpciA9IChzcGdkX3QqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKQEAgLTMzMiwzMyArNTc1LDQ4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFdoZW4gYSBHdWVzdCBkaWVzLCBvdXIgY2xlYW51cCBpcyBmYWlybHkgc2ltcGxlLiAqLwogdm9pZCBmcmVlX2d1ZXN0X3BhZ2V0YWJsZShzdHJ1Y3QgbGd1ZXN0ICpsZykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCS8qIFRocm93IGF3YXkgYWxsIHBhZ2UgdGFibGUgcGFnZXMuICovCiAJcmVsZWFzZV9hbGxfcGFnZXRhYmxlcyhsZyk7CisJLyogTm93IGZyZWUgdGhlIHRvcCBsZXZlbHM6IGZyZWVfcGFnZSgpIGNhbiBoYW5kbGUgMCBqdXN0IGZpbmUuICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGctPnBnZGlycyk7IGkrKykKIAkJZnJlZV9wYWdlKChsb25nKWxnLT5wZ2RpcnNbaV0ucGdkaXIpOwogfQogCi0vKiBDYWxsZXIgbXVzdCBiZSBwcmVlbXB0LXNhZmUgKi8KKy8qSDo0ODAgKHZpKSBNYXBwaW5nIHRoZSBTd2l0Y2hlciB3aGVuIHRoZSBHdWVzdCBpcyBhYm91dCB0byBydW4uCisgKgorICogVGhlIFN3aXRjaGVyIGFuZCB0aGUgdHdvIHBhZ2VzIGZvciB0aGlzIENQVSBuZWVkIHRvIGJlIGF2YWlsYWJsZSB0byB0aGUKKyAqIEd1ZXN0IChhbmQgbm90IHRoZSBwYWdlcyBmb3Igb3RoZXIgQ1BVcykuICBXZSBoYXZlIHRoZSBhcHByb3ByaWF0ZSBQVEUgcGFnZXMKKyAqIGZvciBlYWNoIENQVSBhbHJlYWR5IHNldCB1cCwgd2UganVzdCBuZWVkIHRvIGhvb2sgdGhlbSBpbi4gKi8KIHZvaWQgbWFwX3N3aXRjaGVyX2luX2d1ZXN0KHN0cnVjdCBsZ3Vlc3QgKmxnLCBzdHJ1Y3QgbGd1ZXN0X3BhZ2VzICpwYWdlcykKIHsKIAlzcHRlX3QgKnN3aXRjaGVyX3B0ZV9wYWdlID0gX19nZXRfY3B1X3Zhcihzd2l0Y2hlcl9wdGVfcGFnZXMpOwogCXNwZ2RfdCBzd2l0Y2hlcl9wZ2Q7CiAJc3B0ZV90IHJlZ3NfcHRlOwogCi0JLyogU2luY2Ugc3dpdGNoZXIgbGVzcyB0aGF0IDRNQiwgd2Ugc2ltcGx5IG11ZyB0b3AgcHRlIHBhZ2UuICovCisJLyogTWFrZSB0aGUgbGFzdCBQR0QgZW50cnkgZm9yIHRoaXMgR3Vlc3QgcG9pbnQgdG8gdGhlIFN3aXRjaGVyJ3MgUFRFCisJICogcGFnZSBmb3IgdGhpcyBDUFUgKHdpdGggYXBwcm9wcmlhdGUgZmxhZ3MpLiAqLwogCXN3aXRjaGVyX3BnZC5wZm4gPSBfX3BhKHN3aXRjaGVyX3B0ZV9wYWdlKSA+PiBQQUdFX1NISUZUOwogCXN3aXRjaGVyX3BnZC5mbGFncyA9IF9QQUdFX0tFUk5FTDsKIAlsZy0+cGdkaXJzW2xnLT5wZ2RpZHhdLnBnZGlyW1NXSVRDSEVSX1BHRF9JTkRFWF0gPSBzd2l0Y2hlcl9wZ2Q7CiAKLQkvKiBNYXAgb3VyIHJlZ3MgcGFnZSBvdmVyIHN0YWNrIHBhZ2UuICovCisJLyogV2UgYWxzbyBjaGFuZ2UgdGhlIFN3aXRjaGVyIFBURSBwYWdlLiAgV2hlbiB3ZSdyZSBydW5uaW5nIHRoZSBHdWVzdCwKKwkgKiB3ZSB3YW50IHRoZSBHdWVzdCdzICJyZWdzIiBwYWdlIHRvIGFwcGVhciB3aGVyZSB0aGUgZmlyc3QgU3dpdGNoZXIKKwkgKiBwYWdlIGZvciB0aGlzIENQVSBpcy4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uOiB3aGVuIHRoZSBTd2l0Y2hlcgorCSAqIHNhdmVzIHRoZSBHdWVzdCByZWdpc3RlcnMsIGl0IHNhdmVzIHRoZW0gaW50byB0aGUgZmlyc3QgcGFnZSBvZiB0aGlzCisJICogQ1BVJ3MgInN0cnVjdCBsZ3Vlc3RfcGFnZXMiOiBpZiB3ZSBtYWtlIHN1cmUgdGhlIEd1ZXN0J3MgcmVnaXN0ZXIKKwkgKiBwYWdlIGlzIGFscmVhZHkgbWFwcGVkIHRoZXJlLCB3ZSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlbSBvdXQKKwkgKiBhZ2Fpbi4gKi8KIAlyZWdzX3B0ZS5wZm4gPSBfX3BhKGxnLT5yZWdzX3BhZ2UpID4+IFBBR0VfU0hJRlQ7CiAJcmVnc19wdGUuZmxhZ3MgPSBfUEFHRV9LRVJORUw7CiAJc3dpdGNoZXJfcHRlX3BhZ2VbKHVuc2lnbmVkIGxvbmcpcGFnZXMvUEFHRV9TSVpFJVBURVNfUEVSX1BBR0VdCiAJCT0gcmVnc19wdGU7CiB9CisvKjoqLwogCiBzdGF0aWMgdm9pZCBmcmVlX3N3aXRjaGVyX3B0ZV9wYWdlcyh2b2lkKQogewpAQCAtMzY4LDYgKzYyNiwxMCBAQAogCQlmcmVlX3BhZ2UoKGxvbmcpc3dpdGNoZXJfcHRlX3BhZ2UoaSkpOwogfQogCisvKkg6NTIwIFNldHRpbmcgdXAgdGhlIFN3aXRjaGVyIFBURSBwYWdlIGZvciBnaXZlbiBDUFUgaXMgZmFpcmx5IGVhc3ksIGdpdmVuCisgKiB0aGUgQ1BVIG51bWJlciBhbmQgdGhlICJzdHJ1Y3QgcGFnZSJzIGZvciB0aGUgU3dpdGNoZXIgY29kZSBpdHNlbGYuCisgKgorICogQ3VycmVudGx5IHRoZSBTd2l0Y2hlciBpcyBsZXNzIHRoYW4gYSBwYWdlIGxvbmcsIHNvICJwYWdlcyIgaXMgYWx3YXlzIDEuICovCiBzdGF0aWMgX19pbml0IHZvaWQgcG9wdWxhdGVfc3dpdGNoZXJfcHRlX3BhZ2UodW5zaWduZWQgaW50IGNwdSwKIAkJCQkJICAgICAgc3RydWN0IHBhZ2UgKnN3aXRjaGVyX3BhZ2VbXSwKIAkJCQkJICAgICAgdW5zaWduZWQgaW50IHBhZ2VzKQpAQCAtMzc1LDIxICs2MzcsMjYgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlzcHRlX3QgKnB0ZSA9IHN3aXRjaGVyX3B0ZV9wYWdlKGNwdSk7CiAKKwkvKiBUaGUgZmlyc3QgZW50cmllcyBhcmUgZWFzeTogdGhleSBtYXAgdGhlIFN3aXRjaGVyIGNvZGUuICovCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKIAkJcHRlW2ldLnBmbiA9IHBhZ2VfdG9fcGZuKHN3aXRjaGVyX3BhZ2VbaV0pOwogCQlwdGVbaV0uZmxhZ3MgPSBfUEFHRV9QUkVTRU5UfF9QQUdFX0FDQ0VTU0VEOwogCX0KIAotCS8qIFdlIG9ubHkgbWFwIHRoaXMgQ1BVJ3MgcGFnZXMsIHNvIGd1ZXN0IGNhbid0IHNlZSBvdGhlcnMuICovCisJLyogVGhlIG9ubHkgb3RoZXIgdGhpbmcgd2UgbWFwIGlzIHRoaXMgQ1BVJ3MgcGFpciBvZiBwYWdlcy4gKi8KIAlpID0gcGFnZXMgKyBjcHUqMjsKIAotCS8qIEZpcnN0IHBhZ2UgKHJlZ3MpIGlzIHJ3LCBzZWNvbmQgKHN0YXRlKSBpcyByby4gKi8KKwkvKiBGaXJzdCBwYWdlIChHdWVzdCByZWdpc3RlcnMpIGlzIHdyaXRhYmxlIGZyb20gdGhlIEd1ZXN0ICovCiAJcHRlW2ldLnBmbiA9IHBhZ2VfdG9fcGZuKHN3aXRjaGVyX3BhZ2VbaV0pOwogCXB0ZVtpXS5mbGFncyA9IF9QQUdFX1BSRVNFTlR8X1BBR0VfQUNDRVNTRUR8X1BBR0VfUlc7CisJLyogVGhlIHNlY29uZCBwYWdlIGNvbnRhaW5zIHRoZSAic3RydWN0IGxndWVzdF9yb19zdGF0ZSIsIGFuZCBpcworCSAqIHJlYWQtb25seS4gKi8KIAlwdGVbaSsxXS5wZm4gPSBwYWdlX3RvX3Bmbihzd2l0Y2hlcl9wYWdlW2krMV0pOwogCXB0ZVtpKzFdLmZsYWdzID0gX1BBR0VfUFJFU0VOVHxfUEFHRV9BQ0NFU1NFRDsKIH0KIAorLypIOjUxMCBBdCBib290IG9yIG1vZHVsZSBsb2FkIHRpbWUsIGluaXRfcGFnZXRhYmxlcygpIGFsbG9jYXRlcyBhbmQgcG9wdWxhdGVzCisgKiB0aGUgU3dpdGNoZXIgUFRFIHBhZ2UgZm9yIGVhY2ggQ1BVLiAqLwogX19pbml0IGludCBpbml0X3BhZ2V0YWJsZXMoc3RydWN0IHBhZ2UgKipzd2l0Y2hlcl9wYWdlLCB1bnNpZ25lZCBpbnQgcGFnZXMpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC00MDQsNyArNjcxLDkgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisvKjoqLwogCisvKiBDbGVhbmluZyB1cCBzaW1wbHkgaW52b2x2ZXMgZnJlZWluZyB0aGUgUFRFIHBhZ2UgZm9yIGVhY2ggQ1BVLiAqLwogdm9pZCBmcmVlX3BhZ2V0YWJsZXModm9pZCkKIHsKIAlmcmVlX3N3aXRjaGVyX3B0ZV9wYWdlcygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3Qvc2VnbWVudHMuYyBiL2RyaXZlcnMvbGd1ZXN0L3NlZ21lbnRzLmMKaW5kZXggMWIyY2ZlOC4uZjY3NWE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3Qvc2VnbWVudHMuYworKysgYi9kcml2ZXJzL2xndWVzdC9zZWdtZW50cy5jCkBAIC0xLDE2ICsxLDY4IEBACisvKlA6NjAwIFRoZSB4ODYgYXJjaGl0ZWN0dXJlIGhhcyBzZWdtZW50cywgd2hpY2ggaW52b2x2ZSBhIHRhYmxlIG9mIGRlc2NyaXB0b3JzCisgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBkbyBmdW5reSB0aGluZ3Mgd2l0aCB2aXJ0dWFsIGFkZHJlc3MgaW50ZXJwcmV0YXRpb24uCisgKiBXZSBvcmlnaW5hbGx5IHVzZWQgdG8gdXNlIHNlZ21lbnRzIHNvIHRoZSBHdWVzdCBjb3VsZG4ndCBhbHRlciB0aGUKKyAqIEd1ZXN0PC0+SG9zdCBTd2l0Y2hlciwgYW5kIHRoZW4gd2UgaGFkIHRvIHRyaW0gR3Vlc3Qgc2VnbWVudHMsIGFuZCByZXN0b3JlCisgKiBmb3IgdXNlcnNwYWNlIHBlci10aHJlYWQgc2VnbWVudHMsIGJ1dCB0cmltIGFnYWluIGZvciBvbiB1c2Vyc3BhY2UtPmtlcm5lbAorICogdHJhbnNpdGlvbnMuLi4gIFRoaXMgbmlnaHRtYXJpc2ggY3JlYXRpb24gd2FzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBmaWxlLAorICogd2hlcmUgd2Uga25ldyBub3QgdG8gdHJlYWQgd2l0aG91dCBoZWF2eSBhcm1hbWVudCBhbmQgYSBjaGFuZ2Ugb2YgdW5kZXJ3ZWFyLgorICoKKyAqIEluIHRoZXNlIG1vZGVybiB0aW1lcywgdGhlIHNlZ21lbnQgaGFuZGxpbmcgY29kZSBjb25zaXN0cyBvZiBzaW1wbGUgc2FuaXR5CisgKiBjaGVja3MsIGFuZCB0aGUgd29yc3QgeW91J2xsIGV4cGVyaWVuY2UgcmVhZGluZyB0aGlzIGNvZGUgaXMgYnV0dGVyZmx5LXJhc2gKKyAqIGZyb20gZnJvbGlja2luZyB0aHJvdWdoIGl0cyBwYXJrbGlrZSBzZXJlbml0eS4gOiovCiAjaW5jbHVkZSAibGcuaCIKIAorLypIOjYwMAorICogV2UndmUgYWxtb3N0IGNvbXBsZXRlZCB0aGUgSG9zdDsgdGhlcmUncyBqdXN0IG9uZSBmaWxlIHRvIGdvIQorICoKKyAqIFNlZ21lbnRzICYgVGhlIEdsb2JhbCBEZXNjcmlwdG9yIFRhYmxlCisgKgorICogKFRoYXQgdGl0bGUgc291bmRzIGxpa2UgYSBiYWQgTmVyZGNvcmUgZ3JvdXAuICBOb3QgdG8gc3VnZ2VzdCB0aGF0IHRoZXJlIGFyZQorICogYW55IGdvb2QgTmVyZGNvcmUgZ3JvdXBzLCBidXQgaW4gaGlnaCBzY2hvb2wgYSBmcmllbmQgb2YgbWluZSBoYWQgYSBiYW5kCisgKiBjYWxsZWQgSm9lIEZpc2ggYW5kIHRoZSBDaGlwcywgc28gdGhlcmUgYXJlIGRlZmluaXRlbHkgd29yc2UgYmFuZCBuYW1lcykuCisgKgorICogVG8gcmVmcmVzaDogdGhlIEdEVCBpcyBhIHRhYmxlIG9mIDgtYnl0ZSB2YWx1ZXMgZGVzY3JpYmluZyBzZWdtZW50cy4gIE9uY2UKKyAqIHNldCB1cCwgdGhlc2Ugc2VnbWVudHMgY2FuIGJlIGxvYWRlZCBpbnRvIG9uZSBvZiB0aGUgNiAic2VnbWVudCByZWdpc3RlcnMiLgorICoKKyAqIEdEVCBlbnRyaWVzIGFyZSBwYXNzZWQgYXJvdW5kIGFzICJzdHJ1Y3QgZGVzY19zdHJ1Y3Qicywgd2hpY2ggbGlrZSBJRFQKKyAqIGVudHJpZXMgYXJlIHNwbGl0IGludG8gdHdvIDMyLWJpdCBtZW1iZXJzLCAiYSIgYW5kICJiIi4gIE9uZSBkYXksIHNvbWVvbmUKKyAqIHdpbGwgY2xlYW4gdGhhdCB1cCwgYW5kIGJlIGRlY2xhcmVkIGEgSGVyby4gIChObyBwcmVzc3VyZSwgSSdtIGp1c3Qgc2F5aW5nKS4KKyAqCisgKiBBbnl3YXksIHRoZSBHRFQgZW50cnkgY29udGFpbnMgYSBiYXNlICh0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgc2VnbWVudCksIGEKKyAqIGxpbWl0ICh0aGUgc2l6ZSBvZiB0aGUgc2VnbWVudCAtIDEpLCBhbmQgc29tZSBmbGFncy4gIFNvdW5kcyBzaW1wbGUsIGFuZCBpdAorICogd291bGQgYmUsIGV4Y2VwdCB0aG9zZSB6YW55IEludGVsIGVuZ2luZWVycyBkZWNpZGVkIHRoYXQgaXQgd2FzIHRvbyBib3JpbmcKKyAqIHRvIHB1dCB0aGUgYmFzZSBhdCBvbmUgZW5kLCB0aGUgbGltaXQgYXQgdGhlIG90aGVyLCBhbmQgdGhlIGZsYWdzIGluCisgKiBiZXR3ZWVuLiAgVGhleSBkZWNpZGVkIHRvIHNob3RndW4gdGhlIGJpdHMgYXQgcmFuZG9tIHRocm91Z2hvdXQgdGhlIDggYnl0ZXMsCisgKiBsaWtlIHNvOgorICoKKyAqIDAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgIDQwICAgICAgIDQ4ICA1MiAgNTYgICAgIDYzCisgKiBbIGxpbWl0IHBhcnQgMSBdWyAgICAgYmFzZSBwYXJ0IDEgICAgIF1bIGZsYWdzIF1bbGldW2ZsXVtiYXNlIF0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXQgYWdzIHBhcnQgMgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IDIKKyAqCisgKiBBcyBhIHJlc3VsdCwgdGhpcyBmaWxlIGNvbnRhaW5zIGEgY2VydGFpbiBhbW91bnQgb2YgbWFnaWMgbnVtZXJhY3kuICBMZXQncworICogYmVnaW4uCisgKi8KKworLyogSXMgdGhlIGRlc2NyaXB0b3IgdGhlIEd1ZXN0IHdhbnRzIHVzIHRvIHB1dCBpbiBPSz8KKyAqCisgKiBUaGUgZmxhZyB3aGljaCBJbnRlbCBzYXlzIG11c3QgYmUgemVybzogbXVzdCBiZSB6ZXJvLiAgVGhlIGRlc2NyaXB0b3IgbXVzdAorICogYmUgcHJlc2VudCwgKHRoaXMgaXMgYWN0dWFsbHkgY2hlY2tlZCBlYXJsaWVyIGJ1dCBpcyBoZXJlIGZvciB0aG9yb3VnbmVzcyksCisgKiBhbmQgdGhlIGRlc2NyaXB0b3IgdHlwZSBtdXN0IGJlIDEgKGEgbWVtb3J5IHNlZ21lbnQpLiAgKi8KIHN0YXRpYyBpbnQgZGVzY19vayhjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCkKIHsKLQkvKiBNQlo9MCwgUD0xLCBEVD0xICAqLwogCXJldHVybiAoKGdkdC0+YiAmIDB4MDAyMDkwMDApID09IDB4MDAwMDkwMDApOwogfQogCisvKiBJcyB0aGUgc2VnbWVudCBwcmVzZW50PyAgKE90aGVyd2lzZSBpdCBjYW4ndCBiZSB1c2VkIGJ5IHRoZSBHdWVzdCkuICovCiBzdGF0aWMgaW50IHNlZ21lbnRfcHJlc2VudChjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCkKIHsKIAlyZXR1cm4gZ2R0LT5iICYgMHg4MDAwOwogfQogCisvKiBUaGVyZSBhcmUgc2V2ZXJhbCBlbnRyaWVzIHdlIGRvbid0IGxldCB0aGUgR3Vlc3Qgc2V0LiAgVGhlIFRTUyBlbnRyeSBpcyB0aGUKKyAqICJUYXNrIFN0YXRlIFNlZ21lbnQiIHdoaWNoIGNvbnRyb2xzIGFsbCBraW5kcyBvZiBkZWxpY2F0ZSB0aGluZ3MuICBUaGUKKyAqIExHVUVTVF9DUyBhbmQgTEdVRVNUX0RTIGVudHJpZXMgYXJlIHJlc2VydmVkIGZvciB0aGUgU3dpdGNoZXIsIGFuZCB0aGUKKyAqIHRoZSBHdWVzdCBjYW4ndCBiZSB0cnVzdGVkIHRvIGRlYWwgd2l0aCBkb3VibGUgZmF1bHRzLiAqLwogc3RhdGljIGludCBpZ25vcmVkX2dkdCh1bnNpZ25lZCBpbnQgbnVtKQogewogCXJldHVybiAobnVtID09IEdEVF9FTlRSWV9UU1MKQEAgLTE5LDkgKzcxLDE4IEBACiAJCXx8IG51bSA9PSBHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTKTsKIH0KIAotLyogV2UgZG9uJ3QgYWxsb3cgcmVtb3ZhbCBvZiBDUywgRFMgb3IgU1M7IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4gKi8KKy8qIElmIHRoZSBHdWVzdCBhc2tzIHVzIHRvIHJlbW92ZSBhbiBlbnRyeSBmcm9tIHRoZSBHRFQsIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bC4KKyAqIElmIG9uZSBvZiB0aGUgc2VnbWVudCByZWdpc3RlcnMgaXMgcG9pbnRpbmcgYXQgdGhhdCBlbnRyeSB0aGUgU3dpdGNoZXIgd2lsbAorICogY3Jhc2ggd2hlbiBpdCB0cmllcyB0byByZWxvYWQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGZvciB0aGUgR3Vlc3QuCisgKgorICogSXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgZm9yIHRoZSBHdWVzdCB0byB0cnkgdG8gcmVtb3ZlIGl0cyBvd24gY29kZSwgZGF0YQorICogb3Igc3RhY2sgc2VnbWVudHMgd2hpbGUgdGhleSdyZSBpbiB1c2U6IGFzc3VtZSB0aGF0J3MgYSBHdWVzdCBidWcuICBJZiBpdCdzCisgKiBvbmUgb2YgdGhlIGxlc3NlciBzZWdtZW50IHJlZ2lzdGVycyB1c2luZyB0aGUgcmVtb3ZlZCBlbnRyeSwgd2Ugc2ltcGx5IHNldAorICogdGhhdCByZWdpc3RlciB0byAwICh1bnVzYWJsZSkuICovCiBzdGF0aWMgdm9pZCBjaGVja19zZWdtZW50X3VzZShzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgaW50IGRlc2MpCiB7CisJLyogR0RUIGVudHJpZXMgYXJlIDggYnl0ZXMgbG9uZywgc28gd2UgZGl2aWRlIHRvIGdldCB0aGUgaW5kZXggYW5kCisJICogaWdub3JlIHRoZSBib3R0b20gYml0cy4gKi8KIAlpZiAobGctPnJlZ3MtPmdzIC8gOCA9PSBkZXNjKQogCQlsZy0+cmVncy0+Z3MgPSAwOwogCWlmIChsZy0+cmVncy0+ZnMgLyA4ID09IGRlc2MpCkBAIC0zMywxMyArOTQsMjEgQEAKIAkgICAgfHwgbGctPnJlZ3MtPnNzIC8gOCA9PSBkZXNjKQogCQlraWxsX2d1ZXN0KGxnLCAiUmVtb3ZlZCBsaXZlIEdEVCBlbnRyeSAldSIsIGRlc2MpOwogfQorLyo6Ki8KKy8qTTowMDkgV2Ugd291bGRuJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVtb3ZhbCBvZiBpbi11c2Ugc2VnbWVudHMgaWYgd2UgaGFuZGxlZAorICogZmF1bHRzIGluIHRoZSBTd2l0Y2hlci4gIEhvd2V2ZXIsIGl0J3MgcHJvYmFibHkgbm90IGEgd29ydGh3aGlsZQorICogb3B0aW1pemF0aW9uLiA6Ki8KIAorLypIOjYxMCBPbmNlIHRoZSBHRFQgaGFzIGJlZW4gY2hhbmdlZCwgd2UgbG9vayB0aHJvdWdoIHRoZSBjaGFuZ2VkIGVudHJpZXMgYW5kCisgKiBzZWUgaWYgdGhleSdyZSBPSy4gIElmIG5vdCwgd2UnbGwgY2FsbCBraWxsX2d1ZXN0KCkgYW5kIHRoZSBHdWVzdCB3aWxsIG5ldmVyCisgKiBnZXQgdG8gdXNlIHRoZSBpbnZhbGlkIGVudHJpZXMuICovCiBzdGF0aWMgdm9pZCBmaXh1cF9nZHRfdGFibGUoc3RydWN0IGxndWVzdCAqbGcsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7Ci0JCS8qIFdlIG5ldmVyIGNvcHkgdGhlc2Ugb25lcyB0byByZWFsIGdkdCAqLworCQkvKiBXZSBuZXZlciBjb3B5IHRoZXNlIG9uZXMgdG8gcmVhbCBHRFQsIHNvIHdlIGRvbid0IGNhcmUgd2hhdAorCQkgKiB0aGV5IHNheSAqLwogCQlpZiAoaWdub3JlZF9nZHQoaSkpCiAJCQljb250aW51ZTsKIApAQCAtNTMsNDEgKzEyMiw1NyBAQAogCQlpZiAoIWRlc2Nfb2soJmxnLT5nZHRbaV0pKQogCQkJa2lsbF9ndWVzdChsZywgIkJhZCBHRFQgZGVzY3JpcHRvciAlaSIsIGkpOwogCi0JCS8qIERQTCAwIHByZXN1bWFibHkgbWVhbnMgImZvciB1c2UgYnkgZ3Vlc3QiLiAqLworCQkvKiBTZWdtZW50IGRlc2NyaXB0b3JzIGNvbnRhaW4gYSBwcml2aWxlZ2UgbGV2ZWw6IHRoZSBHdWVzdCBpcworCQkgKiBzb21ldGltZXMgY2FyZWxlc3MgYW5kIGxlYXZlcyB0aGlzIGFzIDAsIGV2ZW4gdGhvdWdoIGl0J3MKKwkJICogcnVubmluZyBhdCBwcml2aWxlZ2UgbGV2ZWwgMS4gIElmIHNvLCB3ZSBmaXggaXQgaGVyZS4gKi8KIAkJaWYgKChsZy0+Z2R0W2ldLmIgJiAweDAwMDA2MDAwKSA9PSAwKQogCQkJbGctPmdkdFtpXS5iIHw9IChHVUVTVF9QTCA8PCAxMyk7CiAKLQkJLyogU2V0IGFjY2Vzc2VkIGJpdCwgc2luY2UgZ2R0IGlzbid0IHdyaXRhYmxlLiAqLworCQkvKiBFYWNoIGRlc2NyaXB0b3IgaGFzIGFuICJhY2Nlc3NlZCIgYml0LiAgSWYgd2UgZG9uJ3Qgc2V0IGl0CisJCSAqIG5vdywgdGhlIENQVSB3aWxsIHRyeSB0byBzZXQgaXQgd2hlbiB0aGUgR3Vlc3QgZmlyc3QgbG9hZHMKKwkJICogdGhhdCBlbnRyeSBpbnRvIGEgc2VnbWVudCByZWdpc3Rlci4gIEJ1dCB0aGUgR0RUIGlzbid0CisJCSAqIHdyaXRhYmxlIGJ5IHRoZSBHdWVzdCwgc28gYmFkIHRoaW5ncyBjYW4gaGFwcGVuLiAqLwogCQlsZy0+Z2R0W2ldLmIgfD0gMHgwMDAwMDEwMDsKIAl9CiB9CiAKKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgYm9vdCBvciBtb2Rwcm9iZSB0aW1lIGZvciBlYWNoIENQVSB0byBzZXQgdXAgdGhlCisgKiAiY29uc3RhbnQiIEdEVCBlbnRyaWVzIGZvciBHdWVzdHMgcnVubmluZyBvbiB0aGF0IENQVS4gKi8KIHZvaWQgc2V0dXBfZGVmYXVsdF9nZHRfZW50cmllcyhzdHJ1Y3QgbGd1ZXN0X3JvX3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCA9IHN0YXRlLT5ndWVzdF9nZHQ7CiAJdW5zaWduZWQgbG9uZyB0c3MgPSAodW5zaWduZWQgbG9uZykmc3RhdGUtPmd1ZXN0X3RzczsKIAotCS8qIEh5cGVydmlzb3Igc2VnbWVudHMuICovCisJLyogVGhlIGh5cGVydmlzb3Igc2VnbWVudHMgYXJlIGZ1bGwgMC00RyBzZWdtZW50cywgcHJpdmlsZWdlIGxldmVsIDAgKi8KIAlnZHRbR0RUX0VOVFJZX0xHVUVTVF9DU10gPSBGVUxMX0VYRUNfU0VHTUVOVDsKIAlnZHRbR0RUX0VOVFJZX0xHVUVTVF9EU10gPSBGVUxMX1NFR01FTlQ7CiAKLQkvKiBUaGlzIGlzIHRoZSBvbmUgd2hpY2ggd2UgKmNhbm5vdCogY29weSBmcm9tIGd1ZXN0LCBzaW5jZSB0c3MKLQkgICBpcyBkZXBlbmRlZCBvbiB0aGlzIGxndWVzdF9yb19zdGF0ZSwgaWUuIHRoaXMgY3B1LiAqLworCS8qIFRoZSBUU1Mgc2VnbWVudCByZWZlcnMgdG8gdGhlIFRTUyBlbnRyeSBmb3IgdGhpcyBDUFUsIHNvIHdlIGNhbm5vdAorCSAqIGNvcHkgaXQgZnJvbSB0aGUgR3Vlc3QuICBGb3JnaXZlIHRoZSBtYWdpYyBmbGFncyAqLwogCWdkdFtHRFRfRU5UUllfVFNTXS5hID0gMHgwMDAwMDA2NyB8ICh0c3MgPDwgMTYpOwogCWdkdFtHRFRfRU5UUllfVFNTXS5iID0gMHgwMDAwODkwMCB8ICh0c3MgJiAweEZGMDAwMDAwKQogCQl8ICgodHNzID4+IDE2KSAmIDB4MDAwMDAwRkYpOwogfQogCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSB0aGUgR3Vlc3QgaXMgcnVuIGZvciB0aGUgZmlyc3QgdGltZS4gKi8KIHZvaWQgc2V0dXBfZ3Vlc3RfZ2R0KHN0cnVjdCBsZ3Vlc3QgKmxnKQogeworCS8qIFN0YXJ0IHdpdGggZnVsbCAwLTRHIHNlZ21lbnRzLi4uICovCiAJbGctPmdkdFtHRFRfRU5UUllfS0VSTkVMX0NTXSA9IEZVTExfRVhFQ19TRUdNRU5UOwogCWxnLT5nZHRbR0RUX0VOVFJZX0tFUk5FTF9EU10gPSBGVUxMX1NFR01FTlQ7CisJLyogLi4uZXhjZXB0IHRoZSBHdWVzdCBpcyBhbGxvd2VkIHRvIHVzZSB0aGVtLCBzbyBzZXQgdGhlIHByaXZpbGVnZQorCSAqIGxldmVsIGFwcHJvcHJpYXRlbHkgaW4gdGhlIGZsYWdzLiAqLwogCWxnLT5nZHRbR0RUX0VOVFJZX0tFUk5FTF9DU10uYiB8PSAoR1VFU1RfUEwgPDwgMTMpOwogCWxnLT5nZHRbR0RUX0VOVFJZX0tFUk5FTF9EU10uYiB8PSAoR1VFU1RfUEwgPDwgMTMpOwogfQogCi0vKiBUaGlzIGlzIGEgZmFzdCB2ZXJzaW9uIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgb25seSB0aGUgdGhyZWUgVExTIGVudHJpZXMKLSAqIGhhdmUgY2hhbmdlZC4gKi8KKy8qIExpa2UgdGhlIElEVCwgd2UgbmV2ZXIgc2ltcGx5IHVzZSB0aGUgR0RUIHRoZSBHdWVzdCBnaXZlcyB1cy4gIFdlIHNldCB1cCB0aGUKKyAqIEdEVHMgZm9yIGVhY2ggQ1BVLCB0aGVuIHdlIGNvcHkgYWNyb3NzIHRoZSBlbnRyaWVzIGVhY2ggdGltZSB3ZSB3YW50IHRvIHJ1bgorICogYSBkaWZmZXJlbnQgR3Vlc3Qgb24gdGhhdCBDUFUuICovCisKKy8qIEEgcGFydGlhbCBHRFQgbG9hZCwgZm9yIHRoZSB0aHJlZSAidGhlYWQtbG9jYWwgc3RvcmFnZSIgZW50cmllcy4gIE90aGVyd2lzZQorICogaXQncyBqdXN0IGxpa2UgbG9hZF9ndWVzdF9nZHQoKS4gIFNvIG11Y2gsIGluIGZhY3QsIGl0IHdvdWxkIHByb2JhYmx5IGJlCisgKiBuZWF0ZXIgdG8gaGF2ZSBhIHNpbmdsZSBoeXBlcmNhbGwgdG8gY292ZXIgYm90aC4gKi8KIHZvaWQgY29weV9nZHRfdGxzKGNvbnN0IHN0cnVjdCBsZ3Vlc3QgKmxnLCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTk2LDIyICsxODEsMzEgQEAKIAkJZ2R0W2ldID0gbGctPmdkdFtpXTsKIH0KIAorLyogVGhpcyBpcyB0aGUgZnVsbCB2ZXJzaW9uICovCiB2b2lkIGNvcHlfZ2R0KGNvbnN0IHN0cnVjdCBsZ3Vlc3QgKmxnLCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCS8qIFRoZSBkZWZhdWx0IGVudHJpZXMgZnJvbSBzZXR1cF9kZWZhdWx0X2dkdF9lbnRyaWVzKCkgYXJlIG5vdAorCSAqIHJlcGxhY2VkLiAgU2VlIGlnbm9yZWRfZ2R0KCkgYWJvdmUuICovCiAJZm9yIChpID0gMDsgaSA8IEdEVF9FTlRSSUVTOyBpKyspCiAJCWlmICghaWdub3JlZF9nZHQoaSkpCiAJCQlnZHRbaV0gPSBsZy0+Z2R0W2ldOwogfQogCisvKiBUaGlzIGlzIHdoZXJlIHRoZSBHdWVzdCBhc2tzIHVzIHRvIGxvYWQgYSBuZXcgR0RUIChMSENBTExfTE9BRF9HRFQpLiAqLwogdm9pZCBsb2FkX2d1ZXN0X2dkdChzdHJ1Y3QgbGd1ZXN0ICpsZywgdW5zaWduZWQgbG9uZyB0YWJsZSwgdTMyIG51bSkKIHsKKwkvKiBXZSBhc3N1bWUgdGhlIEd1ZXN0IGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgR0RUIGVudHJpZXMgYXMgdGhlCisJICogSG9zdCwgb3RoZXJ3aXNlIHdlJ2QgaGF2ZSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUgR3Vlc3QgR0RULiAqLwogCWlmIChudW0gPiBBUlJBWV9TSVpFKGxnLT5nZHQpKQogCQlraWxsX2d1ZXN0KGxnLCAidG9vIG1hbnkgZ2R0IGVudHJpZXMgJWkiLCBudW0pOwogCisJLyogV2UgcmVhZCB0aGUgd2hvbGUgdGhpbmcgaW4sIHRoZW4gZml4IGl0IHVwLiAqLwogCWxncmVhZChsZywgbGctPmdkdCwgdGFibGUsIG51bSAqIHNpemVvZihsZy0+Z2R0WzBdKSk7CiAJZml4dXBfZ2R0X3RhYmxlKGxnLCAwLCBBUlJBWV9TSVpFKGxnLT5nZHQpKTsKKwkvKiBNYXJrIHRoYXQgdGhlIEdEVCBjaGFuZ2VkIHNvIHRoZSBjb3JlIGtub3dzIGl0IGhhcyB0byBjb3B5IGl0IGFnYWluLAorCSAqIGV2ZW4gaWYgdGhlIEd1ZXN0IGlzIHJ1biBvbiB0aGUgc2FtZSBDUFUuICovCiAJbGctPmNoYW5nZWQgfD0gQ0hBTkdFRF9HRFQ7CiB9CiAKQEAgLTEyMywzICsyMTcsMTMgQEAKIAlmaXh1cF9nZHRfdGFibGUobGcsIEdEVF9FTlRSWV9UTFNfTUlOLCBHRFRfRU5UUllfVExTX01BWCsxKTsKIAlsZy0+Y2hhbmdlZCB8PSBDSEFOR0VEX0dEVF9UTFM7CiB9CisKKy8qCisgKiBXaXRoIHRoaXMsIHdlIGhhdmUgZmluaXNoZWQgdGhlIEhvc3QuCisgKgorICogRml2ZSBvZiB0aGUgc2V2ZW4gcGFydHMgb2Ygb3VyIHRhc2sgYXJlIGNvbXBsZXRlLiAgWW91IGhhdmUgbWFkZSBpdCB0aHJvdWdoCisgKiB0aGUgQml0IG9mIERlc3BhaXIgKEkgdGhpbmsgdGhhdCdzIHNvbWV3aGVyZSBpbiB0aGUgcGFnZSB0YWJsZSBjb2RlLAorICogbXlzZWxmKS4KKyAqCisgKiBOZXh0LCB3ZSBleGFtaW5lICJtYWtlIFN3aXRjaGVyIi4gIEl0J3Mgc2hvcnQsIGJ1dCBpbnRlbnNlLgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9zd2l0Y2hlci5TIGIvZHJpdmVycy9sZ3Vlc3Qvc3dpdGNoZXIuUwppbmRleCBlYWRkNGNjLi5kNDE4MTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9zd2l0Y2hlci5TCisrKyBiL2RyaXZlcnMvbGd1ZXN0L3N3aXRjaGVyLlMKQEAgLTEsNDUgKzEsMTM2IEBACi0vKiBUaGlzIGNvZGUgc2l0cyBhdCAweEZGQzAwMDAwIHRvIGRvIHRoZSBsb3ctbGV2ZWwgZ3Vlc3Q8LT5ob3N0IHN3aXRjaC4KKy8qUDo5MDAgVGhpcyBpcyB0aGUgU3dpdGNoZXI6IGNvZGUgd2hpY2ggc2l0cyBhdCAweEZGQzAwMDAwIHRvIGRvIHRoZSBsb3ctbGV2ZWwKKyAqIEd1ZXN0PC0+SG9zdCBzd2l0Y2guICBJdCBpcyBhcyBzaW1wbGUgYXMgaXQgY2FuIGJlIG1hZGUsIGJ1dCBpdCdzIG5hdHVyYWxseQorICogdmVyeSBzcGVjaWZpYyB0byB4ODYuCisgKgorICogWW91IGhhdmUgbm93IGNvbXBsZXRlZCBQcmVwYXJhdGlvbi4gIElmIHRoaXMgaGFzIHdoZXQgeW91ciBhcHBldGl0ZTsgaWYgeW91CisgKiBhcmUgZmVlbGluZyBpbnZpZ29yYXRlZCBhbmQgcmVmcmVzaGVkIHRoZW4gdGhlIG5leHQsIG1vcmUgY2hhbGxlbmdpbmcgc3RhZ2UKKyAqIGNhbiBiZSBmb3VuZCBpbiAibWFrZSBHdWVzdCIuIDoqLwogCi0gICBUaGVyZSBpcyBhcmUgdHdvIHBhZ2VzIGFib3ZlIHVzIGZvciB0aGlzIENQVSAoc3RydWN0IGxndWVzdF9wYWdlcykuCi0gICBUaGUgc2Vjb25kIHBhZ2UgKHN0cnVjdCBsZ3Vlc3Rfcm9fc3RhdGUpIGJlY29tZXMgcmVhZC1vbmx5IGFmdGVyIHRoZQotICAgY29udGV4dCBzd2l0Y2guICBUaGUgZmlyc3QgcGFnZSAodGhlIHN0YWNrIGZvciB0cmFwcykgcmVtYWlucyB3cml0YWJsZSwKLSAgIGJ1dCB3aGlsZSB3ZSdyZSBpbiBoZXJlLCB0aGUgZ3Vlc3QgY2Fubm90IGJlIHJ1bm5pbmcuCi0qLworLypTOjEwMAorICogV2VsY29tZSB0byB0aGUgU3dpdGNoZXIgaXRzZWxmIQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93LWxldmVsIGNvZGUgd2hpY2ggY2hhbmdlcyB0aGUgQ1BVIHRvIHJ1biB0aGUgR3Vlc3QKKyAqIGNvZGUsIGFuZCByZXR1cm5zIHRvIHRoZSBIb3N0IHdoZW4gc29tZXRoaW5nIGhhcHBlbnMuICBVbmRlcnN0YW5kIHRoaXMsIGFuZAorICogeW91IHVuZGVyc3RhbmQgdGhlIGhlYXJ0IG9mIG91ciBqb3VybmV5LgorICoKKyAqIEJlY2F1c2UgdGhpcyBpcyBpbiBhc3NlbWJsZXIgcmF0aGVyIHRoYW4gQywgb3VyIHRhbGUgc3dpdGNoZXMgZnJvbSBwcm9zZSB0bworICogdmVyc2UuICBGaXJzdCBJIHRyaWVkIGxpbWVyaWNrczoKKyAqCisgKglUaGVyZSBvbmNlIHdhcyBhbiBlYXggcmVnLAorICoJVG8gd2hpY2ggb3VyIHBvaW50ZXIgd2FzIGZlZCwKKyAqCUl0IG5lZWRlZCBhbiBhZGQsCisgKglXaGljaCBhc20tb2Zmc2V0cy5oIGhhZAorICoJQnV0IHRoaXMgbGltZXJpY2sgaXMgaHVydGluZyBteSBoZWFkLgorICoKKyAqIE5leHQgSSB0cmllZCBoYWlrdXMsIGJ1dCBmaXR0aW5nIHRoZSByZXF1aXJlZCByZWZlcmVuY2UgdG8gdGhlIHNlYXNvbnMgaW4KKyAqIGV2ZXJ5IHN0YW56YSB3YXMgcXVpY2tseSBiZWNvbWluZyB0aXJlc29tZToKKyAqCisgKglUaGUgJWVheCByZWcKKyAqCUhvbGRzICJzdHJ1Y3QgbGd1ZXN0X3BhZ2VzIiBub3c6CisgKglDaGVycnkgYmxvc3NvbXMgZmFsbC4KKyAqCisgKiBUaGVuIEkgc3RhcnRlZCB3aXRoIEhlcm9pYyBWZXJzZSwgYnV0IHRoZSByaHltaW5nIHJlcXVpcmVtZW50IGxlZWNoZWQgYXdheQorICogdGhlIGNvbnRlbnQgZGVuc2l0eSBhbmQgbGVkIHRvIHNvbWUgdW5pcXVlbHkgYXdmdWwgb2JsaXF1ZSByaHltZXM6CisgKgorICoJVGhlc2UgY29uc3RhbnRzIGFyZSBjb21pbmcgZnJvbSBzdHJ1Y3Qgb2Zmc2V0cworICoJRm9yIHVzZSB3aXRoaW4gdGhlIGFzbSBzd2l0Y2hlciB0ZXh0LgorICoKKyAqIEZpbmFsbHksIEkgc2V0dGxlZCBmb3Igc29tZXRoaW5nIGJldHdlZW4gaGVyb2ljIGhleGFtZXRlciwgYW5kIG5vcm1hbCBwcm9zZQorICogd2l0aCBpbmFwcHJvcHJpYXRlIGxpbmVicmVha3MuICBBbnl3YXksIGl0IGFpbnQgbm8gU2hha2VzcGVhcmUuCisgKi8KKworLy8gTm90IGFsbCBrZXJuZWwgaGVhZGVycyB3b3JrIGZyb20gYXNzZW1ibGVyCisvLyBCdXQgdGhlc2Ugb25lcyBhcmUgbmVlZGVkOiB0aGUgRU5UUlkoKSBkZWZpbmUKKy8vIEFuZCBjb25zdGFudHMgZXh0cmFjdGVkIGZyb20gc3RydWN0IG9mZnNldHMKKy8vIFRvIGF2b2lkIG1hZ2ljIG51bWJlcnMgYW5kIGJyZWFrYWdlOgorLy8gU2hvdWxkIHRoZXkgY2hhbmdlIHRoZSBjb21waWxlciBjYW4ndCBzYXZlIHVzCisvLyBEb3duIGhlcmUgaW4gdGhlIGRlcHRocyBvZiBhc3NlbWJsZXIgY29kZS4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSAibGcuaCIKIAorLy8gV2UgbWFyayB0aGUgc3RhcnQgb2YgdGhlIGNvZGUgdG8gY29weQorLy8gSXQncyBwbGFjZWQgaW4gLnRleHQgdGhvIGl0J3MgbmV2ZXIgcnVuIGhlcmUKKy8vIFlvdSdsbCBzZWUgdGhlIHRyaWNrIG1hY3JvIGF0IHRoZSBlbmQKKy8vIFdoaWNoIGludGVybGVhdmVzIGRhdGEgYW5kIHRleHQgdG8gZWZmZWN0LgogLnRleHQKIEVOVFJZKHN0YXJ0X3N3aXRjaGVyX3RleHQpCiAKLS8qICVlYXggcG9pbnRzIHRvIGxndWVzdCBwYWdlcyBmb3IgdGhpcyBDUFUuICAlZWJ4IGNvbnRhaW5zIGNyMyB2YWx1ZS4KLSAgIEFsbCBub3JtYWwgcmVnaXN0ZXJzIGNhbiBiZSBjbG9iYmVyZWQhICovCisvLyBXaGVuIHdlIHJlYWNoIHN3aXRjaF90b19ndWVzdCB3ZSBoYXZlIGp1c3QgbGVmdAorLy8gVGhlIHNhZmUgYW5kIGNvbWZvcnRpbmcgc2hvcmVzIG9mIEMgY29kZQorLy8gJWVheCBoYXMgdGhlICJzdHJ1Y3QgbGd1ZXN0X3BhZ2VzIiB0byB1c2UKKy8vIFdoZXJlIHdlIHNhdmUgc3RhdGUgYW5kIHN0aWxsIHNlZSBpdCBmcm9tIHRoZSBHdWVzdAorLy8gQW5kICVlYnggaG9sZHMgdGhlIEd1ZXN0IHNoYWRvdyBwYWdldGFibGU6CisvLyBPbmNlIHNldCB3ZSBoYXZlIHRydWx5IGxlZnQgSG9zdCBiZWhpbmQuCiBFTlRSWShzd2l0Y2hfdG9fZ3Vlc3QpCi0JLyogU2F2ZSBob3N0IHNlZ21lbnRzIG9uIGhvc3Qgc3RhY2suICovCisJLy8gV2UgdG9sZCBnY2MgYWxsIGl0cyByZWdzIGNvdWxkIGZhZGUsCisJLy8gQ2xvYmJlcmVkIGJ5IG91ciBqb3VybmV5IGludG8gdGhlIEd1ZXN0CisJLy8gV2UgY291bGQgaGF2ZSBzYXZlZCB0aGVtLCBpZiB3ZSB0cmllZAorCS8vIEJ1dCB0aW1lIGlzIG91ciBtYXN0ZXIgYW5kIGN5Y2xlcyBjb3VudC4KKworCS8vIFNlZ21lbnQgcmVnaXN0ZXJzIG11c3QgYmUgc2F2ZWQgZm9yIHRoZSBIb3N0CisJLy8gV2UgcHVzaCB0aGVtIG9uIHRoZSBIb3N0IHN0YWNrIGZvciBsYXRlcgogCXB1c2hsCSVlcwogCXB1c2hsCSVkcwogCXB1c2hsCSVncwogCXB1c2hsCSVmcwotCS8qIFdpdGggQ09ORklHX0ZSQU1FX1BPSU5URVIsIGdjYyBkb2Vzbid0IGxldCB1cyBjbG9iYmVyIHRoaXMhICovCisJLy8gQnV0IHRoZSBjb21waWxlciBpcyBmaWNrbGUsIGFuZCBoZWVkcworCS8vIE5vIHdhcm5pbmcgb2YgJWVicCBjbG9iYmVycworCS8vIFdoZW4gZnJhbWUgcG9pbnRlcnMgYXJlIHVzZWQuICBUaGF0IHJlZ2lzdGVyCisJLy8gTXVzdCBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgb3IgY2hhb3Mgc3RyaWtlcy4KIAlwdXNobAklZWJwCi0JLyogU2F2ZSBob3N0IHN0YWNrLiAqLworCS8vIFRoZSBIb3N0J3Mgc3RhY2sgaXMgZG9uZSwgbm93IHNhdmUgaXQgYXdheQorCS8vIEluIG91ciAic3RydWN0IGxndWVzdF9wYWdlcyIgYXQgb2Zmc2V0CisJLy8gRGlzdGlsbGVkIGludG8gYXNtLW9mZnNldHMuaAogCW1vdmwJJWVzcCwgTEdVRVNUX1BBR0VTX2hvc3Rfc3AoJWVheCkKLQkvKiBTd2l0Y2ggdG8gZ3Vlc3Qgc3RhY2s6IGlmIHdlIGdldCBOTUkgd2UgZXhwZWN0IHRvIGJlIHRoZXJlLiAqLworCisJLy8gQWxsIHNhdmVkIGFuZCB0aGVyZSdzIG5vdyBmaXZlIHN0ZXBzIGJlZm9yZSB1czoKKwkvLyBTdGFjaywgR0RULCBJRFQsIFRTUworCS8vIEFuZCBsYXN0IG9mIGFsbCB0aGUgcGFnZSB0YWJsZXMgYXJlIGZsaXBwZWQuCisKKwkvLyBZZXQgYmV3YXJlIHRoYXQgb3VyIHN0YWNrIHBvaW50ZXIgbXVzdCBiZQorCS8vIEFsd2F5cyB2YWxpZCBsZXN0IGFuIE5NSSBoaXRzCisJLy8gJWVkeCBkb2VzIHRoZSBkdXR5IGhlcmUgYXMgd2UganVnZ2xlCisJLy8gJWVheCBpcyBsZ3Vlc3RfcGFnZXM6IG91ciBzdGFjayBsaWVzIHdpdGhpbi4KIAltb3ZsCSVlYXgsICVlZHgKIAlhZGRsCSRMR1VFU1RfUEFHRVNfcmVncywgJWVkeAogCW1vdmwJJWVkeCwgJWVzcAotCS8qIFN3aXRjaCB0byBndWVzdCdzIEdEVCwgSURULiAqLworCisJLy8gVGhlIEd1ZXN0J3MgR0RUIHdlIHNvIGNhcmVmdWxseQorCS8vIFBsYWNlZCBpbiB0aGUgInN0cnVjdCBsZ3Vlc3RfcGFnZXMiIGJlZm9yZQogCWxnZHQJTEdVRVNUX1BBR0VTX2d1ZXN0X2dkdF9kZXNjKCVlYXgpCisKKwkvLyBUaGUgR3Vlc3QncyBJRFQgd2UgZGlkIHBhcnRpYWxseQorCS8vIE1vdmUgdG8gdGhlICJzdHJ1Y3QgbGd1ZXN0X3BhZ2VzIiBhcyB3ZWxsLgogCWxpZHQJTEdVRVNUX1BBR0VTX2d1ZXN0X2lkdF9kZXNjKCVlYXgpCi0JLyogU3dpdGNoIHRvIGd1ZXN0J3MgVFNTIHdoaWxlIEdEVCBzdGlsbCB3cml0YWJsZS4gKi8KKworCS8vIFRoZSBUU1MgZW50cnkgd2hpY2ggY29udHJvbHMgdHJhcHMKKwkvLyBNdXN0IGJlIGxvYWRlZCB1cCB3aXRoICJsdHIiIG5vdzoKKwkvLyBGb3IgYWZ0ZXIgd2Ugc3dpdGNoIG92ZXIgb3VyIHBhZ2UgdGFibGVzCisJLy8gSXQgKGFzIHRoZSByZXN0KSB3aWxsIGJlIHdyaXRhYmxlIG5vIG1vcmUuCisJLy8gKFRoZSBHRFQgZW50cnkgVFNTIG5lZWRzCisJLy8gQ2hhbmdlcyB0eXBlIHdoZW4gd2UgbG9hZCBpdDogZGFtbiBJbnRlbCEpCiAJbW92bAkkKEdEVF9FTlRSWV9UU1MqOCksICVlZHgKIAlsdHIJJWR4Ci0JLyogU2V0IGhvc3QncyBUU1MgR0RUIGVudHJ5IHRvIGF2YWlsYWJsZSAoY2xlYXIgYnl0ZSA1IGJpdCAyKS4gKi8KKworCS8vIExvb2sgYmFjayBub3csIGJlZm9yZSB3ZSB0YWtlIHRoaXMgbGFzdCBzdGVwIQorCS8vIFRoZSBIb3N0J3MgVFNTIGVudHJ5IHdhcyBhbHNvIG1hcmtlZCB1c2VkOworCS8vIExldCdzIGNsZWFyIGl0IGFnYWluLCBlcmUgd2UgcmV0dXJuLgorCS8vIFRoZSBHRFQgZGVzY3JpcHRvciBvZiB0aGUgSG9zdAorCS8vIFBvaW50cyB0byB0aGUgdGFibGUgYWZ0ZXIgdHdvICJzaXplIiBieXRlcwogCW1vdmwJKExHVUVTVF9QQUdFU19ob3N0X2dkdF9kZXNjKzIpKCVlYXgpLCAlZWR4CisJLy8gQ2xlYXIgdGhlIHR5cGUgZmllbGQgb2YgInVzZWQiIChieXRlIDUsIGJpdCAyKQogCWFuZGIJJDB4RkQsIChHRFRfRU5UUllfVFNTKjggKyA1KSglZWR4KQotCS8qIFN3aXRjaCB0byBndWVzdCBwYWdlIHRhYmxlczoJbGd1ZXN0X3BhZ2VzLT5zdGF0ZSBub3cgcmVhZC1vbmx5LiAqLworCisJLy8gT25jZSBvdXIgcGFnZSB0YWJsZSdzIHN3aXRjaGVkLCB0aGUgR3Vlc3QgaXMgbGl2ZSEKKwkvLyBUaGUgSG9zdCBmYWRlcyBhcyB3ZSBydW4gdGhpcyBmaW5hbCBzdGVwLgorCS8vIE91ciAic3RydWN0IGxndWVzdF9wYWdlcyIgaXMgbm93IHJlYWQtb25seS4KIAltb3ZsCSVlYngsICVjcjMKLQkvKiBSZXN0b3JlIGd1ZXN0IHJlZ3MgKi8KKworCS8vIFRoZSBwYWdlIHRhYmxlIGNoYW5nZSBkaWQgb25lIHRyaWNreSB0aGluZzoKKwkvLyBUaGUgR3Vlc3QncyByZWdpc3RlciBwYWdlIGhhcyBiZWVuIG1hcHBlZAorCS8vIFdyaXRhYmxlIG9udG8gb3VyICVlc3AgKHN0YWNrKSAtLQorCS8vIFdlIGNhbiBzaW1wbHkgcG9wIG9mZiBhbGwgR3Vlc3QgcmVncy4KIAlwb3BsCSVlYngKIAlwb3BsCSVlY3gKIAlwb3BsCSVlZHgKQEAgLTUxLDEyICsxNDIsMjcgQEAKIAlwb3BsCSVmcwogCXBvcGwJJWRzCiAJcG9wbAklZXMKLQkvKiBTa2lwIGVycm9yIGNvZGUgYW5kIHRyYXAgbnVtYmVyICovCisKKwkvLyBOZWFyIHRoZSBiYXNlIG9mIHRoZSBzdGFjayBsdXJrIHR3byBzdHJhbmdlIGZpZWxkcworCS8vIFdoaWNoIHdlIGZpbGwgYXMgd2UgZXhpdCB0aGUgR3Vlc3QKKwkvLyBUaGVzZSBhcmUgdGhlIHRyYXAgbnVtYmVyIGFuZCBpdHMgZXJyb3IKKwkvLyBXZSBjYW4gc2ltcGx5IHN0ZXAgcGFzdCB0aGVtIG9uIG91ciB3YXkuCiAJYWRkbAkkOCwgJWVzcAorCisJLy8gVGhlIGxhc3QgZml2ZSBzdGFjayBzbG90cyBob2xkIHJldHVybiBhZGRyZXNzCisJLy8gQW5kIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGNoYW5nZSBwcml2aWxlZ2UKKwkvLyBJbnRvIHRoZSBHdWVzdCBwcml2aWxlZ2UgbGV2ZWwgb2YgMSwKKwkvLyBBbmQgdGhlIHN0YWNrIHdoZXJlIHRoZSBHdWVzdCBoYWQgbGFzdCBsZWZ0IGl0LgorCS8vIEludGVycnVwdHMgYXJlIHR1cm5lZCBiYWNrIG9uOiB3ZSBhcmUgR3Vlc3QuCiAJaXJldAogCisvLyBUaGVyZSBhcmUgdHdvIHBhdGhzIHdoZXJlIHdlIHN3aXRjaCB0byB0aGUgSG9zdAorLy8gU28gd2UgcHV0IHRoZSByb3V0aW5lIGluIGEgbWFjcm8uCisvLyBXZSBhcmUgb24gb3VyIHdheSBob21lLCBiYWNrIHRvIHRoZSBIb3N0CisvLyBJbnRlcnJ1cHRlZCBvdXQgb2YgdGhlIEd1ZXN0LCB3ZSBjb21lIGhlcmUuCiAjZGVmaW5lIFNXSVRDSF9UT19IT1NUCQkJCQkJCVwKLQkvKiBTYXZlIGd1ZXN0IHN0YXRlICovCQkJCQkJXAorCS8qIFdlIHNhdmUgdGhlIEd1ZXN0IHN0YXRlOiBhbGwgcmVnaXN0ZXJzIGZpcnN0CQkJXAorCSAqIExhaWQgb3V0IGp1c3QgYXMgInN0cnVjdCBsZ3Vlc3RfcmVncyIgZGVmaW5lcyAqLwkJXAogCXB1c2hsCSVlczsJCQkJCQkJXAogCXB1c2hsCSVkczsJCQkJCQkJXAogCXB1c2hsCSVmczsJCQkJCQkJXApAQCAtNjgsNTggKzE3NCwxMTkgQEAKIAlwdXNobAklZWR4OwkJCQkJCQlcCiAJcHVzaGwJJWVjeDsJCQkJCQkJXAogCXB1c2hsCSVlYng7CQkJCQkJCVwKLQkvKiBMb2FkIGxndWVzdCBkcyBzZWdtZW50IGZvciBjb252ZW5pZW5jZS4gKi8JCQlcCisJLyogT3VyIHN0YWNrIGFuZCBvdXIgY29kZSBhcmUgdXNpbmcgc2VnbWVudHMJCQlcCisJICogU2V0IGluIHRoZSBUU1MgYW5kIElEVAkJCQkJXAorCSAqIFlldCBpZiB3ZSB3ZXJlIHRvIHRvdWNoIGRhdGEgd2UnZCB1c2UJCQlcCisJICogV2hhdGV2ZXIgZGF0YSBzZWdtZW50IHRoZSBHdWVzdCBoYWQuCQkJCVwKKwkgKiBMb2FkIHRoZSBsZ3Vlc3QgZHMgc2VnbWVudCBmb3Igbm93LiAqLwkJCVwKIAltb3ZsCSQoTEdVRVNUX0RTKSwgJWVheDsJCQkJCVwKIAltb3ZsCSVlYXgsICVkczsJCQkJCQlcCi0JLyogRmlndXJlIG91dCB3aGVyZSB3ZSBhcmUsIGJhc2VkIG9uIHN0YWNrIChhdCB0b3Agb2YgcmVncykuICovCVwKKwkvKiBTbyB3aGVyZSBhcmUgd2U/ICBXaGljaCBDUFUsIHdoaWNoIHN0cnVjdD8JCQlcCisJICogVGhlIHN0YWNrIGlzIG91ciBjbHVlOiBvdXIgVFNTIHNldHMJCQkJXAorCSAqIEl0IGF0IHRoZSBlbmQgb2YgInN0cnVjdCBsZ3Vlc3RfcGFnZXMiCQkJXAorCSAqIEFuZCB3ZSB0aGVuIHB1c2hlZCBhbmQgcHVzaGVkIGFuZCBwdXNoZWQgR3Vlc3QgcmVnczoJCVwKKwkgKiBOb3cgc3RhY2sgcG9pbnRzIGF0b3AgdGhlICJzdHJ1Y3QgbGd1ZXN0X3JlZ3MiLiAgIAkJXAorCSAqIFN1YnRyYWN0IHRoYXQgb2Zmc2V0LCBhbmQgd2UgZmluZCBvdXIgc3RydWN0LiAqLwkJXAogCW1vdmwJJWVzcCwgJWVheDsJCQkJCQlcCiAJc3VibAkkTEdVRVNUX1BBR0VTX3JlZ3MsICVlYXg7CQkJCVwKLQkvKiBQdXQgdHJhcCBudW1iZXIgaW4gJWVieCBiZWZvcmUgd2Ugc3dpdGNoIGNyMyBhbmQgbG9zZSBpdC4gKi8gXAorCS8qIFNhdmUgb3VyIHRyYXAgbnVtYmVyOiB0aGUgc3dpdGNoIHdpbGwgb2JzY3VyZSBpdAkJXAorCSAqIChUaGUgR3Vlc3QgcmVncyBhcmUgbm90IG1hcHBlZCBoZXJlIGluIHRoZSBIb3N0KQkJXAorCSAqICVlYnggaG9sZHMgaXQgc2FmZSBmb3IgZGVsaXZlcl90b19ob3N0ICovCQkJXAogCW1vdmwJTEdVRVNUX1BBR0VTX3JlZ3NfdHJhcG51bSglZWF4KSwgJWVieDsJCQlcCi0JLyogU3dpdGNoIHRvIGhvc3QgcGFnZSB0YWJsZXMgKGhvc3QgR0RULCBJRFQgYW5kIHN0YWNrIGFyZSBpbiBob3N0ICAgXAotCSAgIG1lbSwgc28gbmVlZCB0aGlzIGZpcnN0KSAqLwkJCQkJXAorCS8qIFRoZSBIb3N0IEdEVCwgSURUIGFuZCBzdGFjayEJCQkJCVwKKwkgKiBBbGwgdGhlc2UgbGllIHNhZmVseSBoaWRkZW4gZnJvbSB0aGUgR3Vlc3Q6CQkJXAorCSAqIFdlIG11c3QgcmV0dXJuIHRvIHRoZSBIb3N0IHBhZ2UgdGFibGVzCQkJXAorCSAqIChIZW5jZSB0aGF0IHdhcyBzYXZlZCBpbiBzdHJ1Y3QgbGd1ZXN0X3BhZ2VzKSAqLwkJXAogCW1vdmwJTEdVRVNUX1BBR0VTX2hvc3RfY3IzKCVlYXgpLCAlZWR4OwkJCVwKIAltb3ZsCSVlZHgsICVjcjM7CQkJCQkJXAotCS8qIFNldCBndWVzdCdzIFRTUyB0byBhdmFpbGFibGUgKGNsZWFyIGJ5dGUgNSBiaXQgMikuICovCVwKKwkvKiBBcyBiZWZvcmUsIHdoZW4gd2UgbG9va2VkIGJhY2sgYXQgdGhlIEhvc3QJCQlcCisJICogQXMgd2UgbGVmdCBhbmQgbWFya2VkIFRTUyB1bnVzZWQJCQkJXAorCSAqIFNvIG11c3Qgd2Ugbm93IGZvciB0aGUgR3Vlc3QgbGVmdCBiZWhpbmQuICovCQkJXAogCWFuZGIJJDB4RkQsIChMR1VFU1RfUEFHRVNfZ3Vlc3RfZ2R0K0dEVF9FTlRSWV9UU1MqOCs1KSglZWF4KTsgXAotCS8qIFN3aXRjaCB0byBob3N0J3MgR0RUICYgSURULiAqLwkJCQlcCisJLyogU3dpdGNoIHRvIEhvc3QncyBHRFQsIElEVC4gKi8JCQkJXAogCWxnZHQJTEdVRVNUX1BBR0VTX2hvc3RfZ2R0X2Rlc2MoJWVheCk7CQkJXAogCWxpZHQJTEdVRVNUX1BBR0VTX2hvc3RfaWR0X2Rlc2MoJWVheCk7CQkJXAotCS8qIFN3aXRjaCB0byBob3N0J3Mgc3RhY2suICovCQkJCQlcCisJLyogUmVzdG9yZSB0aGUgSG9zdCdzIHN0YWNrIHdoZXJlIGl0J3Mgc2F2ZWQgcmVncyBsaWUgKi8JXAogCW1vdmwJTEdVRVNUX1BBR0VTX2hvc3Rfc3AoJWVheCksICVlc3A7CQkJXAotCS8qIFN3aXRjaCB0byBob3N0J3MgVFNTICovCQkJCQlcCisJLyogTGFzdCB0aGUgVFNTOiBvdXIgSG9zdCBpcyBjb21wbGV0ZSAqLwkJCVwKIAltb3ZsCSQoR0RUX0VOVFJZX1RTUyo4KSwgJWVkeDsJCQkJXAogCWx0cgklZHg7CQkJCQkJCVwKKwkvKiBSZXN0b3JlIG5vdyB0aGUgcmVncyBzYXZlZCByaWdodCBhdCB0aGUgZmlyc3QuICovCQlcCiAJcG9wbAklZWJwOwkJCQkJCQlcCiAJcG9wbAklZnM7CQkJCQkJCVwKIAlwb3BsCSVnczsJCQkJCQkJXAogCXBvcGwJJWRzOwkJCQkJCQlcCiAJcG9wbAklZXMKIAotLyogUmV0dXJuIHRvIHJ1bl9ndWVzdF9vbmNlLiAqLworLy8gSGVyZSdzIHdoZXJlIHdlIGNvbWUgd2hlbiB0aGUgR3Vlc3QgaGFzIGp1c3QgdHJhcHBlZDoKKy8vIChXaGljaCB0cmFwIHdlJ2xsIHNlZSBoYXMgYmVlbiBwdXNoZWQgb24gdGhlIHN0YWNrKS4KKy8vIFdlIG5lZWQgb25seSBzd2l0Y2ggYmFjaywgYW5kIHRoZSBIb3N0IHdpbGwgZGVjb2RlCisvLyBXaHkgd2UgY2FtZSBob21lLCBhbmQgd2hhdCBuZWVkcyB0byBiZSBkb25lLgogcmV0dXJuX3RvX2hvc3Q6CiAJU1dJVENIX1RPX0hPU1QKIAlpcmV0CiAKKy8vIEFuIGludGVycnVwdCwgd2l0aCBzb21lIGNhdXNlIGV4dGVybmFsCisvLyBIYXMgYWplcmtlZCB1cyBydWRlbHkgZnJvbSB0aGUgR3Vlc3QncyBjb2RlCisvLyBBZ2FpbiB3ZSBtdXN0IHJldHVybiBob21lIHRvIHRoZSBIb3N0CiBkZWxpdmVyX3RvX2hvc3Q6CiAJU1dJVENIX1RPX0hPU1QKLQkvKiBEZWNvZGUgSURUIGFuZCBqdW1wIHRvIGhvc3RzJyBpcnEgaGFuZGxlci4gIFdoZW4gdGhhdCBkb2VzIGlyZXQsIGl0Ci0JICogd2lsbCByZXR1cm4gdG8gcnVuX2d1ZXN0X29uY2UuICBUaGlzIGlzIGEgZmVhdHVyZS4gKi8KKwkvLyBCdXQgbm93IHdlIG11c3QgZ28gaG9tZSB2aWEgdGhhdCBwbGFjZQorCS8vIFdoZXJlIHRoYXQgaW50ZXJydXB0IHdhcyBzdXBwb3NlZCB0byBnbworCS8vIEhhZCB3ZSBub3QgYmVlbiBlbnNjb25jZWQsIHJ1bm5pbmcgdGhlIEd1ZXN0LgorCS8vIEhlcmUgd2Ugc2VlIHRoZSBjbGV2ZXJuZXNzIG9mIG91ciBzdGFjazoKKwkvLyBUaGUgSG9zdCBzdGFjayBpcyBmb3JtZWQgbGlrZSBhbiBpbnRlcnJ1cHQKKwkvLyBXaXRoIEVJUCwgQ1MgYW5kIEVGTEFHUyBsYXllcmVkLgorCS8vIEludGVycnVwdCBoYW5kbGVycyBlbmQgd2l0aCAiaXJldCIKKwkvLyBBbmQgdGhhdCB3aWxsIHRha2UgdXMgaG9tZSBhdCBsb25nIGxvbmcgbGFzdC4KKworCS8vIEJ1dCBmaXJzdCB3ZSBtdXN0IGZpbmQgdGhlIGhhbmRsZXIgdG8gY2FsbCEKKwkvLyBUaGUgSURUIGRlc2NyaXB0b3IgZm9yIHRoZSBIb3N0CisJLy8gSGFzIHR3byBieXRlcyBmb3Igc2l6ZSwgYW5kIGZvdXIgZm9yIGFkZHJlc3M6CisJLy8gJWVkeCB3aWxsIGhvbGQgaXQgZm9yIHVzIGZvciBub3cuCiAJbW92bAkoTEdVRVNUX1BBR0VTX2hvc3RfaWR0X2Rlc2MrMikoJWVheCksICVlZHgKKwkvLyBXZSBub3cga25vdyB0aGUgdGFibGUgYWRkcmVzcyB3ZSBuZWVkLAorCS8vIEFuZCBzYXZlZCB0aGUgdHJhcCdzIG51bWJlciBpbnNpZGUgJWVieC4KKwkvLyBZZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGhhbmRsZXIgaXMgc21lYXJlZAorCS8vIEFjcm9zcyB0aGUgYml0cyBvZiB0aGUgdGFibGUgZW50cnkuCisJLy8gV2hhdCBvcmFjbGUgY2FuIHRlbGwgdXMgaG93IHRvIGV4dHJhY3QKKwkvLyBGcm9tIHN1Y2ggYSBjb252b2x1dGVkIGVuY29kaW5nPworCS8vIEkgY29uc3VsdGVkIGdjYywgYW5kIGl0IGdhdmUKKwkvLyBUaGVzZSBpbnN0cnVjdGlvbnMsIHdoaWNoIEkgZ2xhZGx5IGNyZWRpdDoKIAlsZWFsCSglZWR4LCVlYngsOCksICVlYXgKIAltb3Z6d2wJKCVlYXgpLCVlZHgKIAltb3ZsCTQoJWVheCksICVlYXgKIAl4b3J3CSVheCwgJWF4CiAJb3JsCSVlYXgsICVlZHgKKwkvLyBOb3cgdGhlIGFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIncyBpbiAlZWR4CisJLy8gV2UgY2FsbCBpdCBub3c6IGl0cyAiaXJldCIgdGFrZXMgdXMgaG9tZS4KIAlqbXAJKiVlZHgKIAotLyogUmVhbCBoYXJkd2FyZSBpbnRlcnJ1cHRzIGFyZSBkZWxpdmVyZWQgc3RyYWlnaHQgdG8gdGhlIGhvc3QuICBPdGhlcnMKLSAgIGNhdXNlIHVzIHRvIHJldHVybiB0byBydW5fZ3Vlc3Rfb25jZSBzbyBpdCBjYW4gZGVjaWRlIHdoYXQgdG8gZG8uICBOb3RlCi0gICB0aGF0IHNvbWUgb2YgdGhlc2UgYXJlIG92ZXJyaWRkZW4gYnkgdGhlIGd1ZXN0IHRvIGRlbGl2ZXIgZGlyZWN0bHksIGFuZAotICAgbmV2ZXIgZW50ZXIgaGVyZSAoc2VlIGxvYWRfZ3Vlc3RfaWR0X2VudHJ5KS4gKi8KKy8vIEV2ZXJ5IGludGVycnVwdCBjYW4gY29tZSB0byB1cyBoZXJlCisvLyBCdXQgd2UgbXVzdCB0cnVseSB0ZWxsIGVhY2ggYXBhcnQuCisvLyBUaGV5IG51bWJlciB0d28gaHVuZHJlZCBhbmQgZmlmdHkgc2l4CisvLyBBbmQgZWFjaCBtdXN0IGxhbmQgaW4gYSBkaWZmZXJlbnQgc3BvdCwKKy8vIFB1c2ggaXRzIG51bWJlciBvbiBzdGFjaywgYW5kIGpvaW4gdGhlIHN0cmVhbS4KKworLy8gQW5kIHdvcnNlLCBhIG1lcmUgc2l4IG9mIHRoZSB0cmFwcyBzdGFuZCBhcGFydAorLy8gQW5kIHB1c2ggb24gdGhlaXIgc3RhY2sgYW4gYWRkaXRpb246CisvLyBBbiBlcnJvciBudW1iZXIsIHRoaXJ0eSB0d28gYml0cyBsb25nCisvLyBTbyB3ZSBwdW5pc2ggdGhlIG90aGVyIHR3byBmaWZ0eQorLy8gQW5kIG1ha2UgdGhlbSBwdXNoIGEgemVybyBzbyB0aGV5IG1hdGNoLgorCisvLyBZZXQgdHdvIGZpZnR5IHNpeCBlbnRyaWVzIGlzIGxvbmcKKy8vIEFuZCBhbGwgd2lsbCBsb29rIG1vc3QgdGhlIHNhbWUgYXMgdGhlIGxhc3QKKy8vIFNvIHdlIGNyZWF0ZSBhIG1hY3JvIHdoaWNoIGNhbiBtYWtlCisvLyBBcyBtYW55IGVudHJpZXMgYXMgd2UgbmVlZCB0byBmaWxsLgorCisvLyBOb3RlIHRoZSBjaGFuZ2UgdG8gLmRhdGEgdGhlbiAudGV4dDoKKy8vIFdlIHBsYW50IHRoZSBhZGRyZXNzIG9mIGVhY2ggZW50cnkKKy8vIEludG8gYSAoZGF0YSkgdGFibGUgZm9yIHRoZSBIb3N0CisvLyBUbyBrbm93IHdoZXJlIGVhY2ggR3Vlc3QgaW50ZXJydXB0IHNob3VsZCBnby4KIC5tYWNybyBJUlFfU1RVQiBOIFRBUkdFVAogCS5kYXRhOyAubG9uZyAxZjsgLnRleHQ7IDE6Ci0gLyogTWFrZSBhbiBlcnJvciBudW1iZXIgZm9yIG1vc3QgdHJhcHMsIHdoaWNoIGRvbid0IGhhdmUgb25lLiAqLworIC8vIFRyYXAgZWlnaHQsIHRlbiB0aHJvdWdoIGZvdXJ0ZWVuIGFuZCBzZXZlbnRlZW4KKyAvLyBTdXBwbHkgYW4gZXJyb3IgbnVtYmVyLiAgRWxzZSB6ZXJvLgogIC5pZiAoXE4gPD4gOCkgJiYgKFxOIDwgMTAgfHwgXE4gPiAxNCkgJiYgKFxOIDw+IDE3KQogCXB1c2hsCSQwCiAgLmVuZGlmCkBAIC0xMjgsNiArMjk1LDggQEAKIAlBTElHTgogLmVuZG0KIAorLy8gVGhpcyBtYWNybyBjcmVhdGVzIG51bWVyb3VzIGVudHJpZXMKKy8vIFVzaW5nIEdBUyBtYWNyb3Mgd2hpY2ggb3V0LXBvd2VyIEMncy4KIC5tYWNybyBJUlFfU1RVQlMgRklSU1QgTEFTVCBUQVJHRVQKICBpcnE9XEZJUlNUCiAgLnJlcHQgXExBU1QtXEZJUlNUKzEKQEAgLTEzNiwyNCArMzA1LDQzIEBACiAgLmVuZHIKIC5lbmRtCiAKLS8qIFdlIGludGVyY2VwdCBldmVyeSBpbnRlcnJ1cHQsIGJlY2F1c2Ugd2UgbWF5IG5lZWQgdG8gc3dpdGNoIGJhY2sgdG8KLSAqIGhvc3QuICBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IHRlbGwgdGhlbSBhcGFydCBleGNlcHQgYnkgZW50cnkKLSAqIHBvaW50LCBzbyB3ZSBuZWVkIDI1NiBlbnRyeSBwb2ludHMuCi0gKi8KKy8vIEhlcmUncyB0aGUgbWFya2VyIGZvciBvdXIgcG9pbnRlciB0YWJsZQorLy8gTGFpZCBpbiB0aGUgZGF0YSBzZWN0aW9uIGp1c3QgYmVmb3JlCisvLyBFYWNoIG1hY3JvIHBsYWNlcyB0aGUgYWRkcmVzcyBvZiBjb2RlCisvLyBGb3JtaW5nIGFuIGFycmF5OiBlYWNoIG9uZSBwb2ludHMgdG8gdGV4dAorLy8gV2hpY2ggaGFuZGxlcyBpbnRlcnJ1cHQgaW4gaXRzIHR1cm4uCiAuZGF0YQogLmdsb2JhbCBkZWZhdWx0X2lkdF9lbnRyaWVzCiBkZWZhdWx0X2lkdF9lbnRyaWVzOgogLnRleHQKLQlJUlFfU1RVQlMgMCAxIHJldHVybl90b19ob3N0CQkvKiBGaXJzdCB0d28gdHJhcHMgKi8KLQlJUlFfU1RVQiAyIGhhbmRsZV9ubWkJCQkvKiBOTUkgKi8KLQlJUlFfU1RVQlMgMyAzMSByZXR1cm5fdG9faG9zdAkJLyogUmVzdCBvZiB0cmFwcyAqLwotCUlSUV9TVFVCUyAzMiAxMjcgZGVsaXZlcl90b19ob3N0CS8qIFJlYWwgaW50ZXJydXB0cyAqLwotCUlSUV9TVFVCIDEyOCByZXR1cm5fdG9faG9zdAkJLyogU3lzdGVtIGNhbGwgKG92ZXJyaWRkZW4pICovCi0JSVJRX1NUVUJTIDEyOSAyNTUgZGVsaXZlcl90b19ob3N0CS8qIE90aGVyIHJlYWwgaW50ZXJydXB0cyAqLworCS8vIFRoZSBmaXJzdCB0d28gdHJhcHMgZ28gc3RyYWlnaHQgYmFjayB0byB0aGUgSG9zdAorCUlSUV9TVFVCUyAwIDEgcmV0dXJuX3RvX2hvc3QKKwkvLyBXZSdsbCBzYXkgbm90aGluZywgeWV0LCBhYm91dCBOTUkKKwlJUlFfU1RVQiAyIGhhbmRsZV9ubWkKKwkvLyBPdGhlciB0cmFwcyBhbHNvIHJldHVybiB0byB0aGUgSG9zdAorCUlSUV9TVFVCUyAzIDMxIHJldHVybl90b19ob3N0CisJLy8gQWxsIGludGVycnVwdHMgZ28gdmlhIHRoZWlyIGhhbmRsZXJzCisJSVJRX1NUVUJTIDMyIDEyNyBkZWxpdmVyX3RvX2hvc3QKKwkvLyAnQ2VwdCBzeXN0ZW0gY2FsbHMgY29taW5nIGZyb20gdXNlcnNwYWNlCisJLy8gQXJlIHRvIGdvIHRvIHRoZSBHdWVzdCwgbmV2ZXIgdGhlIEhvc3QuCisJSVJRX1NUVUIgMTI4IHJldHVybl90b19ob3N0CisJSVJRX1NUVUJTIDEyOSAyNTUgZGVsaXZlcl90b19ob3N0CiAKLS8qIFdlIGlnbm9yZSBOTUkgYW5kIHJldHVybi4gKi8KKy8vIFRoZSBOTUksIHdoYXQgYSBmYWJ1bG91cyBiZWFzdAorLy8gV2hpY2ggc3dvb3BzIGluIGFuZCBzdG9wcyB1cyBubyBtYXR0ZXIgdGhhdAorLy8gV2UncmUgc3VzcGVuZGVkIGJldHdlZW4gaGVhdmVuIGFuZCBoZWxsLAorLy8gKE9yIG1vcmUgbGlrZWx5IGJldHdlZW4gdGhlIEhvc3QgYW5kIEd1ZXN0KQorLy8gV2hlbiBpbiBpdCBjb21lcyEgIFdlIGFyZSBkYXplZCBhbmQgY29uZnVzZWQKKy8vIFNvIHdlIGRvIHRoZSBzaW1wbGVzdCB0aGluZyB3aGljaCBvbmUgY2FuLgorLy8gVGhvdWdoIHdlJ3ZlIHB1c2hlZCB0aGUgdHJhcCBudW1iZXIgYW5kIHplcm8KKy8vIFdlIGRpc2NhcmQgdGhlbSwgcmV0dXJuLCBhbmQgaG9wZSB3ZSBsaXZlLgogaGFuZGxlX25taToKIAlhZGRsCSQ4LCAlZXNwCiAJaXJldAogCisvLyBXZSBhcmUgZG9uZTsgYWxsIHRoYXQncyBsZWZ0IGlzIE1hc3RlcnkKKy8vIEFuZCAibWFrZSBNYXN0ZXJ5IiBpcyBhIGpvdXJuZXkgbG9uZworLy8gRGVzaWduZWQgdG8gbWFrZSB5b3VyIGZpbmdlcnMgaXRjaCB0byBjb2RlLgorCisvLyBIZXJlIGVuZHMgdGhlIHRleHQsIHRoZSBmaWxlIGFuZCBwb2VtLgogRU5UUlkoZW5kX3N3aXRjaGVyX3RleHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKaW5kZXggMmZjMTk5Yi4uMmJjZGU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YWJsZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpAQCAtNTI2LDcgKzUyNiw3IEBACiAKIHZvaWQgZG1fc2V0X2RldmljZV9saW1pdHMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gYmRldl9nZXRfcXVldWUoYmRldik7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAlzdHJ1Y3QgaW9fcmVzdHJpY3Rpb25zICpycyA9ICZ0aS0+bGltaXRzOwogCiAJLyoKQEAgLTk3OSw3ICs5NzksNyBAQAogCWRldmljZXMgPSBkbV90YWJsZV9nZXRfZGV2aWNlcyh0KTsKIAlmb3IgKGQgPSBkZXZpY2VzLT5uZXh0OyBkICE9IGRldmljZXM7IGQgPSBkLT5uZXh0KSB7CiAJCXN0cnVjdCBkbV9kZXYgKmRkID0gbGlzdF9lbnRyeShkLCBzdHJ1Y3QgZG1fZGV2LCBsaXN0KTsKLQkJcmVxdWVzdF9xdWV1ZV90ICpxID0gYmRldl9nZXRfcXVldWUoZGQtPmJkZXYpOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRkLT5iZGV2KTsKIAkJciB8PSBiZGlfY29uZ2VzdGVkKCZxLT5iYWNraW5nX2Rldl9pbmZvLCBiZGlfYml0cyk7CiAJfQogCkBAIC05OTIsNyArOTkyLDcgQEAKIAogCWZvciAoZCA9IGRldmljZXMtPm5leHQ7IGQgIT0gZGV2aWNlczsgZCA9IGQtPm5leHQpIHsKIAkJc3RydWN0IGRtX2RldiAqZGQgPSBsaXN0X2VudHJ5KGQsIHN0cnVjdCBkbV9kZXYsIGxpc3QpOwotCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShkZC0+YmRldik7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGQtPmJkZXYpOwogCiAJCWlmIChxLT51bnBsdWdfZm4pCiAJCQlxLT51bnBsdWdfZm4ocSk7CkBAIC0xMDExLDcgKzEwMTEsNyBAQAogCiAJZm9yIChkID0gZGV2aWNlcy0+bmV4dDsgZCAhPSBkZXZpY2VzOyBkID0gZC0+bmV4dCkgewogCQlzdHJ1Y3QgZG1fZGV2ICpkZCA9IGxpc3RfZW50cnkoZCwgc3RydWN0IGRtX2RldiwgbGlzdCk7Ci0JCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRkLT5iZGV2KTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShkZC0+YmRldik7CiAJCWludCBlcnI7CiAKIAkJaWYgKCFxLT5pc3N1ZV9mbHVzaF9mbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCA4NDY2MTRlLi4xNDFmZjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC04MCw3ICs4MCw3IEBACiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJY2hhciBuYW1lWzE2XTsKIApAQCAtNzkyLDcgKzc5Miw3IEBACiAgKiBUaGUgcmVxdWVzdCBmdW5jdGlvbiB0aGF0IGp1c3QgcmVtYXBzIHRoZSBiaW8gYnVpbHQgdXAgYnkKICAqIGRtX21lcmdlX2J2ZWMuCiAgKi8KLXN0YXRpYyBpbnQgZG1fcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgZG1fcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCWludCByOwogCWludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwpAQCAtODQ0LDcgKzg0NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG1fZmx1c2hfYWxsKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCitzdGF0aWMgaW50IGRtX2ZsdXNoX2FsbChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCiAJCQlzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQogewogCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IHEtPnF1ZXVlZGF0YTsKQEAgLTg1OSw3ICs4NTksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGRtX3VucGx1Z19hbGwocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgZG1fdW5wbHVnX2FsbChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IGRtX3RhYmxlICptYXAgPSBkbV9nZXRfdGFibGUobWQpOwpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIAogc3RhdGljIGludCBfX2JpbmQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gbWQtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbWQtPnF1ZXVlOwogCXNlY3Rvcl90IHNpemU7CiAKIAlzaXplID0gZG1fdGFibGVfZ2V0X3NpemUodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2ZhdWx0eS5jIGIvZHJpdmVycy9tZC9mYXVsdHkuYwppbmRleCA0ZWJkMGYyLi5jYjA1OWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2ZhdWx0eS5jCisrKyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCQljb25mLT5uZmF1bHRzID0gbisxOwogfQogCi1zdGF0aWMgaW50IG1ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJY29uZl90ICpjb25mID0gKGNvbmZfdCopbWRkZXYtPnByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2xpbmVhci5jIGIvZHJpdmVycy9tZC9saW5lYXIuYwppbmRleCAxOTI3NDEwLi4xN2Y3OTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2xpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKQEAgLTU1LDcgKzU1LDcgQEAKICAqCiAgKglSZXR1cm4gYW1vdW50IG9mIGJ5dGVzIHdlIGNhbiB0YWtlIGF0IHRoaXMgb2Zmc2V0CiAgKi8KLXN0YXRpYyBpbnQgbGluZWFyX21lcmdlYWJsZV9idmVjKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvX3ZlYyAqYmlvdmVjKQorc3RhdGljIGludCBsaW5lYXJfbWVyZ2VhYmxlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpb192ZWMgKmJpb3ZlYykKIHsKIAltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKIAlkZXZfaW5mb190ICpkZXYwOwpAQCAtNzksMjAgKzc5LDIwIEBACiAJcmV0dXJuIG1heHNlY3RvcnMgPDwgOTsKIH0KIAotc3RhdGljIHZvaWQgbGluZWFyX3VucGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBsaW5lYXJfdW5wbHVnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCWxpbmVhcl9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKIAlpbnQgaTsKIAogCWZvciAoaT0wOyBpIDwgbWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewotCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShjb25mLT5kaXNrc1tpXS5yZGV2LT5iZGV2KTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShjb25mLT5kaXNrc1tpXS5yZGV2LT5iZGV2KTsKIAkJaWYgKHJfcXVldWUtPnVucGx1Z19mbikKIAkJCXJfcXVldWUtPnVucGx1Z19mbihyX3F1ZXVlKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbGluZWFyX2lzc3VlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCitzdGF0aWMgaW50IGxpbmVhcl9pc3N1ZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCiAJCQkgICAgICBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKIAlmb3IgKGk9MDsgaSA8IG1kZGV2LT5yYWlkX2Rpc2tzICYmIHJldCA9PSAwOyBpKyspIHsKIAkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGNvbmYtPmRpc2tzW2ldLnJkZXYtPmJkZXY7Ci0JCXJlcXVlc3RfcXVldWVfdCAqcl9xdWV1ZSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcl9xdWV1ZSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOwogCiAJCWlmICghcl9xdWV1ZS0+aXNzdWVfZmx1c2hfZm4pCiAJCQlyZXQgPSAtRU9QTk9UU1VQUDsKQEAgLTExOCw3ICsxMTgsNyBAQAogCWludCBpLCByZXQgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IG1kZGV2LT5yYWlkX2Rpc2tzICYmICFyZXQgOyBpKyspIHsKLQkJcmVxdWVzdF9xdWV1ZV90ICpxID0gYmRldl9nZXRfcXVldWUoY29uZi0+ZGlza3NbaV0ucmRldi0+YmRldik7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoY29uZi0+ZGlza3NbaV0ucmRldi0+YmRldik7CiAJCXJldCB8PSBiZGlfY29uZ2VzdGVkKCZxLT5iYWNraW5nX2Rldl9pbmZvLCBiaXRzKTsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTMzMCw3ICszMzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxpbmVhcl9tYWtlX3JlcXVlc3QgKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBsaW5lYXJfbWFrZV9yZXF1ZXN0IChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDY1ZGRjODguLmY4ODNiN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCQkpCiAKIAotc3RhdGljIGludCBtZF9mYWlsX3JlcXVlc3QgKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIGludCBtZF9mYWlsX3JlcXVlc3QgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJYmlvX2lvX2Vycm9yKGJpbywgYmlvLT5iaV9zaXplKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IDE0ZGEzN2YuLjFlMmFmNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKKysrIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJCW1ka19yZGV2X3QgKnJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+bXVsdGlwYXRoc1tpXS5yZGV2KTsKIAkJaWYgKHJkZXYgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKQogCQkgICAgJiYgYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcpKSB7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUocmRldi0+YmRldik7CiAKIAkJCWF0b21pY19pbmMoJnJkZXYtPm5yX3BlbmRpbmcpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xNDAsMTMgKzE0MCwxMyBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi1zdGF0aWMgdm9pZCBtdWx0aXBhdGhfdW5wbHVnKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIG11bHRpcGF0aF91bnBsdWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJdW5wbHVnX3NsYXZlcyhxLT5xdWV1ZWRhdGEpOwogfQogCiAKLXN0YXRpYyBpbnQgbXVsdGlwYXRoX21ha2VfcmVxdWVzdCAocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICogYmlvKQorc3RhdGljIGludCBtdWx0aXBhdGhfbWFrZV9yZXF1ZXN0IChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqIGJpbykKIHsKIAltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKIAltdWx0aXBhdGhfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CkBAIC0xOTksNyArMTk5LDcgQEAKIAlzZXFfcHJpbnRmIChzZXEsICJdIik7CiB9CiAKLXN0YXRpYyBpbnQgbXVsdGlwYXRoX2lzc3VlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCitzdGF0aWMgaW50IG11bHRpcGF0aF9pc3N1ZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCiAJCQkJIHNlY3Rvcl90ICplcnJvcl9zZWN0b3IpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CkBAIC0yMTEsNyArMjExLDcgQEAKIAkJbWRrX3JkZXZfdCAqcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5tdWx0aXBhdGhzW2ldLnJkZXYpOwogCQlpZiAocmRldiAmJiAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKSB7CiAJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gcmRldi0+YmRldjsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcl9xdWV1ZSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAogCQkJaWYgKCFyX3F1ZXVlLT5pc3N1ZV9mbHVzaF9mbikKIAkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKQEAgLTIzOCw3ICsyMzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBtZGRldi0+cmFpZF9kaXNrcyA7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm11bHRpcGF0aHNbaV0ucmRldik7CiAJCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKHJkZXYtPmJkZXYpOworCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKIAogCQkJcmV0IHw9IGJkaV9jb25nZXN0ZWQoJnEtPmJhY2tpbmdfZGV2X2luZm8sIGJpdHMpOwogCQkJLyogSnVzdCBsaWtlIG11bHRpcGF0aF9tYXAsIHdlIGp1c3QgY2hlY2sgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQwLmMgYi9kcml2ZXJzL21kL3JhaWQwLmMKaW5kZXggMmM0MDRmNy4uYjgyMTZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDAuYwpAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBNRF9EUklWRVIKICNkZWZpbmUgTURfUEVSU09OQUxJVFkKIAotc3RhdGljIHZvaWQgcmFpZDBfdW5wbHVnKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyB2b2lkIHJhaWQwX3VucGx1ZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKIAlyYWlkMF9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKQEAgLTMzLDE0ICszMywxNCBAQAogCWludCBpOwogCiAJZm9yIChpPTA7IGk8bWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewotCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShkZXZsaXN0W2ldLT5iZGV2KTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShkZXZsaXN0W2ldLT5iZGV2KTsKIAogCQlpZiAocl9xdWV1ZS0+dW5wbHVnX2ZuKQogCQkJcl9xdWV1ZS0+dW5wbHVnX2ZuKHJfcXVldWUpOwogCX0KIH0KIAotc3RhdGljIGludCByYWlkMF9pc3N1ZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorc3RhdGljIGludCByYWlkMF9pc3N1ZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCiAJCQkgICAgIHNlY3Rvcl90ICplcnJvcl9zZWN0b3IpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CkBAIC01MCw3ICs1MCw3IEBACiAKIAlmb3IgKGk9MDsgaTxtZGRldi0+cmFpZF9kaXNrcyAmJiByZXQgPT0gMDsgaSsrKSB7CiAJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBkZXZsaXN0W2ldLT5iZGV2OwotCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAogCQlpZiAoIXJfcXVldWUtPmlzc3VlX2ZsdXNoX2ZuKQogCQkJcmV0ID0gLUVPUE5PVFNVUFA7CkBAIC02OCw3ICs2OCw3IEBACiAJaW50IGksIHJldCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPnJhaWRfZGlza3MgJiYgIXJldCA7IGkrKykgewotCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShkZXZsaXN0W2ldLT5iZGV2KTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShkZXZsaXN0W2ldLT5iZGV2KTsKIAogCQlyZXQgfD0gYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgYml0cyk7CiAJfQpAQCAtMjY4LDcgKzI2OCw3IEBACiAgKgogICoJUmV0dXJuIGFtb3VudCBvZiBieXRlcyB3ZSBjYW4gYWNjZXB0IGF0IHRoaXMgb2Zmc2V0CiAgKi8KLXN0YXRpYyBpbnQgcmFpZDBfbWVyZ2VhYmxlX2J2ZWMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW9fdmVjICpiaW92ZWMpCitzdGF0aWMgaW50IHJhaWQwX21lcmdlYWJsZV9idmVjKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW9fdmVjICpiaW92ZWMpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgKyBnZXRfc3RhcnRfc2VjdChiaW8tPmJpX2JkZXYpOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFpZDBfbWFrZV9yZXF1ZXN0IChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgcmFpZDBfbWFrZV9yZXF1ZXN0IChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCXVuc2lnbmVkIGludCBzZWN0X2luX2NodW5rLCBjaHVua3NpemVfYml0cywgIGNodW5rX3NpemUsIGNodW5rX3NlY3RzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9tZC9yYWlkMS5jCmluZGV4IDAwYzc4YjcuLjY1MDk5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuYworKysgYi9kcml2ZXJzL21kL3JhaWQxLmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogCWZvciAoaT0wOyBpPG1kZGV2LT5yYWlkX2Rpc2tzOyBpKyspIHsKIAkJbWRrX3JkZXZfdCAqcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5taXJyb3JzW2ldLnJkZXYpOwogCQlpZiAocmRldiAmJiAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpICYmIGF0b21pY19yZWFkKCZyZGV2LT5ucl9wZW5kaW5nKSkgewotCQkJcmVxdWVzdF9xdWV1ZV90ICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUocmRldi0+YmRldik7CisJCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcl9xdWV1ZSA9IGJkZXZfZ2V0X3F1ZXVlKHJkZXYtPmJkZXYpOwogCiAJCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaWQxX3VucGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCByYWlkMV91bnBsdWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CiAKQEAgLTU3NSw3ICs1NzUsNyBAQAogCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CiB9CiAKLXN0YXRpYyBpbnQgcmFpZDFfaXNzdWVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKK3N0YXRpYyBpbnQgcmFpZDFfaXNzdWVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtNTg3LDcgKzU4Nyw3IEBACiAJCW1ka19yZGV2X3QgKnJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+bWlycm9yc1tpXS5yZGV2KTsKIAkJaWYgKHJkZXYgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgewogCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHJkZXYtPmJkZXY7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUoYmRldik7CiAKIAkJCWlmICghcl9xdWV1ZS0+aXNzdWVfZmx1c2hfZm4pCiAJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CkBAIC02MTUsNyArNjE1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm1pcnJvcnNbaV0ucmRldik7CiAJCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKHJkZXYtPmJkZXYpOworCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKIAogCQkJLyogTm90ZSB0aGUgJ3x8IDEnIC0gd2hlbiByZWFkX2JhbGFuY2UgcHJlZmVycwogCQkJICogbm9uLWNvbmdlc3RlZCB0YXJnZXRzLCBpdCBjYW4gYmUgcmVtb3ZlZApAQCAtNzY1LDcgKzc2NSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqIGJpbykKK3N0YXRpYyBpbnQgbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICogYmlvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCWNvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggYTk1YWRhMS4uZjczMGExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC00NTMsNyArNDUzLDcgQEAKICAqICAgICAgSWYgbmVhcl9jb3BpZXMgPT0gcmFpZF9kaXNrLCB0aGVyZSBhcmUgbm8gc3RyaXBpbmcgaXNzdWVzLAogICogICAgICBidXQgaW4gdGhhdCBjYXNlLCB0aGUgZnVuY3Rpb24gaXNuJ3QgY2FsbGVkIGF0IGFsbC4KICAqLwotc3RhdGljIGludCByYWlkMTBfbWVyZ2VhYmxlX2J2ZWMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8sCitzdGF0aWMgaW50IHJhaWQxMF9tZXJnZWFibGVfYnZlYyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLAogCQkJCXN0cnVjdCBiaW9fdmVjICpiaW9fdmVjKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtNTk1LDcgKzU5NSw3IEBACiAJZm9yIChpPTA7IGk8bWRkZXYtPnJhaWRfZGlza3M7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm1pcnJvcnNbaV0ucmRldik7CiAJCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYgYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcpKSB7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUocmRldi0+YmRldik7CiAKIAkJCWF0b21pY19pbmMoJnJkZXYtPm5yX3BlbmRpbmcpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC02MTAsNyArNjEwLDcgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIHZvaWQgcmFpZDEwX3VucGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCByYWlkMTBfdW5wbHVnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCkBAIC02MTgsNyArNjE4LDcgQEAKIAltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogfQogCi1zdGF0aWMgaW50IHJhaWQxMF9pc3N1ZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorc3RhdGljIGludCByYWlkMTBfaXNzdWVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtNjMwLDcgKzYzMCw3IEBACiAJCW1ka19yZGV2X3QgKnJkZXYgPSByY3VfZGVyZWZlcmVuY2UoY29uZi0+bWlycm9yc1tpXS5yZGV2KTsKIAkJaWYgKHJkZXYgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgewogCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHJkZXYtPmJkZXY7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUoYmRldik7CiAKIAkJCWlmICghcl9xdWV1ZS0+aXNzdWVfZmx1c2hfZm4pCiAJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CkBAIC02NTgsNyArNjU4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPnJhaWRfZGlza3MgJiYgcmV0ID09IDA7IGkrKykgewogCQltZGtfcmRldl90ICpyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPm1pcnJvcnNbaV0ucmRldik7CiAJCWlmIChyZGV2ICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKHJkZXYtPmJkZXYpOworCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKIAogCQkJcmV0IHw9IGJkaV9jb25nZXN0ZWQoJnEtPmJhY2tpbmdfZGV2X2luZm8sIGJpdHMpOwogCQl9CkBAIC03NzIsNyArNzcyLDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmNvbmYtPnJlc3luY19sb2NrKTsKIH0KIAotc3RhdGljIGludCBtYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICogYmlvKQorc3RhdGljIGludCBtYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKiBiaW8pCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggZDkwZWUxNC4uMmFmZjRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHVucGx1Z19zbGF2ZXMobWRkZXZfdCAqbWRkZXYpOwotc3RhdGljIHZvaWQgcmFpZDVfdW5wbHVnX2RldmljZShyZXF1ZXN0X3F1ZXVlX3QgKnEpOworc3RhdGljIHZvaWQgcmFpZDVfdW5wbHVnX2RldmljZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3RyaXBlX2hlYWQgKmdldF9hY3RpdmVfc3RyaXBlKHJhaWQ1X2NvbmZfdCAqY29uZiwgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgZGlza3MsCiAJCQkJCSAgICAgaW50IHBkX2lkeCwgaW50IG5vYmxvY2spCkBAIC0zMTgyLDcgKzMxODIsNyBAQAogCWZvciAoaT0wOyBpPG1kZGV2LT5yYWlkX2Rpc2tzOyBpKyspIHsKIAkJbWRrX3JkZXZfdCAqcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5kaXNrc1tpXS5yZGV2KTsKIAkJaWYgKHJkZXYgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJiBhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZykpIHsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcl9xdWV1ZSA9IGJkZXZfZ2V0X3F1ZXVlKHJkZXYtPmJkZXYpOworCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KTsKIAogCQkJYXRvbWljX2luYygmcmRldi0+bnJfcGVuZGluZyk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTMxOTcsNyArMzE5Nyw3IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaWQ1X3VucGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgcmFpZDVfdW5wbHVnX2RldmljZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKQEAgLTMyMTYsNyArMzIxNiw3IEBACiAJdW5wbHVnX3NsYXZlcyhtZGRldik7CiB9CiAKLXN0YXRpYyBpbnQgcmFpZDVfaXNzdWVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKK3N0YXRpYyBpbnQgcmFpZDVfaXNzdWVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJICAgICBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQogewogCW1kZGV2X3QgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMzIyOCw3ICszMjI4LDcgQEAKIAkJbWRrX3JkZXZfdCAqcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5kaXNrc1tpXS5yZGV2KTsKIAkJaWYgKHJkZXYgJiYgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgewogCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHJkZXYtPmJkZXY7Ci0JCQlyZXF1ZXN0X3F1ZXVlX3QgKnJfcXVldWUgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKwkJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpyX3F1ZXVlID0gYmRldl9nZXRfcXVldWUoYmRldik7CiAKIAkJCWlmICghcl9xdWV1ZS0+aXNzdWVfZmx1c2hfZm4pCiAJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CkBAIC0zMjY3LDcgKzMyNjcsNyBAQAogLyogV2Ugd2FudCByZWFkIHJlcXVlc3RzIHRvIGFsaWduIHdpdGggY2h1bmtzIHdoZXJlIHBvc3NpYmxlLAogICogYnV0IHdyaXRlIHJlcXVlc3RzIGRvbid0IG5lZWQgdG8uCiAgKi8KLXN0YXRpYyBpbnQgcmFpZDVfbWVyZ2VhYmxlX2J2ZWMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW9fdmVjICpiaW92ZWMpCitzdGF0aWMgaW50IHJhaWQ1X21lcmdlYWJsZV9idmVjKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW9fdmVjICpiaW92ZWMpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgKyBnZXRfc3RhcnRfc2VjdChiaW8tPmJpX2JkZXYpOwpAQCAtMzM3Nyw3ICszMzc3LDcgQEAKIAogc3RhdGljIGludCBiaW9fZml0c19yZGV2KHN0cnVjdCBiaW8gKmJpKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpLT5iaV9iZGV2KTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpLT5iaV9iZGV2KTsKIAogCWlmICgoYmktPmJpX3NpemU+PjkpID4gcS0+bWF4X3NlY3RvcnMpCiAJCXJldHVybiAwOwpAQCAtMzM5Niw3ICszMzk2LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGNodW5rX2FsaWduZWRfcmVhZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKiByYWlkX2JpbykKK3N0YXRpYyBpbnQgY2h1bmtfYWxpZ25lZF9yZWFkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICogcmFpZF9iaW8pCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CiAJcmFpZDVfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CkBAIC0zNDY2LDcgKzM0NjYsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqIGJpKQorc3RhdGljIGludCBtYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKiBiaSkKIHsKIAltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAwNS1mZS5jCmluZGV4IDcxOTVjOTQuLmIxYTljNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDA1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMDUtZmUuYwpAQCAtMjksOCArMjksNiBAQAogCiBzdHJ1Y3QgYWY5MDA1X2ZlX3N0YXRlIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQ7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZCAqdHVuZXI7Ci0KIAlmZV9zdGF0dXNfdCBzdGF0OwogCiAJLyogcmV0cmFpbmluZyBwYXJhbWV0ZXJzICovCkBAIC0zNDUsOCArMzQzLDggQEAKIAkJCQkgICAgICAgMSAmIDB4ZmYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JYWY5MDA1X3dyaXRlX29mZG1fcmVnaXN0ZXIoc3RhdGUtPmQsIHhkX3BfZmVjX3N1cGVyX2ZybV91bml0XzE1XzgsCi0JCQkJICAgMSA+PiA4KTsKKwlyZXQgPSBhZjkwMDVfd3JpdGVfb2ZkbV9yZWdpc3RlcihzdGF0ZS0+ZCwgeGRfcF9mZWNfc3VwZXJfZnJtX3VuaXRfMTVfOCwKKwkJCQkJIDEgPj4gOCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAkvKiByZXNldCBwcmUgdml0ZXJiaSBlcnJvciBjb3VudCAqLwpAQCAtNDQ3LDcgKzQ0NSw3IEBACiAJdTggdGVtcDsKIAlpbnQgcmV0OwogCi0JaWYgKHN0YXRlLT50dW5lciA9PSBOVUxMKQorCWlmIChmZS0+b3BzLnR1bmVyX29wcy5yZWxlYXNlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCiAJKnN0YXQgPSAwOwpAQCAtNDkzLDcgKzQ5MSw3IEBACiBzdGF0aWMgaW50IGFmOTAwNV9mZV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICogYmVyKQogewogCXN0cnVjdCBhZjkwMDVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JaWYgKHN0YXRlLT50dW5lciA9PSBOVUxMKQorCWlmIChmZS0+b3BzLnR1bmVyX29wcy5yZWxlYXNlICA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlhZjkwMDVfZmVfcmVmcmVzaF9zdGF0ZShmZSk7CiAJKmJlciA9IHN0YXRlLT5iZXI7CkBAIC01MDMsNyArNTAxLDcgQEAKIHN0YXRpYyBpbnQgYWY5MDA1X2ZlX3JlYWRfdW5jX2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICogdW5jKQogewogCXN0cnVjdCBhZjkwMDVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JaWYgKHN0YXRlLT50dW5lciA9PSBOVUxMKQorCWlmIChmZS0+b3BzLnR1bmVyX29wcy5yZWxlYXNlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCWFmOTAwNV9mZV9yZWZyZXNoX3N0YXRlKGZlKTsKIAkqdW5jID0gc3RhdGUtPnVuYzsKQEAgLTUxNyw3ICs1MTUsNyBAQAogCWludCByZXQ7CiAJdTggaWZfZ2FpbiwgcmZfZ2FpbjsKIAotCWlmIChzdGF0ZS0+dHVuZXIgPT0gTlVMTCkKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMucmVsZWFzZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyZXQgPQogCSAgICBhZjkwMDVfcmVhZF9vZmRtX3JlZ2lzdGVyKHN0YXRlLT5kLCB4ZF9yX3JlZ19hYWdjX3JmX2dhaW4sCkBAIC04ODEsMTAgKzg3OSw4IEBACiAJICAgICBhZjkwMDVfd3JpdGVfcmVnaXN0ZXJfYml0cyhzdGF0ZS0+ZCwgeGRfSTJDX3JlZ19vZmRtX3JzdCwKIAkJCQkJcmVnX29mZG1fcnN0X3BvcywgcmVnX29mZG1fcnN0X2xlbiwgMSkpKQogCQlyZXR1cm4gcmV0OwotCWlmICgocmV0ID0KLQkgICAgIGFmOTAwNV93cml0ZV9yZWdpc3Rlcl9iaXRzKHN0YXRlLT5kLCB4ZF9JMkNfcmVnX29mZG1fcnN0LAotCQkJCQlyZWdfb2ZkbV9yc3RfcG9zLCByZWdfb2ZkbV9yc3RfbGVuLCAwKSkpCi0JCXJldHVybiByZXQ7CisJcmV0ID0gYWY5MDA1X3dyaXRlX3JlZ2lzdGVyX2JpdHMoc3RhdGUtPmQsIHhkX0kyQ19yZWdfb2ZkbV9yc3QsCisJCQkJCSByZWdfb2ZkbV9yc3RfcG9zLCByZWdfb2ZkbV9yc3RfbGVuLCAwKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC0xMDQxLDcgKzEwMzcsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogYXR0YWNoIHR1bmVyIGFuZCBpbml0ICovCi0JaWYgKHN0YXRlLT50dW5lciA9PSBOVUxMKSB7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnJlbGVhc2UgPT0gTlVMTCkgewogCQkvKiByZWFkIHR1bmVyIGFuZCBib2FyZCBpZCBmcm9tIGVlcHJvbSAqLwogCQlyZXQgPSBhZjkwMDVfcmVhZF9lZXByb20oYWRhcC0+ZGV2LCAweGM2LCBidWYsIDIpOwogCQlpZiAocmV0KSB7CkBAIC0xMDU4LDIwICsxMDU0LDE2IEBACiAJCQkJcmV0dXJuIHJldDsKIAkJCX0KIAkJCWlmMSA9ICh1MTYpIChidWZbMF0gPDwgOCkgKyBidWZbMV07Ci0JCQlzdGF0ZS0+dHVuZXIgPQotCQkJICAgIGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAotCQkJCSAgICAgICAmYWY5MDA1X210MjA2MF9jb25maWcsIGlmMSk7Ci0JCQlpZiAoc3RhdGUtPnR1bmVyID09IE5VTEwpIHsKKwkJCWlmIChkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCQkJICZhZjkwMDVfbXQyMDYwX2NvbmZpZywgaWYxKSA9PSBOVUxMKSB7CiAJCQkJZGViX2luZm8oIk1UMjA2MCBhdHRhY2ggZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIDM6CS8qIFFUMTAxMCAqLwogCQljYXNlIDk6CS8qIFFUMTAxMEIgKi8KLQkJCXN0YXRlLT50dW5lciA9Ci0JCQkgICAgZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLCBmZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCi0JCQkJICAgICAgICZhZjkwMDVfcXQxMDEwX2NvbmZpZyk7Ci0JCQlpZiAoc3RhdGUtPnR1bmVyID09IE5VTEwpIHsKKwkJCWlmIChkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJCQkJJmFmOTAwNV9xdDEwMTBfY29uZmlnKSA9PU5VTEwpIHsKIAkJCQlkZWJfaW5mbygiUVQxMDEwIGF0dGFjaCBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtRU5PREVWOwogCQkJfQpAQCAtMTA4MCw3ICsxMDcyLDcgQEAKIAkJCWVycigiVW5zdXBwb3J0ZWQgdHVuZXIgdHlwZSAlZCIsIGJ1ZlswXSk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlyZXQgPSBzdGF0ZS0+dHVuZXItPm9wcy50dW5lcl9vcHMuaW5pdChzdGF0ZS0+dHVuZXIpOworCQlyZXQgPSBmZS0+b3BzLnR1bmVyX29wcy5pbml0KGZlKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMTExOCw3ICsxMTEwLDcgQEAKIAogCWRlYl9pbmZvKCJhZjkwMDVfZmVfc2V0X2Zyb250ZW5kIGZyZXEgJWQgYncgJWRcbiIsIGZlcC0+ZnJlcXVlbmN5LAogCQkgZmVwLT51Lm9mZG0uYmFuZHdpZHRoKTsKLQlpZiAoc3RhdGUtPnR1bmVyID09IE5VTEwpIHsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMucmVsZWFzZSA9PSBOVUxMKSB7CiAJCWVycigiVHVuZXIgbm90IGF0dGFjaGVkIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTExOTksNyArMTE5MSw3IEBACiAJCXJldHVybiByZXQ7CiAJLyogc2V0IHR1bmVyICovCiAJZGViX2luZm8oInNldCB0dW5lclxuIik7Ci0JcmV0ID0gc3RhdGUtPnR1bmVyLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoc3RhdGUtPnR1bmVyLCBmZXApOworCXJldCA9IGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIGZlcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTQzNSwxMiArMTQyNyw2IEBACiB7CiAJc3RydWN0IGFmOTAwNV9mZV9zdGF0ZSAqc3RhdGUgPQogCSAgICAoc3RydWN0IGFmOTAwNV9mZV9zdGF0ZSAqKWZlLT5kZW1vZHVsYXRvcl9wcml2OwotCWlmIChzdGF0ZS0+dHVuZXIgIT0gTlVMTCAmJiBzdGF0ZS0+dHVuZXItPm9wcy50dW5lcl9vcHMucmVsZWFzZSAhPSBOVUxMKSB7Ci0JCXN0YXRlLT50dW5lci0+b3BzLnR1bmVyX29wcy5yZWxlYXNlKHN0YXRlLT50dW5lcik7Ci0jaWZkZWYgQ09ORklHX0RWQl9DT1JFX0FUVEFDSAotCQlzeW1ib2xfcHV0X2FkZHIoc3RhdGUtPnR1bmVyLT5vcHMudHVuZXJfb3BzLnJlbGVhc2UpOwotI2VuZGlmCi0JfQogCWtmcmVlKHN0YXRlKTsKIH0KIApAQCAtMTQ1OCw3ICsxNDQ0LDYgQEAKIAlkZWJfaW5mbygiYXR0YWNoaW5nIGZyb250ZW5kIGFmOTAwNVxuIik7CiAKIAlzdGF0ZS0+ZCA9IGQ7Ci0Jc3RhdGUtPnR1bmVyID0gTlVMTDsKIAlzdGF0ZS0+b3BlbmVkID0gMDsKIAogCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmFmOTAwNV9mZV9vcHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwppbmRleCAwYzBiOTQ3Li5jYTk5ZTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKQEAgLTUwMSw3ICs1MDEsNyBAQAogCiAvKiBQaGlsaXBzIEZDVjEyMzZECiAgKi8KLXN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9mY3YxMjM2ZCA9IHsKK3N0YXRpYyBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfZmN2MTIzNmQgPSB7CiAvKiBCaXRfMDogUkYgSW5wdXQgc2VsZWN0CiAgKiBCaXRfMTogMD1kaWdpdGFsLCAxPWFuYWxvZwogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKaW5kZXggOWRjYmZmZC4uZTIwNGU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpAQCAtNTA5LDcgKzUwOSw3IEBACiAKIGNvbmZpZyBWSURFT19TVFJBRElTCiAJdHJpc3RhdGUgIlN0cmFkaXMgNDoyOjIgTVBFRy0yIHZpZGVvIGRyaXZlciAgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgUENJICYmIFZJREVPX1Y0TDEgJiYgIVBQQzY0CisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgUENJICYmIFZJREVPX1Y0TDEgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgU3RyYWRpcyA0OjI6MiBNUEVHLTIgdmlkZW8KIAkgIGRyaXZlciBmb3IgUENJLiAgVGhlcmUgaXMgYSBwcm9kdWN0IHBhZ2UgYXQKQEAgLTUyMCw3ICs1MjAsNyBAQAogCiBjb25maWcgVklERU9fWk9SQU4KIAl0cmlzdGF0ZSAiWm9yYW4gWlIzNjA1Ny8zNjA2NyBWaWRlbyBGb3IgTGludXgiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgSTJDX0FMR09CSVQgJiYgVklERU9fVjRMMSAmJiAhUFBDNjQKKwlkZXBlbmRzIG9uIFBDSSAmJiBJMkNfQUxHT0JJVCAmJiBWSURFT19WNEwxICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgU2F5IFkgZm9yIHN1cHBvcnQgZm9yIE1KUEVHIGNhcHR1cmUgY2FyZHMgYmFzZWQgb24gdGhlIFpvcmFuCiAJICAzNjA1Ny8zNjA2NyBQQ0kgY29udHJvbGxlciBjaGlwc2V0LiBUaGlzIGluY2x1ZGVzIHRoZSBJb21lZ2EKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKaW5kZXggMzg3Y2IyMS4uZjY3MTUwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC00NSw3ICs0Niw3IEBACiBzdGF0aWMgdm9pZCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpOwogc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKIHN0YXRpYyB2b2lkIGF2ZXJtZWRpYV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7Ci1zdGF0aWMgdm9pZCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOworc3RhdGljIHZvaWQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LCBjb25zdCB1OCBlZVsyNTZdKTsKIHN0YXRpYyB2b2lkIG1vZHRlY19lZXByb20oc3RydWN0IGJ0dHYgKmJ0dik7CiBzdGF0aWMgdm9pZCBpbml0X1BYQzIwMChzdHJ1Y3QgYnR0diAqYnR2KTsKIHN0YXRpYyB2b2lkIGluaXRfUlRWMjQoc3RydWN0IGJ0dHYgKmJ0dik7CkBAIC0yODQzLDEzICsyODQ0LDI4IEBACiAJCS5oYXNfcmVtb3RlICAgICA9IDEsCiAJfSwKIAkJLyogLS0tLSBjYXJkIDB4OGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEhhcyBmb3VyIEJ0ODc4IGNoaXBzIGJlaGluZCBhIFBDSSBicmlkZ2UsIGVhY2ggY2hpcCBoYXM6CisJICAgICBvbmUgZXh0ZXJuYWwgQk5DIGNvbXBvc2l0ZSBpbnB1dCAobXV4IDIpCisJICAgICB0aHJlZSBpbnRlcm5hbCBjb21wb3NpdGUgaW5wdXRzICh1bmtub3duIG11eGVzKQorCSAgICAgYW4gMTgtYml0IHN0ZXJlbyBBL0QgKENTNTMzMUEpLCB3aGljaCBoYXM6CisJICAgICAgIG9uZSBleHRlcm5hbCBzdGVyZW8gdW5ibGFuY2VkIChSQ0EpIGF1ZGlvIGNvbm5lY3Rpb24KKwkgICAgICAgb25lIChvciAzPykgaW50ZXJuYWwgc3RlcmVvIGJhbGFuY2VkIChYTFIpIGF1ZGlvIGNvbm5lY3Rpb24KKwkgICAgICAgaW5wdXQgaXMgc2VsZWN0ZWQgdmlhIGdwaW8gdG8gYSAxNDA1MkIgbXV4CisJCSAobWFzaz0weDMwMCwgdW5iYWw9MHgwMDAsIGJhbD0weDEwMCwgPz89MHgyMDAsMHgzMDApCisJICAgICAgIGdhaW4gaXMgY29udHJvbGxlZCB2aWEgYW4gWDkyMjFBIGNoaXAgb24gdGhlIEkyQyBidXMgQDB4MjgKKwkgICAgICAgc2FtcGxlIHJhdGUgaXMgY29udHJvbGxlZCB2aWEgZ3BpbyB0byBhbiBNSzE0MTNTCisJCSAobWFzaz0weDMsIDMya0h6PTB4MCwgNDQuMWtIej0weDEsIDQ4a0h6PTB4MiwgPz89MHgzKQorCSAgICAgVGhlcmUgaXMgbmVpdGhlciBhIHR1bmVyIG5vciBhbiBzdmlkZW8gaW5wdXQuICovCiAJW0JUVFZfQk9BUkRfT1NQUkVZNDQwXSAgPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNDQwIiwKLQkJLnZpZGVvX2lucHV0cyAgID0gMSwKLQkJLmF1ZGlvX2lucHV0cyAgID0gMSwKKwkJLnZpZGVvX2lucHV0cyAgID0gNCwKKwkJLmF1ZGlvX2lucHV0cyAgID0gMiwgLyogdGhpcyBpcyBtZWFuaW5nbGVzcyAqLwogCQkudHVuZXIgICAgICAgICAgPSBVTlNFVCwKLQkJLnN2aHMgICAgICAgICAgID0gMSwKLQkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCisJCS5zdmhzICAgICAgICAgICA9IFVOU0VULAorCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDAsIDEgfSwgLyogMywwLDEgYXJlIGd1ZXNzZXMgKi8KKwkJLmdwaW9tYXNrCT0gMHgzMDMsCisJCS5ncGlvbXV0ZQk9IDB4MDAwLCAvKiBpbnQgKyAzMmtIeiAqLworCQkuZ3Bpb211eAk9IHsgMCwgMCwgMHgwMDAsIDB4MTAwfSwKIAkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKQEAgLTM0NTMsMTEgKzM0NjksMTIgQEAKIAljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMnh4OgogCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRDoKIAljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMngwOgorCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVk0NDA6CiAJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTUwMDoKIAljYXNlIEJUVFZfQk9BUkRfT1NQUkVZNTQwOgogCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyMDAwOgogCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7Ci0JCW9zcHJleV9lZXByb20oYnR2KTsKKwkJb3NwcmV5X2VlcHJvbShidHYsIGVlcHJvbV9kYXRhKTsKIAkJYnJlYWs7CiAJY2FzZSBCVFRWX0JPQVJEX0lEU19FQUdMRToKIAkJaW5pdF9pZHNfZWFnbGUoYnR2KTsKQEAgLTM3NDgsMTA2ICszNzY1LDExOSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHNvbWUgb3NwcmV5IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LCBjb25zdCB1OCBlZVsyNTZdKQogewotICAgICAgIGludCBpID0gMDsKLSAgICAgICB1bnNpZ25lZCBjaGFyICplZSA9IGVlcHJvbV9kYXRhOwotICAgICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsID0gMDsKKwlpbnQgaTsKKwl1MzIgc2VyaWFsID0gMDsKKwlpbnQgY2FyZGlkID0gLTE7CiAKLSAgICAgICBpZiAoYnR2LT5jLnR5cGUgPT0gMCkgewotCSAgICAgICAvKiB0aGlzIG1pZ2h0IGJlIGFuIGFudGlxdWUuLi4gY2hlY2sgZm9yIE1NQUMgbGFiZWwgaW4gZWVwcm9tICovCi0JICAgICAgIGlmICgoZWVbMF09PSdNJykgJiYgKGVlWzFdPT0nTScpICYmIChlZVsyXT09J0EnKSAmJiAoZWVbM109PSdDJykpIHsKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwotCQkgICAgICAgZm9yIChpID0gMDsgaSA8IDIxOyBpKyspCi0JCQkgICAgICAgY2hlY2tzdW0gKz0gZWVbaV07Ci0JCSAgICAgICBpZiAoY2hlY2tzdW0gIT0gZWVbMjFdKQotCQkJICAgICAgIHJldHVybjsKLQkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OwotCQkgICAgICAgZm9yIChpID0gMTI7IGkgPCAyMTsgaSsrKQotCQkJICAgICAgIHNlcmlhbCAqPSAxMCwgc2VyaWFsICs9IGVlW2ldIC0gJzAnOwotCSAgICAgICB9CisJLyogVGhpcyBjb2RlIHdpbGwgbmV2ZXJ5IGFjdHVhbGx5IGdldCBjYWxsZWQgaW4gdGhpcyBjYXNlLi4uLiAqLworCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX0JPQVJEX1VOS05PV04pIHsKKwkJLyogdGhpcyBtaWdodCBiZSBhbiBhbnRpcXVlLi4uIGNoZWNrIGZvciBNTUFDIGxhYmVsIGluIGVlcHJvbSAqLworCQlpZiAoIXN0cm5jbXAoZWUsICJNTUFDIiwgNCkpIHsKKwkJCXU4IGNoZWNrc3VtID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorCQkJCWNoZWNrc3VtICs9IGVlW2ldOworCQkJaWYgKGNoZWNrc3VtICE9IGVlWzIxXSkKKwkJCQlyZXR1cm47CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTF4MF84NDg7CisJCQlmb3IgKGkgPSAxMjsgaSA8IDIxOyBpKyspCisJCQkJc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CisJCX0KICAgICAgICB9IGVsc2UgewotCSAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOwotCSAgICAgICBpbnQgb2Zmc2V0ID0gNCoxNjsKKwkJdW5zaWduZWQgc2hvcnQgdHlwZTsKIAotCSAgICAgICBmb3IgKDsgb2Zmc2V0IDwgOCoxNjsgb2Zmc2V0ICs9IDE2KSB7Ci0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSA9IDA7Ci0JCSAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCi0JCSAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKLQkJCQljaGVja3N1bSArPSBlZVtpK29mZnNldF07Ci0JCQljaGVja3N1bSA9IH5jaGVja3N1bTsgIC8qIG5vIGlkZWEgd2h5ICovCi0JCQlpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgotCQkJCSAgICgoY2hlY2tzdW0gJiAweDBGRikgPT0gZWVbb2Zmc2V0KzE1XSkpIHsKLQkJCSAgICAgICBicmVhazsKLQkJICAgICAgIH0KLQkgICAgICAgfQorCQlmb3IgKGkgPSA0KjE2OyBpIDwgOCoxNjsgaSArPSAxNikgeworCQkJdTE2IGNoZWNrc3VtID0gaXBfY29tcHV0ZV9jc3VtKGVlICsgaSwgMTYpOwogCi0JICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKLQkJICAgICAgIHJldHVybjsKKwkJCWlmICgoY2hlY2tzdW0mMHhmZikgKyAoY2hlY2tzdW0+PjgpID09IDB4ZmYpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPj0gOCoxNikKKwkJCXJldHVybjsKKwkJZWUgKz0gaTsKIAotCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KLQkgICAgICAgdHlwZSA9IChlZVtvZmZzZXQrNF08PDgpIHwgKGVlW29mZnNldCs1XSk7CisJCS8qIGZvdW5kIGEgdmFsaWQgZGVzY3JpcHRvciAqLworCQl0eXBlID0gYmUxNl90b19jcHVwKCh1MTYqKShlZSs0KSk7CiAKLQkgICAgICAgc3dpdGNoKHR5cGUpIHsKLQkgICAgICAgLyogODQ4IGJhc2VkICovCi0JICAgICAgIGNhc2UgMHgwMDA0OgotCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTF4MF84NDg7Ci0JCSAgICAgICBicmVhazsKLQkgICAgICAgY2FzZSAweDAwMDU6Ci0JCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMTAxXzg0ODsKLQkJICAgICAgIGJyZWFrOworCQlzd2l0Y2godHlwZSkgeworCQkvKiA4NDggYmFzZWQgKi8KKwkJY2FzZSAweDAwMDQ6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTF4MF84NDg7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMDU6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTEwMV84NDg7CisJCQlicmVhazsKIAotCSAgICAgICAvKiA4NzggYmFzZWQgKi8KLQkgICAgICAgY2FzZSAweDAwMTI6Ci0JICAgICAgIGNhc2UgMHgwMDEzOgotCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTF4MDsKLQkJICAgICAgIGJyZWFrOwotCSAgICAgICBjYXNlIDB4MDAxNDoKLQkgICAgICAgY2FzZSAweDAwMTU6Ci0JCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgxOwotCQkgICAgICAgYnJlYWs7Ci0JICAgICAgIGNhc2UgMHgwMDE2OgotCSAgICAgICBjYXNlIDB4MDAxNzoKLQkgICAgICAgY2FzZSAweDAwMjA6Ci0JCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSUQ7Ci0JCSAgICAgICBicmVhazsKLQkgICAgICAgY2FzZSAweDAwMTg6Ci0JICAgICAgIGNhc2UgMHgwMDE5OgotCSAgICAgICBjYXNlIDB4MDAxRToKLQkgICAgICAgY2FzZSAweDAwMUY6Ci0JCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMnh4OwotCQkgICAgICAgYnJlYWs7Ci0JICAgICAgIGNhc2UgMHgwMDFBOgotCSAgICAgICBjYXNlIDB4MDAxQjoKLQkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRDsKLQkJICAgICAgIGJyZWFrOwotCSAgICAgICBjYXNlIDB4MDA0MDoKLQkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVk1MDA7Ci0JCSAgICAgICBicmVhazsKLQkgICAgICAgY2FzZSAweDAwNTA6Ci0JICAgICAgIGNhc2UgMHgwMDU2OgotCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTU0MDsKLQkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCi0JCSAgICAgICBicmVhazsKLQkgICAgICAgY2FzZSAweDAwNjA6Ci0JICAgICAgIGNhc2UgMHgwMDcwOgotCSAgICAgICBjYXNlIDB4MDBBMDoKLQkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkyeDA7Ci0JCSAgICAgICAvKiBlbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzICovCi0JCSAgICAgICBncGlvX2lub3V0KDB4ZmZmZmZmLDB4MDAwMzAzKTsKLQkJICAgICAgIGJyZWFrOwotCSAgICAgICBkZWZhdWx0OgotCQkgICAgICAgLyogdW5rbm93bi4uLmxlYXZlIGdlbmVyaWMsIGJ1dCBnZXQgc2VyaWFsICMgKi8KLQkJICAgICAgIGJyZWFrOwotCSAgICAgICB9Ci0JICAgICAgIHNlcmlhbCA9ICAoZWVbb2Zmc2V0KzZdIDw8IDI0KQotCQkgICAgICAgfCAoZWVbb2Zmc2V0KzddIDw8IDE2KQotCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQotCQkgICAgICAgfCAoZWVbb2Zmc2V0KzldKTsKLSAgICAgICB9CisJCS8qIDg3OCBiYXNlZCAqLworCQljYXNlIDB4MDAxMjoKKwkJY2FzZSAweDAwMTM6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTF4MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAxNDoKKwkJY2FzZSAweDAwMTU6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTF4MTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAxNjoKKwkJY2FzZSAweDAwMTc6CisJCWNhc2UgMHgwMDIwOgorCQkJY2FyZGlkID0gQlRUVl9CT0FSRF9PU1BSRVkxeDFfU1ZJRDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDAxODoKKwkJY2FzZSAweDAwMTk6CisJCWNhc2UgMHgwMDFFOgorCQljYXNlIDB4MDAxRjoKKwkJCWNhcmRpZCA9IEJUVFZfQk9BUkRfT1NQUkVZMnh4OworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDFBOgorCQljYXNlIDB4MDAxQjoKKwkJCWNhcmRpZCA9IEJUVFZfQk9BUkRfT1NQUkVZMngwX1NWSUQ7CisJCQlicmVhazsKKwkJY2FzZSAweDAwNDA6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTUwMDsKKwkJCWJyZWFrOworCQljYXNlIDB4MDA1MDoKKwkJY2FzZSAweDAwNTY6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTU0MDsKKwkJCS8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCisJCQlicmVhazsKKwkJY2FzZSAweDAwNjA6CisJCWNhc2UgMHgwMDcwOgorCQljYXNlIDB4MDBBMDoKKwkJCWNhcmRpZCA9IEJUVFZfQk9BUkRfT1NQUkVZMngwOworCQkJLyogZW5hYmxlIG91dHB1dCBvbiBzZWxlY3QgY29udHJvbCBsaW5lcyAqLworCQkJZ3Bpb19pbm91dCgweGZmZmZmZiwweDAwMDMwMyk7CisJCQlicmVhazsKKwkJY2FzZSAweDAwRDg6CisJCQljYXJkaWQgPSBCVFRWX0JPQVJEX09TUFJFWTQ0MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdW5rbm93bi4uLmxlYXZlIGdlbmVyaWMsIGJ1dCBnZXQgc2VyaWFsICMgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogIgorCQkJICAgICAgICJvc3ByZXkgZWVwcm9tOiB1bmtub3duIGNhcmQgdHlwZSAweCUwNHhcbiIsCisJCQkgICAgICAgYnR2LT5jLm5yLCB0eXBlKTsKKwkJCWJyZWFrOworCQl9CisJCXNlcmlhbCA9IGJlMzJfdG9fY3B1cCgodTMyKikoZWUrNikpOworCX0KIAotICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCi0JICAgICAgYnR2LT5jLm5yLCBidHYtPmMudHlwZSwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLHNlcmlhbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiBjYXJkPSVkICclcycgc2VyaWFsPSV1XG4iLAorCSAgICAgICBidHYtPmMubnIsIGNhcmRpZCwKKwkgICAgICAgY2FyZGlkPjAgPyBidHR2X3R2Y2FyZHNbY2FyZGlkXS5uYW1lIDogIlVua25vd24iLCBzZXJpYWwpOworCisJaWYgKGNhcmRpZDwwIHx8IGJ0di0+Yy50eXBlID09IGNhcmRpZCkKKwkJcmV0dXJuOworCisJLyogY2FyZCB0eXBlIGlzbid0IHNldCBjb3JyZWN0bHkgKi8KKwlpZiAoY2FyZFtidHYtPmMubnJdIDwgYnR0dl9udW1fdHZjYXJkcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG9zcHJleSBlZXByb206ICIKKwkJICAgICAgICJOb3Qgb3ZlcnJpZGluZyB1c2VyIHNwZWNpZmllZCBjYXJkIHR5cGVcbiIsIGJ0di0+Yy5ucik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBvc3ByZXkgZWVwcm9tOiAiCisJCSAgICAgICAiQ2hhbmdpbmcgY2FyZCB0eXBlIGZyb20gJWQgdG8gJWRcbiIsIGJ0di0+Yy5uciwKKwkJICAgICAgIGJ0di0+Yy50eXBlLCBjYXJkaWQpOworCQlidHYtPmMudHlwZSA9IGNhcmRpZDsKKwl9CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCmluZGV4IDkxYjU4OGQuLjhhYmIzNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCkBAIC00MTcsNiArNDE3LDcgQEAKICNkZWZpbmUgSVZUVl9GX0lfV09SS19IQU5ETEVSX1lVViAgMTcJLyogdGhlcmUgaXMgd29yayB0byBiZSBkb25lIGZvciBZVVYgKi8KICNkZWZpbmUgSVZUVl9GX0lfV09SS19IQU5ETEVSX1BJTyAgMTgJLyogdGhlcmUgaXMgd29yayB0byBiZSBkb25lIGZvciBQSU8gKi8KICNkZWZpbmUgSVZUVl9GX0lfUElPCQkgICAxOQkvKiBQSU8gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgSVZUVl9GX0lfREVDX1BBVVNFRAkgICAyMCAJLyogdGhlIGRlY29kZXIgaXMgcGF1c2VkICovCiAKIC8qIEV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KICNkZWZpbmUgSVZUVl9GX0lfRVZfREVDX1NUT1BQRUQJICAgMjgJLyogZGVjb2RlciBzdG9wcGVkIGV2ZW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKaW5kZXggOGU5N2E5My4uNWRkNTE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYwpAQCAtNzU3LDYgKzc1Nyw3IEBACiAJICAgIGl0di0+b3V0cHV0X21vZGUgPSBPVVRfTk9ORTsKIAogCWl0di0+c3BlZWQgPSAwOworCWNsZWFyX2JpdChJVlRWX0ZfSV9ERUNfUEFVU0VELCAmaXR2LT5pX2ZsYWdzKTsKIAlpdnR2X3JlbGVhc2Vfc3RyZWFtKHMpOwogfQogCkBAIC03OTksNyArODAwLDE2IEBACiAJCWl2dHZfdW5tdXRlKGl0dik7CiAJCWl2dHZfcmVsZWFzZV9zdHJlYW0ocyk7CiAJfSBlbHNlIGlmIChzLT50eXBlID49IElWVFZfREVDX1NUUkVBTV9UWVBFX01QRykgeworCQlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnNfdm91dCA9ICZpdHYtPnN0cmVhbXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfVk9VVF07CisKIAkJaXZ0dl9zdG9wX2RlY29kaW5nKGlkLCBWSURFT19DTURfU1RPUF9UT19CTEFDSyB8IFZJREVPX0NNRF9TVE9QX0lNTUVESUFURUxZLCAwKTsKKworCQkvKiBJZiBhbGwgb3V0cHV0IHN0cmVhbXMgYXJlIGNsb3NlZCwgYW5kIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZQorCQkgICBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WT1VUIG9wZW4sIHRoZW4gZGlzYWJsZSBWQkkgb24gVFYtb3V0LiAqLworCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSA9PSBPVVRfTk9ORSAmJiAhdGVzdF9iaXQoSVZUVl9GX1NfQVBQTF9JTywgJnNfdm91dC0+c19mbGFncykpIHsKKwkJCS8qIGRpc2FibGUgVkJJIG9uIFRWLW91dCAqLworCQkJaXZ0dl9kaXNhYmxlX3ZiaShpdHYpOworCQl9CiAJfSBlbHNlIHsKIAkJaXZ0dl9zdG9wX2NhcHR1cmUoaWQsIDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5jCmluZGV4IGQwZmVhYmYuLjQyNWViMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlybXdhcmUuYwpAQCAtNzIsOCArNzIsOCBAQAogCQkJZHN0Kys7CiAJCQlzcmMrKzsKIAkJfQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJSVZUVl9JTkZPKCJMb2FkZWQgJXMgZmlybXdhcmUgKCV6ZCBieXRlcylcbiIsIGZuLCBmdy0+c2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCQlyZXR1cm4gc2l6ZTsKIAl9CiAJSVZUVl9FUlIoIlVuYWJsZSB0byBvcGVuIGZpcm13YXJlICVzIChtdXN0IGJlICVsZCBieXRlcylcbiIsIGZuLCBzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCmluZGV4IDQ3NzM0NTMuLjA0NzYyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpAQCAtMjg1LDYgKzI4NSwxMCBAQAogCiAJCWlmIChpdnR2X3NldF9vdXRwdXRfbW9kZShpdHYsIE9VVF9NUEcpICE9IE9VVF9NUEcpCiAJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElWVFZfRl9JX0RFQ19QQVVTRUQsICZpdHYtPmlfZmxhZ3MpKSB7CisJCQkvKiBmb3JjZXMgaXZ0dl9zZXRfc3BlZWQgdG8gYmUgY2FsbGVkICovCisJCQlpdHYtPnNwZWVkID0gMDsKKwkJfQogCQlyZXR1cm4gaXZ0dl9zdGFydF9kZWNvZGluZyhpZCwgdmMtPnBsYXkuc3BlZWQpOwogCX0KIApAQCAtMzA5LDYgKzMxMyw3IEBACiAJCWlmIChhdG9taWNfcmVhZCgmaXR2LT5kZWNvZGluZykgPiAwKSB7CiAJCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19QQVVTRV9QTEFZQkFDSywgMSwKIAkJCQkodmMtPmZsYWdzICYgVklERU9fQ01EX0ZSRUVaRV9UT19CTEFDSykgPyAxIDogMCk7CisJCQlzZXRfYml0KElWVFZfRl9JX0RFQ19QQVVTRUQsICZpdHYtPmlfZmxhZ3MpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zMTcsOCArMzIyLDEwIEBACiAJCWlmICh0cnkpIGJyZWFrOwogCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSAhPSBPVVRfTVBHKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSA+IDApIHsKLQkJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NUQVJUX1BMQVlCQUNLLCAyLCAwLCAwKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9ERUNfUEFVU0VELCAmaXR2LT5pX2ZsYWdzKSkgeworCQkJaW50IHNwZWVkID0gaXR2LT5zcGVlZDsKKwkJCWl0di0+c3BlZWQgPSAwOworCQkJcmV0dXJuIGl2dHZfc3RhcnRfZGVjb2RpbmcoaWQsIHNwZWVkKTsKIAkJfQogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtbWFpbGJveC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtbWFpbGJveC5jCmluZGV4IDgxNGE2NzMuLjVlM2I2NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LW1haWxib3guYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmMKQEAgLTQwLDYgKzQwLDcgQEAKICNkZWZpbmUgQVBJX0hJR0hfVk9MIAkgKDEgPDwgNSkJLyogSGlnaCB2b2x1bWUgY29tbWFuZCAoaS5lLiBjYWxsZWQgZHVyaW5nIGVuY29kaW5nIG9yIGRlY29kaW5nKSAqLwogI2RlZmluZSBBUElfTk9fV0FJVF9NQiAJICgxIDw8IDQpCS8qIENvbW1hbmQgbWF5IG5vdCB3YWl0IGZvciBhIGZyZWUgbWFpbGJveCAqLwogI2RlZmluZSBBUElfTk9fV0FJVF9SRVMJICgxIDw8IDUpCS8qIENvbW1hbmQgbWF5IG5vdCB3YWl0IGZvciB0aGUgcmVzdWx0ICovCisjZGVmaW5lIEFQSV9OT19QT0xMCSAoMSA8PCA2KQkvKiBBdm9pZCBwb2ludGxlc3MgcG9sbGluZyAqLwogCiBzdHJ1Y3QgaXZ0dl9hcGlfaW5mbyB7CiAJaW50IGZsYWdzOwkJLyogRmxhZ3MsIHNlZSBhYm92ZSAqLwpAQCAtNTEsNyArNTIsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2FwaV9pbmZvIGFwaV9pbmZvWzI1Nl0gPSB7CiAJLyogTVBFRyBlbmNvZGVyIEFQSSAqLwogCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19QSU5HX0ZXLCAJCQlBUElfRkFTVF9SRVNVTFQpLAotCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TVEFSVF9DQVBUVVJFLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TVEFSVF9DQVBUVVJFLCAJCUFQSV9SRVNVTFQgfCBBUElfTk9fUE9MTCksCiAJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgCQlBUElfUkVTVUxUKSwKIAlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX0FVRElPX0lELCAJCUFQSV9DQUNIRSksCiAJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9WSURFT19JRCwgCQlBUElfQ0FDSEUpLApAQCAtOTYsNyArOTcsNyBAQAogCiAJLyogTVBFRyBkZWNvZGVyIEFQSSAqLwogCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19QSU5HX0ZXLCAJCQlBUElfRkFTVF9SRVNVTFQpLAotCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TVEFSVF9QTEFZQkFDSywgCQlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU1RBUlRfUExBWUJBQ0ssIAkJQVBJX1JFU1VMVCB8IEFQSV9OT19QT0xMKSwKIAlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU1RPUF9QTEFZQkFDSywgCQlBUElfUkVTVUxUKSwKIAlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU0VUX1BMQVlCQUNLX1NQRUVELCAJQVBJX1JFU1VMVCksCiAJQVBJX0VOVFJZKENYMjM0MVhfREVDX1NURVBfVklERU8sIAkJQVBJX1JFU1VMVCksCkBAIC0yOTAsNiArMjkxLDEzIEBACiAJLyogR2V0IHJlc3VsdHMgKi8KIAl0aGVuID0gamlmZmllczsKIAorCWlmICghKGZsYWdzICYgQVBJX05PX1BPTEwpKSB7CisJCS8qIEZpcnN0IHRyeSB0byBwb2xsLCB0aGVuIHN3aXRjaCB0byBkZWxheXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAocmVhZGwoJm1ib3gtPmZsYWdzKSAmIElWVFZfTUJPWF9GSVJNV0FSRV9ET05FKQorCQkJCWJyZWFrOworCQl9CisJfQogCXdoaWxlICghKHJlYWRsKCZtYm94LT5mbGFncykgJiBJVlRWX01CT1hfRklSTVdBUkVfRE9ORSkpIHsKIAkJaWYgKGppZmZpZXMgLSB0aGVuID4gYXBpX3RpbWVvdXQpIHsKIAkJCUlWVFZfREVCVUdfV0FSTigiQ291bGQgbm90IGdldCByZXN1bHQgKCVzKVxuIiwgYXBpX2luZm9bY21kXS5uYW1lKTsKQEAgLTMwMSw3ICszMDksNyBAQAogCQlpZiAoZmxhZ3MgJiBBUElfTk9fV0FJVF9SRVMpCiAJCQltZGVsYXkoMSk7CiAJCWVsc2UKLQkJCWl2dHZfbXNsZWVwX3RpbWVvdXQoMTAsIDApOworCQkJaXZ0dl9tc2xlZXBfdGltZW91dCgxLCAwKTsKIAl9CiAJaWYgKGppZmZpZXMgLSB0aGVuID4gbXNlY3NfdG9famlmZmllcygxMDApKQogCQlJVlRWX0RFQlVHX1dBUk4oIiVzIHRvb2sgJXUgamlmZmllc1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXN0cmVhbXMuYwppbmRleCAzMjJiMzQ3Li41MWRmM2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCkBAIC02MDMsMTAgKzYwMyw2IEBACiAKIAlJVlRWX0RFQlVHX0lORk8oIlNldHRpbmcgc29tZSBpbml0aWFsIGRlY29kZXIgc2V0dGluZ3NcbiIpOwogCi0JLyogZGlzYWJsZSBWQkkgc2lnbmFscywgaWYgdGhlIE1QRUcgc3RyZWFtIGNvbnRhaW5zIFZCSSBkYXRhLAotCSAgIHRoZW4gdGhhdCBkYXRhIHdpbGwgYmUgcHJvY2Vzc2VkIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS4gKi8KLQlpdnR2X2Rpc2FibGVfdmJpKGl0dik7Ci0KIAkvKiBzZXQgYXVkaW8gbW9kZSB0byBsZWZ0L3N0ZXJlbyAgZm9yIGR1YWwvc3RlcmVvIG1vZGUuICovCiAJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfU0VUX0FVRElPX01PREUsIDIsIGl0di0+YXVkaW9fYmlsaW5ndWFsX21vZGUsIGl0di0+YXVkaW9fc3RlcmVvX21vZGUpOwogCkBAIC02MzksNyArNjM1LDcgQEAKIAl9CiAJaWYgKGl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9ERUNPREVSX1NPVVJDRSwgNCwgZGF0YXR5cGUsCiAJCQlpdHYtPnBhcmFtcy53aWR0aCwgaXR2LT5wYXJhbXMuaGVpZ2h0LCBpdHYtPnBhcmFtcy5hdWRpb19wcm9wZXJ0aWVzKSkgewotCQlJVlRWX0RFQlVHX1dBUk4oIkNPVUxETidUIElOSVRJQUxJWkUgREVDT0RFUiBTT1VSQ0VcbiIpOworCQlJVlRWX0RFQlVHX1dBUk4oIkNvdWxkbid0IGluaXRpYWxpemUgZGVjb2RlciBzb3VyY2VcbiIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTkwOSwxMSArOTA1LDYgQEAKIAljbGVhcl9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncyk7CiAJaXZ0dl9mbHVzaF9xdWV1ZXMocyk7CiAKLQlpZiAoIXRlc3RfYml0KElWVFZfRl9TX1BBU1NUSFJPVUdILCAmcy0+c19mbGFncykpIHsKLQkJLyogZGlzYWJsZSBWQkkgb24gVFYtb3V0ICovCi0JCWl2dHZfZGlzYWJsZV92YmkoaXR2KTsKLQl9Ci0KIAkvKiBkZWNyZW1lbnQgZGVjb2RpbmcgKi8KIAlhdG9taWNfZGVjKCZpdHYtPmRlY29kaW5nKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwppbmRleCA4NjhiNjg4Li5lMzM3MWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwpAQCAtNTE3LDYgKzUxNyw3IEBACiAJCSAgICBfX0ZVTkNUSU9OX18sIGVyckNvZGUpOwogCQlyZXR1cm4gZXJyQ29kZTsKIAl9CisJcmVnLT52YWwgPSBlcnJDb2RlOwogCXJldHVybiAwOwogfQogCkBAIC01MzEsOCArNTMyLDggQEAKIAlpZiAoIXY0bDJfY2hpcF9tYXRjaF9ob3N0KHJlZy0+bWF0Y2hfdHlwZSwgcmVnLT5tYXRjaF9jaGlwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJLyogTlQxMDB4IGhhcyBhIDgtYml0IHJlZ2lzdGVyIHNwYWNlICovCi0JcmVnLT52YWwgPSAodTgpdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIHJlZy0+cmVnJjB4ZmYsIHJlZy0+dmFsKTsKLQlpZiAocmVnLT52YWwgPCAwKSB7CisJZXJyQ29kZSA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCByZWctPnJlZyYweGZmLCByZWctPnZhbCk7CisJaWYgKGVyckNvZGUgPCAwKSB7CiAJCWVycigiJXM6IFZJRElPQ19EQkdfU19SRUdJU1RFUiBmYWlsZWQ6IGVycm9yICVkIiwKIAkJICAgIF9fRlVOQ1RJT05fXywgZXJyQ29kZSk7CiAJCXJldHVybiBlcnJDb2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oCmluZGV4IDhmYjRhMzQuLjkzN2M0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuLmgKQEAgLTI0MCwxMSArMjQwLDE2IEBACiAKIHN0cnVjdCB6b3Jhbl9mb3JtYXQgewogCWNoYXIgKm5hbWU7CisjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCiAJaW50IHBhbGV0dGU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVklERU9fVjRMMgogCV9fdTMyIGZvdXJjYzsKIAlpbnQgY29sb3JzcGFjZTsKKyNlbmRpZgogCWludCBkZXB0aDsKIAlfX3UzMiBmbGFnczsKKwlfX3UzMiB2ZmVzcGZyOwogfTsKIC8qIGZsYWdzICovCiAjZGVmaW5lIFpPUkFOX0ZPUk1BVF9DT01QUkVTU0VEIDE8PDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5jCmluZGV4IGIwNzUyNzYuLmJhMmY0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuYwpAQCAtNDI5LDggKzQyOSw2IEBACiAJcmVnIHw9IChIb3JEY20gPDwgWlIzNjA1N19WRkVTUEZSX0hvckRjbSk7CiAJcmVnIHw9IChWZXJEY20gPDwgWlIzNjA1N19WRkVTUEZSX1ZlckRjbSk7CiAJcmVnIHw9IChEaXNwTW9kZSA8PCBaUjM2MDU3X1ZGRVNQRlJfRGlzcE1vZGUpOwotCWlmIChmb3JtYXQtPnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9ZVVY0MjIgJiYgZm9ybWF0LT5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfWVVZVikKLQkJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9MaXR0bGVFbmRpYW47CiAJLyogUko6IEkgZG9uJ3Qga25vdywgd2h5IHRoZSBmb2xsb3dpbmcgaGFzIHRvIGJlIHRoZSBvcHBvc2l0ZQogCSAqIG9mIHRoZSBjb3JyZXNwb25kaW5nIFpSMzYwNjAgc2V0dGluZywgYnV0IG9ubHkgdGhpcyB3YXkKIAkgKiB3ZSBnZXQgdGhlIGNvcnJlY3QgY29sb3JzIHdoZW4gdW5jb21wcmVzc2luZyB0byB0aGUgc2NyZWVuICAqLwpAQCAtNDM5LDM2ICs0MzcsNiBAQAogCWlmICh6ci0+bm9ybSAhPSBWSURFT19NT0RFX05UU0MpCiAJCXJlZyB8PSBaUjM2MDU3X1ZGRVNQRlJfRXh0Rmw7CS8vIE5FRURFRCEhISEhISEgV29sZmdhbmcKIAlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1RvcEZpZWxkOwotCXN3aXRjaCAoZm9ybWF0LT5wYWxldHRlKSB7Ci0KLQljYXNlIFZJREVPX1BBTEVUVEVfWVVZVjoKLQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIyOgotCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1lVVjQyMjsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTU1OgotCQlyZWcgfD0gWlIzNjA1N19WRkVTUEZSX1JHQjU1NSB8IFpSMzYwNTdfVkZFU1BGUl9FcnJEaWY7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NToKLQkJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9SR0I1NjUgfCBaUjM2MDU3X1ZGRVNQRlJfRXJyRGlmOwotCQlicmVhazsKLQotCWNhc2UgVklERU9fUEFMRVRURV9SR0IyNDoKLQkJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9SR0I4ODggfCBaUjM2MDU3X1ZGRVNQRlJfUGFjazI0OwotCQlicmVhazsKLQotCWNhc2UgVklERU9fUEFMRVRURV9SR0IzMjoKLQkJcmVnIHw9IFpSMzYwNTdfVkZFU1BGUl9SR0I4ODg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZHByaW50aygxLAotCQkJS0VSTl9JTkZPICIlczogc2V0X3ZmZSgpIC0gdW5rbm93biBjb2xvcl9mbXQ9JXhcbiIsCi0JCQlaUl9ERVZOQU1FKHpyKSwgZm9ybWF0LT5wYWxldHRlKTsKLQkJcmV0dXJuOwotCi0JfQogCWlmIChIb3JEY20gPj0gNDgpIHsKIAkJcmVnIHw9IDMgPDwgWlIzNjA1N19WRkVTUEZSX0hGaWx0ZXI7CS8qIDUgdGFwIGZpbHRlciAqLwogCX0gZWxzZSBpZiAoSG9yRGNtID49IDMyKSB7CkBAIC00NzYsNiArNDQ0LDcgQEAKIAl9IGVsc2UgaWYgKEhvckRjbSA+PSAxNikgewogCQlyZWcgfD0gMSA8PCBaUjM2MDU3X1ZGRVNQRlJfSEZpbHRlcjsJLyogMyB0YXAgZmlsdGVyICovCiAJfQorCXJlZyB8PSBmb3JtYXQtPnZmZXNwZnI7CiAJYnR3cml0ZShyZWcsIFpSMzYwNTdfVkZFU1BGUik7CiAKIAkvKiBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gKi8KQEAgLTY1MSwxMSArNjIwLDE3IEBACiAJCSAgICAgaW50ICAgICAgICAgICBtb2RlKQogewogCWlmIChtb2RlKSB7Ci0JCWlmIChidHJlYWQoWlIzNjA1N19WU1NGR1IpICYKLQkJICAgIChaUjM2MDU3X1ZTU0ZHUl9TbmFwU2hvdCB8IFpSMzYwNTdfVlNTRkdSX0ZyYW1lR3JhYikpCisJCS8qIFdlIG9ubHkgY2hlY2sgU25hcFNob3QgYW5kIG5vdCBGcmFtZUdyYWIgaGVyZS4gIFNuYXBTaG90PT0xCisJCSAqIG1lYW5zIGEgY2FwdHVyZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBidXQgRnJhbWVHcmFiPT0xCisJCSAqIGRvZXNuJ3QgbmVjZXNzYXJ5IG1lYW4gdGhhdC4gIEl0J3MgbW9yZSBjb3JyZWN0IHRvIHNheSBhIDEKKwkJICogdG8gMCB0cmFuc2l0aW9uIGluZGljYXRlcyBhIGNhcHR1cmUgY29tcGxldGVkLiAgSWYgYQorCQkgKiBjYXB0dXJlIGlzIHBlbmRpbmcgd2hlbiBjYXB0dXJpbmcgaXMgdHVuZWQgb2ZmLCBGcmFtZUdyYWIKKwkJICogd2lsbCBiZSBzdHVjayBhdCAxIHVudGlsIGNhcHR1cmluZyBpcyB0dXJuZWQgYmFjayBvbi4KKwkJICovCisJCWlmIChidHJlYWQoWlIzNjA1N19WU1NGR1IpICYgWlIzNjA1N19WU1NGR1JfU25hcFNob3QpCiAJCQlkcHJpbnRrKDEsCiAJCQkJS0VSTl9XQVJOSU5HCi0JCQkJIiVzOiB6cjM2MDU3X3NldF9tZW1ncmFiKDEpIHdpdGggU25hcFNob3Qgb3IgRnJhbWVHcmFiIG9uIT9cbiIsCisJCQkJIiVzOiB6cjM2MDU3X3NldF9tZW1ncmFiKDEpIHdpdGggU25hcFNob3Qgb24hP1xuIiwKIAkJCQlaUl9ERVZOQU1FKHpyKSk7CiAKIAkJLyogc3dpdGNoIG9uIFZTeW5jIGludGVycnVwdHMgKi8KQEAgLTY3MiwxMSArNjQ3LDEyIEBACiAKIAkJenItPnY0bF9tZW1ncmFiX2FjdGl2ZSA9IDE7CiAJfSBlbHNlIHsKLQkJenItPnY0bF9tZW1ncmFiX2FjdGl2ZSA9IDA7Ci0KIAkJLyogc3dpdGNoIG9mZiBWU3luYyBpbnRlcnJ1cHRzICovCiAJCWJ0YW5kKH56ci0+Y2FyZC52c3luY19pbnQsIFpSMzYwNTdfSUNSKTsJLy8gU1cKIAorCQl6ci0+djRsX21lbWdyYWJfYWN0aXZlID0gMDsKKwkJenItPnY0bF9ncmFiX2ZyYW1lID0gTk9fR1JBQl9BQ1RJVkU7CisKIAkJLyogcmVlbmFibGUgZ3JhYmJpbmcgdG8gc2NyZWVuIGlmIGl0IHdhcyBydW5uaW5nICovCiAJCWlmICh6ci0+djRsX292ZXJsYXlfYWN0aXZlKSB7CiAJCQl6cjM2MDU3X292ZXJsYXkoenIsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKaW5kZXggMTcxMThhNC4uNzJhMDM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCkBAIC05OSw4OCArOTksMTAzIEBACiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19WNEwyKSAmJiBkZWZpbmVkKENPTkZJR19WSURFT19WNEwxX0NPTVBBVCkKKyNkZWZpbmUgWkZNVChwYWwsIGZjYywgY3MpIFwKKwkucGFsZXR0ZSA9IChwYWwpLCAuZm91cmNjID0gKGZjYyksIC5jb2xvcnNwYWNlID0gKGNzKQorI2VsaWYgZGVmaW5lZChDT05GSUdfVklERU9fVjRMMikKKyNkZWZpbmUgWkZNVChwYWwsIGZjYywgY3MpIFwKKwkuZm91cmNjID0gKGZjYyksIC5jb2xvcnNwYWNlID0gKGNzKQorI2Vsc2UKKyNkZWZpbmUgWkZNVChwYWwsIGZjYywgY3MpIFwKKwkucGFsZXR0ZSA9IChwYWwpCisjZW5kaWYKKwogY29uc3Qgc3RydWN0IHpvcmFuX2Zvcm1hdCB6b3Jhbl9mb3JtYXRzW10gPSB7CiAJewotCQkubmFtZSA9ICIxNS1iaXQgUkdCIiwKLQkJLnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjU1NSwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMgotI2lmZGVmIF9fTElUVExFX0VORElBTgotCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU1NSwKLSNlbHNlCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCNTU1WCwKLSNlbmRpZgotCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAotI2VuZGlmCisJCS5uYW1lID0gIjE1LWJpdCBSR0IgTEUiLAorCQlaRk1UKFZJREVPX1BBTEVUVEVfUkdCNTU1LAorCQkgICAgIFY0TDJfUElYX0ZNVF9SR0I1NTUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCKSwKIAkJLmRlcHRoID0gMTUsCiAJCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKIAkJCSBaT1JBTl9GT1JNQVRfT1ZFUkxBWSwKKwkJLnZmZXNwZnIgPSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTU1fFpSMzYwNTdfVkZFU1BGUl9FcnJEaWZ8CisJCQkgICBaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuLAogCX0sIHsKLQkJLm5hbWUgPSAiMTYtYml0IFJHQiIsCi0JCS5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0I1NjUsCi0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDIKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0I1NjUsCi0jZWxzZQotCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU2NVgsCi0jZW5kaWYKLQkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKLSNlbmRpZgorCQkubmFtZSA9ICIxNS1iaXQgUkdCIEJFIiwKKwkJWkZNVCgtMSwKKwkJICAgICBWNEwyX1BJWF9GTVRfUkdCNTU1WCwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAorCQkuZGVwdGggPSAxNSwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I1NTV8WlIzNjA1N19WRkVTUEZSX0VyckRpZiwKKwl9LCB7CisJCS5uYW1lID0gIjE2LWJpdCBSR0IgTEUiLAorCQlaRk1UKFZJREVPX1BBTEVUVEVfUkdCNTY1LAorCQkgICAgIFY0TDJfUElYX0ZNVF9SR0I1NjUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCKSwKIAkJLmRlcHRoID0gMTYsCiAJCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKIAkJCSBaT1JBTl9GT1JNQVRfT1ZFUkxBWSwKKwkJLnZmZXNwZnIgPSBaUjM2MDU3X1ZGRVNQRlJfUkdCNTY1fFpSMzYwNTdfVkZFU1BGUl9FcnJEaWZ8CisJCQkgICBaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuLAorCX0sIHsKKwkJLm5hbWUgPSAiMTYtYml0IFJHQiBCRSIsCisJCVpGTVQoLTEsCisJCSAgICAgVjRMMl9QSVhfRk1UX1JHQjU2NSwgVjRMMl9DT0xPUlNQQUNFX1NSR0IpLAorCQkuZGVwdGggPSAxNiwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9SR0I1NjV8WlIzNjA1N19WRkVTUEZSX0VyckRpZiwKIAl9LCB7CiAJCS5uYW1lID0gIjI0LWJpdCBSR0IiLAotCQkucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCMjQsCi0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDIKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9CR1IyNCwKLSNlbHNlCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCMjQsCi0jZW5kaWYKLQkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKLSNlbmRpZgorCQlaRk1UKFZJREVPX1BBTEVUVEVfUkdCMjQsCisJCSAgICAgVjRMMl9QSVhfRk1UX0JHUjI0LCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCiAJCS5kZXB0aCA9IDI0LAogCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CiAJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjg4OHxaUjM2MDU3X1ZGRVNQRlJfUGFjazI0LAogCX0sIHsKLQkJLm5hbWUgPSAiMzItYml0IFJHQiIsCi0JCS5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IzMiwKLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMgotI2lmZGVmIF9fTElUVExFX0VORElBTgotCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0JHUjMyLAotI2Vsc2UKLQkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0IzMiwKLSNlbmRpZgotCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAotI2VuZGlmCisJCS5uYW1lID0gIjMyLWJpdCBSR0IgTEUiLAorCQlaRk1UKFZJREVPX1BBTEVUVEVfUkdCMzIsCisJCSAgICAgVjRMMl9QSVhfRk1UX0JHUjMyLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCiAJCS5kZXB0aCA9IDMyLAogCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CiAJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjg4OHxaUjM2MDU3X1ZGRVNQRlJfTGl0dGxlRW5kaWFuLAorCX0sIHsKKwkJLm5hbWUgPSAiMzItYml0IFJHQiBCRSIsCisJCVpGTVQoLTEsCisJCSAgICAgVjRMMl9QSVhfRk1UX1JHQjMyLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQiksCisJCS5kZXB0aCA9IDMyLAorCQkuZmxhZ3MgPSBaT1JBTl9GT1JNQVRfQ0FQVFVSRSB8CisJCQkgWk9SQU5fRk9STUFUX09WRVJMQVksCisJCS52ZmVzcGZyID0gWlIzNjA1N19WRkVTUEZSX1JHQjg4OCwKIAl9LCB7CiAJCS5uYW1lID0gIjQ6MjoyLCBwYWNrZWQsIFlVWVYiLAotCQkucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfWVVWNDIyLAotI2lmZGVmIENPTkZJR19WSURFT19WNEwyCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVZViwKLQkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNLAotI2VuZGlmCisJCVpGTVQoVklERU9fUEFMRVRURV9ZVVY0MjIsCisJCSAgICAgVjRMMl9QSVhfRk1UX1lVWVYsIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0pLAogCQkuZGVwdGggPSAxNiwKIAkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAogCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9ZVVY0MjIsCisJfSwgeworCQkubmFtZSA9ICI0OjI6MiwgcGFja2VkLCBVWVZZIiwKKwkJWkZNVChWSURFT19QQUxFVFRFX1VZVlksCisJCSAgICAgVjRMMl9QSVhfRk1UX1VZVlksIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0pLAorCQkuZGVwdGggPSAxNiwKKwkJLmZsYWdzID0gWk9SQU5fRk9STUFUX0NBUFRVUkUgfAorCQkJIFpPUkFOX0ZPUk1BVF9PVkVSTEFZLAorCQkudmZlc3BmciA9IFpSMzYwNTdfVkZFU1BGUl9ZVVY0MjJ8WlIzNjA1N19WRkVTUEZSX0xpdHRsZUVuZGlhbiwKIAl9LCB7CiAJCS5uYW1lID0gIkhhcmR3YXJlLWVuY29kZWQgTW90aW9uLUpQRUciLAotCQkucGFsZXR0ZSA9IC0xLAotI2lmZGVmIENPTkZJR19WSURFT19WNEwyCi0JCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTUpQRUcsCi0JCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSwKLSNlbmRpZgorCQlaRk1UKC0xLAorCQkgICAgIFY0TDJfUElYX0ZNVF9NSlBFRywgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTSksCiAJCS5kZXB0aCA9IDAsCiAJCS5mbGFncyA9IFpPUkFOX0ZPUk1BVF9DQVBUVVJFIHwKIAkJCSBaT1JBTl9GT1JNQVRfUExBWUJBQ0sgfAogCQkJIFpPUkFOX0ZPUk1BVF9DT01QUkVTU0VELAogCX0KIH07Ci1zdGF0aWMgY29uc3QgaW50IHpvcmFuX251bV9mb3JtYXRzID0KLSAgICAoc2l6ZW9mKHpvcmFuX2Zvcm1hdHMpIC8gc2l6ZW9mKHN0cnVjdCB6b3Jhbl9mb3JtYXQpKTsKKyNkZWZpbmUgTlVNX0ZPUk1BVFMgQVJSQVlfU0laRSh6b3Jhbl9mb3JtYXRzKQogCiAvLyBSSjogVGVzdCBvbmx5IC0gd2FudCB0byB0ZXN0IEJVWl9VU0VfSElNRU0gZXZlbiB3aGVuIENPTkZJR19CSUdQSFlTX0FSRUEgaXMgZGVmaW5lZAogCkBAIC03NjgsMTMgKzc4MywxMyBAQAogCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7CiAJaW50IHJlcyA9IDAsIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtX2Zvcm1hdHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CiAJCWlmICh6b3Jhbl9mb3JtYXRzW2ldLnBhbGV0dGUgPT0gbXAtPmZvcm1hdCAmJgogCQkgICAgem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIFpPUkFOX0ZPUk1BVF9DQVBUVVJFICYmCiAJCSAgICAhKHpvcmFuX2Zvcm1hdHNbaV0uZmxhZ3MgJiBaT1JBTl9GT1JNQVRfQ09NUFJFU1NFRCkpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMgfHwgem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSAwKSB7CisJaWYgKGkgPT0gTlVNX0ZPUk1BVFMgfHwgem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSAwKSB7CiAJCWRwcmludGsoMSwKIAkJCUtFUk5fRVJSCiAJCQkiJXM6IHY0bF9ncmFiKCkgLSB3cm9uZyBieXRlcy1wZXItcGl4ZWwgZm9ybWF0XG4iLApAQCAtMTE3MywxMCArMTE4OCwxNCBAQAogCiAJLyogdjRsIGNhcHR1cmUgKi8KIAlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSAhPSBaT1JBTl9GUkVFKSB7CisJCWxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwogCQl6cjM2MDU3X3NldF9tZW1ncmFiKHpyLCAwKTsKIAkJenItPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CiAJCXpyLT52NGxfYnVmZmVycy5hY3RpdmUgPSBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KIAkJICAgIFpPUkFOX0ZSRUU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwogCX0KIAogCS8qIHY0bCBidWZmZXJzICovCkBAIC0yMTA3LDcgKzIxMjYsNyBAQAogCQkJdnBpY3QtPmNvbG91ciwgdnBpY3QtPmNvbnRyYXN0LCB2cGljdC0+ZGVwdGgsCiAJCQl2cGljdC0+cGFsZXR0ZSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspIHsKIAkJCWNvbnN0IHN0cnVjdCB6b3Jhbl9mb3JtYXQgKmZtdCA9ICZ6b3Jhbl9mb3JtYXRzW2ldOwogCiAJCQlpZiAoZm10LT5wYWxldHRlICE9IC0xICYmCkBAIC0yMTE2LDcgKzIxMzUsNyBAQAogCQkJICAgIGZtdC0+ZGVwdGggPT0gdnBpY3QtPmRlcHRoKQogCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChpID09IHpvcmFuX251bV9mb3JtYXRzKSB7CisJCWlmIChpID09IE5VTV9GT1JNQVRTKSB7CiAJCQlkcHJpbnRrKDEsCiAJCQkJS0VSTl9FUlIKIAkJCQkiJXM6IFZJRElPQ1NQSUNUIC0gSW52YWxpZCBwYWxldHRlICVkXG4iLApAQCAtMjIyMCwxMCArMjIzOSwxMCBAQAogCQkJWlJfREVWTkFNRSh6ciksIHZidWYtPmJhc2UsIHZidWYtPndpZHRoLAogCQkJdmJ1Zi0+aGVpZ2h0LCB2YnVmLT5kZXB0aCwgdmJ1Zi0+Ynl0ZXNwZXJsaW5lKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgem9yYW5fbnVtX2Zvcm1hdHM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCiAJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5kZXB0aCA9PSB2YnVmLT5kZXB0aCkKIAkJCQlicmVhazsKLQkJaWYgKGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMpIHsKKwkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKIAkJCWRwcmludGsoMSwKIAkJCQlLRVJOX0VSUgogCQkJCSIlczogVklESU9DU0ZCVUYgLSBpbnZhbGlkIGZidWYgZGVwdGggJWRcbiIsCkBAIC0yNjcyLDE0ICsyNjkxLDE0IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW1fZm9ybWF0czsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CiAJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIGZsYWcpCiAJCQkJbnVtKys7CiAJCQlpZiAobnVtID09IGZtdC0+aW5kZXgpCiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGZtdC0+aW5kZXggPCAwIC8qIGxhdGUsIGJ1dCBub3QgdG9vIGxhdGUgKi8gIHx8Ci0JCSAgICBpID09IHpvcmFuX251bV9mb3JtYXRzKQorCQkgICAgaSA9PSBOVU1fRk9STUFUUykKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7CkBAIC0yNzM3LDcgKzI3NTYsOCBAQAogCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPQogCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmhlaWdodDsKIAkJCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0KLQkJCQkgICAgZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplOworCQkJCSAgICBmaC0+djRsX3NldHRpbmdzLmJ5dGVzcGVybGluZSAqCisJCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0OwogCQkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9CiAJCQkJICAgIGZoLT52NGxfc2V0dGluZ3MuZm9ybWF0LT5mb3VyY2M7CiAJCQkJZm10LT5mbXQucGl4LmNvbG9yc3BhY2UgPQpAQCAtMjk0MSwxMSArMjk2MSwxMSBAQAogCQkJc2ZtdGpwZ191bmxvY2tfYW5kX3JldHVybjoKIAkJCQltdXRleF91bmxvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspCisJCQkJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspCiAJCQkJCWlmIChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0KIAkJCQkJICAgIHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjKQogCQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGkgPT0gem9yYW5fbnVtX2Zvcm1hdHMpIHsKKwkJCQlpZiAoaSA9PSBOVU1fRk9STUFUUykgewogCQkJCQlkcHJpbnRrKDEsCiAJCQkJCQlLRVJOX0VSUgogCQkJCQkJIiVzOiBWSURJT0NfU19GTVQgLSB1bmtub3duL3Vuc3VwcG9ydGVkIGZvcm1hdCAweCV4ICglNC40cylcbiIsCkBAIC0yOTg0LDggKzMwMDQsOSBAQAogCiAJCQkJLyogdGVsbCB0aGUgdXNlciB0aGUKIAkJCQkgKiByZXN1bHRzL21pc3Npbmcgc3R1ZmYgKi8KLQkJCQlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0gZmgtPnY0bF9idWZmZXJzLmJ1ZmZlcl9zaXplCS8qenItPmdicGwgKiB6ci0+Z2hlaWdodCAqLwotCQkJCSAgICA7CisJCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJCWZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICoKKwkJCQkJZmgtPnY0bF9zZXR0aW5ncy5ieXRlc3BlcmxpbmU7CiAJCQkJaWYgKEJVWl9NQVhfSEVJR0hUIDwKIAkJCQkgICAgKGZoLT52NGxfc2V0dGluZ3MuaGVpZ2h0ICogMikpCiAJCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9CkBAIC0zMDUzLDEwICszMDc0LDEwIEBACiAJCQlmYi0+Zm10LmJ5dGVzcGVybGluZSwgZmItPmZtdC5waXhlbGZvcm1hdCwKIAkJCShjaGFyICopICZwcmludGZvcm1hdCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHpvcmFuX251bV9mb3JtYXRzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKQogCQkJaWYgKHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjID09IGZiLT5mbXQucGl4ZWxmb3JtYXQpCiAJCQkJYnJlYWs7Ci0JCWlmIChpID09IHpvcmFuX251bV9mb3JtYXRzKSB7CisJCWlmIChpID09IE5VTV9GT1JNQVRTKSB7CiAJCQlkcHJpbnRrKDEsCiAJCQkJS0VSTl9FUlIKIAkJCQkiJXM6IFZJRElPQ19TX0ZCVUYgLSBmb3JtYXQ9MHgleCAoJTQuNHMpIG5vdCBhbGxvd2VkXG4iLApAQCAtMzQzOSw4ICszNDYwLDEzIEBACiAJCQkJZ290byBzdHJtb2ZmX3VubG9ja19hbmRfcmV0dXJuOwogCiAJCQkvKiB1bmxvYWQgY2FwdHVyZSAqLwotCQkJaWYgKHpyLT52NGxfbWVtZ3JhYl9hY3RpdmUpCisJCQlpZiAoenItPnY0bF9tZW1ncmFiX2FjdGl2ZSkgeworCQkJCWxvbmcgZmxhZ3M7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CiAJCQkJenIzNjA1N19zZXRfbWVtZ3JhYih6ciwgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCQl9CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBmaC0+djRsX2J1ZmZlcnMubnVtX2J1ZmZlcnM7IGkrKykKIAkJCQl6ci0+djRsX2J1ZmZlcnMuYnVmZmVyW2ldLnN0YXRlID0KQEAgLTM3MDQsMTEgKzM3MzAsMTEgQEAKIAkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DX1NfU1REIC0gbm9ybT0weCVsbHhcbiIsCiAJCQlaUl9ERVZOQU1FKHpyKSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqc3RkKTsKIAotCQlpZiAoKnN0ZCA9PSBWNEwyX1NURF9QQUwpCisJCWlmICgoKnN0ZCAmIFY0TDJfU1REX1BBTCkgJiYgISgqc3RkICYgflY0TDJfU1REX1BBTCkpCiAJCQlub3JtID0gVklERU9fTU9ERV9QQUw7Ci0JCWVsc2UgaWYgKCpzdGQgPT0gVjRMMl9TVERfTlRTQykKKwkJZWxzZSBpZiAoKCpzdGQgJiBWNEwyX1NURF9OVFNDKSAmJiAhKCpzdGQgJiB+VjRMMl9TVERfTlRTQykpCiAJCQlub3JtID0gVklERU9fTU9ERV9OVFNDOwotCQllbHNlIGlmICgqc3RkID09IFY0TDJfU1REX1NFQ0FNKQorCQllbHNlIGlmICgoKnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSAmJiAhKCpzdGQgJiB+VjRMMl9TVERfU0VDQU0pKQogCQkJbm9ybSA9IFZJREVPX01PREVfU0VDQU07CiAJCWVsc2UgaWYgKCpzdGQgPT0gVjRMMl9TVERfQUxMKQogCQkJbm9ybSA9IFZJREVPX01PREVfQVVUTzsKQEAgLTQxNDksMTEgKzQxNzUsMTEgQEAKIAkJCQkgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKIAkJCQlpbnQgaTsKIAotCQkJCWZvciAoaSA9IDA7IGkgPCB6b3Jhbl9udW1fZm9ybWF0czsgaSsrKQorCQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKQogCQkJCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mb3VyY2MgPT0KIAkJCQkJICAgIGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCkKIAkJCQkJCWJyZWFrOwotCQkJCWlmIChpID09IHpvcmFuX251bV9mb3JtYXRzKSB7CisJCQkJaWYgKGkgPT0gTlVNX0ZPUk1BVFMpIHsKIAkJCQkJcmVzID0gLUVJTlZBTDsKIAkJCQkJZ290byB0cnlmbXRfdW5sb2NrX2FuZF9yZXR1cm47CiAJCQkJfQpAQCAtNDIxMyw4ICs0MjM5LDggQEAKIHsKIAlzdHJ1Y3Qgem9yYW5fZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB6b3JhbiAqenIgPSBmaC0+enI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKnF1ZXVlID0gTlVMTDsKIAlpbnQgcmVzID0gMCwgZnJhbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIGJ1ZmZlcnMgYXJlIHJlYWR5IHRvIGJlIHN5bmNlZCBvbgogCSAqICh3L28gd2FpdHMgLSBPX05PTkJMT0NLKSBoZXJlCkBAIC00MjI4LDUxICs0MjU0LDU4IEBACiAKIAlzd2l0Y2ggKGZoLT5tYXBfbW9kZSkgewogCWNhc2UgWk9SQU5fTUFQX01PREVfUkFXOgotCQlpZiAoZmgtPnY0bF9idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFIHx8Ci0JCSAgICB6ci0+djRsX3BlbmRfaGVhZCA9PSB6ci0+djRsX3BlbmRfdGFpbCkgewotCQkJZHByaW50aygxLAotCQkJCSIlczogem9yYW5fcG9sbCgpIC0gbm8gYnVmZmVycyBxdWV1ZWRcbiIsCi0JCQkJWlJfREVWTkFNRSh6cikpOwotCQkJcmVzID0gUE9MTE5WQUw7Ci0JCQlnb3RvIHBvbGxfdW5sb2NrX2FuZF9yZXR1cm47Ci0JCX0KLQkJcXVldWUgPSAmenItPnY0bF9jYXBxOwotCQlmcmFtZSA9IHpyLT52NGxfcGVuZFt6ci0+djRsX3BlbmRfdGFpbCAmIFY0TF9NQVNLX0ZSQU1FXTsKLQkJcG9sbF93YWl0KGZpbGUsIHF1ZXVlLCB3YWl0KTsKLQkJaWYgKGZoLT52NGxfYnVmZmVycy5idWZmZXJbZnJhbWVdLnN0YXRlID09IEJVWl9TVEFURV9ET05FKQorCQlwb2xsX3dhaXQoZmlsZSwgJnpyLT52NGxfY2FwcSwgd2FpdCk7CisJCWZyYW1lID0genItPnY0bF9wZW5kW3pyLT52NGxfc3luY190YWlsICYgVjRMX01BU0tfRlJBTUVdOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJZHByaW50aygzLAorCQkJS0VSTl9ERUJVRworCQkJIiVzOiAlcygpIHJhdyAtIGFjdGl2ZT0lYywgc3luY190YWlsPSVsdS8lYywgcGVuZF90YWlsPSVsdSwgcGVuZF9oZWFkPSVsdVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBfX0ZVTkNUSU9OX18sCisJCQkiRkFMIltmaC0+djRsX2J1ZmZlcnMuYWN0aXZlXSwgenItPnY0bF9zeW5jX3RhaWwsCisJCQkiVVBNRCJbenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGVdLAorCQkJenItPnY0bF9wZW5kX3RhaWwsIHpyLT52NGxfcGVuZF9oZWFkKTsKKwkJLyogUHJvY2VzcyBpcyB0aGUgb25lIGNhcHR1cmluZz8gKi8KKwkJaWYgKGZoLT52NGxfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSAmJgorCQkgICAgLyogQnVmZmVyIHJlYWR5IHRvIERRQlVGPyAqLworCQkgICAgenItPnY0bF9idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPT0gQlVaX1NUQVRFX0RPTkUpCiAJCQlyZXMgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ci0+c3BpbmxvY2ssIGZsYWdzKTsKKwogCQlicmVhazsKIAogCWNhc2UgWk9SQU5fTUFQX01PREVfSlBHX1JFQzoKIAljYXNlIFpPUkFOX01BUF9NT0RFX0pQR19QTEFZOgotCQlpZiAoZmgtPmpwZ19idWZmZXJzLmFjdGl2ZSA9PSBaT1JBTl9GUkVFIHx8Ci0JCSAgICB6ci0+anBnX3F1ZV9oZWFkID09IHpyLT5qcGdfcXVlX3RhaWwpIHsKLQkJCWRwcmludGsoMSwKLQkJCQkiJXM6IHpvcmFuX3BvbGwoKSAtIG5vIGJ1ZmZlcnMgcXVldWVkXG4iLAotCQkJCVpSX0RFVk5BTUUoenIpKTsKLQkJCXJlcyA9IFBPTExOVkFMOwotCQkJZ290byBwb2xsX3VubG9ja19hbmRfcmV0dXJuOwotCQl9Ci0JCXF1ZXVlID0gJnpyLT5qcGdfY2FwcTsKKwkJcG9sbF93YWl0KGZpbGUsICZ6ci0+anBnX2NhcHEsIHdhaXQpOwogCQlmcmFtZSA9IHpyLT5qcGdfcGVuZFt6ci0+anBnX3F1ZV90YWlsICYgQlVaX01BU0tfRlJBTUVdOwotCQlwb2xsX3dhaXQoZmlsZSwgcXVldWUsIHdhaXQpOwotCQlpZiAoZmgtPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPT0gQlVaX1NUQVRFX0RPTkUpIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CisJCWRwcmludGsoMywKKwkJCUtFUk5fREVCVUcKKwkJCSIlczogJXMoKSBqcGcgLSBhY3RpdmU9JWMsIHF1ZV90YWlsPSVsdS8lYywgcXVlX2hlYWQ9JWx1LCBkbWE9JWx1LyVsdVxuIiwKKwkJCVpSX0RFVk5BTUUoenIpLCBfX0ZVTkNUSU9OX18sCisJCQkiRkFMIltmaC0+anBnX2J1ZmZlcnMuYWN0aXZlXSwgenItPmpwZ19xdWVfdGFpbCwKKwkJCSJVUE1EIlt6ci0+anBnX2J1ZmZlcnMuYnVmZmVyW2ZyYW1lXS5zdGF0ZV0sCisJCQl6ci0+anBnX3F1ZV9oZWFkLCB6ci0+anBnX2RtYV90YWlsLCB6ci0+anBnX2RtYV9oZWFkKTsKKwkJaWYgKGZoLT5qcGdfYnVmZmVycy5hY3RpdmUgIT0gWk9SQU5fRlJFRSAmJgorCQkgICAgenItPmpwZ19idWZmZXJzLmJ1ZmZlcltmcmFtZV0uc3RhdGUgPT0gQlVaX1NUQVRFX0RPTkUpIHsKIAkJCWlmIChmaC0+bWFwX21vZGUgPT0gWk9SQU5fTUFQX01PREVfSlBHX1JFQykKIAkJCQlyZXMgPSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCQkJZWxzZQogCQkJCXJlcyA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOworCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJZHByaW50aygxLAorCQkJS0VSTl9FUlIKIAkJCSIlczogem9yYW5fcG9sbCgpIC0gaW50ZXJuYWwgZXJyb3IsIHVua25vd24gbWFwX21vZGU9JWRcbiIsCiAJCQlaUl9ERVZOQU1FKHpyKSwgZmgtPm1hcF9tb2RlKTsKIAkJcmVzID0gUE9MTE5WQUw7Ci0JCWdvdG8gcG9sbF91bmxvY2tfYW5kX3JldHVybjsKIAl9CiAKLXBvbGxfdW5sb2NrX2FuZF9yZXR1cm46CiAJbXV0ZXhfdW5sb2NrKCZ6ci0+cmVzb3VyY2VfbG9jayk7CiAKIAlyZXR1cm4gcmVzOwpAQCAtNDM2OCwxMSArNDQwMSwxNSBAQAogCQkJCW11dGV4X2xvY2soJnpyLT5yZXNvdXJjZV9sb2NrKTsKIAogCQkJCWlmIChmaC0+djRsX2J1ZmZlcnMuYWN0aXZlICE9IFpPUkFOX0ZSRUUpIHsKKwkJCQkJbG9uZyBmbGFnczsKKworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmenItPnNwaW5sb2NrLCBmbGFncyk7CiAJCQkJCXpyMzYwNTdfc2V0X21lbWdyYWIoenIsIDApOwogCQkJCQl6ci0+djRsX2J1ZmZlcnMuYWxsb2NhdGVkID0gMDsKIAkJCQkJenItPnY0bF9idWZmZXJzLmFjdGl2ZSA9CiAJCQkJCSAgICBmaC0+djRsX2J1ZmZlcnMuYWN0aXZlID0KIAkJCQkJICAgIFpPUkFOX0ZSRUU7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpyLT5zcGlubG9jaywgZmxhZ3MpOwogCQkJCX0KIAkJCQkvL3Y0bF9mYnVmZmVyX2ZyZWUoZmlsZSk7CiAJCQkJZmgtPnY0bF9idWZmZXJzLmFsbG9jYXRlZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWcgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWcKaW5kZXggNDQ5NGUwZi4uZjU1Y2MwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vS2NvbmZpZwpAQCAtMTAyLDQgKzEwMiwxOCBAQAogCiAJICBJZiB1bnN1cmUgd2hldGhlciB5b3UgcmVhbGx5IHdhbnQgb3IgbmVlZCB0aGlzLCBzYXkgTi4KIAorY29uZmlnIEZVU0lPTl9MT0dHSU5HCisJYm9vbCAiRnVzaW9uIE1QVCBsb2dnaW5nIGZhY2lsaXR5IgorCWRlcGVuZHMgb24gRlVTSU9OCisJLS0taGVscC0tLQorCSAgVGhpcyB0dXJucyBvbiBhIGxvZ2dpbmcgZmFjaWxpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWJ1ZyBhIG51bWJlcgorCSAgb2YgRnVzaW9uIE1QVCByZWxhdGVkIHByb2JsZW1zLgorCisJICBUaGUgZGVidWcgbGV2ZWwgY2FuIGJlIHByb2dyYW1tZWQgb24gdGhlIGZseSB2aWEgU3lzRlMgKGhleCB2YWx1ZXMpCisKKwkgIGVjaG8gW2xldmVsXSA+IC9zeXMvY2xhc3Mvc2NzaV9ob3N0L2hvc3QjL2RlYnVnX2xldmVsCisKKwkgIFRoZXJlIGFyZSB2YXJpb3VzIGRlYnVnIGxldmVscyB0aGF0IGFuIGJlIGZvdW5kIGluIHRoZSBzb3VyY2U6CisJICBmaWxlOmRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZGVidWcuaAorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL01ha2VmaWxlIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9NYWtlZmlsZQppbmRleCA2MDAzYjQ2Li45NWM5NTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vTWFrZWZpbGUKQEAgLTEsMzkgKzEsOCBAQAogIyBGdXNpb24gTVBUIGRyaXZlcnM7IHJlY29nbml6ZWQgZGVidWcgZGVmaW5lcy4uLgotIyAgTVBUIGdlbmVyYWw6Ci0jRVhUUkFfQ0ZMQUdTICs9IC1ETVBUX0RFQlVHCi0jRVhUUkFfQ0ZMQUdTICs9IC1ETVBUX0RFQlVHX01TR19GUkFNRQotI0VYVFJBX0NGTEFHUyArPSAtRE1QVF9ERUJVR19TRwotI0VYVFJBX0NGTEFHUyArPSAtRE1QVF9ERUJVR19FVkVOVFMKLSNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfVkVSQk9TRV9FVkVOVFMKLSNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfSU5JVAotI0VYVFJBX0NGTEFHUyArPSAtRE1QVF9ERUJVR19FWElUCi0jRVhUUkFfQ0ZMQUdTICs9IC1ETVBUX0RFQlVHX0ZBSUwKLSNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfRFYKLSNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfVE0KLSNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfUkVQTFkKIAotIwotIyBkcml2ZXIvbW9kdWxlIHNwZWNpZmljcy4uLgotIwotIyAgRm9yIG1wdGJhc2U6Ci0jQ0ZMQUdTX21wdGJhc2UubyArPSAtRE1QVF9ERUJVR19IQU5EU0hBS0UKLSNDRkxBR1NfbXB0YmFzZS5vICs9IC1ETVBUX0RFQlVHX0NPTkZJRwotI0NGTEFHU19tcHRiYXNlLm8gKz0gLURNUFRfREVCVUdfREwKLSNDRkxBR1NfbXB0YmFzZS5vICs9IC1ETVBUX0RFQlVHX0lSUQotI0NGTEFHU19tcHRiYXNlLm8gKz0gLURNUFRfREVCVUdfUkVTRVQKLSMKLSMgIEZvciBtcHRzY3NpaDoKLSNDRkxBR1NfbXB0c2NzaWgubyArPSAtRE1QVF9ERUJVR19TQ1NJCi0jCi0jICBGb3IgbXB0Y3RsOgotI0NGTEFHU19tcHRjdGwubyArPSAtRE1QVF9ERUJVR19JT0NUTAotIwotIyAgRm9yIG1wdGZjOgotI0NGTEFHU19tcHRmYy5vICs9IC1ETVBUX0RFQlVHX0ZDCi0KLSMgIEZvciBtcHRzYXM6Ci0jQ0ZMQUdTX21wdHNhcy5vICs9IC1ETVBUX0RFQlVHX1NBUwotI0NGTEFHU19tcHRzYXMubyArPSAtRE1QVF9ERUJVR19TQVNfV0lERQorIyBlbmFibGUgdmVyYm9zZSBsb2dnaW5nCisjIENPTkZJR19GVVNJT05fTE9HR0lORyBuZWVkcyB0byBiZSBlbmFibGVkIGluIEtjb25maWcKKyNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfVkVSQk9TRQogCiAKICM9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LX0gTFNJX0xPR0lDCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IDA0Zjc1ZTIuLmU4NjZkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC04Nyw2ICs4NywxMCBAQAogbW9kdWxlX3BhcmFtKG1wdF9jaGFubmVsX21hcHBpbmcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1wdF9jaGFubmVsX21hcHBpbmcsICIgTWFwcGluZyBpZCdzIHRvIGNoYW5uZWxzIChkZWZhdWx0PTApIik7CiAKK3N0YXRpYyBpbnQgbXB0X2RlYnVnX2xldmVsOworbW9kdWxlX3BhcmFtKG1wdF9kZWJ1Z19sZXZlbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB0X2RlYnVnX2xldmVsLCAiIGRlYnVnIGxldmVsIC0gcmVmZXIgdG8gbXB0ZGVidWcuaCAtIChkZWZhdWx0PTApIik7CisKICNpZmRlZiBNRkNOVAogc3RhdGljIGludCBtZmNvdW50ZXIgPSAwOwogI2RlZmluZSBQUklOVF9NRl9DT1VOVCAyMDAwMApAQCAtMTc5LDkgKzE4Myw3IEBACiAKIC8vaW50CQltcHRfSGFyZFJlc2V0SGFuZGxlcihNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKTsKIHN0YXRpYyBpbnQJUHJvY2Vzc0V2ZW50Tm90aWZpY2F0aW9uKE1QVF9BREFQVEVSICppb2MsIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqZXZSZXBseSwgaW50ICpldkhhbmRsZXJzKTsKLSNpZmRlZiBNUFRfREVCVUdfUkVQTFkKIHN0YXRpYyB2b2lkCW1wdF9pb2NzdGF0dXNfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgaW9jX3N0YXR1cywgTVBUX0ZSQU1FX0hEUiAqbWYpOwotI2VuZGlmCiBzdGF0aWMgdm9pZAltcHRfZmNfbG9nX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGxvZ19pbmZvKTsKIHN0YXRpYyB2b2lkCW1wdF9zcGlfbG9nX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGxvZ19pbmZvKTsKIHN0YXRpYyB2b2lkCW1wdF9zYXNfbG9nX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGxvZ19pbmZvKTsKQEAgLTIyOSw3ICsyMzEsNyBAQAogCWludCByZXFfaWR4ID0gMDsKIAlpbnQgY2JfaWR4OwogCi0JZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJHb3QgVFVSQk8gcmVwbHkgcmVxX2lkeD0lMDh4XG4iLAorCWRtZnByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiR290IFRVUkJPIHJlcGx5IHJlcV9pZHg9JTA4eFxuIiwKIAkJCQlpb2MtPm5hbWUsIHBhKSk7CiAKIAlzd2l0Y2ggKHBhID4+IE1QSV9DT05URVhUX1JFUExZX1RZUEVfU0hJRlQpIHsKQEAgLTMxMiw5ICszMTQsOSBAQAogCWNiX2lkeCA9IG1yLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLmNiX2lkeDsKIAltZiA9IE1QVF9JTkRFWF8yX01GUFRSKGlvYywgcmVxX2lkeCk7CiAKLQlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkdvdCBub24tVFVSQk8gcmVwbHk9JXAgcmVxX2lkeD0leCBjYl9pZHg9JXggRnVuY3Rpb249JXhcbiIsCisJZG1mcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJHb3Qgbm9uLVRVUkJPIHJlcGx5PSVwIHJlcV9pZHg9JXggY2JfaWR4PSV4IEZ1bmN0aW9uPSV4XG4iLAogCQkJaW9jLT5uYW1lLCBtciwgcmVxX2lkeCwgY2JfaWR4LCBtci0+dS5oZHIuRnVuY3Rpb24pKTsKLQlEQkdfRFVNUF9SRVBMWV9GUkFNRShtcikKKwlEQkdfRFVNUF9SRVBMWV9GUkFNRShpb2MsICh1MzIgKiltcikKIAogCSAvKiAgQ2hlY2svbG9nIElPQyBsb2cgaW5mbwogCSAqLwpAQCAtMzI5LDEwICszMzEsOCBAQAogCQkJbXB0X3Nhc19sb2dfaW5mbyhpb2MsIGxvZ19pbmZvKTsKIAl9CiAKLSNpZmRlZiBNUFRfREVCVUdfUkVQTFkKIAlpZiAoaW9jX3N0YXQgJiBNUElfSU9DU1RBVFVTX01BU0spCiAJCW1wdF9pb2NzdGF0dXNfaW5mbyhpb2MsICh1MzIpaW9jX3N0YXQsIG1mKTsKLSNlbmRpZgogCiAJLyogIENoZWNrIGZvciAodmFsaWQpIElPIGNhbGxiYWNrISAgKi8KIAlpZiAoY2JfaWR4IDwgMSB8fCBjYl9pZHggPj0gTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTIHx8CkBAIC00MTQsMTcgKzQxNCwxNyBAQAogCWludCBmcmVlcmVxID0gMTsKIAl1OCBmdW5jOwogCi0JZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtcHRfYmFzZV9yZXBseSgpIGNhbGxlZFxuIiwgaW9jLT5uYW1lKSk7Ci0KLSNpZiBkZWZpbmVkKE1QVF9ERUJVR19NU0dfRlJBTUUpCi0JaWYgKCEocmVwbHktPnUuaGRyLk1zZ0ZsYWdzICYgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSkpIHsKLQkJZG1mcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogT3JpZ2luYWwgcmVxdWVzdCBmcmFtZSAoQCVwKSBoZWFkZXJcbiIsIG1mKSk7Ci0JCURCR19EVU1QX1JFUVVFU1RfRlJBTUVfSERSKG1mKQorCWRtZnByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0X2Jhc2VfcmVwbHkoKSBjYWxsZWRcbiIsIGlvYy0+bmFtZSkpOworI2lmZGVmIENPTkZJR19GVVNJT05fTE9HR0lORworCWlmICgoaW9jLT5kZWJ1Z19sZXZlbCAmIE1QVF9ERUJVR19NU0dfRlJBTUUpICYmCisJCQkhKHJlcGx5LT51Lmhkci5Nc2dGbGFncyAmIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkpKSB7CisJCWRtZnByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogT3JpZ2luYWwgcmVxdWVzdCBmcmFtZSAoQCVwKSBoZWFkZXJcbiIsIG1mKSk7CisJCURCR19EVU1QX1JFUVVFU1RfRlJBTUVfSERSKGlvYywgKHUzMiAqKW1mKQogCX0KICNlbmRpZgogCiAJZnVuYyA9IHJlcGx5LT51Lmhkci5GdW5jdGlvbjsKLQlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIm1wdF9iYXNlX3JlcGx5LCBGdW5jdGlvbj0lMDJYaFxuIiwKKwlkbWZwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIm1wdF9iYXNlX3JlcGx5LCBGdW5jdGlvbj0lMDJYaFxuIiwKIAkJCWlvYy0+bmFtZSwgZnVuYykpOwogCiAJaWYgKGZ1bmMgPT0gTVBJX0ZVTkNUSU9OX0VWRU5UX05PVElGSUNBVElPTikgewpAQCAtNDM1LDcgKzQzNSw3IEBACiAJCXJlc3VsdHMgPSBQcm9jZXNzRXZlbnROb3RpZmljYXRpb24oaW9jLCBwRXZSZXBseSwgJmV2SGFuZGxlcnMpOwogCQlpZiAocmVzdWx0cyAhPSBldkhhbmRsZXJzKSB7CiAJCQkvKiBDSEVDS01FISBBbnkgc3BlY2lhbCBoYW5kbGluZyBuZWVkZWQgaGVyZT8gKi8KLQkJCWRldnR2ZXJib3NlcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJDYWxsZWQgJWQgZXZlbnQgaGFuZGxlcnMsIHN1bSByZXN1bHRzID0gJWRcbiIsCisJCQlkZXZ0dmVyYm9zZXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJDYWxsZWQgJWQgZXZlbnQgaGFuZGxlcnMsIHN1bSByZXN1bHRzID0gJWRcbiIsCiAJCQkJCWlvYy0+bmFtZSwgZXZIYW5kbGVycywgcmVzdWx0cykpOwogCQl9CiAKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQlpZiAocEV2UmVwbHktPk1zZ0ZsYWdzICYgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSkgewogCQkJZnJlZXJlcSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlkZXZ0dmVyYm9zZXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiRVZFTlRfTk9USUZJQ0FUSU9OIHJlcGx5ICVwIHJldHVybnMgUmVxdWVzdCBmcmFtZVxuIiwKKwkJCWRldnR2ZXJib3NlcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIkVWRU5UX05PVElGSUNBVElPTiByZXBseSAlcCByZXR1cm5zIFJlcXVlc3QgZnJhbWVcbiIsCiAJCQkJaW9jLT5uYW1lLCBwRXZSZXBseSkpOwogCQl9CiAKQEAgLTQ1NSwxMyArNDU1LDEzIEBACiAjZW5kaWYKIAogCX0gZWxzZSBpZiAoZnVuYyA9PSBNUElfRlVOQ1RJT05fRVZFTlRfQUNLKSB7Ci0JCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIm1wdF9iYXNlX3JlcGx5LCBFdmVudEFjayByZXBseSByZWNlaXZlZFxuIiwKKwkJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0X2Jhc2VfcmVwbHksIEV2ZW50QWNrIHJlcGx5IHJlY2VpdmVkXG4iLAogCQkJCWlvYy0+bmFtZSkpOwogCX0gZWxzZSBpZiAoZnVuYyA9PSBNUElfRlVOQ1RJT05fQ09ORklHKSB7CiAJCUNPTkZJR1BBUk1TICpwQ2ZnOwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCWRjcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJjb25maWdfY29tcGxldGUgKG1mPSVwLG1yPSVwKVxuIiwKKwkJZGNwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgImNvbmZpZ19jb21wbGV0ZSAobWY9JXAsbXI9JXApXG4iLAogCQkJCWlvYy0+bmFtZSwgbWYsIHJlcGx5KSk7CiAKIAkJcENmZyA9ICogKChDT05GSUdQQVJNUyAqKikoKHU4ICopIG1mICsgaW9jLT5yZXFfc3ogLSBzaXplb2Yodm9pZCAqKSkpOwpAQCAtNDg0LDcgKzQ4NCw3IEBACiAJCQkJdTE2CQkgc3RhdHVzOwogCiAJCQkJc3RhdHVzID0gbGUxNl90b19jcHUocFJlcGx5LT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOwotCQkJCWRjcHJpbnRrKChLRVJOX05PVElDRSAiICBJT0NTdGF0dXM9JTA0eGgsIElPQ0xvZ0luZm89JTA4eGhcbiIsCisJCQkJZGNwcmludGsoaW9jLCBwcmludGsoS0VSTl9OT1RJQ0UgIiAgSU9DU3RhdHVzPSUwNHhoLCBJT0NMb2dJbmZvPSUwOHhoXG4iLAogCQkJCSAgICAgc3RhdHVzLCBsZTMyX3RvX2NwdShwUmVwbHktPklPQ0xvZ0luZm8pKSk7CiAKIAkJCQlwQ2ZnLT5zdGF0dXMgPSBzdGF0dXM7CkBAIC03ODksNyArNzg5LDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiTUYgQ291bnQgMHgleCBNYXggMHgleCBcbiIsIGlvYy0+bWZjbnQsIGlvYy0+cmVxX2RlcHRoKTsKICNlbmRpZgogCi0JZG1mcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IG1wdF9nZXRfbXNnX2ZyYW1lKCVkLCVkKSwgZ290IG1mPSVwXG4iLAorCWRtZnByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXM6IG1wdF9nZXRfbXNnX2ZyYW1lKCVkLCVkKSwgZ290IG1mPSVwXG4iLAogCQkJaW9jLT5uYW1lLCBoYW5kbGUsIGlvYy0+aWQsIG1mKSk7CiAJcmV0dXJuIG1mOwogfQpAQCAtODIwLDI3ICs4MjAsMTAgQEAKIAltZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4ID0gY3B1X3RvX2xlMTYocmVxX2lkeCk7CiAJbWYtPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5mbGQucnN2ZCA9IDA7CiAKLSNpZmRlZiBNUFRfREVCVUdfTVNHX0ZSQU1FCi0JewotCQl1MzIJKm0gPSBtZi0+dS5mcmFtZS5od2hkci5fX2hkcjsKLQkJaW50CSBpaSwgbjsKLQotCQlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBBYm91dCB0byBQdXQgbXNnIGZyYW1lIEAgJXA6XG4iIEtFUk5fSU5GTyAiICIsCi0JCQkJaW9jLT5uYW1lLCBtKTsKLQkJbiA9IGlvYy0+cmVxX3N6LzQgLSAxOwotCQl3aGlsZSAobVtuXSA9PSAwKQotCQkJbi0tOwotCQlmb3IgKGlpPTA7IGlpPD1uOyBpaSsrKSB7Ci0JCQlpZiAoaWkgJiYgKChpaSU4KT09MCkpCi0JCQkJcHJpbnRrKCJcbiIgS0VSTl9JTkZPICIgIik7Ci0JCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUobVtpaV0pKTsKLQkJfQotCQlwcmludGsoIlxuIik7Ci0JfQotI2VuZGlmCisJREJHX0RVTVBfUFVUX01TR19GUkFNRShpb2MsICh1MzIgKiltZik7CiAKIAltZl9kbWFfYWRkciA9IChpb2MtPnJlcV9mcmFtZXNfbG93X2RtYSArIHJlcV9vZmZzZXQpIHwgaW9jLT5SZXF1ZXN0TkJbcmVxX2lkeF07Ci0JZHNncHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtZl9kbWFfYWRkcj0leCByZXFfaWR4PSVkIFJlcXVlc3ROQj0leFxuIiwgaW9jLT5uYW1lLCBtZl9kbWFfYWRkciwgcmVxX2lkeCwgaW9jLT5SZXF1ZXN0TkJbcmVxX2lkeF0pKTsKKwlkc2dwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIm1mX2RtYV9hZGRyPSV4IHJlcV9pZHg9JWQgUmVxdWVzdE5CPSV4XG4iLCBpb2MtPm5hbWUsIG1mX2RtYV9hZGRyLCByZXFfaWR4LCBpb2MtPlJlcXVlc3ROQltyZXFfaWR4XSkpOwogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5SZXF1ZXN0RmlmbywgbWZfZG1hX2FkZHIpOwogfQogCkBAIC05NTUsNyArOTM4LDcgQEAKIAlpZiAoIShDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCkgJiBNUElfRE9PUkJFTExfQUNUSVZFKSkKIAkJcmV0dXJuIC01OwogCi0JZGhzcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0IHN0YXJ0LCBXYWl0Q250PSVkXG4iLAorCWRoc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXM6IG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0IHN0YXJ0LCBXYWl0Q250PSVkXG4iLAogCQlpb2MtPm5hbWUsIGlpKSk7CiAKIAlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKQEAgLTEwNjYsNyArMTA0OSw3IEBACiAJCQkgICAgaG9zdF9wYWdlX2J1ZmZlcl9zeiwKIAkJCSAgICAmaW9jLT5Ib3N0UGFnZUJ1ZmZlcl9kbWEpKSAhPSBOVUxMKSB7CiAKLQkJCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCQkJICAgICJob3N0X3BhZ2VfYnVmZmVyIEAgJXAsIGRtYSBAICV4LCBzej0lZCBieXRlc1xuIiwKIAkJCQkgICAgaW9jLT5uYW1lLCBpb2MtPkhvc3RQYWdlQnVmZmVyLAogCQkJCSAgICAodTMyKWlvYy0+SG9zdFBhZ2VCdWZmZXJfZG1hLApAQCAtMTQxMCwzMSArMTM5MywzNyBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGVudCwgKmVudDsKICNlbmRpZgogCisJaW9jID0ga3phbGxvYyhzaXplb2YoTVBUX0FEQVBURVIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoaW9jID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SIC0gSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhZGQgYWRhcHRlciFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpb2MtPmRlYnVnX2xldmVsID0gbXB0X2RlYnVnX2xldmVsOworCWlmIChtcHRfZGVidWdfbGV2ZWwpCisJCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogbXB0X2RlYnVnX2xldmVsPSV4aFxuIiwgbXB0X2RlYnVnX2xldmVsKTsKKwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKIAkJcmV0dXJuIHI7CiAKLQlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IG1wdF9hZGFwdGVyX2luc3RhbGxcbiIpKTsKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogbXB0X2FkYXB0ZXJfaW5zdGFsbFxuIikpOwogCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgewotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KKwkJZHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0KIAkJCSI6IDY0IEJJVCBQQ0kgQlVTIERNQSBBRERSRVNTSU5HIFNVUFBPUlRFRFxuIikpOwogCX0gZWxzZSBpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiAzMiBCSVQgUENJIEJVUyBETUEgQUREUkVTU0lORyBOT1QgU1VQUE9SVEVEXG4iKTsKIAkJcmV0dXJuIHI7CiAJfQogCi0JaWYgKCFwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKQotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KKwlpZiAoIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJZHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0KIAkJCSI6IFVzaW5nIDY0IGJpdCBjb25zaXN0ZW50IG1hc2tcbiIpKTsKLQllbHNlCi0JCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCX0gZWxzZSB7CisJCWRwcmludGsoaW9jLCBwcmludGsoS0VSTl9JTkZPIE1ZTkFNCiAJCQkiOiBOb3QgdXNpbmcgNjQgYml0IGNvbnNpc3RlbnQgbWFza1xuIikpOwotCi0JaW9jID0ga3phbGxvYyhzaXplb2YoTVBUX0FEQVBURVIpLCBHRlBfQVRPTUlDKTsKLQlpZiAoaW9jID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SIC0gSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhZGQgYWRhcHRlciFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKIAlpb2MtPmFsbG9jX3RvdGFsID0gc2l6ZW9mKE1QVF9BREFQVEVSKTsKIAlpb2MtPnJlcV9zeiA9IE1QVF9ERUZBVUxUX0ZSQU1FX1NJWkU7CQkvKiBhdm9pZCBkaXYgYnkgemVybyEgKi8KIAlpb2MtPnJlcGx5X3N6ID0gTVBUX1JFUExZX0ZSQU1FX1NJWkU7CkBAIC0xNTAyLDkgKzE0OTEsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaW9jLT5tZW1tYXAgPSBtZW07Ci0JZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBtZW0gPSAlcCwgbWVtX3BoeXMgPSAlbHhcbiIsIG1lbSwgbWVtX3BoeXMpKTsKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogbWVtID0gJXAsIG1lbV9waHlzID0gJWx4XG4iLCBtZW0sIG1lbV9waHlzKSk7CiAKLQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGZhY3RzIEAgJXAsIHBmYWN0c1swXSBAICVwXG4iLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiBmYWN0cyBAICVwLCBwZmFjdHNbMF0gQCAlcFxuIiwKIAkJCSZpb2MtPmZhY3RzLCAmaW9jLT5wZmFjdHNbMF0pKTsKIAogCWlvYy0+bWVtX3BoeXMgPSBtZW1fcGh5czsKQEAgLTE4MzAsNiArMTgxOSw3IEBACiAJaW50CSByZXQgPSAwOwogCWludAkgcmVzZXRfYWx0X2lvY19hY3RpdmUgPSAwOwogCWludAkgaXJxX2FsbG9jYXRlZCA9IDA7CisJdTgJKmE7CiAKIAlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IEluaXRpYXRpbmcgJXMgJXNcbiIsCiAJCQlpb2MtPm5hbWUsIHJlYXNvbj09TVBUX0hPU1RFVkVOVF9JT0NfQlJJTkdVUCA/ICJicmluZ3VwIiA6ICJyZWNvdmVyeSIpOwpAQCAtMTg1OCw3ICsxODQ4LDggQEAKIAogCQkJaWYgKHJlc2V0X2FsdF9pb2NfYWN0aXZlICYmIGlvYy0+YWx0X2lvYykgewogCQkJCS8qIChyZSlFbmFibGUgYWx0LUlPQyEgKHJlcGx5IGludGVycnVwdCwgRnJlZVEpICovCi0JCQkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGFsdC0lcyByZXBseSBpcnEgcmUtZW5hYmxlZFxuIiwKKwkJCQlkcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTQorCQkJCQkiOiBhbHQtJXMgcmVwbHkgaXJxIHJlLWVuYWJsZWRcbiIsCiAJCQkJCQlpb2MtPmFsdF9pb2MtPm5hbWUpKTsKIAkJCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+SW50TWFzaywgTVBJX0hJTV9ESU0pOwogCQkJCWlvYy0+YWx0X2lvYy0+YWN0aXZlID0gMTsKQEAgLTE4OTEsNyArMTg4Miw3IEBACiAKIAogCWlmIChpaSA9PSA1KSB7Ci0JCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXRyeSBJb2NGYWN0cyBmYWlsZWQgcmM9JXhcbiIsIGlvYy0+bmFtZSwgcmMpKTsKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJldHJ5IElvY0ZhY3RzIGZhaWxlZCByYz0leFxuIiwgaW9jLT5uYW1lLCByYykpOwogCQlyZXQgPSAtMjsKIAl9IGVsc2UgaWYgKHJlYXNvbiA9PSBNUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQKSB7CiAJCU1wdERpc3BsYXlJb2NDYXBhYmlsaXRpZXMoaW9jKTsKQEAgLTE4OTksMTMgKzE4OTAsMTUgQEAKIAogCWlmIChhbHRfaW9jX3JlYWR5KSB7CiAJCWlmICgocmMgPSBHZXRJb2NGYWN0cyhpb2MtPmFsdF9pb2MsIHNsZWVwRmxhZywgcmVhc29uKSkgIT0gMCkgewotCQkJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkluaXRpYWwgQWx0IElvY0ZhY3RzIGZhaWxlZCByYz0leFxuIiwgaW9jLT5uYW1lLCByYykpOworCQkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkiSW5pdGlhbCBBbHQgSW9jRmFjdHMgZmFpbGVkIHJjPSV4XG4iLCBpb2MtPm5hbWUsIHJjKSk7CiAJCQkvKiBSZXRyeSAtIGFsdCBJT0Mgd2FzIGluaXRpYWxpemVkIG9uY2UKIAkJCSAqLwogCQkJcmMgPSBHZXRJb2NGYWN0cyhpb2MtPmFsdF9pb2MsIHNsZWVwRmxhZywgcmVhc29uKTsKIAkJfQogCQlpZiAocmMpIHsKLQkJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXRyeSBBbHQgSW9jRmFjdHMgZmFpbGVkIHJjPSV4XG4iLCBpb2MtPm5hbWUsIHJjKSk7CisJCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAorCQkJCSJSZXRyeSBBbHQgSW9jRmFjdHMgZmFpbGVkIHJjPSV4XG4iLCBpb2MtPm5hbWUsIHJjKSk7CiAJCQlhbHRfaW9jX3JlYWR5ID0gMDsKIAkJCXJlc2V0X2FsdF9pb2NfYWN0aXZlID0gMDsKIAkJfSBlbHNlIGlmIChyZWFzb24gPT0gTVBUX0hPU1RFVkVOVF9JT0NfQlJJTkdVUCkgewpAQCAtMTkzOCw3ICsxOTMxLDcgQEAKIAkJCWlvYy0+cGNpX2lycSA9IGlvYy0+cGNpZGV2LT5pcnE7CiAJCQlwY2lfc2V0X21hc3Rlcihpb2MtPnBjaWRldik7CQkvKiA/PyAqLwogCQkJcGNpX3NldF9kcnZkYXRhKGlvYy0+cGNpZGV2LCBpb2MpOwotCQkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIGluc3RhbGxlZCBhdCBpbnRlcnJ1cHQgIgorCQkJZHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXMgaW5zdGFsbGVkIGF0IGludGVycnVwdCAiCiAJCQkJIiVkXG4iLCBpb2MtPm5hbWUsIGlvYy0+cGNpZGV2LT5pcnEpKTsKIAkJfQogCX0KQEAgLTE5NzYsNyArMTk2OSw3IEBACiAKIAlpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApewogCQlpZiAoaW9jLT51cGxvYWRfZncpIHsKLQkJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCQkJImZpcm13YXJlIHVwbG9hZCByZXF1aXJlZCFcbiIsIGlvYy0+bmFtZSkpOwogCiAJCQkvKiBDb250cm9sbGVyIGlzIG5vdCBvcGVyYXRpb25hbCwgY2Fubm90IGRvIHVwbG9hZApAQCAtMTk5Miw3ICsxOTg1LDggQEAKIAkJCQkJCSAqIGNoaXBzIChtcHRfYWRhcHRlcl9kaXNhYmxlLAogCQkJCQkJICogbXB0X2RpYWdfcmVzZXQpCiAJCQkJCQkgKi8KLQkJCQkJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiOiBtcHRfdXBsb2FkOiAgYWx0XyVzIGhhcyBjYWNoZWRfZnc9JXAgXG4iLAorCQkJCQkJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCQkJIjogbXB0X3VwbG9hZDogIGFsdF8lcyBoYXMgY2FjaGVkX2Z3PSVwIFxuIiwKIAkJCQkJCQlpb2MtPm5hbWUsIGlvYy0+YWx0X2lvYy0+bmFtZSwgaW9jLT5hbHRfaW9jLT5jYWNoZWRfZncpKTsKIAkJCQkJCWlvYy0+YWx0X2lvYy0+Y2FjaGVkX2Z3ID0gTlVMTDsKIAkJCQkJfQpAQCAtMjAxMiw3ICsyMDA2LDcgQEAKIAogCWlmIChyZXNldF9hbHRfaW9jX2FjdGl2ZSAmJiBpb2MtPmFsdF9pb2MpIHsKIAkJLyogKHJlKUVuYWJsZSBhbHQtSU9DISAocmVwbHkgaW50ZXJydXB0KSAqLwotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGFsdC0lcyByZXBseSBpcnEgcmUtZW5hYmxlZFxuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IGFsdC0lcyByZXBseSBpcnEgcmUtZW5hYmxlZFxuIiwKIAkJCQlpb2MtPmFsdF9pb2MtPm5hbWUpKTsKIAkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkludE1hc2ssIE1QSV9ISU1fRElNKTsKIAkJaW9jLT5hbHRfaW9jLT5hY3RpdmUgPSAxOwpAQCAtMjA2NCwxMyArMjA1OCwxMyBAQAogCQkJCSAqICAoTEFOUGFnZTFfdCBzdHVmZikKIAkJCQkgKi8KIAkJCQkodm9pZCkgR2V0TGFuQ29uZmlnUGFnZXMoaW9jKTsKLSNpZmRlZiBNUFRfREVCVUcKLQkJCQl7Ci0JCQkJCXU4ICphID0gKHU4KikmaW9jLT5sYW5fY25mZ19wYWdlMS5IYXJkd2FyZUFkZHJlc3NMb3c7Ci0JCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkxhbkFkZHIgPSAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKLQkJCQkJCQlpb2MtPm5hbWUsIGFbNV0sIGFbNF0sIGFbM10sIGFbMl0sIGFbMV0sIGFbMF0gKSk7Ci0JCQkJfQotI2VuZGlmCisJCQkJYSA9ICh1OCopJmlvYy0+bGFuX2NuZmdfcGFnZTEuSGFyZHdhcmVBZGRyZXNzTG93OworCQkJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJIkxhbkFkZHIgPSAlMDJYOiUwMlg6JTAyWDoiCisJCQkJCSIlMDJYOiUwMlg6JTAyWFxuIiwKKwkJCQkJaW9jLT5uYW1lLCBhWzVdLCBhWzRdLAorCQkJCQlhWzNdLCBhWzJdLCBhWzFdLCBhWzBdICkpOworCiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBHZXQgTlZSQU0gYW5kIGFkYXB0ZXIgbWF4aW11bXMgZnJvbSBTUFAgMCBhbmQgMgpAQCAtMjEwNywxNSArMjEwMSwxNyBAQAogCQlyYyA9IGhhbmRsZXJzID0gMDsKIAkJZm9yIChpaT1NUFRfTUFYX1BST1RPQ09MX0RSSVZFUlMtMTsgaWk7IGlpLS0pIHsKIAkJCWlmICgocmV0ID09IDApICYmIE1wdFJlc2V0SGFuZGxlcnNbaWldKSB7Ci0JCQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ2FsbGluZyBJT0MgcG9zdF9yZXNldCBoYW5kbGVyICMlZFxuIiwKLQkJCQkJCWlvYy0+bmFtZSwgaWkpKTsKKwkJCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCSJDYWxsaW5nIElPQyBwb3N0X3Jlc2V0IGhhbmRsZXIgIyVkXG4iLAorCQkJCQlpb2MtPm5hbWUsIGlpKSk7CiAJCQkJcmMgKz0gbXB0X3NpZ25hbF9yZXNldChpaSwgaW9jLCBNUFRfSU9DX1BPU1RfUkVTRVQpOwogCQkJCWhhbmRsZXJzKys7CiAJCQl9CiAKIAkJCWlmIChhbHRfaW9jX3JlYWR5ICYmIE1wdFJlc2V0SGFuZGxlcnNbaWldKSB7Ci0JCQkJZHJzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIGFsdC0lcyBwb3N0X3Jlc2V0IGhhbmRsZXIgIyVkXG4iLAotCQkJCQkJaW9jLT5uYW1lLCBpb2MtPmFsdF9pb2MtPm5hbWUsIGlpKSk7CisJCQkJZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCSJDYWxsaW5nIGFsdC0lcyBwb3N0X3Jlc2V0IGhhbmRsZXIgIyVkXG4iLAorCQkJCQlpb2MtPm5hbWUsIGlvYy0+YWx0X2lvYy0+bmFtZSwgaWkpKTsKIAkJCQlyYyArPSBtcHRfc2lnbmFsX3Jlc2V0KGlpLCBpb2MtPmFsdF9pb2MsIE1QVF9JT0NfUE9TVF9SRVNFVCk7CiAJCQkJaGFuZGxlcnMrKzsKIAkJCX0KQEAgLTIxNTMsNyArMjE0OSw3IEBACiAJdW5zaWduZWQgaW50IGZ1bmMgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CiAJTVBUX0FEQVBURVIgKmlvY19zcmNoOwogCi0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUENJIGRldmljZSAlcyBkZXZmbj0leC8leCwiCisJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUENJIGRldmljZSAlcyBkZXZmbj0leC8leCwiCiAJICAgICIgc2VhcmNoaW5nIGZvciBkZXZmbiBtYXRjaCBvbiAleCBvciAleFxuIiwKIAkJaW9jLT5uYW1lLCBwY2lfbmFtZShwZGV2KSwgcGRldi0+YnVzLT5udW1iZXIsCiAJCXBkZXYtPmRldmZuLCBmdW5jLTEsIGZ1bmMrMSkpOwpAQCAtMjE3OCw3ICsyMTc0LDcgQEAKIAkJCQkJaW9jX3NyY2gtPm5hbWUsIGlvY19zcmNoLT5hbHRfaW9jLT5uYW1lKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBGT1VORCEgYmluZGluZyAlcyA8PT0+ICVzXG4iLAorCQkJZHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRk9VTkQhIGJpbmRpbmcgJXMgPD09PiAlc1xuIiwKIAkJCQlpb2MtPm5hbWUsIGlvY19zcmNoLT5uYW1lKSk7CiAJCQlpb2Nfc3JjaC0+YWx0X2lvYyA9IGlvYzsKIAkJCWlvYy0+YWx0X2lvYyA9IGlvY19zcmNoOwpAQCAtMjE5OSw3ICsyMTk1LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKGlvYy0+Y2FjaGVkX2Z3ICE9IE5VTEwpIHsKLQkJZGRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogbXB0X2FkYXB0ZXJfZGlzYWJsZTogUHVzaGluZyBGVyBvbnRvIGFkYXB0ZXJcbiIpKTsKKwkJZGRscHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRfYWRhcHRlcl9kaXNhYmxlOiBQdXNoaW5nIEZXIG9udG8gYWRhcHRlclxuIikpOwogCQlpZiAoKHJldCA9IG1wdF9kb3dubG9hZGJvb3QoaW9jLCAoTXBpRndIZWFkZXJfdCAqKWlvYy0+Y2FjaGVkX2Z3LCBOT19TTEVFUCkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTQogCQkJCSI6IGZpcm13YXJlIGRvd25sb2FkYm9vdCBmYWlsdXJlICglZCkhXG4iLCByZXQpOwpAQCAtMjIxNCw3ICsyMjEwLDcgQEAKIAogCWlmIChpb2MtPmFsbG9jICE9IE5VTEwpIHsKIAkJc3ogPSBpb2MtPmFsbG9jX3N6OwotCQlkZXhpdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLmZyZWUgIEAgJXAsIHN6PSVkIGJ5dGVzXG4iLAorCQlkZXhpdHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXMuZnJlZSAgQCAlcCwgc3o9JWQgYnl0ZXNcbiIsCiAJCSAJaW9jLT5uYW1lLCBpb2MtPmFsbG9jLCBpb2MtPmFsbG9jX3N6KSk7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIHN6LAogCQkJCWlvYy0+YWxsb2MsIGlvYy0+YWxsb2NfZG1hKTsKQEAgLTIyNTYsNyArMjI1Miw3IEBACiAKIAlpZiAoaW9jLT5zcGlfZGF0YS5wSW9jUGc0ICE9IE5VTEwpIHsKIAkJc3ogPSBpb2MtPnNwaV9kYXRhLklvY1BnNFN6OwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBzeiwgCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIHN6LAogCQkJaW9jLT5zcGlfZGF0YS5wSW9jUGc0LAogCQkJaW9jLT5zcGlfZGF0YS5Jb2NQZzRfZG1hKTsKIAkJaW9jLT5zcGlfZGF0YS5wSW9jUGc0ID0gTlVMTDsKQEAgLTIyNzksNyArMjI3NSw3IEBACiAJCQkgICAiOiAlczogaG9zdCBwYWdlIGJ1ZmZlcnMgZnJlZSBmYWlsZWQgKCVkKSFcbiIsCiAJCQkgICAgX19GVU5DVElPTl9fLCByZXQpOwogCQl9Ci0JCWRleGl0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgSG9zdFBhZ2VCdWZmZXIgZnJlZSAgQCAlcCwgc3o9JWQgYnl0ZXNcbiIsCisJCWRleGl0cHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiAlcyBIb3N0UGFnZUJ1ZmZlciBmcmVlICBAICVwLCBzej0lZCBieXRlc1xuIiwKIAkJIAlpb2MtPm5hbWUsIGlvYy0+SG9zdFBhZ2VCdWZmZXIsIGlvYy0+SG9zdFBhZ2VCdWZmZXJfc3opKTsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaW9jLT5Ib3N0UGFnZUJ1ZmZlcl9zeiwKIAkJCQlpb2MtPkhvc3RQYWdlQnVmZmVyLApAQCAtMjMyNSw3ICsyMzIxLDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVFJSKSAmJiAwCiAJaWYgKGlvYy0+bXRycl9yZWcgPiAwKSB7CiAJCW10cnJfZGVsKGlvYy0+bXRycl9yZWcsIDAsIDApOwotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IE1UUlIgcmVnaW9uIGRlLXJlZ2lzdGVyZWRcbiIsIGlvYy0+bmFtZSkpOworCQlkcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogTVRSUiByZWdpb24gZGUtcmVnaXN0ZXJlZFxuIiwgaW9jLT5uYW1lKSk7CiAJfQogI2VuZGlmCiAKQEAgLTIzMzMsNyArMjMyOSw3IEBACiAJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CiAKIAlzel9sYXN0ID0gaW9jLT5hbGxvY190b3RhbDsKLQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IGZyZWUnZCAlZCBvZiAlZCBieXRlc1xuIiwKKwlkcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogZnJlZSdkICVkIG9mICVkIGJ5dGVzXG4iLAogCQkJaW9jLT5uYW1lLCBzel9maXJzdC1zel9sYXN0KyhpbnQpc2l6ZW9mKCppb2MpLCBzel9maXJzdCkpOwogCiAJaWYgKGlvYy0+YWx0X2lvYykKQEAgLTI0MTMsNyArMjQwOSw3IEBACiAKIAkvKiBHZXQgY3VycmVudCBbcmF3XSBJT0Mgc3RhdGUgICovCiAJaW9jX3N0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMCk7Ci0JZGhzcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6TWFrZUlvY1JlYWR5LCAlcyBbcmF3XSBzdGF0ZT0lMDh4XG4iLCBpb2MtPm5hbWUsIGlvY19zdGF0ZSkpOworCWRoc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjo6TWFrZUlvY1JlYWR5LCAlcyBbcmF3XSBzdGF0ZT0lMDh4XG4iLCBpb2MtPm5hbWUsIGlvY19zdGF0ZSkpOwogCiAJLyoKIAkgKglDaGVjayB0byBzZWUgaWYgSU9DIGdvdCBsZWZ0L3N0dWNrIGluIGRvb3JiZWxsIGhhbmRzaGFrZQpAQCAtMjQ0NCw3ICsyNDQwLDcgQEAKIAkgKglIbW1tLi4uICBEaWQgaXQgZ2V0IGxlZnQgb3BlcmF0aW9uYWw/CiAJICovCiAJaWYgKChpb2Nfc3RhdGUgJiBNUElfSU9DX1NUQVRFX01BU0spID09IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKLQkJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIklPQyBvcGVyYXRpb25hbCB1bmV4cGVjdGVkXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSU9DIG9wZXJhdGlvbmFsIHVuZXhwZWN0ZWRcbiIsCiAJCQkJaW9jLT5uYW1lKSk7CiAKIAkJLyogQ2hlY2sgV2hvSW5pdC4KQEAgLTI0NTMsNyArMjQ0OSw3IEBACiAJCSAqIEVsc2UsIGZhbGwgdGhyb3VnaCB0byBLaWNrU3RhcnQgY2FzZQogCQkgKi8KIAkJd2hvaW5pdCA9IChpb2Nfc3RhdGUgJiBNUElfRE9PUkJFTExfV0hPX0lOSVRfTUFTSykgPj4gTVBJX0RPT1JCRUxMX1dIT19JTklUX1NISUZUOwotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCisJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTQogCQkJIjogd2hvaW5pdCAweCV4IHN0YXRlZmF1bHQgJWQgZm9yY2UgJWRcbiIsCiAJCQl3aG9pbml0LCBzdGF0ZWZhdWx0LCBmb3JjZSkpOwogCQlpZiAod2hvaW5pdCA9PSBNUElfV0hPSU5JVF9QQ0lfUEVFUikKQEAgLTI1ODksNyArMjU4NSw3IEBACiAJZ2V0X2ZhY3RzLkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0lPQ19GQUNUUzsKIAkvKiBBc3NlcnQ6IEFsbCBvdGhlciBnZXRfZmFjdHMgZmllbGRzIGFyZSB6ZXJvISAqLwogCi0JZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCSAgICAiU2VuZGluZyBnZXQgSW9jRmFjdHMgcmVxdWVzdCByZXFfc3o9JWQgcmVwbHlfc3o9JWRcbiIsCiAJICAgIGlvYy0+bmFtZSwgcmVxX3N6LCByZXBseV9zeikpOwogCkBAIC0yNjkxLDggKzI2ODcsOSBAQAogCQkJc3ogPSBzeiA+PiAxOwogCQl9CiAJCWlvYy0+TkJTaGlmdEZhY3RvciAgPSBzaGlmdEZhY3RvcjsKLQkJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIk5CX2Zvcl82NF9ieXRlX2ZyYW1lPSV4IE5CU2hpZnRGYWN0b3I9JXggQmxvY2tTaXplPSV4XG4iLAotCQkJCQlpb2MtPm5hbWUsIHZ2LCBzaGlmdEZhY3RvciwgcikpOworCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAorCQkJIk5CX2Zvcl82NF9ieXRlX2ZyYW1lPSV4IE5CU2hpZnRGYWN0b3I9JXggQmxvY2tTaXplPSV4XG4iLAorCQkJaW9jLT5uYW1lLCB2diwgc2hpZnRGYWN0b3IsIHIpKTsKIAogCQlpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApIHsKIAkJCS8qCkBAIC0yNzA0LDkgKzI3MDEsOSBAQAogCQkJaW9jLT5yZXBseV9zeiA9IE1QVF9SRVBMWV9GUkFNRV9TSVpFOwogCQkJaW9jLT5yZXBseV9kZXB0aCA9IG1pbl90KGludCwgTVBUX0RFRkFVTFRfUkVQTFlfREVQVEgsIGZhY3RzLT5SZXBseVF1ZXVlRGVwdGgpOwogCi0JCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAicmVwbHlfc3o9JTNkLCByZXBseV9kZXB0aD0lNGRcbiIsCisJCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAicmVwbHlfc3o9JTNkLCByZXBseV9kZXB0aD0lNGRcbiIsCiAJCQkJaW9jLT5uYW1lLCBpb2MtPnJlcGx5X3N6LCBpb2MtPnJlcGx5X2RlcHRoKSk7Ci0JCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAicmVxX3N6ICA9JTNkLCByZXFfZGVwdGggID0lNGRcbiIsCisJCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAicmVxX3N6ICA9JTNkLCByZXFfZGVwdGggID0lNGRcbiIsCiAJCQkJaW9jLT5uYW1lLCBpb2MtPnJlcV9zeiwgaW9jLT5yZXFfZGVwdGgpKTsKIAogCQkJLyogR2V0IHBvcnQgZmFjdHMhICovCkBAIC0yNzY1LDcgKzI3NjIsNyBAQAogCWdldF9wZmFjdHMuUG9ydE51bWJlciA9IHBvcnRudW07CiAJLyogQXNzZXJ0OiBBbGwgb3RoZXIgZ2V0X3BmYWN0cyBmaWVsZHMgYXJlIHplcm8hICovCiAKLQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBnZXQgUG9ydEZhY3RzKCVkKSByZXF1ZXN0XG4iLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTZW5kaW5nIGdldCBQb3J0RmFjdHMoJWQpIHJlcXVlc3RcbiIsCiAJCQlpb2MtPm5hbWUsIHBvcnRudW0pKTsKIAogCS8qIE5vIG5vbi16ZXJvIGZpZWxkcyBpbiB0aGUgZ2V0X3BmYWN0cyByZXF1ZXN0IGFyZSBncmVhdGVyIHRoYW4KQEAgLTI4NDEsMTIgKzI4MzgsMTIgQEAKIAkJaW9jLT51cGxvYWRfZncgPSAxOwogCWVsc2UKIAkJaW9jLT51cGxvYWRfZncgPSAwOwotCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAidXBsb2FkX2Z3ICVkIGZhY3RzLkZsYWdzPSV4XG4iLAorCWRkbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAidXBsb2FkX2Z3ICVkIGZhY3RzLkZsYWdzPSV4XG4iLAogCQkgICBpb2MtPm5hbWUsIGlvYy0+dXBsb2FkX2Z3LCBpb2MtPmZhY3RzLkZsYWdzKSk7CiAKIAlpb2NfaW5pdC5NYXhEZXZpY2VzID0gKFU4KWlvYy0+ZGV2aWNlc19wZXJfYnVzOwogCWlvY19pbml0Lk1heEJ1c2VzID0gKFU4KWlvYy0+bnVtYmVyX29mX2J1c2VzOwotCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJmYWN0cy5Nc2dWZXJzaW9uPSV4XG4iLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJmYWN0cy5Nc2dWZXJzaW9uPSV4XG4iLAogCQkgICBpb2MtPm5hbWUsIGlvYy0+ZmFjdHMuTXNnVmVyc2lvbikpOwogCWlmIChpb2MtPmZhY3RzLk1zZ1ZlcnNpb24gPj0gTVBJX1ZFUlNJT05fMDFfMDUpIHsKIAkJLy8gc2V0IE1zZ1ZlcnNpb24gYW5kIEhlYWRlclZlcnNpb24gaG9zdCBkcml2ZXIgd2FzIGJ1aWx0IHdpdGgKQEAgLTI4NzcsNyArMjg3NCw3IEBACiAJaW9jLT5mYWN0cy5NYXhEZXZpY2VzID0gaW9jX2luaXQuTWF4RGV2aWNlczsKIAlpb2MtPmZhY3RzLk1heEJ1c2VzID0gaW9jX2luaXQuTWF4QnVzZXM7CiAKLQlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgSU9DSW5pdCAocmVxIEAgJXApXG4iLAorCWRoc3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiU2VuZGluZyBJT0NJbml0IChyZXEgQCAlcClcbiIsCiAJCQlpb2MtPm5hbWUsICZpb2NfaW5pdCkpOwogCiAJciA9IG1wdF9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoaW9jLCBzaXplb2YoSU9DSW5pdF90KSwgKHUzMiopJmlvY19pbml0LApAQCAtMjg5MSw3ICsyODg4LDcgQEAKIAkgKiBzaW5jZSB3ZSBkb24ndCBldmVuIGxvb2sgYXQgaXRzIGNvbnRlbnRzLgogCSAqLwogCi0JZGhzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTZW5kaW5nIFBvcnRFbmFibGUgKHJlcSBAICVwKVxuIiwKKwlkaHNwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlNlbmRpbmcgUG9ydEVuYWJsZSAocmVxIEAgJXApXG4iLAogCQkJaW9jLT5uYW1lLCAmaW9jX2luaXQpKTsKIAogCWlmICgociA9IFNlbmRQb3J0RW5hYmxlKGlvYywgMCwgc2xlZXBGbGFnKSkgIT0gMCkgewpAQCAtMjkyMiw3ICsyOTE5LDcgQEAKIAkJc3RhdGUgPSBtcHRfR2V0SW9jU3RhdGUoaW9jLCAxKTsKIAkJY291bnQrKzsKIAl9Ci0JZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIklORk8gLSBXYWl0IElPQ19PUEVSQVRJT05BTCBzdGF0ZSAoY250PSVkKVxuIiwKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSU5GTyAtIFdhaXQgSU9DX09QRVJBVElPTkFMIHN0YXRlIChjbnQ9JWQpXG4iLAogCQkJaW9jLT5uYW1lLCBjb3VudCkpOwogCiAJaW9jLT5hZW5fZXZlbnRfcmVhZF9mbGFnPTA7CkBAIC0yOTYyLDcgKzI5NTksNyBAQAogLyoJcG9ydF9lbmFibGUuTXNnRmxhZ3MgPSAwOwkJKi8KIC8qCXBvcnRfZW5hYmxlLk1zZ0NvbnRleHQgPSAwOwkJKi8KIAotCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTZW5kaW5nIFBvcnQoJWQpRW5hYmxlIChyZXEgQCAlcClcbiIsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlNlbmRpbmcgUG9ydCglZClFbmFibGUgKHJlcSBAICVwKVxuIiwKIAkJCWlvYy0+bmFtZSwgcG9ydG51bSwgJnBvcnRfZW5hYmxlKSk7CiAKIAkvKiBSQUlEIEZXIG1heSB0YWtlIGEgbG9uZyB0aW1lIHRvIGVuYWJsZQpAQCAtMzAxNSw3ICszMDEyLDcgQEAKIAlpbnQgc3o7CiAKIAlzeiA9IGlvYy0+ZmFjdHMuRldJbWFnZVNpemU7Ci0JZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiZnJlZV9md19tZW1vcnk6IEZXIEltYWdlICBAICVwWyVwXSwgc3o9JWRbJXhdIGJ5dGVzXG4iLAorCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiZnJlZV9md19tZW1vcnk6IEZXIEltYWdlICBAICVwWyVwXSwgc3o9JWRbJXhdIGJ5dGVzXG4iLAogCQkgaW9jLT5jYWNoZWRfZncsICh2b2lkICopKHVsb25nKWlvYy0+Y2FjaGVkX2Z3X2RtYSwgc3osIHN6KSk7CiAJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgc3osCiAJCQlpb2MtPmNhY2hlZF9mdywgaW9jLT5jYWNoZWRfZndfZG1hKTsKQEAgLTMwNTksNyArMzA1Niw3IEBACiAKIAltcHRfYWxsb2NfZndfbWVtb3J5KGlvYywgc3opOwogCi0JZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBGVyBJbWFnZSAgQCAlcFslcF0sIHN6PSVkWyV4XSBieXRlc1xuIiwKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRlcgSW1hZ2UgIEAgJXBbJXBdLCBzej0lZFsleF0gYnl0ZXNcbiIsCiAJCSBpb2MtPmNhY2hlZF9mdywgKHZvaWQgKikodWxvbmcpaW9jLT5jYWNoZWRfZndfZG1hLCBzeiwgc3opKTsKIAogCWlmIChpb2MtPmNhY2hlZF9mdyA9PSBOVUxMKSB7CkBAIC0zMDkxLDE0ICszMDg4LDE0IEBACiAJbXB0X2FkZF9zZ2UoJnJlcXVlc3Rbc2dlb2Zmc2V0XSwgZmxhZ3NMZW5ndGgsIGlvYy0+Y2FjaGVkX2Z3X2RtYSk7CiAKIAlzZ2VvZmZzZXQgKz0gc2l6ZW9mKHUzMikgKyBzaXplb2YoZG1hX2FkZHJfdCk7Ci0JZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBTZW5kaW5nIEZXIFVwbG9hZCAocmVxIEAgJXApIHNnZW9mZnNldD0lZCBcbiIsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IFNlbmRpbmcgRlcgVXBsb2FkIChyZXEgQCAlcCkgc2dlb2Zmc2V0PSVkIFxuIiwKIAkJCXByZXF1ZXN0LCBzZ2VvZmZzZXQpKTsKLQlEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKHByZXF1ZXN0KQorCURCR19EVU1QX0ZXX1JFUVVFU1RfRlJBTUUoaW9jLCAodTMyICopcHJlcXVlc3QpCiAKIAlpaSA9IG1wdF9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoaW9jLCBzZ2VvZmZzZXQsICh1MzIqKXByZXF1ZXN0LAogCQkJCXJlcGx5X3N6LCAodTE2KilwcmVwbHksIDY1IC8qc2Vjb25kcyovLCBzbGVlcEZsYWcpOwogCi0JZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBGVyBVcGxvYWQgY29tcGxldGVkIHJjPSV4IFxuIiwgaWkpKTsKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRlcgVXBsb2FkIGNvbXBsZXRlZCByYz0leCBcbiIsIGlpKSk7CiAKIAljbWRTdGF0dXMgPSAtRUZBVUxUOwogCWlmIChpaSA9PSAwKSB7CkBAIC0zMTEzLDEzICszMTEwLDEzIEBACiAJCQkJY21kU3RhdHVzID0gMDsKIAkJfQogCX0KLQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiOiBkb191cGxvYWQgY21kU3RhdHVzPSVkIFxuIiwKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiOiBkb191cGxvYWQgY21kU3RhdHVzPSVkIFxuIiwKIAkJCWlvYy0+bmFtZSwgY21kU3RhdHVzKSk7CiAKIAogCWlmIChjbWRTdGF0dXMpIHsKIAotCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIjogZncgdXBsb2FkIGZhaWxlZCwgZnJlZWluZyBpbWFnZSBcbiIsCisJCWRkbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiOiBmdyB1cGxvYWQgZmFpbGVkLCBmcmVlaW5nIGltYWdlIFxuIiwKIAkJCWlvYy0+bmFtZSkpOwogCQltcHRfZnJlZV9md19tZW1vcnkoaW9jKTsKIAl9CkBAIC0zMTU0LDcgKzMxNTEsNyBAQAogCXUzMgkJCSBsb2FkX2FkZHI7CiAJdTMyIAkJCSBpb2Nfc3RhdGU9MDsKIAotCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZG93bmxvYWRib290OiBmdyBzaXplIDB4JXggKCVkKSwgRlcgUHRyICVwXG4iLAorCWRkbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiZG93bmxvYWRib290OiBmdyBzaXplIDB4JXggKCVkKSwgRlcgUHRyICVwXG4iLAogCQkJCWlvYy0+bmFtZSwgcEZ3SGVhZGVyLT5JbWFnZVNpemUsIHBGd0hlYWRlci0+SW1hZ2VTaXplLCBwRndIZWFkZXIpKTsKIAogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCAweEZGKTsKQEAgLTMxNzksNyArMzE3Niw3IEBACiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzA7IGNvdW50ICsrKSB7CiAJCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CiAJCWlmICghKGRpYWcwdmFsICYgTVBJX0RJQUdfUkVTRVRfQURBUFRFUikpIHsKLQkJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUkVTRVRfQURBUFRFUiBjbGVhcmVkLCBjb3VudD0lZFxuIiwKKwkJCWRkbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUkVTRVRfQURBUFRFUiBjbGVhcmVkLCBjb3VudD0lZFxuIiwKIAkJCQlpb2MtPm5hbWUsIGNvdW50KSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMzE5Miw3ICszMTg5LDcgQEAKIAl9CiAKIAlpZiAoIGNvdW50ID09IDMwICkgewotCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdCBmYWlsZWQhICIKKwkJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJkb3dubG9hZGJvb3QgZmFpbGVkISAiCiAJCSJVbmFibGUgdG8gZ2V0IE1QSV9ESUFHX0RSV0UgbW9kZSwgZGlhZzB2YWw9JXhcbiIsCiAJCWlvYy0+bmFtZSwgZGlhZzB2YWwpKTsKIAkJcmV0dXJuIC0zOwpAQCAtMzIxOCwxMCArMzIxNSwxMCBAQAogCQlwY2lfZW5hYmxlX2lvX2FjY2Vzcyhpb2MtPnBjaWRldik7CiAKIAlDSElQUkVHX1BJT19XUklURTMyKCZpb2MtPnBpb19jaGlwLT5EaWFnUndBZGRyZXNzLCBwRndIZWFkZXItPkxvYWRTdGFydEFkZHJlc3MpOwotCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiTG9hZFN0YXJ0IGFkZHIgd3JpdHRlbiAweCV4IFxuIiwKKwlkZGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkxvYWRTdGFydCBhZGRyIHdyaXR0ZW4gMHgleCBcbiIsCiAJCWlvYy0+bmFtZSwgcEZ3SGVhZGVyLT5Mb2FkU3RhcnRBZGRyZXNzKSk7CiAKLQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyaXRlIEZXIEltYWdlOiAweCV4IGJ5dGVzIEAgJXBcbiIsCisJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJXcml0ZSBGVyBJbWFnZTogMHgleCBieXRlcyBAICVwXG4iLAogCQkJCWlvYy0+bmFtZSwgZndTaXplKjQsIHB0ckZ3KSk7CiAJd2hpbGUgKGZ3U2l6ZS0tKSB7CiAJCUNISVBSRUdfUElPX1dSSVRFMzIoJmlvYy0+cGlvX2NoaXAtPkRpYWdSd0RhdGEsICpwdHJGdysrKTsKQEAgLTMyMzYsNyArMzIzMyw3IEBACiAJCWZ3U2l6ZSA9IChwRXh0SW1hZ2UtPkltYWdlU2l6ZSArIDMpID4+IDI7CiAJCXB0ckZ3ID0gKHUzMiAqKXBFeHRJbWFnZTsKIAotCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyaXRlIEV4dCBJbWFnZTogMHgleCAoJWQpIGJ5dGVzIEAgJXAgbG9hZF9hZGRyPSV4XG4iLAorCQlkZGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIldyaXRlIEV4dCBJbWFnZTogMHgleCAoJWQpIGJ5dGVzIEAgJXAgbG9hZF9hZGRyPSV4XG4iLAogCQkJCQkJaW9jLT5uYW1lLCBmd1NpemUqNCwgZndTaXplKjQsIHB0ckZ3LCBsb2FkX2FkZHIpKTsKIAkJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3QWRkcmVzcywgbG9hZF9hZGRyKTsKIApAQCAtMzI0NywxMSArMzI0NCwxMSBAQAogCX0KIAogCS8qIFdyaXRlIHRoZSBJb3BSZXNldFZlY3RvclJlZ0FkZHIgKi8KLQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyaXRlIElvcFJlc2V0VmVjdG9yIEFkZHI9JXghIFxuIiwgaW9jLT5uYW1lLCAJcEZ3SGVhZGVyLT5Jb3BSZXNldFJlZ0FkZHIpKTsKKwlkZGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIldyaXRlIElvcFJlc2V0VmVjdG9yIEFkZHI9JXghIFxuIiwgaW9jLT5uYW1lLCAJcEZ3SGVhZGVyLT5Jb3BSZXNldFJlZ0FkZHIpKTsKIAlDSElQUkVHX1BJT19XUklURTMyKCZpb2MtPnBpb19jaGlwLT5EaWFnUndBZGRyZXNzLCBwRndIZWFkZXItPklvcFJlc2V0UmVnQWRkcik7CiAKIAkvKiBXcml0ZSB0aGUgSW9wUmVzZXRWZWN0b3JWYWx1ZSAqLwotCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV3JpdGUgSW9wUmVzZXRWZWN0b3IgVmFsdWU9JXghIFxuIiwgaW9jLT5uYW1lLCBwRndIZWFkZXItPklvcFJlc2V0VmVjdG9yVmFsdWUpKTsKKwlkZGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIldyaXRlIElvcFJlc2V0VmVjdG9yIFZhbHVlPSV4ISBcbiIsIGlvYy0+bmFtZSwgcEZ3SGVhZGVyLT5Jb3BSZXNldFZlY3RvclZhbHVlKSk7CiAJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3RGF0YSwgcEZ3SGVhZGVyLT5Jb3BSZXNldFZlY3RvclZhbHVlKTsKIAogCS8qIENsZWFyIHRoZSBpbnRlcm5hbCBmbGFzaCBiYWQgYml0IC0gYXV0b2luY3JlbWVudGluZyByZWdpc3RlciwKQEAgLTMyODUsMTEgKzMyODIsMTEgQEAKIAkJcGNpX2Rpc2FibGVfaW9fYWNjZXNzKGlvYy0+cGNpZGV2KTsKIAogCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7Ci0JZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJkb3dubG9hZGJvb3QgZGlhZzB2YWw9JXgsICIKKwlkZGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgImRvd25sb2FkYm9vdCBkaWFnMHZhbD0leCwgIgogCQkidHVybmluZyBvZmYgUFJFVkVOVF9JT0NfQk9PVCwgRElTQUJMRV9BUk0sIFJXX0VOQUJMRVxuIiwKIAkJaW9jLT5uYW1lLCBkaWFnMHZhbCkpOwogCWRpYWcwdmFsICY9IH4oTVBJX0RJQUdfUFJFVkVOVF9JT0NfQk9PVCB8IE1QSV9ESUFHX0RJU0FCTEVfQVJNIHwgTVBJX0RJQUdfUldfRU5BQkxFKTsKLQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdCBub3cgZGlhZzB2YWw9JXhcbiIsCisJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJkb3dubG9hZGJvb3Qgbm93IGRpYWcwdmFsPSV4XG4iLAogCQlpb2MtPm5hbWUsIGRpYWcwdmFsKSk7CiAJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMsIGRpYWcwdmFsKTsKIApAQCAtMzMwMCw3ICszMjk3LDcgQEAKIAkJaW9jX3N0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMCk7CiAJCWlmICggKEdldElvY0ZhY3RzKGlvYywgc2xlZXBGbGFnLAogCQkJCU1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApKSAhPSAwICkgewotCQkJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJHZXRJb2NGYWN0cyBmYWlsZWQ6IElvY1N0YXRlPSV4XG4iLAorCQkJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJHZXRJb2NGYWN0cyBmYWlsZWQ6IElvY1N0YXRlPSV4XG4iLAogCQkJCQlpb2MtPm5hbWUsIGlvY19zdGF0ZSkpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KQEAgLTMzMDgsMTcgKzMzMDUsMjAgQEAKIAogCWZvciAoY291bnQ9MDsgY291bnQ8SFoqMjA7IGNvdW50KyspIHsKIAkJaWYgKChpb2Nfc3RhdGUgPSBtcHRfR2V0SW9jU3RhdGUoaW9jLCAwKSkgJiBNUElfSU9DX1NUQVRFX1JFQURZKSB7Ci0JCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdCBzdWNjZXNzZnVsISAoY291bnQ9JWQpIElvY1N0YXRlPSV4XG4iLAotCQkJCQlpb2MtPm5hbWUsIGNvdW50LCBpb2Nfc3RhdGUpKTsKKwkJCWRkbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAorCQkJCSJkb3dubG9hZGJvb3Qgc3VjY2Vzc2Z1bCEgKGNvdW50PSVkKSBJb2NTdGF0ZT0leFxuIiwKKwkJCQlpb2MtPm5hbWUsIGNvdW50LCBpb2Nfc3RhdGUpKTsKIAkJCWlmIChpb2MtPmJ1c190eXBlID09IFNBUykgewogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKChTZW5kSW9jSW5pdChpb2MsIHNsZWVwRmxhZykpICE9IDApIHsKLQkJCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdDogU2VuZElvY0luaXQgZmFpbGVkXG4iLAorCQkJCWRkbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAorCQkJCQkiZG93bmxvYWRib290OiBTZW5kSW9jSW5pdCBmYWlsZWRcbiIsCiAJCQkJCWlvYy0+bmFtZSkpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQotCQkJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJkb3dubG9hZGJvb3Q6IFNlbmRJb2NJbml0IHN1Y2Nlc3NmdWxcbiIsCisJCQlkZGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJImRvd25sb2FkYm9vdDogU2VuZElvY0luaXQgc3VjY2Vzc2Z1bFxuIiwKIAkJCQkJaW9jLT5uYW1lKSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMzMyOCw4ICszMzI4LDggQEAKIAkJCW1kZWxheSAoMTApOwogCQl9CiAJfQotCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZG93bmxvYWRib290IGZhaWxlZCEgSW9jU3RhdGU9JXhcbiIsCi0JCWlvYy0+bmFtZSwgaW9jX3N0YXRlKSk7CisJZGRscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCSJkb3dubG9hZGJvb3QgZmFpbGVkISBJb2NTdGF0ZT0leFxuIixpb2MtPm5hbWUsIGlvY19zdGF0ZSkpOwogCXJldHVybiAtRUZBVUxUOwogfQogCkBAIC0zMzY2LDcgKzMzNjYsNyBAQAogCXUzMiBpb2Nfc3RhdGU9MDsKIAlpbnQgY250LGNudGRuOwogCi0JZGluaXRwcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiBLaWNrU3RhcnRpbmcgJXMhXG4iLCBpb2MtPm5hbWUpKTsKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogS2lja1N0YXJ0aW5nICVzIVxuIiwgaW9jLT5uYW1lKSk7CiAJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU1BJKSB7CiAJCS8qIEFsd2F5cyBpc3N1ZSBhIE1zZyBVbml0IFJlc2V0IGZpcnN0LiBUaGlzIHdpbGwgY2xlYXIgc29tZQogCQkgKiBTQ1NJIGJ1cyBoYW5nIGNvbmRpdGlvbnMuCkBAIC0zMzg0LDE0ICszMzg0LDE0IEBACiAJaWYgKGhhcmRfcmVzZXRfZG9uZSA8IDApCiAJCXJldHVybiBoYXJkX3Jlc2V0X2RvbmU7CiAKLQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGlhZ25vc3RpYyByZXNldCBzdWNjZXNzZnVsIVxuIiwKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiRGlhZ25vc3RpYyByZXNldCBzdWNjZXNzZnVsIVxuIiwKIAkJCWlvYy0+bmFtZSkpOwogCiAJY250ZG4gPSAoKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApID8gSFogOiAxMDAwKSAqIDI7CS8qIDIgc2Vjb25kcyAqLwogCWZvciAoY250PTA7IGNudDxjbnRkbjsgY250KyspIHsKIAkJaW9jX3N0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMSk7CiAJCWlmICgoaW9jX3N0YXRlID09IE1QSV9JT0NfU1RBVEVfUkVBRFkpIHx8IChpb2Nfc3RhdGUgPT0gTVBJX0lPQ19TVEFURV9PUEVSQVRJT05BTCkpIHsKLQkJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJLaWNrU3RhcnQgc3VjY2Vzc2Z1bCEgKGNudD0lZClcbiIsCisJCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiS2lja1N0YXJ0IHN1Y2Nlc3NmdWwhIChjbnQ9JWQpXG4iLAogIAkJCQkJaW9jLT5uYW1lLCBjbnQpKTsKIAkJCXJldHVybiBoYXJkX3Jlc2V0X2RvbmU7CiAJCX0KQEAgLTM0MzQsMTUgKzM0MzQsMTMgQEAKIAl1MzIgZG9vcmJlbGw7CiAJaW50IGhhcmRfcmVzZXRfZG9uZSA9IDA7CiAJaW50IGNvdW50ID0gMDsKLSNpZmRlZiBNUFRfREVCVUcKIAl1MzIgZGlhZzF2YWwgPSAwOwotI2VuZGlmCiAKIAkvKiBDbGVhciBhbnkgZXhpc3RpbmcgaW50ZXJydXB0cyAqLwogCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMsIDApOwogCiAJaWYgKGlvYy0+cGNpZGV2LT5kZXZpY2UgPT0gTVBJX01BTlVGQUNUUEFHRV9ERVZJRF9TQVMxMDc4KSB7Ci0JCWRyc3ByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiJXM6IERvb3JiZWxsPSVwOyAxMDc4IHJlc2V0ICIKKwkJZHJzcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIiVzOiBEb29yYmVsbD0lcDsgMTA3OCByZXNldCAiCiAJCQkiYWRkcmVzcz0lcFxuIiwgIGlvYy0+bmFtZSwgX19GVU5DVElPTl9fLAogCQkJJmlvYy0+Y2hpcC0+RG9vcmJlbGwsICZpb2MtPmNoaXAtPlJlc2V0XzEwNzgpKTsKIAkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPlJlc2V0XzEwNzgsIDB4MDcpOwpAQCAtMzQ1NSw3ICszNDUzLDcgQEAKIAkJCWRvb3JiZWxsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwpOwogCQkJZG9vcmJlbGwgJj0gTVBJX0lPQ19TVEFURV9NQVNLOwogCi0JCQlkcnNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCWRyc3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCQkJCSJsb29raW5nIGZvciBSRUFEWSBTVEFURTogZG9vcmJlbGw9JXgiCiAJCQkgICAgICAgICIgY291bnQ9JWRcbiIsCiAJCQkJaW9jLT5uYW1lLCBkb29yYmVsbCwgY291bnQpKTsKQEAgLTM0NzUsMTIgKzM0NzMsMTIgQEAKIAkvKiBVc2UgIkRpYWdub3N0aWMgcmVzZXQiIG1ldGhvZCEgKG9ubHkgdGhpbmcgYXZhaWxhYmxlISkgKi8KIAlkaWFnMHZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMpOwogCi0jaWZkZWYgTVBUX0RFQlVHCi0JaWYgKGlvYy0+YWx0X2lvYykKLQkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKLQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJEYkcxOiBkaWFnMD0lMDh4LCBkaWFnMT0lMDh4XG4iLAorCWlmIChpb2MtPmRlYnVnX2xldmVsICYgTVBUX0RFQlVHKSB7CisJCWlmIChpb2MtPmFsdF9pb2MpCisJCQlkaWFnMXZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkRpYWdub3N0aWMpOworCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJEYkcxOiBkaWFnMD0lMDh4LCBkaWFnMT0lMDh4XG4iLAogCQkJaW9jLT5uYW1lLCBkaWFnMHZhbCwgZGlhZzF2YWwpKTsKLSNlbmRpZgorCX0KIAogCS8qIERvIHRoZSByZXNldCBpZiB3ZSBhcmUgdG9sZCB0byBpZ25vcmUgdGhlIHJlc2V0IGhpc3RvcnkKIAkgKiBvciBpZiB0aGUgcmVzZXQgaGlzdG9yeSBpcyAwCkBAIC0zNTE0LDE2ICszNTEyLDE2IEBACiAKIAkJCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CiAKLQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyb3RlIG1hZ2ljIERpYWdXcml0ZUVuIHNlcXVlbmNlICgleClcbiIsCisJCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJXcm90ZSBtYWdpYyBEaWFnV3JpdGVFbiBzZXF1ZW5jZSAoJXgpXG4iLAogCQkJCQlpb2MtPm5hbWUsIGRpYWcwdmFsKSk7CiAJCX0KIAotI2lmZGVmIE1QVF9ERUJVRwotCQlpZiAoaW9jLT5hbHRfaW9jKQotCQkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKLQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGJHMjogZGlhZzA9JTA4eCwgZGlhZzE9JTA4eFxuIiwKKwkJaWYgKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUcpIHsKKwkJCWlmIChpb2MtPmFsdF9pb2MpCisJCQkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKKwkJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkRiRzI6IGRpYWcwPSUwOHgsIGRpYWcxPSUwOHhcbiIsCiAJCQkJaW9jLT5uYW1lLCBkaWFnMHZhbCwgZGlhZzF2YWwpKTsKLSNlbmRpZgorCQl9CiAJCS8qCiAJCSAqIERpc2FibGUgdGhlIEFSTSAoQnVnIGZpeCkKIAkJICoKQEAgLTM1MzcsNyArMzUzNSw3IEBACiAJCSAqLwogCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYywgZGlhZzB2YWwgfCBNUElfRElBR19SRVNFVF9BREFQVEVSKTsKIAkJaGFyZF9yZXNldF9kb25lID0gMTsKLQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGlhZ25vc3RpYyByZXNldCBwZXJmb3JtZWRcbiIsCisJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkRpYWdub3N0aWMgcmVzZXQgcGVyZm9ybWVkXG4iLAogCQkJCWlvYy0+bmFtZSkpOwogCiAJCS8qCkBAIC0zNTUyLDEyICszNTUwLDE0IEBACiAKIAkJCWZvciAoaWk9TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTLTE7IGlpOyBpaS0tKSB7CiAJCQkJaWYgKE1wdFJlc2V0SGFuZGxlcnNbaWldKSB7Ci0JCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgSU9DIHByZV9yZXNldCBoYW5kbGVyICMlZFxuIiwKLQkJCQkJCQlpb2MtPm5hbWUsIGlpKSk7CisJCQkJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJCSJDYWxsaW5nIElPQyBwcmVfcmVzZXQgaGFuZGxlciAjJWRcbiIsCisJCQkJCQlpb2MtPm5hbWUsIGlpKSk7CiAJCQkJCXIgKz0gbXB0X3NpZ25hbF9yZXNldChpaSwgaW9jLCBNUFRfSU9DX1BSRV9SRVNFVCk7CiAJCQkJCWlmIChpb2MtPmFsdF9pb2MpIHsKLQkJCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgYWx0LSVzIHByZV9yZXNldCBoYW5kbGVyICMlZFxuIiwKLQkJCQkJCQkJaW9jLT5uYW1lLCBpb2MtPmFsdF9pb2MtPm5hbWUsIGlpKSk7CisJCQkJCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCQkJIkNhbGxpbmcgYWx0LSVzIHByZV9yZXNldCBoYW5kbGVyICMlZFxuIiwKKwkJCQkJCQlpb2MtPm5hbWUsIGlvYy0+YWx0X2lvYy0+bmFtZSwgaWkpKTsKIAkJCQkJCXIgKz0gbXB0X3NpZ25hbF9yZXNldChpaSwgaW9jLT5hbHRfaW9jLCBNUFRfSU9DX1BSRV9SRVNFVCk7CiAJCQkJCX0KIAkJCQl9CkBAIC0zNTgwLDcgKzM1ODAsNyBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJjYWNoZWRfZnc6IGRpYWcwdmFsPSV4IGNvdW50PSVkXG4iLAorCQkJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgImNhY2hlZF9mdzogZGlhZzB2YWw9JXggY291bnQ9JWRcbiIsCiAJCQkJCWlvY3AtPm5hbWUsIGRpYWcwdmFsLCBjb3VudCkpOwogCQkJCS8qIHdhaXQgMSBzZWMgKi8KIAkJCQlpZiAoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgewpAQCAtMzYyMSwxMiArMzYyMSwxMiBAQAogCX0KIAogCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7Ci0jaWZkZWYgTVBUX0RFQlVHCi0JaWYgKGlvYy0+YWx0X2lvYykKLQkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKLQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJEYkczOiBkaWFnMD0lMDh4LCBkaWFnMT0lMDh4XG4iLAotCQlpb2MtPm5hbWUsIGRpYWcwdmFsLCBkaWFnMXZhbCkpOwotI2VuZGlmCisJaWYgKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUcpIHsKKwkJaWYgKGlvYy0+YWx0X2lvYykKKwkJCWRpYWcxdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CisJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkRiRzM6IGRpYWcwPSUwOHgsIGRpYWcxPSUwOHhcbiIsCisJCQlpb2MtPm5hbWUsIGRpYWcwdmFsLCBkaWFnMXZhbCkpOworCX0KIAogCS8qIENsZWFyIFJFU0VUX0hJU1RPUlkgYml0ISAgUGxhY2UgYm9hcmQgaW4gdGhlCiAJICogZGlhZ25vc3RpYyBtb2RlIHRvIHVwZGF0ZSB0aGUgZGlhZyByZWdpc3Rlci4KQEAgLTM2ODAsMTIgKzM2ODAsMTIgQEAKIAkJcmV0dXJuIC0zOwogCX0KIAotI2lmZGVmIE1QVF9ERUJVRwotCWlmIChpb2MtPmFsdF9pb2MpCi0JCWRpYWcxdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7Ci0JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGJHNDogZGlhZzA9JTA4eCwgZGlhZzE9JTA4eFxuIiwKKwlpZiAoaW9jLT5kZWJ1Z19sZXZlbCAmIE1QVF9ERUJVRykgeworCQlpZiAoaW9jLT5hbHRfaW9jKQorCQkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKKwkJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiRGJHNDogZGlhZzA9JTA4eCwgZGlhZzE9JTA4eFxuIiwKIAkJCWlvYy0+bmFtZSwgZGlhZzB2YWwsIGRpYWcxdmFsKSk7Ci0jZW5kaWYKKwl9CiAKIAkvKgogCSAqIFJlc2V0IGZsYWcgdGhhdCBzYXlzIHdlJ3ZlIGVuYWJsZWQgZXZlbnQgbm90aWZpY2F0aW9uCkBAIC0zNzE3LDcgKzM3MTcsNyBAQAogCXUzMiBzdGF0ZTsKIAlpbnQgY250ZG4sIGNvdW50OwogCi0JZHJzcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IFNlbmRpbmcgSU9DIHJlc2V0KDB4JTAyeCkhXG4iLAorCWRyc3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiU2VuZGluZyBJT0MgcmVzZXQoMHglMDJ4KSFcbiIsCiAJCQlpb2MtPm5hbWUsIHJlc2V0X3R5cGUpKTsKIAlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwsIHJlc2V0X3R5cGU8PE1QSV9ET09SQkVMTF9GVU5DVElPTl9TSElGVCk7CiAJaWYgKChyID0gV2FpdEZvckRvb3JiZWxsQWNrKGlvYywgNSwgc2xlZXBGbGFnKSkgPCAwKQpAQCAtMzc4MiwxNCArMzc4MiwxNCBAQAogCQkJcmV0dXJuIC0xOwogCiAJCWlvYy0+UmVxVG9DaGFpbiA9IChpbnQgKikgbWVtOwotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIFJlcVRvQ2hhaW4gYWxsb2MgIEAgJXAsIHN6PSVkIGJ5dGVzXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUmVxVG9DaGFpbiBhbGxvYyAgQCAlcCwgc3o9JWQgYnl0ZXNcbiIsCiAJCQkgCWlvYy0+bmFtZSwgbWVtLCBzeikpOwogCQltZW0gPSBrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKIAkJaWYgKG1lbSA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCiAJCWlvYy0+UmVxdWVzdE5CID0gKGludCAqKSBtZW07Ci0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgUmVxdWVzdE5CIGFsbG9jICBAICVwLCBzej0lZCBieXRlc1xuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJlcXVlc3ROQiBhbGxvYyAgQCAlcCwgc3o9JWQgYnl0ZXNcbiIsCiAJCQkgCWlvYy0+bmFtZSwgbWVtLCBzeikpOwogCX0KIAlmb3IgKGlpID0gMDsgaWkgPCBpb2MtPnJlcV9kZXB0aDsgaWkrKykgewpAQCAtMzgxOSw3ICszODE5LDcgQEAKIAkJbnVtU0dFID0gMSArIChzY2FsZSAtIDEpICogKGlvYy0+ZmFjdHMuTWF4Q2hhaW5EZXB0aC0xKSArIHNjYWxlICsKIAkJCShpb2MtPnJlcV9zeiAtIDY0KSAvIChzaXplb2YoZG1hX2FkZHJfdCkgKyBzaXplb2YodTMyKSk7CiAJfQotCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgbnVtX3NnZT0lZCBudW1TR0U9JWRcbiIsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIm51bV9zZ2U9JWQgbnVtU0dFPSVkXG4iLAogCQlpb2MtPm5hbWUsIG51bV9zZ2UsIG51bVNHRSkpOwogCiAJaWYgKCBudW1TR0UgPiBNUFRfU0NTSV9TR19ERVBUSAkpCkBAIC0zODMyLDcgKzM4MzIsNyBAQAogCX0KIAludW1fY2hhaW4rKzsKIAotCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgTm93IG51bVNHRT0lZCBudW1fc2dlPSVkIG51bV9jaGFpbj0lZFxuIiwKKwlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiTm93IG51bVNHRT0lZCBudW1fc2dlPSVkIG51bV9jaGFpbj0lZFxuIiwKIAkJaW9jLT5uYW1lLCBudW1TR0UsIG51bV9zZ2UsIG51bV9jaGFpbikpOwogCiAJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU1BJKQpAQCAtMzg0OSw3ICszODQ5LDcgQEAKIAkJCXJldHVybiAtMTsKIAogCQlpb2MtPkNoYWluVG9DaGFpbiA9IChpbnQgKikgbWVtOwotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIENoYWluVG9DaGFpbiBhbGxvYyBAICVwLCBzej0lZCBieXRlc1xuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkNoYWluVG9DaGFpbiBhbGxvYyBAICVwLCBzej0lZCBieXRlc1xuIiwKIAkJCSAJaW9jLT5uYW1lLCBtZW0sIHN6KSk7CiAJfSBlbHNlIHsKIAkJbWVtID0gKHU4ICopIGlvYy0+Q2hhaW5Ub0NoYWluOwpAQCAtMzg4NSwyMiArMzg4NSwyMiBAQAogCQkJcmV0dXJuIC0xOwogCiAJCXRvdGFsX3NpemUgPSByZXBseV9zeiA9IChpb2MtPnJlcGx5X3N6ICogaW9jLT5yZXBseV9kZXB0aCk7Ci0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVwbHlCdWZmZXIgc3o9JWQgYnl0ZXMsIFJlcGx5RGVwdGg9JWRcbiIsCisJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJSZXBseUJ1ZmZlciBzej0lZCBieXRlcywgUmVwbHlEZXB0aD0lZFxuIiwKIAkJCSAJaW9jLT5uYW1lLCBpb2MtPnJlcGx5X3N6LCBpb2MtPnJlcGx5X2RlcHRoKSk7Ci0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVwbHlCdWZmZXIgc3o9JWRbJXhdIGJ5dGVzXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUmVwbHlCdWZmZXIgc3o9JWRbJXhdIGJ5dGVzXG4iLAogCQkJIAlpb2MtPm5hbWUsIHJlcGx5X3N6LCByZXBseV9zeikpOwogCiAJCXN6ID0gKGlvYy0+cmVxX3N6ICogaW9jLT5yZXFfZGVwdGgpOwotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLlJlcXVlc3RCdWZmZXIgc3o9JWQgYnl0ZXMsIFJlcXVlc3REZXB0aD0lZFxuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJlcXVlc3RCdWZmZXIgc3o9JWQgYnl0ZXMsIFJlcXVlc3REZXB0aD0lZFxuIiwKIAkJCSAJaW9jLT5uYW1lLCBpb2MtPnJlcV9zeiwgaW9jLT5yZXFfZGVwdGgpKTsKLQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5SZXF1ZXN0QnVmZmVyIHN6PSVkWyV4XSBieXRlc1xuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJlcXVlc3RCdWZmZXIgc3o9JWRbJXhdIGJ5dGVzXG4iLAogCQkJIAlpb2MtPm5hbWUsIHN6LCBzeikpOwogCQl0b3RhbF9zaXplICs9IHN6OwogCiAJCXN6ID0gbnVtX2NoYWluICogaW9jLT5yZXFfc3o7IC8qIGNoYWluIGJ1ZmZlciBwb29sIHNpemUgKi8KLQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5DaGFpbkJ1ZmZlciBzej0lZCBieXRlcywgQ2hhaW5EZXB0aD0lZFxuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkNoYWluQnVmZmVyIHN6PSVkIGJ5dGVzLCBDaGFpbkRlcHRoPSVkXG4iLAogCQkJIAlpb2MtPm5hbWUsIGlvYy0+cmVxX3N6LCBudW1fY2hhaW4pKTsKLQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5DaGFpbkJ1ZmZlciBzej0lZFsleF0gYnl0ZXMgbnVtX2NoYWluPSVkXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiQ2hhaW5CdWZmZXIgc3o9JWRbJXhdIGJ5dGVzIG51bV9jaGFpbj0lZFxuIiwKIAkJCSAJaW9jLT5uYW1lLCBzeiwgc3osIG51bV9jaGFpbikpOwogCiAJCXRvdGFsX3NpemUgKz0gc3o7CkBAIC0zOTExLDcgKzM5MTEsNyBAQAogCQkJZ290byBvdXRfZmFpbDsKIAkJfQogCi0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuVG90YWwgYWxsb2MgQCAlcFslcF0sIHN6PSVkWyV4XSBieXRlc1xuIiwKKwkJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlRvdGFsIGFsbG9jIEAgJXBbJXBdLCBzej0lZFsleF0gYnl0ZXNcbiIsCiAJCQkgCWlvYy0+bmFtZSwgbWVtLCAodm9pZCAqKSh1bG9uZylhbGxvY19kbWEsIHRvdGFsX3NpemUsIHRvdGFsX3NpemUpKTsKIAogCQltZW1zZXQobWVtLCAwLCB0b3RhbF9zaXplKTsKQEAgLTM5MjIsNyArMzkyMiw3IEBACiAJCWlvYy0+cmVwbHlfZnJhbWVzID0gKE1QVF9GUkFNRV9IRFIgKikgbWVtOwogCQlpb2MtPnJlcGx5X2ZyYW1lc19sb3dfZG1hID0gKHUzMikgKGFsbG9jX2RtYSAmIDB4RkZGRkZGRkYpOwogCi0JCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgUmVwbHlCdWZmZXJzIEAgJXBbJXBdXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUmVwbHlCdWZmZXJzIEAgJXBbJXBdXG4iLAogCSAJCWlvYy0+bmFtZSwgaW9jLT5yZXBseV9mcmFtZXMsICh2b2lkICopKHVsb25nKWFsbG9jX2RtYSkpOwogCiAJCWFsbG9jX2RtYSArPSByZXBseV9zejsKQEAgLTM5MzMsNyArMzkzMyw3IEBACiAJCWlvYy0+cmVxX2ZyYW1lcyA9IChNUFRfRlJBTUVfSERSICopIG1lbTsKIAkJaW9jLT5yZXFfZnJhbWVzX2RtYSA9IGFsbG9jX2RtYTsKIAotCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIFJlcXVlc3RCdWZmZXJzIEAgJXBbJXBdXG4iLAorCQlkaW5pdHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUmVxdWVzdEJ1ZmZlcnMgQCAlcFslcF1cbiIsCiAJCQkgCWlvYy0+bmFtZSwgbWVtLCAodm9pZCAqKSh1bG9uZylhbGxvY19kbWEpKTsKIAogCQlpb2MtPnJlcV9mcmFtZXNfbG93X2RtYSA9ICh1MzIpIChhbGxvY19kbWEgJiAweEZGRkZGRkZGKTsKQEAgLTM5NDcsNyArMzk0Nyw3IEBACiAJCWlvYy0+bXRycl9yZWcgPSBtdHJyX2FkZChpb2MtPnJlcV9mcmFtZXNfZG1hLAogCQkJCQkgc3osCiAJCQkJCSBNVFJSX1RZUEVfV1JDT01CLCAxKTsKLQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiTVRSUiByZWdpb24gcmVnaXN0ZXJlZCAoYmFzZTpzaXplPSUwOHg6JXgpXG4iLAorCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJNVFJSIHJlZ2lvbiByZWdpc3RlcmVkIChiYXNlOnNpemU9JTA4eDoleClcbiIsCiAJCQkJaW9jLT5uYW1lLCBpb2MtPnJlcV9mcmFtZXNfZG1hLCBzeikpOwogI2VuZGlmCiAKQEAgLTM5NTksNyArMzk1OSw3IEBACiAJCWlvYy0+Q2hhaW5CdWZmZXIgPSBtZW07CiAJCWlvYy0+Q2hhaW5CdWZmZXJETUEgPSBhbGxvY19kbWE7CiAKLQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiIDolcyBDaGFpbkJ1ZmZlcnMgQCAlcCglcClcbiIsCisJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJDaGFpbkJ1ZmZlcnMgQCAlcCglcClcbiIsCiAJCQlpb2MtPm5hbWUsIGlvYy0+Q2hhaW5CdWZmZXIsICh2b2lkICopKHVsb25nKWlvYy0+Q2hhaW5CdWZmZXJETUEpKTsKIAogCQkvKiBJbml0aWFsaXplIHRoZSBmcmVlIGNoYWluIFEuCkBAIC00MDA0LDcgKzQwMDQsNyBAQAogCiAJCWlvYy0+c2Vuc2VfYnVmX2xvd19kbWEgPSAodTMyKSAoaW9jLT5zZW5zZV9idWZfcG9vbF9kbWEgJiAweEZGRkZGRkZGKTsKIAkJaW9jLT5hbGxvY190b3RhbCArPSBzejsKLQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5TZW5zZUJ1ZmZlcnMgQCAlcFslcF1cbiIsCisJCWRpbml0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTZW5zZUJ1ZmZlcnMgQCAlcFslcF1cbiIsCiAgCQkJaW9jLT5uYW1lLCBpb2MtPnNlbnNlX2J1Zl9wb29sLCAodm9pZCAqKSh1bG9uZylpb2MtPnNlbnNlX2J1Zl9wb29sX2RtYSkpOwogCiAJfQpAQCAtNDAxMiw3ICs0MDEyLDcgQEAKIAkvKiBQb3N0IFJlcGx5IGZyYW1lcyB0byBGSUZPCiAJICovCiAJYWxsb2NfZG1hID0gaW9jLT5hbGxvY19kbWE7Ci0JZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5SZXBseUJ1ZmZlcnMgQCAlcFslcF1cbiIsCisJZGluaXRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJlcGx5QnVmZmVycyBAICVwWyVwXVxuIiwKIAkgCWlvYy0+bmFtZSwgaW9jLT5yZXBseV9mcmFtZXMsICh2b2lkICopKHVsb25nKWFsbG9jX2RtYSkpOwogCiAJZm9yIChpID0gMDsgaSA8IGlvYy0+cmVwbHlfZGVwdGg7IGkrKykgewpAQCAtNDA5Myw3ICs0MDkzLDcgQEAKIAlpZiAoKHQgPSBXYWl0Rm9yRG9vcmJlbGxJbnQoaW9jLCA1LCBzbGVlcEZsYWcpKSA8IDApCiAJCWZhaWxjbnQrKzsKIAotCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGFuZFNoYWtlIHJlcXVlc3Qgc3RhcnQgcmVxQnl0ZXM9JWQsIFdhaXRDbnQ9JWQlc1xuIiwKKwlkaHNwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkhhbmRTaGFrZSByZXF1ZXN0IHN0YXJ0IHJlcUJ5dGVzPSVkLCBXYWl0Q250PSVkJXNcbiIsCiAJCQlpb2MtPm5hbWUsIHJlcUJ5dGVzLCB0LCBmYWlsY250ID8gIiAtIE1JU1NJTkcgRE9PUkJFTEwgSEFORFNIQUtFISIgOiAiIikpOwogCiAJLyogUmVhZCBkb29yYmVsbCBhbmQgY2hlY2sgZm9yIGFjdGl2ZSBiaXQgKi8KQEAgLTQxMjgsMTAgKzQxMjgsMTAgQEAKIAkJCQlmYWlsY250Kys7CiAJCX0KIAotCQlkaHNwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBIYW5kc2hha2UgcmVxdWVzdCBmcmFtZSAoQCVwKSBoZWFkZXJcbiIsIHJlcSkpOwotCQlEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FX0hEUihyZXEpCisJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSGFuZHNoYWtlIHJlcXVlc3QgZnJhbWUgKEAlcCkgaGVhZGVyXG4iLCBpb2MtPm5hbWUsIHJlcSkpOworCQlEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FX0hEUihpb2MsICh1MzIgKilyZXEpCiAKLQkJZGhzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIYW5kU2hha2UgcmVxdWVzdCBwb3N0IGRvbmUsIFdhaXRDbnQ9JWQlc1xuIiwKKwkJZGhzcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJIYW5kU2hha2UgcmVxdWVzdCBwb3N0IGRvbmUsIFdhaXRDbnQ9JWQlc1xuIiwKIAkJCQlpb2MtPm5hbWUsIHQsIGZhaWxjbnQgPyAiIC0gTUlTU0lORyBET09SQkVMTCBBQ0shIiA6ICIiKSk7CiAKIAkJLyoKQEAgLTQxNDAsNyArNDE0MCw3IEBACiAJCWlmICghZmFpbGNudCAmJiAodCA9IFdhaXRGb3JEb29yYmVsbFJlcGx5KGlvYywgbWF4d2FpdCwgc2xlZXBGbGFnKSkgPCAwKQogCQkJZmFpbGNudCsrOwogCi0JCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGFuZFNoYWtlIHJlcGx5IGNvdW50PSVkJXNcbiIsCisJCWRoc3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSGFuZFNoYWtlIHJlcGx5IGNvdW50PSVkJXNcbiIsCiAJCQkJaW9jLT5uYW1lLCB0LCBmYWlsY250ID8gIiAtIE1JU1NJTkcgRE9PUkJFTEwgUkVQTFkhIiA6ICIiKSk7CiAKIAkJLyoKQEAgLTQxOTYsNyArNDE5Niw3IEBACiAJfQogCiAJaWYgKGNudGRuKSB7Ci0JCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldhaXRGb3JEb29yYmVsbCBBQ0sgKGNvdW50PSVkKVxuIiwKKwkJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiV2FpdEZvckRvb3JiZWxsIEFDSyAoY291bnQ9JWQpXG4iLAogCQkJCWlvYy0+bmFtZSwgY291bnQpKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KQEAgLTQyNDUsNyArNDI0NSw3IEBACiAJfQogCiAJaWYgKGNudGRuKSB7Ci0JCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldhaXRGb3JEb29yYmVsbCBJTlQgKGNudD0lZCkgaG93bG9uZz0lZFxuIiwKKwkJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiV2FpdEZvckRvb3JiZWxsIElOVCAoY250PSVkKSBob3dsb25nPSVkXG4iLAogCQkJCWlvYy0+bmFtZSwgY291bnQsIGhvd2xvbmcpKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KQEAgLTQyOTcsNyArNDI5Nyw3IEBACiAJCX0KIAl9CiAKLQlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldhaXRDbnQ9JWQgRmlyc3QgaGFuZHNoYWtlIHJlcGx5IHdvcmQ9JTA4eCVzXG4iLAorCWRoc3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiV2FpdENudD0lZCBGaXJzdCBoYW5kc2hha2UgcmVwbHkgd29yZD0lMDh4JXNcbiIsCiAJCQlpb2MtPm5hbWUsIHQsIGxlMzJfdG9fY3B1KCoodTMyICopaHNfcmVwbHkpLAogCQkJZmFpbGNudCA/ICIgLSBNSVNTSU5HIERPT1JCRUxMIEhBTkRTSEFLRSEiIDogIiIpKTsKIApAQCAtNDMzMywxMCArNDMzMywxMCBAQAogCX0KICNlbmRpZgogCi0JZGhzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJHb3QgSGFuZHNoYWtlIHJlcGx5OlxuIiwgaW9jLT5uYW1lKSk7Ci0JREJHX0RVTVBfUkVQTFlfRlJBTUUobXB0UmVwbHkpCisJZGhzcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJHb3QgSGFuZHNoYWtlIHJlcGx5OlxuIiwgaW9jLT5uYW1lKSk7CisJREJHX0RVTVBfUkVQTFlfRlJBTUUoaW9jLCAodTMyICopbXB0UmVwbHkpCiAKLQlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldhaXRGb3JEb29yYmVsbCBSRVBMWSBXYWl0Q250PSVkIChzej0lZClcbiIsCisJZGhzcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJXYWl0Rm9yRG9vcmJlbGwgUkVQTFkgV2FpdENudD0lZCAoc3o9JWQpXG4iLAogCQkJaW9jLT5uYW1lLCB0LCB1MTZjbnQvMikpOwogCXJldHVybiB1MTZjbnQvMjsKIH0KQEAgLTQ3NjEsNyArNDc2MSw3IEBACiAKIAkJaW9jLT5zcGlfZGF0YS5udnJhbSA9IChpbnQgKikgbWVtOwogCi0JCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNDU0kgZGV2aWNlIE5WUkFNIHNldHRpbmdzIEAgJXAsIHN6PSVkXG4iLAorCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTQ1NJIGRldmljZSBOVlJBTSBzZXR0aW5ncyBAICVwLCBzej0lZFxuIiwKIAkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5udnJhbSwgc3opKTsKIAl9CiAKQEAgLTQ3OTcsNyArNDc5Nyw4IEBACiAJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gTVBUX0FTWU5DOwogCQkJCWlvYy0+c3BpX2RhdGEuYnVzVHlwZSA9IE1QVF9IT1NUX0JVU19VTktOT1dOOwogCQkJCXJjID0gMTsKLQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlVuYWJsZSB0byByZWFkIFBvcnRQYWdlMCBtaW5TeW5jRmFjdG9yPSV4XG4iLAorCQkJCWRkdnByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAorCQkJCQkiVW5hYmxlIHRvIHJlYWQgUG9ydFBhZ2UwIG1pblN5bmNGYWN0b3I9JXhcbiIsCiAJCQkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yKSk7CiAJCQl9IGVsc2UgewogCQkJCS8qIFNhdmUgdGhlIFBvcnQgUGFnZSAwIGRhdGEKQEAgLTQ4MDgsNyArNDgwOSw4IEBACiAKIAkJCQlpZiAoIChwUFAwLT5DYXBhYmlsaXRpZXMgJiBNUElfU0NTSVBPUlRQQUdFMF9DQVBfUUFTKSA9PSAwICkgewogCQkJCQlpb2MtPnNwaV9kYXRhLm5vUWFzIHw9IE1QVF9UQVJHRVRfTk9fTkVHT19RQVM7Ci0JCQkJCWRkdnByaW50aygoS0VSTl9JTkZPIE1ZTkFNICIgOiVzIG5vUWFzIGR1ZSB0byBDYXBhYmlsaXRpZXM9JXhcbiIsCisJCQkJCWRkdnByaW50ayhpb2MsIHByaW50ayhLRVJOX0lORk8gTVlOQU0KKwkJCQkJCSIgOiVzIG5vUWFzIGR1ZSB0byBDYXBhYmlsaXRpZXM9JXhcbiIsCiAJCQkJCQlpb2MtPm5hbWUsIHBQUDAtPkNhcGFiaWxpdGllcykpOwogCQkJCX0KIAkJCQlpb2MtPnNwaV9kYXRhLm1heEJ1c1dpZHRoID0gcFBQMC0+Q2FwYWJpbGl0aWVzICYgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1dJREUgPyAxIDogMDsKQEAgLTQ4MTcsNyArNDgxOSw4IEBACiAJCQkJCWlvYy0+c3BpX2RhdGEubWF4U3luY09mZnNldCA9ICh1OCkgKGRhdGEgPj4gMTYpOwogCQkJCQlkYXRhID0gcFBQMC0+Q2FwYWJpbGl0aWVzICYgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX01JTl9TWU5DX1BFUklPRF9NQVNLOwogCQkJCQlpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IgPSAodTgpIChkYXRhID4+IDgpOwotCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlBvcnRQYWdlMCBtaW5TeW5jRmFjdG9yPSV4XG4iLAorCQkJCQlkZHZwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJCSJQb3J0UGFnZTAgbWluU3luY0ZhY3Rvcj0leFxuIiwKIAkJCQkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaW9jLT5zcGlfZGF0YS5tYXhTeW5jT2Zmc2V0ID0gMDsKQEAgLTQ4MzMsNyArNDgzNiw4IEBACiAKIAkJCQkJaWYgKGlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvciA8IE1QVF9VTFRSQSkgewogCQkJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gTVBUX1VMVFJBOwotCQkJCQkJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIVkQgb3IgU0UgZGV0ZWN0ZWQsIG1pblN5bmNGYWN0b3I9JXhcbiIsCisJCQkJCQlkZHZwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJCQkiSFZEIG9yIFNFIGRldGVjdGVkLCBtaW5TeW5jRmFjdG9yPSV4XG4iLAogCQkJCQkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yKSk7CiAJCQkJCX0KIAkJCQl9CkBAIC00OTQ5LDEwICs0OTUzLDEwIEBACiAJaW9jLT5zcGlfZGF0YS5zZHAwdmVyc2lvbiA9IGNmZy5jZmdoZHIuaGRyLT5QYWdlVmVyc2lvbjsKIAlpb2MtPnNwaV9kYXRhLnNkcDBsZW5ndGggPSBjZmcuY2ZnaGRyLmhkci0+UGFnZUxlbmd0aDsKIAotCWRjcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIZWFkZXJzOiAwOiB2ZXJzaW9uICVkIGxlbmd0aCAlZFxuIiwKKwlkY3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSGVhZGVyczogMDogdmVyc2lvbiAlZCBsZW5ndGggJWRcbiIsCiAJCQlpb2MtPm5hbWUsIGlvYy0+c3BpX2RhdGEuc2RwMHZlcnNpb24sIGlvYy0+c3BpX2RhdGEuc2RwMGxlbmd0aCkpOwogCi0JZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhlYWRlcnM6IDE6IHZlcnNpb24gJWQgbGVuZ3RoICVkXG4iLAorCWRjcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJIZWFkZXJzOiAxOiB2ZXJzaW9uICVkIGxlbmd0aCAlZFxuIiwKIAkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5zZHAxdmVyc2lvbiwgaW9jLT5zcGlfZGF0YS5zZHAxbGVuZ3RoKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC01MzYxLDEyICs1MzY1LDEyIEBACiAJY2ZnLnBoeXNBZGRyID0gaW9jMV9kbWE7CiAJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOwogCWlmIChtcHRfY29uZmlnKGlvYywgJmNmZykgPT0gMCkgewotCQkKKwogCQl0bXAgPSBsZTMyX3RvX2NwdShwSW9jMS0+RmxhZ3MpICYgTVBJX0lPQ1BBR0UxX1JFUExZX0NPQUxFU0NJTkc7CiAJCWlmICh0bXAgPT0gTVBJX0lPQ1BBR0UxX1JFUExZX0NPQUxFU0NJTkcpIHsKIAkJCXRtcCA9IGxlMzJfdG9fY3B1KHBJb2MxLT5Db2FsZXNjaW5nVGltZW91dCk7CiAKLQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNvYWxlc2NpbmcgRW5hYmxlZCBUaW1lb3V0ID0gJWRcbiIsCisJCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJDb2FsZXNjaW5nIEVuYWJsZWQgVGltZW91dCA9ICVkXG4iLAogCQkJCQlpb2MtPm5hbWUsIHRtcCkpOwogCiAJCQlpZiAodG1wID4gTVBUX0NPQUxFU0NJTkdfVElNRU9VVCkgewpAQCAtNTM3NywyNiArNTM4MSwyOSBAQAogCQkJCWNmZy5kaXIgPSAxOwogCQkJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1dSSVRFX0NVUlJFTlQ7CiAJCQkJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSA9PSAwKSB7Ci0JCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlJlc2V0IEN1cnJlbnQgQ29hbGVzY2luZyBUaW1lb3V0IHRvID0gJWRcbiIsCisJCQkJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJlc2V0IEN1cnJlbnQgQ29hbGVzY2luZyBUaW1lb3V0IHRvID0gJWRcbiIsCiAJCQkJCQkJaW9jLT5uYW1lLCBNUFRfQ09BTEVTQ0lOR19USU1FT1VUKSk7CiAKIAkJCQkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfTlZSQU07CiAJCQkJCWlmIChtcHRfY29uZmlnKGlvYywgJmNmZykgPT0gMCkgewotCQkJCQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUmVzZXQgTlZSQU0gQ29hbGVzY2luZyBUaW1lb3V0IHRvID0gJWRcbiIsCisJCQkJCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCQkJCSJSZXNldCBOVlJBTSBDb2FsZXNjaW5nIFRpbWVvdXQgdG8gPSAlZFxuIiwKIAkJCQkJCQkJaW9jLT5uYW1lLCBNUFRfQ09BTEVTQ0lOR19USU1FT1VUKSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXNldCBOVlJBTSBDb2FsZXNjaW5nIFRpbWVvdXQgRmFpbGVkXG4iLAotCQkJCQkJCQkJaW9jLT5uYW1lKSk7CisJCQkJCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkJCQkJCSJSZXNldCBOVlJBTSBDb2FsZXNjaW5nIFRpbWVvdXQgRmFpbGVkXG4iLAorCQkJCQkJCQlpb2MtPm5hbWUpKTsKIAkJCQkJfQogCiAJCQkJfSBlbHNlIHsKLQkJCQkJZHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiUmVzZXQgb2YgQ3VycmVudCBDb2FsZXNjaW5nIFRpbWVvdXQgRmFpbGVkIVxuIiwKLQkJCQkJCQkJaW9jLT5uYW1lKSk7CisJCQkJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAorCQkJCQkJIlJlc2V0IG9mIEN1cnJlbnQgQ29hbGVzY2luZyBUaW1lb3V0IEZhaWxlZCFcbiIsCisJCQkJCQlpb2MtPm5hbWUpKTsKIAkJCQl9CiAJCQl9CiAKIAkJfSBlbHNlIHsKLQkJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIkNvYWxlc2NpbmcgRGlzYWJsZWRcbiIsIGlvYy0+bmFtZSkpOworCQkJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJDb2FsZXNjaW5nIERpc2FibGVkXG4iLCBpb2MtPm5hbWUpKTsKIAkJfQogCX0KIApAQCAtNTQ2MSwxMyArNTQ2OCwxMyBAQAogCiAJZXZucCA9IChFdmVudE5vdGlmaWNhdGlvbl90ICopIG1wdF9nZXRfbXNnX2ZyYW1lKG1wdF9iYXNlX2luZGV4LCBpb2MpOwogCWlmIChldm5wID09IE5VTEwpIHsKLQkJZGV2dHZlcmJvc2VwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCByZXF1ZXN0IGZyYW1lIVxuIiwKKwkJZGV2dHZlcmJvc2VwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiVW5hYmxlIHRvIGFsbG9jYXRlIGV2ZW50IHJlcXVlc3QgZnJhbWUhXG4iLAogCQkJCWlvYy0+bmFtZSkpOwogCQlyZXR1cm4gMDsKIAl9CiAJbWVtc2V0KGV2bnAsIDAsIHNpemVvZigqZXZucCkpOwogCi0JZGV2dHZlcmJvc2VwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgRXZlbnROb3RpZmljYXRpb24gKCVkKSByZXF1ZXN0ICVwXG4iLCBpb2MtPm5hbWUsIEV2U3dpdGNoLCBldm5wKSk7CisJZGV2dHZlcmJvc2VwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlNlbmRpbmcgRXZlbnROb3RpZmljYXRpb24gKCVkKSByZXF1ZXN0ICVwXG4iLCBpb2MtPm5hbWUsIEV2U3dpdGNoLCBldm5wKSk7CiAKIAlldm5wLT5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9FVkVOVF9OT1RJRklDQVRJT047CiAJZXZucC0+Q2hhaW5PZmZzZXQgPSAwOwpAQCAtNTQ5MSwxMiArNTQ5OCwxMiBAQAogCUV2ZW50QWNrX3QJKnBBY2s7CiAKIAlpZiAoKHBBY2sgPSAoRXZlbnRBY2tfdCAqKSBtcHRfZ2V0X21zZ19mcmFtZShtcHRfYmFzZV9pbmRleCwgaW9jKSkgPT0gTlVMTCkgewotCQlkZmFpbHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiJXMsIG5vIG1zZyBmcmFtZXMhIVxuIiwKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiJXMsIG5vIG1zZyBmcmFtZXMhIVxuIiwKIAkJICAgIGlvYy0+bmFtZSxfX0ZVTkNUSU9OX18pKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRldnR2ZXJib3NlcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTZW5kaW5nIEV2ZW50QWNrXG4iLCBpb2MtPm5hbWUpKTsKKwlkZXZ0dmVyYm9zZXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiU2VuZGluZyBFdmVudEFja1xuIiwgaW9jLT5uYW1lKSk7CiAKIAlwQWNrLT5GdW5jdGlvbiAgICAgPSBNUElfRlVOQ1RJT05fRVZFTlRfQUNLOwogCXBBY2stPkNoYWluT2Zmc2V0ICA9IDA7CkBAIC01NTQxLDcgKzU1NDgsNyBAQAogCSAqLwogCWluX2lzciA9IGluX2ludGVycnVwdCgpOwogCWlmIChpbl9pc3IpIHsKLQkJZGNwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIkNvbmZpZyByZXF1ZXN0IG5vdCBhbGxvd2VkIGluIElTUiBjb250ZXh0IVxuIiwKKwkJZGNwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiQ29uZmlnIHJlcXVlc3Qgbm90IGFsbG93ZWQgaW4gSVNSIGNvbnRleHQhXG4iLAogCQkJCWlvYy0+bmFtZSkpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KQEAgLTU1NDksNyArNTU1Niw3IEBACiAJLyogR2V0IGFuZCBQb3B1bGF0ZSBhIGZyZWUgRnJhbWUKIAkgKi8KIAlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0X2Jhc2VfaW5kZXgsIGlvYykpID09IE5VTEwpIHsKLQkJZGNwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIm1wdF9jb25maWc6IG5vIG1zZyBmcmFtZXMhXG4iLAorCQlkY3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJtcHRfY29uZmlnOiBubyBtc2cgZnJhbWVzIVxuIiwKIAkJCQlpb2MtPm5hbWUpKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtNTU5NCwxMyArNTYwMSwxMyBAQAogCWlmICgocENmZy0+Y2ZnaGRyLmhkci0+UGFnZVR5cGUgJiBNUElfQ09ORklHX1BBR0VUWVBFX01BU0spID09IE1QSV9DT05GSUdfUEFHRVRZUEVfRVhURU5ERUQpIHsKIAkJZmxhZ3NMZW5ndGggfD0gcEV4dEhkci0+RXh0UGFnZUxlbmd0aCAqIDQ7CiAKLQkJZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgQ29uZmlnIHJlcXVlc3QgdHlwZSAlZCwgcGFnZSAlZCBhbmQgYWN0aW9uICVkXG4iLAorCQlkY3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiU2VuZGluZyBDb25maWcgcmVxdWVzdCB0eXBlICVkLCBwYWdlICVkIGFuZCBhY3Rpb24gJWRcbiIsCiAJCQlpb2MtPm5hbWUsIHBSZXEtPkV4dFBhZ2VUeXBlLCBwUmVxLT5IZWFkZXIuUGFnZU51bWJlciwgcFJlcS0+QWN0aW9uKSk7CiAJfQogCWVsc2UgewogCQlmbGFnc0xlbmd0aCB8PSBwQ2ZnLT5jZmdoZHIuaGRyLT5QYWdlTGVuZ3RoICogNDsKIAotCQlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb25maWcgcmVxdWVzdCB0eXBlICVkLCBwYWdlICVkIGFuZCBhY3Rpb24gJWRcbiIsCisJCWRjcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTZW5kaW5nIENvbmZpZyByZXF1ZXN0IHR5cGUgJWQsIHBhZ2UgJWQgYW5kIGFjdGlvbiAlZFxuIiwKIAkJCWlvYy0+bmFtZSwgcFJlcS0+SGVhZGVyLlBhZ2VUeXBlLCBwUmVxLT5IZWFkZXIuUGFnZU51bWJlciwgcFJlcS0+QWN0aW9uKSk7CiAJfQogCkBAIC01NjUwLDcgKzU2NTcsNyBAQAogewogCU1QVF9BREFQVEVSICppb2MgPSAoTVBUX0FEQVBURVIgKikgZGF0YTsKIAotCWRjcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJtcHRfdGltZXJfZXhwaXJlZCEgXG4iLCBpb2MtPm5hbWUpKTsKKwlkY3ByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0X3RpbWVyX2V4cGlyZWQhIFxuIiwgaW9jLT5uYW1lKSk7CiAKIAkvKiBQZXJmb3JtIGEgRlcgcmVsb2FkICovCiAJaWYgKG1wdF9IYXJkUmVzZXRIYW5kbGVyKGlvYywgTk9fU0xFRVApIDwgMCkKQEAgLTU2NjAsNyArNTY2Nyw3IEBACiAJICogSGFyZCByZXNldCBjbGVhbi11cCB3aWxsIHdha2UgdXAKIAkgKiBwcm9jZXNzIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMuCiAJICovCi0JZGNwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIm1wdF90aW1lcl9leHBpcmVkIGNvbXBsZXRlIVxuIiwgaW9jLT5uYW1lKSk7CisJZGNwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIm1wdF90aW1lcl9leHBpcmVkIGNvbXBsZXRlIVxuIiwgaW9jLT5uYW1lKSk7CiAKIAlyZXR1cm47CiB9CkBAIC01Njc5LDcgKzU2ODYsNyBAQAogCUNPTkZJR1BBUk1TICpwQ2ZnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0KKwlkcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0KIAkJCSI6IElPQyAlc19yZXNldCByb3V0ZWQgdG8gTVBUIGJhc2UgZHJpdmVyIVxuIiwKIAkJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1NFVFVQX1JFU0VUID8gInNldHVwIiA6ICgKIAkJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1BSRV9SRVNFVCA/ICJwcmUiIDogInBvc3QiKSkpOwpAQCAtNjA1MCw3ICs2MDU3LDcgQEAKIAlpbnQJCSByYzsKIAl1bnNpZ25lZCBsb25nCSBmbGFnczsKIAotCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGFyZFJlc2V0SGFuZGxlciBFbnRlcmVkIVxuIiwgaW9jLT5uYW1lKSk7CisJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJIYXJkUmVzZXRIYW5kbGVyIEVudGVyZWQhXG4iLCBpb2MtPm5hbWUpKTsKICNpZmRlZiBNRkNOVAogCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJIYXJkUmVzZXRIYW5kbGVyIEVudGVyZWQhXG4iLCBpb2MtPm5hbWUpOwogCXByaW50aygiTUYgY291bnQgMHgleCAhXG4iLCBpb2MtPm1mY250KTsKQEAgLTYwODIsMTEgKzYwODksMTEgQEAKIAogCQlmb3IgKGlpPU1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUy0xOyBpaTsgaWktLSkgewogCQkJaWYgKE1wdFJlc2V0SGFuZGxlcnNbaWldKSB7Ci0JCQkJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIElPQyByZXNldF9zZXR1cCBoYW5kbGVyICMlZFxuIiwKKwkJCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkNhbGxpbmcgSU9DIHJlc2V0X3NldHVwIGhhbmRsZXIgIyVkXG4iLAogCQkJCQkJaW9jLT5uYW1lLCBpaSkpOwogCQkJCXIgKz0gbXB0X3NpZ25hbF9yZXNldChpaSwgaW9jLCBNUFRfSU9DX1NFVFVQX1JFU0VUKTsKIAkJCQlpZiAoaW9jLT5hbHRfaW9jKSB7Ci0JCQkJCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ2FsbGluZyBhbHQtJXMgc2V0dXAgcmVzZXQgaGFuZGxlciAjJWRcbiIsCisJCQkJCWR0bXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiQ2FsbGluZyBhbHQtJXMgc2V0dXAgcmVzZXQgaGFuZGxlciAjJWRcbiIsCiAJCQkJCQkJaW9jLT5uYW1lLCBpb2MtPmFsdF9pb2MtPm5hbWUsIGlpKSk7CiAJCQkJCXIgKz0gbXB0X3NpZ25hbF9yZXNldChpaSwgaW9jLT5hbHRfaW9jLCBNUFRfSU9DX1NFVFVQX1JFU0VUKTsKIAkJCQl9CkBAIC02MTA4LDcgKzYxMTUsNyBAQAogCQlpb2MtPmFsdF9pb2MtPmRpYWdQZW5kaW5nID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmRpYWdMb2NrLCBmbGFncyk7CiAKLQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhhcmRSZXNldEhhbmRsZXIgcmMgPSAlZCFcbiIsIGlvYy0+bmFtZSwgcmMpKTsKKwlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkhhcmRSZXNldEhhbmRsZXIgcmMgPSAlZCFcbiIsIGlvYy0+bmFtZSwgcmMpKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTY1MDksMTYgKzY1MTYsMTggQEAKIAl9CiAKIAlFdmVudERlc2NyaXB0aW9uU3RyKGV2ZW50LCBldkRhdGEwLCBldlN0cik7Ci0JZGV2dHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiTVBUIGV2ZW50OiglMDJYaCkgOiAlc1xuIiwKKwlkZXZ0cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJNUFQgZXZlbnQ6KCUwMlhoKSA6ICVzXG4iLAogCQkJaW9jLT5uYW1lLAogCQkJZXZlbnQsCiAJCQlldlN0cikpOwogCi0jaWYgZGVmaW5lZChNUFRfREVCVUcpIHx8IGRlZmluZWQoTVBUX0RFQlVHX1ZFUkJPU0VfRVZFTlRTKQotCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRXZlbnQgZGF0YTpcbiIgS0VSTl9JTkZPKTsKKyNpZmRlZiBDT05GSUdfRlVTSU9OX0xPR0dJTkcKKwlkZXZ0dmVyYm9zZXByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHIE1ZTkFNCisJICAgICI6IEV2ZW50IGRhdGE6XG4iKSk7CiAJZm9yIChpaSA9IDA7IGlpIDwgZXZEYXRhTGVuOyBpaSsrKQotCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUocEV2ZW50UmVwbHktPkRhdGFbaWldKSk7Ci0JcHJpbnRrKCJcbiIpOworCQlkZXZ0dmVyYm9zZXByaW50ayhpb2MsIHByaW50aygiICUwOHgiLAorCQkgICAgbGUzMl90b19jcHUocEV2ZW50UmVwbHktPkRhdGFbaWldKSkpOworCWRldnR2ZXJib3NlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlxuIikpOwogI2VuZGlmCiAKIAkvKgpAQCAtNjU3Myw3ICs2NTgyLDcgQEAKIAkgKi8KIAlmb3IgKGlpPU1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUy0xOyBpaTsgaWktLSkgewogCQlpZiAoTXB0RXZIYW5kbGVyc1tpaV0pIHsKLQkJCWRldnR2ZXJib3NlcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSb3V0aW5nIEV2ZW50IHRvIGV2ZW50IGhhbmRsZXIgIyVkXG4iLAorCQkJZGV2dHZlcmJvc2VwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJvdXRpbmcgRXZlbnQgdG8gZXZlbnQgaGFuZGxlciAjJWRcbiIsCiAJCQkJCWlvYy0+bmFtZSwgaWkpKTsKIAkJCXIgKz0gKCooTXB0RXZIYW5kbGVyc1tpaV0pKShpb2MsIHBFdmVudFJlcGx5KTsKIAkJCWhhbmRsZXJzKys7CkBAIC02NTg1LDEwICs2NTk0LDEwIEBACiAJICogIElmIG5lZWRlZCwgc2VuZCAoYSBzaW5nbGUpIEV2ZW50QWNrLgogCSAqLwogCWlmIChwRXZlbnRSZXBseS0+QWNrUmVxdWlyZWQgPT0gTVBJX0VWRU5UX05PVElGSUNBVElPTl9BQ0tfUkVRVUlSRUQpIHsKLQkJZGV2dHZlcmJvc2VwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQKKwkJZGV2dHZlcmJvc2VwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJCSJFdmVudEFjayByZXF1aXJlZFxuIixpb2MtPm5hbWUpKTsKIAkJaWYgKChpaSA9IFNlbmRFdmVudEFjayhpb2MsIHBFdmVudFJlcGx5KSkgIT0gMCkgewotCQkJZGV2dHZlcmJvc2VwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlNlbmRFdmVudEFjayByZXR1cm5lZCAlZFxuIiwKKwkJCWRldnR2ZXJib3NlcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTZW5kRXZlbnRBY2sgcmV0dXJuZWQgJWRcbiIsCiAJCQkJCWlvYy0+bmFtZSwgaWkpKTsKIAkJfQogCX0KQEAgLTY5MzUsNyArNjk0NCw2IEBACiAJCQlzYXNfbG9naW5mby5kdy5jb2RlLCBzYXNfbG9naW5mby5kdy5zdWJjb2RlKTsKIH0KIAotI2lmZGVmIE1QVF9ERUJVR19SRVBMWQogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoqCiAgKgltcHRfaW9jc3RhdHVzX2luZm9fY29uZmlnIC0gSU9DU1RBVFVTIGluZm9ybWF0aW9uIGZvciBjb25maWcgcGFnZXMKQEAgLTcyNDAsNyArNzI0OCw2IEBACiAKIAlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiSU9DU3RhdHVzKDB4JTA0WCk6ICVzXG4iLCBpb2MtPm5hbWUsIHN0YXR1cywgZGVzYyk7CiB9Ci0jZW5kaWYKIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogRVhQT1JUX1NZTUJPTChtcHRfYXR0YWNoKTsKQEAgLTczMDUsMTEgKzczMTIsNyBAQAogCiAJLyogUmVnaXN0ZXIgZm9yIGhhcmQgcmVzZXQgaGFuZGxpbmcgY2FsbGJhY2tzLgogCSAqLwotCWlmIChtcHRfcmVzZXRfcmVnaXN0ZXIobXB0X2Jhc2VfaW5kZXgsIG1wdF9pb2NfcmVzZXQpID09IDApIHsKLQkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IFJlZ2lzdGVyIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uXG4iKSk7Ci0JfSBlbHNlIHsKLQkJLyogRklYTUUhICovCi0JfQorCW1wdF9yZXNldF9yZWdpc3RlcihtcHRfYmFzZV9pbmRleCwgbXB0X2lvY19yZXNldCk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCSh2b2lkKSBwcm9jbXB0X2NyZWF0ZSgpOwpAQCAtNzMyOCw4ICs3MzMxLDYgQEAKIGZ1c2lvbl9leGl0KHZvaWQpCiB7CiAKLQlkZXhpdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGZ1c2lvbl9leGl0KCkgY2FsbGVkIVxuIikpOwotCiAJbXB0X3Jlc2V0X2RlcmVnaXN0ZXIobXB0X2Jhc2VfaW5kZXgpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKaW5kZXggOThlYjljNi4uMTVmZjIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKQEAgLTE4Niw2ICsxODYsNyBAQAogICogTVBUIGRyaXZlcnMuICBOT1RFOiBVc2VycyBvZiB0aGVzZSBtYWNybyBkZWZzIG11c3QKICAqIHRoZW1zZWx2ZXMgZGVmaW5lIHRoZWlyIG93biBNWU5BTS4KICAqLworI2RlZmluZSBNWUlPQ19zX0RFQlVHX0ZNVAkJS0VSTl9ERUJVRyBNWU5BTSAiOiAlczogIgogI2RlZmluZSBNWUlPQ19zX0lORk9fRk1UCQlLRVJOX0lORk8gTVlOQU0gIjogJXM6ICIKICNkZWZpbmUgTVlJT0Nfc19OT1RFX0ZNVAkJS0VSTl9OT1RJQ0UgTVlOQU0gIjogJXM6ICIKICNkZWZpbmUgTVlJT0Nfc19XQVJOX0ZNVAkJS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBXQVJOSU5HIC0gIgpAQCAtNTQzLDYgKzU0NCw3IEBACiAJY2hhcgkJCSBib2FyZF90cmFjZXJbMTZdOwogCXUxNgkJCSBudmRhdGFfdmVyc2lvbl9wZXJzaXN0ZW50OwogCXUxNgkJCSBudmRhdGFfdmVyc2lvbl9kZWZhdWx0OworCWludAkJCSBkZWJ1Z19sZXZlbDsKIAl1OAkJCSBpb19taXNzaW5nX2RlbGF5OwogCXU4CQkJIGRldmljZV9taXNzaW5nX2RlbGF5OwogCVNZU0lGX1JFR1MgX19pb21lbQkqY2hpcDsJCS8qID09IGM4ODE3MDAwIChtbWFwKSAqLwpAQCAtNzE4LDE3MSArNzIwLDcgQEAKIC8qCiAgKiAgRnVua3kgKHByaXZhdGUpIG1hY3Jvcy4uLgogICovCi0jaWZkZWYgTVBUX0RFQlVHCi0jZGVmaW5lIGRwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkcHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmZGVmIE1QVF9ERUJVR19JTklUCi0jZGVmaW5lIGRpbml0cHJpbnRrKHgpICBwcmludGsgeAotI2RlZmluZSBEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKG1mcCkgXAotCXsJaW50ICBpLCBuID0gMTA7CQkJCQkJXAotCQl1MzIgKm0gPSAodTMyICopKG1mcCk7CQkJCQlcCi0JCXByaW50ayhLRVJOX0lORk8gIiAiKTsJCQkJCVwKLQkJZm9yIChpPTA7IGk8bjsgaSsrKQkJCQkJXAotCQkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1baV0pKTsJCVwKLQkJcHJpbnRrKCJcbiIpOwkJCQkJCVwKLQl9Ci0jZWxzZQotI2RlZmluZSBkaW5pdHByaW50ayh4KQotI2RlZmluZSBEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKG1mcCkKLSNlbmRpZgotCi0jaWZkZWYgTVBUX0RFQlVHX0VYSVQKLSNkZWZpbmUgZGV4aXRwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkZXhpdHByaW50ayh4KQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIE1QVF9ERUJVR19GQUlMIHx8IGRlZmluZWQgKE1QVF9ERUJVR19TRykKLSNkZWZpbmUgZGZhaWxwcmludGsoeCkgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIGRmYWlscHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmZGVmIE1QVF9ERUJVR19IQU5EU0hBS0UKLSNkZWZpbmUgZGhzcHJpbnRrKHgpICBwcmludGsgeAotI2Vsc2UKLSNkZWZpbmUgZGhzcHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTVBUX0RFQlVHX0VWRU5UUykgfHwgZGVmaW5lZChNUFRfREVCVUdfVkVSQk9TRV9FVkVOVFMpCi0jZGVmaW5lIGRldnRwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkZXZ0cHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmZGVmIE1QVF9ERUJVR19WRVJCT1NFX0VWRU5UUwotI2RlZmluZSBkZXZ0dmVyYm9zZXByaW50ayh4KSAgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIGRldnR2ZXJib3NlcHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmZGVmIE1QVF9ERUJVR19SRVNFVAotI2RlZmluZSBkcnNwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkcnNwcmludGsoeCkKLSNlbmRpZgotCi0vLyNpZiBkZWZpbmVkKE1QVF9ERUJVRykgfHwgZGVmaW5lZChNUFRfREVCVUdfTVNHX0ZSQU1FKQotI2lmIGRlZmluZWQoTVBUX0RFQlVHX01TR19GUkFNRSkKLSNkZWZpbmUgZG1mcHJpbnRrKHgpICBwcmludGsgeAotI2RlZmluZSBEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FKG1mcCkgXAotCXsJaW50ICBpLCBuID0gMjQ7CQkJCQkJXAotCQl1MzIgKm0gPSAodTMyICopKG1mcCk7CQkJCQlcCi0JCWZvciAoaT0wOyBpPG47IGkrKykgewkJCQkJXAotCQkJaWYgKGkgJiYgKChpJTgpPT0wKSkJCQkJXAotCQkJCXByaW50aygiXG4iKTsJCQkJXAotCQkJcHJpbnRrKCIlMDh4ICIsIGxlMzJfdG9fY3B1KG1baV0pKTsJCVwKLQkJfQkJCQkJCQlcCi0JCXByaW50aygiXG4iKTsJCQkJCQlcCi0JfQotI2Vsc2UKLSNkZWZpbmUgZG1mcHJpbnRrKHgpCi0jZGVmaW5lIERCR19EVU1QX1JFUVVFU1RfRlJBTUUobWZwKQotI2VuZGlmCi0KLSNpZmRlZiBNUFRfREVCVUdfSVJRCi0jZGVmaW5lIGRpcnFwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkaXJxcHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmZGVmIE1QVF9ERUJVR19TRwotI2RlZmluZSBkc2dwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkc2dwcmludGsoeCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNUFRfREVCVUdfREwpIHx8IGRlZmluZWQoTVBUX0RFQlVHKQotI2RlZmluZSBkZGxwcmludGsoeCkgIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkZGxwcmludGsoeCkKLSNlbmRpZgotCi0jaWZkZWYgTVBUX0RFQlVHX0RWCi0jZGVmaW5lIGRkdnByaW50ayh4KSAgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIGRkdnByaW50ayh4KQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE1QVF9ERUJVR19EVikgfHwgZGVmaW5lZChNUFRfREVCVUdfRFZfVElOWSkKLSNkZWZpbmUgZGR2dHByaW50ayh4KSAgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIGRkdnRwcmludGsoeCkKLSNlbmRpZgotCi0jaWZkZWYgTVBUX0RFQlVHX0lPQ1RMCi0jZGVmaW5lIGRjdGxwcmludGsoeCkgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIGRjdGxwcmludGsoeCkKLSNlbmRpZgotCi0jaWZkZWYgTVBUX0RFQlVHX1JFUExZCi0jZGVmaW5lIGRyZXBseXByaW50ayh4KSBwcmludGsgeAotI2Vsc2UKLSNkZWZpbmUgZHJlcGx5cHJpbnRrKHgpCi0jZW5kaWYKLQotI2lmZGVmIERNUFRfREVCVUdfRkMKLSNkZWZpbmUgZGZjcHJpbnRrKHgpIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkZmNwcmludGsoeCkKLSNlbmRpZgotCi0jaWZkZWYgTVBUX0RFQlVHX1RNCi0jZGVmaW5lIGR0bXByaW50ayh4KSBwcmludGsgeAotI2RlZmluZSBEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKG1mcCkgXAotCXsJdTMyICptID0gKHUzMiAqKShtZnApOwkJCQkJXAotCQlpbnQgIGksIG4gPSAxMzsJCQkJCQlcCi0JCXByaW50aygiVE1fUkVRVUVTVDpcbiIpOwkJCQlcCi0JCWZvciAoaT0wOyBpPG47IGkrKykgewkJCQkJXAotCQkJaWYgKGkgJiYgKChpJTgpPT0wKSkJCQkJXAotCQkJCXByaW50aygiXG4iKTsJCQkJXAotCQkJcHJpbnRrKCIlMDh4ICIsIGxlMzJfdG9fY3B1KG1baV0pKTsJCVwKLQkJfQkJCQkJCQlcCi0JCXByaW50aygiXG4iKTsJCQkJCQlcCi0JfQotI2RlZmluZSBEQkdfRFVNUF9UTV9SRVBMWV9GUkFNRShtZnApIFwKLQl7CXUzMiAqbSA9ICh1MzIgKikobWZwKTsJCQkJCVwKLQkJaW50ICBpLCBuID0gKGxlMzJfdG9fY3B1KG1bMF0pICYgMHgwMEZGMDAwMCkgPj4gMTY7CVwKLQkJcHJpbnRrKCJUTV9SRVBMWSBNZXNzYWdlTGVuZ3RoPSVkOlxuIiwgbik7CQlcCi0JCWZvciAoaT0wOyBpPG47IGkrKykgewkJCQkJXAotCQkJaWYgKGkgJiYgKChpJTgpPT0wKSkJCQkJXAotCQkJCXByaW50aygiXG4iKTsJCQkJXAotCQkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1baV0pKTsJCVwKLQkJfQkJCQkJCQlcCi0JCXByaW50aygiXG4iKTsJCQkJCQlcCi0JfQotI2Vsc2UKLSNkZWZpbmUgZHRtcHJpbnRrKHgpCi0jZGVmaW5lIERCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUobWZwKQotI2RlZmluZSBEQkdfRFVNUF9UTV9SRVBMWV9GUkFNRShtZnApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTVBUX0RFQlVHX0NPTkZJRykgfHwgZGVmaW5lZChNUFRfREVCVUcpCi0jZGVmaW5lIGRjcHJpbnRrKHgpIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkY3ByaW50ayh4KQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE1QVF9ERUJVR19TQ1NJKSB8fCBkZWZpbmVkKE1QVF9ERUJVRykgfHwgZGVmaW5lZChNUFRfREVCVUdfTVNHX0ZSQU1FKQotI2RlZmluZSBkc3ByaW50ayh4KSBwcmludGsgeAotI2Vsc2UKLSNkZWZpbmUgZHNwcmludGsoeCkKLSNlbmRpZgotCisjaW5jbHVkZSAibXB0ZGVidWcuaCIKIAogI2RlZmluZSBNUFRfSU5ERVhfMl9NRlBUUihpb2MsaWR4KSBcCiAJKE1QVF9GUkFNRV9IRFIqKSggKHU4KikoaW9jKS0+cmVxX2ZyYW1lcyArIChpb2MpLT5yZXFfc3ogKiAoaWR4KSApCkBAIC04OTMsMzYgKzczMSw2IEBACiAjZGVmaW5lIE1QVF9JTkRFWF8yX1JGUFRSKGlvYyxpZHgpIFwKIAkoTVBUX0ZSQU1FX0hEUiopKCAodTgqKShpb2MpLT5yZXBseV9mcmFtZXMgKyAoaW9jKS0+cmVxX3N6ICogKGlkeCkgKQogCi0jaWYgZGVmaW5lZChNUFRfREVCVUcpIHx8IGRlZmluZWQoTVBUX0RFQlVHX01TR19GUkFNRSkKLSNkZWZpbmUgREJHX0RVTVBfUkVQTFlfRlJBTUUobWZwKSBcCi0Jewl1MzIgKm0gPSAodTMyICopKG1mcCk7CQkJCQlcCi0JCWludCAgaSwgbiA9IChsZTMyX3RvX2NwdShtWzBdKSAmIDB4MDBGRjAwMDApID4+IDE2OwlcCi0JCXByaW50ayhLRVJOX0lORk8gIiAiKTsJCQkJCVwKLQkJZm9yIChpPTA7IGk8bjsgaSsrKQkJCQkJXAotCQkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1baV0pKTsJCVwKLQkJcHJpbnRrKCJcbiIpOwkJCQkJCVwKLQl9Ci0jZGVmaW5lIERCR19EVU1QX1JFUVVFU1RfRlJBTUVfSERSKG1mcCkgXAotCXsJaW50ICBpLCBuID0gMzsJCQkJCQlcCi0JCXUzMiAqbSA9ICh1MzIgKikobWZwKTsJCQkJCVwKLQkJcHJpbnRrKEtFUk5fSU5GTyAiICIpOwkJCQkJXAotCQlmb3IgKGk9MDsgaTxuOyBpKyspCQkJCQlcCi0JCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUobVtpXSkpOwkJXAotCQlwcmludGsoIlxuIik7CQkJCQkJXAotCX0KLSNlbHNlCi0jZGVmaW5lIERCR19EVU1QX1JFUExZX0ZSQU1FKG1mcCkKLSNkZWZpbmUgREJHX0RVTVBfUkVRVUVTVF9GUkFNRV9IRFIobWZwKQotI2VuZGlmCi0KLS8vIGRlYnVnIHNhcyB3aWRlIHBvcnRzCi0jaWZkZWYgTVBUX0RFQlVHX1NBU19XSURFCi0jZGVmaW5lIGRzYXN3aWRlcHJpbnRrKHgpIHByaW50ayB4Ci0jZWxzZQotI2RlZmluZSBkc2Fzd2lkZXByaW50ayh4KQotI2VuZGlmCi0KLQogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogCiAjZGVmaW5lIFNDU0lfU1REX1NFTlNFX0JZVEVTICAgIDE4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYwppbmRleCA1OGU2YzMxLi44OTY5NWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKQEAgLTE4MSw3ICsxODEsNyBAQAogbXB0Y3RsX3N5c2NhbGxfZG93bihNUFRfQURBUFRFUiAqaW9jLCBpbnQgbm9uYmxvY2spCiB7CiAJaW50IHJjID0gMDsKLQlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6bXB0Y3RsX3N5c2NhbGxfZG93biglcCwlZCkgY2FsbGVkXG4iLCBpb2MsIG5vbmJsb2NrKSk7CisvLwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjo6bXB0Y3RsX3N5c2NhbGxfZG93biglcCwlZCkgY2FsbGVkXG4iLCBpb2MsIG5vbmJsb2NrKSk7CiAKIAlpZiAobm9uYmxvY2spIHsKIAkJaWYgKCFtdXRleF90cnlsb2NrKCZpb2MtPmlvY3RsLT5pb2N0bF9tdXRleCkpCkBAIC0xOTAsNyArMTkwLDcgQEAKIAkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW9jLT5pb2N0bC0+aW9jdGxfbXV0ZXgpKQogCQkJcmMgPSAtRVJFU1RBUlRTWVM7CiAJfQotCWRjdGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOjptcHRjdGxfc3lzY2FsbF9kb3duIHJldHVybiAlZFxuIiwgcmMpKTsKKy8vCWRjdGxwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyBNWU5BTSAiOjptcHRjdGxfc3lzY2FsbF9kb3duIHJldHVybiAlZFxuIiwgcmMpKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIwOSwxOCArMjA5LDE5IEBACiAJdTE2IGlvY1N0YXR1czsKIAl1OCBjbWQ7CiAKLQlkY3RscHJpbnRrKCgibXB0Y3RsX3JlcGx5KCkhXG4iKSk7CiAJaWYgKHJlcSkKIAkJIGNtZCA9IHJlcS0+dS5oZHIuRnVuY3Rpb247CiAJZWxzZQogCQlyZXR1cm4gMTsKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJcdGNvbXBsZXRpbmcgbXBpIGZ1bmN0aW9uICgweCUwMlgpLCByZXE9JXAsICIKKwkgICAgInJlcGx5PSVwXG4iLCBpb2MtPm5hbWUsICByZXEtPnUuaGRyLkZ1bmN0aW9uLCByZXEsIHJlcGx5KSk7CiAKIAlpZiAoaW9jLT5pb2N0bCkgewogCiAJCWlmIChyZXBseT09TlVMTCkgewogCi0JCQlkY3RscHJpbnRrKCgibXB0Y3RsX3JlcGx5KCkgTlVMTCBSZXBseSAiCi0JCQkJIkZ1bmN0aW9uPSV4IVxuIiwgY21kKSk7CisJCQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJtcHRjdGxfcmVwbHkoKSBOVUxMIFJlcGx5ICIKKwkJCQkiRnVuY3Rpb249JXghXG4iLCBpb2MtPm5hbWUsIGNtZCkpOwogCiAJCQlpb2MtPmlvY3RsLT5zdGF0dXMgfD0gTVBUX0lPQ1RMX1NUQVRVU19DT01NQU5EX0dPT0Q7CiAJCQlpb2MtPmlvY3RsLT5yZXNldCAmPSB+TVBUQ1RMX1JFU0VUX09LOwpAQCAtMjMzLDE0ICsyMzQsOSBAQAogCiAJCX0KIAotCQlkY3RscHJpbnRrKCgibXB0Y3RsX3JlcGx5KCkgd2l0aCByZXE9JXAgIgotCQkJInJlcGx5PSVwIEZ1bmN0aW9uPSV4IVxuIiwgcmVxLCByZXBseSwgY21kKSk7Ci0KIAkJLyogQ29weSB0aGUgcmVwbHkgZnJhbWUgKHdoaWNoIG11Y2ggZXhpc3QKIAkJICogZm9yIG5vbi1TQ1NJIEkvTykgdG8gdGhlIElPQyBzdHJ1Y3R1cmUuCiAJCSAqLwotCQlkY3RscHJpbnRrKCgiQ29weWluZyBSZXBseSBGcmFtZSBAJXAgdG8gaW9jJWQhXG4iLAotCQkJcmVwbHksIGlvYy0+aWQpKTsKIAkJbWVtY3B5KGlvYy0+aW9jdGwtPlJlcGx5RnJhbWUsIHJlcGx5LAogCQkJbWluKGlvYy0+cmVwbHlfc3osIDQqcmVwbHktPnUucmVwbHkuTXNnTGVuZ3RoKSk7CiAJCWlvYy0+aW9jdGwtPnN0YXR1cyB8PSBNUFRfSU9DVExfU1RBVFVTX1JGX1ZBTElEOwpAQCAtMjUyLDggKzI0OCwyNCBAQAogCQlpZiAoaW9jU3RhdHVzICA9PSBNUElfSU9DU1RBVFVTX1NVQ0NFU1MpCiAJCQlpb2MtPmlvY3RsLT5zdGF0dXMgfD0gTVBUX0lPQ1RMX1NUQVRVU19DT01NQU5EX0dPT0Q7CiAKKwkJaWYgKGlvY1N0YXR1cyB8fCByZXBseS0+dS5yZXBseS5JT0NMb2dJbmZvKQorCQkJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiXHRpb2NzdGF0dXMgKDB4JTA0WCksICIKKwkJCQkibG9naW5mbyAoMHglMDhYKVxuIiwgaW9jLT5uYW1lLAorCQkJCWlvY1N0YXR1cywKKwkJCQlsZTMyX3RvX2NwdShyZXBseS0+dS5yZXBseS5JT0NMb2dJbmZvKSkpOworCiAJCWlmICgoY21kID09IE1QSV9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1QpIHx8CiAJCQkoY21kID09IE1QSV9GVU5DVElPTl9SQUlEX1NDU0lfSU9fUEFTU1RIUk9VR0gpKSB7CisKKwkJCWlmIChyZXBseS0+dS5zcmVwbHkuU0NTSVN0YXR1cyB8fCByZXBseS0+dS5zcmVwbHkuU0NTSVN0YXRlKQorCQkJCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJCQkJIlx0c2NzaV9zdGF0dXMgKDB4JTAyeCksIHNjc2lfc3RhdGUgKDB4JTAyeCksICIKKwkJCQkJInRhZyA9ICgweCUwNHgpLCB0cmFuc2Zlcl9jb3VudCAoMHglMDh4KVxuIiwgaW9jLT5uYW1lLAorCQkJCQlyZXBseS0+dS5zcmVwbHkuU0NTSVN0YXR1cywKKwkJCQkJcmVwbHktPnUuc3JlcGx5LlNDU0lTdGF0ZSwKKwkJCQkJbGUxNl90b19jcHUocmVwbHktPnUuc3JlcGx5LlRhc2tUYWcpLAorCQkJCQlsZTMyX3RvX2NwdShyZXBseS0+dS5zcmVwbHkuVHJhbnNmZXJDb3VudCkpKTsKKwogCQkJaW9jLT5pb2N0bC0+cmVzZXQgJj0gfk1QVENUTF9SRVNFVF9PSzsKIAogCQkJaWYgKChpb2NTdGF0dXMgPT0gTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU4pIHx8CkBAIC0yOTgsOCArMzEwLDggQEAKIHsKIAlpbnQgcmMgPSAxOwogCi0JZGN0bHByaW50aygoS0VSTl9OT1RJQ0UgTVlOQU0gIjogVGltZW91dCBFeHBpcmVkISBIb3N0ICVkXG4iLAotCQkJCWlvY3RsLT5pb2MtPmlkKSk7CisJZGN0bHByaW50ayhpb2N0bC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIjogVGltZW91dCBFeHBpcmVkISBIb3N0ICVkXG4iLAorCQkJCWlvY3RsLT5pb2MtPm5hbWUsIGlvY3RsLT5pb2MtPmlkKSk7CiAJaWYgKGlvY3RsID09IE5VTEwpCiAJCXJldHVybjsKIApAQCAtMzExLDcgKzMyMyw3IEBACiAJCS8qIElzc3VlIGEgcmVzZXQgZm9yIHRoaXMgZGV2aWNlLgogCQkgKiBUaGUgSU9DIGlzIG5vdCByZXNwb25kaW5nLgogCQkgKi8KLQkJZGN0bHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ2FsbGluZyBIYXJkUmVzZXQhIFxuIiwKKwkJZGN0bHByaW50ayhpb2N0bC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkNhbGxpbmcgSGFyZFJlc2V0ISBcbiIsCiAJCQkgaW9jdGwtPmlvYy0+bmFtZSkpOwogCQltcHRfSGFyZFJlc2V0SGFuZGxlcihpb2N0bC0+aW9jLCBDQU5fU0xFRVApOwogCX0KQEAgLTM1MCwxNCArMzYyLDE0IEBACiAJLyogU2VuZCByZXF1ZXN0CiAJICovCiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKG1wdGN0bF9pZCwgaW9jdGwtPmlvYykpID09IE5VTEwpIHsKLQkJZGN0bHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiSXNzdWVUYXNrTWdtdCwgbm8gbXNnIGZyYW1lcyEhXG4iLAorCQlkdG1wcmludGsoaW9jdGwtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJJc3N1ZVRhc2tNZ210LCBubyBtc2cgZnJhbWVzISFcbiIsCiAJCQkJaW9jdGwtPmlvYy0+bmFtZSkpOwogCiAJCW1wdGN0bF9mcmVlX3RtX2ZsYWdzKGlvY3RsLT5pb2MpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIklzc3VlVGFza01nbXQgcmVxdWVzdCBAICVwXG4iLAorCWR0bXByaW50ayhpb2N0bC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIklzc3VlVGFza01nbXQgcmVxdWVzdCBAICVwXG4iLAogCQkJaW9jdGwtPmlvYy0+bmFtZSwgbWYpKTsKIAogCXBTY3NpVG0gPSAoU0NTSVRhc2tNZ210X3QgKikgbWY7CkBAIC0zNzcsMTUgKzM4OSwxNSBAQAogCQlwU2NzaVRtLT5SZXNlcnZlZDJbaWldID0gMDsKIAogCXBTY3NpVG0tPlRhc2tNc2dDb250ZXh0ID0gMDsKLQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkdG1wcmludGsoaW9jdGwtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCSJtcHRjdGxfYnVzX3Jlc2V0OiBpc3N1ZWQuXG4iLCBpb2N0bC0+aW9jLT5uYW1lKSk7CiAKLQlEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKCh1MzIgKiltZik7CisJREJHX0RVTVBfVE1fUkVRVUVTVF9GUkFNRShpb2N0bC0+aW9jLCAodTMyICopbWYpOwogCiAJaW9jdGwtPndhaXRfZG9uZT0wOwogCWlmICgocmV0dmFsID0gbXB0X3NlbmRfaGFuZHNoYWtlX3JlcXVlc3QobXB0Y3RsX2lkLCBpb2N0bC0+aW9jLAogCSAgICAgc2l6ZW9mKFNDU0lUYXNrTWdtdF90KSwgKHUzMiopcFNjc2lUbSwgQ0FOX1NMRUVQKSkgIT0gMCkgewotCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UICJfc2VuZF9oYW5kc2hha2UgRkFJTEVEISIKKwkJZGZhaWxwcmludGsoaW9jdGwtPmlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiX3NlbmRfaGFuZHNoYWtlIEZBSUxFRCEiCiAJCQkiIChoZCAlcCwgaW9jICVwLCBtZiAlcCkgXG4iLCBoZC0+aW9jLT5uYW1lLCBoZCwKIAkJCWhkLT5pb2MsIG1mKSk7CiAJCWdvdG8gbXB0Y3RsX2J1c19yZXNldF9kb25lOwpAQCAtNDU2LDcgKzQ2OCw3IEBACiBtcHRjdGxfaW9jX3Jlc2V0KE1QVF9BREFQVEVSICppb2MsIGludCByZXNldF9waGFzZSkKIHsKIAlNUFRfSU9DVEwgKmlvY3RsID0gaW9jLT5pb2N0bDsKLQlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogSU9DICVzX3Jlc2V0IHJvdXRlZCB0byBJT0NUTCBkcml2ZXIhXG4iLAorCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIjogSU9DICVzX3Jlc2V0IHJvdXRlZCB0byBJT0NUTCBkcml2ZXIhXG4iLGlvYy0+bmFtZSwKIAkJcmVzZXRfcGhhc2U9PU1QVF9JT0NfU0VUVVBfUkVTRVQgPyAic2V0dXAiIDogKAogCQlyZXNldF9waGFzZT09TVBUX0lPQ19QUkVfUkVTRVQgPyAicHJlIiA6ICJwb3N0IikpKTsKIApAQCAtNDg3LDcgKzQ5OSw4IEBACiAKIAlldmVudCA9IGxlMzJfdG9fY3B1KHBFdlJlcGx5LT5FdmVudCkgJiAweEZGOwogCi0JZGN0bHByaW50aygoIiVzKCkgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICIlcygpIGNhbGxlZFxuIiwKKwkgICAgaW9jLT5uYW1lLCBfX0ZVTkNUSU9OX18pKTsKIAlpZihhc3luY19xdWV1ZSA9PSBOVUxMKQogCQlyZXR1cm4gMTsKIApAQCAtNDk3LDggKzUxMCwxMCBAQAogCSAqLwogCSBpZiAoZXZlbnQgPT0gMHgyMSApIHsKIAkJaW9jLT5hZW5fZXZlbnRfcmVhZF9mbGFnPTE7Ci0JCWRjdGxwcmludGsoKCJSYWlzZWQgU0lHSU8gdG8gYXBwbGljYXRpb25cbiIpKTsKLQkJZGV2dHZlcmJvc2VwcmludGsoKCJSYWlzZWQgU0lHSU8gdG8gYXBwbGljYXRpb25cbiIpKTsKKwkJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUmFpc2VkIFNJR0lPIHRvIGFwcGxpY2F0aW9uXG4iLAorCQkgICAgaW9jLT5uYW1lKSk7CisJCWRldnR2ZXJib3NlcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCSAgICAiUmFpc2VkIFNJR0lPIHRvIGFwcGxpY2F0aW9uXG4iLCBpb2MtPm5hbWUpKTsKIAkJa2lsbF9mYXN5bmMoJmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CiAJCXJldHVybiAxOwogCSB9CkBAIC01MTUsOCArNTMwLDEwIEBACiAJICovCiAJaWYgKGlvYy0+ZXZlbnRzICYmIChpb2MtPmV2ZW50VHlwZXMgJiAoIDEgPDwgZXZlbnQpKSkgewogCQlpb2MtPmFlbl9ldmVudF9yZWFkX2ZsYWc9MTsKLQkJZGN0bHByaW50aygoIlJhaXNlZCBTSUdJTyB0byBhcHBsaWNhdGlvblxuIikpOwotCQlkZXZ0dmVyYm9zZXByaW50aygoIlJhaXNlZCBTSUdJTyB0byBhcHBsaWNhdGlvblxuIikpOworCQlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCSAgICAiUmFpc2VkIFNJR0lPIHRvIGFwcGxpY2F0aW9uXG4iLCBpb2MtPm5hbWUpKTsKKwkJZGV2dHZlcmJvc2VwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJICAgICJSYWlzZWQgU0lHSU8gdG8gYXBwbGljYXRpb25cbiIsIGlvYy0+bmFtZSkpOwogCQlraWxsX2Zhc3luYygmYXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKIAl9CiAJcmV0dXJuIDE7CkBAIC01MzAsMTQgKzU0NywxMiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9jLCAmaW9jX2xpc3QsIGxpc3QpCiAJCWlvYy0+YWVuX2V2ZW50X3JlYWRfZmxhZz0wOwogCi0JZGN0bHByaW50aygoIiVzKCkgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pKTsKIAlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZXAsIG1vZGUsICZhc3luY19xdWV1ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIG1wdGN0bF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKIHsKLQlkY3RscHJpbnRrKCgiJXMoKSBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXykpOwogCXJldHVybiBmYXN5bmNfaGVscGVyKC0xLCBmaWxlcCwgMCwgJmFzeW5jX3F1ZXVlKTsKIH0KIApAQCAtNTU4LDggKzU3Myw2IEBACiAJaW50IHJldDsKIAlNUFRfQURBUFRFUiAqaW9jcCA9IE5VTEw7CiAKLQlkY3RscHJpbnRrKCgibXB0Y3RsX2lvY3RsKCkgY2FsbGVkXG4iKSk7Ci0KIAlpZiAoY29weV9mcm9tX3VzZXIoJmtoZHIsIHVoZHIsIHNpemVvZihraGRyKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczo6bXB0Y3RsX2lvY3RsKCkgQCVkIC0gIgogCQkJCSJVbmFibGUgdG8gY29weSBtcHRfaW9jdGxfaGVhZGVyIGRhdGEgQCAlcFxuIiwKQEAgLTU3NCwxMyArNTg3LDEzIEBACiAJaW9jbnVtWCA9IGtoZHIuaW9jbnVtICYgMHhGRjsKIAlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoaW9jbnVtWCwgJmlvY3ApKSA8IDApIHx8CiAJICAgIChpb2NwID09IE5VTEwpKSB7Ci0JCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX2lvY3RsKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKLQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bVgpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOjptcHRjdGxfaW9jdGwoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtWCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmICghaW9jcC0+YWN0aXZlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6Om1wdGN0bF9pb2N0bCgpIEAlZCAtIENvbnRyb2xsZXIgZGlzYWJsZWQuXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6Om1wdGN0bF9pb2N0bCgpIEAlZCAtIENvbnRyb2xsZXIgZGlzYWJsZWQuXG4iLAogCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTYxMiw4ICs2MjUsNiBAQAogCWlmICgocmV0ID0gbXB0Y3RsX3N5c2NhbGxfZG93bihpb2NwLCBub25ibG9jaykpICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlkY3RscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICI6IG1wdGN0bF9pb2N0bCgpXG4iLCBpb2NwLT5uYW1lKSk7Ci0KIAlpZiAoY21kID09IE1QVEZXRE9XTkxPQUQpCiAJCXJldCA9IG1wdGN0bF9md19kb3dubG9hZChhcmcpOwogCWVsc2UgaWYgKGNtZCA9PSBNUFRDT01NQU5EKQpAQCAtNjQ4LDggKzY1OSw2IEBACiAJc3RydWN0IG1wdF9pb2N0bF9kaWFnX3Jlc2V0IGtyaW5mbzsKIAlNUFRfQURBUFRFUgkJKmlvY3A7CiAKLQlkY3RscHJpbnRrKChLRVJOX0lORk8gIm1wdGN0bF9kb19yZXNldCBjYWxsZWQuXG4iKSk7Ci0KIAlpZiAoY29weV9mcm9tX3VzZXIoJmtyaW5mbywgdXJpbmZvLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9kaWFnX3Jlc2V0KSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2RvX3Jlc2V0IC0gIgogCQkJCSJVbmFibGUgdG8gY29weSBtcHRfaW9jdGxfZGlhZ19yZXNldCBzdHJ1Y3QgQCAlcFxuIiwKQEAgLTY1OCwxMSArNjY3LDE0IEBACiAJfQogCiAJaWYgKG1wdF92ZXJpZnlfYWRhcHRlcihrcmluZm8uaGRyLmlvY251bSwgJmlvY3ApIDwgMCkgewotCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19yZXNldCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCBrcmluZm8uaGRyLmlvY251bSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXNAJWQ6Om1wdGN0bF9kb19yZXNldCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBrcmluZm8uaGRyLmlvY251bSk7CiAJCXJldHVybiAtRU5PREVWOyAvKiAoLTYpIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KIAl9CiAKKwlkY3RscHJpbnRrKGlvY3AsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0Y3RsX2RvX3Jlc2V0IGNhbGxlZC5cbiIsCisJICAgIGlvY3AtPm5hbWUpKTsKKwogCWlmIChtcHRfSGFyZFJlc2V0SGFuZGxlcihpb2NwLCBDQU5fU0xFRVApICE9IDApIHsKIAkJcHJpbnRrIChLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19yZXNldCAtIHJlc2V0IGZhaWxlZC5cbiIsCiAJCQlfX0ZJTEVfXywgX19MSU5FX18pOwpAQCAtNjk1LDcgKzcwNyw2IEBACiAJc3RydWN0IG1wdF9md194ZmVyIF9fdXNlciAqdWZ3ZGwgPSAodm9pZCBfX3VzZXIgKikgYXJnOwogCXN0cnVjdCBtcHRfZndfeGZlcgkga2Z3ZGw7CiAKLQlkY3RscHJpbnRrKChLRVJOX0lORk8gIm1wdGN0bF9md2RsIGNhbGxlZC4gbXB0Y3RsX2lkID0gJXhoXG4iLCBtcHRjdGxfaWQpKTsgLy90YwogCWlmIChjb3B5X2Zyb21fdXNlcigma2Z3ZGwsIHVmd2RsLCBzaXplb2Yoc3RydWN0IG1wdF9md194ZmVyKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6X2lvY3RsX2Z3ZGwgLSAiCiAJCQkJIlVuYWJsZSB0byBjb3B5IG1wdF9md194ZmVyIHN0cnVjdCBAICVwXG4iLApAQCAtNzQ0LDE1ICs3NTUsOCBAQAogCXUxNgkJCSBpb2NzdGF0OwogCXBGV0Rvd25sb2FkUmVwbHlfdAkgUmVwbHlNc2cgPSBOVUxMOwogCi0JZGN0bHByaW50aygoIm1wdGN0bF9kb19md2RsIGNhbGxlZC4gbXB0Y3RsX2lkID0gJXhoLlxuIiwgbXB0Y3RsX2lkKSk7Ci0KLQlkY3RscHJpbnRrKCgiRGJHOiBrZndkbC5idWZwICA9ICVwXG4iLCB1ZndidWYpKTsKLQlkY3RscHJpbnRrKCgiRGJHOiBrZndkbC5md2xlbiA9ICVkXG4iLCAoaW50KWZ3bGVuKSk7Ci0JZGN0bHByaW50aygoIkRiRzoga2Z3ZGwuaW9jICAgPSAlMDR4aFxuIiwgaW9jKSk7Ci0KIAlpZiAobXB0X3ZlcmlmeV9hZGFwdGVyKGlvYywgJmlvY3ApIDwgMCkgewotCQlkY3RscHJpbnRrKCgiaW9jdGxfZndkbCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJIGlvYykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaW9jdGxfZndkbCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCQkJCSBpb2MpOwogCQlyZXR1cm4gLUVOT0RFVjsgLyogKC02KSBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCiAJfSBlbHNlIHsKIApAQCAtNzYxLDYgKzc2NSwxNiBAQAogCQlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0Y3RsX2lkLCBpb2NwKSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUFHQUlOOwogCX0KKworCWRjdGxwcmludGsoaW9jcCwgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJICAgICJtcHRjdGxfZG9fZndkbCBjYWxsZWQuIG1wdGN0bF9pZCA9ICV4aC5cbiIsIGlvY3AtPm5hbWUsIG1wdGN0bF9pZCkpOworCWRjdGxwcmludGsoaW9jcCwgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJEYkc6IGtmd2RsLmJ1ZnAgID0gJXBcbiIsCisJICAgIGlvY3AtPm5hbWUsIHVmd2J1ZikpOworCWRjdGxwcmludGsoaW9jcCwgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJEYkc6IGtmd2RsLmZ3bGVuID0gJWRcbiIsCisJICAgIGlvY3AtPm5hbWUsIChpbnQpZndsZW4pKTsKKwlkY3RscHJpbnRrKGlvY3AsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiRGJHOiBrZndkbC5pb2MgICA9ICUwNHhoXG4iLAorCSAgICBpb2NwLT5uYW1lLCBpb2MpKTsKKwogCWRsbXNnID0gKEZXRG93bmxvYWRfdCopIG1mOwogCXB0c2dlID0gKEZXRG93bmxvYWRUQ1NHRV90ICopICZkbG1zZy0+U0dMOwogCXNnT3V0ID0gKGNoYXIgKikgKHB0c2dlICsgMSk7CkBAIC04MjksNyArODQzLDggQEAKIAkJZ290byBmd2RsX291dDsKIAl9CiAKLQlkY3RscHJpbnRrKCgiRGJHOiBzZ2wgYnVmZmVyICA9ICVwLCBzZ2ZyYWdzID0gJWRcbiIsIHNnbCwgbnVtZnJhZ3MpKTsKKwlkY3RscHJpbnRrKGlvY3AsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiRGJHOiBzZ2wgYnVmZmVyID0gJXAsIHNnZnJhZ3MgPSAlZFxuIiwKKwkgICAgaW9jcC0+bmFtZSwgc2dsLCBudW1mcmFncykpOwogCiAJLyoKIAkgKiBQYXJzZSBTRyBsaXN0LCBjb3B5aW5nIHNnbCBpdHNlbGYsCkBAIC04NjUsMTUgKzg4MCw3IEBACiAJCXNnT3V0ICs9IChzaXplb2YoZG1hX2FkZHJfdCkgKyBzaXplb2YodTMyKSk7CiAJfQogCi0jaWZkZWYgTVBUX0RFQlVHCi0JewotCQl1MzIgKm0gPSAodTMyICopbWY7Ci0JCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRi9XIGRvd25sb2FkIHJlcXVlc3Q6XG4iIEtFUk5fSU5GTyAiICIpOwotCQlmb3IgKGk9MDsgaSA8IDcrbnVtZnJhZ3MqMjsgaSsrKQotCQkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1baV0pKTsKLQkJcHJpbnRrKCJcbiIpOwotCX0KLSNlbmRpZgorCURCR19EVU1QX0ZXX0RPV05MT0FEKGlvY3AsICh1MzIgKiltZiwgbnVtZnJhZ3MpOwogCiAJLyoKIAkgKiBGaW5hbGx5LCBwZXJmb3JtIGZpcm13YXJlIGRvd25sb2FkLgpAQCAtMTA0OSwxMyArMTA1NiwxMSBAQAogCSpmcmFncyA9IG51bWZyYWdzOwogCSpibHAgPSBidWZsaXN0OwogCi0JZGN0bHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICItU0c6IGtidWZfYWxsb2NfMl9zZ2woKSAtICIKLQkJCSAgICIlZCBTRyBmcmFncyBnZW5lcmF0ZWQhXG4iLAotCQkJICAgbnVtZnJhZ3MpKTsKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICItU0c6IGtidWZfYWxsb2NfMl9zZ2woKSAtICIKKwkgICAiJWQgU0cgZnJhZ3MgZ2VuZXJhdGVkIVxuIiwgaW9jLT5uYW1lLCBudW1mcmFncykpOwogCi0JZGN0bHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICItU0c6IGtidWZfYWxsb2NfMl9zZ2woKSAtICIKLQkJCSAgICJsYXN0IChiaWcpIGFsbG9jX3N6PSVkXG4iLAotCQkJICAgYWxsb2Nfc3opKTsKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICItU0c6IGtidWZfYWxsb2NfMl9zZ2woKSAtICIKKwkgICAibGFzdCAoYmlnKSBhbGxvY19zej0lZFxuIiwgaW9jLT5uYW1lLCBhbGxvY19zeikpOwogCiAJcmV0dXJuIHNnbGJ1ZjsKIApAQCAtMTEzOSw3ICsxMTQ0LDggQEAKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIE1BWF9TR0xfQllURVMsIHNnbCwgc2dsX2RtYSk7CiAJa2ZyZWUoYnVmbGlzdCk7Ci0JZGN0bHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICItU0c6IEZyZWUnZCAxIFNHTCBidWYgKyAlZCBrYnVmcyFcbiIsIG4pKTsKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICItU0c6IEZyZWUnZCAxIFNHTCBidWYgKyAlZCBrYnVmcyFcbiIsCisJICAgIGlvYy0+bmFtZSwgbikpOwogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCkBAIC0xMTY2LDcgKzExNzIsNiBAQAogCXN0cnVjdCBzY3NpX2RldmljZSAJKnNkZXY7CiAJVmlydERldmljZQkJKnZkZXY7CiAKLQlkY3RscHJpbnRrKCgiOiBtcHRjdGxfZ2V0aW9jaW5mbyBjYWxsZWQuXG4iKSk7CiAJLyogQWRkIG9mIFBDSSBJTkZPIHJlc3VsdHMgaW4gdW5hbGlnbmVkIGFjY2VzcyBmb3IKIAkgKiBJQTY0IGFuZCBTcGFyYy4gUmVzZXQgbG9uZyB0byBpbnQuIFJldHVybiBubyBQQ0kKIAkgKiBkYXRhIGZvciBvYnNvbGV0ZSBmb3JtYXQuCkBAIC0xMTk5LDggKzEyMDQsOCBAQAogCiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmctPmhkci5pb2NudW0sICZpb2MpKSA8IDApIHx8CiAJICAgIChpb2MgPT0gTlVMTCkpIHsKLQkJZGN0bHByaW50aygoS0VSTl9FUlIgIiVzOjptcHRjdGxfZ2V0aW9jaW5mbygpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOjptcHRjdGxfZ2V0aW9jaW5mbygpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pOwogCQlrZnJlZShrYXJnKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTIxNCw2ICsxMjE5LDkgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0Y3RsX2dldGlvY2luZm8gY2FsbGVkLlxuIiwKKwkgICAgaW9jLT5uYW1lKSk7CisKIAkvKiBGaWxsIGluIHRoZSBkYXRhIGFuZCByZXR1cm4gdGhlIHN0cnVjdHVyZSB0byB0aGUgY2FsbGluZwogCSAqIHByb2dyYW0KIAkgKi8KQEAgLTEzMjAsNyArMTMyOCw2IEBACiAJdTgJCQlwb3J0OwogCXN0cnVjdCBzY3NpX2RldmljZSAJKnNkZXY7CiAKLQlkY3RscHJpbnRrKCgibXB0Y3RsX2dldHRhcmdldGluZm8gY2FsbGVkLlxuIikpOwogCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZywgdWFyZywgc2l6ZW9mKHN0cnVjdCBtcHRfaW9jdGxfdGFyZ2V0aW5mbykpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9nZXR0YXJnZXRpbmZvIC0gIgogCQkJIlVuYWJsZSB0byByZWFkIGluIG1wdF9pb2N0bF90YXJnZXRpbmZvIHN0cnVjdCBAICVwXG4iLApAQCAtMTMzMCwxMSArMTMzNywxMyBAQAogCiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKIAkgICAgKGlvYyA9PSBOVUxMKSkgewotCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9nZXR0YXJnZXRpbmZvKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKLQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6Om1wdGN0bF9nZXR0YXJnZXRpbmZvKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIm1wdGN0bF9nZXR0YXJnZXRpbmZvIGNhbGxlZC5cbiIsCisJICAgIGlvYy0+bmFtZSkpOwogCS8qIEdldCB0aGUgcG9ydCBudW1iZXIgYW5kIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMKIAkgKiBpbiB0aGUgcmV0dXJuZWQgc3RydWN0dXJlLgogCSAqIElnbm9yZSB0aGUgcG9ydCBzZXR0aW5nLgpAQCAtMTQzNCw3ICsxNDQzLDYgQEAKIAlNUFRfQURBUFRFUiAqaW9jOwogCWludCBpb2NudW07CiAKLQlkY3RscHJpbnRrKCgibXB0Y3RsX3JlYWR0ZXN0IGNhbGxlZC5cbiIpKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoJmthcmcsIHVhcmcsIHNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX3Rlc3QpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfcmVhZHRlc3QgLSAiCiAJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX3Rlc3Qgc3RydWN0IEAgJXBcbiIsCkBAIC0xNDQ0LDExICsxNDUyLDEzIEBACiAKIAlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAogCSAgICAoaW9jID09IE5VTEwpKSB7Ci0JCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX3JlYWR0ZXN0KCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKLQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6Om1wdGN0bF9yZWFkdGVzdCgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlkY3RscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJtcHRjdGxfcmVhZHRlc3QgY2FsbGVkLlxuIiwKKwkgICAgaW9jLT5uYW1lKSk7CiAJLyogRmlsbCBpbiB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGNhbGxpbmcKIAkgKiBwcm9ncmFtCiAJICovCkBAIC0xNDk0LDcgKzE1MDQsNiBAQAogCU1QVF9BREFQVEVSICppb2M7CiAJaW50IGlvY251bTsKIAotCWRjdGxwcmludGsoKCJtcHRjdGxfZXZlbnRxdWVyeSBjYWxsZWQuXG4iKSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9ldmVudHF1ZXJ5KSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2V2ZW50cXVlcnkgLSAiCiAJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX2V2ZW50cXVlcnkgc3RydWN0IEAgJXBcbiIsCkBAIC0xNTA0LDExICsxNTEzLDEzIEBACiAKIAlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAogCSAgICAoaW9jID09IE5VTEwpKSB7Ci0JCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX2V2ZW50cXVlcnkoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAotCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczo6bXB0Y3RsX2V2ZW50cXVlcnkoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0Y3RsX2V2ZW50cXVlcnkgY2FsbGVkLlxuIiwKKwkgICAgaW9jLT5uYW1lKSk7CiAJa2FyZy5ldmVudEVudHJpZXMgPSBNUFRDVExfRVZFTlRfTE9HX1NJWkU7CiAJa2FyZy5ldmVudFR5cGVzID0gaW9jLT5ldmVudFR5cGVzOwogCkBAIC0xNTMyLDcgKzE1NDMsNiBAQAogCU1QVF9BREFQVEVSICppb2M7CiAJaW50IGlvY251bTsKIAotCWRjdGxwcmludGsoKCJtcHRjdGxfZXZlbnRlbmFibGUgY2FsbGVkLlxuIikpOwogCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZywgdWFyZywgc2l6ZW9mKHN0cnVjdCBtcHRfaW9jdGxfZXZlbnRlbmFibGUpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZXZlbnRlbmFibGUgLSAiCiAJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX2V2ZW50ZW5hYmxlIHN0cnVjdCBAICVwXG4iLApAQCAtMTU0MiwxMSArMTU1MiwxMyBAQAogCiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKIAkgICAgKGlvYyA9PSBOVUxMKSkgewotCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9ldmVudGVuYWJsZSgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOjptcHRjdGxfZXZlbnRlbmFibGUoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0Y3RsX2V2ZW50ZW5hYmxlIGNhbGxlZC5cbiIsCisJICAgIGlvYy0+bmFtZSkpOwogCWlmIChpb2MtPmV2ZW50cyA9PSBOVUxMKSB7CiAJCS8qIEhhdmUgbm90IHlldCBhbGxvY2F0ZWQgbWVtb3J5IC0gZG8gc28gbm93LgogCQkgKi8KQEAgLTE1NzksNyArMTU5MSw2IEBACiAJaW50CQkJIGlvY251bTsKIAlpbnQJCQkgbnVtQnl0ZXMsIG1heEV2ZW50cywgbWF4OwogCi0JZGN0bHByaW50aygoIm1wdGN0bF9ldmVudHJlcG9ydCBjYWxsZWQuXG4iKSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9ldmVudHJlcG9ydCkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9ldmVudHJlcG9ydCAtICIKIAkJCSJVbmFibGUgdG8gcmVhZCBpbiBtcHRfaW9jdGxfZXZlbnRyZXBvcnQgc3RydWN0IEAgJXBcbiIsCkBAIC0xNTg5LDEwICsxNjAwLDEyIEBACiAKIAlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAogCSAgICAoaW9jID09IE5VTEwpKSB7Ci0JCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX2V2ZW50cmVwb3J0KCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKLQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6Om1wdGN0bF9ldmVudHJlcG9ydCgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0Y3RsX2V2ZW50cmVwb3J0IGNhbGxlZC5cbiIsCisJICAgIGlvYy0+bmFtZSkpOwogCiAJbnVtQnl0ZXMgPSBrYXJnLmhkci5tYXhEYXRhU2l6ZSAtIHNpemVvZihtcHRfaW9jdGxfaGVhZGVyKTsKIAltYXhFdmVudHMgPSBudW1CeXRlcy9zaXplb2YoTVBUX0lPQ1RMX0VWRU5UUyk7CkBAIC0xNjMyLDcgKzE2NDUsNiBAQAogCWludAkJCSBpb2NudW07CiAJaW50CQkJIG5ld0Z3U2l6ZTsKIAotCWRjdGxwcmludGsoKCJtcHRjdGxfcmVwbGFjZV9mdyBjYWxsZWQuXG4iKSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9yZXBsYWNlX2Z3KSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX3JlcGxhY2VfZncgLSAiCiAJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX3JlcGxhY2VfZncgc3RydWN0IEAgJXBcbiIsCkBAIC0xNjQyLDExICsxNjU0LDEzIEBACiAKIAlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAogCSAgICAoaW9jID09IE5VTEwpKSB7Ci0JCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX3JlcGxhY2VfZncoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAotCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczo6bXB0Y3RsX3JlcGxhY2VfZncoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJZGN0bHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAibXB0Y3RsX3JlcGxhY2VfZncgY2FsbGVkLlxuIiwKKwkgICAgaW9jLT5uYW1lKSk7CiAJLyogSWYgY2FjaGluZyBGVywgRnJlZSB0aGUgb2xkIEZXIGltYWdlCiAJICovCiAJaWYgKGlvYy0+Y2FjaGVkX2Z3ID09IE5VTEwpCkBAIC0xNzA0LDcgKzE3MTgsNiBAQAogCWludAkJaW9jbnVtOwogCWludAkJcmM7CiAKLQlkY3RscHJpbnRrKCgibXB0Y3RsX2NvbW1hbmQgY2FsbGVkLlxuIikpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9jb21tYW5kKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX21wdF9jb21tYW5kIC0gIgpAQCAtMTcxNSw4ICsxNzI4LDggQEAKIAogCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NudW0sICZpb2MpKSA8IDApIHx8CiAJICAgIChpb2MgPT0gTlVMTCkpIHsKLQkJZGN0bHByaW50aygoS0VSTl9FUlIgIiVzOjptcHRjdGxfbXB0X2NvbW1hbmQoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAotCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczo6bXB0Y3RsX21wdF9jb21tYW5kKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTc1NiwxMyArMTc2OSwxMiBAQAogCXVsb25nIAkJdGltZW91dDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAKLQlkY3RscHJpbnRrKCgibXB0Y3RsX2RvX21wdF9jb21tYW5kIGNhbGxlZC5cbiIpKTsKIAlidWZJbi5rcHRyID0gYnVmT3V0LmtwdHIgPSBOVUxMOwogCiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKIAkgICAgKGlvYyA9PSBOVUxMKSkgewotCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9kb19tcHRfY29tbWFuZCgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmICghaW9jLT5pb2N0bCkgewpAQCAtMTgxNiw2ICsxODI4LDkgQEAKIAogCS8qIFZlcmlmeSB0aGF0IHRoaXMgcmVxdWVzdCBpcyBhbGxvd2VkLgogCSAqLworCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgInNlbmRpbmcgbXBpIGZ1bmN0aW9uICgweCUwMlgpLCByZXE9JXBcbiIsCisJICAgIGlvYy0+bmFtZSwgaGRyLT5GdW5jdGlvbiwgbWYpKTsKKwogCXN3aXRjaCAoaGRyLT5GdW5jdGlvbikgewogCWNhc2UgTVBJX0ZVTkNUSU9OX0lPQ19GQUNUUzoKIAljYXNlIE1QSV9GVU5DVElPTl9QT1JUX0ZBQ1RTOgpAQCAtMTgyMyw2ICsxODM4LDE4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNUElfRlVOQ1RJT05fQ09ORklHOgorCXsKKwkJQ29uZmlnX3QgKmNvbmZpZ19mcmFtZTsKKwkJY29uZmlnX2ZyYW1lID0gKENvbmZpZ190ICopbWY7CisJCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlx0dHlwZT0weCUwMnggZXh0X3R5cGU9MHglMDJ4ICIKKwkJICAgICJudW1iZXI9MHglMDJ4IGFjdGlvbj0weCUwMnhcbiIsIGlvYy0+bmFtZSwKKwkJICAgIGNvbmZpZ19mcmFtZS0+SGVhZGVyLlBhZ2VUeXBlLAorCQkgICAgY29uZmlnX2ZyYW1lLT5FeHRQYWdlVHlwZSwKKwkJICAgIGNvbmZpZ19mcmFtZS0+SGVhZGVyLlBhZ2VOdW1iZXIsCisJCSAgICBjb25maWdfZnJhbWUtPkFjdGlvbikpOworCQlicmVhazsKKwl9CisKIAljYXNlIE1QSV9GVU5DVElPTl9GQ19DT01NT05fVFJBTlNQT1JUX1NFTkQ6CiAJY2FzZSBNUElfRlVOQ1RJT05fRkNfRVhfTElOS19TUlZDX1NFTkQ6CiAJY2FzZSBNUElfRlVOQ1RJT05fRldfVVBMT0FEOgpAQCAtMjE1OCwxMiArMjE4NSwxMiBAQAogCWlvYy0+aW9jdGwtPndhaXRfZG9uZSA9IDA7CiAJaWYgKGhkci0+RnVuY3Rpb24gPT0gTVBJX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UKSB7CiAKLQkJREJHX0RVTVBfVE1fUkVRVUVTVF9GUkFNRSgodTMyICopbWYpOworCQlEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKGlvYywgKHUzMiAqKW1mKTsKIAogCQlpZiAobXB0X3NlbmRfaGFuZHNoYWtlX3JlcXVlc3QobXB0Y3RsX2lkLCBpb2MsCiAJCQlzaXplb2YoU0NTSVRhc2tNZ210X3QpLCAodTMyKiltZiwKIAkJCUNBTl9TTEVFUCkgIT0gMCkgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAiX3NlbmRfaGFuZHNoYWtlIEZBSUxFRCEiCisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0VSUl9GTVQgIl9zZW5kX2hhbmRzaGFrZSBGQUlMRUQhIgogCQkJCSIgKGlvYyAlcCwgbWYgJXApIFxuIiwgaW9jLT5uYW1lLAogCQkJCWlvYywgbWYpKTsKIAkJCW1wdGN0bF9mcmVlX3RtX2ZsYWdzKGlvYyk7CkBAIC0yMzAzLDcgKzIzMzAsNiBAQAogCU1QVF9GUkFNRV9IRFIJCSptZiA9IE5VTEw7CiAJTVBJSGVhZGVyX3QJCSptcGlfaGRyOwogCi0JZGN0bHByaW50aygoIjogbXB0Y3RsX2hwX2hvc3RpbmZvIGNhbGxlZC5cbiIpKTsKIAkvKiBSZXNldCBsb25nIHRvIGludC4gU2hvdWxkIGFmZmVjdCBJQTY0IGFuZCBTUEFSQyBvbmx5CiAJICovCiAJaWYgKGRhdGFfc2l6ZSA9PSBzaXplb2YoaHBfaG9zdF9pbmZvX3QpKQpAQCAtMjMyMiwxMCArMjM0OCwxMiBAQAogCiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKIAkgICAgKGlvYyA9PSBOVUxMKSkgewotCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9ocF9ob3N0aW5mbygpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOjptcHRjdGxfaHBfaG9zdGluZm8oKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIjogbXB0Y3RsX2hwX2hvc3RpbmZvIGNhbGxlZC5cbiIsCisJICAgIGlvYy0+bmFtZSkpOwogCiAJLyogRmlsbCBpbiB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGNhbGxpbmcKIAkgKiBwcm9ncmFtCkBAIC0yNDQxLDcgKzI0NjksNyBAQAogCSAqIEdhdGhlciBJU1RXSShJbmR1c3RyeSBTdGFuZGFyZCBUd28gV2lyZSBJbnRlcmZhY2UpIERhdGEKIAkgKi8KIAlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0Y3RsX2lkLCBpb2MpKSA9PSBOVUxMKSB7Ci0JCWRmYWlscHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICIlcywgbm8gbXNnIGZyYW1lcyEhXG4iLAorCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICIlcywgbm8gbXNnIGZyYW1lcyEhXG4iLAogCQkgICAgaW9jLT5uYW1lLF9fRlVOQ1RJT05fXykpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yNDc0LDcgKzI1MDIsNyBAQAogCSAgICAgSFoqTVBUX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCAvKiAxMCBzZWMgKi8pOwogCiAJaWYocmMgPD0wICYmIChpb2MtPmlvY3RsLT53YWl0X2RvbmUgIT0gMSApKSB7Ci0JCS8qIAorCQkvKgogCQkgKiBOb3cgd2UgbmVlZCB0byByZXNldCB0aGUgYm9hcmQKIAkJICovCiAJCW1wdF9mcmVlX21zZ19mcmFtZShpb2MsIG1mKTsKQEAgLTI0ODIsNyArMjUxMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIAorCS8qCiAJICpJU1RXSSBEYXRhIERlZmluaXRpb24KIAkgKiBwYnVmWzBdID0gRldfVkVSU0lPTiA9IDB4NAogCSAqIHBidWZbMV0gPSBCYXkgQ291bnQgPSA2IG9yIDQgb3IgMiwgZGVwZW5kaW5nIG9uCkBAIC0yNTM4LDcgKzI1NjYsNiBAQAogCUNvbmZpZ1BhZ2VIZWFkZXJfdAloZHI7CiAJaW50CQkJdG1wLCBucCwgcmMgPSAwOwogCi0JZGN0bHByaW50aygoIjogbXB0Y3RsX2hwX3RhcmdldGluZm8gY2FsbGVkLlxuIikpOwogCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZywgdWFyZywgc2l6ZW9mKGhwX3RhcmdldF9pbmZvX3QpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfaHBfdGFyZ2V0aW5mbyAtICIKIAkJCSJVbmFibGUgdG8gcmVhZCBpbiBocF9ob3N0X3RhcmdldGluZm8gc3RydWN0IEAgJXBcbiIsCkBAIC0yNTQ4LDEwICsyNTc1LDEyIEBACiAKIAlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAogCQkoaW9jID09IE5VTEwpKSB7Ci0JCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX2hwX3RhcmdldGluZm8oKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAotCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczo6bXB0Y3RsX2hwX3RhcmdldGluZm8oKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCWRjdGxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIjogbXB0Y3RsX2hwX3RhcmdldGluZm8gY2FsbGVkLlxuIiwKKwkgICAgaW9jLT5uYW1lKSk7CiAKIAkvKiAgVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgRkNQIHBhcnRzLgogCSAqLwpAQCAtMjY5NCw3ICsyNzIzLDYgQEAKIAlpbnQgbm9uYmxvY2sgPSAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogCWludCByZXQ7CiAKLQlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6Y29tcGF0X21wdGZ3eGZlcl9pb2N0bCgpIGNhbGxlZFxuIikpOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZrZnczMiwgKGNoYXIgX191c2VyICopYXJnLCBzaXplb2Yoa2Z3MzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yNzAzLDE0ICsyNzMxLDE2IEBACiAJaW9jbnVtWCA9IGtmdzMyLmlvY251bSAmIDB4RkY7CiAJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGlvY251bVgsICZpb2NwKSkgPCAwKSB8fAogCSAgICAoaW9jcCA9PSBOVUxMKSkgewotCQlkY3RscHJpbnRrKChLRVJOX0VSUiBNWU5BTSAiOjpjb21wYXRfbXB0Znd4ZmVyX2lvY3RsIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19MSU5FX18sIGlvY251bVgpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjo6Y29tcGF0X21wdGZ3eGZlcl9pb2N0bCBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fTElORV9fLCBpb2NudW1YKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKChyZXQgPSBtcHRjdGxfc3lzY2FsbF9kb3duKGlvY3AsIG5vbmJsb2NrKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAorCWRjdGxwcmludGsoaW9jcCwgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJjb21wYXRfbXB0Znd4ZmVyX2lvY3RsKCkgY2FsbGVkXG4iLAorCSAgICBpb2NwLT5uYW1lKSk7CiAJa2Z3LmlvY251bSA9IGlvY251bTsKIAlrZncuZndsZW4gPSBrZnczMi5md2xlbjsKIAlrZncuYnVmcCA9IGNvbXBhdF9wdHIoa2Z3MzIuYnVmcCk7CkBAIC0yNzM0LDggKzI3NjQsNiBAQAogCWludCBub25ibG9jayA9IChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAJaW50IHJldDsKIAotCWRjdGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOjpjb21wYXRfbXB0X2NvbW1hbmQoKSBjYWxsZWRcbiIpKTsKLQogCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZzMyLCAoY2hhciBfX3VzZXIgKilhcmcsIHNpemVvZihrYXJnMzIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTI3NDMsMTQgKzI3NzEsMTYgQEAKIAlpb2NudW1YID0ga2FyZzMyLmhkci5pb2NudW0gJiAweEZGOwogCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihpb2NudW1YLCAmaW9jcCkpIDwgMCkgfHwKIAkgICAgKGlvY3AgPT0gTlVMTCkpIHsKLQkJZGN0bHByaW50aygoS0VSTl9FUlIgTVlOQU0gIjo6Y29tcGF0X21wdF9jb21tYW5kIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCi0JCQkJX19MSU5FX18sIGlvY251bVgpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjo6Y29tcGF0X21wdF9jb21tYW5kIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19MSU5FX18sIGlvY251bVgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoKHJldCA9IG1wdGN0bF9zeXNjYWxsX2Rvd24oaW9jcCwgbm9uYmxvY2spKSAhPSAwKQogCQlyZXR1cm4gcmV0OwogCisJZGN0bHByaW50ayhpb2NwLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgImNvbXBhdF9tcHRfY29tbWFuZCgpIGNhbGxlZFxuIiwKKwkgICAgaW9jcC0+bmFtZSkpOwogCS8qIENvcHkgZGF0YSB0byBrYXJnICovCiAJa2FyZy5oZHIuaW9jbnVtID0ga2FyZzMyLmhkci5pb2NudW07CiAJa2FyZy5oZHIucG9ydCA9IGthcmczMi5oZHIucG9ydDsKQEAgLTI4NzgsMTEgKzI5MDgsNyBAQAogCiAJc2hvd19tcHRtb2RfdmVyKG15X05BTUUsIG15X1ZFUlNJT04pOwogCi0JaWYobXB0X2RldmljZV9kcml2ZXJfcmVnaXN0ZXIoJm1wdGN0bF9kcml2ZXIsCi0JICBNUFRDVExfRFJJVkVSKSAhPSAwICkgewotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KLQkJIjogZmFpbGVkIHRvIHJlZ2lzdGVyIGRkIGNhbGxiYWNrc1xuIikpOwotCX0KKwltcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlcigmbXB0Y3RsX2RyaXZlciwgTVBUQ1RMX0RSSVZFUik7CiAKIAkvKiBSZWdpc3RlciB0aGlzIGRldmljZSAqLwogCWVyciA9IG1pc2NfcmVnaXN0ZXIoJm1wdGN0bF9taXNjZGV2KTsKQEAgLTI5MDUsMTYgKzI5MzEsOCBAQAogCQlnb3RvIG91dF9mYWlsOwogCX0KIAotCWlmIChtcHRfcmVzZXRfcmVnaXN0ZXIobXB0Y3RsX2lkLCBtcHRjdGxfaW9jX3Jlc2V0KSA9PSAwKSB7Ci0JCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBSZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOwotCX0gZWxzZSB7Ci0JCS8qIEZJWE1FISAqLwotCX0KLQotCWlmIChtcHRfZXZlbnRfcmVnaXN0ZXIobXB0Y3RsX2lkLCBtcHRjdGxfZXZlbnRfcHJvY2VzcykgPT0gMCkgewotCQlkZXZ0dmVyYm9zZXByaW50aygoS0VSTl9JTkZPIE1ZTkFNCi0JCSAgIjogUmVnaXN0ZXJlZCBmb3IgSU9DIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiIpKTsKLQl9CisJbXB0X3Jlc2V0X3JlZ2lzdGVyKG1wdGN0bF9pZCwgbXB0Y3RsX2lvY19yZXNldCk7CisJbXB0X2V2ZW50X3JlZ2lzdGVyKG1wdGN0bF9pZCwgbXB0Y3RsX2V2ZW50X3Byb2Nlc3MpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI5MzQsMTEgKzI5NTIsOSBAQAogCiAJLyogRGUtcmVnaXN0ZXIgcmVzZXQgaGFuZGxlciBmcm9tIGJhc2UgbW9kdWxlICovCiAJbXB0X3Jlc2V0X2RlcmVnaXN0ZXIobXB0Y3RsX2lkKTsKLQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogRGVyZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOwogCiAJLyogRGUtcmVnaXN0ZXIgY2FsbGJhY2sgaGFuZGxlciBmcm9tIGJhc2UgbW9kdWxlICovCiAJbXB0X2RlcmVnaXN0ZXIobXB0Y3RsX2lkKTsKLQlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IERlcmVnaXN0ZXJlZCBmcm9tIEZ1c2lvbiBNUFQgYmFzZSBkcml2ZXJcbiIpOwogCiAgICAgICAgIG1wdF9kZXZpY2VfZHJpdmVyX2RlcmVnaXN0ZXIoTVBUQ1RMX0RSSVZFUik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZGVidWcuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRiMGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRkZWJ1Zy5oCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZGVidWcuaAorICogICAgICBGb3IgdXNlIHdpdGggTFNJIFBDSSBjaGlwL2FkYXB0ZXIocykKKyAqICAgICAgcnVubmluZyBMU0kgRnVzaW9uIE1QVCAoTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kpIGZpcm13YXJlLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBMU0kgQ29ycG9yYXRpb24KKyAqICAobWFpbHRvOkRMLU1QVEZ1c2lvbkxpbnV4QGxzaS5jb20pCisgKgorICovCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKKyNpZm5kZWYgTVBUREVCVUdfSF9JTkNMVURFRAorI2RlZmluZSBNUFRERUJVR19IX0lOQ0xVREVECisKKy8qCisgKiBkZWJ1ZyBsZXZlbCBjYW4gYmUgcHJvZ3JhbW1lZCBvbiB0aGUgZmx5IHZpYSBTeXNGUyAoaGV4IHZhbHVlcykKKyAqCisgKiBFeGFtcGxlOiAgKHByb2dyYW1taW5nIGZvciBNUFRfREVCVUdfRVZFTlRTIG9uIGhvc3QgNSkKKyAqCisgKiBlY2hvIDggPiAvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0NS9kZWJ1Z19sZXZlbAorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtcHRfZGVidWdfbGV2ZWwgLSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCisgKiB0aGlzIGFsbG93IGVuYWJsaW5nIGRlYnVnIGF0IGRyaXZlciBsb2FkIHRpbWUgKGZvciBhbGwgaW9jcykKKyAqCisgKiBFeGFtcGxlICAocHJvZ3JhbW1pbmcgZm9yIE1QVF9ERUJVR19FVkVOVFMpCisgKgorICogaW5zbW9kIG1wdGJhc2Uua28gbXB0X2RlYnVnX2xldmVsPTgKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ09ORklHX0ZVU0lPTl9MT0dHSU5HIC0gZW5hYmxlcyBjb21waWxpbmcgZGVidWcgaW50byBkcml2ZXIKKyAqIHRoaXMgY2FuIGJlIGVuYWJsZWQgaW4gdGhlIGRyaXZlciBNYWtlZmlsZQorICoKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGxlYXNlIG5vdGUgbW9zdCBkZWJ1ZyBwcmludHMgYXJlIHNldCB0byBsb2dnaW5nIHByaW9yaXR5ID0gZGVidWcKKyAqIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCwgYW5kIG1vc3QgdmVyYm9zZS4gIFBsZWFzZSByZWZlciB0byBtYW51YWwKKyAqIHBhZ2VzIGZvciBzeXNsb2dkIG9yIHN5c2xvZ2Qtbmcgb24gaG93IHRvIGNvbmZpZ3VyZSB0aGlzLgorICovCisKKyNkZWZpbmUgTVBUX0RFQlVHCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNUFRfREVCVUdfTVNHX0ZSQU1FCQkweDAwMDAwMDAyCisjZGVmaW5lIE1QVF9ERUJVR19TRwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTVBUX0RFQlVHX0VWRU5UUwkJMHgwMDAwMDAwOAorI2RlZmluZSBNUFRfREVCVUdfVkVSQk9TRV9FVkVOVFMJMHgwMDAwMDAxMAorI2RlZmluZSBNUFRfREVCVUdfSU5JVAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTVBUX0RFQlVHX0VYSVQJCQkweDAwMDAwMDQwCisjZGVmaW5lIE1QVF9ERUJVR19GQUlMCQkJMHgwMDAwMDA4MAorI2RlZmluZSBNUFRfREVCVUdfVE0JCQkweDAwMDAwMTAwCisjZGVmaW5lIE1QVF9ERUJVR19EVgkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTVBUX0RFQlVHX1JFUExZCQkJMHgwMDAwMDQwMAorI2RlZmluZSBNUFRfREVCVUdfSEFORFNIQUtFCQkweDAwMDAwODAwCisjZGVmaW5lIE1QVF9ERUJVR19DT05GSUcJCTB4MDAwMDEwMDAKKyNkZWZpbmUgTVBUX0RFQlVHX0RMCQkJMHgwMDAwMjAwMAorI2RlZmluZSBNUFRfREVCVUdfUkVTRVQJCQkweDAwMDA4MDAwCisjZGVmaW5lIE1QVF9ERUJVR19TQ1NJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBNUFRfREVCVUdfSU9DVEwJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1QVF9ERUJVR19GQwkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTVBUX0RFQlVHX1NBUwkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTVBUX0RFQlVHX1NBU19XSURFCQkweDAwMjAwMDAwCisKKy8qCisgKiBDT05GSUdfRlVTSU9OX0xPR0dJTkcgLSBlbmFibGVkIGluIEtjb25maWcKKyAqLworCisjaWZkZWYgQ09ORklHX0ZVU0lPTl9MT0dHSU5HCisjZGVmaW5lIE1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBCSVRTKQkJCVwKK3sJCQkJCQkJCVwKKwlpZiAoSU9DLT5kZWJ1Z19sZXZlbCAmIEJJVFMpCQkJCVwKKwkJQ01EOwkJCQkJCVwKK30KKyNlbHNlCisjZGVmaW5lIE1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBCSVRTKQorI2VuZGlmCisKKworLyoKKyAqIGRlYnVnIG1hY3JvcworICovCisKKyNkZWZpbmUgZHByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVRykKKworI2RlZmluZSBkc2dwcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfU0cpCisKKyNkZWZpbmUgZGV2dHByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19FVkVOVFMpCisKKyNkZWZpbmUgZGV2dHZlcmJvc2VwcmludGsoSU9DLCBDTUQpCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19WRVJCT1NFX0VWRU5UUykKKworI2RlZmluZSBkaW5pdHByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19JTklUKQorCisjZGVmaW5lIGRleGl0cHJpbnRrKElPQywgQ01EKQkJCVwKKwlNUFRfQ0hFQ0tfTE9HR0lORyhJT0MsIENNRCwgTVBUX0RFQlVHX0VYSVQpCisKKyNkZWZpbmUgZGZhaWxwcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfRkFJTCkKKworI2RlZmluZSBkdG1wcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfVE0pCisKKyNkZWZpbmUgZGR2cHJpbnRrKElPQywgQ01EKQkJCVwKKwlNUFRfQ0hFQ0tfTE9HR0lORyhJT0MsIENNRCwgTVBUX0RFQlVHX0RWKQorCisjZGVmaW5lIGRyZXBseXByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19SRVBMWSkKKworI2RlZmluZSBkaHNwcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfSEFORFNIQUtFKQorCisjZGVmaW5lIGRjcHJpbnRrKElPQywgQ01EKQkJCVwKKwlNUFRfQ0hFQ0tfTE9HR0lORyhJT0MsIENNRCwgTVBUX0RFQlVHX0NPTkZJRykKKworI2RlZmluZSBkZGxwcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfREwpCisKKyNkZWZpbmUgZHJzcHJpbnRrKElPQywgQ01EKQkJCVwKKwlNUFRfQ0hFQ0tfTE9HR0lORyhJT0MsIENNRCwgTVBUX0RFQlVHX1JFU0VUKQorCisjZGVmaW5lIGRzcHJpbnRrKElPQywgQ01EKQkJCVwKKwlNUFRfQ0hFQ0tfTE9HR0lORyhJT0MsIENNRCwgTVBUX0RFQlVHX1NDU0kpCisKKyNkZWZpbmUgZGN0bHByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19JT0NUTCkKKworI2RlZmluZSBkZmNwcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfRkMpCisKKyNkZWZpbmUgZHNhc3ByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19TQVMpCisKKyNkZWZpbmUgZHNhc3dpZGVwcmludGsoSU9DLCBDTUQpCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19TQVNfV0lERSkKKworCisKKy8qCisgKiBWZXJib3NlIGxvZ2dpbmcKKyAqLworI2lmIGRlZmluZWQoTVBUX0RFQlVHX1ZFUkJPU0UpICYmIGRlZmluZWQoQ09ORklHX0ZVU0lPTl9MT0dHSU5HKQorc3RhdGljIGlubGluZSB2b2lkCitEQkdfRFVNUF9GV19ET1dOTE9BRChNUFRfQURBUFRFUiAqaW9jLCB1MzIgICptZnAsIGludCBudW1mcmFncykKK3sKKwlpbnQgaTsKKworCWlmICghKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUcpKQorCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fREVCVUcgIkYvVyBkb3dubG9hZCByZXF1ZXN0OlxuIik7CisJZm9yIChpPTA7IGkgPCA3K251bWZyYWdzKjI7IGkrKykKKwkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1mcFtpXSkpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitEQkdfRFVNUF9QVVRfTVNHX0ZSQU1FKE1QVF9BREFQVEVSICppb2MsIHUzMiAqbWZwKQoreworCWludAkgaWksIG47CisKKwlpZiAoIShpb2MtPmRlYnVnX2xldmVsICYgTVBUX0RFQlVHX01TR19GUkFNRSkpCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFib3V0IHRvIFB1dCBtc2cgZnJhbWUgQCAlcDpcbiIsCisJCWlvYy0+bmFtZSwgbWZwKTsKKwluID0gaW9jLT5yZXFfc3ovNCAtIDE7CisJd2hpbGUgKG1mcFtuXSA9PSAwKQorCQluLS07CisJZm9yIChpaT0wOyBpaTw9bjsgaWkrKykgeworCQlpZiAoaWkgJiYgKChpaSU4KT09MCkpCisJCQlwcmludGsoIlxuIik7CisJCXByaW50aygiICUwOHgiLCBsZTMyX3RvX2NwdShtZnBbaWldKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKE1QVF9BREFQVEVSICppb2MsIHUzMiAqbWZwKQoreworCWludCAgaSwgbjsKKworCWlmICghKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUdfTVNHX0ZSQU1FKSkKKwkJcmV0dXJuOworCW4gPSAxMDsKKwlwcmludGsoS0VSTl9JTkZPICIgIik7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1mcFtpXSkpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FKE1QVF9BREFQVEVSICppb2MsIHUzMiAqbWZwKQoreworCWludCAgaSwgbjsKKworCWlmICghKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUdfTVNHX0ZSQU1FKSkKKwkJcmV0dXJuOworCW4gPSAyNDsKKwlmb3IgKGk9MDsgaTxuOyBpKyspIHsKKwkJaWYgKGkgJiYgKChpJTgpPT0wKSkKKwkJCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKCIlMDh4ICIsIGxlMzJfdG9fY3B1KG1mcFtpXSkpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorREJHX0RVTVBfUkVQTFlfRlJBTUUoTVBUX0FEQVBURVIgKmlvYywgdTMyICptZnApCit7CisJaW50ICBpLCBuOworCisJaWYgKCEoaW9jLT5kZWJ1Z19sZXZlbCAmIE1QVF9ERUJVR19NU0dfRlJBTUUpKQorCQlyZXR1cm47CisJbiA9IChsZTMyX3RvX2NwdShtZnBbMF0pICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJcHJpbnRrKEtFUk5fSU5GTyAiICIpOworCWZvciAoaT0wOyBpPG47IGkrKykKKwkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1mcFtpXSkpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FX0hEUihNUFRfQURBUFRFUiAqaW9jLCB1MzIgKm1mcCkKK3sKKwlpbnQgIGksIG47CisKKwlpZiAoIShpb2MtPmRlYnVnX2xldmVsICYgTVBUX0RFQlVHX01TR19GUkFNRSkpCisJCXJldHVybjsKKwluID0gMzsKKwlwcmludGsoS0VSTl9JTkZPICIgIik7CisJZm9yIChpPTA7IGk8bjsgaSsrKQorCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUobWZwW2ldKSk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK0RCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUoTVBUX0FEQVBURVIgKmlvYywgdTMyICptZnApCit7CisJaW50ICBpLCBuOworCisJaWYgKCEoaW9jLT5kZWJ1Z19sZXZlbCAmIE1QVF9ERUJVR19UTSkpCisJCXJldHVybjsKKwluID0gMTM7CisJcHJpbnRrKEtFUk5fREVCVUcgIlRNX1JFUVVFU1Q6XG4iKTsKKwlmb3IgKGk9MDsgaTxuOyBpKyspIHsKKwkJaWYgKGkgJiYgKChpJTgpPT0wKSkKKwkJCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKCIlMDh4ICIsIGxlMzJfdG9fY3B1KG1mcFtpXSkpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorREJHX0RVTVBfVE1fUkVQTFlfRlJBTUUoTVBUX0FEQVBURVIgKmlvYywgdTMyICptZnApCit7CisJaW50ICBpLCBuOworCisJaWYgKCEoaW9jLT5kZWJ1Z19sZXZlbCAmIE1QVF9ERUJVR19UTSkpCisJCXJldHVybjsKKwluID0gKGxlMzJfdG9fY3B1KG1mcFswXSkgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwlwcmludGsoS0VSTl9ERUJVRyAiVE1fUkVQTFkgTWVzc2FnZUxlbmd0aD0lZDpcbiIsIG4pOworCWZvciAoaT0wOyBpPG47IGkrKykgeworCQlpZiAoaSAmJiAoKGklOCk9PTApKQorCQkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUobWZwW2ldKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworI2RlZmluZSBkbWZwcmludGsoSU9DLCBDTUQpCQkJXAorCU1QVF9DSEVDS19MT0dHSU5HKElPQywgQ01ELCBNUFRfREVCVUdfTVNHX0ZSQU1FKQorCisjIGVsc2UgLyogaWZkZWYgTVBUX0RFQlVHX01GICovCisKKyNkZWZpbmUgREJHX0RVTVBfRldfRE9XTkxPQUQoSU9DLCBtZnAsIG51bWZyYWdzKQorI2RlZmluZSBEQkdfRFVNUF9QVVRfTVNHX0ZSQU1FKElPQywgbWZwKQorI2RlZmluZSBEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKElPQywgbWZwKQorI2RlZmluZSBEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FKElPQywgbWZwKQorI2RlZmluZSBEQkdfRFVNUF9SRVBMWV9GUkFNRShJT0MsIG1mcCkKKyNkZWZpbmUgREJHX0RVTVBfUkVRVUVTVF9GUkFNRV9IRFIoSU9DLCBtZnApCisjZGVmaW5lIERCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUoSU9DLCBtZnApCisjZGVmaW5lIERCR19EVU1QX1RNX1JFUExZX0ZSQU1FKElPQywgbWZwKQorCisjZGVmaW5lIGRtZnByaW50ayhJT0MsIENNRCkJCQlcCisJTVBUX0NIRUNLX0xPR0dJTkcoSU9DLCBDTUQsIE1QVF9ERUJVR19NU0dfRlJBTUUpCisKKyNlbmRpZiAvKiBkZWZpbmVkKE1QVF9ERUJVR19WRVJCT1NFKSAmJiBkZWZpbmVkKENPTkZJR19GVVNJT05fTE9HR0lORykgKi8KKworI2VuZGlmIC8qIGlmbmRlZiBNUFRERUJVR19IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggZjJlYmFhOS4uODQyMmMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtMTg4LDE2ICsxODgsMTggQEAKIAkJCSAgaW50ICgqZnVuYykoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpLAogCQkJICBjb25zdCBjaGFyICpjYWxsZXIpCiB7CisJTVBUX1NDU0lfSE9TVAkJKmhkOwogCXN0cnVjdCBzY3NpX2RldmljZQkqc2RldiA9IFNDcG50LT5kZXZpY2U7CiAJc3RydWN0IFNjc2lfSG9zdAkqc2hvc3QgPSBzZGV2LT5ob3N0OwogCXN0cnVjdCBmY19ycG9ydAkJKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzZGV2KSk7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJcmVhZHk7CiAKKwloZCA9IChNUFRfU0NTSV9IT1NUICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoKHJlYWR5ID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpID4+IDE2KSA9PSBESURfSU1NX1JFVFJZKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlkZmNwcmludGsgKChNWUlPQ19zX0lORk9fRk1UCisJCWRmY3ByaW50ayAoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCQkibXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlci4lZDogJWQ6JWQsIHBvcnQgc3RhdHVzIGlzICIKIAkJCSJESURfSU1NX1JFVFJZLCBkZWZlcnJpbmcgJXMgcmVjb3ZlcnkuXG4iLAogCQkJKChNUFRfU0NTSV9IT1NUICopIHNob3N0LT5ob3N0ZGF0YSktPmlvYy0+bmFtZSwKQEAgLTIwOSw3ICsyMTEsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHJlYWR5ID09IERJRF9OT19DT05ORUNUIHx8ICFTQ3BudC0+ZGV2aWNlLT5ob3N0ZGF0YSkgewotCQlkZmNwcmludGsgKChNWUlPQ19zX0lORk9fRk1UCisJCWRmY3ByaW50ayAoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCQkiJXMuJWQ6ICVkOiVkLCBmYWlsaW5nIHJlY292ZXJ5LCAiCiAJCQkicG9ydCBzdGF0ZSAlZCwgdmRldiAlcC5cbiIsIGNhbGxlciwKIAkJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPm5hbWUsCkBAIC0yMTgsNyArMjIwLDcgQEAKIAkJCVNDcG50LT5kZXZpY2UtPmhvc3RkYXRhKSk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQotCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKKwlkZmNwcmludGsgKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCQkiJXMuJWQ6ICVkOiVkLCBleGVjdXRpbmcgcmVjb3ZlcnkuXG4iLCBjYWxsZXIsCiAJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPm5hbWUsCiAJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLApAQCAtNDgzLDcgKzQ4NSw3IEBACiAKIAkJCXBuID0gKHU2NClyaS0+cGcwLldXUE4uSGlnaCA8PCAzMiB8ICh1NjQpcmktPnBnMC5XV1BOLkxvdzsKIAkJCW5uID0gKHU2NClyaS0+cGcwLldXTk4uSGlnaCA8PCAzMiB8ICh1NjQpcmktPnBnMC5XV05OLkxvdzsKLQkJCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCWRmY3ByaW50ayAoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJCQkibXB0ZmNfcmVnX2Rldi4lZDogJXgsICVsbHggLyAlbGx4LCB0aWQgJWQsICIKIAkJCQkicnBvcnQgdGlkICVkLCB0bW8gJWRcbiIsCiAJCQkJCWlvYy0+bmFtZSwKQEAgLTU1OSw2ICs1NjEsMzUgQEAKIAogCXJldHVybiByYzsKIH0KKy8qCisgKgltcHRmY19kdW1wX2x1bl9pbmZvCisgKglAaW9jCisgKglAcnBvcnQKKyAqCUBzZGV2CisgKgorICovCitzdGF0aWMgdm9pZAorbXB0ZmNfZHVtcF9sdW5faW5mbyhNUFRfQURBUFRFUiAqaW9jLCBzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0LCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCVZpcnRUYXJnZXQgKnZ0YXJnZXQpCit7CisJdTY0IG5uLCBwbjsKKwlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqcmk7CisKKwlyaSA9ICooKHN0cnVjdCBtcHRmY19ycG9ydF9pbmZvICoqKXJwb3J0LT5kZF9kYXRhKTsKKwlwbiA9ICh1NjQpcmktPnBnMC5XV1BOLkhpZ2ggPDwgMzIgfCAodTY0KXJpLT5wZzAuV1dQTi5Mb3c7CisJbm4gPSAodTY0KXJpLT5wZzAuV1dOTi5IaWdoIDw8IDMyIHwgKHU2NClyaS0+cGcwLldXTk4uTG93OworCWRmY3ByaW50ayAoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJIm1wdGZjX3Nsdl9hbGxvYy4lZDogbnVtX2x1bnMgJWQsIHNkZXYuaWQgJWQsICIKKwkJIkN1cnJlbnRUYXJnZXRJRCAlZCwgJXggJWxseCAlbGx4XG4iLAorCQlpb2MtPm5hbWUsCisJCXNkZXYtPmhvc3QtPmhvc3Rfbm8sCisJCXZ0YXJnZXQtPm51bV9sdW5zLAorCQlzZGV2LT5pZCwgcmktPnBnMC5DdXJyZW50VGFyZ2V0SUQsCisJCXJpLT5wZzAuUG9ydElkZW50aWZpZXIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcG4sCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbm4pKTsKK30KKwogCiAvKgogICoJT1MgZW50cnkgcG9pbnQgdG8gYWxsb3cgaG9zdCBkcml2ZXIgdG8gYWxsb2MgbWVtb3J5CkBAIC02MDYsMjUgKzYzNyw3IEBACiAJdnRhcmdldC0+bnVtX2x1bnMrKzsKIAogCi0jaWZkZWYgRE1QVF9ERUJVR19GQwotCXsKLQl1NjQgbm4sIHBuOwotCXN0cnVjdCBtcHRmY19ycG9ydF9pbmZvICpyaTsKLQlyaSA9ICooKHN0cnVjdCBtcHRmY19ycG9ydF9pbmZvICoqKXJwb3J0LT5kZF9kYXRhKTsKLQlwbiA9ICh1NjQpcmktPnBnMC5XV1BOLkhpZ2ggPDwgMzIgfCAodTY0KXJpLT5wZzAuV1dQTi5Mb3c7Ci0Jbm4gPSAodTY0KXJpLT5wZzAuV1dOTi5IaWdoIDw8IDMyIHwgKHU2NClyaS0+cGcwLldXTk4uTG93OwotCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKLQkJIm1wdGZjX3Nsdl9hbGxvYy4lZDogbnVtX2x1bnMgJWQsIHNkZXYuaWQgJWQsICIKLQkgICAgICAgICJDdXJyZW50VGFyZ2V0SUQgJWQsICV4ICVsbHggJWxseFxuIiwKLQkJaGQtPmlvYy0+bmFtZSwKLQkJc2Rldi0+aG9zdC0+aG9zdF9ubywKLQkJdnRhcmdldC0+bnVtX2x1bnMsCi0JCXNkZXYtPmlkLCByaS0+cGcwLkN1cnJlbnRUYXJnZXRJRCwKLQkJcmktPnBnMC5Qb3J0SWRlbnRpZmllciwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwbiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylubikpOwotCX0KLSNlbmRpZgorCW1wdGZjX2R1bXBfbHVuX2luZm8oaGQtPmlvYywgcnBvcnQsIHNkZXYsIHZ0YXJnZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTMsMjcgKzY2NiwxMiBAQAogCS8qIGRkX2RhdGEgaXMgbnVsbCB1bnRpbCBmaW5pc2hlZCBhZGRpbmcgdGFyZ2V0ICovCiAJcmkgPSAqKChzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqKilycG9ydC0+ZGRfZGF0YSk7CiAJaWYgKHVubGlrZWx5KCFyaSkpIHsKLQkJZGZjcHJpbnRrICgoTVlJT0Nfc19JTkZPX0ZNVAotCQkJIm1wdGZjX3FjbWQuJWQ6ICVkOiVkLCBkZF9kYXRhIGlzIG51bGwuXG4iLAotCQkJKChNUFRfU0NTSV9IT1NUICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+aW9jLT5uYW1lLAotCQkJKChNUFRfU0NTSV9IT1NUICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+aW9jLT5zaC0+aG9zdF9ubywKLQkJCVNDcG50LT5kZXZpY2UtPmlkLFNDcG50LT5kZXZpY2UtPmx1bikpOwogCQlTQ3BudC0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKIAkJZG9uZShTQ3BudCk7CiAJCXJldHVybiAwOwogCX0KIAotCWVyciA9IG1wdHNjc2loX3FjbWQoU0NwbnQsZG9uZSk7Ci0jaWZkZWYgRE1QVF9ERUJVR19GQwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKLQkJCSJtcHRmY19xY21kLiVkOiAlZDolZCwgbXB0c2NzaWhfcWNtZCByZXR1cm5zIG5vbi16ZXJvLCAoJXgpLlxuIiwKLQkJCSgoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPmlvYy0+bmFtZSwKLQkJCSgoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPmlvYy0+c2gtPmhvc3Rfbm8sCi0JCQlTQ3BudC0+ZGV2aWNlLT5pZCxTQ3BudC0+ZGV2aWNlLT5sdW4sZXJyKSk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXB0c2NzaWhfcWNtZChTQ3BudCxkb25lKTsKIH0KIAogLyoKQEAgLTEwNDEsNyArMTAzOSw3IEBACiAKIAkJCXBuID0gKHU2NClyaS0+cGcwLldXUE4uSGlnaCA8PCAzMiB8CiAJCQkgICAgICh1NjQpcmktPnBnMC5XV1BOLkxvdzsKLQkJCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCWRmY3ByaW50ayAoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJCQkibXB0ZmNfc2V0dXBfcmVzZXQuJWQ6ICVsbHggZGVsZXRlZFxuIiwKIAkJCQlpb2MtPm5hbWUsCiAJCQkJaW9jLT5zaC0+aG9zdF9ubywKQEAgLTEwODgsNyArMTA4Niw3IEBACiAKIAkJCXBuID0gKHU2NClyaS0+cGcwLldXUE4uSGlnaCA8PCAzMiB8CiAJCQkgICAgICh1NjQpcmktPnBnMC5XV1BOLkxvdzsKLQkJCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCWRmY3ByaW50ayAoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJCQkibXB0ZmNfcmVzY2FuLiVkOiAlbGx4IGRlbGV0ZWRcbiIsCiAJCQkJaW9jLT5uYW1lLAogCQkJCWlvYy0+c2gtPmhvc3Rfbm8sCkBAIC0xMjEyLDcgKzEyMTAsNyBAQAogCiAJaWYgKG51bVNHRSA8IHNoLT5zZ190YWJsZXNpemUpIHsKIAkJLyogUmVzZXQgdGhpcyB2YWx1ZSAqLwotCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCWRwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJICAiUmVzZXR0aW5nIHNnX3RhYmxlc2l6ZSB0byAlZCBmcm9tICVkXG4iLAogCQkgIGlvYy0+bmFtZSwgbnVtU0dFLCBzaC0+c2dfdGFibGVzaXplKSk7CiAJCXNoLT5zZ190YWJsZXNpemUgPSBudW1TR0U7CkBAIC0xMjMyLDcgKzEyMzAsNyBAQAogCQlnb3RvIG91dF9tcHRmY19wcm9iZTsKIAl9CiAKLQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTY3NpTG9va3VwIEAgJXBcbiIsCisJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiU2NzaUxvb2t1cCBAICVwXG4iLAogCQkgaW9jLT5uYW1lLCBoZC0+U2NzaUxvb2t1cCkpOwogCiAJLyogQ2xlYXIgdGhlIFRNIGZsYWdzCkBAIC0xMjY0LDcgKzEyNjIsNyBAQAogCXNoLT50cmFuc3BvcnR0ID0gbXB0ZmNfdHJhbnNwb3J0X3RlbXBsYXRlOwogCWVycm9yID0gc2NzaV9hZGRfaG9zdCAoc2gsICZpb2MtPnBjaWRldi0+ZGV2KTsKIAlpZihlcnJvcikgewotCQlkcHJpbnRrKChLRVJOX0VSUiBNWU5BTQorCQlkcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fRVJSIE1ZTkFNCiAJCSAgInNjc2lfYWRkX2hvc3QgZmFpbGVkXG4iKSk7CiAJCWdvdG8gb3V0X21wdGZjX3Byb2JlOwogCX0KQEAgLTEzMjMsNyArMTMyMSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM9MTsKIAotCWRldnR2ZXJib3NlcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJNUFQgZXZlbnQgKD0lMDJYaCkgcm91dGVkIHRvIFNDU0kgaG9zdCBkcml2ZXIhXG4iLAorCWRldnR2ZXJib3NlcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJNUFQgZXZlbnQgKD0lMDJYaCkgcm91dGVkIHRvIFNDU0kgaG9zdCBkcml2ZXIhXG4iLAogCQkJaW9jLT5uYW1lLCBldmVudCkpOwogCiAJaWYgKGlvYy0+c2ggPT0gTlVMTCB8fApAQCAtMTM1Nyw4ICsxMzU1LDggQEAKIAkJcmV0dXJuIHJjOwogCiAKLQlkdG1wcmludGsoKEtFUk5fV0FSTklORyBNWU5BTQotCQkiOiBJT0MgJXNfcmVzZXQgcm91dGVkIHRvIEZDIGhvc3QgZHJpdmVyIVxuIiwKKwlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKKwkJIjogSU9DICVzX3Jlc2V0IHJvdXRlZCB0byBGQyBob3N0IGRyaXZlciFcbiIsaW9jLT5uYW1lLAogCQlyZXNldF9waGFzZT09TVBUX0lPQ19TRVRVUF9SRVNFVCA/ICJzZXR1cCIgOiAoCiAJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1BSRV9SRVNFVCA/ICJwcmUiIDogInBvc3QiKSkpOwogCkBAIC0xNDEzLDE1ICsxNDExLDggQEAKIAltcHRmY1Rhc2tDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUsIE1QVEZDX0RSSVZFUik7CiAJbXB0ZmNJbnRlcm5hbEN0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUsIE1QVEZDX0RSSVZFUik7CiAKLQlpZiAobXB0X2V2ZW50X3JlZ2lzdGVyKG1wdGZjRG9uZUN0eCwgbXB0ZmNfZXZlbnRfcHJvY2VzcykgPT0gMCkgewotCQlkZXZ0dmVyYm9zZXByaW50aygoS0VSTl9JTkZPIE1ZTkFNCi0JCSAgIjogUmVnaXN0ZXJlZCBmb3IgSU9DIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiIpKTsKLQl9Ci0KLQlpZiAobXB0X3Jlc2V0X3JlZ2lzdGVyKG1wdGZjRG9uZUN0eCwgbXB0ZmNfaW9jX3Jlc2V0KSA9PSAwKSB7Ci0JCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQotCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyByZXNldCBub3RpZmljYXRpb25zXG4iKSk7Ci0JfQorCW1wdF9ldmVudF9yZWdpc3RlcihtcHRmY0RvbmVDdHgsIG1wdGZjX2V2ZW50X3Byb2Nlc3MpOworCW1wdF9yZXNldF9yZWdpc3RlcihtcHRmY0RvbmVDdHgsIG1wdGZjX2lvY19yZXNldCk7CiAKIAllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1wdGZjX2RyaXZlcik7CiAJaWYgKGVycm9yKQpAQCAtMTQ4NiwxMiArMTQ3Nyw3IEBACiAJZmNfcmVsZWFzZV90cmFuc3BvcnQobXB0ZmNfdHJhbnNwb3J0X3RlbXBsYXRlKTsKIAogCW1wdF9yZXNldF9kZXJlZ2lzdGVyKG1wdGZjRG9uZUN0eCk7Ci0JZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCi0JICAiOiBEZXJlZ2lzdGVyZWQgZm9yIElPQyByZXNldCBub3RpZmljYXRpb25zXG4iKSk7Ci0KIAltcHRfZXZlbnRfZGVyZWdpc3RlcihtcHRmY0RvbmVDdHgpOwotCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQotCSAgIjogRGVyZWdpc3RlcmVkIGZvciBJT0MgZXZlbnQgbm90aWZpY2F0aW9uc1xuIikpOwogCiAJbXB0X2RlcmVnaXN0ZXIobXB0ZmNJbnRlcm5hbEN0eCk7CiAJbXB0X2RlcmVnaXN0ZXIobXB0ZmNUYXNrQ3R4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCmluZGV4IDdlOGE5MGMuLjAxZmMzOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwpAQCAtMTUyNCw4ICsxNTI0LDcgQEAKIAogCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogUmVnaXN0ZXJlZCBmb3IgSU9DIHJlc2V0IG5vdGlmaWNhdGlvbnNcbiIpKTsKIAkKLQlpZiAobXB0X2RldmljZV9kcml2ZXJfcmVnaXN0ZXIoJm1wdGxhbl9kcml2ZXIsIE1QVExBTl9EUklWRVIpKQotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogZmFpbGVkIHRvIHJlZ2lzdGVyIGRkIGNhbGxiYWNrc1xuIikpOworCW1wdF9kZXZpY2VfZHJpdmVyX3JlZ2lzdGVyKCZtcHRsYW5fZHJpdmVyLCBNUFRMQU5fRFJJVkVSKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKaW5kZXggZDUwNjY0Ni4uMjlhZGQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCkBAIC0yMDEsMTAzICsyMDEsOTEgQEAKIAl1OAlzZXBfY2hhbm5lbDsJCS8qIFNFUCBjaGFubmVsIGxvZ2ljYWwgY2hhbm5lbCBpZCAqLwogfTsKIAotI2lmZGVmIE1QVF9ERUJVR19TQVMKLXN0YXRpYyB2b2lkIG1wdHNhc19wcmludF9waHlfZGF0YShNUElfU0FTX0lPX1VOSVQwX1BIWV9EQVRBICpwaHlfZGF0YSkKK3N0YXRpYyB2b2lkIG1wdHNhc19wcmludF9waHlfZGF0YShNUFRfQURBUFRFUiAqaW9jLAorCQkJCQlNUElfU0FTX0lPX1VOSVQwX1BIWV9EQVRBICpwaHlfZGF0YSkKIHsKLQlwcmludGsoIi0tLS0gSU8gVU5JVCBQQUdFIDAgLS0tLS0tLS0tLS0tXG4iKTsKLQlwcmludGsoIkhhbmRsZT0weCVYXG4iLAotCQlsZTE2X3RvX2NwdShwaHlfZGF0YS0+QXR0YWNoZWREZXZpY2VIYW5kbGUpKTsKLQlwcmludGsoIkNvbnRyb2xsZXIgSGFuZGxlPTB4JVhcbiIsCi0JCWxlMTZfdG9fY3B1KHBoeV9kYXRhLT5Db250cm9sbGVyRGV2SGFuZGxlKSk7Ci0JcHJpbnRrKCJQb3J0PTB4JVhcbiIsIHBoeV9kYXRhLT5Qb3J0KTsKLQlwcmludGsoIlBvcnQgRmxhZ3M9MHglWFxuIiwgcGh5X2RhdGEtPlBvcnRGbGFncyk7Ci0JcHJpbnRrKCJQSFkgRmxhZ3M9MHglWFxuIiwgcGh5X2RhdGEtPlBoeUZsYWdzKTsKLQlwcmludGsoIk5lZ290aWF0ZWQgTGluayBSYXRlPTB4JVhcbiIsIHBoeV9kYXRhLT5OZWdvdGlhdGVkTGlua1JhdGUpOwotCXByaW50aygiQ29udHJvbGxlciBQSFkgRGV2aWNlIEluZm89MHglWFxuIiwKLQkJbGUzMl90b19jcHUocGh5X2RhdGEtPkNvbnRyb2xsZXJQaHlEZXZpY2VJbmZvKSk7Ci0JcHJpbnRrKCJEaXNjb3ZlcnlTdGF0dXM9MHglWFxuIiwKLQkJbGUzMl90b19jcHUocGh5X2RhdGEtPkRpc2NvdmVyeVN0YXR1cykpOwotCXByaW50aygiXG4iKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIi0tLS0gSU8gVU5JVCBQQUdFIDAgLS0tLS0tLS0tLS0tXG4iKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJIYW5kbGU9MHglWFxuIiwKKwkJbGUxNl90b19jcHUocGh5X2RhdGEtPkF0dGFjaGVkRGV2aWNlSGFuZGxlKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiQ29udHJvbGxlciBIYW5kbGU9MHglWFxuIiwKKwkJbGUxNl90b19jcHUocGh5X2RhdGEtPkNvbnRyb2xsZXJEZXZIYW5kbGUpKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJQb3J0PTB4JVhcbiIsIHBoeV9kYXRhLT5Qb3J0KSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJQb3J0IEZsYWdzPTB4JVhcbiIsIHBoeV9kYXRhLT5Qb3J0RmxhZ3MpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBIWSBGbGFncz0weCVYXG4iLCBwaHlfZGF0YS0+UGh5RmxhZ3MpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIk5lZ290aWF0ZWQgTGluayBSYXRlPTB4JVhcbiIsIHBoeV9kYXRhLT5OZWdvdGlhdGVkTGlua1JhdGUpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIkNvbnRyb2xsZXIgUEhZIERldmljZSBJbmZvPTB4JVhcbiIsCisJCWxlMzJfdG9fY3B1KHBoeV9kYXRhLT5Db250cm9sbGVyUGh5RGV2aWNlSW5mbykpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIkRpc2NvdmVyeVN0YXR1cz0weCVYXG5cbiIsCisJCWxlMzJfdG9fY3B1KHBoeV9kYXRhLT5EaXNjb3ZlcnlTdGF0dXMpKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1wdHNhc19wcmludF9waHlfcGcwKFNhc1BoeVBhZ2UwX3QgKnBnMCkKK3N0YXRpYyB2b2lkIG1wdHNhc19wcmludF9waHlfcGcwKE1QVF9BREFQVEVSICppb2MsIFNhc1BoeVBhZ2UwX3QgKnBnMCkKIHsKIAlfX2xlNjQgc2FzX2FkZHJlc3M7CiAKIAltZW1jcHkoJnNhc19hZGRyZXNzLCAmcGcwLT5TQVNBZGRyZXNzLCBzaXplb2YoX19sZTY0KSk7CiAKLQlwcmludGsoIi0tLS0gU0FTIFBIWSBQQUdFIDAgLS0tLS0tLS0tLS0tXG4iKTsKLQlwcmludGsoIkF0dGFjaGVkIERldmljZSBIYW5kbGU9MHglWFxuIiwKLQkJCWxlMTZfdG9fY3B1KHBnMC0+QXR0YWNoZWREZXZIYW5kbGUpKTsKLQlwcmludGsoIlNBUyBBZGRyZXNzPTB4JWxsWFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2FzX2FkZHJlc3MpKTsKLQlwcmludGsoIkF0dGFjaGVkIFBIWSBJZGVudGlmaWVyPTB4JVhcbiIsIHBnMC0+QXR0YWNoZWRQaHlJZGVudGlmaWVyKTsKLQlwcmludGsoIkF0dGFjaGVkIERldmljZSBJbmZvPTB4JVhcbiIsCi0JCQlsZTMyX3RvX2NwdShwZzAtPkF0dGFjaGVkRGV2aWNlSW5mbykpOwotCXByaW50aygiUHJvZ3JhbW1lZCBMaW5rIFJhdGU9MHglWFxuIiwgcGcwLT5Qcm9ncmFtbWVkTGlua1JhdGUpOwotCXByaW50aygiQ2hhbmdlIENvdW50PTB4JVhcbiIsIHBnMC0+Q2hhbmdlQ291bnQpOwotCXByaW50aygiUEhZIEluZm89MHglWFxuIiwgbGUzMl90b19jcHUocGcwLT5QaHlJbmZvKSk7Ci0JcHJpbnRrKCJcbiIpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiLS0tLSBTQVMgUEhZIFBBR0UgMCAtLS0tLS0tLS0tLS1cbiIpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIkF0dGFjaGVkIERldmljZSBIYW5kbGU9MHglWFxuIiwKKwkJCWxlMTZfdG9fY3B1KHBnMC0+QXR0YWNoZWREZXZIYW5kbGUpKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJTQVMgQWRkcmVzcz0weCVsbFhcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNhc19hZGRyZXNzKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiQXR0YWNoZWQgUEhZIElkZW50aWZpZXI9MHglWFxuIiwgcGcwLT5BdHRhY2hlZFBoeUlkZW50aWZpZXIpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIkF0dGFjaGVkIERldmljZSBJbmZvPTB4JVhcbiIsCisJCQlsZTMyX3RvX2NwdShwZzAtPkF0dGFjaGVkRGV2aWNlSW5mbykpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlByb2dyYW1tZWQgTGluayBSYXRlPTB4JVhcbiIsIHBnMC0+UHJvZ3JhbW1lZExpbmtSYXRlKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJDaGFuZ2UgQ291bnQ9MHglWFxuIiwgcGcwLT5DaGFuZ2VDb3VudCkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiUEhZIEluZm89MHglWFxuXG4iLCBsZTMyX3RvX2NwdShwZzAtPlBoeUluZm8pKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1wdHNhc19wcmludF9waHlfcGcxKFNhc1BoeVBhZ2UxX3QgKnBnMSkKK3N0YXRpYyB2b2lkIG1wdHNhc19wcmludF9waHlfcGcxKE1QVF9BREFQVEVSICppb2MsIFNhc1BoeVBhZ2UxX3QgKnBnMSkKIHsKLQlwcmludGsoIi0tLS0gU0FTIFBIWSBQQUdFIDEgLS0tLS0tLS0tLS0tXG4iKTsKLQlwcmludGsoIkludmFsaWQgRHdvcmQgQ291bnQ9MHgleFxuIiwgcGcxLT5JbnZhbGlkRHdvcmRDb3VudCk7Ci0JcHJpbnRrKCJSdW5uaW5nIERpc3Bhcml0eSBFcnJvciBDb3VudD0weCV4XG4iLAotCQkJcGcxLT5SdW5uaW5nRGlzcGFyaXR5RXJyb3JDb3VudCk7Ci0JcHJpbnRrKCJMb3NzIER3b3JkIFN5bmNoIENvdW50PTB4JXhcbiIsIHBnMS0+TG9zc0R3b3JkU3luY2hDb3VudCk7Ci0JcHJpbnRrKCJQSFkgUmVzZXQgUHJvYmxlbSBDb3VudD0weCV4XG4iLCBwZzEtPlBoeVJlc2V0UHJvYmxlbUNvdW50KTsKLQlwcmludGsoIlxuIik7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICItLS0tIFNBUyBQSFkgUEFHRSAxIC0tLS0tLS0tLS0tLVxuIikpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBEd29yZCBDb3VudD0weCV4XG4iLCBwZzEtPkludmFsaWREd29yZENvdW50KSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJSdW5uaW5nIERpc3Bhcml0eSBFcnJvciBDb3VudD0weCV4XG4iLAorCQkJcGcxLT5SdW5uaW5nRGlzcGFyaXR5RXJyb3JDb3VudCkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiTG9zcyBEd29yZCBTeW5jaCBDb3VudD0weCV4XG4iLCBwZzEtPkxvc3NEd29yZFN5bmNoQ291bnQpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBIWSBSZXNldCBQcm9ibGVtIENvdW50PTB4JXhcblxuIiwgcGcxLT5QaHlSZXNldFByb2JsZW1Db3VudCkpOwogfQogCi1zdGF0aWMgdm9pZCBtcHRzYXNfcHJpbnRfZGV2aWNlX3BnMChTYXNEZXZpY2VQYWdlMF90ICpwZzApCitzdGF0aWMgdm9pZCBtcHRzYXNfcHJpbnRfZGV2aWNlX3BnMChNUFRfQURBUFRFUiAqaW9jLCBTYXNEZXZpY2VQYWdlMF90ICpwZzApCiB7CiAJX19sZTY0IHNhc19hZGRyZXNzOwogCiAJbWVtY3B5KCZzYXNfYWRkcmVzcywgJnBnMC0+U0FTQWRkcmVzcywgc2l6ZW9mKF9fbGU2NCkpOwogCi0JcHJpbnRrKCItLS0tIFNBUyBERVZJQ0UgUEFHRSAwIC0tLS0tLS0tLVxuIik7Ci0JcHJpbnRrKCJIYW5kbGU9MHglWFxuIiAsbGUxNl90b19jcHUocGcwLT5EZXZIYW5kbGUpKTsKLQlwcmludGsoIlBhcmVudCBIYW5kbGU9MHglWFxuIiAsbGUxNl90b19jcHUocGcwLT5QYXJlbnREZXZIYW5kbGUpKTsKLQlwcmludGsoIkVuY2xvc3VyZSBIYW5kbGU9MHglWFxuIiwgbGUxNl90b19jcHUocGcwLT5FbmNsb3N1cmVIYW5kbGUpKTsKLQlwcmludGsoIlNsb3Q9MHglWFxuIiwgbGUxNl90b19jcHUocGcwLT5TbG90KSk7Ci0JcHJpbnRrKCJTQVMgQWRkcmVzcz0weCVsbFhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCi0JICAgIGxlNjRfdG9fY3B1KHNhc19hZGRyZXNzKSk7Ci0JcHJpbnRrKCJUYXJnZXQgSUQ9MHglWFxuIiwgcGcwLT5UYXJnZXRJRCk7Ci0JcHJpbnRrKCJCdXM9MHglWFxuIiwgcGcwLT5CdXMpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiLS0tLSBTQVMgREVWSUNFIFBBR0UgMCAtLS0tLS0tLS1cbiIpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIkhhbmRsZT0weCVYXG4iICxsZTE2X3RvX2NwdShwZzAtPkRldkhhbmRsZSkpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBhcmVudCBIYW5kbGU9MHglWFxuIiAsbGUxNl90b19jcHUocGcwLT5QYXJlbnREZXZIYW5kbGUpKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJFbmNsb3N1cmUgSGFuZGxlPTB4JVhcbiIsIGxlMTZfdG9fY3B1KHBnMC0+RW5jbG9zdXJlSGFuZGxlKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiU2xvdD0weCVYXG4iLCBsZTE2X3RvX2NwdShwZzAtPlNsb3QpKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJTQVMgQWRkcmVzcz0weCVsbFhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCisJICAgIGxlNjRfdG9fY3B1KHNhc19hZGRyZXNzKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiVGFyZ2V0IElEPTB4JVhcbiIsIHBnMC0+VGFyZ2V0SUQpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIkJ1cz0weCVYXG4iLCBwZzAtPkJ1cykpOwogCS8qIFRoZSBQaHlOdW0gZmllbGQgc3BlY2lmaWVzIHRoZSBQSFkgbnVtYmVyIG9mIHRoZSBwYXJlbnQKIAkgKiBkZXZpY2UgdGhpcyBkZXZpY2UgaXMgbGlua2VkIHRvCiAJICovCi0JcHJpbnRrKCJQYXJlbnQgUGh5IE51bT0weCVYXG4iLCBwZzAtPlBoeU51bSk7Ci0JcHJpbnRrKCJBY2Nlc3MgU3RhdHVzPTB4JVhcbiIsIGxlMTZfdG9fY3B1KHBnMC0+QWNjZXNzU3RhdHVzKSk7Ci0JcHJpbnRrKCJEZXZpY2UgSW5mbz0weCVYXG4iLCBsZTMyX3RvX2NwdShwZzAtPkRldmljZUluZm8pKTsKLQlwcmludGsoIkZsYWdzPTB4JVhcbiIsIGxlMTZfdG9fY3B1KHBnMC0+RmxhZ3MpKTsKLQlwcmludGsoIlBoeXNpY2FsIFBvcnQ9MHglWFxuIiwgcGcwLT5QaHlzaWNhbFBvcnQpOwotCXByaW50aygiXG4iKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBhcmVudCBQaHkgTnVtPTB4JVhcbiIsIHBnMC0+UGh5TnVtKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJBY2Nlc3MgU3RhdHVzPTB4JVhcbiIsIGxlMTZfdG9fY3B1KHBnMC0+QWNjZXNzU3RhdHVzKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiRGV2aWNlIEluZm89MHglWFxuIiwgbGUzMl90b19jcHUocGcwLT5EZXZpY2VJbmZvKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiRmxhZ3M9MHglWFxuIiwgbGUxNl90b19jcHUocGcwLT5GbGFncykpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBoeXNpY2FsIFBvcnQ9MHglWFxuXG4iLCBwZzAtPlBoeXNpY2FsUG9ydCkpOwogfQogCi1zdGF0aWMgdm9pZCBtcHRzYXNfcHJpbnRfZXhwYW5kZXJfcGcxKFNhc0V4cGFuZGVyUGFnZTFfdCAqcGcxKQorc3RhdGljIHZvaWQgbXB0c2FzX3ByaW50X2V4cGFuZGVyX3BnMShNUFRfQURBUFRFUiAqaW9jLCBTYXNFeHBhbmRlclBhZ2UxX3QgKnBnMSkKIHsKLQlwcmludGsoIi0tLS0gU0FTIEVYUEFOREVSIFBBR0UgMSAtLS0tLS0tLS0tLS1cbiIpOwotCi0JcHJpbnRrKCJQaHlzaWNhbCBQb3J0PTB4JVhcbiIsIHBnMS0+UGh5c2ljYWxQb3J0KTsKLQlwcmludGsoIlBIWSBJZGVudGlmaWVyPTB4JVhcbiIsIHBnMS0+UGh5SWRlbnRpZmllcik7Ci0JcHJpbnRrKCJOZWdvdGlhdGVkIExpbmsgUmF0ZT0weCVYXG4iLCBwZzEtPk5lZ290aWF0ZWRMaW5rUmF0ZSk7Ci0JcHJpbnRrKCJQcm9ncmFtbWVkIExpbmsgUmF0ZT0weCVYXG4iLCBwZzEtPlByb2dyYW1tZWRMaW5rUmF0ZSk7Ci0JcHJpbnRrKCJIYXJkd2FyZSBMaW5rIFJhdGU9MHglWFxuIiwgcGcxLT5Id0xpbmtSYXRlKTsKLQlwcmludGsoIk93bmVyIERldmljZSBIYW5kbGU9MHglWFxuIiwKLQkJCWxlMTZfdG9fY3B1KHBnMS0+T3duZXJEZXZIYW5kbGUpKTsKLQlwcmludGsoIkF0dGFjaGVkIERldmljZSBIYW5kbGU9MHglWFxuIiwKLQkJCWxlMTZfdG9fY3B1KHBnMS0+QXR0YWNoZWREZXZIYW5kbGUpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIi0tLS0gU0FTIEVYUEFOREVSIFBBR0UgMSAtLS0tLS0tLS0tLS1cbiIpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBoeXNpY2FsIFBvcnQ9MHglWFxuIiwgcGcxLT5QaHlzaWNhbFBvcnQpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlBIWSBJZGVudGlmaWVyPTB4JVhcbiIsIHBnMS0+UGh5SWRlbnRpZmllcikpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiTmVnb3RpYXRlZCBMaW5rIFJhdGU9MHglWFxuIiwgcGcxLT5OZWdvdGlhdGVkTGlua1JhdGUpKTsKKwlkc2FzcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIlByb2dyYW1tZWQgTGluayBSYXRlPTB4JVhcbiIsIHBnMS0+UHJvZ3JhbW1lZExpbmtSYXRlKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJIYXJkd2FyZSBMaW5rIFJhdGU9MHglWFxuIiwgcGcxLT5Id0xpbmtSYXRlKSk7CisJZHNhc3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJPd25lciBEZXZpY2UgSGFuZGxlPTB4JVhcbiIsCisJCQlsZTE2X3RvX2NwdShwZzEtPk93bmVyRGV2SGFuZGxlKSkpOworCWRzYXNwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiQXR0YWNoZWQgRGV2aWNlIEhhbmRsZT0weCVYXG5cbiIsCisJCQlsZTE2X3RvX2NwdShwZzEtPkF0dGFjaGVkRGV2SGFuZGxlKSkpOwogfQotI2Vsc2UKLSNkZWZpbmUgbXB0c2FzX3ByaW50X3BoeV9kYXRhKHBoeV9kYXRhKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBtcHRzYXNfcHJpbnRfcGh5X3BnMChwZzApCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1wdHNhc19wcmludF9waHlfcGcxKHBnMSkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbXB0c2FzX3ByaW50X2RldmljZV9wZzAocGcwKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBtcHRzYXNfcHJpbnRfZXhwYW5kZXJfcGcxKHBnMSkJCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIE1QVF9BREFQVEVSICpwaHlfdG9faW9jKHN0cnVjdCBzYXNfcGh5ICpwaHkpCiB7CkBAIC0zNTQsNyArMzQyLDcgQEAKIAogLyogbm8gbXV0ZXggKi8KIHN0YXRpYyB2b2lkCi1tcHRzYXNfcG9ydF9kZWxldGUoc3RydWN0IG1wdHNhc19wb3J0aW5mb19kZXRhaWxzICogcG9ydF9kZXRhaWxzKQorbXB0c2FzX3BvcnRfZGVsZXRlKE1QVF9BREFQVEVSICppb2MsIHN0cnVjdCBtcHRzYXNfcG9ydGluZm9fZGV0YWlscyAqIHBvcnRfZGV0YWlscykKIHsKIAlzdHJ1Y3QgbXB0c2FzX3BvcnRpbmZvICpwb3J0X2luZm87CiAJc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbzsKQEAgLTM2Niw3ICszNTQsNyBAQAogCXBvcnRfaW5mbyA9IHBvcnRfZGV0YWlscy0+cG9ydF9pbmZvOwogCXBoeV9pbmZvID0gcG9ydF9pbmZvLT5waHlfaW5mbzsKIAotCWRzYXN3aWRlcHJpbnRrKChLRVJOX0RFQlVHICIlczogWyVwXTogbnVtX3BoeXM9JTAyZCAiCisJZHNhc3dpZGVwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFslcF06IG51bV9waHlzPSUwMmQgIgogCSAgICAiYml0bWFzaz0weCUwMTZsbFhcbiIsIF9fRlVOQ1RJT05fXywgcG9ydF9kZXRhaWxzLAogCSAgICBwb3J0X2RldGFpbHMtPm51bV9waHlzLCAodW5zaWduZWQgbG9uZyBsb25nKQogCSAgICBwb3J0X2RldGFpbHMtPnBoeV9iaXRtYXNrKSk7CkBAIC0zOTAsMjAgKzM3OCwxOSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLW1wdHNhc19zZXRfcnBoeShzdHJ1Y3QgbXB0c2FzX3BoeWluZm8gKnBoeV9pbmZvLCBzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkpCittcHRzYXNfc2V0X3JwaHkoTVBUX0FEQVBURVIgKmlvYywgc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbywgc3RydWN0IHNhc19ycGh5ICpycGh5KQogewogCWlmIChwaHlfaW5mby0+cG9ydF9kZXRhaWxzKSB7CiAJCXBoeV9pbmZvLT5wb3J0X2RldGFpbHMtPnJwaHkgPSBycGh5OwotCQlkc2Fzd2lkZXByaW50aygoS0VSTl9ERUJVRyAic2FzX3JwaHlfYWRkOiBycGh5PSVwXG4iLCBycGh5KSk7CisJCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgInNhc19ycGh5X2FkZDogcnBoeT0lcFxuIiwgcnBoeSkpOwogCX0KIAotI2lmZGVmIE1QVF9ERUJVR19TQVNfV0lERQogCWlmIChycGh5KSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnJwaHktPmRldiwgImFkZDoiKTsKLQkJcHJpbnRrKCJycGh5PSVwIHJlbGVhc2U9JXBcbiIsCi0JCQlycGh5LCBycGh5LT5kZXYucmVsZWFzZSk7CisJCWRzYXN3aWRlcHJpbnRrKGlvYywgZGV2X3ByaW50ayhLRVJOX0RFQlVHLAorCQkgICAgJnJwaHktPmRldiwgImFkZDoiKSk7CisJCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgInJwaHk9JXAgcmVsZWFzZT0lcFxuIiwKKwkJCXJwaHksIHJwaHktPmRldi5yZWxlYXNlKSk7CiAJfQotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNhc19wb3J0ICoKQEAgLTQxNiwxOCArNDAzLDE3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotbXB0c2FzX3NldF9wb3J0KHN0cnVjdCBtcHRzYXNfcGh5aW5mbyAqcGh5X2luZm8sIHN0cnVjdCBzYXNfcG9ydCAqcG9ydCkKK21wdHNhc19zZXRfcG9ydChNUFRfQURBUFRFUiAqaW9jLCBzdHJ1Y3QgbXB0c2FzX3BoeWluZm8gKnBoeV9pbmZvLCBzdHJ1Y3Qgc2FzX3BvcnQgKnBvcnQpCiB7CiAJaWYgKHBoeV9pbmZvLT5wb3J0X2RldGFpbHMpCiAJCXBoeV9pbmZvLT5wb3J0X2RldGFpbHMtPnBvcnQgPSBwb3J0OwogCi0jaWZkZWYgTVBUX0RFQlVHX1NBU19XSURFCiAJaWYgKHBvcnQpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcG9ydC0+ZGV2LCAiYWRkOiAiKTsKLQkJcHJpbnRrKCJwb3J0PSVwIHJlbGVhc2U9JXBcbiIsCi0JCQlwb3J0LCBwb3J0LT5kZXYucmVsZWFzZSk7CisJCWRzYXN3aWRlcHJpbnRrKGlvYywgZGV2X3ByaW50ayhLRVJOX0RFQlVHLAorCQkgICAgJnBvcnQtPmRldiwgImFkZDoiKSk7CisJCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgInBvcnQ9JXAgcmVsZWFzZT0lcFxuIiwKKwkJCXBvcnQsIHBvcnQtPmRldi5yZWxlYXNlKSk7CiAJfQotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfdGFyZ2V0ICoKQEAgLTQ3Nyw3ICs0NjMsNyBAQAogCQkgKiBSZW1vdmluZyBhIHBoeSBmcm9tIGEgcG9ydCwgbGV0dGluZyB0aGUgbGFzdAogCQkgKiBwaHkgYmUgcmVtb3ZlZCBieSBmaXJtd2FyZSBldmVudHMuCiAJCSAqLwotCQlkc2Fzd2lkZXByaW50aygoS0VSTl9ERUJVRworCQlkc2Fzd2lkZXByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHCiAJCQkiJXM6IFslcF06IGRlbGV0aW5nIHBoeSA9ICVkXG4iLAogCQkJX19GVU5DVElPTl9fLCBwb3J0X2RldGFpbHMsIGkpKTsKIAkJcG9ydF9kZXRhaWxzLT5udW1fcGh5cy0tOwpAQCAtNDkzLDcgKzQ3OSw3IEBACiAJcGh5X2luZm8gPSBwb3J0X2luZm8tPnBoeV9pbmZvOwogCWZvciAoaSA9IDAgOyBpIDwgcG9ydF9pbmZvLT5udW1fcGh5cyA7IGkrKywgcGh5X2luZm8rKykgewogCQlzYXNfYWRkcmVzcyA9IHBoeV9pbmZvLT5hdHRhY2hlZC5zYXNfYWRkcmVzczsKLQkJZHNhc3dpZGVwcmludGsoKEtFUk5fREVCVUcgInBoeV9pZD0lZCBzYXNfYWRkcmVzcz0weCUwMThsbFhcbiIsCisJCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgInBoeV9pZD0lZCBzYXNfYWRkcmVzcz0weCUwMThsbFhcbiIsCiAJCSAgICBpLCAodW5zaWduZWQgbG9uZyBsb25nKXNhc19hZGRyZXNzKSk7CiAJCWlmICghc2FzX2FkZHJlc3MpCiAJCQljb250aW51ZTsKQEAgLTUxMiw3ICs0OTgsNyBAQAogCQkJCXBvcnRfZGV0YWlscy0+cGh5X2JpdG1hc2sgfD0KIAkJCQkgICAgKDEgPDwgcGh5X2luZm8tPnBoeV9pZCk7CiAJCQlwaHlfaW5mby0+c2FzX3BvcnRfYWRkX3BoeT0xOwotCQkJZHNhc3dpZGVwcmludGsoKEtFUk5fREVCVUcgIlx0XHRGb3JtaW5nIHBvcnRcblx0XHQiCisJCQlkc2Fzd2lkZXByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICJcdFx0Rm9ybWluZyBwb3J0XG5cdFx0IgogCQkJICAgICJwaHlfaWQ9JWQgc2FzX2FkZHJlc3M9MHglMDE4bGxYXG4iLAogCQkJICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpc2FzX2FkZHJlc3MpKTsKIAkJCXBoeV9pbmZvLT5wb3J0X2RldGFpbHMgPSBwb3J0X2RldGFpbHM7CkBAIC01MjksNyArNTE1LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWlmIChwaHlfaW5mb19jbXAtPnBvcnRfZGV0YWlscyA9PSBwb3J0X2RldGFpbHMgKQogCQkJCWNvbnRpbnVlOwotCQkJZHNhc3dpZGVwcmludGsoKEtFUk5fREVCVUcKKwkJCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcKIAkJCSAgICAiXHRcdHBoeV9pZD0lZCBzYXNfYWRkcmVzcz0weCUwMThsbFhcbiIsCiAJCQkgICAgaiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCSAgICBwaHlfaW5mb19jbXAtPmF0dGFjaGVkLnNhc19hZGRyZXNzKSk7CkBAIC01NTksMjEgKzU0NSwxOSBAQAogCiAgb3V0OgogCi0jaWZkZWYgTVBUX0RFQlVHX1NBU19XSURFCiAJZm9yIChpID0gMDsgaSA8IHBvcnRfaW5mby0+bnVtX3BoeXM7IGkrKykgewogCQlwb3J0X2RldGFpbHMgPSBwb3J0X2luZm8tPnBoeV9pbmZvW2ldLnBvcnRfZGV0YWlsczsKIAkJaWYgKCFwb3J0X2RldGFpbHMpCiAJCQljb250aW51ZTsKLQkJZHNhc3dpZGVwcmludGsoKEtFUk5fREVCVUcKKwkJZHNhc3dpZGVwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRwogCQkgICAgIiVzOiBbJXBdOiBwaHlfaWQ9JTAyZCBudW1fcGh5cz0lMDJkICIKIAkJICAgICJiaXRtYXNrPTB4JTAxNmxsWFxuIiwgX19GVU5DVElPTl9fLAogCQkgICAgcG9ydF9kZXRhaWxzLCBpLCBwb3J0X2RldGFpbHMtPm51bV9waHlzLAogCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb3J0X2RldGFpbHMtPnBoeV9iaXRtYXNrKSk7Ci0JCWRzYXN3aWRlcHJpbnRrKChLRVJOX0RFQlVHIlx0XHRwb3J0ID0gJXAgcnBoeT0lcFxuIiwKKwkJZHNhc3dpZGVwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyJcdFx0cG9ydCA9ICVwIHJwaHk9JXBcbiIsCiAJCQlwb3J0X2RldGFpbHMtPnBvcnQsIHBvcnRfZGV0YWlscy0+cnBoeSkpOwogCX0KLQlkc2Fzd2lkZXByaW50aygoS0VSTl9ERUJVRyJcbiIpKTsKLSNlbmRpZgorCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUciXG4iKSk7CiAJbXV0ZXhfdW5sb2NrKCZpb2MtPnNhc190b3BvbG9neV9tdXRleCk7CiB9CiAKQEAgLTYyMiw3ICs2MDYsNyBAQAogCVNDU0lUYXNrTWdtdF90CSpwU2NzaVRtOwogCiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKGlvYy0+VGFza0N0eCwgaW9jKSkgPT0gTlVMTCkgewotCQlkZmFpbHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiJXMsIG5vIG1zZyBmcmFtZXMgQCVkISFcbiIsCisJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIiVzLCBubyBtc2cgZnJhbWVzIEAlZCEhXG4iLAogCQkgICAgaW9jLT5uYW1lLF9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjM3LDEyICs2MjEsMTIgQEAKIAlwU2NzaVRtLT5UYXNrVHlwZSA9IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfVEFSR0VUX1JFU0VUOwogCXBTY3NpVG0tPk1zZ0ZsYWdzID0gTVBJX1NDU0lUQVNLTUdNVF9NU0dGTEFHU19MSVBSRVNFVF9SRVNFVF9PUFRJT047CiAKLQlEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKG1mKTsKKwlEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKGlvYywgKHUzMiAqKW1mKTsKIAogCWlmIChtcHRfc2VuZF9oYW5kc2hha2VfcmVxdWVzdChpb2MtPlRhc2tDdHgsIGlvYywKIAkgICAgc2l6ZW9mKFNDU0lUYXNrTWdtdF90KSwgKHUzMiAqKW1mLCBOT19TTEVFUCkpIHsKIAkJbXB0X2ZyZWVfbXNnX2ZyYW1lKGlvYywgbWYpOwotCQlkZmFpbHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiJXMsIHRtIGhhbmRzaGFrZSBmYWlsZWQgQCVkISFcbiIsCisJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIiVzLCB0bSBoYW5kc2hha2UgZmFpbGVkIEAlZCEhXG4iLAogCQkgICAgaW9jLT5uYW1lLF9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjgxLDcgKzY2NSw3IEBACiAJdGFyZ2V0X3Jlc2V0X2xpc3QgPSBremFsbG9jKHNpemVvZigqdGFyZ2V0X3Jlc2V0X2xpc3QpLAogCSAgICBHRlBfQVRPTUlDKTsKIAlpZiAoIXRhcmdldF9yZXNldF9saXN0KSB7Ci0JCWRmYWlscHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICIlcywgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBAJWQuLiEhXG4iLAorCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICIlcywgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBAJWQuLiEhXG4iLAogCQkgICAgaW9jLT5uYW1lLF9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJcmV0dXJuOwogCX0KQEAgLTc0OCw3ICs3MzIsNyBAQAogCiAJZXYgPSBremFsbG9jKHNpemVvZigqZXYpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWV2KSB7Ci0JCWRmYWlscHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICIlcywgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBAJWQuLiEhXG4iLAorCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICIlcywgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbSBAJWQuLiEhXG4iLAogCQkgICAgaW9jLT5uYW1lLF9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJcmV0dXJuOwogCX0KQEAgLTExNjgsNyArMTE1Miw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlX2NvbnNpc3RlbnQ7CiAKLQltcHRzYXNfcHJpbnRfcGh5X3BnMShidWZmZXIpOworCW1wdHNhc19wcmludF9waHlfcGcxKGlvYywgYnVmZmVyKTsKIAogCXBoeS0+aW52YWxpZF9kd29yZF9jb3VudCA9IGxlMzJfdG9fY3B1KGJ1ZmZlci0+SW52YWxpZER3b3JkQ291bnQpOwogCXBoeS0+cnVubmluZ19kaXNwYXJpdHlfZXJyb3JfY291bnQgPQpAQCAtMTM5Nyw3ICsxMzgxLDcgQEAKIAkgICAgbGUxNl90b19jcHUoYnVmZmVyLT5OdmRhdGFWZXJzaW9uRGVmYXVsdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcG9ydF9pbmZvLT5udW1fcGh5czsgaSsrKSB7Ci0JCW1wdHNhc19wcmludF9waHlfZGF0YSgmYnVmZmVyLT5QaHlEYXRhW2ldKTsKKwkJbXB0c2FzX3ByaW50X3BoeV9kYXRhKGlvYywgJmJ1ZmZlci0+UGh5RGF0YVtpXSk7CiAJCXBvcnRfaW5mby0+cGh5X2luZm9baV0ucGh5X2lkID0gaTsKIAkJcG9ydF9pbmZvLT5waHlfaW5mb1tpXS5wb3J0X2lkID0KIAkJICAgIGJ1ZmZlci0+UGh5RGF0YVtpXS5Qb3J0OwpAQCAtMTUyMiw3ICsxNTA2LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZyZWVfY29uc2lzdGVudDsKIAotCW1wdHNhc19wcmludF9waHlfcGcwKGJ1ZmZlcik7CisJbXB0c2FzX3ByaW50X3BoeV9wZzAoaW9jLCBidWZmZXIpOwogCiAJcGh5X2luZm8tPmh3X2xpbmtfcmF0ZSA9IGJ1ZmZlci0+SHdMaW5rUmF0ZTsKIAlwaHlfaW5mby0+cHJvZ3JhbW1lZF9saW5rX3JhdGUgPSBidWZmZXItPlByb2dyYW1tZWRMaW5rUmF0ZTsKQEAgLTE1ODksNyArMTU3Myw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcmVlX2NvbnNpc3RlbnQ7CiAKLQltcHRzYXNfcHJpbnRfZGV2aWNlX3BnMChidWZmZXIpOworCW1wdHNhc19wcmludF9kZXZpY2VfcGcwKGlvYywgYnVmZmVyKTsKIAogCWRldmljZV9pbmZvLT5oYW5kbGUgPSBsZTE2X3RvX2NwdShidWZmZXItPkRldkhhbmRsZSk7CiAJZGV2aWNlX2luZm8tPmhhbmRsZV9wYXJlbnQgPSBsZTE2X3RvX2NwdShidWZmZXItPlBhcmVudERldkhhbmRsZSk7CkBAIC0xNzM3LDcgKzE3MjEsNyBAQAogCQlnb3RvIG91dF9mcmVlX2NvbnNpc3RlbnQ7CiAKIAotCW1wdHNhc19wcmludF9leHBhbmRlcl9wZzEoYnVmZmVyKTsKKwltcHRzYXNfcHJpbnRfZXhwYW5kZXJfcGcxKGlvYywgYnVmZmVyKTsKIAogCS8qIHNhdmUgY29uZmlnIGRhdGEgKi8KIAlwaHlfaW5mby0+cGh5X2lkID0gYnVmZmVyLT5QaHlJZGVudGlmaWVyOwpAQCAtMTk0NiwxNyArMTkzMCwxNyBAQAogCQkJfQogCQkJZXJyb3IgPSBzYXNfcG9ydF9hZGQocG9ydCk7CiAJCQlpZiAoZXJyb3IpIHsKLQkJCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UCisJCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJCSIlczogZXhpdCBhdCBsaW5lPSVkXG4iLCBpb2MtPm5hbWUsCiAJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCW1wdHNhc19zZXRfcG9ydChwaHlfaW5mbywgcG9ydCk7Ci0JCQlkc2Fzd2lkZXByaW50aygoS0VSTl9ERUJVRworCQkJbXB0c2FzX3NldF9wb3J0KGlvYywgcGh5X2luZm8sIHBvcnQpOworCQkJZHNhc3dpZGVwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRwogCQkJICAgICJzYXNfcG9ydF9hbGxvYzogcG9ydD0lcCBkZXY9JXAgcG9ydF9pZD0lZFxuIiwKIAkJCSAgICBwb3J0LCBkZXYsIHBvcnQtPnBvcnRfaWRlbnRpZmllcikpOwogCQl9Ci0JCWRzYXN3aWRlcHJpbnRrKChLRVJOX0RFQlVHICJzYXNfcG9ydF9hZGRfcGh5OiBwaHlfaWQ9JWRcbiIsCisJCWRzYXN3aWRlcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgInNhc19wb3J0X2FkZF9waHk6IHBoeV9pZD0lZFxuIiwKIAkJICAgIHBoeV9pbmZvLT5waHlfaWQpKTsKIAkJc2FzX3BvcnRfYWRkX3BoeShwb3J0LCBwaHlfaW5mby0+cGh5KTsKIAkJcGh5X2luZm8tPnNhc19wb3J0X2FkZF9waHkgPSAwOwpAQCAtMjAxNyw3ICsyMDAxLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICghcnBoeSkgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQlnb3RvIG91dDsKQEAgLTIwMjYsMTMgKzIwMTAsMTMgQEAKIAkJcnBoeS0+aWRlbnRpZnkgPSBpZGVudGlmeTsKIAkJZXJyb3IgPSBzYXNfcnBoeV9hZGQocnBoeSk7CiAJCWlmIChlcnJvcikgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQlzYXNfcnBoeV9mcmVlKHJwaHkpOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJbXB0c2FzX3NldF9ycGh5KHBoeV9pbmZvLCBycGh5KTsKKwkJbXB0c2FzX3NldF9ycGh5KGlvYywgcGh5X2luZm8sIHJwaHkpOwogCX0KIAogIG91dDoKQEAgLTIyNTgsMTggKzIyNDIsMTcgQEAKIAkJCQlpZiAocGh5X2luZm8tPmF0dGFjaGVkLnNhc19hZGRyZXNzICE9CiAJCQkJCWV4cGFuZGVyX3Nhc19hZGRyZXNzKQogCQkJCQljb250aW51ZTsKLSNpZmRlZiBNUFRfREVCVUdfU0FTX1dJREUKLQkJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwb3J0LT5kZXYsCi0JCQkJICAgICJkZWxldGUgcG9ydCAoJWQpXG4iLCBwb3J0LT5wb3J0X2lkZW50aWZpZXIpOwotI2VuZGlmCisJCQkJZHNhc3dpZGVwcmludGsoaW9jLAorCQkJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwb3J0LT5kZXYsCisJCQkJCSJkZWxldGUgcG9ydCAoJWQpXG4iLCBwb3J0LT5wb3J0X2lkZW50aWZpZXIpKTsKIAkJCQlzYXNfcG9ydF9kZWxldGUocG9ydCk7Ci0JCQkJbXB0c2FzX3BvcnRfZGVsZXRlKHBoeV9pbmZvLT5wb3J0X2RldGFpbHMpOworCQkJCW1wdHNhc19wb3J0X2RlbGV0ZShpb2MsIHBoeV9pbmZvLT5wb3J0X2RldGFpbHMpOwogCQkJfQogIG5leHRfcG9ydDoKIAogCQkJcGh5X2luZm8gPSBwb3J0X2luZm8tPnBoeV9pbmZvOwogCQkJZm9yIChpID0gMDsgaSA8IHBvcnRfaW5mby0+bnVtX3BoeXM7IGkrKywgcGh5X2luZm8rKykKLQkJCQltcHRzYXNfcG9ydF9kZWxldGUocGh5X2luZm8tPnBvcnRfZGV0YWlscyk7CisJCQkJbXB0c2FzX3BvcnRfZGVsZXRlKGlvYywgcGh5X2luZm8tPnBvcnRfZGV0YWlscyk7CiAKIAkJCWxpc3RfZGVsKCZwb3J0X2luZm8tPmxpc3QpOwogCQkJa2ZyZWUocG9ydF9pbmZvLT5waHlfaW5mbyk7CkBAIC0yNTU1LDcgKzI1MzgsNyBAQAogCQkJCSAgICAoTVBJX1NBU19ERVZJQ0VfUEdBRF9GT1JNX0JVU19UQVJHRVRfSUQgPDwKIAkJCQkgICAgIE1QSV9TQVNfREVWSUNFX1BHQURfRk9STV9TSElGVCksCiAJCQkJICAgIChldi0+Y2hhbm5lbCA8PCA4KSArIGV2LT5pZCkpIHsKLQkJCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0VSUl9GTVQKIAkJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJCQkJYnJlYWs7CkBAIC0yNTc1LDIwICsyNTU4LDIwIEBACiAJCSAqIFNhbml0eSBjaGVja3MsIGZvciBub24tZXhpc3RpbmcgcGh5cyBhbmQgcmVtb3RlIHJwaHlzLgogCQkgKi8KIAkJaWYgKCFwaHlfaW5mbyl7Ci0JCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UCisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0VSUl9GTVQKIAkJCQkiJXM6IGV4aXQgYXQgbGluZT0lZFxuIiwgaW9jLT5uYW1lLAogCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmICghcGh5X2luZm8tPnBvcnRfZGV0YWlscykgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCSAgICAgICAJX19GVU5DVElPTl9fLCBfX0xJTkVfXykpOwogCQkJYnJlYWs7CiAJCX0KIAkJcnBoeSA9IG1wdHNhc19nZXRfcnBoeShwaHlfaW5mbyk7CiAJCWlmICghcnBoeSkgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCSAgICAgICAJX19GVU5DVElPTl9fLCBfX0xJTkVfXykpOwogCQkJYnJlYWs7CkBAIC0yNTk2LDcgKzI1NzksNyBAQAogCiAJCXBvcnQgPSBtcHRzYXNfZ2V0X3BvcnQocGh5X2luZm8pOwogCQlpZiAoIXBvcnQpIHsKLQkJCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQKKwkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAogCQkJCSIlczogZXhpdCBhdCBsaW5lPSVkXG4iLCBpb2MtPm5hbWUsCiAJCQkgICAgICAgCV9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJCWJyZWFrOwpAQCAtMjYwNyw3ICsyNTkwLDcgQEAKIAkJCXZ0YXJnZXQgPSBzdGFyZ2V0LT5ob3N0ZGF0YTsKIAogCQkJaWYgKCF2dGFyZ2V0KSB7Ci0JCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAogCQkJCQkiJXM6IGV4aXQgYXQgbGluZT0lZFxuIiwgaW9jLT5uYW1lLAogCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQkJYnJlYWs7CkBAIC0yNjQ1LDEyICsyNjI4LDEwIEBACiAJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UCiAJCSAgICAgICAicmVtb3ZpbmcgJXMgZGV2aWNlLCBjaGFubmVsICVkLCBpZCAlZCwgcGh5ICVkXG4iLAogCQkgICAgICAgaW9jLT5uYW1lLCBkcywgZXYtPmNoYW5uZWwsIGV2LT5pZCwgcGh5X2luZm8tPnBoeV9pZCk7Ci0jaWZkZWYgTVBUX0RFQlVHX1NBU19XSURFCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBvcnQtPmRldiwKIAkJICAgICJkZWxldGUgcG9ydCAoJWQpXG4iLCBwb3J0LT5wb3J0X2lkZW50aWZpZXIpOwotI2VuZGlmCiAJCXNhc19wb3J0X2RlbGV0ZShwb3J0KTsKLQkJbXB0c2FzX3BvcnRfZGVsZXRlKHBoeV9pbmZvLT5wb3J0X2RldGFpbHMpOworCQltcHRzYXNfcG9ydF9kZWxldGUoaW9jLCBwaHlfaW5mby0+cG9ydF9kZXRhaWxzKTsKIAkJYnJlYWs7CiAJY2FzZSBNUFRTQVNfQUREX0RFVklDRToKIApAQCAtMjY2NCw3ICsyNjQ1LDcgQEAKIAkJICAgIChNUElfU0FTX0RFVklDRV9QR0FEX0ZPUk1fQlVTX1RBUkdFVF9JRCA8PAogCQkgICAgIE1QSV9TQVNfREVWSUNFX1BHQURfRk9STV9TSElGVCksCiAJCQkoZXYtPmNoYW5uZWwgPDwgOCkgKyBldi0+aWQpKSB7Ci0JCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAogCQkJCQkiJXM6IGV4aXQgYXQgbGluZT0lZFxuIiwgaW9jLT5uYW1lLAogCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQlicmVhazsKQEAgLTI2NzYsNyArMjY1Nyw3IEBACiAJCQkJc2FzX2RldmljZS5zYXNfYWRkcmVzcyk7CiAKIAkJaWYgKCFwaHlfaW5mbyB8fCAhcGh5X2luZm8tPnBvcnRfZGV0YWlscykgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCSAgICAgICAJX19GVU5DVElPTl9fLCBfX0xJTkVfXykpOwogCQkJYnJlYWs7CkBAIC0yNjg4LDcgKzI2NjksNyBAQAogCQkJdnRhcmdldCA9IHN0YXJnZXQtPmhvc3RkYXRhOwogCiAJCQlpZiAoIXZ0YXJnZXQpIHsKLQkJCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UCisJCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJCSIlczogZXhpdCBhdCBsaW5lPSVkXG4iLCBpb2MtPm5hbWUsCiAJCQkJICAgICAgIAlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQkJYnJlYWs7CkBAIC0yNzExLDcgKzI2OTIsNyBAQAogCQl9CiAKIAkJaWYgKG1wdHNhc19nZXRfcnBoeShwaHlfaW5mbykpIHsKLQkJCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQKKwkJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAogCQkJCSIlczogZXhpdCBhdCBsaW5lPSVkXG4iLCBpb2MtPm5hbWUsCiAJCQkgICAgICAgCV9fRlVOQ1RJT05fXywgX19MSU5FX18pKTsKIAkJCWlmIChldi0+Y2hhbm5lbCkgcHJpbnRrKCIlZFxuIiwgX19MSU5FX18pOwpAQCAtMjcyMCw3ICsyNzAxLDcgQEAKIAogCQlwb3J0ID0gbXB0c2FzX2dldF9wb3J0KHBoeV9pbmZvKTsKIAkJaWYgKCFwb3J0KSB7Ci0JCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UCisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0VSUl9GTVQKIAkJCQkiJXM6IGV4aXQgYXQgbGluZT0lZFxuIiwgaW9jLT5uYW1lLAogCQkJICAgICAgIAlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQlicmVhazsKQEAgLTI3NDUsNyArMjcyNiw3IEBACiAJCW1wdHNhc19wYXJzZV9kZXZpY2VfaW5mbygmaWRlbnRpZnksICZwaHlfaW5mby0+YXR0YWNoZWQpOwogCQlycGh5ID0gc2FzX2VuZF9kZXZpY2VfYWxsb2MocG9ydCk7CiAJCWlmICghcnBoeSkgewotCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVAorCQkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19FUlJfRk1UCiAJCQkJIiVzOiBleGl0IGF0IGxpbmU9JWRcbiIsIGlvYy0+bmFtZSwKIAkJCSAgICAgICAJX19GVU5DVElPTl9fLCBfX0xJTkVfXykpOwogCQkJYnJlYWs7IC8qIG5vbi1mYXRhbDogYW4gcnBoeSBjYW4gYmUgYWRkZWQgbGF0ZXIgKi8KQEAgLTI3NTMsMTMgKzI3MzQsMTMgQEAKIAogCQlycGh5LT5pZGVudGlmeSA9IGlkZW50aWZ5OwogCQlpZiAoc2FzX3JwaHlfYWRkKHJwaHkpKSB7Ci0JCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UCisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0VSUl9GTVQKIAkJCQkiJXM6IGV4aXQgYXQgbGluZT0lZFxuIiwgaW9jLT5uYW1lLAogCQkJICAgICAgIAlfX0ZVTkNUSU9OX18sIF9fTElORV9fKSk7CiAJCQlzYXNfcnBoeV9mcmVlKHJwaHkpOwogCQkJYnJlYWs7CiAJCX0KLQkJbXB0c2FzX3NldF9ycGh5KHBoeV9pbmZvLCBycGh5KTsKKwkJbXB0c2FzX3NldF9ycGh5KGlvYywgcGh5X2luZm8sIHJwaHkpOwogCQlicmVhazsKIAljYXNlIE1QVFNBU19BRERfUkFJRDoKIAkJc2RldiA9IHNjc2lfZGV2aWNlX2xvb2t1cChpb2MtPnNoLCBNUFRTQVNfUkFJRF9DSEFOTkVMLApAQCAtMzE3NSw3ICszMTU2LDcgQEAKIAogCWlmIChudW1TR0UgPCBzaC0+c2dfdGFibGVzaXplKSB7CiAJCS8qIFJlc2V0IHRoaXMgdmFsdWUgKi8KLQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCSAgIlJlc2V0dGluZyBzZ190YWJsZXNpemUgdG8gJWQgZnJvbSAlZFxuIiwKIAkJICBpb2MtPm5hbWUsIG51bVNHRSwgc2gtPnNnX3RhYmxlc2l6ZSkpOwogCQlzaC0+c2dfdGFibGVzaXplID0gbnVtU0dFOwpAQCAtMzE5Myw3ICszMTc0LDcgQEAKIAkJZ290byBvdXRfbXB0c2FzX3Byb2JlOwogCX0KIAotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNjc2lMb29rdXAgQCAlcFxuIiwKKwlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTY3NpTG9va3VwIEAgJXBcbiIsCiAJCSBpb2MtPm5hbWUsIGhkLT5TY3NpTG9va3VwKSk7CiAKIAkvKiBDbGVhciB0aGUgVE0gZmxhZ3MKQEAgLTMyMzMsNyArMzIxNCw3IEBACiAKIAllcnJvciA9IHNjc2lfYWRkX2hvc3Qoc2gsICZpb2MtPnBjaWRldi0+ZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJZHByaW50aygoS0VSTl9FUlIgTVlOQU0KKwkJZHByaW50ayhpb2MsIHByaW50ayhLRVJOX0VSUiBNWU5BTQogCQkgICJzY3NpX2FkZF9ob3N0IGZhaWxlZFxuIikpOwogCQlnb3RvIG91dF9tcHRzYXNfcHJvYmU7CiAJfQpAQCAtMzI2MSw3ICszMjQyLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJmlvYy0+c2FzX3RvcG9sb2d5LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZwLT5saXN0KTsKIAkJZm9yIChpID0gMCA7IGkgPCBwLT5udW1fcGh5cyA7IGkrKykKLQkJCW1wdHNhc19wb3J0X2RlbGV0ZShwLT5waHlfaW5mb1tpXS5wb3J0X2RldGFpbHMpOworCQkJbXB0c2FzX3BvcnRfZGVsZXRlKGlvYywgcC0+cGh5X2luZm9baV0ucG9ydF9kZXRhaWxzKTsKIAkJa2ZyZWUocC0+cGh5X2luZm8pOwogCQlrZnJlZShwKTsKIAl9CkBAIC0zMzE2LDE1ICszMjk3LDggQEAKIAkJbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZSwgTVBUU0FTX0RSSVZFUik7CiAJbXB0c2FzTWdtdEN0eCA9IG1wdF9yZWdpc3RlcihtcHRzYXNfbWdtdF9kb25lLCBNUFRTQVNfRFJJVkVSKTsKIAotCWlmIChtcHRfZXZlbnRfcmVnaXN0ZXIobXB0c2FzRG9uZUN0eCwgbXB0c2FzX2V2ZW50X3Byb2Nlc3MpID09IDApIHsKLQkJZGV2dHZlcmJvc2VwcmludGsoKEtFUk5fSU5GTyBNWU5BTQotCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyBldmVudCBub3RpZmljYXRpb25zXG4iKSk7Ci0JfQotCi0JaWYgKG1wdF9yZXNldF9yZWdpc3RlcihtcHRzYXNEb25lQ3R4LCBtcHRzYXNfaW9jX3Jlc2V0KSA9PSAwKSB7Ci0JCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQotCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyByZXNldCBub3RpZmljYXRpb25zXG4iKSk7Ci0JfQorCW1wdF9ldmVudF9yZWdpc3RlcihtcHRzYXNEb25lQ3R4LCBtcHRzYXNfZXZlbnRfcHJvY2Vzcyk7CisJbXB0X3Jlc2V0X3JlZ2lzdGVyKG1wdHNhc0RvbmVDdHgsIG1wdHNhc19pb2NfcmVzZXQpOwogCiAJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtcHRzYXNfZHJpdmVyKTsKIAlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggZmQzYWEyNi4uNTQzMTUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJaW50IHJjOwogCWludCBjaGFpbl9pZHg7CiAKLQlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciBjYWxsZWRcbiIsCisJZHNncHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgY2FsbGVkXG4iLAogCQkJaW9jLT5uYW1lKSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CiAJaWYgKCFsaXN0X2VtcHR5KCZpb2MtPkZyZWVDaGFpblEpKSB7CkBAIC0yMDMsMTIgKzIwMywxMiBAQAogCQlvZmZzZXQgPSAodTggKiljaGFpbkJ1ZiAtICh1OCAqKWlvYy0+Q2hhaW5CdWZmZXI7CiAJCWNoYWluX2lkeCA9IG9mZnNldCAvIGlvYy0+cmVxX3N6OwogCQlyYyA9IFNVQ0NFU1M7Ci0JCWRzZ3ByaW50aygoTVlJT0Nfc19FUlJfRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgY2hhaW5CdWY9JXAgQ2hhaW5CdWZmZXI9JXAgb2Zmc2V0PSVkIGNoYWluX2lkeD0lZFxuIiwKKwkJZHNncHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgY2hhaW5CdWY9JXAgQ2hhaW5CdWZmZXI9JXAgb2Zmc2V0PSVkIGNoYWluX2lkeD0lZFxuIiwKIAkJCWlvYy0+bmFtZSwgY2hhaW5CdWYsIGlvYy0+Q2hhaW5CdWZmZXIsIG9mZnNldCwgY2hhaW5faWR4KSk7CiAJfSBlbHNlIHsKIAkJcmMgPSBGQUlMRUQ7CiAJCWNoYWluX2lkeCA9IE1QVF9IT1NUX05PX0NIQUlOOwotCQlkZmFpbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZ2V0RnJlZUNoYWluQnVmZmVyIGZhaWxlZFxuIiwKKwkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciBmYWlsZWRcbiIsCiAJCQlpb2MtPm5hbWUpKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJICovCiAJCQlwUmVxLT5DaGFpbk9mZnNldCA9IDA7CiAJCQlSZXF1ZXN0TkIgPSAoKChzZ2VPZmZzZXQgLSAxKSA+PiBpb2MtPk5CU2hpZnRGYWN0b3IpICArIDEpICYgMHgwMzsKLQkJCWRzZ3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJZHNncHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCQkgICAgIlNpbmdsZSBCdWZmZXIgUmVxdWVzdE5CPSV4LCBzZ2VPZmZzZXQ9JWRcbiIsIGlvYy0+bmFtZSwgUmVxdWVzdE5CLCBzZ2VPZmZzZXQpKTsKIAkJCWlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdID0gUmVxdWVzdE5COwogCQl9CkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJICogTG9vcCB1bnRpbCBkb25lLgogCQkgKi8KIAotCQlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNHOiBDaGFpbiBSZXF1aXJlZCEgc2cgZG9uZSAlZFxuIiwKKwkJZHNncHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTRzogQ2hhaW4gUmVxdWlyZWQhIHNnIGRvbmUgJWRcbiIsCiAJCQkJaW9jLT5uYW1lLCBzZ19kb25lKSk7CiAKIAkJLyogU2V0IExBU1RfRUxFTUVOVCBmbGFnIGZvciBsYXN0IG5vbi1jaGFpbiBlbGVtZW50CkBAIC0zODYsNyArMzg2LDcgQEAKIAkJCSAqLwogCQkJcFJlcS0+Q2hhaW5PZmZzZXQgPSAodTgpIChzZ2VPZmZzZXQgPj4gMik7CiAJCQlSZXF1ZXN0TkIgPSAoKChzZ2VPZmZzZXQgLSAxKSA+PiBpb2MtPk5CU2hpZnRGYWN0b3IpICArIDEpICYgMHgwMzsKLQkJCWRzZ3ByaW50aygoTVlJT0Nfc19FUlJfRk1UICJDaGFpbiBCdWZmZXIgTmVlZGVkLCBSZXF1ZXN0TkI9JXggc2dlT2Zmc2V0PSVkXG4iLCBpb2MtPm5hbWUsIFJlcXVlc3ROQiwgc2dlT2Zmc2V0KSk7CisJCQlkc2dwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkNoYWluIEJ1ZmZlciBOZWVkZWQsIFJlcXVlc3ROQj0leCBzZ2VPZmZzZXQ9JWRcbiIsIGlvYy0+bmFtZSwgUmVxdWVzdE5CLCBzZ2VPZmZzZXQpKTsKIAkJCWlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdID0gUmVxdWVzdE5COwogCQl9CiAKQEAgLTM5Nyw3ICszOTcsNyBAQAogCQkgKiBpbiBjdXJyZW50IGJ1ZmZlci4gR2V0IGEgY2hhaW4gYnVmZmVyLgogCQkgKi8KIAkJaWYgKChtcHRzY3NpaF9nZXRGcmVlQ2hhaW5CdWZmZXIoaW9jLCAmbmV3SW5kZXgpKSA9PSBGQUlMRUQpIHsKLQkJCWRmYWlscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCQlkZmFpbHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCQkJICAgICJnZXRGcmVlQ2hhaW5CdWZmZXIgRkFJTEVEIFNDU0kgY21kPSUwMnggKCVwKVxuIiwKICAJCQkgICAgaW9jLT5uYW1lLCBwUmVxLT5DREJbMF0sIFNDcG50KSk7CiAJCQlyZXR1cm4gRkFJTEVEOwpAQCAtNDE5LDcgKzQxOSw3IEBACiAJCSAqICAgb3V0IHRoZSBBZGRyZXNzIGFuZCBGbGFncyBmaWVsZHMuCiAJCSAqLwogCQljaGFpblNnZSA9IChjaGFyICopIHBzZ2U7Ci0JCWRzZ3ByaW50aygoS0VSTl9JTkZPICIgIEN1cnJlbnQgYnVmZiBAICVwIChpbmRleCAweCV4KSIsCisJCWRzZ3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICIgIEN1cnJlbnQgYnVmZiBAICVwIChpbmRleCAweCV4KSIsCiAJCQkJcHNnZSwgcmVxX2lkeCkpOwogCiAJCS8qIFN0YXJ0IHRoZSBTR0UgZm9yIHRoZSBuZXh0IGJ1ZmZlcgpAQCAtNDI4LDcgKzQyOCw3IEBACiAJCXNnZU9mZnNldCA9IDA7CiAJCXNnX2RvbmUgPSAwOwogCi0JCWRzZ3ByaW50aygoS0VSTl9JTkZPICIgIENoYWluIGJ1ZmYgQCAlcCAoaW5kZXggMHgleClcbiIsCisJCWRzZ3ByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHICIgIENoYWluIGJ1ZmYgQCAlcCAoaW5kZXggMHgleClcbiIsCiAJCQkJcHNnZSwgY2hhaW5faWR4KSk7CiAKIAkJLyogU3RhcnQgdGhlIFNHRSBmb3IgdGhlIG5leHQgYnVmZmVyCkBAIC00NTYsNyArNDU2LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKGlvYy0+SW50ZXJuYWxDdHgsIGlvYykpID09IE5VTEwpIHsKLQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIiVzOiBubyBtc2cgZnJhbWVzISFcbiIsCisJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIiVzOiBubyBtc2cgZnJhbWVzISFcbiIsCiAJCSAgICBpb2MtPm5hbWUsX19GVU5DVElPTl9fKSk7CiAJCXJldHVybjsKIAl9CkBAIC00NjcsOTMgKzQ2NywxNTggQEAKIAlTRVBNc2ctPlRhcmdldElEID0gdnRhcmdldC0+aWQ7CiAJU0VQTXNnLT5BY3Rpb24gPSBNUElfU0VQX1JFUV9BQ1RJT05fV1JJVEVfU1RBVFVTOwogCVNFUE1zZy0+U2xvdFN0YXR1cyA9IFNsb3RTdGF0dXM7Ci0JZGV2dHZlcmJvc2VwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQKKwlkZXZ0dmVyYm9zZXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCSAgICAiU2VuZGluZyBTRVAgY21kPSV4IGNoYW5uZWw9JWQgaWQ9JWRcbiIsCiAJICAgIGlvYy0+bmFtZSwgU2xvdFN0YXR1cywgU0VQTXNnLT5CdXMsIFNFUE1zZy0+VGFyZ2V0SUQpKTsKIAltcHRfcHV0X21zZ19mcmFtZShpb2MtPkRvbmVDdHgsIGlvYywgbWYpOwogfQogCi0jaWZkZWYgTVBUX0RFQlVHX1JFUExZCisjaWZkZWYgQ09ORklHX0ZVU0lPTl9MT0dHSU5HCiAvKioKLSAqCW1wdHNjc2loX2lvY3N0YXR1c19pbmZvX3Njc2lpbyAtIElPQ1NUQVRVUyBpbmZvcm1hdGlvbiBmb3IgU0NTSUlPCisgKgltcHRzY3NpaF9pbmZvX3Njc2lpbyAtIGRlYnVnIHByaW50IGluZm8gb24gcmVwbHkgZnJhbWUKICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCi0gKglAaW9jX3N0YXR1czogVTMyIElPQ1N0YXR1cyB3b3JkIGZyb20gSU9DCi0gKglAc2NzaV9zdGF0dXM6IFU4IHNhbSBzdGF0dXMgZnJvbSB0YXJnZXQKLSAqCUBzY3NpX3N0YXRlOiBVOCBzY3NpIHN0YXRlCiAgKglAc2M6IG9yaWdpbmFsIHNjc2kgY21uZCBwb2ludGVyCi0gKglAbWY6IFBvaW50ZXIgdG8gTVBUIHJlcXVlc3QgZnJhbWUKKyAqCUBwU2NzaVJlcGx5OiBQb2ludGVyIHRvIE1QVCByZXBseSBmcmFtZQorICoKKyAqCU1QVF9ERUJVR19SRVBMWSBuZWVkcyB0byBiZSBlbmFibGVkIHRvIG9idGFpbiB0aGlzIGluZm8KICAqCiAgKglSZWZlciB0byBsc2kvbXBpLmguCiAgKiovCiBzdGF0aWMgdm9pZAotbXB0c2NzaWhfaW9jc3RhdHVzX2luZm9fc2NzaWlvKE1QVF9BREFQVEVSICppb2MsIHUzMiBpb2Nfc3RhdHVzLAotICAgIHU4IHNjc2lfc3RhdHVzLCB1OCBzY3NpX3N0YXRlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK21wdHNjc2loX2luZm9fc2NzaWlvKE1QVF9BREFQVEVSICppb2MsIHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBTQ1NJSU9SZXBseV90ICogcFNjc2lSZXBseSkKIHsKLQljaGFyIGV4dGVuZF9kZXNjW0VWRU5UX0RFU0NSX1NUUl9TWl07Ci0JY2hhciAqZGVzYyA9IE5VTEw7CisJY2hhcgkqZGVzYyA9IE5VTEw7CisJY2hhcgkqZGVzYzEgPSBOVUxMOworCXUxNglpb2Nfc3RhdHVzOworCXU4CXNrZXksIGFzYywgYXNjcTsKKworCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShwU2NzaVJlcGx5LT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOwogCiAJc3dpdGNoIChpb2Nfc3RhdHVzKSB7CiAKLQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9JTlZBTElEX0JVUzogLyogMHgwMDQxICovCi0JCWRlc2MgPSAiU0NTSSBJbnZhbGlkIEJ1cyI7CisJY2FzZSBNUElfSU9DU1RBVFVTX1NVQ0NFU1M6CisJCWRlc2MgPSAic3VjY2VzcyI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU5WQUxJRF9UQVJHRVRJRDogLyogMHgwMDQyICovCi0JCWRlc2MgPSAiU0NTSSBJbnZhbGlkIFRhcmdldElEIjsKKwljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9JTlZBTElEX0JVUzoKKwkJZGVzYyA9ICJpbnZhbGlkIGJ1cyI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfREVWSUNFX05PVF9USEVSRTogLyogMHgwMDQzICovCi0JCS8qCi0JCSAqIElucXVpcnkgaXMgaXNzdWVkIGZvciBkZXZpY2Ugc2Nhbm5pbmcKLQkJICovCi0JCWlmIChzYy0+Y21uZFswXSAhPSAweDEyKQotCQkJZGVzYyA9ICJTQ1NJIERldmljZSBOb3QgVGhlcmUiOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0lOVkFMSURfVEFSR0VUSUQ6CisJCWRlc2MgPSAiaW52YWxpZCB0YXJnZXRfaWQiOwogCQlicmVhazsKLQotCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfT1ZFUlJVTjogLyogMHgwMDQ0ICovCi0JCWRlc2MgPSAiU0NTSSBEYXRhIE92ZXJydW4iOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RFVklDRV9OT1RfVEhFUkU6CisJCWRlc2MgPSAiZGV2aWNlIG5vdCB0aGVyZSI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9fREFUQV9FUlJPUjogLyogMHgwMDQ2ICovCi0JCWRlc2MgPSAiU0NTSSBJL08gRGF0YSBFcnJvciI7CisJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfREFUQV9PVkVSUlVOOgorCQlkZXNjID0gImRhdGEgb3ZlcnJ1biI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfUFJPVE9DT0xfRVJST1I6IC8qIDB4MDA0NyAqLwotCQlkZXNjID0gIlNDU0kgUHJvdG9jb2wgRXJyb3IiOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU46CisJCWRlc2MgPSAiZGF0YSB1bmRlcnJ1biI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfVEFTS19URVJNSU5BVEVEOiAvKiAweDAwNDggKi8KLQkJZGVzYyA9ICJTQ1NJIFRhc2sgVGVybWluYXRlZCI7CisJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9fREFUQV9FUlJPUjoKKwkJZGVzYyA9ICJJL08gZGF0YSBlcnJvciI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfUkVTSURVQUxfTUlTTUFUQ0g6IC8qIDB4MDA0OSAqLwotCQlkZXNjID0gIlNDU0kgUmVzaWR1YWwgTWlzbWF0Y2giOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1BST1RPQ09MX0VSUk9SOgorCQlkZXNjID0gInByb3RvY29sIGVycm9yIjsKIAkJYnJlYWs7Ci0KLQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9UQVNLX01HTVRfRkFJTEVEOiAvKiAweDAwNEEgKi8KLQkJZGVzYyA9ICJTQ1NJIFRhc2sgTWFuYWdlbWVudCBGYWlsZWQiOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1RBU0tfVEVSTUlOQVRFRDoKKwkJZGVzYyA9ICJ0YXNrIHRlcm1pbmF0ZWQiOwogCQlicmVhazsKLQotCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0lPQ19URVJNSU5BVEVEOiAvKiAweDAwNEIgKi8KLQkJZGVzYyA9ICJTQ1NJIElPQyBUZXJtaW5hdGVkIjsKKwljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9SRVNJRFVBTF9NSVNNQVRDSDoKKwkJZGVzYyA9ICJyZXNpZHVhbCBtaXNtYXRjaCI7CiAJCWJyZWFrOwotCi0JY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfRVhUX1RFUk1JTkFURUQ6IC8qIDB4MDA0QyAqLwotCQlkZXNjID0gIlNDU0kgRXh0IFRlcm1pbmF0ZWQiOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1RBU0tfTUdNVF9GQUlMRUQ6CisJCWRlc2MgPSAidGFzayBtYW5hZ2VtZW50IGZhaWxlZCI7CisJCWJyZWFrOworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0lPQ19URVJNSU5BVEVEOgorCQlkZXNjID0gIklPQyB0ZXJtaW5hdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfRVhUX1RFUk1JTkFURUQ6CisJCWRlc2MgPSAiZXh0IHRlcm1pbmF0ZWQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXNjID0gIiI7CiAJCWJyZWFrOwogCX0KIAotCWlmICghZGVzYykKLQkJcmV0dXJuOworCXN3aXRjaCAocFNjc2lSZXBseS0+U0NTSVN0YXR1cykKKwl7CiAKLQlzbnByaW50ZihleHRlbmRfZGVzYywgRVZFTlRfREVTQ1JfU1RSX1NaLAotCSAgICAiWyVkOiVkOiVkOiVkXSBjbWQ9JTAyWGgsIHNhbV9zdGF0dXM9JTAyWGggc3RhdGU9JTAyWGgiLAotCQlzYy0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAotCQlzYy0+ZGV2aWNlLT5jaGFubmVsLCBzYy0+ZGV2aWNlLT5pZCwgc2MtPmRldmljZS0+bHVuLAotCQlzYy0+Y21uZFswXSwgc2NzaV9zdGF0dXMsIHNjc2lfc3RhdGUpOworCWNhc2UgTVBJX1NDU0lfU1RBVFVTX1NVQ0NFU1M6CisJCWRlc2MxID0gInN1Y2Nlc3MiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT046CisJCWRlc2MxID0gImNoZWNrIGNvbmRpdGlvbiI7CisJCWJyZWFrOworCWNhc2UgTVBJX1NDU0lfU1RBVFVTX0NPTkRJVElPTl9NRVQ6CisJCWRlc2MxID0gImNvbmRpdGlvbiBtZXQiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19CVVNZOgorCQlkZXNjMSA9ICJidXN5IjsKKwkJYnJlYWs7CisJY2FzZSBNUElfU0NTSV9TVEFUVVNfSU5URVJNRURJQVRFOgorCQlkZXNjMSA9ICJpbnRlcm1lZGlhdGUiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19JTlRFUk1FRElBVEVfQ09ORE1FVDoKKwkJZGVzYzEgPSAiaW50ZXJtZWRpYXRlIGNvbmRtZXQiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19SRVNFUlZBVElPTl9DT05GTElDVDoKKwkJZGVzYzEgPSAicmVzZXJ2YXRpb24gY29uZmxpY3QiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19DT01NQU5EX1RFUk1JTkFURUQ6CisJCWRlc2MxID0gImNvbW1hbmQgdGVybWluYXRlZCI7CisJCWJyZWFrOworCWNhc2UgTVBJX1NDU0lfU1RBVFVTX1RBU0tfU0VUX0ZVTEw6CisJCWRlc2MxID0gInRhc2sgc2V0IGZ1bGwiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19BQ0FfQUNUSVZFOgorCQlkZXNjMSA9ICJhY2EgYWN0aXZlIjsKKwkJYnJlYWs7CisJY2FzZSBNUElfU0NTSV9TVEFUVVNfRkNQRVhUX0RFVklDRV9MT0dHRURfT1VUOgorCQlkZXNjMSA9ICJmY3BleHQgZGV2aWNlIGxvZ2dlZCBvdXQiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19GQ1BFWFRfTk9fTElOSzoKKwkJZGVzYzEgPSAiZmNwZXh0IG5vIGxpbmsiOworCQlicmVhazsKKwljYXNlIE1QSV9TQ1NJX1NUQVRVU19GQ1BFWFRfVU5BU1NJR05FRDoKKwkJZGVzYzEgPSAiZmNwZXh0IHVuYXNzaWduZWQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXNjMSA9ICIiOworCQlicmVhazsKKwl9CiAKLQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiSU9DU3RhdHVzKDB4JTA0WCk6ICVzOiAlc1xuIiwKLQkgICAgaW9jLT5uYW1lLCBpb2Nfc3RhdHVzLCBkZXNjLCBleHRlbmRfZGVzYyk7CisJc2NzaV9wcmludF9jb21tYW5kKHNjKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRmd19jaGFubmVsID0gJWQsIGZ3X2lkID0gJWRcbiIsCisJICAgIHBTY3NpUmVwbHktPkJ1cywgcFNjc2lSZXBseS0+VGFyZ2V0SUQpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHJlcXVlc3RfbGVuID0gJWQsIHVuZGVyZmxvdyA9ICVkLCByZXNpZCA9ICVkXG4iLAorCSAgICBzY3NpX2J1ZmZsZW4oc2MpLCBzYy0+dW5kZXJmbG93LCBzY3NpX2dldF9yZXNpZChzYykpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHRhZyA9ICVkLCB0cmFuc2Zlcl9jb3VudCA9ICVkLCBzYy0+cmVzdWx0ID0gJTA4WFxuIiwKKwkgICAgbGUxNl90b19jcHUocFNjc2lSZXBseS0+VGFza1RhZyksCisJICAgIGxlMzJfdG9fY3B1KHBTY3NpUmVwbHktPlRyYW5zZmVyQ291bnQpLCBzYy0+cmVzdWx0KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJcdGlvY3N0YXR1cyA9ICVzICgweCUwNHgpLCAiCisJICAgICJzY3NpX3N0YXR1cyA9ICVzICgweCUwMngpLCBzY3NpX3N0YXRlID0gKDB4JTAyeClcbiIsCisJICAgIGRlc2MsIGlvY19zdGF0dXMsCisJICAgIGRlc2MxLCBwU2NzaVJlcGx5LT5TQ1NJU3RhdHVzLAorCSAgICBwU2NzaVJlcGx5LT5TQ1NJU3RhdGUpOworCisJaWYgKHBTY3NpUmVwbHktPlNDU0lTdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9WQUxJRCkgeworCQlza2V5ID0gc2MtPnNlbnNlX2J1ZmZlclsyXSAmIDB4MEY7CisJCWFzYyA9IHNjLT5zZW5zZV9idWZmZXJbMTJdOworCQlhc2NxID0gc2MtPnNlbnNlX2J1ZmZlclsxM107CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlx0W3NlbnNlX2tleSxhc2MsYXNjcV06ICIKKwkJICAgICJbMHglMDJ4LDB4JTAyeCwweCUwMnhdXG4iLAorCQkgICAgc2tleSwgYXNjLCBhc2NxKTsKKwl9CisKKwkvKgorCSAqICBMb29rIGZvciArIGR1bXAgRkNQIFJlc3BvbnNlSW5mb1tdIQorCSAqLworCWlmIChwU2NzaVJlcGx5LT5TQ1NJU3RhdGUgJiBNUElfU0NTSV9TVEFURV9SRVNQT05TRV9JTkZPX1ZBTElEICYmCisJICAgIHBTY3NpUmVwbHktPlJlc3BvbnNlSW5mbykKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlc3BvbnNlX2luZm8gPSAlMDh4aFxuIiwKKwkJICAgIGxlMzJfdG9fY3B1KHBTY3NpUmVwbHktPlJlc3BvbnNlSW5mbykpOwogfQogI2VuZGlmCiAKQEAgLTYyNywxMSArNjkyLDExIEBACiAJcFNjc2lSZXBseSA9IChTQ1NJSU9SZXBseV90ICopIG1yOwogCiAJaWYoKGlvYy0+ZmFjdHMuTXNnVmVyc2lvbiA+PSBNUElfVkVSU0lPTl8wMV8wNSkgJiYgcFNjc2lSZXBseSl7Ci0JCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQlkbWZwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJCSJTY3NpRG9uZSAobWY9JXAsbXI9JXAsc2M9JXAsaWR4PSVkLHRhc2stdGFnPSVkKVxuIiwKIAkJCWlvYy0+bmFtZSwgbWYsIG1yLCBzYywgcmVxX2lkeCwgcFNjc2lSZXBseS0+VGFza1RhZykpOwogCX1lbHNlewotCQlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJZG1mcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCQkiU2NzaURvbmUgKG1mPSVwLG1yPSVwLHNjPSVwLGlkeD0lZClcbiIsCiAJCQlpb2MtPm5hbWUsIG1mLCBtciwgc2MsIHJlcV9pZHgpKTsKIAl9CkBAIC03NTksNyArODI0LDcgQEAKIAkJCQlzYy0+cmVzdWx0PURJRF9TT0ZUX0VSUk9SIDw8IDE2OwogCQkJZWxzZSAvKiBTdWZmaWNpZW50IGRhdGEgdHJhbnNmZXIgb2NjdXJyZWQgKi8KIAkJCQlzYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzY3NpX3N0YXR1czsKLQkJCWRyZXBseXByaW50aygoS0VSTl9OT1RJQ0UKKwkJCWRyZXBseXByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHCiAJCQkgICAgIlJFU0lEVUFMX01JU01BVENIOiByZXN1bHQ9JXggb24gY2hhbm5lbD0lZCBpZD0lZFxuIiwKIAkJCSAgICBzYy0+cmVzdWx0LCBzYy0+ZGV2aWNlLT5jaGFubmVsLCBzYy0+ZGV2aWNlLT5pZCkpOwogCQkJYnJlYWs7CkBAIC03OTIsOSArODU3LDExIEBACiAJCQkJfQogCQkJfQogCi0JCQlkcmVwbHlwcmludGsoKEtFUk5fTk9USUNFICIgIHNjLT51bmRlcmZsb3c9e3JlcG9ydCBFUlIgaWYgPCAlMDJ4aCBieXRlcyB4ZmVyJ2R9XG4iLAorCisJCQlkcmVwbHlwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyAiICBzYy0+dW5kZXJmbG93PXtyZXBvcnQgRVJSIGlmIDwgJTAyeGggYnl0ZXMgeGZlcidkfVxuIiwKIAkJCQkJc2MtPnVuZGVyZmxvdykpOwotCQkJZHJlcGx5cHJpbnRrKChLRVJOX05PVElDRSAiICBBY3RCeXRlc1hmZXJkPSUwMnhoXG4iLCB4ZmVyX2NudCkpOworCQkJZHJlcGx5cHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIiAgQWN0Qnl0ZXNYZmVyZD0lMDJ4aFxuIiwgeGZlcl9jbnQpKTsKKwogCQkJLyogUmVwb3J0IFF1ZXVlIEZ1bGwKIAkJCSAqLwogCQkJaWYgKHNjc2lfc3RhdHVzID09IE1QSV9TQ1NJX1NUQVRVU19UQVNLX1NFVF9GVUxMKQpAQCAtODcxLDI3ICs5MzgsOSBAQAogCiAJCX0JLyogc3dpdGNoKHN0YXR1cykgKi8KIAotI2lmZGVmIE1QVF9ERUJVR19SRVBMWQotCQlpZiAoc2MtPnJlc3VsdCkgewotCi0JCQltcHRzY3NpaF9pb2NzdGF0dXNfaW5mb19zY3NpaW8oaW9jLCBzdGF0dXMsCi0JCQkgICAgc2NzaV9zdGF0dXMsIHNjc2lfc3RhdGUsIHNjKTsKLQotCQkJZHJlcGx5cHJpbnRrKCgiJXM6IFslZDolZDolZDolZF0gY21kPTB4JTAyeCAiCi0JCQkgICAgInJlc3VsdD0weCUwOHhcblx0aW9jc3RhdHVzPTB4JTA0WCAiCi0JCQkgICAgInNjc2lfc3RhdGU9MHglMDJYIHNjc2lfc3RhdHVzPTB4JTAyWCAiCi0JCQkgICAgImxvZ2luZm89MHglMDhYXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgc2MtPmRldmljZS0+aG9zdC0+aG9zdF9ubywgc2MtPmRldmljZS0+Y2hhbm5lbCwgc2MtPmRldmljZS0+aWQsCi0JCQkgICAgc2MtPmRldmljZS0+bHVuLCBzYy0+Y21uZFswXSwgc2MtPnJlc3VsdCwgc3RhdHVzLAotCQkJICAgIHNjc2lfc3RhdGUsIHNjc2lfc3RhdHVzLCBsb2dfaW5mbykpOwotCi0JCQlkcmVwbHlwcmludGsoKCIlczogWyVkOiVkOiVkOiVkXSByZXNpZD0lZCAiCi0JCQkJICAgICAgImJ1ZmZsZW49JWQgeGZlcl9jbnQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJCQkgICAgICBzYy0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAotCQkJCSAgICAgIHNjLT5kZXZpY2UtPmNoYW5uZWwsIHNjLT5kZXZpY2UtPmlkLAotCQkJCSAgICAgIHNjLT5kZXZpY2UtPmx1biwgc2NzaV9nZXRfcmVzaWQoc2MpLAotCQkJCSAgICAgIHNjc2lfYnVmZmxlbihzYyksIHhmZXJfY250KSk7Ci0JCX0KKyNpZmRlZiBDT05GSUdfRlVTSU9OX0xPR0dJTkcKKwkJaWYgKHNjLT5yZXN1bHQgJiYgKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUdfUkVQTFkpKQorCQkJbXB0c2NzaWhfaW5mb19zY3NpaW8oaW9jLCBzYywgcFNjc2lSZXBseSk7CiAjZW5kaWYKIAogCX0gLyogZW5kIG9mIGFkZHJlc3MgcmVwbHkgY2FzZSAqLwpAQCAtOTI1LDcgKzk3NCw3IEBACiAJaW50CQkgaWk7CiAJaW50CQkgbWF4ID0gaW9jLT5yZXFfZGVwdGg7CiAKLQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogZmx1c2hfU2NzaUxvb2t1cCBjYWxsZWRcbiIpKTsKKwlkcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjogZmx1c2hfU2NzaUxvb2t1cCBjYWxsZWRcbiIpKTsKIAlmb3IgKGlpPSAwOyBpaSA8IG1heDsgaWkrKykgewogCQlpZiAoKFNDcG50ID0gaGQtPlNjc2lMb29rdXBbaWldKSAhPSBOVUxMKSB7CiAKQEAgLTkzNyw3ICs5ODYsNyBAQAogCQkJaGQtPlNjc2lMb29rdXBbaWldID0gTlVMTDsKIAogCQkJbWYgPSBNUFRfSU5ERVhfMl9NRlBUUihpb2MsIGlpKTsKLQkJCWRtZnByaW50aygoICJmbHVzaDogU2NzaURvbmUgKG1mPSVwLHNjPSVwKVxuIiwKKwkJCWRtZnByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHIE1ZTkFNICI6IGZsdXNoOiBTY3NpRG9uZSAobWY9JXAsc2M9JXApXG4iLAogCQkJCQltZiwgU0NwbnQpKTsKIAogCQkJLyogRnJlZSBDaGFpbiBidWZmZXJzICovCkBAIC05ODcsNyArMTAzNiw3IEBACiAJc3RydWN0IHNjc2lfY21uZCAqc2M7CiAJc3RydWN0IHNjc2lfbHVuICBsdW47CiAKLQlkc3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IHNlYXJjaF9ydW5uaW5nIGNoYW5uZWwgJWQgaWQgJWQgbHVuICVkIG1heCAlZFxuIiwKKwlkc3ByaW50ayhoZC0+aW9jLCBwcmludGsoS0VSTl9ERUJVRyBNWU5BTSAiOiBzZWFyY2hfcnVubmluZyBjaGFubmVsICVkIGlkICVkIGx1biAlZCBtYXggJWRcbiIsCiAJICAgIHZkZXZpY2UtPnZ0YXJnZXQtPmNoYW5uZWwsIHZkZXZpY2UtPnZ0YXJnZXQtPmlkLCB2ZGV2aWNlLT5sdW4sIG1heCkpOwogCiAJZm9yIChpaT0wOyBpaSA8IG1heDsgaWkrKykgewpAQCAtMTAyMCw5ICsxMDY5LDkgQEAKIAkJCXNjc2lfZG1hX3VubWFwKHNjKTsKIAkJCXNjLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKIAkJCXNjLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKLQkJCWRzcHJpbnRrKCggInNlYXJjaF9ydW5uaW5nOiBmb3VuZCAoc2M9JXAsIG1mID0gJXApICIKLQkJCSAgICAiY2hhbm5lbCAlZCBpZCAlZCwgbHVuICVkIFxuIiwgc2MsIG1mLAotCQkJICAgIHZkZXZpY2UtPnZ0YXJnZXQtPmNoYW5uZWwsIHZkZXZpY2UtPnZ0YXJnZXQtPmlkLCB2ZGV2aWNlLT5sdW4pKTsKKwkJCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgc2MtPmRldmljZSwgImNvbXBsZXRpbmcgY21kczogZndfY2hhbm5lbCAlZCwiCisJCQkgICAiZndfaWQgJWQsIHNjPSVwLCBtZiA9ICVwLCBpZHg9JXhcbiIsIHZkZXZpY2UtPnZ0YXJnZXQtPmNoYW5uZWwsCisJCQkgICB2ZGV2aWNlLT52dGFyZ2V0LT5pZCwgc2MsIG1mLCBpaSk7CiAJCQlzYy0+c2NzaV9kb25lKHNjKTsKIAkJfQogCX0KQEAgLTEwNTcsNyArMTEwNiw3IEBACiAJCXJldHVybjsKIAogCWlmICh0aW1lIC0gaGQtPmxhc3RfcXVldWVfZnVsbCA+IDEwICogSFopIHsKLQkJZHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiRGV2aWNlICglZDolZDolZCkgcmVwb3J0ZWQgUVVFVUVfRlVMTCFcbiIsCisJCWRwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIkRldmljZSAoJWQ6JWQ6JWQpIHJlcG9ydGVkIFFVRVVFX0ZVTEwhXG4iLAogCQkJCWhkLT5pb2MtPm5hbWUsIDAsIHNjLT5kZXZpY2UtPmlkLCBzYy0+ZGV2aWNlLT5sdW4pKTsKIAkJaGQtPmxhc3RfcXVldWVfZnVsbCA9IHRpbWU7CiAJfQpAQCAtMTA5OCw3ICsxMTQ3LDcgQEAKIAkJaGQtPlNjc2lMb29rdXAgPSBOVUxMOwogCX0KIAotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkcHJpbnRrKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCSAgICAiRnJlZSdkIFNjc2lMb29rdXAgKCVkKSBtZW1vcnlcbiIsCiAJICAgIGhkLT5pb2MtPm5hbWUsIHN6MSkpOwogCkBAIC0xMzE3LDE3ICsxMzY2LDE5IEBACiAJdTMyCSBjbWRfbGVuOwogCWludAkgbXlfaWR4OwogCWludAkgaWk7CisJTVBUX0FEQVBURVIgKmlvYzsKIAogCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJaW9jID0gaGQtPmlvYzsKIAlsdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47CiAJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CiAKLQlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgInFjbWQ6IFNDcG50PSVwLCBkb25lKCk9JXBcbiIsCi0JCQkoaGQgJiYgaGQtPmlvYykgPyBoZC0+aW9jLT5uYW1lIDogImlvYz8iLCBTQ3BudCwgZG9uZSkpOworCWRtZnByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAicWNtZDogU0NwbnQ9JXAsIGRvbmUoKT0lcFxuIiwKKwkJaW9jLT5uYW1lLCBTQ3BudCwgZG9uZSkpOwogCiAJaWYgKGhkLT5yZXNldFBlbmRpbmcpIHsKLQkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJxY21kOiBTQ3BudD0lcCB0aW1lb3V0ICsgNjBIWlxuIiwKLQkJCShoZCAmJiBoZC0+aW9jKSA/IGhkLT5pb2MtPm5hbWUgOiAiaW9jPyIsIFNDcG50KSk7CisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJxY21kOiBTQ3BudD0lcCB0aW1lb3V0ICsgNjBIWlxuIiwKKwkJCWlvYy0+bmFtZSwgU0NwbnQpKTsKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CiAJfQogCkBAIC0xMzM1LDggKzEzODYsOCBAQAogCSAqICBQdXQgdG9nZXRoZXIgYSBNUFQgU0NTSSByZXF1ZXN0Li4uCiAJICovCiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKGhkLT5pb2MtPkRvbmVDdHgsIGhkLT5pb2MpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlF1ZXVlQ21kLCBubyBtc2cgZnJhbWVzISFcbiIsCi0JCQkJaGQtPmlvYy0+bmFtZSkpOworCQlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIlF1ZXVlQ21kLCBubyBtc2cgZnJhbWVzISFcbiIsCisJCQkJaW9jLT5uYW1lKSk7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCX0KIApAQCAtMTQyMiw5ICsxNDczLDkgQEAKIAloZC0+U2NzaUxvb2t1cFtteV9pZHhdID0gU0NwbnQ7CiAKIAltcHRfcHV0X21zZ19mcmFtZShoZC0+aW9jLT5Eb25lQ3R4LCBoZC0+aW9jLCBtZik7Ci0JZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZWQgU0NTSSBjbWQgKCVwKSBtZj0lcCBpZHg9JWRcbiIsCi0JCQloZC0+aW9jLT5uYW1lLCBTQ3BudCwgbWYsIG15X2lkeCkpOwotCURCR19EVU1QX1JFUVVFU1RfRlJBTUUobWYpCisJZG1mcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJJc3N1ZWQgU0NTSSBjbWQgKCVwKSBtZj0lcCBpZHg9JWRcbiIsCisJCQlpb2MtPm5hbWUsIFNDcG50LCBtZiwgbXlfaWR4KSk7CisJREJHX0RVTVBfUkVRVUVTVF9GUkFNRShpb2MsICh1MzIgKiltZikKIAlyZXR1cm4gMDsKIAogIGZhaWw6CkBAIC0xNDc1LDcgKzE1MjYsNyBAQAogCQlsaXN0X2FkZF90YWlsKCZjaGFpbi0+dS5mcmFtZS5saW5rYWdlLmxpc3QsICZpb2MtPkZyZWVDaGFpblEpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOwogCi0JCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRnJlZUNoYWluQnVmZmVycyAoaW5kZXggJWQpXG4iLAorCQlkbWZwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIkZyZWVDaGFpbkJ1ZmZlcnMgKGluZGV4ICVkKVxuIiwKIAkJCQlpb2MtPm5hbWUsIGNoYWluX2lkeCkpOwogCiAJCS8qIGhhbmRsZSBuZXh0ICovCkBAIC0xNTE5LDcgKzE1NzAsNyBAQAogCXVuc2lnbmVkIGxvbmcJIGZsYWdzOwogCiAJaW9jID0gaGQtPmlvYzsKLQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlRNSGFuZGxlciBFbnRlcmVkIVxuIiwgaW9jLT5uYW1lKSk7CisJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJUTUhhbmRsZXIgRW50ZXJlZCFcbiIsIGlvYy0+bmFtZSkpOwogCiAJLy8gU0pSIC0gQ0hFQ0tNRSAtIENhbiB3ZSBhdm9pZCB0aGlzIGhlcmU/CiAJLy8gKG1wdF9IYXJkUmVzZXRIYW5kbGVyIGhhcyB0aGlzIGNoZWNrLi4uKQpAQCAtMTUzOSwyMCArMTU5MCwyMCBAQAogCSAqLwogCWlmIChtcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQoaGQpID09IEZBSUxFRCkgewogCQlpZiAodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0spIHsKLQkJCWR0bXByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYWJvcnQ6ICIKKwkJCWR0bXByaW50ayhpb2MsIHByaW50ayhLRVJOX0RFQlVHIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYWJvcnQ6ICIKIAkJCSAgICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbGFzdCBUTSAoJWQpIHRvIGNvbXBsZXRlISBcbiIsCi0JCQkgICBoZC0+aW9jLT5uYW1lLCBoZC0+dG1QZW5kaW5nKSk7CisJCQkgICBpb2MtPm5hbWUsIGhkLT50bVBlbmRpbmcpKTsKIAkJCXJldHVybiBGQUlMRUQ7CiAJCX0gZWxzZSBpZiAodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1RBUkdFVF9SRVNFVCkgewotCQkJZHRtcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IFRNSGFuZGxlciB0YXJnZXQgIgorCQkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjogJXM6IFRNSGFuZGxlciB0YXJnZXQgIgogCQkJCSJyZXNldDogVGltZWQgb3V0IHdhaXRpbmcgZm9yIGxhc3QgVE0gKCVkKSAiCi0JCQkJInRvIGNvbXBsZXRlISBcbiIsIGhkLT5pb2MtPm5hbWUsCisJCQkJInRvIGNvbXBsZXRlISBcbiIsIGlvYy0+bmFtZSwKIAkJCQloZC0+dG1QZW5kaW5nKSk7CiAJCQlyZXR1cm4gRkFJTEVEOwogCQl9IGVsc2UgaWYgKHR5cGUgPT0gTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9SRVNFVF9CVVMpIHsKLQkJCWR0bXByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYnVzIHJlc2V0OiAiCisJCQlkdG1wcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyBNWU5BTSAiOiAlczogVE1IYW5kbGVyIGJ1cyByZXNldDogIgogCQkJICAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBsYXN0IFRNICglZCkgdG8gY29tcGxldGUhIFxuIiwKLQkJCSAgIGhkLT5pb2MtPm5hbWUsIGhkLT50bVBlbmRpbmcpKTsKKwkJCSAgaW9jLT5uYW1lLCBoZC0+dG1QZW5kaW5nKSk7CiAJCQlyZXR1cm4gRkFJTEVEOwogCQl9CiAJfSBlbHNlIHsKQEAgLTE1OTEsMTIgKzE2NDIsMTMgQEAKIAkgICAgY3R4MmFib3J0LCB0aW1lb3V0KTsKIAlpZiAocmMpCiAJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJJc3N1ZSBvZiBUYXNrTWdtdCBmYWlsZWQhXG4iLAotCQkgICAgICAgaGQtPmlvYy0+bmFtZSk7CisJCSAgICAgICBpb2MtPm5hbWUpOwogCWVsc2UKLQkJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZSBvZiBUYXNrTWdtdCBTdWNjZXNzZnVsIVxuIiwKLQkJCSAgIGhkLT5pb2MtPm5hbWUpKTsKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJJc3N1ZSBvZiBUYXNrTWdtdCBTdWNjZXNzZnVsIVxuIiwKKwkJCSAgIGlvYy0+bmFtZSkpOwogCi0JZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJUTUhhbmRsZXIgcmMgPSAlZCFcbiIsIGhkLT5pb2MtPm5hbWUsIHJjKSk7CisJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCisJCQkiVE1IYW5kbGVyIHJjID0gJWQhXG4iLCBpb2MtPm5hbWUsIHJjKSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xNjMyLDExICsxNjg0LDExIEBACiAJLyogUmV0dXJuIEZhaWwgdG8gY2FsbGluZyBmdW5jdGlvbiBpZiBubyBtZXNzYWdlIGZyYW1lcyBhdmFpbGFibGUuCiAJICovCiAJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKGhkLT5pb2MtPlRhc2tDdHgsIGhkLT5pb2MpKSA9PSBOVUxMKSB7Ci0JCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIklzc3VlVGFza01nbXQsIG5vIG1zZyBmcmFtZXMhIVxuIiwKKwkJZGZhaWxwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiSXNzdWVUYXNrTWdtdCwgbm8gbXNnIGZyYW1lcyEhXG4iLAogCQkJCWhkLT5pb2MtPm5hbWUpKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9Ci0JZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZVRhc2tNZ210IHJlcXVlc3QgQCAlcFxuIiwKKwlkdG1wcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJJc3N1ZVRhc2tNZ210IHJlcXVlc3QgQCAlcFxuIiwKIAkJCWhkLT5pb2MtPm5hbWUsIG1mKSk7CiAKIAkvKiBGb3JtYXQgdGhlIFJlcXVlc3QKQEAgLTE2NjAsMjcgKzE3MTIsMjcgQEAKIAogCXBTY3NpVG0tPlRhc2tNc2dDb250ZXh0ID0gY3R4MmFib3J0OwogCi0JZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZVRhc2tNZ210OiBjdHgyYWJvcnQgKDB4JTA4eCkgIgorCWR0bXByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIklzc3VlVGFza01nbXQ6IGN0eDJhYm9ydCAoMHglMDh4KSAiCiAJCSJ0eXBlPSVkXG4iLCBoZC0+aW9jLT5uYW1lLCBjdHgyYWJvcnQsIHR5cGUpKTsKIAotCURCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUoKHUzMiAqKXBTY3NpVG0pOworCURCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUoaW9jLCAodTMyICopcFNjc2lUbSk7CiAKIAlpZiAoKHJldHZhbCA9IG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0KGhkLT5pb2MtPlRhc2tDdHgsIGhkLT5pb2MsCiAJCXNpemVvZihTQ1NJVGFza01nbXRfdCksICh1MzIqKXBTY3NpVG0sIENBTl9TTEVFUCkpICE9IDApIHsKLQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAic2VuZF9oYW5kc2hha2UgRkFJTEVEISIKKwkJZGZhaWxwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAic2VuZF9oYW5kc2hha2UgRkFJTEVEISIKIAkJCSIgKGhkICVwLCBpb2MgJXAsIG1mICVwLCByYz0lZCkgXG4iLCBoZC0+aW9jLT5uYW1lLCBoZCwKIAkJCWhkLT5pb2MsIG1mLCByZXR2YWwpKTsKIAkJZ290byBmYWlsX291dDsKIAl9CiAKIAlpZihtcHRzY3NpaF90bV93YWl0X2Zvcl9jb21wbGV0aW9uKGhkLCB0aW1lb3V0KSA9PSBGQUlMRUQpIHsKLQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAidGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgVElNRUQgT1VUISIKKwkJZGZhaWxwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAidGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgVElNRUQgT1VUISIKIAkJCSIgKGhkICVwLCBpb2MgJXAsIG1mICVwKSBcbiIsIGhkLT5pb2MtPm5hbWUsIGhkLAogCQkJaGQtPmlvYywgbWYpKTsKLQkJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIEhhcmRSZXNldCEgXG4iLAorCQlkdG1wcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJDYWxsaW5nIEhhcmRSZXNldCEgXG4iLAogCQkJIGhkLT5pb2MtPm5hbWUpKTsKIAkJcmV0dmFsID0gbXB0X0hhcmRSZXNldEhhbmRsZXIoaGQtPmlvYywgQ0FOX1NMRUVQKTsKLQkJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJyYz0lZCBcbiIsCisJCWR0bXByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgInJjPSVkIFxuIiwKIAkJCSBoZC0+aW9jLT5uYW1lLCByZXR2YWwpKTsKIAkJZ290byBmYWlsX291dDsKIAl9CkBAIC0xNzQ4LDggKzE4MDAsOCBAQAogCWlmICgoaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkgPT0gTlVMTCkgewogCQlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OwogCQlTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKLQkJZGZhaWxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRzY3NpaF9hYm9ydDogQ2FuJ3QgbG9jYXRlICIKLQkJICAgICJob3N0ISAoc2M9JXApXG4iLCBTQ3BudCkpOworCQlwcmludGsoS0VSTl9ERUJVRyBNWU5BTSAiOiBtcHRzY3NpaF9hYm9ydDogQ2FuJ3QgbG9jYXRlICIKKwkJICAgICJob3N0ISAoc2M9JXApXG4iLCBTQ3BudCk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCkBAIC0xNzYwLDcgKzE4MTIsNyBAQAogCiAJdmRldmljZSA9IFNDcG50LT5kZXZpY2UtPmhvc3RkYXRhOwogCWlmICghdmRldmljZSB8fCAhdmRldmljZS0+dnRhcmdldCkgewotCQlkdG1wcmludGsoKE1ZSU9DX3NfREVCVUdfRk1UICJ0YXNrIGFib3J0OiBkZXZpY2UgaGFzIGJlZW4gIgorCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgInRhc2sgYWJvcnQ6IGRldmljZSBoYXMgYmVlbiAiCiAJCSAgICAiZGVsZXRlZCAoc2M9JXApXG4iLCBpb2MtPm5hbWUsIFNDcG50KSk7CiAJCVNDcG50LT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAkJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CkBAIC0xNzcxLDcgKzE4MjMsNyBAQAogCS8qIFRhc2sgYWJvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBoaWRkZW4gcmFpZCBjb21wb25lbnRzLgogCSAqLwogCWlmICh2ZGV2aWNlLT52dGFyZ2V0LT50ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1JBSURfQ09NUE9ORU5UKSB7Ci0JCWR0bXByaW50aygoTVlJT0Nfc19ERUJVR19GTVQgInRhc2sgYWJvcnQ6IGhpZGRlbiByYWlkICIKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJ0YXNrIGFib3J0OiBoaWRkZW4gcmFpZCAiCiAJCSAgICAiY29tcG9uZW50IChzYz0lcClcbiIsIGlvYy0+bmFtZSwgU0NwbnQpKTsKIAkJU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKIAkJcmV0dmFsID0gRkFJTEVEOwpAQCAtMTc4NSw3ICsxODM3LDcgQEAKIAkJICogRG8gT1MgY2FsbGJhY2suCiAJCSAqLwogCQlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OwotCQlkdG1wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogbXB0c2NzaWhfYWJvcnQ6ICIKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjogJXM6IG1wdHNjc2loX2Fib3J0OiAiCiAJCSAgICJDb21tYW5kIG5vdCBpbiB0aGUgYWN0aXZlIGxpc3QhIChzYz0lcClcbiIsIGlvYy0+bmFtZSwKIAkJICAgU0NwbnQpKTsKIAkJcmV0dmFsID0gMDsKQEAgLTE4NTAsOCArMTkwMiw4IEBACiAJLyogSWYgd2UgY2FuJ3QgbG9jYXRlIG91ciBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLCByZXR1cm4gRkFJTEVEIHN0YXR1cy4KIAkgKi8KIAlpZiAoKGhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpID09IE5VTEwpewotCQlkdG1wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRzY3NpaF9kZXZfcmVzZXQ6IENhbid0ICIKLQkJICAgICJsb2NhdGUgaG9zdCEgKHNjPSVwKVxuIiwgU0NwbnQpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0gIjogbXB0c2NzaWhfZGV2X3Jlc2V0OiBDYW4ndCAiCisJCSAgICAibG9jYXRlIGhvc3QhIChzYz0lcClcbiIsIFNDcG50KTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKQEAgLTE5MTMsOCArMTk2NSw4IEBACiAJLyogSWYgd2UgY2FuJ3QgbG9jYXRlIG91ciBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLCByZXR1cm4gRkFJTEVEIHN0YXR1cy4KIAkgKi8KIAlpZiAoKGhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpID09IE5VTEwpewotCQlkdG1wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRzY3NpaF9idXNfcmVzZXQ6IENhbid0ICIKLQkJICAgICJsb2NhdGUgaG9zdCEgKHNjPSVwKVxuIiwgU0NwbnQgKSk7CisJCXByaW50ayhLRVJOX0RFQlVHIE1ZTkFNICI6IG1wdHNjc2loX2J1c19yZXNldDogQ2FuJ3QgIgorCQkgICAgImxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLCBTQ3BudCApOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIApAQCAtMTk1Nyw4ICsyMDA5LDggQEAKIAogCS8qICBJZiB3ZSBjYW4ndCBsb2NhdGUgdGhlIGhvc3QgdG8gcmVzZXQsIHRoZW4gd2UgZmFpbGVkLiAqLwogCWlmICgoaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkgPT0gTlVMTCl7Ci0JCWR0bXByaW50ayggKCBLRVJOX0lORk8gTVlOQU0gIjogbXB0c2NzaWhfaG9zdF9yZXNldDogQ2FuJ3QgIgotCQkgICAgImxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLCBTQ3BudCkpOworCQlwcmludGsoIEtFUk5fREVCVUcgTVlOQU0gIjogbXB0c2NzaWhfaG9zdF9yZXNldDogQ2FuJ3QgIgorCQkgICAgImxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLCBTQ3BudCk7CiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCkBAIC0yMTA2LDE2ICsyMTU4LDE2IEBACiAJdTgJCQkgdG1UeXBlOwogCXUzMgkJCSB0ZXJtaW5hdGlvbl9jb3VudDsKIAotCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiVGFza01nbXQgY29tcGxldGVkIChtZj0lcCxtcj0lcClcbiIsCisJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJUYXNrTWdtdCBjb21wbGV0ZWQgKG1mPSVwLG1yPSVwKVxuIiwKIAkgICAgaW9jLT5uYW1lLCBtZiwgbXIpKTsKIAlpZiAoIWlvYy0+c2gpIHsKLQkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UCisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX1dBUk5fRk1UCiAJCSAgICAiVGFza01nbXQgQ29tcGxldGU6IE5VTEwgU2NzaSBIb3N0IFB0clxuIiwgaW9jLT5uYW1lKSk7CiAJCXJldHVybiAxOwogCX0KIAogCWlmIChtciA9PSBOVUxMKSB7Ci0JCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVAorCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAogCQkgICAgIkVSUk9SISBUYXNrTWdtdCBSZXBseTogTlVMTCBSZXF1ZXN0ICVwXG4iLCBpb2MtPm5hbWUsIG1mKSk7CiAJCXJldHVybiAxOwogCX0KQEAgLTIxMzEsMTkgKzIxODMsMjEgQEAKIAkgICAgcFNjc2lUbVJlcGx5LT5SZXNwb25zZUNvZGUpCiAJCW1wdHNjc2loX3Rhc2ttZ210X3Jlc3BvbnNlX2NvZGUoaW9jLAogCQkgICAgcFNjc2lUbVJlcGx5LT5SZXNwb25zZUNvZGUpOwotCURCR19EVU1QX1RNX1JFUExZX0ZSQU1FKCh1MzIgKilwU2NzaVRtUmVwbHkpOworCURCR19EVU1QX1RNX1JFUExZX0ZSQU1FKGlvYywgKHUzMiAqKXBTY3NpVG1SZXBseSk7CiAKLSNpZiBkZWZpbmVkKE1QVF9ERUJVR19SRVBMWSkgfHwgZGVmaW5lZChNUFRfREVCVUdfVE0pCi0JcHJpbnRrKCIlczogaGE9JWQgWyVkOiVkOjBdIHRhc2tfdHlwZT0weCUwMlggIgotCSAgICAiaW9jc3RhdHVzPTB4JTA0WFxuXHRsb2dpbmZvPTB4JTA4WCByZXNwb25zZV9jb2RlPTB4JTAyWCAiCi0JICAgICJ0ZXJtX2NtbmRzPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGlvYy0+aWQsIHBTY3NpVG1SZXBseS0+QnVzLAotCSAgICBwU2NzaVRtUmVwbHktPlRhcmdldElELCBwU2NzaVRtUmVxLT5UYXNrVHlwZSwKLQkgICAgbGUxNl90b19jcHUocFNjc2lUbVJlcGx5LT5JT0NTdGF0dXMpLAotCSAgICBsZTMyX3RvX2NwdShwU2NzaVRtUmVwbHktPklPQ0xvZ0luZm8pLHBTY3NpVG1SZXBseS0+UmVzcG9uc2VDb2RlLAotCSAgICBsZTMyX3RvX2NwdShwU2NzaVRtUmVwbHktPlRlcm1pbmF0aW9uQ291bnQpKTsKKyNpZmRlZiBDT05GSUdfRlVTSU9OX0xPR0dJTkcKKwlpZiAoKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUdfUkVQTFkpIHx8CisJCQkJKGlvYy0+ZGVidWdfbGV2ZWwgJiBNUFRfREVCVUdfVE0gKSkKKwkJcHJpbnRrKCIlczogaGE9JWQgWyVkOiVkOjBdIHRhc2tfdHlwZT0weCUwMlggIgorCQkJImlvY3N0YXR1cz0weCUwNFhcblx0bG9naW5mbz0weCUwOFggcmVzcG9uc2VfY29kZT0weCUwMlggIgorCQkJInRlcm1fY21uZHM9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW9jLT5pZCwgcFNjc2lUbVJlcGx5LT5CdXMsCisJCQkgcFNjc2lUbVJlcGx5LT5UYXJnZXRJRCwgcFNjc2lUbVJlcS0+VGFza1R5cGUsCisJCQlsZTE2X3RvX2NwdShwU2NzaVRtUmVwbHktPklPQ1N0YXR1cyksCisJCQlsZTMyX3RvX2NwdShwU2NzaVRtUmVwbHktPklPQ0xvZ0luZm8pLHBTY3NpVG1SZXBseS0+UmVzcG9uc2VDb2RlLAorCQkJbGUzMl90b19jcHUocFNjc2lUbVJlcGx5LT5UZXJtaW5hdGlvbkNvdW50KSk7CiAjZW5kaWYKIAlpZiAoIWlvY3N0YXR1cykgewotCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIiBUYXNrTWdtdCBTVUNDRVNTXG4iLCBpb2MtPm5hbWUpKTsKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICIgVGFza01nbXQgU1VDQ0VTU1xuIiwgaW9jLT5uYW1lKSk7CiAJCQloZC0+YWJvcnRTQ3BudCA9IE5VTEw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyMjQsMTAgKzIyNzgsNiBAQAogCWdlb21bMV0gPSBzZWN0b3JzOwogCWdlb21bMl0gPSBjeWxpbmRlcnM7CiAKLQlkcHJpbnRrKChLRVJOX05PVElDRQotCQkiOiBiaW9zX3BhcmFtOiBJZD0laSBMdW49JWkgQ2hhbm5lbD0laSBDSFM9JWkvJWkvJWlcbiIsCi0JCXNkZXYtPmlkLCBzZGV2LT5sdW4sIHNkZXYtPmNoYW5uZWwsIChpbnQpY3lsaW5kZXJzLCBoZWFkcywgc2VjdG9ycykpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzOTMsMTEgKzI0NDMsMTEgQEAKIAl2dGFyZ2V0ID0gc3RhcmdldC0+aG9zdGRhdGE7CiAJdmRldmljZSA9IHNkZXYtPmhvc3RkYXRhOwogCi0JZHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkc3ByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJImRldmljZSBAICVwLCBjaGFubmVsPSVkLCBpZD0lZCwgbHVuPSVkXG4iLAogCQloZC0+aW9jLT5uYW1lLCBzZGV2LCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKSk7CiAJaWYgKGhkLT5pb2MtPmJ1c190eXBlID09IFNQSSkKLQkJZHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJZHNwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCSAgICAic2R0ciAlZCB3ZHRyICVkIHBwciAlZCBpbnEgbGVuZ3RoPSVkXG4iLAogCQkgICAgaGQtPmlvYy0+bmFtZSwgc2Rldi0+c2R0ciwgc2Rldi0+d2R0ciwKIAkJICAgIHNkZXYtPnBwciwgc2Rldi0+aW5xdWlyeV9sZW4pKTsKQEAgLTI0MTEsMTkgKzI0NjEsMTkgQEAKIAl2ZGV2aWNlLT5jb25maWd1cmVkX2x1biA9IDE7CiAJbXB0c2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsIE1QVF9TQ1NJX0NNRF9QRVJfREVWX0hJR0gpOwogCi0JZHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkc3ByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJIlF1ZXVlIGRlcHRoPSVkLCB0ZmxhZ3M9JXhcbiIsCiAJCWhkLT5pb2MtPm5hbWUsIHNkZXYtPnF1ZXVlX2RlcHRoLCB2dGFyZ2V0LT50ZmxhZ3MpKTsKIAogCWlmIChoZC0+aW9jLT5idXNfdHlwZSA9PSBTUEkpCi0JCWRzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCWRzcHJpbnRrKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVAogCQkgICAgIm5lZ29GbGFncz0leCwgbWF4T2Zmc2V0PSV4LCBTeW5jRmFjdG9yPSV4XG4iLAogCQkgICAgaGQtPmlvYy0+bmFtZSwgdnRhcmdldC0+bmVnb0ZsYWdzLCB2dGFyZ2V0LT5tYXhPZmZzZXQsCiAJCSAgICB2dGFyZ2V0LT5taW5TeW5jRmFjdG9yKSk7CiAKIHNsYXZlX2NvbmZpZ3VyZV9leGl0OgogCi0JZHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkc3ByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJInRhZ2dlZCAlZCwgc2ltcGxlICVkLCBvcmRlcmVkICVkXG4iLAogCQloZC0+aW9jLT5uYW1lLHNkZXYtPnRhZ2dlZF9zdXBwb3J0ZWQsIHNkZXYtPnNpbXBsZV90YWdzLAogCQlzZGV2LT5vcmRlcmVkX3RhZ3MpKTsKQEAgLTI0OTAsNyArMjU0MCw3IEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIbW1tLi4uIFNlbnNlRGF0YSBsZW49MCEgKD8pXG4iLAorCQlkcHJpbnRrKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSG1tbS4uLiBTZW5zZURhdGEgbGVuPTAhICg/KVxuIiwKIAkJCQloZC0+aW9jLT5uYW1lKSk7CiAJfQogfQpAQCAtMjUyMCw3ICsyNTcwLDcgQEAKIAl1bnNpZ25lZCBsb25nCSBmbGFnczsKIAlpbnQgCQlpaTsKIAotCWR0bXByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNCisJZHRtcHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgTVlOQU0KIAkJCSI6IElPQyAlc19yZXNldCByb3V0ZWQgdG8gU0NTSSBob3N0IGRyaXZlciFcbiIsCiAJCQlyZXNldF9waGFzZT09TVBUX0lPQ19TRVRVUF9SRVNFVCA/ICJzZXR1cCIgOiAoCiAJCQlyZXNldF9waGFzZT09TVBUX0lPQ19QUkVfUkVTRVQgPyAicHJlIiA6ICJwb3N0IikpKTsKQEAgLTI1MzUsNyArMjU4NSw3IEBACiAJCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jLT5zaC0+aG9zdGRhdGE7CiAKIAlpZiAocmVzZXRfcGhhc2UgPT0gTVBUX0lPQ19TRVRVUF9SRVNFVCkgewotCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlNldHVwLURpYWcgUmVzZXRcbiIsIGlvYy0+bmFtZSkpOworCQlkdG1wcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlNldHVwLURpYWcgUmVzZXRcbiIsIGlvYy0+bmFtZSkpOwogCiAJCS8qIENsZWFuIFVwOgogCQkgKiAxLiBTZXQgSGFyZCBSZXNldCBQZW5kaW5nIEZsYWcKQEAgLTI1NDQsNyArMjU5NCw3IEBACiAJCWhkLT5yZXNldFBlbmRpbmcgPSAxOwogCiAJfSBlbHNlIGlmIChyZXNldF9waGFzZSA9PSBNUFRfSU9DX1BSRV9SRVNFVCkgewotCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlByZS1EaWFnIFJlc2V0XG4iLCBpb2MtPm5hbWUpKTsKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJQcmUtRGlhZyBSZXNldFxuIiwgaW9jLT5uYW1lKSk7CiAKIAkJLyogMi4gRmx1c2ggcnVubmluZyBjb21tYW5kcwogCQkgKglDbGVhbiBTY3NpTG9va3VwIChhbmQgYXNzb2NpYXRlZCBtZW1vcnkpCkBAIC0yNTY0LDEwICsyNjE0LDEwIEBACiAJCQltcHRfZnJlZV9tc2dfZnJhbWUoaW9jLCBoZC0+Y21kUHRyKTsKIAkJfQogCi0JCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiUHJlLVJlc2V0IGNvbXBsZXRlLlxuIiwgaW9jLT5uYW1lKSk7CisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUHJlLVJlc2V0IGNvbXBsZXRlLlxuIiwgaW9jLT5uYW1lKSk7CiAKIAl9IGVsc2UgewotCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlBvc3QtRGlhZyBSZXNldFxuIiwgaW9jLT5uYW1lKSk7CisJCWR0bXByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiUG9zdC1EaWFnIFJlc2V0XG4iLCBpb2MtPm5hbWUpKTsKIAogCQkvKiBPbmNlIGEgRlcgcmVsb2FkIGJlZ2lucywgYWxsIG5ldyBPUyBjb21tYW5kcyBhcmUKIAkJICogcmVkaXJlY3RlZCB0byB0aGUgZG9uZVEgdy8gYSByZXNldCBzdGF0dXMuCkBAIC0yNjA3LDcgKzI2NTcsNyBAQAogCQkJaGQtPmNtZFB0ciA9IE5VTEw7CiAJCX0KIAotCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlBvc3QtUmVzZXQgY29tcGxldGUuXG4iLCBpb2MtPm5hbWUpKTsKKwkJZHRtcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJQb3N0LVJlc2V0IGNvbXBsZXRlLlxuIiwgaW9jLT5uYW1lKSk7CiAKIAl9CiAKQEAgLTI2MjEsNyArMjY3MSw3IEBACiAJTVBUX1NDU0lfSE9TVCAqaGQ7CiAJdTggZXZlbnQgPSBsZTMyX3RvX2NwdShwRXZSZXBseS0+RXZlbnQpICYgMHhGRjsKIAotCWRldnR2ZXJib3NlcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJNUFQgZXZlbnQgKD0lMDJYaCkgcm91dGVkIHRvIFNDU0kgaG9zdCBkcml2ZXIhXG4iLAorCWRldnR2ZXJib3NlcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJNUFQgZXZlbnQgKD0lMDJYaCkgcm91dGVkIHRvIFNDU0kgaG9zdCBkcml2ZXIhXG4iLAogCQkJaW9jLT5uYW1lLCBldmVudCkpOwogCiAJaWYgKGlvYy0+c2ggPT0gTlVMTCB8fApAQCAtMjY2Myw3ICsyNzEzLDcgQEAKIAljYXNlIE1QSV9FVkVOVF9TVEFURV9DSEFOR0U6CQkJLyogMDIgKi8KIAljYXNlIE1QSV9FVkVOVF9FVkVOVF9DSEFOR0U6CQkJLyogMEEgKi8KIAlkZWZhdWx0OgotCQlkcHJpbnRrKChLRVJOX0lORk8gIiAgSWdub3JpbmcgZXZlbnQgKD0lMDJYaClcbiIsIGV2ZW50KSk7CisJCWRwcmludGsoaW9jLCBwcmludGsoS0VSTl9ERUJVRyBNWU5BTSAiOiBJZ25vcmluZyBldmVudCAoPSUwMlhoKVxuIiwgZXZlbnQpKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNzI0LDcgKzI3NzQsNyBAQAogCX0KIAloZC0+Y21kUHRyID0gTlVMTDsKIAotCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NhbkR2Q29tcGxldGUgKG1mPSVwLG1yPSVwLGlkeD0lZClcbiIsCisJZGR2cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTY2FuRHZDb21wbGV0ZSAobWY9JXAsbXI9JXAsaWR4PSVkKVxuIiwKIAkJCWhkLT5pb2MtPm5hbWUsIG1mLCBtciwgcmVxX2lkeCkpOwogCiAJaGQtPnBMb2NhbCA9ICZoZC0+bG9jYWxSZXBseTsKQEAgLTI3NDQsOSArMjc5NCw2IEBACiAJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KHBSZXBseS0+SU9DU3RhdHVzKSAmIE1QSV9JT0NTVEFUVVNfTUFTSzsKIAkJc2NzaV9zdGF0dXMgPSBwUmVwbHktPlNDU0lTdGF0dXM7CiAKLQkJZGR2dHByaW50aygoS0VSTl9OT1RJQ0UgIiAgSU9DU3RhdHVzPSUwNHhoLCBTQ1NJU3RhdGU9JTAyeGgsIFNDU0lTdGF0dXM9JTAyeGgsIElPQ0xvZ0luZm89JTA4eGhcbiIsCi0JCQkgICAgIHN0YXR1cywgcFJlcGx5LT5TQ1NJU3RhdGUsIHNjc2lfc3RhdHVzLAotCQkJICAgICBsZTMyX3RvX2NwdShwUmVwbHktPklPQ0xvZ0luZm8pKSk7CiAKIAkJc3dpdGNoKHN0YXR1cykgewogCkBAIC0yNzk5LDcgKzI4NDYsNyBAQAogCQkJCQkJCVNDU0lfU1REX1NFTlNFX0JZVEVTKTsKIAkJCQltZW1jcHkoaGQtPnBMb2NhbC0+c2Vuc2UsIHNlbnNlX2RhdGEsIHN6KTsKIAotCQkJCWRkdnByaW50aygoS0VSTl9OT1RJQ0UgIiAgQ2hlY2sgQ29uZGl0aW9uLCBzZW5zZSBwdHIgJXBcbiIsCisJCQkJZGR2cHJpbnRrKGlvYywgcHJpbnRrKEtFUk5fREVCVUcgIiAgQ2hlY2sgQ29uZGl0aW9uLCBzZW5zZSBwdHIgJXBcbiIsCiAJCQkJCQlzZW5zZV9kYXRhKSk7CiAJCQl9IGVsc2UgaWYgKHBSZXBseS0+U0NTSVN0YXRlICYgTVBJX1NDU0lfU1RBVEVfQVVUT1NFTlNFX0ZBSUxFRCkgewogCQkJCWlmIChwUmVxLT5DREJbMF0gPT0gSU5RVUlSWSkKQEAgLTI4MzAsOCArMjg3Nyw2IEBACiAKIAkJfQkvKiBzd2l0Y2goc3RhdHVzKSAqLwogCi0JCWRkdnRwcmludGsoKEtFUk5fTk9USUNFICIgIGNvbXBsZXRpb25Db2RlIHNldCB0byAlMDh4aFxuIiwKLQkJCQljb21wbGV0aW9uQ29kZSkpOwogCX0gLyogZW5kIG9mIGFkZHJlc3MgcmVwbHkgY2FzZSAqLwogCiAJaGQtPnBMb2NhbC0+Y29tcGxldGlvbiA9IGNvbXBsZXRpb25Db2RlOwpAQCAtMjg2Miw3ICsyOTA3LDcgQEAKIHsKIAlNUFRfU0NTSV9IT1NUICpoZCA9IChNUFRfU0NTSV9IT1NUICopIGRhdGE7CiAKLQlkZHZwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlRpbWVyIEV4cGlyZWQhIENtZCAlcFxuIiwgaGQtPmlvYy0+bmFtZSwgaGQtPmNtZFB0cikpOworCWRkdnByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlRpbWVyIEV4cGlyZWQhIENtZCAlcFxuIiwgaGQtPmlvYy0+bmFtZSwgaGQtPmNtZFB0cikpOwogCiAJaWYgKGhkLT5jbWRQdHIpIHsKIAkJTVBJSGVhZGVyX3QgKmNtZCA9IChNUElIZWFkZXJfdCAqKWhkLT5jbWRQdHI7CkBAIC0yODc0LDcgKzI5MTksNiBAQAogCQkJICogSWYgbmV3IGVoIGNvZGUsIGRvIG5vdGhpbmcuIFdhaXQgZm9yIE9TIGNtZCB0aW1lb3V0CiAJCQkgKglmb3IgYnVzIHJlc2V0LgogCQkJICovCi0JCQlkZHZ0cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UICJEViBDbWQgVGltZW91dDogTm9PcFxuIiwgaGQtPmlvYy0+bmFtZSkpOwogCQl9IGVsc2UgewogCQkJLyogUGVyZm9ybSBhIEZXIHJlbG9hZCAqLwogCQkJaWYgKG1wdF9IYXJkUmVzZXRIYW5kbGVyKGhkLT5pb2MsIE5PX1NMRUVQKSA8IDApIHsKQEAgLTI4OTEsNyArMjkzNSw3IEBACiAJICogVGhlIEZXIHdpbGwgcmVwbHkgdG8gYWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzLCBjYWxsYmFjayB3aWxsIGZpbmlzaCBjbGVhbnVwLgogCSAqIEhhcmQgcmVzZXQgY2xlYW4tdXAgd2lsbCBmcmVlIGFsbCByZXNvdXJjZXMuCiAJICovCi0JZGR2cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJUaW1lciBFeHBpcmVkIENvbXBsZXRlIVxuIiwgaGQtPmlvYy0+bmFtZSkpOworCWRkdnByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlRpbWVyIEV4cGlyZWQgQ29tcGxldGUhXG4iLCBoZC0+aW9jLT5uYW1lKSk7CiAKIAlyZXR1cm47CiB9CkBAIC0yOTMyLDcgKzI5NzYsNyBAQAogCiAJaW5faXNyID0gaW5faW50ZXJydXB0KCk7CiAJaWYgKGluX2lzcikgewotCQlkcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJJbnRlcm5hbCBTQ1NJIElPIHJlcXVlc3Qgbm90IGFsbG93ZWQgaW4gSVNSIGNvbnRleHQhXG4iLAorCQlkcHJpbnRrKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiSW50ZXJuYWwgU0NTSSBJTyByZXF1ZXN0IG5vdCBhbGxvd2VkIGluIElTUiBjb250ZXh0IVxuIiwKICAgICAgICAJCQkJaGQtPmlvYy0+bmFtZSkpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KQEAgLTMwMzUsNyArMzA3OSw3IEBACiAJLyogR2V0IGFuZCBQb3B1bGF0ZSBhIGZyZWUgRnJhbWUKIAkgKi8KIAlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUoaGQtPmlvYy0+SW50ZXJuYWxDdHgsIGhkLT5pb2MpKSA9PSBOVUxMKSB7Ci0JCWRkdnByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiTm8gbXNnIGZyYW1lcyFcbiIsCisJCWRkdnByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIk5vIG1zZyBmcmFtZXMhXG4iLAogCQkJCQloZC0+aW9jLT5uYW1lKSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMzA3NSw3ICszMTE5LDcgQEAKIAogCWlmIChjbWQgPT0gUkVRVUVTVF9TRU5TRSkgewogCQlwU2NzaVJlcS0+Q29udHJvbCA9IGNwdV90b19sZTMyKGRpciB8IE1QSV9TQ1NJSU9fQ09OVFJPTF9VTlRBR0dFRCk7Ci0JCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiVW50YWdnZWQhIDB4JTJ4XG4iLAorCQlkZHZwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJVbnRhZ2dlZCEgMHglMnhcbiIsCiAJCQloZC0+aW9jLT5uYW1lLCBjbWQpKTsKIAl9CiAKQEAgLTMwODYsNyArMzEzMCw3IEBACiAJcFNjc2lSZXEtPlNlbnNlQnVmZmVyTG93QWRkciA9IGNwdV90b19sZTMyKGhkLT5pb2MtPnNlbnNlX2J1Zl9sb3dfZG1hCiAJCQkJCSAgICsgKG15X2lkeCAqIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MpKTsKIAotCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb21tYW5kIDB4JXggZm9yICglZDolZDolZClcbiIsCisJZGR2cHJpbnRrKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiU2VuZGluZyBDb21tYW5kIDB4JXggZm9yICglZDolZDolZClcbiIsCiAJCQloZC0+aW9jLT5uYW1lLCBjbWQsIGlvLT5jaGFubmVsLCBpby0+aWQsIGlvLT5sdW4pKTsKIAogCWlmIChkaXIgPT0gTVBJX1NDU0lJT19DT05UUk9MX1JFQUQpIHsKQEAgLTMxMzgsNyArMzE4Miw3IEBACiAJfSBlbHNlIHsKIAkJcmMgPSAtRUZBVUxUOwogCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCi0JCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiX2RvX2NtZDogTnVsbCBwTG9jYWwhISFcbiIsCisJCWRkdnByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIl9kb19jbWQ6IE51bGwgcExvY2FsISEhXG4iLAogCQkJCWhkLT5pb2MtPm5hbWUpKTsKIAl9CiAKQEAgLTMzMjQsNiArMzM2OCwzNSBAQAogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGRldmljZV9kZWxheSwgU19JUlVHTywKICAgICBtcHRzY3NpaF9kZXZpY2VfZGVsYXlfc2hvdywgTlVMTCk7CiAKK3N0YXRpYyBzc2l6ZV90CittcHRzY3NpaF9kZWJ1Z19sZXZlbF9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJTVBUX1NDU0lfSE9TVAkqaGQgPSAoTVBUX1NDU0lfSE9TVCAqKWhvc3QtPmhvc3RkYXRhOworCU1QVF9BREFQVEVSICppb2MgPSBoZC0+aW9jOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTA4eGhcbiIsIGlvYy0+ZGVidWdfbGV2ZWwpOworfQorc3RhdGljIHNzaXplX3QKK21wdHNjc2loX2RlYnVnX2xldmVsX3N0b3JlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlNUFRfU0NTSV9IT1NUCSpoZCA9IChNUFRfU0NTSV9IT1NUICopaG9zdC0+aG9zdGRhdGE7CisJTVBUX0FEQVBURVIgKmlvYyA9IGhkLT5pb2M7CisJaW50IHZhbCA9IDA7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJnZhbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpb2MtPmRlYnVnX2xldmVsID0gdmFsOworCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJkZWJ1Z19sZXZlbD0lMDh4aFxuIiwKKwkJCQlpb2MtPm5hbWUsIGlvYy0+ZGVidWdfbGV2ZWwpOworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihkZWJ1Z19sZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsCisgICAgbXB0c2NzaWhfZGVidWdfbGV2ZWxfc2hvdywgbXB0c2NzaWhfZGVidWdfbGV2ZWxfc3RvcmUpOworCiBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqbXB0c2NzaWhfaG9zdF9hdHRyc1tdID0gewogCSZjbGFzc19kZXZpY2VfYXR0cl92ZXJzaW9uX2Z3LAogCSZjbGFzc19kZXZpY2VfYXR0cl92ZXJzaW9uX2Jpb3MsCkBAIC0zMzM2LDYgKzM0MDksNyBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl9ib2FyZF90cmFjZXIsCiAJJmNsYXNzX2RldmljZV9hdHRyX2lvX2RlbGF5LAogCSZjbGFzc19kZXZpY2VfYXR0cl9kZXZpY2VfZGVsYXksCisJJmNsYXNzX2RldmljZV9hdHRyX2RlYnVnX2xldmVsLAogCU5VTEwsCiB9OwogRVhQT1JUX1NZTUJPTChtcHRzY3NpaF9ob3N0X2F0dHJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCmluZGV4IDk0N2ZlMjkuLjhjOTg0MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwpAQCAtMTM4LDcgKzEzOCw5IEBACiAJCQkJZWxzZSB7CiAJCQkJCWZhY3RvciA9IE1QVF9VTFRSQTMyMDsKIAkJCQkJaWYgKHNjc2lfZGV2aWNlX3FhcyhzZGV2KSkgewotCQkJCQkJZGR2cHJpbnRrKChLRVJOX0lORk8gIkVuYWJsaW5nIFFBUyBkdWUgdG8gYnl0ZTU2PSUwMnggb24gaWQ9JWQhXG4iLCBzY3NpX2RldmljZV9xYXMoc2RldiksIGlkKSk7CisJCQkJCQlkZHZwcmludGsoaGQtPmlvYywKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJFbmFibGluZyBRQVMgZHVlIHRvICIKKwkJCQkJCSJieXRlNTY9JTAyeCBvbiBpZD0lZCFcbiIsIHNjc2lfZGV2aWNlX3FhcyhzZGV2KSwgaWQpKTsKIAkJCQkJCW5vUWFzID0gMDsKIAkJCQkJfQogCQkJCQlpZiAoc2Rldi0+dHlwZSA9PSBUWVBFX1RBUEUgJiYKQEAgLTIyNSw3ICsyMjcsOCBAQAogCQkvKiBEaXNhYmxlIFFBUyBpbiBhIG1peGVkIGNvbmZpZ3VyYXRpb24gY2FzZQogCQkgKi8KIAotCQlkZHZwcmludGsoKEtFUk5fSU5GTyAiRGlzYWJsaW5nIFFBUyBkdWUgdG8gbm9RYXM9JTAyeCBvbiBpZD0lZCFcbiIsIG5vUWFzLCBpZCkpOworCQlkZHZwcmludGsoaGQtPmlvYywgcHJpbnRrKEtFUk5fREVCVUcKKwkJCSJEaXNhYmxpbmcgUUFTIGR1ZSB0byBub1Fhcz0lMDJ4IG9uIGlkPSVkIVxuIiwgbm9RYXMsIGlkKSk7CiAJfQogfQogCkBAIC0yNTYsOCArMjU5LDggQEAKIAkvKiBHZXQgYSBNRiBmb3IgdGhpcyBjb21tYW5kLgogCSAqLwogCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShpb2MtPkRvbmVDdHgsIGlvYykpID09IE5VTEwpIHsKLQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIndyaXRlSU9DUGFnZTQgOiBubyBtc2cgZnJhbWVzIVxuIiwKLQkJCQkJaW9jLT5uYW1lKSk7CisJCWRmYWlscHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCQkid3JpdGVJT0NQYWdlNCA6IG5vIG1zZyBmcmFtZXMhXG4iLGlvYy0+bmFtZSkpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTI5Nyw3ICszMDAsNyBAQAogCiAJbXB0X2FkZF9zZ2UoKGNoYXIgKikmcFJlcS0+UGFnZUJ1ZmZlclNHRSwgZmxhZ3NMZW5ndGgsIGRhdGFEbWEpOwogCi0JZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJZGR2cHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UCiAJCSJ3cml0ZUlPQ1BhZ2U0OiBNYXhTRVA9JWQgQWN0aXZlU0VQPSVkIGlkPSVkIGJ1cz0lZFxuIiwKIAkJCWlvYy0+bmFtZSwgSU9DUGFnZTRQdHItPk1heFNFUCwgSU9DUGFnZTRQdHItPkFjdGl2ZVNFUCwgaWQsIGNoYW5uZWwpKTsKIApAQCAtNDIyLDcgKzQyNSw3IEBACiAJaWYgKHN0YXJnZXQtPmNoYW5uZWwgPT0gMCAmJgogCSAgICBtcHRzcGlfaXNfcmFpZChoZCwgc3RhcmdldC0+aWQpKSB7CiAJCXZ0YXJnZXQtPnJhaWRWb2x1bWUgPSAxOwotCQlkZHZwcmludGsoKEtFUk5fSU5GTworCQlkZHZwcmludGsoaGQtPmlvYywgcHJpbnRrKEtFUk5fREVCVUcKIAkJICAgICJSQUlEIFZvbHVtZSBAIGNoYW5uZWw9JWQgaWQ9JWRcbiIsIHN0YXJnZXQtPmNoYW5uZWwsCiAJCSAgICBzdGFyZ2V0LT5pZCkpOwogCX0KQEAgLTQ2Miw3ICs0NjUsNyBAQAogc3RhdGljIHZvaWQKIG1wdHNwaV9wcmludF93cml0ZV9uZWdvKHN0cnVjdCBfTVBUX1NDU0lfSE9TVCAqaGQsIHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCwgdTMyIGlpKQogewotCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiaWQ9JWQgUmVxdWVzdGVkID0gMHglMDh4IgorCWRkdnByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgImlkPSVkIFJlcXVlc3RlZCA9IDB4JTA4eCIKIAkgICAgIiAoICVzIGZhY3RvciA9IDB4JTAyeCBAIG9mZnNldCA9IDB4JTAyeCAlcyVzJXMlcyVzJXMlcyVzKVxuIiwKIAkgICAgaGQtPmlvYy0+bmFtZSwgc3RhcmdldC0+aWQsIGlpLAogCSAgICBpaSAmIE1QSV9TQ1NJREVWUEFHRTBfTlBfV0lERSA/ICJXaWRlICI6ICIiLApAQCAtNDg3LDcgKzQ5MCw3IEBACiBzdGF0aWMgdm9pZAogbXB0c3BpX3ByaW50X3JlYWRfbmVnbyhzdHJ1Y3QgX01QVF9TQ1NJX0hPU1QgKmhkLCBzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQsIHUzMiBpaSkKIHsKLQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImlkPSVkIFJlYWQgPSAweCUwOHgiCisJZGR2cHJpbnRrKGhkLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiaWQ9JWQgUmVhZCA9IDB4JTA4eCIKIAkgICAgIiAoICVzIGZhY3RvciA9IDB4JTAyeCBAIG9mZnNldCA9IDB4JTAyeCAlcyVzJXMlcyVzJXMlcyVzKVxuIiwKIAkgICAgaGQtPmlvYy0+bmFtZSwgc3RhcmdldC0+aWQsIGlpLAogCSAgICBpaSAmIE1QSV9TQ1NJREVWUEFHRTBfTlBfV0lERSA/ICJXaWRlICI6ICIiLApAQCAtNjEzLDcgKzYxNiw3IEBACiAJLyogR2V0IGFuZCBQb3B1bGF0ZSBhIGZyZWUgRnJhbWUKIAkgKi8KIAlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUoaGQtPmlvYy0+SW50ZXJuYWxDdHgsIGhkLT5pb2MpKSA9PSBOVUxMKSB7Ci0JCWRkdnByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiX2RvX3JhaWQ6IG5vIG1zZyBmcmFtZXMhXG4iLAorCQlkZHZwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIl9kb19yYWlkOiBubyBtc2cgZnJhbWVzIVxuIiwKIAkJCQkJaGQtPmlvYy0+bmFtZSkpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC02MzUsNyArNjM4LDcgQEAKIAltcHRfYWRkX3NnZSgoY2hhciAqKSZwUmVxLT5BY3Rpb25EYXRhU0dFLAogCQlNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfUkVBRCB8IDAsIChkbWFfYWRkcl90KSAtMSk7CiAKLQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlJBSUQgVm9sdW1lIGFjdGlvbj0leCBjaGFubmVsPSVkIGlkPSVkXG4iLAorCWRkdnByaW50ayhoZC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIlJBSUQgVm9sdW1lIGFjdGlvbj0leCBjaGFubmVsPSVkIGlkPSVkXG4iLAogCQkJaGQtPmlvYy0+bmFtZSwgcFJlcS0+QWN0aW9uLCBjaGFubmVsLCBpZCkpOwogCiAJaGQtPnBMb2NhbCA9IE5VTEw7CkBAIC03MzUsNyArNzM4LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJpZD0lZCBtaW5fcGVyaW9kPTB4JTAyeCIKKwlkZHZwcmludGsoaGQtPmlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJpZD0lZCBtaW5fcGVyaW9kPTB4JTAyeCIKIAkJIiBtYXhfb2Zmc2V0PTB4JTAyeCBtYXhfd2lkdGg9JWRcbiIsIGhkLT5pb2MtPm5hbWUsCiAJCXNkZXYtPmlkLCBzcGlfbWluX3BlcmlvZChzY3NpX3RhcmdldChzZGV2KSksCiAJCXNwaV9tYXhfb2Zmc2V0KHNjc2lfdGFyZ2V0KHNkZXYpKSwKQEAgLTc2OCwxMCArNzcxLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0jaWZkZWYgTVBUX0RFQlVHX0RWCiAJaWYgKHNwaV9kdl9wZW5kaW5nKHNjc2lfdGFyZ2V0KFNDcG50LT5kZXZpY2UpKSkKLQkJc2NzaV9wcmludF9jb21tYW5kKFNDcG50KTsKLSNlbmRpZgorCQlkZHZwcmludGsoaGQtPmlvYywgc2NzaV9wcmludF9jb21tYW5kKFNDcG50KSk7CiAKIAlyZXR1cm4gbXB0c2NzaWhfcWNtZChTQ3BudCxkb25lKTsKIH0KQEAgLTE0MTUsNyArMTQxNiw3IEBACiAKIAlpZiAobnVtU0dFIDwgc2gtPnNnX3RhYmxlc2l6ZSkgewogCQkvKiBSZXNldCB0aGlzIHZhbHVlICovCi0JCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJZHByaW50ayhpb2MsIHByaW50ayhNWUlPQ19zX0lORk9fRk1UCiAJCSAgIlJlc2V0dGluZyBzZ190YWJsZXNpemUgdG8gJWQgZnJvbSAlZFxuIiwKIAkJICBpb2MtPm5hbWUsIG51bVNHRSwgc2gtPnNnX3RhYmxlc2l6ZSkpOwogCQlzaC0+c2dfdGFibGVzaXplID0gbnVtU0dFOwpAQCAtMTQzNSw3ICsxNDM2LDcgQEAKIAkJZ290byBvdXRfbXB0c3BpX3Byb2JlOwogCX0KIAotCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNjc2lMb29rdXAgQCAlcFxuIiwKKwlkcHJpbnRrKGlvYywgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICJTY3NpTG9va3VwIEAgJXBcbiIsCiAJCSBpb2MtPm5hbWUsIGhkLT5TY3NpTG9va3VwKSk7CiAKIAkvKiBDbGVhciB0aGUgVE0gZmxhZ3MKQEAgLTE0NjMsNyArMTQ2NCw3IEBACiAJaW9jLT5zcGlfZGF0YS5TYWZfVGUgPSBtcHRfc2FmX3RlOwogCiAJaGQtPm5lZ29OdnJhbSA9IE1QVF9TQ1NJQ0ZHX1VTRV9OVlJBTTsKLQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwlkZHZwcmludGsoaW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQKIAkJInNhZl90ZSAleFxuIiwKIAkJaW9jLT5uYW1lLAogCQltcHRfc2FmX3RlKSk7CkBAIC0xNDgxLDcgKzE0ODIsNyBAQAogCiAJZXJyb3IgPSBzY3NpX2FkZF9ob3N0IChzaCwgJmlvYy0+cGNpZGV2LT5kZXYpOwogCWlmKGVycm9yKSB7Ci0JCWRwcmludGsoKEtFUk5fRVJSIE1ZTkFNCisJCWRwcmludGsoaW9jLCBwcmludGsoS0VSTl9FUlIgTVlOQU0KIAkJICAic2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpKTsKIAkJZ290byBvdXRfbXB0c3BpX3Byb2JlOwogCX0KQEAgLTE1MzYsMTUgKzE1MzcsOCBAQAogCW1wdHNwaVRhc2tDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUsIE1QVFNQSV9EUklWRVIpOwogCW1wdHNwaUludGVybmFsQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZSwgTVBUU1BJX0RSSVZFUik7CiAKLQlpZiAobXB0X2V2ZW50X3JlZ2lzdGVyKG1wdHNwaURvbmVDdHgsIG1wdHNwaV9ldmVudF9wcm9jZXNzKSA9PSAwKSB7Ci0JCWRldnR2ZXJib3NlcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KLQkJICAiOiBSZWdpc3RlcmVkIGZvciBJT0MgZXZlbnQgbm90aWZpY2F0aW9uc1xuIikpOwotCX0KLQotCWlmIChtcHRfcmVzZXRfcmVnaXN0ZXIobXB0c3BpRG9uZUN0eCwgbXB0c3BpX2lvY19yZXNldCkgPT0gMCkgewotCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KLQkJICAiOiBSZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOwotCX0KKwltcHRfZXZlbnRfcmVnaXN0ZXIobXB0c3BpRG9uZUN0eCwgbXB0c3BpX2V2ZW50X3Byb2Nlc3MpOworCW1wdF9yZXNldF9yZWdpc3RlcihtcHRzcGlEb25lQ3R4LCBtcHRzcGlfaW9jX3Jlc2V0KTsKIAogCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXB0c3BpX2RyaXZlcik7CiAJaWYgKGVycm9yKQpAQCAtMTU2NCwxMiArMTU1OCw3IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtcHRzcGlfZHJpdmVyKTsKIAogCW1wdF9yZXNldF9kZXJlZ2lzdGVyKG1wdHNwaURvbmVDdHgpOwotCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQotCSAgIjogRGVyZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOwotCiAJbXB0X2V2ZW50X2RlcmVnaXN0ZXIobXB0c3BpRG9uZUN0eCk7Ci0JZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCi0JICAiOiBEZXJlZ2lzdGVyZWQgZm9yIElPQyBldmVudCBub3RpZmljYXRpb25zXG4iKSk7CiAKIAltcHRfZGVyZWdpc3RlcihtcHRzcGlJbnRlcm5hbEN0eCk7CiAJbXB0X2RlcmVnaXN0ZXIobXB0c3BpVGFza0N0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwppbmRleCA5ODhjOGNlLi41ZTFjOTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCiAKLXN0YXRpYyBpbnQgaTJvX2Jsb2NrX2lzc3VlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqIHF1ZXVlLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX2lzc3VlX2ZsdXNoKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcXVldWUsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAogCQkJCSBzZWN0b3JfdCAqIGVycm9yX3NlY3RvcikKIHsKIAlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXYgPSBxdWV1ZS0+cXVldWVkYXRhOwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiB7CiAJc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxID0gcmVxLT5zcGVjaWFsOwogCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICpkZXYgPSBpcmVxLT5pMm9fYmxrX2RldjsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSByZXEtPnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSByZXEtPnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChlbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJlcSwgdXB0b2RhdGUsIG5yX2J5dGVzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMgYi9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYwppbmRleCBmNzUzMDYwLi5kMGZjNGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYworKysgYi9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYwpAQCAtNTMsNyArNTMsNiBAQAogI2RlZmluZSBBU1VTX0hPVEtfTkFNRSAgICAgICAgICAiQXN1cyBMYXB0b3AgU3VwcG9ydCIKICNkZWZpbmUgQVNVU19IT1RLX0NMQVNTICAgICAgICAgImhvdGtleSIKICNkZWZpbmUgQVNVU19IT1RLX0RFVklDRV9OQU1FICAgIkhvdGtleSIKLSNkZWZpbmUgQVNVU19IT1RLX0hJRCAgICAgICAgICAgIkFUSzAxMDAiCiAjZGVmaW5lIEFTVVNfSE9US19GSUxFICAgICAgICAgICJhc3VzLWxhcHRvcCIKICNkZWZpbmUgQVNVU19IT1RLX1BSRUZJWCAgICAgICAgIlxcX1NCLkFUS0QuIgogCkBAIC0xOTcsMTIgKzE5NiwxOCBAQAogLyoKICAqIFRoZSBob3RrZXkgZHJpdmVyIGRlY2xhcmF0aW9uCiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgYXN1c19kZXZpY2VfaWRzW10gPSB7CisJeyJBVEswMTAwIiwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGFzdXNfZGV2aWNlX2lkcyk7CisKIHN0YXRpYyBpbnQgYXN1c19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYXN1c19ob3RrX2RyaXZlciA9IHsKIAkubmFtZSA9IEFTVVNfSE9US19OQU1FLAogCS5jbGFzcyA9IEFTVVNfSE9US19DTEFTUywKLQkuaWRzID0gQVNVU19IT1RLX0hJRCwKKwkuaWRzID0gYXN1c19kZXZpY2VfaWRzLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhc3VzX2hvdGtfYWRkLAogCQkucmVtb3ZlID0gYXN1c19ob3RrX3JlbW92ZSwKQEAgLTEwNjcsMTkgKzEwNzIsMTYgQEAKIH0KIAogI2RlZmluZSAgQVNVU19MRURfVU5SRUdJU1RFUihvYmplY3QpCQkJCVwKLQlpZihvYmplY3QjI19sZWQuY2xhc3NfZGV2CQkJCVwKLQkgICAmJiAhSVNfRVJSKG9iamVjdCMjX2xlZC5jbGFzc19kZXYpKQkJCVwKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJm9iamVjdCMjX2xlZCkKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3Rlcigmb2JqZWN0IyNfbGVkKQogCiBzdGF0aWMgdm9pZCBhc3VzX2xlZF9leGl0KHZvaWQpCiB7CisJZGVzdHJveV93b3JrcXVldWUobGVkX3dvcmtxdWV1ZSk7CiAJQVNVU19MRURfVU5SRUdJU1RFUihtbGVkKTsKIAlBU1VTX0xFRF9VTlJFR0lTVEVSKHRsZWQpOwogCUFTVVNfTEVEX1VOUkVHSVNURVIocGxlZCk7CiAJQVNVU19MRURfVU5SRUdJU1RFUihybGVkKTsKIAlBU1VTX0xFRF9VTlJFR0lTVEVSKGdsZWQpOwotCi0JZGVzdHJveV93b3JrcXVldWUobGVkX3dvcmtxdWV1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhc3VzX2xhcHRvcF9leGl0KHZvaWQpCkBAIC0xMTM1LDI5ICsxMTM3LDQyIEBACiAKIAlydiA9IEFTVVNfTEVEX1JFR0lTVEVSKG1sZWQsIGRldik7CiAJaWYgKHJ2KQotCQlyZXR1cm4gcnY7CisJCWdvdG8gb3V0OwogCiAJcnYgPSBBU1VTX0xFRF9SRUdJU1RFUih0bGVkLCBkZXYpOwogCWlmIChydikKLQkJcmV0dXJuIHJ2OworCQlnb3RvIG91dDE7CiAKIAlydiA9IEFTVVNfTEVEX1JFR0lTVEVSKHJsZWQsIGRldik7CiAJaWYgKHJ2KQotCQlyZXR1cm4gcnY7CisJCWdvdG8gb3V0MjsKIAogCXJ2ID0gQVNVU19MRURfUkVHSVNURVIocGxlZCwgZGV2KTsKIAlpZiAocnYpCi0JCXJldHVybiBydjsKKwkJZ290byBvdXQzOwogCiAJcnYgPSBBU1VTX0xFRF9SRUdJU1RFUihnbGVkLCBkZXYpOwogCWlmIChydikKLQkJcmV0dXJuIHJ2OworCQlnb3RvIG91dDQ7CiAKIAlsZWRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImxlZF93b3JrcXVldWUiKTsKIAlpZiAoIWxlZF93b3JrcXVldWUpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDU7CiAKIAlyZXR1cm4gMDsKK291dDU6CisJcnYgPSAtRU5PTUVNOworCUFTVVNfTEVEX1VOUkVHSVNURVIoZ2xlZCk7CitvdXQ0OgorCUFTVVNfTEVEX1VOUkVHSVNURVIocGxlZCk7CitvdXQzOgorCUFTVVNfTEVEX1VOUkVHSVNURVIocmxlZCk7CitvdXQyOgorCUFTVVNfTEVEX1VOUkVHSVNURVIodGxlZCk7CitvdXQxOgorCUFTVVNfTEVEX1VOUkVHSVNURVIobWxlZCk7CitvdXQ6CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhc3VzX2xhcHRvcF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCmluZGV4IDMwM2U0OGMuLjE0ZWUwNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCkBAIC0xMTI0LDEwICsxMTI0LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgc29ueV9kZXZpY2VfaWRzW10gPSB7CisJe1NPTllfTkNfSElELCAwfSwKKwl7U09OWV9QSUNfSElELCAwfSwKKwl7IiIsIDB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc29ueV9kZXZpY2VfaWRzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBzb255X25jX2RldmljZV9pZHNbXSA9IHsKKwl7U09OWV9OQ19ISUQsIDB9LAorCXsiIiwgMH0sCit9OworCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlfbmNfZHJpdmVyID0gewogCS5uYW1lID0gU09OWV9OQ19EUklWRVJfTkFNRSwKIAkuY2xhc3MgPSBTT05ZX05DX0NMQVNTLAotCS5pZHMgPSBTT05ZX05DX0hJRCwKKwkuaWRzID0gc29ueV9uY19kZXZpY2VfaWRzLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5vcHMgPSB7CiAJCS5hZGQgPSBzb255X25jX2FkZCwKQEAgLTI0NzAsMTAgKzI0ODIsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBzb255X3BpY19kZXZpY2VfaWRzW10gPSB7CisJe1NPTllfUElDX0hJRCwgMH0sCisJeyIiLCAwfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgc29ueV9waWNfZHJpdmVyID0gewogCS5uYW1lID0gU09OWV9QSUNfRFJJVkVSX05BTUUsCiAJLmNsYXNzID0gU09OWV9QSUNfQ0xBU1MsCi0JLmlkcyA9IFNPTllfUElDX0hJRCwKKwkuaWRzID0gc29ueV9waWNfZGV2aWNlX2lkcywKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BzID0gewogCQkuYWRkID0gc29ueV9waWNfYWRkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmMKaW5kZXggZjE1YTU4Zi4uZmE4MGYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuYworKysgYi9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5jCkBAIC00MTEsMTIgKzQxMSwxMyBAQAogCiAJc3ByaW50ZihpYm0tPmFjcGktPmRyaXZlci0+bmFtZSwgIiVzXyVzIiwgSUJNX05BTUUsIGlibS0+bmFtZSk7CiAJaWJtLT5hY3BpLT5kcml2ZXItPmlkcyA9IGlibS0+YWNwaS0+aGlkOworCiAJaWJtLT5hY3BpLT5kcml2ZXItPm9wcy5hZGQgPSAmdHBhY3BpX2RldmljZV9hZGQ7CiAKIAlyYyA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihpYm0tPmFjcGktPmRyaXZlcik7CiAJaWYgKHJjIDwgMCkgewogCQlwcmludGsoSUJNX0VSUiAiYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCVzKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgaWJtLT5hY3BpLT5oaWQsIHJjKTsKKwkJICAgICAgIGlibS0+bmFtZSwgcmMpOwogCQlrZnJlZShpYm0tPmFjcGktPmRyaXZlcik7CiAJCWlibS0+YWNwaS0+ZHJpdmVyID0gTlVMTDsKIAl9IGVsc2UgaWYgKCFyYykKQEAgLTEzMTYsOCArMTMxNywxMyBAQAogCXJldHVybiByZXM7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgaWJtX2h0a19kZXZpY2VfaWRzW10gPSB7CisJe0lCTV9IS0VZX0hJRCwgMH0sCisJeyIiLCAwfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IGlibV9ob3RrZXlfYWNwaWRyaXZlciA9IHsKLQkuaGlkID0gSUJNX0hLRVlfSElELAorCS5oaWQgPSBpYm1faHRrX2RldmljZV9pZHMsCiAJLm5vdGlmeSA9IGhvdGtleV9ub3RpZnksCiAJLmhhbmRsZSA9ICZoa2V5X2hhbmRsZSwKIAkudHlwZSA9IEFDUElfREVWSUNFX05PVElGWSwKQEAgLTIwODAsNiArMjA4NiwxMSBAQAogLyogZG9uJ3QgbGlzdCBvdGhlciBhbHRlcm5hdGl2ZXMgYXMgd2UgaW5zdGFsbCBhIG5vdGlmeSBoYW5kbGVyIG9uIHRoZSA1NzAgKi8KIElCTV9IQU5ETEUocGNpLCByb290LCAiXFxfU0IuUENJIik7CS8qIDU3MCAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGlibV9wY2lfZGV2aWNlX2lkc1tdID0geworCXtQQ0lfUk9PVF9ISURfU1RSSU5HLCAwfSwKKwl7IiIsIDB9LAorfTsKKwogc3RhdGljIHN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgaWJtX2RvY2tfYWNwaWRyaXZlclsyXSA9IHsKIAl7CiAJIC5ub3RpZnkgPSBkb2NrX25vdGlmeSwKQEAgLTIwOTAsNyArMjEwMSw3IEBACiAJLyogVEhJUyBPTkUgTVVTVCBORVZFUiBCRSBVU0VEIEZPUiBEUklWRVIgQVVUT0xPQURJTkcuCiAJICogV2UganVzdCB1c2UgaXQgdG8gZ2V0IG5vdGlmaWNhdGlvbnMgb2YgZG9jayBob3RwbHVnCiAJICogaW4gdmVyeSBvbGQgdGhpbmtwYWRzICovCi0JIC5oaWQgPSBQQ0lfUk9PVF9ISURfU1RSSU5HLAorCSAuaGlkID0gaWJtX3BjaV9kZXZpY2VfaWRzLAogCSAubm90aWZ5ID0gZG9ja19ub3RpZnksCiAJIC5oYW5kbGUgPSAmcGNpX2hhbmRsZSwKIAkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCkBAIC0yMTQ5LDcgKzIxNjAsOCBAQAogc3RhdGljIHZvaWQgZG9ja19ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQogewogCWludCBkb2NrZWQgPSBkb2NrX2RvY2tlZCgpOwotCWludCBwY2kgPSBpYm0tPmFjcGktPmhpZCAmJiBzdHJzdHIoaWJtLT5hY3BpLT5oaWQsIFBDSV9ST09UX0hJRF9TVFJJTkcpOworCWludCBwY2kgPSBpYm0tPmFjcGktPmhpZCAmJiBpYm0tPmFjcGktPmRldmljZSAmJgorCQlhY3BpX21hdGNoX2RldmljZV9pZHMoaWJtLT5hY3BpLT5kZXZpY2UsIGlibV9wY2lfZGV2aWNlX2lkcyk7CiAKIAlpZiAoZXZlbnQgPT0gMSAmJiAhcGNpKQkvKiA1NzAgKi8KIAkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UsIGV2ZW50LCAxKTsJLyogYnV0dG9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5oIGIvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuaAppbmRleCBiN2E0YTg4Li44OGFmMDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5oCisrKyBiL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmgKQEAgLTE5Myw3ICsxOTMsNyBAQAogc3RydWN0IGlibV9zdHJ1Y3Q7CiAKIHN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgewotCWNoYXIgKmhpZDsKKwljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmhpZDsKIAlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKIAogCXZvaWQgKCpub3RpZnkpIChzdHJ1Y3QgaWJtX3N0cnVjdCAqLCB1MzIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCmluZGV4IGI1M2RhYzguLmM5YTI4OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvbW1jL3F1ZXVlLmMKKyAqICBsaW51eC9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFJ1c3NlbGwgS2luZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqICBDb3B5cmlnaHQgMjAwNi0yMDA3IFBpZXJyZSBPc3NtYW4KQEAgLTgzLDcgKzgzLDcgQEAKICAqIG9uIGFueSBxdWV1ZSBvbiB0aGlzIGhvc3QsIGFuZCBhdHRlbXB0IHRvIGlzc3VlIGl0LiAgVGhpcyBtYXkKICAqIG5vdCBiZSB0aGUgcXVldWUgd2Ugd2VyZSBhc2tlZCB0byBwcm9jZXNzLgogICovCi1zdGF0aWMgdm9pZCBtbWNfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCitzdGF0aWMgdm9pZCBtbWNfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3QgbW1jX3F1ZXVlICptcSA9IHEtPnF1ZXVlZGF0YTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwpAQCAtMjExLDcgKzIxMSw3IEBACiAKIHZvaWQgbW1jX2NsZWFudXBfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqbXEpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gbXEtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbXEtPnF1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBNYXJrIHRoYXQgd2Ugc2hvdWxkIHN0YXJ0IHRocm93aW5nIG91dCBzdHJhZ2dsZXJzICovCkBAIC0yNTIsNyArMjUyLDcgQEAKICAqLwogdm9pZCBtbWNfcXVldWVfc3VzcGVuZChzdHJ1Y3QgbW1jX3F1ZXVlICptcSkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBtcS0+cXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBtcS0+cXVldWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghKG1xLT5mbGFncyAmIE1NQ19RVUVVRV9TVVNQRU5ERUQpKSB7CkBAIC0yNzIsNyArMjcyLDcgQEAKICAqLwogdm9pZCBtbWNfcXVldWVfcmVzdW1lKHN0cnVjdCBtbWNfcXVldWUgKm1xKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IG1xLT5xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IG1xLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG1xLT5mbGFncyAmIE1NQ19RVUVVRV9TVVNQRU5ERUQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMgYi9kcml2ZXJzL21tYy9jb3JlL2J1cy5jCmluZGV4IDM0OGI1NjYuLmZlMGU3ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9idXMuYwpAQCAtMjA5LDEwICsyMDksMzAgQEAKIGludCBtbWNfYWRkX2NhcmQoc3RydWN0IG1tY19jYXJkICpjYXJkKQogewogCWludCByZXQ7CisJY29uc3QgY2hhciAqdHlwZTsKIAogCXNucHJpbnRmKGNhcmQtPmRldi5idXNfaWQsIHNpemVvZihjYXJkLT5kZXYuYnVzX2lkKSwKIAkJICIlczolMDR4IiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjYXJkLT5yY2EpOwogCisJc3dpdGNoIChjYXJkLT50eXBlKSB7CisJY2FzZSBNTUNfVFlQRV9NTUM6CisJCXR5cGUgPSAiTU1DIjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVFlQRV9TRDoKKwkJdHlwZSA9ICJTRCI7CisJCWlmIChtbWNfY2FyZF9ibG9ja2FkZHIoY2FyZCkpCisJCQl0eXBlID0gIlNESEMiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0eXBlID0gIj8iOworCQlicmVhazsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogbmV3ICVzJXMgY2FyZCBhdCBhZGRyZXNzICUwNHhcbiIsCisJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKKwkJbW1jX2NhcmRfaGlnaHNwZWVkKGNhcmQpID8gImhpZ2ggc3BlZWQgIiA6ICIiLAorCQl0eXBlLCBjYXJkLT5yY2EpOworCiAJY2FyZC0+ZGV2LnVldmVudF9zdXBwcmVzcyA9IDE7CiAKIAlyZXQgPSBkZXZpY2VfYWRkKCZjYXJkLT5kZXYpOwpAQCAtMjQzLDYgKzI2Myw5IEBACiB2b2lkIG1tY19yZW1vdmVfY2FyZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCiB7CiAJaWYgKG1tY19jYXJkX3ByZXNlbnQoY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhcmQgJTA0eCByZW1vdmVkXG4iLAorCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjYXJkLT5yY2EpOworCiAJCWlmIChjYXJkLT5ob3N0LT5idXNfb3BzLT5zeXNmc19yZW1vdmUpCiAJCQljYXJkLT5ob3N0LT5idXNfb3BzLT5zeXNmc19yZW1vdmUoY2FyZC0+aG9zdCwgY2FyZCk7CiAJCWRldmljZV9kZWwoJmNhcmQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCmluZGV4IGI1ZDhhNmQuLmJmZDJhZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCkBAIC02OCwzMiArNjgsNDEgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IG1ycS0+Y21kOwogCWludCBlcnIgPSBjbWQtPmVycm9yOwogCi0JcHJfZGVidWcoIiVzOiByZXEgZG9uZSAoQ01EJXUpOiAlZC8lZC8lZDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJIG1tY19ob3N0bmFtZShob3N0KSwgY21kLT5vcGNvZGUsIGVyciwKLQkJIG1ycS0+ZGF0YSA/IG1ycS0+ZGF0YS0+ZXJyb3IgOiAwLAotCQkgbXJxLT5zdG9wID8gbXJxLT5zdG9wLT5lcnJvciA6IDAsCi0JCSBjbWQtPnJlc3BbMF0sIGNtZC0+cmVzcFsxXSwgY21kLT5yZXNwWzJdLCBjbWQtPnJlc3BbM10pOwotCiAJaWYgKGVyciAmJiBjbWQtPnJldHJpZXMpIHsKKwkJcHJfZGVidWcoIiVzOiByZXEgZmFpbGVkIChDTUQldSk6ICVkLCByZXRyeWluZy4uLlxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0KSwgY21kLT5vcGNvZGUsIGVycik7CisKIAkJY21kLT5yZXRyaWVzLS07CiAJCWNtZC0+ZXJyb3IgPSAwOwogCQlob3N0LT5vcHMtPnJlcXVlc3QoaG9zdCwgbXJxKTsKLQl9IGVsc2UgaWYgKG1ycS0+ZG9uZSkgewotCQltcnEtPmRvbmUobXJxKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXM6IHJlcSBkb25lIChDTUQldSk6ICVkOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBjbWQtPm9wY29kZSwgZXJyLAorCQkJY21kLT5yZXNwWzBdLCBjbWQtPnJlc3BbMV0sCisJCQljbWQtPnJlc3BbMl0sIGNtZC0+cmVzcFszXSk7CisKKwkJaWYgKG1ycS0+ZGF0YSkgeworCQkJcHJfZGVidWcoIiVzOiAgICAgJWQgYnl0ZXMgdHJhbnNmZXJyZWQ6ICVkXG4iLAorCQkJCW1tY19ob3N0bmFtZShob3N0KSwKKwkJCQltcnEtPmRhdGEtPmJ5dGVzX3hmZXJlZCwgbXJxLT5kYXRhLT5lcnJvcik7CisJCX0KKworCQlpZiAobXJxLT5zdG9wKSB7CisJCQlwcl9kZWJ1ZygiJXM6ICAgICAoQ01EJXUpOiAlZDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCQltbWNfaG9zdG5hbWUoaG9zdCksIG1ycS0+c3RvcC0+b3Bjb2RlLAorCQkJCW1ycS0+c3RvcC0+ZXJyb3IsCisJCQkJbXJxLT5zdG9wLT5yZXNwWzBdLCBtcnEtPnN0b3AtPnJlc3BbMV0sCisJCQkJbXJxLT5zdG9wLT5yZXNwWzJdLCBtcnEtPnN0b3AtPnJlc3BbM10pOworCQl9CisKKwkJaWYgKG1ycS0+ZG9uZSkKKwkJCW1ycS0+ZG9uZShtcnEpOwogCX0KIH0KIAogRVhQT1JUX1NZTUJPTChtbWNfcmVxdWVzdF9kb25lKTsKIAotLyoqCi0gKgltbWNfc3RhcnRfcmVxdWVzdCAtIHN0YXJ0IGEgY29tbWFuZCBvbiBhIGhvc3QKLSAqCUBob3N0OiBNTUMgaG9zdCB0byBzdGFydCBjb21tYW5kIG9uCi0gKglAbXJxOiBNTUMgcmVxdWVzdCB0byBzdGFydAotICoKLSAqCVF1ZXVlIGEgY29tbWFuZCBvbiB0aGUgc3BlY2lmaWVkIGhvc3QuICBXZSBleHBlY3QgdGhlCi0gKgljYWxsZXIgdG8gYmUgaG9sZGluZyB0aGUgaG9zdCBsb2NrIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLSAqLwotdm9pZAorc3RhdGljIHZvaWQKIG1tY19zdGFydF9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAjaWZkZWYgQ09ORklHX01NQ19ERUJVRwpAQCAtMTA0LDYgKzExMywyMSBAQAogCQkgbW1jX2hvc3RuYW1lKGhvc3QpLCBtcnEtPmNtZC0+b3Bjb2RlLAogCQkgbXJxLT5jbWQtPmFyZywgbXJxLT5jbWQtPmZsYWdzKTsKIAorCWlmIChtcnEtPmRhdGEpIHsKKwkJcHJfZGVidWcoIiVzOiAgICAgYmxrc3ogJWQgYmxvY2tzICVkIGZsYWdzICUwOHggIgorCQkJInRzYWMgJWQgbXMgbnNhYyAlZFxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0KSwgbXJxLT5kYXRhLT5ibGtzeiwKKwkJCW1ycS0+ZGF0YS0+YmxvY2tzLCBtcnEtPmRhdGEtPmZsYWdzLAorCQkJbXJxLT5kYXRhLT50aW1lb3V0X25zIC8gMTAwMDAwMDAsCisJCQltcnEtPmRhdGEtPnRpbWVvdXRfY2xrcyk7CisJfQorCisJaWYgKG1ycS0+c3RvcCkgeworCQlwcl9kZWJ1ZygiJXM6ICAgICBDTUQldSBhcmcgJTA4eCBmbGFncyAlMDh4XG4iLAorCQkJIG1tY19ob3N0bmFtZShob3N0KSwgbXJxLT5zdG9wLT5vcGNvZGUsCisJCQkgbXJxLT5zdG9wLT5hcmcsIG1ycS0+c3RvcC0+ZmxhZ3MpOworCX0KKwogCVdBUk5fT04oIWhvc3QtPmNsYWltZWQpOwogCiAJbXJxLT5jbWQtPmVycm9yID0gMDsKQEAgLTEzMywxNCArMTU3LDIxIEBACiAJaG9zdC0+b3BzLT5yZXF1ZXN0KGhvc3QsIG1ycSk7CiB9CiAKLUVYUE9SVF9TWU1CT0wobW1jX3N0YXJ0X3JlcXVlc3QpOwotCiBzdGF0aWMgdm9pZCBtbWNfd2FpdF9kb25lKHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCWNvbXBsZXRlKG1ycS0+ZG9uZV9kYXRhKTsKIH0KIAotaW50IG1tY193YWl0X2Zvcl9yZXEoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKKy8qKgorICoJbW1jX3dhaXRfZm9yX3JlcSAtIHN0YXJ0IGEgcmVxdWVzdCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbgorICoJQGhvc3Q6IE1NQyBob3N0IHRvIHN0YXJ0IGNvbW1hbmQKKyAqCUBtcnE6IE1NQyByZXF1ZXN0IHRvIHN0YXJ0CisgKgorICoJU3RhcnQgYSBuZXcgTU1DIGN1c3RvbSBjb21tYW5kIHJlcXVlc3QgZm9yIGEgaG9zdCwgYW5kIHdhaXQKKyAqCWZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZS4gRG9lcyBub3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUKKyAqCXJlc3BvbnNlLgorICovCit2b2lkIG1tY193YWl0X2Zvcl9yZXEoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKIAlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbGV0ZSk7CiAKQEAgLTE1MCw4ICsxODEsNiBAQAogCW1tY19zdGFydF9yZXF1ZXN0KGhvc3QsIG1ycSk7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbGV0ZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogRVhQT1JUX1NZTUJPTChtbWNfd2FpdF9mb3JfcmVxKTsKQEAgLTE5Miw2ICsyMjEsOSBAQAogICoJQGRhdGE6IGRhdGEgcGhhc2UgZm9yIGNvbW1hbmQKICAqCUBjYXJkOiB0aGUgTU1DIGNhcmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRyYW5zZmVyCiAgKglAd3JpdGU6IGZsYWcgdG8gZGlmZmVyZW50aWF0ZSByZWFkcyBmcm9tIHdyaXRlcworICoKKyAqCUNvbXB1dGVzIHRoZSBkYXRhIHRpbWVvdXQgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gdGhlCisgKgljb3JyZWN0IGFsZ29yaXRobSBnaXZlbiB0aGUgY2FyZCB0eXBlLgogICovCiB2b2lkIG1tY19zZXRfZGF0YV90aW1lb3V0KHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwgY29uc3Qgc3RydWN0IG1tY19jYXJkICpjYXJkLAogCQkJICBpbnQgd3JpdGUpCkBAIC0yNDAsMjEgKzI3MiwxOCBAQAogRVhQT1JUX1NZTUJPTChtbWNfc2V0X2RhdGFfdGltZW91dCk7CiAKIC8qKgotICoJX19tbWNfY2xhaW1faG9zdCAtIGV4Y2x1c2l2ZWx5IGNsYWltIGEgaG9zdAorICoJbW1jX2NsYWltX2hvc3QgLSBleGNsdXNpdmVseSBjbGFpbSBhIGhvc3QKICAqCUBob3N0OiBtbWMgaG9zdCB0byBjbGFpbQotICoJQGNhcmQ6IG1tYyBjYXJkIHRvIGNsYWltIGhvc3QgZm9yCiAgKgotICoJQ2xhaW0gYSBob3N0IGZvciBhIHNldCBvZiBvcGVyYXRpb25zLiAgSWYgYSB2YWxpZCBjYXJkCi0gKglpcyBwYXNzZWQgYW5kIHRoaXMgd2Fzbid0IHRoZSBsYXN0IGNhcmQgc2VsZWN0ZWQsIHNlbGVjdAotICoJdGhlIGNhcmQgYmVmb3JlIHJldHVybmluZy4KLSAqCi0gKglOb3RlOiB5b3Ugc2hvdWxkIHVzZSBtbWNfY2FyZF9jbGFpbV9ob3N0IG9yIG1tY19jbGFpbV9ob3N0LgorICoJQ2xhaW0gYSBob3N0IGZvciBhIHNldCBvZiBvcGVyYXRpb25zLgogICovCiB2b2lkIG1tY19jbGFpbV9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJbWlnaHRfc2xlZXAoKTsKKwogCWFkZF93YWl0X3F1ZXVlKCZob3N0LT53cSwgJndhaXQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJd2hpbGUgKDEpIHsKQEAgLTQzMyw2ICs0NjIsNDUgQEAKIH0KIAogLyoKKyAqIENsZWFudXAgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGJ1cyBvcGVyYXRvciBpcyBkcm9wcGVkLgorICovCit2b2lkIF9fbW1jX3JlbGVhc2VfYnVzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwlCVUdfT04oIWhvc3QpOworCUJVR19PTihob3N0LT5idXNfcmVmcyk7CisJQlVHX09OKCFob3N0LT5idXNfZGVhZCk7CisKKwlob3N0LT5idXNfb3BzID0gTlVMTDsKK30KKworLyoKKyAqIEluY3JlYXNlIHJlZmVyZW5jZSBjb3VudCBvZiBidXMgb3BlcmF0b3IKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19idXNfZ2V0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlob3N0LT5idXNfcmVmcysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIERlY3JlYXNlIHJlZmVyZW5jZSBjb3VudCBvZiBidXMgb3BlcmF0b3IgYW5kIGZyZWUgaXQgaWYKKyAqIGl0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19idXNfcHV0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlob3N0LT5idXNfcmVmcy0tOworCWlmICgoaG9zdC0+YnVzX3JlZnMgPT0gMCkgJiYgaG9zdC0+YnVzX29wcykKKwkJX19tbWNfcmVsZWFzZV9idXMoaG9zdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworfQorCisvKgogICogQXNzaWduIGEgbW1jIGJ1cyBoYW5kbGVyIHRvIGEgaG9zdC4gT25seSBvbmUgYnVzIGhhbmRsZXIgbWF5IGNvbnRyb2wgYQogICogaG9zdCBhdCBhbnkgZ2l2ZW4gdGltZS4KICAqLwpAQCAtNDgxLDI1ICs1NDksMTUgQEAKIAltbWNfYnVzX3B1dChob3N0KTsKIH0KIAotLyoKLSAqIENsZWFudXAgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGJ1cyBvcGVyYXRvciBpcyBkcm9wcGVkLgotICovCi12b2lkIF9fbW1jX3JlbGVhc2VfYnVzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKLXsKLQlCVUdfT04oIWhvc3QpOwotCUJVR19PTihob3N0LT5idXNfcmVmcyk7Ci0JQlVHX09OKCFob3N0LT5idXNfZGVhZCk7Ci0KLQlob3N0LT5idXNfb3BzID0gTlVMTDsKLX0KLQogLyoqCiAgKgltbWNfZGV0ZWN0X2NoYW5nZSAtIHByb2Nlc3MgY2hhbmdlIG9mIHN0YXRlIG9uIGEgTU1DIHNvY2tldAogICoJQGhvc3Q6IGhvc3Qgd2hpY2ggY2hhbmdlZCBzdGF0ZS4KICAqCUBkZWxheTogb3B0aW9uYWwgZGVsYXkgdG8gd2FpdCBiZWZvcmUgZGV0ZWN0aW9uIChqaWZmaWVzKQogICoKLSAqCUFsbCB3ZSBrbm93IGlzIHRoYXQgY2FyZChzKSBoYXZlIGJlZW4gaW5zZXJ0ZWQgb3IgcmVtb3ZlZAotICoJZnJvbSB0aGUgc29ja2V0KHMpLiAgV2UgZG9uJ3Qga25vdyB3aGljaCBzb2NrZXQgb3IgY2FyZHMuCisgKglNTUMgZHJpdmVycyBzaG91bGQgY2FsbCB0aGlzIHdoZW4gdGhleSBkZXRlY3QgYSBjYXJkIGhhcyBiZWVuCisgKglpbnNlcnRlZCBvciByZW1vdmVkLiBUaGUgTU1DIGxheWVyIHdpbGwgY29uZmlybSB0aGF0IGFueQorICoJcHJlc2VudCBjYXJkIGlzIHN0aWxsIGZ1bmN0aW9uYWwsIGFuZCBpbml0aWFsaXplIGFueSBuZXdseQorICoJaW5zZXJ0ZWQuCiAgKi8KIHZvaWQgbW1jX2RldGVjdF9jaGFuZ2Uoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBsb25nIGRlbGF5KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmggYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaAppbmRleCBhZTAwNmIzLi5iYjI3NzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaApAQCAtMjcsMjggKzI3LDYgQEAKIHZvaWQgbW1jX2F0dGFjaF9idXMoc3RydWN0IG1tY19ob3N0ICpob3N0LCBjb25zdCBzdHJ1Y3QgbW1jX2J1c19vcHMgKm9wcyk7CiB2b2lkIG1tY19kZXRhY2hfYnVzKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAKLXZvaWQgX19tbWNfcmVsZWFzZV9idXMoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKLQotc3RhdGljIGlubGluZSB2b2lkIG1tY19idXNfZ2V0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKLQlob3N0LT5idXNfcmVmcysrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1tY19idXNfcHV0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKLQlob3N0LT5idXNfcmVmcy0tOwotCWlmICgoaG9zdC0+YnVzX3JlZnMgPT0gMCkgJiYgaG9zdC0+YnVzX29wcykKLQkJX19tbWNfcmVsZWFzZV9idXMoaG9zdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwotfQotCiB2b2lkIG1tY19zZXRfY2hpcF9zZWxlY3Qoc3RydWN0IG1tY19ob3N0ICpob3N0LCBpbnQgbW9kZSk7CiB2b2lkIG1tY19zZXRfY2xvY2soc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgaHopOwogdm9pZCBtbWNfc2V0X2J1c19tb2RlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IG1vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwppbmRleCAxNDMzZDk1Li42YTdlMjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwpAQCAtOTMsNiArOTMsMTAgQEAKIC8qKgogICoJbW1jX2FkZF9ob3N0IC0gaW5pdGlhbGlzZSBob3N0IGhhcmR3YXJlCiAgKglAaG9zdDogbW1jIGhvc3QKKyAqCisgKglSZWdpc3RlciB0aGUgaG9zdCB3aXRoIHRoZSBkcml2ZXIgbW9kZWwuIFRoZSBob3N0IG11c3QgYmUKKyAqCXByZXBhcmVkIHRvIHN0YXJ0IHNlcnZpY2luZyByZXF1ZXN0cyBiZWZvcmUgdGhpcyBmdW5jdGlvbgorICoJY29tcGxldGVzLgogICovCiBpbnQgbW1jX2FkZF9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKQEAgLTEyNiw3ICsxMzAsOCBAQAogICoJQGhvc3Q6IG1tYyBob3N0CiAgKgogICoJVW5yZWdpc3RlciBhbmQgcmVtb3ZlIGFsbCBjYXJkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBob3N0LAotICoJYW5kIHBvd2VyIGRvd24gdGhlIE1NQyBidXMuCisgKglhbmQgcG93ZXIgZG93biB0aGUgTU1DIGJ1cy4gTm8gbmV3IHJlcXVlc3RzIHdpbGwgYmUgaXNzdWVkCisgKglhZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4KICAqLwogdm9pZCBtbWNfcmVtb3ZlX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKaW5kZXggNjZmODViZi4uMjFkN2Y0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL21tYy9tbWMuYworICogIGxpbnV4L2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUnVzc2VsbCBLaW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IFBpZXJyZSBPc3NtYW4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoIiVzOiBjYXJkIGhhcyB1bmtub3duIE1NQ0EgdmVyc2lvbiAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FyZCBoYXMgdW5rbm93biBNTUNBIHZlcnNpb24gJWRcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGNhcmQtPmNzZC5tbWNhX3Zzbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEyMyw3ICsxMjMsNyBAQAogCSAqLwogCWNzZF9zdHJ1Y3QgPSBVTlNUVUZGX0JJVFMocmVzcCwgMTI2LCAyKTsKIAlpZiAoY3NkX3N0cnVjdCAhPSAxICYmIGNzZF9zdHJ1Y3QgIT0gMikgewotCQlwcmludGsoIiVzOiB1bnJlY29nbmlzZWQgQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgQ1NEIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBjc2Rfc3RydWN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDk5LDE0ICs0OTksMTcgQEAKIAlCVUdfT04oIWhvc3QtPmNhcmQpOwogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7Ci0KIAllcnIgPSBtbWNfaW5pdF9jYXJkKGhvc3QsIGhvc3QtPm9jciwgaG9zdC0+Y2FyZCk7CisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKKwogCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CiAJCW1tY19yZW1vdmUoaG9zdCk7CisKKwkJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJCW1tY19kZXRhY2hfYnVzKGhvc3QpOworCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCX0KIAotCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiB9CiAKICNlbHNlCkBAIC01NTMsOCArNTU2LDEwIEBACiAJLyoKIAkgKiBDYW4gd2Ugc3VwcG9ydCB0aGUgdm9sdGFnZSBvZiB0aGUgY2FyZD8KIAkgKi8KLQlpZiAoIWhvc3QtPm9jcikKKwlpZiAoIWhvc3QtPm9jcikgeworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKKwl9CiAKIAkvKgogCSAqIERldGVjdCBhbmQgaW5pdCB0aGUgY2FyZC4KQEAgLTU2NywxOCArNTcyLDIxIEBACiAKIAllcnIgPSBtbWNfYWRkX2NhcmQoaG9zdC0+Y2FyZCk7CiAJaWYgKGVycikKLQkJZ290byByZWNsYWltX2hvc3Q7CisJCWdvdG8gcmVtb3ZlX2NhcmQ7CiAKIAlyZXR1cm4gMDsKIAotcmVjbGFpbV9ob3N0OgotCW1tY19jbGFpbV9ob3N0KGhvc3QpOworcmVtb3ZlX2NhcmQ6CiAJbW1jX3JlbW92ZV9jYXJkKGhvc3QtPmNhcmQpOwogCWhvc3QtPmNhcmQgPSBOVUxMOworCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogZXJyOgogCW1tY19kZXRhY2hfYnVzKGhvc3QpOwogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB3aGlsc3QgaW5pdGlhbGlzaW5nIE1NQyBjYXJkXG4iLAorCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYwppbmRleCA3ZGQ3MjBmLi45MTNlNzVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvZHJpdmVycy9tbWMvbW1jX29wcy5oCisgKiAgbGludXgvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmgKICAqCiAgKiAgQ29weXJpZ2h0IDIwMDYtMjAwNyBQaWVycmUgT3NzbWFuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmggYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaAppbmRleCA3YTQ4MWU4Li43NmQwOWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvZHJpdmVycy9tbWMvbW1jX29wcy5oCisgKiAgbGludXgvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmgKICAqCiAgKiAgQ29weXJpZ2h0IDIwMDYtMjAwNyBQaWVycmUgT3NzbWFuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZC5jIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCmluZGV4IDEyNDA2ODQuLjFlZGM2MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvbW1jL3NkLmMKKyAqICBsaW51eC9kcml2ZXJzL21tYy9jb3JlL3NkLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgUnVzc2VsbCBLaW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogIFNEIHN1cHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0IElhbiBNb2x0b24sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJY3NkLT53cml0ZV9wYXJ0aWFsID0gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pc2VkIENTRCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZFxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwgY3NkX3N0cnVjdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE3Myw3ICsxNzMsNyBAQAogCiAJc2NyX3N0cnVjdCA9IFVOU1RVRkZfQklUUyhyZXNwLCA2MCwgNCk7CiAJaWYgKHNjcl9zdHJ1Y3QgIT0gMCkgewotCQlwcmludGsoIiVzOiB1bnJlY29nbmlzZWQgU0NSIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bnJlY29nbmlzZWQgU0NSIHN0cnVjdHVyZSB2ZXJzaW9uICVkXG4iLAogCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBzY3Jfc3RydWN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjA2LDkgKzIwNiw4IEBACiAKIAlzdGF0dXMgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXR1cykgewotCQlwcmludGsoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yIHN3aXRjaCAiCi0JCSAgICAgICAiY2FwYWJpbGl0aWVzLlxuIiwKLQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgIgorCQkJInN3aXRjaCBjYXBhYmlsaXRpZXMuXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMjU0LDkgKzI1Myw4IEBACiAKIAlzdGF0dXMgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0YXR1cykgewotCQlwcmludGsoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yIHN3aXRjaCAiCi0JCSAgICAgICAiY2FwYWJpbGl0aWVzLlxuIiwKLQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgIgorCQkJInN3aXRjaCBjYXBhYmlsaXRpZXMuXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTczLDE0ICs1NzEsMTcgQEAKIAlCVUdfT04oIWhvc3QtPmNhcmQpOwogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7Ci0KIAllcnIgPSBtbWNfc2RfaW5pdF9jYXJkKGhvc3QsIGhvc3QtPm9jciwgaG9zdC0+Y2FyZCk7CisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKKwogCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CiAJCW1tY19zZF9yZW1vdmUoaG9zdCk7CisKKwkJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJCW1tY19kZXRhY2hfYnVzKGhvc3QpOworCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCX0KIAotCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiB9CiAKICNlbHNlCkBAIC02MzQsOCArNjM1LDEwIEBACiAJLyoKIAkgKiBDYW4gd2Ugc3VwcG9ydCB0aGUgdm9sdGFnZShzKSBvZiB0aGUgY2FyZChzKT8KIAkgKi8KLQlpZiAoIWhvc3QtPm9jcikKKwlpZiAoIWhvc3QtPm9jcikgeworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKKwl9CiAKIAkvKgogCSAqIERldGVjdCBhbmQgaW5pdCB0aGUgY2FyZC4KQEAgLTY0OCwxOCArNjUxLDIxIEBACiAKIAllcnIgPSBtbWNfYWRkX2NhcmQoaG9zdC0+Y2FyZCk7CiAJaWYgKGVycikKLQkJZ290byByZWNsYWltX2hvc3Q7CisJCWdvdG8gcmVtb3ZlX2NhcmQ7CiAKIAlyZXR1cm4gMDsKIAotcmVjbGFpbV9ob3N0OgotCW1tY19jbGFpbV9ob3N0KGhvc3QpOworcmVtb3ZlX2NhcmQ6CiAJbW1jX3JlbW92ZV9jYXJkKGhvc3QtPmNhcmQpOwogCWhvc3QtPmNhcmQgPSBOVUxMOworCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogZXJyOgogCW1tY19kZXRhY2hfYnVzKGhvc3QpOwogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB3aGlsc3QgaW5pdGlhbGlzaW5nIFNEIGNhcmRcbiIsCisJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkX29wcy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuYwppbmRleCA5Njk3Y2U1Li4zNDJmMzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkX29wcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rfb3BzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvbW1jL3NkX29wcy5oCisgKiAgbGludXgvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuaAogICoKICAqICBDb3B5cmlnaHQgMjAwNi0yMDA3IFBpZXJyZSBPc3NtYW4KICAqCkBAIC0yMSwxMSArMjEsNDAgQEAKICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAic2Rfb3BzLmgiCiAKK3N0YXRpYyBpbnQgbW1jX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCisJQlVHX09OKCFob3N0KTsKKwlCVUdfT04oY2FyZCAmJiAoY2FyZC0+aG9zdCAhPSBob3N0KSk7CisKKwljbWQub3Bjb2RlID0gTU1DX0FQUF9DTUQ7CisKKwlpZiAoY2FyZCkgeworCQljbWQuYXJnID0gY2FyZC0+cmNhIDw8IDE2OworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKKwl9IGVsc2UgeworCQljbWQuYXJnID0gMDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQkNSOworCX0KKworCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgMCk7CisJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCisJCXJldHVybiBlcnI7CisKKwkvKiBDaGVjayB0aGF0IGNhcmQgc3VwcG9ydGVkIGFwcGxpY2F0aW9uIGNvbW1hbmRzICovCisJaWYgKCEoY21kLnJlc3BbMF0gJiBSMV9BUFBfQ01EKSkKKwkJcmV0dXJuIE1NQ19FUlJfRkFJTEVEOworCisJcmV0dXJuIE1NQ19FUlJfTk9ORTsKK30KKwogLyoqCiAgKgltbWNfd2FpdF9mb3JfYXBwX2NtZCAtIHN0YXJ0IGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYW5kIHdhaXQgZm9yCiAgCQkJICAgICAgIGNvbXBsZXRpb24KICAqCUBob3N0OiBNTUMgaG9zdCB0byBzdGFydCBjb21tYW5kCi0gKglAcmNhOiBSQ0EgdG8gc2VuZCBNTUNfQVBQX0NNRCB0bworICoJQGNhcmQ6IENhcmQgdG8gc2VuZCBNTUNfQVBQX0NNRCB0bwogICoJQGNtZDogTU1DIGNvbW1hbmQgdG8gc3RhcnQKICAqCUByZXRyaWVzOiBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzCiAgKgpAQCAtNzcsMzUgKzEwNiw2IEBACiAKIEVYUE9SVF9TWU1CT0wobW1jX3dhaXRfZm9yX2FwcF9jbWQpOwogCi1pbnQgbW1jX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOwotCi0JQlVHX09OKCFob3N0KTsKLQlCVUdfT04oY2FyZCAmJiAoY2FyZC0+aG9zdCAhPSBob3N0KSk7Ci0KLQljbWQub3Bjb2RlID0gTU1DX0FQUF9DTUQ7Ci0KLQlpZiAoY2FyZCkgewotCQljbWQuYXJnID0gY2FyZC0+cmNhIDw8IDE2OwotCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKLQl9IGVsc2UgewotCQljbWQuYXJnID0gMDsKLQkJY21kLmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQkNSOwotCX0KLQotCWVyciA9IG1tY193YWl0X2Zvcl9jbWQoaG9zdCwgJmNtZCwgMCk7Ci0JaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBDaGVjayB0aGF0IGNhcmQgc3VwcG9ydGVkIGFwcGxpY2F0aW9uIGNvbW1hbmRzICovCi0JaWYgKCEoY21kLnJlc3BbMF0gJiBSMV9BUFBfQ01EKSkKLQkJcmV0dXJuIE1NQ19FUlJfRkFJTEVEOwotCi0JcmV0dXJuIE1NQ19FUlJfTk9ORTsKLX0KLQogaW50IG1tY19hcHBfc2V0X2J1c193aWR0aChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIGludCB3aWR0aCkKIHsKIAlpbnQgZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuaCBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rfb3BzLmgKaW5kZXggMTI0MGZkZC4uOTc0MmQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZF9vcHMuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkX29wcy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL21tYy9zZF9vcHMuaAorICogIGxpbnV4L2RyaXZlcnMvbW1jL2NvcmUvc2Rfb3BzLmgKICAqCiAgKiAgQ29weXJpZ2h0IDIwMDYtMjAwNyBQaWVycmUgT3NzbWFuCiAgKgpAQCAtMTIsNyArMTIsNiBAQAogI2lmbmRlZiBfTU1DX1NEX09QU19ICiAjZGVmaW5lIF9NTUNfU0RfT1BTX0gKIAotaW50IG1tY19hcHBfY21kKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jYXJkICpjYXJkKTsKIGludCBtbWNfYXBwX3NldF9idXNfd2lkdGgoc3RydWN0IG1tY19jYXJkICpjYXJkLCBpbnQgd2lkdGgpOwogaW50IG1tY19zZW5kX2FwcF9vcF9jb25kKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jciwgdTMyICpyb2NyKTsKIGludCBtbWNfc2VuZF9pZl9jb25kKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L2F0OTFfbWNpLmMKaW5kZXggMTVhYWIzNy4uNjI1NjRjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdDkxX21jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvZHJpdmVycy9tbWMvYXQ5MV9tY2kuYyAtIEFUTUVMIEFUOTEgTUNJIERyaXZlcgorICogIGxpbnV4L2RyaXZlcnMvbW1jL2hvc3QvYXQ5MV9tY2kuYyAtIEFUTUVMIEFUOTEgTUNJIERyaXZlcgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDUgQ291Z2FyIENyZWVrIENvbXB1dGluZyBEZXZpY2VzIEx0ZCwgQWxsIFJpZ2h0cyBSZXNlcnZlZAogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdTF4bW1jLmMKaW5kZXggNTJiNjNmMS4uMzRjOTlkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdTF4bW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9hdTF4bW1jLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogbGludXgvZHJpdmVycy9tbWMvYXUxeG1tYy5jIC0gQVUxWFgwIE1NQyBkcml2ZXIKKyAqIGxpbnV4L2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jIC0gQVUxWFgwIE1NQyBkcml2ZXIKICAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDA1LCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvaW14bW1jLmMKaW5kZXggN2VlMjA0NS4uNTRiZmM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9pbXhtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL21tYy9pbXhtbWMuYyAtIE1vdG9yb2xhIGkuTVggTU1DSSBkcml2ZXIKKyAqICBsaW51eC9kcml2ZXJzL21tYy9ob3N0L2lteG1tYy5jIC0gTW90b3JvbGEgaS5NWCBNTUNJIGRyaXZlcgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCA8c2FzY2hhQHNhc2NoYWhhdWVyLmRlPgogICogIENvcHlyaWdodCAoQykgMjAwNiBQYXZlbCBQaXNhLCBQaUtST04gPHBwaXNhQHBpa3Jvbi5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jCmluZGV4IGQxMWMyZDIuLmJlNzMwYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL21tYy9tbWNpLmMgLSBBUk0gUHJpbWVDZWxsIE1NQ0kgUEwxODAvMSBkcml2ZXIKKyAqICBsaW51eC9kcml2ZXJzL21tYy9ob3N0L21tY2kuYyAtIEFSTSBQcmltZUNlbGwgTU1DSSBQTDE4MC8xIGRyaXZlcgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgRGVlcCBCbHVlIFNvbHV0aW9ucywgTHRkLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKaW5kZXggNmQ3ZWFkYy4uMDAwZTZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvbW1jL21tY2kuaCAtIEFSTSBQcmltZUNlbGwgTU1DSSBQTDE4MC8xIGRyaXZlcgorICogIGxpbnV4L2RyaXZlcnMvbW1jL2hvc3QvbW1jaS5oIC0gQVJNIFByaW1lQ2VsbCBNTUNJIFBMMTgwLzEgZHJpdmVyCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMyBEZWVwIEJsdWUgU29sdXRpb25zLCBMdGQsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMgYi9kcml2ZXJzL21tYy9ob3N0L29tYXAuYwppbmRleCBiMDgyNGEzLi4wY2Y5N2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29tYXAuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29tYXAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvZHJpdmVycy9tZWRpYS9tbWMvb21hcC5jCisgKiAgbGludXgvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCiAgKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gYW5kIEp1aGEgWXJq9mzkPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3B4YW1jaS5jCmluZGV4IGY4OTg1YzUuLmZmOTYwMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvcHhhbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9weGFtY2kuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvZHJpdmVycy9tbWMvcHhhLmMgLSBQWEEgTU1DSSBkcml2ZXIKKyAqICBsaW51eC9kcml2ZXJzL21tYy9ob3N0L3B4YS5jIC0gUFhBIE1NQ0kgZHJpdmVyCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMyBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IDRhMjRkYjAyLi5mMmJjODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL21tYy9zZGhjaS5jIC0gU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSBkcml2ZXIKKyAqICBsaW51eC9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMgLSBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlcgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBQaWVycmUgT3NzbWFuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTM0LDYgKzM0LDcgQEAKIC8qIENvbnRyb2xsZXIgZG9lc24ndCBsaWtlIHNvbWUgcmVzZXRzIHdoZW4gdGhlcmUgaXMgbm8gY2FyZCBpbnNlcnRlZC4gKi8KICNkZWZpbmUgU0RIQ0lfUVVJUktfTk9fQ0FSRF9OT19SRVNFVAkJCSgxPDwyKQogI2RlZmluZSBTREhDSV9RVUlSS19TSU5HTEVfUE9XRVJfV1JJVEUJCQkoMTw8MykKKyNkZWZpbmUgU0RIQ0lfUVVJUktfUkVTRVRfQ01EX0RBVEFfT05fSU9TCQkoMTw8NCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9pZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKQEAgLTc4LDYgKzc5LDI0IEBACiAJCS5kcml2ZXJfZGF0YQk9IFNESENJX1FVSVJLX1NJTkdMRV9QT1dFUl9XUklURSwKIAl9LAogCisJeworCQkudmVuZG9yICAgICAgICAgPSBQQ0lfVkVORE9SX0lEX0VORSwKKwkJLmRldmljZSAgICAgICAgID0gUENJX0RFVklDRV9JRF9FTkVfQ0I3MTRfU0QsCisJCS5zdWJ2ZW5kb3IgICAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSAgICA9IFNESENJX1FVSVJLX1NJTkdMRV9QT1dFUl9XUklURSB8CisJCQkJICBTREhDSV9RVUlSS19SRVNFVF9DTURfREFUQV9PTl9JT1MsCisJfSwKKworCXsKKwkJLnZlbmRvciAgICAgICAgID0gUENJX1ZFTkRPUl9JRF9FTkUsCisJCS5kZXZpY2UgICAgICAgICA9IFBDSV9ERVZJQ0VfSURfRU5FX0NCNzE0X1NEXzIsCisJCS5zdWJ2ZW5kb3IgICAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSAgICA9IFNESENJX1FVSVJLX1NJTkdMRV9QT1dFUl9XUklURSB8CisJCQkJICBTREhDSV9RVUlSS19SRVNFVF9DTURfREFUQV9PTl9JT1MsCisJfSwKKwogCXsJLyogR2VuZXJpYyBTRCBob3N0IGNvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRV9DTEFTUygoUENJX0NMQVNTX1NZU1RFTV9TREhDSSA8PCA4KSwgMHhGRkZGMDApCiAJfSwKQEAgLTM2MSwxMSArMzgwLDYgQEAKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlEQkcoImJsa3N6ICUwNHggYmxrcyAlMDR4IGZsYWdzICUwOHhcbiIsCi0JCWRhdGEtPmJsa3N6LCBkYXRhLT5ibG9ja3MsIGRhdGEtPmZsYWdzKTsKLQlEQkcoInRzYWMgJWQgbXMgbnNhYyAlZCBjbGtcbiIsCi0JCWRhdGEtPnRpbWVvdXRfbnMgLyAxMDAwMDAwLCBkYXRhLT50aW1lb3V0X2Nsa3MpOwotCiAJLyogU2FuaXR5IGNoZWNrcyAqLwogCUJVR19PTihkYXRhLT5ibGtzeiAqIGRhdGEtPmJsb2NrcyA+IDUyNDI4OCk7CiAJQlVHX09OKGRhdGEtPmJsa3N6ID4gaG9zdC0+bW1jLT5tYXhfYmxrX3NpemUpOwpAQCAtNDc2LDggKzQ5MCw2IEBACiAJCWRhdGEtPmVycm9yID0gTU1DX0VSUl9GQUlMRUQ7CiAJfQogCi0JREJHKCJFbmRpbmcgZGF0YSB0cmFuc2ZlciAoJWQgYnl0ZXMpXG4iLCBkYXRhLT5ieXRlc194ZmVyZWQpOwotCiAJaWYgKGRhdGEtPnN0b3ApIHsKIAkJLyoKIAkJICogVGhlIGNvbnRyb2xsZXIgbmVlZHMgYSByZXNldCBvZiBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcwpAQCAtNTAxLDggKzUxMyw2IEBACiAKIAlXQVJOX09OKGhvc3QtPmNtZCk7CiAKLQlEQkcoIlNlbmRpbmcgY21kICgleClcbiIsIGNtZC0+b3Bjb2RlKTsKLQogCS8qIFdhaXQgbWF4IDEwIG1zICovCiAJdGltZW91dCA9IDEwOwogCkBAIC01OTAsOCArNjAwLDYgQEAKIAogCWhvc3QtPmNtZC0+ZXJyb3IgPSBNTUNfRVJSX05PTkU7CiAKLQlEQkcoIkVuZGluZyBjbWQgKCV4KVxuIiwgaG9zdC0+Y21kLT5vcGNvZGUpOwotCiAJaWYgKGhvc3QtPmNtZC0+ZGF0YSkKIAkJaG9zdC0+ZGF0YSA9IGhvc3QtPmNtZC0+ZGF0YTsKIAllbHNlCkBAIC03NTksNiArNzY3LDE0IEBACiAKIAl3cml0ZWIoY3RybCwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfSE9TVF9DT05UUk9MKTsKIAorCS8qCisJICogU29tZSAoRU5FKSBjb250cm9sbGVycyBnbyBhcGVzaGl0IG9uIHNvbWUgaW9zIG9wZXJhdGlvbiwKKwkgKiBzaWduYWxsaW5nIHRpbWVvdXQgYW5kIENSQyBlcnJvcnMgZXZlbiBvbiBDTUQwLiBSZXNldHRpbmcKKwkgKiBpdCBvbiBlYWNoIGlvcyBzZWVtcyB0byBzb2x2ZSB0aGUgcHJvYmxlbS4KKwkgKi8KKwlpZihob3N0LT5jaGlwLT5xdWlya3MgJiBTREhDSV9RVUlSS19SRVNFVF9DTURfREFUQV9PTl9JT1MpCisJCXNkaGNpX3Jlc2V0KGhvc3QsIFNESENJX1JFU0VUX0NNRCB8IFNESENJX1JFU0VUX0RBVEEpOworCiAJbW1pb3diKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogfQpAQCAtODM1LDggKzg1MSw2IEBACiAKIAltcnEgPSBob3N0LT5tcnE7CiAKLQlEQkcoIkVuZGluZyByZXF1ZXN0LCBjbWQgKCV4KVxuIiwgbXJxLT5jbWQtPm9wY29kZSk7Ci0KIAkvKgogCSAqIFRoZSBjb250cm9sbGVyIG5lZWRzIGEgcmVzZXQgb2YgaW50ZXJuYWwgc3RhdGUgbWFjaGluZXMKIAkgKiB1cG9uIGVycm9yIGNvbmRpdGlvbnMuCkBAIC05MjIsMjAgKzkzNiwxNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGludG1hc2sgJiBTREhDSV9JTlRfUkVTUE9OU0UpCi0JCXNkaGNpX2ZpbmlzaF9jb21tYW5kKGhvc3QpOwotCWVsc2UgewotCQlpZiAoaW50bWFzayAmIFNESENJX0lOVF9USU1FT1VUKQotCQkJaG9zdC0+Y21kLT5lcnJvciA9IE1NQ19FUlJfVElNRU9VVDsKLQkJZWxzZSBpZiAoaW50bWFzayAmIFNESENJX0lOVF9DUkMpCi0JCQlob3N0LT5jbWQtPmVycm9yID0gTU1DX0VSUl9CQURDUkM7Ci0JCWVsc2UgaWYgKGludG1hc2sgJiAoU0RIQ0lfSU5UX0VORF9CSVQgfCBTREhDSV9JTlRfSU5ERVgpKQotCQkJaG9zdC0+Y21kLT5lcnJvciA9IE1NQ19FUlJfRkFJTEVEOwotCQllbHNlCi0JCQlob3N0LT5jbWQtPmVycm9yID0gTU1DX0VSUl9JTlZBTElEOworCWlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX1RJTUVPVVQpCisJCWhvc3QtPmNtZC0+ZXJyb3IgPSBNTUNfRVJSX1RJTUVPVVQ7CisJZWxzZSBpZiAoaW50bWFzayAmIFNESENJX0lOVF9DUkMpCisJCWhvc3QtPmNtZC0+ZXJyb3IgPSBNTUNfRVJSX0JBRENSQzsKKwllbHNlIGlmIChpbnRtYXNrICYgKFNESENJX0lOVF9FTkRfQklUIHwgU0RIQ0lfSU5UX0lOREVYKSkKKwkJaG9zdC0+Y21kLT5lcnJvciA9IE1NQ19FUlJfRkFJTEVEOwogCisJaWYgKGhvc3QtPmNtZC0+ZXJyb3IgIT0gTU1DX0VSUl9OT05FKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5maW5pc2hfdGFza2xldCk7Ci0JfQorCWVsc2UgaWYgKGludG1hc2sgJiBTREhDSV9JTlRfUkVTUE9OU0UpCisJCXNkaGNpX2ZpbmlzaF9jb21tYW5kKGhvc3QpOwogfQogCiBzdGF0aWMgdm9pZCBzZGhjaV9kYXRhX2lycShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTMyIGludG1hc2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmggYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKaW5kZXggYTZjODcwNC4uZDE1Nzc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgbGludXgvZHJpdmVycy9tbWMvc2RoY2kuaCAtIFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgZHJpdmVyCisgKiAgbGludXgvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oIC0gU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSBkcml2ZXIKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgUGllcnJlIE9zc21hbiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3dic2QuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCmluZGV4IDg2N2NhNmEuLmUwYzk4MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9kcml2ZXJzL21tYy93YnNkLmMgLSBXaW5ib25kIFc4M0w1MXhEIFNEL01NQyBkcml2ZXIKKyAqICBsaW51eC9kcml2ZXJzL21tYy9ob3N0L3dic2QuYyAtIFdpbmJvbmQgVzgzTDUxeEQgU0QvTU1DIGRyaXZlcgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBQaWVycmUgT3NzbWFuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKQEAgLTIwNyw4ICsyMDcsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZG1hZmxhZ3M7CiAKLQlEQkdGKCJFbmRpbmcgcmVxdWVzdCwgY21kICgleClcbiIsIG1ycS0+Y21kLT5vcGNvZGUpOwotCiAJaWYgKGhvc3QtPmRtYSA+PSAwKSB7CiAJCS8qCiAJCSAqIFJlbGVhc2UgSVNBIERNQSBjb250cm9sbGVyLgpAQCAtMzYwLDggKzM1OCw2IEBACiAJaW50IGk7CiAJdTggc3RhdHVzLCBpc3I7CiAKLQlEQkdGKCJTZW5kaW5nIGNtZCAoJXgpXG4iLCBjbWQtPm9wY29kZSk7Ci0KIAkvKgogCSAqIENsZWFyIGFjY3VtdWxhdGVkIElTUi4gVGhlIGludGVycnVwdCByb3V0aW5lCiAJICogd2lsbCBmaWxsIHRoaXMgb25lIHdpdGggZXZlbnRzIHRoYXQgb2NjdXIgZHVyaW5nCkBAIC00MTEsOCArNDA3LDYgQEAKIAkJCQl3YnNkX2dldF9zaG9ydF9yZXBseShob3N0LCBjbWQpOwogCQl9CiAJfQotCi0JREJHRigiU2VudCBjbWQgKCV4KSwgcmVzICVkXG4iLCBjbWQtPm9wY29kZSwgY21kLT5lcnJvcik7CiB9CiAKIC8qCkBAIC01NTAsMTEgKzU0NCw2IEBACiAJdW5zaWduZWQgbG9uZyBkbWFmbGFnczsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAotCURCR0YoImJsa3N6ICUwNHggYmxrcyAlMDR4IGZsYWdzICUwOHhcbiIsCi0JCWRhdGEtPmJsa3N6LCBkYXRhLT5ibG9ja3MsIGRhdGEtPmZsYWdzKTsKLQlEQkdGKCJ0c2FjICVkIG1zIG5zYWMgJWQgY2xrXG4iLAotCQlkYXRhLT50aW1lb3V0X25zIC8gMTAwMDAwMCwgZGF0YS0+dGltZW91dF9jbGtzKTsKLQogCS8qCiAJICogQ2FsY3VsYXRlIHNpemUuCiAJICovCkBAIC03NTIsOCArNzQxLDYgQEAKIAkJfQogCX0KIAotCURCR0YoIkVuZGluZyBkYXRhIHRyYW5zZmVyICglZCBieXRlcylcbiIsIGRhdGEtPmJ5dGVzX3hmZXJlZCk7Ci0KIAl3YnNkX3JlcXVlc3RfZW5kKGhvc3QsIGhvc3QtPm1ycSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5oIGIvZHJpdmVycy9tbWMvaG9zdC93YnNkLmgKaW5kZXggODczYmRhMS4uMDg3Nzg2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC93YnNkLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC93YnNkLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvbW1jL3dic2QuaCAtIFdpbmJvbmQgVzgzTDUxeEQgU0QvTU1DIGRyaXZlcgorICogIGxpbnV4L2RyaXZlcnMvbW1jL2hvc3Qvd2JzZC5oIC0gV2luYm9uZCBXODNMNTF4RCBTRC9NTUMgZHJpdmVyCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFBpZXJyZSBPc3NtYW4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IGY4OGViYzUuLmNjNmM3MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBjb25maWcgTVREX1NVTl9VRkxBU0gKIAl0cmlzdGF0ZSAiU3VuIE1pY3Jvc3lzdGVtcyB1c2VyZmxhc2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNQQVJDICYmIE1URF9DRkkKKwlkZXBlbmRzIG9uIFNQQVJDICYmIE1URF9DRkkgJiYgUENJCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBhICdtYXBwaW5nJyBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgdGhlIHdheSBpbgogCSAgd2hpY2ggdXNlci1wcm9ncmFtbWFibGUgZmxhc2ggY2hpcHMgYXJlIGNvbm5lY3RlZCBvbiB2YXJpb3VzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MjU5Ni5jIGIvZHJpdmVycy9uZXQvODI1OTYuYwppbmRleCAzZmYxMTU1Li5kOTE1ODM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MjU5Ni5jCisrKyBiL2RyaXZlcnMvbmV0LzgyNTk2LmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CiAJIjgyNTk2LmMgJFJldmlzaW9uOiAxLjUgJFxuIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggMzM2YWYwNi4uZTY4NDIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDcgQEAKIAkJZ2lhbmZhcl9zeXNmcy5vCiAKIG9iai0kKENPTkZJR19VQ0NfR0VUSCkgKz0gdWNjX2dldGhfZHJpdmVyLm8KLXVjY19nZXRoX2RyaXZlci1vYmpzIDo9IHVjY19nZXRoLm8gdWNjX2dldGhfbWlpLm8KK3VjY19nZXRoX2RyaXZlci1vYmpzIDo9IHVjY19nZXRoLm8gdWNjX2dldGhfbWlpLm8gdWNjX2dldGhfZXRodG9vbC5vCiAKICMKICMgbGluayBvcmRlciBpbXBvcnRhbnQgaGVyZQpAQCAtMTc3LDcgKzE3Nyw3IEBACiBvYmotJChDT05GSUdfSFBMQU5DRSkgKz0gaHBsYW5jZS5vIDc5OTAubwogb2JqLSQoQ09ORklHX01WTUUxNDdfTkVUKSArPSBtdm1lMTQ3Lm8gNzk5MC5vCiBvYmotJChDT05GSUdfRVFVQUxJWkVSKSArPSBlcWwubwotb2JqLSQoQ09ORklHX0xHVUVTVF9HVUVTVCkgKz0gbGd1ZXN0X25ldC5vCitvYmotJChDT05GSUdfTEdVRVNUX05FVCkgKz0gbGd1ZXN0X25ldC5vCiBvYmotJChDT05GSUdfTUlQU19KQVpaX1NPTklDKSArPSBqYXp6c29uaWMubwogb2JqLSQoQ09ORklHX01JUFNfQVUxWDAwX0VORVQpICs9IGF1MTAwMF9ldGgubwogb2JqLSQoQ09ORklHX01JUFNfU0lNX05FVCkgKz0gbWlwc25ldC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuYyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCmluZGV4IGI3OGE0ZTUuLjYyZTY2MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCkBAIC0zMTI4LDEyICszMTI4LDYgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAlzaG9ydCBpOwogCi0JaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJObyBkZXZpY2UhXG4iKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCiAJLyoKIAkgKiBEb24ndCB0YWtlIGludGVycnVwdHMgb24gdGhpcyBDUFUgd2lsbCBiaXQgYmFuZ2luZwogCSAqIHRoZSAlIyUjQCQgSTJDIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRsMS9hdGwxX2h3LmggYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfaHcuaAppbmRleCAxMDBjMDljLi45MzlhYTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfaHcuaAorKysgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfaHcuaApAQCAtNjgwLDExICs2ODAsNiBAQAogI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMCTB4MDAwRgkvKiBBbGwgMTAvMTAwIHNwZWVkcyAqLwogI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF9BTEwJMHgwMDAzCS8qIDEwTWJwcyBGdWxsICYgSGFsZiBzcGVlZHMgKi8KIAotLyogVGhlIHNpemUgKGluIGJ5dGVzKSBvZiBhIGV0aGVybmV0IHBhY2tldCAqLwotI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFCQkxNAotI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUJMTUxOAkvKiB3aXRoIEZDUyAqLwotI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUJNjQJLyogd2l0aCBGQ1MgKi8KLSNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUJCTQKICNkZWZpbmUgTUFYX0pVTUJPX0ZSQU1FX1NJWkUJCTB4MjgwMAogCiAjZGVmaW5lIFBIWV9BVVRPX05FR19USU1FCTQ1CS8qIDQuNSBTZWNvbmRzICovCkBAIC05MjksOCArOTI0LDggQEAKIAlhdGwxX2RtYV9yZXFfMTI4ID0gMCwKIAlhdGwxX2RtYV9yZXFfMjU2ID0gMSwKIAlhdGwxX2RtYV9yZXFfNTEyID0gMiwKLQlhdGwxX2RhbV9yZXFfMTAyNCA9IDMsCi0JYXRsMV9kYW1fcmVxXzIwNDggPSA0LAorCWF0bDFfZG1hX3JlcV8xMDI0ID0gMywKKwlhdGwxX2RtYV9yZXFfMjA0OCA9IDQsCiAJYXRsMV9kbWFfcmVxXzQwOTYgPSA1CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwppbmRleCBmZDFlMTU2Li41NmY2Mzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CkBAIC0xMjAsOCArMTIxLDggQEAKIAlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAotCWh3LT5tYXhfZnJhbWVfc2l6ZSA9IG5ldGRldi0+bXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOwotCWh3LT5taW5fZnJhbWVfc2l6ZSA9IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRTsKKwlody0+bWF4X2ZyYW1lX3NpemUgPSBuZXRkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU47CisJaHctPm1pbl9mcmFtZV9zaXplID0gRVRIX1pMRU4gKyBFVEhfRkNTX0xFTjsKIAogCWFkYXB0ZXItPndvbCA9IDA7CiAJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IChody0+bWF4X2ZyYW1lX3NpemUgKyA3KSAmIH43OwpAQCAtMzE0LDcgKzMxNSw3IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXZvaWQgYXRsMV9pbml0X3JpbmdfcHRycyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYXRsMV9pbml0X3JpbmdfcHRycyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKIAlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CkBAIC02ODgsOSArNjg5LDkgQEAKIHsKIAlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgb2xkX210dSA9IG5ldGRldi0+bXR1OwotCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOworCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRVRIX0hMRU4gKyBFVEhfRkNTX0xFTjsKIAotCWlmICgobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fAorCWlmICgobWF4X2ZyYW1lIDwgRVRIX1pMRU4gKyBFVEhfRkNTX0xFTikgfHwKIAkgICAgKG1heF9mcmFtZSA+IE1BWF9KVU1CT19GUkFNRV9TSVpFKSkgewogCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiaW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTA4LDggKzkwOSw4IEBACiAJLyogY29uZmlnIERNQSBFbmdpbmUgKi8KIAl2YWx1ZSA9ICgoKCh1MzIpIGh3LT5kbWFyX2Jsb2NrKSAmIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0spCiAJCTw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8Ci0JCSgoKCh1MzIpIGh3LT5kbWF3X2Jsb2NrKSAmIERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX01BU0spCi0JCTw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8IERNQV9DVFJMX0RNQVJfRU4gfAorCQkoKCgodTMyKSBody0+ZG1hd19ibG9jaykgJiBETUFfQ1RSTF9ETUFXX0JVUlNUX0xFTl9NQVNLKQorCQk8PCBETUFfQ1RSTF9ETUFXX0JVUlNUX0xFTl9TSElGVCkgfCBETUFfQ1RSTF9ETUFSX0VOIHwKIAkJRE1BX0NUUkxfRE1BV19FTjsKIAl2YWx1ZSB8PSAodTMyKSBody0+ZG1hX29yZDsKIAlpZiAoYXRsMV9yY2JfMTI4ID09IGh3LT5yY2JfdmFsdWUpCkBAIC05MTcsNyArOTE4LDEwIEBACiAJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19ETUFfQ1RSTCk7CiAKIAkvKiBjb25maWcgQ01CIC8gU01CICovCi0JdmFsdWUgPSBody0+Y21iX3JyZCB8ICgodTMyKSBody0+Y21iX3RwZCA8PCAxNik7CisJdmFsdWUgPSAoaHctPmNtYl90cGQgPiBhZGFwdGVyLT50cGRfcmluZy5jb3VudCkgPworCQlody0+Y21iX3RwZCA6IGFkYXB0ZXItPnRwZF9yaW5nLmNvdW50OworCXZhbHVlIDw8PSAxNjsKKwl2YWx1ZSB8PSBody0+Y21iX3JyZDsKIAlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0NNQl9XUklURV9USCk7CiAJdmFsdWUgPSBody0+Y21iX3J4X3RpbWVyIHwgKCh1MzIpIGh3LT5jbWJfdHhfdGltZXIgPDwgMTYpOwogCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ01CX1dSSVRFX1RJTUVSKTsKQEAgLTEzMzQsNyArMTMzOCw3IEBACiAJCXNrYiA9IGJ1ZmZlcl9pbmZvLT5za2I7CiAJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHJyZC0+eHN6LnhzdW1fc3oucGt0X3NpemUpOwogCi0JCXNrYl9wdXQoc2tiLCBsZW5ndGggLSBFVEhFUk5FVF9GQ1NfU0laRSk7CisJCXNrYl9wdXQoc2tiLCBsZW5ndGggLSBFVEhfRkNTX0xFTik7CiAKIAkJLyogUmVjZWl2ZSBDaGVja3N1bSBPZmZsb2FkICovCiAJCWF0bDFfcnhfY2hlY2tzdW0oYWRhcHRlciwgcnJkLCBza2IpOwpAQCAtMTQyMiw3ICsxNDI2LDcgQEAKIAkJbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogfQogCi1zdGF0aWMgdTE2IHRwZF9hdmFpbChzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcpCitzdGF0aWMgdTE2IGF0bDFfdHBkX2F2YWlsKHN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZykKIHsKIAl1MTYgbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbik7CiAJdTE2IG5leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSk7CkBAIC0xNDUzLDcgKzE0NTcsNyBAQAogCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLAogCQkJCWlwaC0+ZGFkZHIsIDAsIElQUFJPVE9fVENQLCAwKTsKIAkJCWlwb2ZzdCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwotCQkJaWYgKGlwb2ZzdCAhPSBFTkVUX0hFQURFUl9TSVpFKSAvKiA4MDIuMyBmcmFtZSAqLworCQkJaWYgKGlwb2ZzdCAhPSBFVEhfSExFTikgLyogODAyLjMgZnJhbWUgKi8KIAkJCQl0c28tPnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX0VUSFRZUEVfU0hJRlQ7CiAKIAkJCXRzby0+dHNvcGwgfD0gKGlwaC0+aWhsICYKQEAgLTE3MDgsNyArMTcxMiw3IEBACiAJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOwogCX0KIAotCWlmICh0cGRfYXZhaWwoJmFkYXB0ZXItPnRwZF9yaW5nKSA8IGNvdW50KSB7CisJaWYgKGF0bDFfdHBkX2F2YWlsKCZhZGFwdGVyLT50cGRfcmluZykgPCBjb3VudCkgewogCQkvKiBub3QgZW5vdWdoIGRlc2NyaXB0b3JzICovCiAJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXg4ODc5Ni5jIGIvZHJpdmVycy9uZXQvYXg4ODc5Ni5jCmluZGV4IDFkODgyMzYuLmU0M2U4MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F4ODg3OTYuYworKysgYi9kcml2ZXJzL25ldC9heDg4Nzk2LmMKQEAgLTgxOSw3ICs4MTksNyBAQAogCX0KIAogCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHNpemUpOwotCWRldi0+YmFzZV9hZGRyID0gKGxvbmcpZWlfc3RhdHVzLm1lbTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWVpX3N0YXR1cy5tZW07CiAKIAlpZiAoZWlfc3RhdHVzLm1lbSA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBpb3JlbWFwIGFyZWEgKCUwOHp4LCUwOHp4KVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMgYi9kcml2ZXJzL25ldC9iZmluX21hYy5jCmluZGV4IDlhMDhkNjUuLjJiYjk3ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JmaW5fbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvYmZpbl9tYWMuYwpAQCAtNzk4LDYgKzc5OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYmY1MzdtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCWludCByZXR2YWw7CiAJcHJfZGVidWcoIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOwogCiAJLyoKQEAgLTgxMSw3ICs4MTIsMTAgQEAKIAl9CiAKIAkvKiBpbml0aWFsIHJ4IGFuZCB0eCBsaXN0ICovCi0JZGVzY19saXN0X2luaXQoKTsKKwlyZXR2YWwgPSBkZXNjX2xpc3RfaW5pdCgpOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAogCWJmNTM3bWFjX3NldHBoeShkZXYpOwogCXNldHVwX3N5c3RlbV9yZWdzKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKaW5kZXggZWJjZjM1ZS4uZTYyMGVkNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKQEAgLTY5OSw3ICs2OTksNyBAQAogICogdGhlIGJ1ZmZlci4KICAqLwogc3RhdGljIHN0cnVjdCBza19idWZmICpjeGdiM19nZXRfY3BsX3JlcGx5X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgbGVuLAotCQkJCQkgICAgICAgaW50IGdmcCkKKwkJCQkJICAgICAgIGdmcF90IGdmcCkKIHsKIAlpZiAobGlrZWx5KCFza2JfY2xvbmVkKHNrYikpKSB7CiAJCUJVR19PTihza2ItPmxlbiA8IGxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwppbmRleCA3ZGYyM2RjLi45YzhlM2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKQEAgLTIwMCw2ICsyMDAsNyBAQAogCiAvKiBJbmNsdWRlIGZpbGVzICovCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZWlzYS5oPgpAQCAtMjQwLDggKzI0MSw2IEBACiAgKi8KICNkZWZpbmUgTkVXX1NLQl9TSVpFIChQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKzEyOCkKIAotI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLQogI2lmZGVmIENPTkZJR19QQ0kKICNkZWZpbmUgREZYX0JVU19QQ0koZGV2KSAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKICNlbHNlCkBAIC0zNzUsNyArMzc0LDcgQEAKIAogc3RhdGljIHZvaWQgZGZ4X3BvcnRfd3JpdGVfbG9uZyhERlhfYm9hcmRfdCAqYnAsIGludCBvZmZzZXQsIHUzMiBkYXRhKQogewotCXN0cnVjdCBkZXZpY2UgX191bnVzZWQgKmJkZXYgPSBicC0+YnVzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlIF9fbWF5YmVfdW51c2VkICpiZGV2ID0gYnAtPmJ1c19kZXY7CiAJaW50IGRmeF9idXNfdGMgPSBERlhfQlVTX1RDKGJkZXYpOwogCWludCBkZnhfdXNlX21taW8gPSBERlhfTU1JTyB8fCBkZnhfYnVzX3RjOwogCkBAIC0zOTksNyArMzk4LDcgQEAKIAogc3RhdGljIHZvaWQgZGZ4X3BvcnRfcmVhZF9sb25nKERGWF9ib2FyZF90ICpicCwgaW50IG9mZnNldCwgdTMyICpkYXRhKQogewotCXN0cnVjdCBkZXZpY2UgX191bnVzZWQgKmJkZXYgPSBicC0+YnVzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlIF9fbWF5YmVfdW51c2VkICpiZGV2ID0gYnAtPmJ1c19kZXY7CiAJaW50IGRmeF9idXNfdGMgPSBERlhfQlVTX1RDKGJkZXYpOwogCWludCBkZnhfdXNlX21taW8gPSBERlhfTU1JTyB8fCBkZnhfYnVzX3RjOwogCkBAIC04NjYsNyArODY1LDcgQEAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGRmeF9idXNfY29uZmlnX2NoZWNrKERGWF9ib2FyZF90ICpicCkKIHsKLQlzdHJ1Y3QgZGV2aWNlIF9fdW51c2VkICpiZGV2ID0gYnAtPmJ1c19kZXY7CisJc3RydWN0IGRldmljZSBfX21heWJlX3VudXNlZCAqYmRldiA9IGJwLT5idXNfZGV2OwogCWludCBkZnhfYnVzX2Vpc2EgPSBERlhfQlVTX0VJU0EoYmRldik7CiAJaW50CXN0YXR1czsJCQkJLyogcmV0dXJuIGNvZGUgZnJvbSBhZGFwdGVyIHBvcnQgY29udHJvbCBjYWxsICovCiAJdTMyCWhvc3RfZGF0YTsJCQkvKiBMVyBkYXRhIHJldHVybmVkIGZyb20gcG9ydCBjb250cm9sIGNhbGwgKi8KQEAgLTM2MjQsOCArMzYyMyw4IEBACiB9CiAKIAotc3RhdGljIGludCBfX2RldmluaXQgX191bnVzZWQgZGZ4X2Rldl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICopOwotc3RhdGljIGludCBfX2RldmV4aXQgX191bnVzZWQgZGZ4X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IF9fZGV2aW5pdCBfX21heWJlX3VudXNlZCBkZnhfZGV2X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IF9fZGV2ZXhpdCBfX21heWJlX3VudXNlZCBkZnhfZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRmeF9wY2lfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKiwKQEAgLTM2OTksNyArMzY5OCw3IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19UQyAqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBfX3VudXNlZCBkZnhfZGV2X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IF9fbWF5YmVfdW51c2VkIGRmeF9kZXZfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCBzdGF0dXM7CiAKQEAgLTM3MDksNyArMzcwOCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgX191bnVzZWQgZGZ4X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IF9fbWF5YmVfdW51c2VkIGRmeF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcHV0X2RldmljZShkZXYpOwogCWRmeF91bnJlZ2lzdGVyKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCmluZGV4IDQ4OWM4YjIuLjhlZTJjMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImVoZWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSJFSEVBXzAwNzEiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJFSEVBXzAwNzIiCiAKIC8qIGVIRUEgY2FwYWJpbGl0eSBmbGFncyAqLwogI2RlZmluZSBETFBBUl9QT1JUX0FERF9SRU0gMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKaW5kZXggNGM3MGE5My4uNTg3MDJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCkBAIC01ODksNiArNTg5LDIzIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgZWhlYV9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9yeF9zY2hlZHVsZShwb3J0LT5wb3J0X3Jlc1swXS5kX25ldGRldik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBlaGVhX3BvbGxfZmlyc3RxdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZF9kZXYgPSBwb3J0LT5wb3J0X3Jlc1swXS5kX25ldGRldjsKKworCXJldHVybiBlaGVhX3BvbGwoZF9kZXYsIGJ1ZGdldCk7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBlaGVhX3JlY3ZfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcGFyYW0pCiB7CiAJc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByID0gcGFyYW07CkBAIC0yNjI2LDcgKzI2NDMsMTAgQEAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgJnBvcnQtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlkZXYtPm9wZW4gPSBlaGVhX29wZW47Ci0JZGV2LT5wb2xsID0gZWhlYV9wb2xsOworCWRldi0+cG9sbCA9IGVoZWFfcG9sbF9maXJzdHF1ZXVlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaGVhX25ldHBvbGw7CisjZW5kaWYKIAlkZXYtPndlaWdodCA9IDY0OwogCWRldi0+c3RvcCA9IGVoZWFfc3RvcDsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGVoZWFfc3RhcnRfeG1pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYy5jIGIvZHJpdmVycy9uZXQvZmVjLmMKaW5kZXggMDMwMjNkZC4uNGU4ZGY5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVjLmMKKysrIGIvZHJpdmVycy9uZXQvZmVjLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX001MjN4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI3eCkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX001MjcyKSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkgfHwgXApAQCAtOTgsOCArOTksNiBAQAogI2RlZmluZQlGRUNfRkxBU0hNQUMJMHhmMDAwNjAwNgogI2VsaWYgZGVmaW5lZChDT05GSUdfR0lMQkFSQ09OQVApIHx8IGRlZmluZWQoQ09ORklHX1NDQUxFUykKICNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZjAwMDYwMDAKLSNlbGlmIGRlZmluZWQgKENPTkZJR19NVERfS2V5VGVjaG5vbG9neSkKLSNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZmZlMDQwMDAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NBTkNhbSkKICNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZjAwMjAwMDAKICNlbGlmIGRlZmluZWQgKENPTkZJR19NNTI3MkMzKQpAQCAtMTkxLDYgKzE5MCw4IEBACiAJLyogSGFyZHdhcmUgcmVnaXN0ZXJzIG9mIHRoZSBGRUMgZGV2aWNlICovCiAJdm9sYXRpbGUgZmVjX3QJKmh3cDsKIAorCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisKIAkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLwogCXVuc2lnbmVkIGNoYXIgKnR4X2JvdW5jZVtUWF9SSU5HX1NJWkVdOwogCXN0cnVjdAlza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKQEAgLTEyNjksNyArMTI3MCw3IEBACiAJaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRlNJTV9JQ1IzKTsKIAkqaWNycCA9IDB4MDAwMDBkZGQ7CiAJaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRlNJTV9JQ1IxKTsKLQkqaWNycCA9ICgqaWNycCAmIDB4NzA3Nzc3NzcpIHwgMHgwZDAwMDAwMDsKKwkqaWNycCA9IDB4MGQwMDAwMDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3NldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCkKQEAgLTEzMzEsNyArMTMzMiw3IEBACiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaWNycDsKIAlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX0lDUjEpOwotCSppY3JwID0gKCppY3JwICYgMHg3MDc3Nzc3NykgfCAweDA4MDAwMDAwOworCSppY3JwID0gMHgwODAwMDAwMDsKIH0KIAogc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfcGh5X2Fja19pbnRyKHZvaWQpCkBAIC0xMzM5LDcgKzEzNDAsNyBAQAogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmljcnA7CiAJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLwogCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMSk7Ci0JKmljcnAgPSAoKmljcnAgJiAweDc3Nzc3Nzc3KSB8IDB4MDgwMDAwMDA7CisJKmljcnAgPSAweDBkMDAwMDAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19sb2NhbGh3X3NldHVwKHZvaWQpCkBAIC0xNDI2LDYgKzE0MjcsMjkgQEAKIAkJKmdwaW9fcGVobHBhciA9IDB4YzA7CiAJfQogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NNTI3eCkKKwkvKiBTZXQgdXAgZ3BpbyBvdXRwdXRzIGZvciBNSUkgbGluZXMgKi8KKwl7CisJCXZvbGF0aWxlIHU4ICpncGlvX3Bhcl9mZWM7CisJCXZvbGF0aWxlIHUxNiAqZ3Bpb19wYXJfZmVjaTJjOworCisJCWdwaW9fcGFyX2ZlY2kyYyA9ICh2b2xhdGlsZSB1MTYgKikoTUNGX0lQU0JBUiArIDB4MTAwMDgyKTsKKwkJLyogU2V0IHVwIGdwaW8gb3V0cHV0cyBmb3IgRkVDMCBNSUkgbGluZXMgKi8KKwkJZ3Bpb19wYXJfZmVjID0gKHZvbGF0aWxlIHU4ICopKE1DRl9JUFNCQVIgKyAweDEwMDA3OCk7CisKKwkJKmdwaW9fcGFyX2ZlY2kyYyB8PSAweDBmMDA7CisJCSpncGlvX3Bhcl9mZWMgfD0gMHhjMDsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZFQzIpCisJCS8qIFNldCB1cCBncGlvIG91dHB1dHMgZm9yIEZFQzEgTUlJIGxpbmVzICovCisJCWdwaW9fcGFyX2ZlYyA9ICh2b2xhdGlsZSB1OCAqKShNQ0ZfSVBTQkFSICsgMHgxMDAwNzkpOworCisJCSpncGlvX3Bhcl9mZWNpMmMgfD0gMHgwMGEwOworCQkqZ3Bpb19wYXJfZmVjIHw9IDB4YzA7CisjZW5kaWYgLyogQ09ORklHX0ZFQzIgKi8KKwl9CisjZW5kaWYgLyogQ09ORklHX001Mjd4ICovCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3NldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCkKQEAgLTE5NDAsOSArMTk2NCwxMCBAQAogCXByaW50aygiLlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIG1paV9kaXNwbGF5X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbWlpX2Rpc3BsYXlfY29uZmlnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlLCBwaHlfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlcC0+bmV0ZGV2OwogCXVpbnQgc3RhdHVzID0gZmVwLT5waHlfc3RhdHVzOwogCiAJLyoKQEAgLTE5NzYsOSArMjAwMSwxMCBAQAogCWZlcC0+c2VxdWVuY2VfZG9uZSA9IDE7CiB9CiAKLXN0YXRpYyB2b2lkIG1paV9yZWxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG1paV9yZWxpbmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZlY19lbmV0X3ByaXZhdGUsIHBoeV90YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmVwLT5uZXRkZXY7CiAJaW50IGR1cGxleDsKIAogCS8qCkBAIC0yMDIyLDcgKzIwNDgsNyBAQAogCQlyZXR1cm47CiAKIAlmZXAtPm1paV9waHlfdGFza19xdWV1ZWQgPSAxOwotCUlOSVRfV09SSygmZmVwLT5waHlfdGFzaywgKHZvaWQqKW1paV9yZWxpbmssIGRldik7CisJSU5JVF9XT1JLKCZmZXAtPnBoeV90YXNrLCBtaWlfcmVsaW5rKTsKIAlzY2hlZHVsZV93b3JrKCZmZXAtPnBoeV90YXNrKTsKIH0KIApAQCAtMjAzNSw3ICsyMDYxLDcgQEAKIAkJcmV0dXJuOwogCiAJZmVwLT5taWlfcGh5X3Rhc2tfcXVldWVkID0gMTsKLQlJTklUX1dPUksoJmZlcC0+cGh5X3Rhc2ssICh2b2lkKiltaWlfZGlzcGxheV9jb25maWcsIGRldik7CisJSU5JVF9XT1JLKCZmZXAtPnBoeV90YXNrLCBtaWlfZGlzcGxheV9jb25maWcpOwogCXNjaGVkdWxlX3dvcmsoJmZlcC0+cGh5X3Rhc2spOwogfQogCkBAIC0yMzMwLDYgKzIzNTYsNyBAQAogCiAJZmVwLT5pbmRleCA9IGluZGV4OwogCWZlcC0+aHdwID0gZmVjcDsKKwlmZXAtPm5ldGRldiA9IGRldjsKIAogCS8qIFdoYWNrIGEgcmVzZXQuICBXZSBzaG91bGQgd2FpdCBmb3IgdGhpcy4KIAkqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCA2ZDFkNTBhLi41MWUxY2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTc4LDYgKzE3OCw3IEBACiAjZGVmaW5lIERFVl9IQVNfU1RBVElTVElDU19WMiAgIDB4MDgwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGh3IHN0YXRpc3RpY3MgdmVyc2lvbiAyICovCiAjZGVmaW5lIERFVl9IQVNfVEVTVF9FWFRFTkRFRCAgIDB4MTAwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGV4dGVuZGVkIGRpYWdub3N0aWMgdGVzdCAqLwogI2RlZmluZSBERVZfSEFTX01HTVRfVU5JVCAgICAgICAweDIwMDAgIC8qIGRldmljZSBzdXBwb3J0cyBtYW5hZ2VtZW50IHVuaXQgKi8KKyNkZWZpbmUgREVWX0hBU19DT1JSRUNUX01BQ0FERFIgMHg0MDAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgY29ycmVjdCBtYWMgYWRkcmVzcyBvcmRlciAqLwogCiBlbnVtIHsKIAlOdlJlZ0lycVN0YXR1cyA9IDB4MDAwLApAQCAtNTE3Miw3ICs1MTczLDggQEAKIAogCS8qIGNoZWNrIHRoZSB3b3JrYXJvdW5kIGJpdCBmb3IgY29ycmVjdCBtYWMgYWRkcmVzcyBvcmRlciAqLwogCXR4cmVnID0gcmVhZGwoYmFzZSArIE52UmVnVHJhbnNtaXRQb2xsKTsKLQlpZiAodHhyZWcgJiBOVlJFR19UUkFOU01JVFBPTExfTUFDX0FERFJfUkVWKSB7CisJaWYgKCh0eHJlZyAmIE5WUkVHX1RSQU5TTUlUUE9MTF9NQUNfQUREUl9SRVYpIHx8CisJICAgIChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX0NPUlJFQ1RfTUFDQUREUikpIHsKIAkJLyogbWFjIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiBjb3JyZWN0IG9yZGVyICovCiAJCWRldi0+ZGV2X2FkZHJbMF0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICAwKSAmIDB4ZmY7CiAJCWRldi0+ZGV2X2FkZHJbMV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICA4KSAmIDB4ZmY7CkBAIC01NTAwLDUxICs1NTAyLDY3IEBACiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE2KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKIAl9LAogCXsJLyogTUNQNjEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTcpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAogCX0sCiAJewkvKiBNQ1A2MSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xOCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFIsCiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE5KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjApLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFIsCiAJfSwKIAl7CS8qIE1DUDY1IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIyKSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKIAl9LAogCXsJLyogTUNQNjUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjMpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFIsCiAJfSwKIAl7CS8qIE1DUDY3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzI1KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKIAl9LAogCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjYpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFIsCisJfSwKKwl7CS8qIE1DUDczIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzI4KSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKKwl9LAorCXsJLyogTUNQNzMgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjkpLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSLAorCX0sCisJewkvKiBNQ1A3MyBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zMCksCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFIsCisJfSwKKwl7CS8qIE1DUDczIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzMxKSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUiwKIAl9LAogCXswLH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKaW5kZXggYWMzNTk2Zi4uMTAwYmY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZnaWFuZmFyX21kaW9fZHJpdmVyKTsKIH0KIAotdm9pZCBfX2V4aXQgZ2Zhcl9tZGlvX2V4aXQodm9pZCkKK3ZvaWQgZ2Zhcl9tZGlvX2V4aXQodm9pZCkKIHsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZ2lhbmZhcl9tZGlvX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuaAppbmRleCA1ZDM0MDA0Li5iMzczMDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5oCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmgKQEAgLTQyLDUgKzQyLDUgQEAKIGludCBnZmFyX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKTsKIGludCBnZmFyX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IG1paV9pZCwgaW50IHJlZ251bSwgdTE2IHZhbHVlKTsKIGludCBfX2luaXQgZ2Zhcl9tZGlvX2luaXQodm9pZCk7Ci12b2lkIF9fZXhpdCBnZmFyX21kaW9fZXhpdCh2b2lkKTsKK3ZvaWQgZ2Zhcl9tZGlvX2V4aXQodm9pZCk7CiAjZW5kaWYgLyogR0lBTkZBUl9QSFlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGd1ZXN0X25ldC5jIGIvZHJpdmVycy9uZXQvbGd1ZXN0X25ldC5jCmluZGV4IDExMjc3ODYuLmNhYjU3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xndWVzdF9uZXQuYworKysgYi9kcml2ZXJzL25ldC9sZ3Vlc3RfbmV0LmMKQEAgLTEsNiArMSwxMyBAQAotLyogQSBzaW1wbGUgbmV0d29yayBkcml2ZXIgZm9yIGxndWVzdC4KKy8qRDo1MDAKKyAqIFRoZSBHdWVzdCBuZXR3b3JrIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgMjAwNiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+IElCTSBDb3Jwb3JhdGlvbgorICogVGhpcyBpcyB2ZXJ5IHNpbXBsZSBhIHZpcnR1YWwgbmV0d29yayBkcml2ZXIsIGFuZCBvdXIgbGFzdCBHdWVzdCBkcml2ZXIuCisgKiBUaGUgb25seSB0cmljayBpcyB0aGF0IGl0IGNhbiB0YWxrIGRpcmVjdGx5IHRvIG11bHRpcGxlIG90aGVyIHJlY2lwaWVudHMKKyAqIChpZS4gb3RoZXIgR3Vlc3RzIG9uIHRoZSBzYW1lIG5ldHdvcmspLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB3aXRoIG9ubHkgdGhlCisgKiBIb3N0IG9uIHRoZSBuZXR3b3JrLgorIDoqLworCisvKiBDb3B5cmlnaHQgMjAwNiBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+IElCTSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjgsMjMgKzM1LDQ3IEBACiAjZGVmaW5lIE1BWF9MQU5TCQk0CiAjZGVmaW5lIE5VTV9TS0JTCQk4CiAKKy8qTTowMTEgTmV0d29yayBjb2RlIG1hc3RlciBKZWZmIEdhcnppayBwb2ludHMgb3V0IG51bWVyb3VzIHNob3J0Y29taW5ncyBpbgorICogdGhpcyBkcml2ZXIgaWYgaXQgYXNwaXJlcyB0byBncmVhdG5lc3MuCisgKgorICogRmlyc3RseSwgaXQgZG9lc24ndCB1c2UgIk5BUEkiOiB0aGUgbmV0d29ya2luZydzIE5ldyBBUEksIGFuZCBpcyBwb29yZXIgZm9yCisgKiBpdC4gIEFzIGhlIHNheXMgIk5BUEkgbWVhbnMgc3lzdGVtLXdpZGUgbG9hZCBsZXZlbGluZywgYWNyb3NzIG11bHRpcGxlCisgKiBuZXR3b3JrIGludGVyZmFjZXMuICBMYWNrIG9mIE5BUEkgY2FuIG1lYW4gY29tcGV0aXRpb24gYXQgaGlnaGVyIGxvYWRzLiIKKyAqCisgKiBIZSBhbHNvIHBvaW50cyBvdXQgdGhhdCB3ZSBkb24ndCBpbXBsZW1lbnQgc2V0X21hY19hZGRyZXNzLCBzbyB1c2VycyBjYW5ub3QKKyAqIGNoYW5nZSB0aGUgZGV2aWNlcyBoYXJkd2FyZSBhZGRyZXNzLiAgV2hlbiBJIGFza2VkIHdoeSBvbmUgd291bGQgd2FudCB0bzoKKyAqICJCb25kaW5nLCBhbmQgc2l0dWF0aW9ucyB3aGVyZSB5b3UgL2RvLyB3YW50IHRoZSBNQUMgYWRkcmVzcyB0byAibGVhayIgb3V0CisgKiBvZiB0aGUgaG9zdCBvbnRvIHRoZSB3aWRlciBuZXQuIgorICoKKyAqIEZpbmFsbHksIGhlIHdvdWxkIGxpa2UgbW9kdWxlIHVubG9hZGluZzogIkl0IGlzIG5vdCB1bnJlYWxpc3RpYyB0byB0aGluayBvZgorICogW3VufHJlfF1sb2FkaW5nIHRoZSBuZXQgc3VwcG9ydCBtb2R1bGUgaW4gYW4gbGd1ZXN0IGd1ZXN0LiAgQW5kLCBhZGRpbmcKKyAqIG1vZHVsZSBzdXBwb3J0IG1ha2VzIHRoZSBwcm9ncmFtbWVyIG1vcmUgcmVzcG9uc2libGUsIGJlY2F1c2UgdGhleSBub3cgaGF2ZQorICogdG8gbGVhcm4gdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlbXNlbHZlcy4gIEFueSBkcml2ZXIgdGhhdCBjYW5ub3QgY2xlYW4gdXAKKyAqIGFmdGVyIGl0c2VsZiBpcyBhbiBpbmNvbXBsZXRlIGRyaXZlciBpbiBteSBib29rLiIKKyA6Ki8KKworLypEOjUzMCBUaGUgInN0cnVjdCBsZ3Vlc3RuZXRfaW5mbyIgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvCisgKiBrbm93IGFib3V0IHRoZSBuZXR3b3JrIGRldmljZS4gKi8KIHN0cnVjdCBsZ3Vlc3RuZXRfaW5mbwogewotCS8qIFRoZSBzaGFyZWQgcGFnZShzKS4gKi8KKwkvKiBUaGUgbWFwcGVkIGRldmljZSBwYWdlKHMpIChhbiBhcnJheSBvZiAic3RydWN0IGxndWVzdF9uZXQiKS4gKi8KIAlzdHJ1Y3QgbGd1ZXN0X25ldCAqcGVlcjsKKwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHBhZ2UocykgKi8KIAl1bnNpZ25lZCBsb25nIHBlZXJfcGh5czsKKwkvKiBUaGUgc2l6ZSBvZiB0aGUgZGV2aWNlIHBhZ2UocykuICovCiAJdW5zaWduZWQgbG9uZyBtYXBzaXplOwogCiAJLyogVGhlIGxndWVzdF9kZXZpY2UgSSBjb21lIGZyb20gKi8KIAlzdHJ1Y3QgbGd1ZXN0X2RldmljZSAqbGdkZXY7CiAKLQkvKiBNeSBwZWVyaWQuICovCisJLyogTXkgcGVlcmlkIChpZS4gbXkgc2xvdCBpbiB0aGUgYXJyYXkpLiAqLwogCXVuc2lnbmVkIGludCBtZTsKIAotCS8qIFJlY2VpdmUgcXVldWUuICovCisJLyogUmVjZWl2ZSBxdWV1ZTogdGhlIG5ldHdvcmsgcGFja2V0cyB3YWl0aW5nIHRvIGJlIGZpbGxlZC4gKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiW05VTV9TS0JTXTsKIAlzdHJ1Y3QgbGd1ZXN0X2RtYSBkbWFbTlVNX1NLQlNdOwogfTsKKy8qOiovCiAKIC8qIEhvdyBtYW55IGJ5dGVzIGxlZnQgaW4gdGhpcyBwYWdlLiAqLwogc3RhdGljIHVuc2lnbmVkIGludCByZXN0X29mX3BhZ2Uodm9pZCAqZGF0YSkKQEAgLTUyLDM5ICs4Myw4MiBAQAogCXJldHVybiBQQUdFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpZGF0YSAlIFBBR0VfU0laRSk7CiB9CiAKLS8qIFNpbXBsZSBjb252ZW50aW9uOiBvZmZzZXQgNCAqIHBlZXJudW0uICovCisvKkQ6NTcwIEVhY2ggcGVlciAoaWUuIEd1ZXN0IG9yIEhvc3QpIG9uIHRoZSBuZXR3b3JrIGJpbmRzIHRoZWlyIHJlY2VpdmUKKyAqIGJ1ZmZlcnMgdG8gYSBkaWZmZXJlbnQga2V5OiB3ZSBzaW1wbHkgdXNlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorICogZGV2aWNlJ3MgbWVtb3J5IHBhZ2UgcGx1cyB0aGUgcGVlciBudW1iZXIuICBUaGUgSG9zdCBpbnNpc3RzIHRoYXQgYWxsIGtleXMKKyAqIGJlIGEgbXVsdGlwbGUgb2YgNCwgc28gd2UgbXVsdGlwbHkgdGhlIHBlZXIgbnVtYmVyIGJ5IDQuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwZWVyX2tleShzdHJ1Y3QgbGd1ZXN0bmV0X2luZm8gKmluZm8sIHVuc2lnbmVkIHBlZXJudW0pCiB7CiAJcmV0dXJuIGluZm8tPnBlZXJfcGh5cyArIDQgKiBwZWVybnVtOwogfQogCisvKiBUaGlzIGlzIHRoZSByb3V0aW5lIHdoaWNoIHNldHMgdXAgYSAic3RydWN0IGxndWVzdF9kbWEiIHRvIHBvaW50IHRvIGEKKyAqIG5ldHdvcmsgcGFja2V0LCBzaW1pbGFyIHRvIHJlcV90b19kbWEoKSBpbiBsZ3Vlc3RfYmxrLmMuICBUaGUgc3RydWN0dXJlIG9mIGEKKyAqICJzdHJ1Y3Qgc2tfYnVmZiIgaGFzIGdyb3duIGNvbXBsZXggb3ZlciB0aGUgeWVhcnM6IGl0IGNvbnNpc3RzIG9mIGEgImhlYWQiCisgKiBsaW5lYXIgc2VjdGlvbiBwb2ludGVkIHRvIGJ5ICJza2ItPmRhdGEiLCBhbmQgcG9zc2libHkgYW4gYXJyYXkgb2YKKyAqICJmcmFnbWVudHMiIGluIHRoZSBjYXNlIG9mIGEgbm9uLWxpbmVhciBwYWNrZXQuCisgKgorICogT3VyIHJlY2VpdmUgYnVmZmVycyBkb24ndCB1c2UgZnJhZ21lbnRzIGF0IGFsbCBidXQgb3V0Z29pbmcgc2ticyBtaWdodCwgc28KKyAqIHdlIGhhbmRsZSBpdC4gKi8KIHN0YXRpYyB2b2lkIHNrYl90b19kbWEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhlYWRsZW4sCiAJCSAgICAgICBzdHJ1Y3QgbGd1ZXN0X2RtYSAqZG1hKQogewogCXVuc2lnbmVkIGludCBpLCBzZWc7CiAKKwkvKiBGaXJzdCwgd2UgcHV0IHRoZSBsaW5lYXIgcmVnaW9uIGludG8gdGhlICJzdHJ1Y3QgbGd1ZXN0X2RtYSIuICBFYWNoCisJICogZW50cnkgY2FuJ3QgZ28gb3ZlciBhIHBhZ2UgYm91bmRhcnksIHNvIGV2ZW4gdGhvdWdoIGFsbCBvdXIgcGFja2V0cworCSAqIGFyZSAxNTE0IGJ5dGVzIG9yIGxlc3MsIHdlIG1pZ2h0IG5lZWQgdG8gdXNlIHR3byBlbnRyaWVzIGhlcmU6ICovCiAJZm9yIChpID0gc2VnID0gMDsgaSA8IGhlYWRsZW47IHNlZysrLCBpICs9IHJlc3Rfb2ZfcGFnZShza2ItPmRhdGEraSkpIHsKIAkJZG1hLT5hZGRyW3NlZ10gPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhICsgaSk7CiAJCWRtYS0+bGVuW3NlZ10gPSBtaW4oKHVuc2lnbmVkKShoZWFkbGVuIC0gaSksCiAJCQkJICAgIHJlc3Rfb2ZfcGFnZShza2ItPmRhdGEgKyBpKSk7CiAJfQorCisJLyogTm93IHdlIGhhbmRsZSB0aGUgZnJhZ21lbnRzOiBhdCBsZWFzdCB0aGV5J3JlIGd1YXJhbnRlZWQgbm90IHRvIGdvCisJICogb3ZlciBhIHBhZ2UuICBza2Jfc2hpbmZvKHNrYikgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZQorCSAqIHdoaWNoIHRlbGxzIHVzIGFib3V0IHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIGFuZCB0aGUgZnJhZ21lbnQKKwkgKiBhcnJheS4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrLCBzZWcrKykgewogCQljb25zdCBza2JfZnJhZ190ICpmID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CiAJCS8qIFNob3VsZCBub3QgaGFwcGVuIHdpdGggTVRVIGxlc3MgdGhhbiA2NGsgLSAyICogUEFHRV9TSVpFLiAqLwogCQlpZiAoc2VnID09IExHVUVTVF9NQVhfRE1BX1NFQ1RJT05TKSB7CisJCQkvKiBXZSB3aWxsIGVuZCB1cCBzZW5kaW5nIGEgdHJ1bmNhdGVkIHBhY2tldCBzaG91bGQKKwkJCSAqIHRoaXMgZXZlciBoYXBwZW4uICBQbHVzLCBhIGNvb2wgbG9nIG1lc3NhZ2UhICovCiAJCQlwcmludGsoIldvYWggZHVkZSEgIE1lZ2FwYWNrZXQhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWRtYS0+YWRkcltzZWddID0gcGFnZV90b19waHlzKGYtPnBhZ2UpICsgZi0+cGFnZV9vZmZzZXQ7CiAJCWRtYS0+bGVuW3NlZ10gPSBmLT5zaXplOwogCX0KKworCS8qIElmIGFmdGVyIGFsbCB0aGF0IHdlIGRpZG4ndCB1c2UgdGhlIGVudGlyZSAic3RydWN0IGxndWVzdF9kbWEiCisJICogYXJyYXksIHdlIHRlcm1pbmF0ZSBpdCB3aXRoIGEgMCBsZW5ndGguICovCiAJaWYgKHNlZyA8IExHVUVTVF9NQVhfRE1BX1NFQ1RJT05TKQogCQlkbWEtPmxlbltzZWddID0gMDsKIH0KIAotLyogV2Ugb3ZlcmxvYWQgbXVsdGljYXN0IGJpdCB0byBzaG93IHByb21pc2N1b3VzIG1vZGUuICovCisvKgorICogUGFja2V0IHRyYW5zbWlzc2lvbi4KKyAqCisgKiBPdXIgcGFja2V0IHRyYW5zbWlzc2lvbiBpcyBhIGxpdHRsZSB1bnVzdWFsLiAgQSByZWFsIG5ldHdvcmsgY2FyZCB3b3VsZCBqdXN0CisgKiBzZW5kIG91dCB0aGUgcGFja2V0IGFuZCBsZWF2ZSB0aGUgcmVjZWl2ZXJzIHRvIGRlY2lkZSBpZiB0aGV5J3JlIGludGVyZXN0ZWQuCisgKiBJbnN0ZWFkLCB3ZSBsb29rIHRocm91Z2ggdGhlIG5ldHdvcmsgZGV2aWNlIG1lbW9yeSBwYWdlIGFuZCBzZWUgaWYgYW55IG9mCisgKiB0aGUgZXRoZXJuZXQgYWRkcmVzc2VzIG1hdGNoIHRoZSBwYWNrZXQgZGVzdGluYXRpb24sIGFuZCBpZiBzbyB3ZSBzZW5kIGl0IHRvCisgKiB0aGF0IEd1ZXN0LgorICoKKyAqIFRoaXMgaXMgbWFkZSBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIGluIHR3byBjYXNlcy4gIFRoZSBmaXJzdCBjYXNlIGlzCisgKiBicm9hZGNhc3QgcGFja2V0czogZm9yIHRoYXQgd2Ugc2VuZCB0aGUgcGFja2V0IHRvIGFsbCBHdWVzdHMgb24gdGhlIG5ldHdvcmssCisgKiBvbmUgYXQgYSB0aW1lLiAgVGhlIHNlY29uZCBjYXNlIGlzICJwcm9taXNjdW91cyIgbW9kZSwgd2hlcmUgYSBHdWVzdCB3YW50cworICogdG8gc2VlIGFsbCB0aGUgcGFja2V0cyBvbiB0aGUgbmV0d29yay4gIFdlIG5lZWQgYSB3YXkgZm9yIHRoZSBHdWVzdCB0byB0ZWxsCisgKiB1cyBpdCB3YW50cyB0byBzZWUgYWxsIHBhY2tldHMsIHNvIGl0IHNldHMgdGhlICJtdWx0aWNhc3QiIGJpdCBvbiBpdHMKKyAqIHB1Ymxpc2hlZCBNQUMgYWRkcmVzcywgd2hpY2ggaXMgbmV2ZXIgdmFsaWQgaW4gYSByZWFsIGV0aGVybmV0IGFkZHJlc3MuCisgKi8KICNkZWZpbmUgUFJPTUlTQ19CSVQJCTB4MDEKIAorLyogVGhpcyBpcyB0aGUgY2FsbGJhY2sgd2hpY2ggaXMgc3VtbW9uZWQgd2hlbmV2ZXIgdGhlIG5ldHdvcmsgZGV2aWNlJ3MKKyAqIG11bHRpY2FzdCBvciBwcm9taXNjdW91cyBzdGF0ZSBjaGFuZ2VzLiAgSWYgdGhlIGNhcmQgaXMgaW4gcHJvbWlzY3VvdXMgbW9kZSwKKyAqIHdlIGFkdmVydGlzZSB0aGF0IGluIG91ciBldGhlcm5ldCBhZGRyZXNzIGluIHRoZSBkZXZpY2UncyBtZW1vcnkuICBXZSBkbyB0aGUKKyAqIHNhbWUgaWYgTGludXggd2FudHMgYW55IG9yIGFsbCBtdWx0aWNhc3QgdHJhZmZpYy4gICovCiBzdGF0aWMgdm9pZCBsZ3Vlc3RuZXRfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBsZ3Vlc3RuZXRfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CkBAIC05NSwxMSArMTY5LDE0IEBACiAJCWluZm8tPnBlZXJbaW5mby0+bWVdLm1hY1swXSAmPSB+UFJPTUlTQ19CSVQ7CiB9CiAKKy8qIEEgc2ltcGxlIHRlc3QgZnVuY3Rpb24gdG8gc2VlIGlmIGEgcGVlciB3YW50cyB0byBzZWUgYWxsIHBhY2tldHMuKi8KIHN0YXRpYyBpbnQgcHJvbWlzYyhzdHJ1Y3QgbGd1ZXN0bmV0X2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBwZWVyKQogewogCXJldHVybiBpbmZvLT5wZWVyW3BlZXJdLm1hY1swXSAmIFBST01JU0NfQklUOwogfQogCisvKiBBbm90aGVyIHNpbXBsZSBmdW5jdGlvbiB0byBzZWUgaWYgYSBwZWVyJ3MgYWR2ZXJ0aXNlZCBldGhlcm5ldCBhZGRyZXNzCisgKiBtYXRjaGVzIGEgcGFja2V0J3MgZGVzdGluYXRpb24gZXRoZXJuZXQgYWRkcmVzcy4gKi8KIHN0YXRpYyBpbnQgbWFjX2VxKGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXSwKIAkJICBzdHJ1Y3QgbGd1ZXN0bmV0X2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBwZWVyKQogewpAQCAtMTA5LDYgKzE4Niw4IEBACiAJcmV0dXJuIG1lbWNtcChtYWMrMSwgaW5mby0+cGVlcltwZWVyXS5tYWMrMSwgRVRIX0FMRU4tMSkgPT0gMDsKIH0KIAorLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gd2hpY2ggYWN0dWFsbHkgc2VuZHMgYSBwYWNrZXQgb25jZSB3ZSd2ZSBkZWNpZGVkIGEKKyAqIHBlZXIgd2FudHMgaXQ6ICovCiBzdGF0aWMgdm9pZCB0cmFuc2Zlcl9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIHVuc2lnbmVkIGludCBwZWVybnVtKQpAQCAtMTE2LDc2ICsxOTUsMTM0IEBACiAJc3RydWN0IGxndWVzdG5ldF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbGd1ZXN0X2RtYSBkbWE7CiAKKwkvKiBXZSB1c2Ugb3VyIGhhbmR5ICJzdHJ1Y3QgbGd1ZXN0X2RtYSIgcGFja2luZyBmdW5jdGlvbiB0byBwcmVwYXJlCisJICogdGhlIHNrYiBmb3Igc2VuZGluZy4gKi8KIAlza2JfdG9fZG1hKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSwgJmRtYSk7CiAJcHJfZGVidWcoInhmZXIgbGVuZ3RoICUwNHggKCV1KVxuIiwgaHRvbnMoc2tiLT5sZW4pLCBza2ItPmxlbik7CiAKKwkvKiBUaGlzIGlzIHRoZSBhY3R1YWwgc2VuZCBjYWxsIHdoaWNoIGNvcGllcyB0aGUgcGFja2V0LiAqLwogCWxndWVzdF9zZW5kX2RtYShwZWVyX2tleShpbmZvLCBwZWVybnVtKSwgJmRtYSk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBlbnRpcmUgcGFja2V0IHdhcyB0cmFuc21pdHRlZC4gIElmIG5vdCwgaXQgY291bGQgbWVhbgorCSAqIHRoYXQgdGhlIG90aGVyIEd1ZXN0IHJlZ2lzdGVyZWQgYSBzaG9ydCByZWNlaXZlIGJ1ZmZlciwgYnV0IHRoaXMKKwkgKiBkcml2ZXIgc2hvdWxkIG5ldmVyIGRvIHRoYXQuICBNb3JlIGxpa2VseSwgdGhlIHBlZXIgaXMgZGVhZC4gKi8KIAlpZiAoZG1hLnVzZWRfbGVuICE9IHNrYi0+bGVuKSB7CiAJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKIAkJcHJfZGVidWcoIkJhZCB4ZmVyIHRvIHBlZXIgJWk6ICVpIG9mICVpIChkbWEgJXAvJWkpXG4iLAogCQkJIHBlZXJudW0sIGRtYS51c2VkX2xlbiwgc2tiLT5sZW4sCiAJCQkgKHZvaWQgKilkbWEuYWRkclswXSwgZG1hLmxlblswXSk7CiAJfSBlbHNlIHsKKwkJLyogT24gc3VjY2VzcyB3ZSB1cGRhdGUgdGhlIHN0YXRzLiAqLwogCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiB9CiAKKy8qIEFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIHRvIHRlbGwgaXMgaWYgYSBzbG90IGluIHRoZSBkZXZpY2UgbWVtb3J5IGlzIHVudXNlZC4KKyAqIFNpbmNlIHdlIGFsd2F5cyBzZXQgdGhlIExvY2FsIEFzc2lnbm1lbnQgYml0IGluIHRoZSBldGhlcm5ldCBhZGRyZXNzLCB0aGUKKyAqIGZpcnN0IGJ5dGUgY2FuIG5ldmVyIGJlIDAuICovCiBzdGF0aWMgaW50IHVudXNlZF9wZWVyKGNvbnN0IHN0cnVjdCBsZ3Vlc3RfbmV0IHBlZXJbXSwgdW5zaWduZWQgaW50IG51bSkKIHsKIAlyZXR1cm4gcGVlcltudW1dLm1hY1swXSA9PSAwOwogfQogCisvKiBGaW5hbGx5LCBoZXJlIGlzIHRoZSByb3V0aW5lIHdoaWNoIGhhbmRsZXMgYW4gb3V0Z29pbmcgcGFja2V0LiAgSXQncyBjYWxsZWQKKyAqICJzdGFydF94bWl0IiBmb3IgdHJhZGl0aW9uYWwgcmVhc29ucy4gKi8KIHN0YXRpYyBpbnQgbGd1ZXN0bmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgYnJvYWRjYXN0OwogCXN0cnVjdCBsZ3Vlc3RuZXRfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJLyogRXh0cmFjdCB0aGUgZGVzdGluYXRpb24gZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBwYWNrZXQuICovCiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9ICgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfZGVzdDsKIAogCXByX2RlYnVnKCIlczogeG1pdCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKIAkJIGRldi0+bmFtZSwgZGVzdFswXSxkZXN0WzFdLGRlc3RbMl0sZGVzdFszXSxkZXN0WzRdLGRlc3RbNV0pOwogCisJLyogSWYgaXQncyBhIG11bHRpY2FzdCBwYWNrZXQsIHdlIGJyb2FkY2FzdCB0byBldmVyeW9uZS4gIFRoYXQncyBub3QKKwkgKiB2ZXJ5IGVmZmljaWVudCwgYnV0IHRoZXJlIGFyZSB2ZXJ5IGZldyBhcHBsaWNhdGlvbnMgd2hpY2ggYWN0dWFsbHkKKwkgKiB1c2UgbXVsdGljYXN0LCB3aGljaCBpcyBhIHNoYW1lIHJlYWxseS4KKwkgKgorCSAqIEFzIGV0aGVyZGV2aWNlLmggcG9pbnRzIG91dDogIkJ5IGRlZmluaXRpb24gdGhlIGJyb2FkY2FzdCBhZGRyZXNzIGlzCisJICogYWxzbyBhIG11bHRpY2FzdCBhZGRyZXNzLiIgIFNvIHdlIGRvbid0IGhhdmUgdG8gdGVzdCBmb3IgYnJvYWRjYXN0CisJICogcGFja2V0cyBzZXBhcmF0ZWx5LiAqLwogCWJyb2FkY2FzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpOworCisJLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgcHVibGlzaGVkIGV0aGVybmV0IGFkZHJlc3NlcyB0byBzZWUgaWYgd2UKKwkgKiBzaG91bGQgc2VuZCB0aGlzIHBhY2tldC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bWFwc2l6ZS9zaXplb2Yoc3RydWN0IGxndWVzdF9uZXQpOyBpKyspIHsKKwkJLyogV2UgZG9uJ3Qgc2VuZCB0byBvdXJzZWx2ZXMgKHdlIGFjdHVhbGx5IGNhbid0IFNFTkRfRE1BIHRvCisJCSAqIG91cnNlbHZlcyBhbnl3YXkpLCBhbmQgZG9uJ3Qgc2VuZCB0byB1bnVzZWQgc2xvdHMuKi8KIAkJaWYgKGkgPT0gaW5mby0+bWUgfHwgdW51c2VkX3BlZXIoaW5mby0+cGVlciwgaSkpCiAJCQljb250aW51ZTsKIAorCQkvKiBJZiBpdCdzIGJyb2FkY2FzdCB3ZSBzZW5kIGl0LiAgSWYgdGhleSB3YW50IGV2ZXJ5IHBhY2tldCB3ZQorCQkgKiBzZW5kIGl0LiAgSWYgdGhlIGRlc3RpbmF0aW9uIG1hdGNoZXMgdGhlaXIgYWRkcmVzcyB3ZSBzZW5kCisJCSAqIGl0LiAgT3RoZXJ3aXNlIHdlIGdvIHRvIHRoZSBuZXh0IHBlZXIuICovCiAJCWlmICghYnJvYWRjYXN0ICYmICFwcm9taXNjKGluZm8sIGkpICYmICFtYWNfZXEoZGVzdCwgaW5mbywgaSkpCiAJCQljb250aW51ZTsKIAogCQlwcl9kZWJ1ZygibGd1ZXN0bmV0ICVzOiBzZW5kaW5nIGZyb20gJWkgdG8gJWlcbiIsCiAJCQkgZGV2LT5uYW1lLCBpbmZvLT5tZSwgaSk7CisJCS8qIE91ciByb3V0aW5lIHdoaWNoIGFjdHVhbGx5IGRvZXMgdGhlIHRyYW5zZmVyLiAqLwogCQl0cmFuc2Zlcl9wYWNrZXQoZGV2LCBza2IsIGkpOwogCX0KKworCS8qIEFuIHhtaXQgcm91dGluZSBpcyBleHBlY3RlZCB0byBkaXNwb3NlIG9mIHRoZSBwYWNrZXQsIHNvIHdlIGRvLiAqLwogCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCS8qIEFzIHBlciBrZXJuZWwgY29udmVudGlvbiwgMCBtZWFucyBzdWNjZXNzLiAgVGhpcyBpcyB3aHkgSSBsb3ZlCisJICogbmV0d29ya2luZzogZXZlbiBpZiB3ZSBuZXZlciBzZW50IHRvIGFueW9uZSwgdGhhdCdzIHN0aWxsCisJICogc3VjY2VzcyEgKi8KIAlyZXR1cm4gMDsKIH0KIAotLyogRmluZCBhIG5ldyBza2IgdG8gcHV0IGluIHRoaXMgc2xvdCBpbiBzaGFyZWQgbWVtLiAqLworLypEOjU2MAorICogUGFja2V0IHJlY2VpdmluZy4KKyAqCisgKiBGaXJzdCwgaGVyZSdzIGEgaGVscGVyIHJvdXRpbmUgd2hpY2ggZmlsbHMgb25lIG9mIG91ciBhcnJheSBvZiByZWNlaXZlCisgKiBidWZmZXJzOiAqLwogc3RhdGljIGludCBmaWxsX3Nsb3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHNsb3QpCiB7CiAJc3RydWN0IGxndWVzdG5ldF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkvKiBUcnkgdG8gY3JlYXRlIGFuZCByZWdpc3RlciBhIG5ldyBvbmUuICovCisKKwkvKiBXZSBjYW4gcmVjZWl2ZSBFVEhfREFUQV9MRU4gKDE1MDApIGJ5dGUgcGFja2V0cywgcGx1cyBhIHN0YW5kYXJkCisJICogZXRoZXJuZXQgaGVhZGVyIG9mIEVUSF9ITEVOICgxNCkgYnl0ZXMuICovCiAJaW5mby0+c2tiW3Nsb3RdID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIEVUSF9ITEVOICsgRVRIX0RBVEFfTEVOKTsKIAlpZiAoIWluZm8tPnNrYltzbG90XSkgewogCQlwcmludGsoIiVzOiBjb3VsZCBub3QgZmlsbCBzbG90ICVpXG4iLCBkZXYtPm5hbWUsIHNsb3QpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKiBza2JfdG9fZG1hKCkgaXMgYSBoZWxwZXIgd2hpY2ggc2V0cyB1cCB0aGUgInN0cnVjdCBsZ3Vlc3RfZG1hIiB0bworCSAqIHBvaW50IHRvIHRoZSBkYXRhIGluIHRoZSBza2I6IHdlIGFsc28gdXNlIGl0IGZvciBzZW5kaW5nIG91dCBhCisJICogcGFja2V0LiAqLwogCXNrYl90b19kbWEoaW5mby0+c2tiW3Nsb3RdLCBFVEhfSExFTiArIEVUSF9EQVRBX0xFTiwgJmluZm8tPmRtYVtzbG90XSk7CisKKwkvKiBUaGlzIGlzIGEgV3JpdGUgTWVtb3J5IEJhcnJpZXI6IGl0IGVuc3VyZXMgdGhhdCB0aGUgZW50cnkgaW4gdGhlCisJICogcmVjZWl2ZSBidWZmZXIgYXJyYXkgaXMgd3JpdHRlbiAqYmVmb3JlKiB3ZSBzZXQgdGhlICJ1c2VkX2xlbiIgZW50cnkKKwkgKiB0byAwLiAgSWYgdGhlIEhvc3Qgd2VyZSBsb29raW5nIGF0IHRoZSByZWNlaXZlIGJ1ZmZlciBhcnJheSBmcm9tIGEKKwkgKiBkaWZmZXJlbnQgQ1BVLCBpdCBjb3VsZCBwb3RlbnRpYWxseSBzZWUgInVzZWRfbGVuID0gMCIgYW5kIG5vdCBzZWUKKwkgKiB0aGUgdXBkYXRlZCByZWNlaXZlIGJ1ZmZlciBpbmZvcm1hdGlvbi4gIFRoaXMgd291bGQgYmUgYSBob3JyaWJseQorCSAqIG5hc3R5IGJ1Zywgc28gbWFrZSBzdXJlIHRoZSBjb21waWxlciBhbmQgQ1BVIGtub3cgdGhpcyBoYXMgdG8gaGFwcGVuCisJICogZmlyc3QuICovCiAJd21iKCk7Ci0JLyogTm93IHdlIHRlbGwgaHlwZXJ2aXNvciBpdCBjYW4gdXNlIHRoZSBzbG90LiAqLworCS8qIFdyaXRpbmcgMCB0byAidXNlZF9sZW4iIHRlbGxzIHRoZSBIb3N0IGl0IGNhbiB1c2UgdGhpcyByZWNlaXZlCisJICogYnVmZmVyIG5vdy4gKi8KIAlpbmZvLT5kbWFbc2xvdF0udXNlZF9sZW4gPSAwOwogCXJldHVybiAwOwogfQogCisvKiBUaGlzIGlzIHRoZSBhY3R1YWwgcmVjZWl2ZSByb3V0aW5lLiAgV2hlbiB3ZSByZWNlaXZlIGFuIGludGVycnVwdCBmcm9tIHRoZQorICogSG9zdCB0byB0ZWxsIHVzIGEgcGFja2V0IGhhcyBiZWVuIGRlbGl2ZXJlZCwgd2UgYXJyaXZlIGhlcmU6ICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgbGd1ZXN0bmV0X3JjdihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgbGd1ZXN0bmV0X2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGludCBpLCBkb25lID0gMDsKIAorCS8qIExvb2sgdGhyb3VnaCBvdXIgZW50aXJlIHJlY2VpdmUgYXJyYXkgZm9yIGFuIGVudHJ5IHdoaWNoIGhhcyBkYXRhCisJICogaW4gaXQuICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5mby0+ZG1hKTsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCBsZW5ndGg7CiAJCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xOTQsMTAgKzMzMSwxNiBAQAogCQlpZiAobGVuZ3RoID09IDApCiAJCQljb250aW51ZTsKIAorCQkvKiBXZSd2ZSBmb3VuZCBvbmUhICBSZW1lbWJlciB0aGUgc2tiICh3ZSBncmFiYmVkIHRoZSBsZW5ndGgKKwkJICogYWJvdmUpLCBhbmQgaW1tZWRpYXRlbHkgcmVmaWxsIHRoZSBzbG90IHdlJ3ZlIHRha2VuIGl0CisJCSAqIGZyb20uICovCiAJCWRvbmUrKzsKIAkJc2tiID0gaW5mby0+c2tiW2ldOwogCQlmaWxsX3Nsb3QoZGV2LCBpKTsKIAorCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW46IG1pY3JvcGFja2V0cyBjb3VsZCBiZSBzZW50IGJ5IGEKKwkJICogYmFkbHktYmVoYXZlZCBHdWVzdCBvbiB0aGUgbmV0d29yaywgYnV0IHRoZSBIb3N0IHdpbGwgbmV2ZXIKKwkJICogc3R1ZmYgbW9yZSBkYXRhIGluIHRoZSBidWZmZXIgdGhhbiB0aGUgYnVmZmVyIGxlbmd0aC4gKi8KIAkJaWYgKGxlbmd0aCA8IEVUSF9ITEVOIHx8IGxlbmd0aCA+IEVUSF9ITEVOICsgRVRIX0RBVEFfTEVOKSB7CiAJCQlwcl9kZWJ1ZyhLRVJOX1dBUk5JTkcgIiVzOiB1bmJlbGlldmFibGUgc2tiIGxlbjogJWlcbiIsCiAJCQkJIGRldi0+bmFtZSwgbGVuZ3RoKTsKQEAgLTIwNSwzNiArMzQ4LDcyIEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIHNrYl9wdXQoKSwgd2hhdCBhIGdyZWF0IGZ1bmN0aW9uISAgSSd2ZSByYW50ZWQgYWJvdXQgdGhpcworCQkgKiBmdW5jdGlvbiBiZWZvcmUgKGh0dHA6Ly9sa21sLm9yZy9sa21sLzE5OTkvOS8yNi8yNCkuICBZb3UKKwkJICogY2FsbCBpdCBhZnRlciB5b3UndmUgYWRkZWQgZGF0YSB0byB0aGUgZW5kIG9mIGFuIHNrYiAoaW4KKwkJICogdGhpcyBjYXNlLCBpdCB3YXMgdGhlIEhvc3Qgd2hpY2ggd3JvdGUgdGhlIGRhdGEpLiAqLwogCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCQkvKiBUaGUgZXRoZXJuZXQgaGVhZGVyIGNvbnRhaW5zIGEgcHJvdG9jb2wgZmllbGQ6IHdlIHVzZSB0aGUKKwkJICogc3RhbmRhcmQgaGVscGVyIHRvIGV4dHJhY3QgaXQsIGFuZCBwbGFjZSB0aGUgcmVzdWx0IGluCisJCSAqIHNrYi0+cHJvdG9jb2wuICBUaGUgaGVscGVyIGFsc28gc2V0cyB1cCBza2ItPnBrdF90eXBlIGFuZAorCQkgKiBlYXRzIHVwIHRoZSBldGhlcm5ldCBoZWFkZXIgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHBhY2tldC4gKi8KIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJLyogVGhpcyBpcyBhIHJlbGlhYmxlIHRyYW5zcG9ydC4gKi8KKworCQkvKiBJZiB0aGlzIGRldmljZSBkb2Vzbid0IG5lZWQgY2hlY2tzdW1zIGZvciBzZW5kaW5nLCB3ZSBhbHNvCisJCSAqIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHBhY2tldHMgd2hlbiB0aGV5IGNvbWUgaW4uICovCiAJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9OT19DU1VNKQogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCQkvKiBBcyBhIGxhc3QgcmVzb3J0IGZvciBkZWJ1Z2dpbmcgdGhlIGRyaXZlciBvciB0aGUgbGd1ZXN0IEkvTworCQkgKiBzdWJzeXN0ZW0sIHlvdSBjYW4gdW5jb21tZW50IHRoZSAiI2RlZmluZSBERUJVRyIgYXQgdGhlIHRvcAorCQkgKiBvZiB0aGlzIGZpbGUsIHdoaWNoIHR1cm5zIGFsbCB0aGUgcHJfZGVidWcoKSBpbnRvIHByaW50aygpCisJCSAqIGFuZCBmbG9vZHMgdGhlIGxvZ3MuICovCiAJCXByX2RlYnVnKCJSZWNlaXZpbmcgc2tiIHByb3RvIDB4JTA0eCBsZW4gJWkgdHlwZSAlaVxuIiwKIAkJCSBudG9ocyhza2ItPnByb3RvY29sKSwgc2tiLT5sZW4sIHNrYi0+cGt0X3R5cGUpOwogCisJCS8qIFVwZGF0ZSB0aGUgcGFja2V0IGFuZCBieXRlIGNvdW50cyAodmlzaWJsZSBmcm9tIGlmY29uZmlnLAorCQkgKiBhbmQgZ29vZCBmb3IgZGVidWdnaW5nKS4gKi8KIAkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwkJLyogSGFuZCBvdXIgZnJlc2ggbmV0d29yayBwYWNrZXQgaW50byB0aGUgc3RhY2sncyAibmV0d29yaworCQkgKiBpbnRlcmZhY2UgcmVjZWl2ZSIgcm91dGluZS4gIFRoYXQgd2lsbCBmcmVlIHRoZSBwYWNrZXQKKwkJICogaXRzZWxmIHdoZW4gaXQncyBmaW5pc2hlZC4gKi8KIAkJbmV0aWZfcngoc2tiKTsKIAl9CisKKwkvKiBJZiB3ZSBmb3VuZCBhbnkgcGFja2V0cywgd2UgYXNzdW1lIHRoZSBpbnRlcnJ1cHQgd2FzIGZvciB1cy4gKi8KIAlyZXR1cm4gZG9uZSA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9CiAKKy8qRDo1NTAgVGhpcyBpcyB3aGVyZSB3ZSBzdGFydDogd2hlbiB0aGUgZGV2aWNlIGlzIGJyb3VnaHQgdXAgYnkgZGhjcGQgb3IKKyAqIGlmY29uZmlnLiAgQXQgdGhpcyBwb2ludCB3ZSBhZHZlcnRpc2Ugb3VyIE1BQyBhZGRyZXNzIHRvIHRoZSByZXN0IG9mIHRoZQorICogbmV0d29yaywgYW5kIHJlZ2lzdGVyIHJlY2VpdmUgYnVmZmVycyByZWFkeSBmb3IgaW5jb21pbmcgcGFja2V0cy4gKi8KIHN0YXRpYyBpbnQgbGd1ZXN0bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbGd1ZXN0bmV0X2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JLyogU2V0IHVwIG91ciBNQUMgYWRkcmVzcyAqLworCS8qIENvcHkgb3VyIE1BQyBhZGRyZXNzIGludG8gdGhlIGRldmljZSBwYWdlLCBzbyBvdGhlcnMgb24gdGhlIG5ldHdvcmsKKwkgKiBjYW4gZmluZCB1cy4gKi8KIAltZW1jcHkoaW5mby0+cGVlcltpbmZvLT5tZV0ubWFjLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKLQkvKiBUdXJuIG9uIHByb21pc2MgbW9kZSBpZiBuZWVkZWQgKi8KKwkvKiBXZSBtaWdodCBhbHJlYWR5IGJlIGluIHByb21pc2MgbW9kZSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKS4gIE91cgorCSAqIHNldF9tdWx0aWNhc3QgY2FsbGJhY2sgaGFuZGxlcyB0aGlzIGFscmVhZHksIHNvIHdlIGNhbGwgaXQgbm93LiAqLwogCWxndWVzdG5ldF9zZXRfbXVsdGljYXN0KGRldik7CiAKKwkvKiBBbGxvY2F0ZSBwYWNrZXRzIGFuZCBwdXQgdGhlbSBpbnRvIG91ciAic3RydWN0IGxndWVzdF9kbWEiIGFycmF5LgorCSAqIElmIHdlIGZhaWwgdG8gYWxsb2NhdGUgYWxsIHRoZSBwYWNrZXRzIHdlIGNvdWxkIHN0aWxsIGxpbXAgYWxvbmcsCisJICogYnV0IGl0J3MgYSBzaWduIG9mIHJlYWwgc3RyZXNzIHNvIHdlIHNob3VsZCBwcm9iYWJseSBnaXZlIHVwIG5vdy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbmZvLT5kbWEpOyBpKyspIHsKIAkJaWYgKGZpbGxfc2xvdChkZXYsIGkpICE9IDApCiAJCQlnb3RvIGNsZWFudXA7CiAJfQorCisJLyogRmluYWxseSB3ZSB0ZWxsIHRoZSBIb3N0IHdoZXJlIG91ciBhcnJheSBvZiAic3RydWN0IGxndWVzdF9kbWEiCisJICogcmVjZWl2ZSBidWZmZXJzIGlzLCBiaW5kaW5nIGl0IHRvIHRoZSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBkZXZpY2UncyBwaHlzaWNhbCBtZW1vcnkgcGx1cyBvdXIgcGVlcmlkLiAqLwogCWlmIChsZ3Vlc3RfYmluZF9kbWEocGVlcl9rZXkoaW5mbyxpbmZvLT5tZSksIGluZm8tPmRtYSwKIAkJCSAgICBOVU1fU0tCUywgbGdkZXZfaXJxKGluZm8tPmxnZGV2KSkgIT0gMCkKIAkJZ290byBjbGVhbnVwOwpAQCAtMjQ1LDIyICs0MjQsMjkgQEAKIAkJZGV2X2tmcmVlX3NrYihpbmZvLT5za2JbaV0pOwogCXJldHVybiAtRU5PTUVNOwogfQorLyo6Ki8KIAorLyogVGhlIGNsb3NlIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBubyBsb25nZXIgaW4gdXNlOiB3ZSBjbGVhbiB1cAorICogZWxlZ2FudGx5LiAqLwogc3RhdGljIGludCBsZ3Vlc3RuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgbGd1ZXN0bmV0X2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JLyogQ2xlYXIgYWxsIHRyYWNlOiBvdGhlcnMgbWlnaHQgZGVsaXZlciBwYWNrZXRzLCB3ZSdsbCBpZ25vcmUgaXQuICovCisJLyogQ2xlYXIgYWxsIHRyYWNlIG9mIG91ciBleGlzdGVuY2Ugb3V0IG9mIHRoZSBkZXZpY2UgbWVtb3J5IGJ5IHNldHRpbmcKKwkgKiB0aGUgc2xvdCB3aGljaCBoZWxkIG91ciBNQUMgYWRkcmVzcyB0byAwICh1bnVzZWQpLiAqLwogCW1lbXNldCgmaW5mby0+cGVlcltpbmZvLT5tZV0sIDAsIHNpemVvZihpbmZvLT5wZWVyW2luZm8tPm1lXSkpOwogCi0JLyogRGVyZWdpc3RlciBzZyBsaXN0cy4gKi8KKwkvKiBVbnJlZ2lzdGVyIG91ciBhcnJheSBvZiByZWNlaXZlIGJ1ZmZlcnMgKi8KIAlsZ3Vlc3RfdW5iaW5kX2RtYShwZWVyX2tleShpbmZvLCBpbmZvLT5tZSksIGluZm8tPmRtYSk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5mby0+ZG1hKTsgaSsrKQogCQlkZXZfa2ZyZWVfc2tiKGluZm8tPnNrYltpXSk7CiAJcmV0dXJuIDA7CiB9CiAKKy8qRDo1MTAgVGhlIG5ldHdvcmsgZGV2aWNlIHByb2JlIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBhIHN0YW5kYXJkIGV0aGVybmV0CisgKiBkZXZpY2Ugc2V0dXAuICBJdCByZWFkcyB0aGUgInN0cnVjdCBsZ3Vlc3RfZGV2aWNlX2Rlc2MiIGFuZCBzZXRzIHRoZSAic3RydWN0CisgKiBuZXRfZGV2aWNlIi4gIE9oLCB0aGUgbGluZS1ieS1saW5lIGV4Y2l0ZW1lbnQhICBMZXQncyBza2lwIG92ZXIgaXQuIDoqLwogc3RhdGljIGludCBsZ3Vlc3RuZXRfcHJvYmUoc3RydWN0IGxndWVzdF9kZXZpY2UgKmxnZGV2KQogewogCWludCBlcnIsIGlycWYgPSBJUlFGX1NIQVJFRDsKQEAgLTI5MCwxMCArNDc2LDE2IEBACiAJZGV2LT5zdG9wID0gbGd1ZXN0bmV0X2Nsb3NlOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbGd1ZXN0bmV0X3N0YXJ0X3htaXQ7CiAKLQkvKiBUdXJuaW5nIG9uL29mZiBwcm9taXNjIHdpbGwgY2FsbCBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdC4KLQkgKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IG11bHRpY2FzdCB5ZXQgKi8KKwkvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IG11bHRpY2FzdCB5ZXQsIGJ1dCB0dXJuaW5nIG9uL29mZgorCSAqIHByb21pc2MgYWxzbyBjYWxscyBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdC4gKi8KIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGxndWVzdG5ldF9zZXRfbXVsdGljYXN0OwogCVNFVF9ORVRERVZfREVWKGRldiwgJmxnZGV2LT5kZXYpOworCisJLyogVGhlIG5ldHdvcmsgY29kZSBjb21wbGFpbnMgaWYgeW91IGhhdmUgInNjYXR0ZXItZ2F0aGVyIiBjYXBhYmlsaXR5CisJICogaWYgeW91IGRvbid0IGFsc28gaGFuZGxlIGNoZWNrc3VtcyAoaXQgc2VlbSB0aGF0IHdvdWxkIGJlCisJICogImlsbG9naWNhbCIpLiAgU28gd2UgdXNlIGEgbGllIG9mIG9taXNzaW9uIGFuZCBkb24ndCB0ZWxsIGl0IHRoYXQgd2UKKwkgKiBjYW4gaGFuZGxlIHNjYXR0ZXJlZCBwYWNrZXRzIHVubGVzcyB3ZSBhbHNvIGRvbid0IHdhbnQgY2hlY2tzdW1zLAorCSAqIGV2ZW4gdGhvdWdoIHRvIHVzIHRoZXkncmUgY29tcGxldGVseSBpbmRlcGVuZGVudC4gKi8KIAlpZiAoZGVzYy0+ZmVhdHVyZXMgJiBMR1VFU1RfTkVUX0ZfTk9DU1VNKQogCQlkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TR3xORVRJRl9GX05PX0NTVU07CiAKQEAgLTMyNSw2ICs1MTcsOSBAQAogCX0KIAogCXByX2RlYnVnKCJsZ3Vlc3RuZXQ6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCS8qIEZpbmFsbHksIHdlIHB1dCB0aGUgInN0cnVjdCBuZXRfZGV2aWNlIiBpbiB0aGUgZ2VuZXJpYyAic3RydWN0CisJICogbGd1ZXN0X2RldmljZSJzIHByaXZhdGUgcG9pbnRlci4gIEFnYWluLCBpdCdzIG5vdCBuZWNlc3NhcnksIGJ1dAorCSAqIG1ha2VzIHN1cmUgdGhlIGNvb2wga2VybmVsIGtpZHMgZG9uJ3QgdGVhc2UgdXMuICovCiAJbGdkZXYtPnByaXZhdGUgPSBkZXY7CiAJcmV0dXJuIDA7CiAKQEAgLTM1MiwzICs1NDcsMTEgQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJMZ3Vlc3QgbmV0d29yayBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLypEOjU4MAorICogVGhpcyBpcyB0aGUgbGFzdCBvZiB0aGUgRHJpdmVycywgYW5kIHdpdGggdGhpcyB3ZSBoYXZlIGNvdmVyZWQgdGhlIG1hbnkgYW5kCisgKiB3b25kZXJvdXMgYW5kIGZpbmUgKGFuZCBib3JpbmcpIGRldGFpbHMgb2YgdGhlIEd1ZXN0LgorICoKKyAqICJtYWtlIExhdW5jaGVyIiBiZWNrb25zLCB3aGVyZSB3ZSBhbnN3ZXIgcXVlc3Rpb25zIGxpa2UgIldoZXJlIGRvIEd1ZXN0cworICogY29tZSBmcm9tPyIsIGFuZCAiV2hhdCBkbyB5b3UgZG8gd2hlbiBzb21lb25lIGFza3MgZm9yIG9wdGltaXphdGlvbj8iCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwppbmRleCA1Yzg2ZTczLi5jNDI5YTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9saWI4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC0xNDMsNiArMTQzLDUyIEBACiAgKglhbm5veWluZyB0aGUgdHJhbnNtaXQgZnVuY3Rpb24gaXMgY2FsbGVkIGJoIGF0b21pYy4gVGhhdCBwbGFjZXMKICAqCXJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlciBjb250ZXh0IGNhbGxlcnMgYXMgZGlzYWJsZV9pcnEgd29uJ3Qgc2F2ZQogICoJdGhlbS4KKyAqCisgKglBZGRpdGlvbmFsIGV4cGxhbmF0aW9uIG9mIHByb2JsZW1zIHdpdGggbG9ja2luZyBieSBBbGFuIENveDoKKyAqCisgKgkiVGhlIGF1dGhvciAobWUpIGRpZG4ndCB1c2Ugc3Bpbl9sb2NrX2lycXNhdmUgYmVjYXVzZSB0aGUgc2xvd25lc3Mgb2YgdGhlCisgKgljYXJkIG1lYW5zIHRoYXQgYXBwcm9hY2ggY2F1c2VkIGhvcnJpYmxlIHByb2JsZW1zIGxpa2UgbG9zaW5nIHNlcmlhbCBkYXRhCisgKglhdCAzODQwMCBiYXVkIG9uIHNvbWUgY2hpcHMuIFJlbWVtZWJlciBtYW55IDgzOTAgbmljcyBvbiBQQ0kgd2VyZSBJU0EKKyAqCWNoaXBzIHdpdGggRlBHQSBmcm9udCBlbmRzLgorICoJCisgKglPayB0aGUgbG9naWMgYmVoaW5kIHRoZSA4MzkwIGlzIHZlcnkgc2ltcGxlOgorICoJCisgKglUaGluZ3MgdG8ga25vdworICoJCS0gSVJRIGRlbGl2ZXJ5IGlzIGFzeW5jaHJvbm91cyB0byB0aGUgUENJIGJ1cworICoJCS0gQmxvY2tpbmcgdGhlIGxvY2FsIENQVSBJUlEgdmlhIHNwaW4gbG9ja3Mgd2FzIHRvbyBzbG93CisgKgkJLSBUaGUgY2hpcCBoYXMgcmVnaXN0ZXIgd2luZG93cyBuZWVkaW5nIGxvY2tpbmcgd29yaworICoJCisgKglTbyB0aGUgcGF0aCB3YXMgb25jZSAoSSBzYXkgb25jZSBhcyBwZW9wbGUgYXBwZWFyIHRvIGhhdmUgY2hhbmdlZCBpdAorICoJaW4gdGhlIG1lYW4gdGltZSBhbmQgaXQgbm93IGxvb2tzIHJhdGhlciBib2d1cyBpZiB0aGUgY2hhbmdlcyB0byB1c2UKKyAqCWRpc2FibGVfaXJxX25vc3luY19pcnFzYXZlIGFyZSBkaXNhYmxpbmcgdGhlIGxvY2FsIElSUSkKKyAqCQorICoJCisgKgkJVGFrZSB0aGUgcGFnZSBsb2NrCisgKgkJTWFzayB0aGUgSVJRIG9uIGNoaXAKKyAqCQlEaXNhYmxlIHRoZSBJUlEgKGJ1dCBub3QgbWFzayBsb2NhbGx5LSBzb21lb25lIHNlZW1zIHRvIGhhdmUKKyAqCQkJYnJva2VuIHRoaXMgd2l0aCB0aGUgbG9jayB2YWxpZGF0b3Igc3R1ZmYpCisgKgkJCVtUaGlzIG11c3QgYmUgX25vc3luYyBhcyB0aGUgcGFnZSBsb2NrIG1heSBvdGhlcndpc2UKKyAqCQkJCWRlYWRsb2NrIHVzXQorICoJCURyb3AgdGhlIHBhZ2UgbG9jayBhbmQgdHVybiBJUlFzIGJhY2sgb24KKyAqCQkKKyAqCQlBdCB0aGlzIHBvaW50IGFuIGV4aXN0aW5nIElSUSBtYXkgc3RpbGwgYmUgcnVubmluZyBidXQgd2UgY2FuJ3QKKyAqCQlnZXQgYSBuZXcgb25lCisgKgkKKyAqCQlUYWtlIHRoZSBsb2NrIChzbyB3ZSBrbm93IHRoZSBJUlEgaGFzIHRlcm1pbmF0ZWQpIGJ1dCBkb24ndCBtYXNrCisgKgl0aGUgSVJRcyBvbiB0aGUgcHJvY2Vzc29yCisgKgkJU2V0IGlycWxvY2sgW2ZvciBkZWJ1Z10KKyAqCQorICoJCVRyYW5zbWl0IChzbG93IGFzICoqKiopCisgKgkKKyAqCQlyZS1lbmFibGUgdGhlIElSUQorICoJCisgKgkKKyAqCVdlIGhhdmUgdG8gdXNlIGRpc2FibGVfaXJxIGJlY2F1c2Ugb3RoZXJ3aXNlIHlvdSB3aWxsIGdldCBkZWxheWVkCisgKglpbnRlcnJ1cHRzIG9uIHRoZSBBUElDIGJ1cyBkZWFkbG9ja2luZyB0aGUgdHJhbnNtaXQgcGF0aC4KKyAqCQorICoJUXVpdGUgaGFpcnkgYnV0IHRoZSBjaGlwIHNpbXBseSB3YXNuJ3QgZGVzaWduZWQgZm9yIFNNUCBhbmQgeW91IGNhbid0CisgKglldmVuIEFDSyBhbiBpbnRlcnJ1cHQgd2l0aG91dCByaXNraW5nIGNvcnJ1cHRpbmcgb3RoZXIgcGFyYWxsZWwKKyAqCWFjdGl2aXRpZXMgb24gdGhlIGNoaXAuIiBbbGttbCwgMjUgSnVsIDIwMDddCiAgKi8KIAogCkBAIC0yMTksMTUgKzI2NSw2IEBACiAJaW50IHR4c3IsIGlzciwgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NMzJSKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JdW5zaWduZWQgbG9uZyBpY3VjcjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpY3VjciA9IGlubChNMzJSX0lDVV9DUjFfUE9SVEwpOwotCWljdWNyIHw9IE0zMlJfSUNVQ1JfSVNNT0QxMTsKLQlvdXRsKGljdWNyLCBNMzJSX0lDVV9DUjFfUE9SVEwpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLSNlbmRpZgogCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbXIuYyBiL2RyaXZlcnMvbmV0L21seDQvbXIuYwppbmRleCBkMDgwOGZhLi41Yjg3MTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21yLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tci5jCkBAIC0yNTUsMTAgKzI1NSw4IEBACiAJaW50IGVycjsKIAogCWluZGV4ID0gbWx4NF9iaXRtYXBfYWxsb2MoJnByaXYtPm1yX3RhYmxlLm1wdF9iaXRtYXApOwotCWlmIChpbmRleCA9PSAtMSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9CisJaWYgKGluZGV4ID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCW1yLT5pb3ZhICAgICAgID0gaW92YTsKIAltci0+c2l6ZSAgICAgICA9IHNpemU7CkBAIC0yNjksMTUgKzI2Nyw4IEBACiAKIAllcnIgPSBtbHg0X210dF9pbml0KGRldiwgbnBhZ2VzLCBwYWdlX3NoaWZ0LCAmbXItPm10dCk7CiAJaWYgKGVycikKLQkJZ290byBlcnJfaW5kZXg7CisJCW1seDRfYml0bWFwX2ZyZWUoJnByaXYtPm1yX3RhYmxlLm1wdF9iaXRtYXAsIGluZGV4KTsKIAotCXJldHVybiAwOwotCi1lcnJfaW5kZXg6Ci0JbWx4NF9iaXRtYXBfZnJlZSgmcHJpdi0+bXJfdGFibGUubXB0X2JpdG1hcCwgaW5kZXgpOwotCi1lcnI6Ci0Ja2ZyZWUobXIpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X21yX2FsbG9jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oCmluZGV4IDMyNTI2OWQuLmQ0YzkyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaApAQCAtMTE3OSw4ICsxMTc5LDcgQEAKIAkgICAgTkVUWEVOX0NBTV9SQU0oTkVUWEVOX0NBTV9SQU1fRE1BX1dBVENIRE9HX0NUUkwpLCAmY3RybCwgNCkpCiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlYWQgZG1hIHdhdGNoZG9nIHN0YXR1c1xuIik7CiAKLQlyZXR1cm4gKChuZXR4ZW5fZ2V0X2RtYV93YXRjaGRvZ19lbmFibGVkKGN0cmwpID09IDApICYmCi0JCShuZXR4ZW5fZ2V0X2RtYV93YXRjaGRvZ19kaXNhYmxlZChjdHJsKSA9PSAwKSk7CisJcmV0dXJuIChuZXR4ZW5fZ2V0X2RtYV93YXRjaGRvZ19lbmFibGVkKGN0cmwpID09IDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCmluZGV4IGI3MDNjY2YuLjA4YTYyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKE5FVFhFTl9OSUNfTElOVVhfVkVSU0lPTklEKTsKIAotY2hhciBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lW10gPSAibmV0eGVuLW5pYyI7CitjaGFyIG5ldHhlbl9uaWNfZHJpdmVyX25hbWVbXSA9ICJuZXR4ZW5fbmljIjsKIHN0YXRpYyBjaGFyIG5ldHhlbl9uaWNfZHJpdmVyX3N0cmluZ1tdID0gIk5ldFhlbiBOZXR3b3JrIERyaXZlciB2ZXJzaW9uICIKICAgICBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRDsKIApAQCAtMzM1LDcgKzMzNSw2IEBACiAJYWRhcHRlci0+YWh3LnBkZXYgPSBwZGV2OwogCWFkYXB0ZXItPmFody5wY2lfZnVuYyAgPSBwY2lfZnVuY19pZDsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOwogCiAJLyogcmVtYXAgcGh5cyBhZGRyZXNzICovCiAJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CS8qIDAgaXMgZm9yIEJBUiAwICovCkBAIC02NDAsNiArNjM5LDEwIEBACiAJCQlORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAogCQkJCU5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSkpOwogCQkvKiBIYW5kc2hha2Ugd2l0aCB0aGUgY2FyZCBiZWZvcmUgd2UgcmVnaXN0ZXIgdGhlIGRldmljZXMuICovCisJCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSk7CisJCW5ldHhlbl9waW5pdF9mcm9tX3JvbShhZGFwdGVyLCAwKTsKKwkJbXNsZWVwKDEpOworCQluZXR4ZW5fbG9hZF9maXJtd2FyZShhZGFwdGVyKTsKIAkJbmV0eGVuX3BoYW50b21faW5pdChhZGFwdGVyLCBORVRYRU5fTklDX1BFR19UVU5FKTsKIAl9CiAKQEAgLTc4MiwxOSArNzg1LDE4IEBACiAKIAlpZiAoYWRhcHRlci0+cG9ydG51bSA9PSAwKSB7CiAJCWlmIChpbml0X2Zpcm13YXJlX2RvbmUpIHsKLQkJCWRtYV93YXRjaGRvZ19zaHV0ZG93bl9yZXF1ZXN0KGFkYXB0ZXIpOwotCQkJbXNsZWVwKDEwMCk7CiAJCQlpID0gMTAwOwotCQkJd2hpbGUgKChkbWFfd2F0Y2hkb2dfc2h1dGRvd25fcG9sbF9yZXN1bHQoYWRhcHRlcikgIT0gMSkgJiYgaSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gImRtYV93YXRjaGRvZ19zaHV0ZG93bl9wb2xsIHN0aWxsIGluIHByb2dyZXNzXG4iKTsKKwkJCWRvIHsKKwkJCQlpZiAoZG1hX3dhdGNoZG9nX3NodXRkb3duX3JlcXVlc3QoYWRhcHRlcikgPT0gMSkKKwkJCQkJYnJlYWs7CiAJCQkJbXNsZWVwKDEwMCk7Ci0JCQkJaS0tOwotCQkJfQorCQkJCWlmIChkbWFfd2F0Y2hkb2dfc2h1dGRvd25fcG9sbF9yZXN1bHQoYWRhcHRlcikgPT0gMSkKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlICgtLWkpOwogCi0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJkbWFfd2F0Y2hkb2dfc2h1dGRvd25fcmVxdWVzdCBmYWlsZWRcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KKwkJCWlmIChpID09IDApCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZG1hX3dhdGNoZG9nX3NodXRkb3duIGZhaWxlZFxuIiwKKwkJCQkJCW5ldGRldi0+bmFtZSk7CiAKIAkJCS8qIGNsZWFyIHRoZSByZWdpc3RlciBmb3IgZnV0dXJlIHVubG9hZHMvbG9hZHMgKi8KIAkJCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fQ0FNX1JBTSgweDFmYykpKTsKQEAgLTgwMywxMSArODA1LDkgQEAKIAogCQkJLyogbGVhdmUgdGhlIGh3IGluIHRoZSBzYW1lIHN0YXRlIGFzIHJlYm9vdCAqLwogCQkJd3JpdGVsKDAsIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURQRUdfU1RBVEUpKTsKLQkJCWlmIChuZXR4ZW5fcGluaXRfZnJvbV9yb20oYWRhcHRlciwgMCkpCi0JCQkJcmV0dXJuOworCQkJbmV0eGVuX3Bpbml0X2Zyb21fcm9tKGFkYXB0ZXIsIDApOwogCQkJbXNsZWVwKDEpOwotCQkJaWYgKG5ldHhlbl9sb2FkX2Zpcm13YXJlKGFkYXB0ZXIpKQotCQkJCXJldHVybjsKKwkJCW5ldHhlbl9sb2FkX2Zpcm13YXJlKGFkYXB0ZXIpOwogCQkJbmV0eGVuX3BoYW50b21faW5pdChhZGFwdGVyLCBORVRYRU5fTklDX1BFR19UVU5FKTsKIAkJfQogCkBAIC04MTYsMjIgKzgxNiwyMSBAQAogCQlwcmludGsoS0VSTl9JTkZPICJTdGF0ZTogMHglMHhcbiIsCiAJCQlyZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSkpOwogCi0JCWRtYV93YXRjaGRvZ19zaHV0ZG93bl9yZXF1ZXN0KGFkYXB0ZXIpOwotCQltc2xlZXAoMTAwKTsKIAkJaSA9IDEwMDsKLQkJd2hpbGUgKChkbWFfd2F0Y2hkb2dfc2h1dGRvd25fcG9sbF9yZXN1bHQoYWRhcHRlcikgIT0gMSkgJiYgaSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZG1hX3dhdGNoZG9nX3NodXRkb3duX3BvbGwgc3RpbGwgaW4gcHJvZ3Jlc3NcbiIpOworCQlkbyB7CisJCQlpZiAoZG1hX3dhdGNoZG9nX3NodXRkb3duX3JlcXVlc3QoYWRhcHRlcikgPT0gMSkKKwkJCQlicmVhazsKIAkJCW1zbGVlcCgxMDApOwotCQkJaS0tOwotCQl9CisJCQlpZiAoZG1hX3dhdGNoZG9nX3NodXRkb3duX3BvbGxfcmVzdWx0KGFkYXB0ZXIpID09IDEpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0taSk7CiAKIAkJaWYgKGkpIHsKIAkJCW5ldHhlbl9mcmVlX2FkYXB0ZXJfb2ZmbG9hZChhZGFwdGVyKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGRtYSBzaHV0ZG93blxuIik7Ci0JCQlyZXR1cm47CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkbWFfd2F0Y2hkb2dfc2h1dGRvd24gZmFpbGVkXG4iLAorCQkJCQluZXRkZXYtPm5hbWUpOwogCQl9Ci0KIAl9CiAKIAlpb3VubWFwKGFkYXB0ZXItPmFody5kYl9iYXNlKTsKQEAgLTg5NSw4ICs4OTQsNiBAQAogCiAJLyogRG9uZSBoZXJlIGFnYWluIHNvIHRoYXQgZXZlbiBpZiBwaGFudG9tIHN3IG92ZXJ3cm90ZSBpdCwKIAkgKiB3ZSBzZXQgaXQgKi8KLQlpZiAoYWRhcHRlci0+bWFjYWRkcl9zZXQpCi0JCWFkYXB0ZXItPm1hY2FkZHJfc2V0KGFkYXB0ZXIsIG5ldGRldi0+ZGV2X2FkZHIpOwogCWlmIChhZGFwdGVyLT5pbml0X3BvcnQKIAkgICAgJiYgYWRhcHRlci0+aW5pdF9wb3J0KGFkYXB0ZXIsIGFkYXB0ZXItPnBvcnRudW0pICE9IDApIHsKIAkgICAgZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKQEAgLTkwNCw2ICs5MDEsOCBAQAogCQkJCW5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGFkYXB0ZXItPnBvcnRudW0pOwogCQlyZXR1cm4gLUVJTzsKIAl9CisJaWYgKGFkYXB0ZXItPm1hY2FkZHJfc2V0KQorCQlhZGFwdGVyLT5tYWNhZGRyX3NldChhZGFwdGVyLCBuZXRkZXYtPmRldl9hZGRyKTsKIAogCW5ldHhlbl9uaWNfc2V0X2xpbmtfcGFyYW1ldGVycyhhZGFwdGVyKTsKIApAQCAtOTMwLDYgKzkyOSw4IEBACiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAKKwluZXR4ZW5fbmljX2Rpc2FibGVfaW50KGFkYXB0ZXIpOworCiAJY21kX2J1ZmYgPSBhZGFwdGVyLT5jbWRfYnVmX2FycjsKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQ7IGkrKykgewogCQlidWZmcmFnID0gY21kX2J1ZmYtPmZyYWdfYXJyYXk7CkBAIC0xMjI2LDE1ICsxMjI3LDEyIEBACiB7CiAJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gCiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIsIHR4X3RpbWVvdXRfdGFzayk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXByaW50ayhLRVJOX0VSUiAiJXMgJXM6IHRyYW5zbWl0IHRpbWVvdXQsIHJlc2V0dGluZy5cbiIsCiAJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwogCW5ldHhlbl9uaWNfY2xvc2UoYWRhcHRlci0+bmV0ZGV2KTsKIAluZXR4ZW5fbmljX29wZW4oYWRhcHRlci0+bmV0ZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiAJYWRhcHRlci0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogfQpAQCAtMTI0MywyOCArMTI0MSwxMiBAQAogbmV0eGVuX2hhbmRsZV9pbnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXUzMiByZXQgPSAwOwotCXUzMiBvdXJfaW50ID0gMDsKIAogCURQUklOVEsoSU5GTywgIkVudGVyZWQgaGFuZGxlIElTUlxuIik7CiAJYWRhcHRlci0+c3RhdHMuaW50cysrOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKSkgewotCQlvdXJfaW50ID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0lOVF9WRUNUT1IpKTsKLQkJLyogbm90IG91ciBpbnRlcnJ1cHQgKi8KLQkJaWYgKChvdXJfaW50ICYgKDB4ODAgPDwgYWRhcHRlci0+cG9ydG51bSkpID09IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCW5ldHhlbl9uaWNfZGlzYWJsZV9pbnQoYWRhcHRlcik7CiAKLQlpZiAoYWRhcHRlci0+aW50cl9zY2hlbWUgPT0gSU5UUl9TQ0hFTUVfUEVSUE9SVCkgewotCQkvKiBjbGFpbSBpbnRlcnJ1cHQgKi8KLQkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKSkgewotCQkJd3JpdGVsKG91cl9pbnQgJiB+KCh1MzIpKDB4ODAgPDwgYWRhcHRlci0+cG9ydG51bSkpLAotCQkJTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0lOVF9WRUNUT1IpKTsKLQkJfQotCX0KLQogCWlmIChuZXR4ZW5fbmljX3J4X2hhc193b3JrKGFkYXB0ZXIpIHx8IG5ldHhlbl9uaWNfdHhfaGFzX3dvcmsoYWRhcHRlcikpIHsKIAkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkgewogCQkJLyoKQEAgLTEyOTgsNiArMTI4MCw3IEBACiB7CiAJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJdTMyIG91cl9pbnQgPSAwOwogCiAJaWYgKHVubGlrZWx5KCFpcnEpKSB7CiAJCXJldHVybiBJUlFfTk9ORTsJLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KQEAgLTEzMDUsNyArMTI4OCwyMiBAQAogCiAJYWRhcHRlciA9IChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKilkYXRhOwogCW5ldGRldiAgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JLyogcHJvY2VzcyBvdXIgc3RhdHVzIHF1ZXVlIChmb3IgYWxsIDQgcG9ydHMpICovCisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQpKSB7CisJCW91cl9pbnQgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfSU5UX1ZFQ1RPUikpOworCQkvKiBub3Qgb3VyIGludGVycnVwdCAqLworCQlpZiAoKG91cl9pbnQgJiAoMHg4MCA8PCBhZGFwdGVyLT5wb3J0bnVtKSkgPT0gMCkKKwkJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoYWRhcHRlci0+aW50cl9zY2hlbWUgPT0gSU5UUl9TQ0hFTUVfUEVSUE9SVCkgeworCQkvKiBjbGFpbSBpbnRlcnJ1cHQgKi8KKwkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKSkgeworCQkJd3JpdGVsKG91cl9pbnQgJiB+KCh1MzIpKDB4ODAgPDwgYWRhcHRlci0+cG9ydG51bSkpLAorCQkJTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0lOVF9WRUNUT1IpKTsKKwkJfQorCX0KKwogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCW5ldHhlbl9oYW5kbGVfaW50KGFkYXB0ZXIsIG5ldGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwppbmRleCA3M2RhNjExLi45OTdjMmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCkBAIC05OTYsNyArOTk2LDcgQEAKIHsKICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CiAgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICBraW9fYWRkcl90IGlvYWRkcjsKICAgaW50IHN0YXR1czsKICAgaW50IEludHJDbnQgPSBNQUNFX01BWF9JUl9JVEVSQVRJT05TOwogCkBAIC0xMDA2LDYgKzEwMDYsOCBAQAogICAgIHJldHVybiBJUlFfTk9ORTsKICAgfQogCisgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCiAgIGlmIChscC0+dHhfaXJxX2Rpc2FibGVkKSB7CiAgICAgcHJpbnRrKAogICAgICAgKGxwLT50eF9pcnFfZGlzYWJsZWQ/CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCmluZGV4IDc5MTJkYmQuLmFmNjcyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC0xMzY4LDYgKzEzNjgsNyBAQAogICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAgICAgdV9zaG9ydCBudW1fcGFnZXM7CiAgICAgc2hvcnQgdGltZV9vdXQsIGlyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKQEAgLTEzOTUsNiArMTM5Niw3IEBACiAgICAgLyogQSBwYWNrZXQgaXMgbm93IHdhaXRpbmcuICovCiAgICAgc21jLT5wYWNrZXRzX3dhaXRpbmcrKzsKIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzbWMtPmxvY2ssIGZsYWdzKTsKICAgICBTTUNfU0VMRUNUX0JBTksoMik7CS8qIFBhcmFub2lhLCB3ZSBzaG91bGQgYWx3YXlzIGJlIGluIHdpbmRvdyAyICovCiAKICAgICAvKiBuZWVkIE1DX1JFU0VUIHRvIGtlZXAgdGhlIG1lbW9yeSBjb25zaXN0ZW50LiBlcnJhdGE/ICovCkBAIC0xNDExLDYgKzE0MTMsNyBAQAogCSAgICAvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0LCBzZW5kIHRoZSBwYWNrZXQuICovCiAJICAgIG91dHcoKGlyJjB4ZmYwMCkgfCBJTV9BTExPQ19JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CiAJICAgIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldChkZXYpOwkvKiBTZW5kIHRoZSBwYWNrZXQgbm93Li4gKi8KKwkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21jLT5sb2NrLCBmbGFncyk7CiAJICAgIHJldHVybiAwOwogCX0KICAgICB9CkBAIC0xNDE4LDYgKzE0MjEsNyBAQAogICAgIC8qIE90aGVyd2lzZSBkZWZlciB1bnRpbCB0aGUgVHgtc3BhY2UtYWxsb2NhdGVkIGludGVycnVwdC4gKi8KICAgICBERUJVRygyLCAiJXM6IG1lbW9yeSBhbGxvY2F0aW9uIGRlZmVycmVkLlxuIiwgZGV2LT5uYW1lKTsKICAgICBvdXR3KChJTV9BTExPQ19JTlQgPDwgOCkgfCAoaXIgJiAweGZmMDApLCBpb2FkZHIgKyBJTlRFUlJVUFQpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtYy0+bG9jaywgZmxhZ3MpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNTIzLDYgKzE1MjcsNyBAQAogICAgIERFQlVHKDMsICIlczogU01DOTFjOTIgaW50ZXJydXB0ICVkIGF0ICUjeC5cbiIsIGRldi0+bmFtZSwKIAkgIGlycSwgaW9hZGRyKTsKIAorICAgIHNwaW5fbG9jaygmc21jLT5sb2NrKTsKICAgICBzbWMtPndhdGNoZG9nID0gMDsKICAgICBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKICAgICBpZiAoKHNhdmVkX2JhbmsgJiAweGZmMDApICE9IDB4MzMwMCkgewpAQCAtMTYyMCw2ICsxNjI1LDcgQEAKIAlyZWFkYihzbWMtPmJhc2UrTUVHQUhFUlRaX0lTUik7CiAgICAgfQogI2VuZGlmCisgICAgc3Bpbl91bmxvY2soJnNtYy0+bG9jayk7CiAgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CiAKQEAgLTE5MDIsNiArMTkwOCw5IEBACiAgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKICAgICB1X3Nob3J0IGksIG1lZGlhLCBzYXZlZF9iYW5rOwogICAgIHVfc2hvcnQgbGluazsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNtYy0+bG9jaywgZmxhZ3MpOwogCiAgICAgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CiAKQEAgLTE5MzQsNiArMTk0Myw3IEBACiAJc21jLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKIAlhZGRfdGltZXIoJnNtYy0+bWVkaWEpOwogCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWMtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm47CiAgICAgfQogCkBAIC0yMDA3LDYgKzIwMTcsNyBAQAogICAgIHNtYy0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKICAgICBhZGRfdGltZXIoJnNtYy0+bWVkaWEpOwogICAgIFNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWMtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzbWNfbGlua19vayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjA5NCwxNCArMjEwNSwxNCBAQAogCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKIAlpbnQgcmV0OwogCi0JU01DX1NFTEVDVF9CQU5LKDMpOwogCXNwaW5fbG9ja19pcnEoJnNtYy0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKDMpOwogCWlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKQogCQlyZXQgPSBtaWlfZXRodG9vbF9nc2V0KCZzbWMtPm1paV9pZiwgZWNtZCk7CiAJZWxzZQogCQlyZXQgPSBzbWNfbmV0ZGV2X2dldF9lY21kKGRldiwgZWNtZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOwogCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjExMiwxNCArMjEyMywxNCBAQAogCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKIAlpbnQgcmV0OwogCi0JU01DX1NFTEVDVF9CQU5LKDMpOwogCXNwaW5fbG9ja19pcnEoJnNtYy0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKDMpOwogCWlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKQogCQlyZXQgPSBtaWlfZXRodG9vbF9zc2V0KCZzbWMtPm1paV9pZiwgZWNtZCk7CiAJZWxzZQogCQlyZXQgPSBzbWNfbmV0ZGV2X3NldF9lY21kKGRldiwgZWNtZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOwogCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjEzMCwxMSArMjE0MSwxMSBAQAogCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKIAl1MzIgcmV0OwogCi0JU01DX1NFTEVDVF9CQU5LKDMpOwogCXNwaW5fbG9ja19pcnEoJnNtYy0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKDMpOwogCXJldCA9IHNtY19saW5rX29rKGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOwogCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3ZpdGVzc2UuYyBiL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMKaW5kZXggNmE1Mzg1Ni4uODg3NDQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3ZpdGVzc2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvdml0ZXNzZS5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJICovCiAJCWVyciA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX1ZTQzgyNDRfSVNUQVQpOwogCi0JCWlmIChlcnIpCisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAogCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfVlNDODI0NF9JTUFTSywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBvbDJ0cC5jIGIvZHJpdmVycy9uZXQvcHBwb2wydHAuYwppbmRleCBmODcxNzYwLi4yNjZlOGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBvbDJ0cC5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcG9sMnRwLmMKQEAgLTIwNTQsNyArMjA1NCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHBwb2wydHBfdHVubmVsX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgIHN0cnVjdCBwcHBvbDJ0cF90dW5uZWwgKnR1bm5lbCwKLQkJCQkgICAgICBpbnQgb3B0bmFtZSwgaW50IF9fdXNlciAqdmFsKQorCQkJCSAgICAgIGludCBvcHRuYW1lLCBpbnQgKnZhbCkKIHsKIAlpbnQgZXJyID0gMDsKIApAQCAtMjA3Nyw3ICsyMDc3LDcgQEAKICAqLwogc3RhdGljIGludCBwcHBvbDJ0cF9zZXNzaW9uX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgICBzdHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkgICAgICAgaW50IG9wdG5hbWUsIGludCBfX3VzZXIgKnZhbCkKKwkJCQkgICAgICAgaW50IG9wdG5hbWUsIGludCAqdmFsKQogewogCWludCBlcnIgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wczNfZ2VsaWNfbmV0LmMgYi9kcml2ZXJzL25ldC9wczNfZ2VsaWNfbmV0LmMKaW5kZXggMDhkMjUwNi4uMTNkMWMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuYwpAQCAtMjkwLDcgKzI5MCw4IEBACiAJCQlkZXNjci0+YnVmX2FkZHIgPSAwOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoZGVzY3ItPnNrYik7CiAJCQlkZXNjci0+c2tiID0gTlVMTDsKLQkJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBHRUxJQ19ORVRfREVTQ1JfTk9UX0lOX1VTRTsKKwkJCWdlbGljX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLAorCQkJCQkJICAgR0VMSUNfTkVUX0RFU0NSX05PVF9JTl9VU0UpOwogCQl9CiAJCWRlc2NyID0gZGVzY3ItPm5leHQ7CiAJfSB3aGlsZSAoZGVzY3IgIT0gY2FyZC0+cnhfY2hhaW4uaGVhZCk7CkBAIC0zNzQsNyArMzc1LDcgQEAKIAlkZXNjci0+c2tiID0gTlVMTDsKIAogCS8qIHNldCBkZXNjciBzdGF0dXMgKi8KLQlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gR0VMSUNfTkVUX0RNQUNfQ01EU1RBVF9OT1RfSU5fVVNFOworCWdlbGljX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLCBHRUxJQ19ORVRfREVTQ1JfTk9UX0lOX1VTRSk7CiB9CiAKIC8qKgpAQCAtNDAzLDI2ICs0MDQsMjkgQEAKIAkJCQkJICIlczogZm9yY2luZyBlbmQgb2YgdHggZGVzY3JpcHRvciAiIFwKIAkJCQkJICJ3aXRoIHN0YXR1cyAleFxuIiwKIAkJCQkJIF9fZnVuY19fLCBzdGF0dXMpOwotCQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCWNhcmQtPm5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBHRUxJQ19ORVRfREVTQ1JfQ09NUExFVEU6Ci0JCQljYXJkLT5uZXRkZXZfc3RhdHMudHhfcGFja2V0cysrOwotCQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2J5dGVzICs9Ci0JCQkJdHhfY2hhaW4tPnRhaWwtPnNrYi0+bGVuOworCQkJaWYgKHR4X2NoYWluLT50YWlsLT5za2IpIHsKKwkJCQljYXJkLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQljYXJkLT5uZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9CisJCQkJCXR4X2NoYWluLT50YWlsLT5za2ItPmxlbjsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgR0VMSUNfTkVUX0RFU0NSX0NBUkRPV05FRDoKIAkJCS8qIHBlbmRpbmcgdHggcmVxdWVzdCAqLwogCQlkZWZhdWx0OgogCQkJLyogYW55IG90aGVyIHZhbHVlICg9PSBHRUxJQ19ORVRfREVTQ1JfTk9UX0lOX1VTRSkgKi8KLQkJCWdvdG8gb3V0OworCQkJaWYgKCFzdG9wKQorCQkJCWdvdG8gb3V0OwogCQl9CiAJCWdlbGljX25ldF9yZWxlYXNlX3R4X2Rlc2NyKGNhcmQsIHR4X2NoYWluLT50YWlsKTsKLQkJcmVsZWFzZSA9IDE7CisJCXJlbGVhc2UgKys7CiAJfQogb3V0OgotCWlmICghc3RvcCAmJiByZWxlYXNlKQorCWlmICghc3RvcCAmJiAoMiA8IHJlbGVhc2UpKQogCQluZXRpZl93YWtlX3F1ZXVlKGNhcmQtPm5ldGRldik7CiB9CiAKQEAgLTY1OSwxOSArNjYzLDIxIEBACiB7CiAJZG1hX2FkZHJfdCBidWZbMl07CiAJdW5zaWduZWQgaW50IHZsYW5fbGVuOworCXN0cnVjdCBnZWxpY19uZXRfZGVzY3IgKnNlY19kZXNjciA9IGRlc2NyLT5uZXh0OwogCiAJaWYgKHNrYi0+bGVuIDwgR0VMSUNfTkVUX1ZMQU5fUE9TKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbWNweSgmZGVzY3ItPnZsYW4sIHNrYi0+ZGF0YSwgR0VMSUNfTkVUX1ZMQU5fUE9TKTsKKwl2bGFuX2xlbiA9IEdFTElDX05FVF9WTEFOX1BPUzsKKwltZW1jcHkoJmRlc2NyLT52bGFuLCBza2ItPmRhdGEsIHZsYW5fbGVuKTsKIAlpZiAoY2FyZC0+dmxhbl9pbmRleCAhPSAtMSkgeworCQkvKiBpbnRlcm5hbCB2bGFuIHRhZyB1c2VkICovCiAJCWRlc2NyLT52bGFuLmhfdmxhbl9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsgLyogdmxhbiAweDgxMDAqLwogCQlkZXNjci0+dmxhbi5oX3ZsYW5fVENJID0gaHRvbnMoY2FyZC0+dmxhbl9pZFtjYXJkLT52bGFuX2luZGV4XSk7Ci0JCXZsYW5fbGVuID0gR0VMSUNfTkVUX1ZMQU5fUE9TICsgVkxBTl9ITEVOOyAvKiBWTEFOX0hMRU49NCAqLwotCX0gZWxzZQotCQl2bGFuX2xlbiA9IEdFTElDX05FVF9WTEFOX1BPUzsgLyogbm8gdmxhbiB0YWcgKi8KKwkJdmxhbl9sZW4gKz0gVkxBTl9ITEVOOyAvKiBhZGRlZCBmb3IgYWJvdmUgdHdvIGxpbmVzICovCisJfQogCi0JLyogZmlyc3QgZGVzY3IgKi8KKwkvKiBtYXAgZGF0YSBhcmVhICovCiAJYnVmWzBdID0gZG1hX21hcF9zaW5nbGUoY3RvZGV2KGNhcmQpLCAmZGVzY3ItPnZsYW4sCiAJCQkgICAgIHZsYW5fbGVuLCBETUFfVE9fREVWSUNFKTsKIApAQCAtNjgyLDIwICs2ODgsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkZXNjci0+YnVmX2FkZHIgPSBidWZbMF07Ci0JZGVzY3ItPmJ1Zl9zaXplID0gdmxhbl9sZW47Ci0JZGVzY3ItPnNrYiA9IHNrYjsgLyogbm90IHVzZWQgKi8KLQlkZXNjci0+ZGF0YV9zdGF0dXMgPSAwOwotCWdlbGljX25ldF9zZXRfdHhkZXNjcl9jbWRzdGF0KGRlc2NyLCBza2IsIDEpOyAvKiBub3QgdGhlIGZyYW1lIGVuZCAqLwotCi0JLyogc2Vjb25kIGRlc2NyICovCi0JY2FyZC0+dHhfY2hhaW4uaGVhZCA9IGNhcmQtPnR4X2NoYWluLmhlYWQtPm5leHQ7Ci0JZGVzY3ItPm5leHRfZGVzY3JfYWRkciA9IGRlc2NyLT5uZXh0LT5idXNfYWRkcjsKLQlkZXNjciA9IGRlc2NyLT5uZXh0OwotCWlmIChnZWxpY19uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjcikgIT0gR0VMSUNfTkVUX0RFU0NSX05PVF9JTl9VU0UpCi0JCS8qIFhYWCB3aWxsIGJlIHJlbW92ZWQgKi8KLQkJZGV2X2VycihjdG9kZXYoY2FyZCksICJkZXNjciBpcyBub3QgZnJlZSFcbiIpOwotCiAJYnVmWzFdID0gZG1hX21hcF9zaW5nbGUoY3RvZGV2KGNhcmQpLCBza2ItPmRhdGEgKyBHRUxJQ19ORVRfVkxBTl9QT1MsCiAJCQkgICAgIHNrYi0+bGVuIC0gR0VMSUNfTkVUX1ZMQU5fUE9TLAogCQkJICAgICBETUFfVE9fREVWSUNFKTsKQEAgLTcxMCwxMyArNzAyLDI0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWRlc2NyLT5idWZfYWRkciA9IGJ1ZlsxXTsKLQlkZXNjci0+YnVmX3NpemUgPSBza2ItPmxlbiAtIEdFTElDX05FVF9WTEFOX1BPUzsKLQlkZXNjci0+c2tiID0gc2tiOworCS8qIGZpcnN0IGRlc2NyICovCisJZGVzY3ItPmJ1Zl9hZGRyID0gYnVmWzBdOworCWRlc2NyLT5idWZfc2l6ZSA9IHZsYW5fbGVuOworCWRlc2NyLT5za2IgPSBOVUxMOyAvKiBub3QgdXNlZCAqLwogCWRlc2NyLT5kYXRhX3N0YXR1cyA9IDA7Ci0JZGVzY3ItPm5leHRfZGVzY3JfYWRkciA9IDA7IC8qIHRlcm1pbmF0ZSBodyBkZXNjciAqLwotCWdlbGljX25ldF9zZXRfdHhkZXNjcl9jbWRzdGF0KGRlc2NyLCBza2IsIDApOworCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSBkZXNjci0+bmV4dC0+YnVzX2FkZHI7CisJZ2VsaWNfbmV0X3NldF90eGRlc2NyX2NtZHN0YXQoZGVzY3IsIHNrYiwgMSk7IC8qIG5vdCB0aGUgZnJhbWUgZW5kICovCiAKKwkvKiBzZWNvbmQgZGVzY3IgKi8KKwlzZWNfZGVzY3ItPmJ1Zl9hZGRyID0gYnVmWzFdOworCXNlY19kZXNjci0+YnVmX3NpemUgPSBza2ItPmxlbiAtIEdFTElDX05FVF9WTEFOX1BPUzsKKwlzZWNfZGVzY3ItPnNrYiA9IHNrYjsKKwlzZWNfZGVzY3ItPmRhdGFfc3RhdHVzID0gMDsKKwlzZWNfZGVzY3ItPm5leHRfZGVzY3JfYWRkciA9IDA7IC8qIHRlcm1pbmF0ZSBodyBkZXNjciAqLworCWdlbGljX25ldF9zZXRfdHhkZXNjcl9jbWRzdGF0KHNlY19kZXNjciwgc2tiLCAwKTsKKworCS8qIGJ1bXAgZnJlZSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwljYXJkLT50eF9jaGFpbi5oZWFkID0gc2VjX2Rlc2NyLT5uZXh0OwogCXJldHVybiAwOwogfQogCkBAIC03MjksNyArNzMyLDcgQEAKIHN0YXRpYyBpbnQgZ2VsaWNfbmV0X2tpY2tfdHhkbWEoc3RydWN0IGdlbGljX25ldF9jYXJkICpjYXJkLAogCQkJCXN0cnVjdCBnZWxpY19uZXRfZGVzY3IgKmRlc2NyKQogewotCWludCBzdGF0dXMgPSAtRU5YSU87CisJaW50IHN0YXR1cyA9IDA7CiAJaW50IGNvdW50ID0gMTA7CiAKIAlpZiAoY2FyZC0+dHhfZG1hX3Byb2dyZXNzKQpAQCAtNzYzLDQ3ICs3NjYsNjIgQEAKIHN0YXRpYyBpbnQgZ2VsaWNfbmV0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgZ2VsaWNfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBnZWxpY19uZXRfZGVzY3IgKmRlc2NyID0gTlVMTDsKKwlzdHJ1Y3QgZ2VsaWNfbmV0X2Rlc2NyICpkZXNjcjsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dHhfZG1hX2xvY2ssIGZsYWdzKTsKIAogCWdlbGljX25ldF9yZWxlYXNlX3R4X2NoYWluKGNhcmQsIDApOwotCWlmICghc2tiKQotCQlnb3RvIGtpY2s7CisKIAlkZXNjciA9IGdlbGljX25ldF9nZXRfbmV4dF90eF9kZXNjcihjYXJkKTsKIAlpZiAoIWRlc2NyKSB7CisJCS8qCisJCSAqIG5vIG1vcmUgZGVzY3JpcHRvcnMgZnJlZQorCQkgKi8KIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50eF9kbWFfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQorCiAJcmVzdWx0ID0gZ2VsaWNfbmV0X3ByZXBhcmVfdHhfZGVzY3JfdihjYXJkLCBkZXNjciwgc2tiKTsKLQotCWlmIChyZXN1bHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQljYXJkLT50eF9jaGFpbi5oZWFkID0gY2FyZC0+dHhfY2hhaW4uaGVhZC0+bmV4dDsKLQotCWlmIChkZXNjci0+cHJldikKLQkJZGVzY3ItPnByZXYtPm5leHRfZGVzY3JfYWRkciA9IGRlc2NyLT5idXNfYWRkcjsKLWtpY2s6CisJaWYgKHJlc3VsdCkgeworCQkvKgorCQkgKiBETUEgbWFwIGZhaWxlZC4gIEFzIGNoYW5zZXMgYXJlIHRoYXQgZmFpbHVyZQorCQkgKiB3b3VsZCBjb250aW51ZSwganVzdCByZWxlYXNlIHNrYiBhbmQgcmV0dXJuCisJCSAqLworCQljYXJkLT5uZXRkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dHhfZG1hX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisJLyoKKwkgKiBsaW5rIHRoaXMgcHJlcGFyZWQgZGVzY3JpcHRvciB0byBwcmV2aW91cyBvbmUKKwkgKiB0byBhY2hpZXZlIGhpZ2ggcGVyZm9ybWFuY2UKKwkgKi8KKwlkZXNjci0+cHJldi0+bmV4dF9kZXNjcl9hZGRyID0gZGVzY3ItPmJ1c19hZGRyOwogCS8qCiAJICogYXMgaGFyZHdhcmUgZGVzY3JpcHRvciBpcyBtb2RpZmllZCBpbiB0aGUgYWJvdmUgbGluZXMsCiAJICogZW5zdXJlIHRoYXQgdGhlIGhhcmR3YXJlIHNlZXMgaXQKIAkgKi8KIAl3bWIoKTsKLQlpZiAoZ2VsaWNfbmV0X2tpY2tfdHhkbWEoY2FyZCwgY2FyZC0+dHhfY2hhaW4udGFpbCkpCi0JCWdvdG8gZXJyb3I7CisJaWYgKGdlbGljX25ldF9raWNrX3R4ZG1hKGNhcmQsIGRlc2NyKSkgeworCQkvKgorCQkgKiBraWNrIGZhaWxlZC4KKwkJICogcmVsZWFzZSBkZXNjcmlwdG9ycyB3aGljaCB3ZXJlIGp1c3QgcHJlcGFyZWQKKwkJICovCisJCWNhcmQtPm5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlnZWxpY19uZXRfcmVsZWFzZV90eF9kZXNjcihjYXJkLCBkZXNjcik7CisJCWdlbGljX25ldF9yZWxlYXNlX3R4X2Rlc2NyKGNhcmQsIGRlc2NyLT5uZXh0KTsKKwkJY2FyZC0+dHhfY2hhaW4udGFpbCA9IGRlc2NyLT5uZXh0LT5uZXh0OworCQlkZXZfaW5mbyhjdG9kZXYoY2FyZCksICIlczoga2ljayBmYWlsdXJlXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJLyogT0ssIERNQSBzdGFydGVkL3Jlc2VydmVkICovCisJCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KIAotCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnR4X2RtYV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKLQotZXJyb3I6Ci0JY2FyZC0+bmV0ZGV2X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50eF9kbWFfbG9jaywgZmxhZ3MpOwotCXJldHVybiBORVRERVZfVFhfTE9DS0VEOwogfQogCiAvKioKQEAgLTg1NCw4ICs4NzIsOCBAQAogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAkvKiB1cGRhdGUgbmV0ZGV2aWNlIHN0YXRpc3RpY3MgKi8KLQljYXJkLT5uZXRkZXZfc3RhdHMucnhfcGFja2V0cysrOwotCWNhcmQtPm5ldGRldl9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwljYXJkLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwljYXJkLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJLyogcGFzcyBza2IgdXAgdG8gc3RhY2sgKi8KIAluZXRpZl9yZWNlaXZlX3NrYihza2IpOwpAQCAtODk1LDM4ICs5MTMsNjcgQEAKIAkgICAgKHN0YXR1cyA9PSBHRUxJQ19ORVRfREVTQ1JfRk9SQ0VfRU5EKSkgewogCQlkZXZfaW5mbyhjdG9kZXYoY2FyZCksICJkcm9wcGluZyBSWCBkZXNjcmlwdG9yIHdpdGggc3RhdGUgJXhcbiIsCiAJCQkgc3RhdHVzKTsKLQkJY2FyZC0+bmV0ZGV2X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJY2FyZC0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCWdvdG8gcmVmaWxsOwogCX0KIAotCWlmICgoc3RhdHVzICE9IEdFTElDX05FVF9ERVNDUl9DT01QTEVURSkgJiYKLQkgICAgKHN0YXR1cyAhPSBHRUxJQ19ORVRfREVTQ1JfRlJBTUVfRU5EKSkgeworCWlmIChzdGF0dXMgPT0gR0VMSUNfTkVUX0RFU0NSX0JVRkZFUl9GVUxMKSB7CisJCS8qCisJCSAqIEJ1ZmZlciBmdWxsIHdvdWxkIG9jY3VyIGlmIGFuZCBvbmx5IGlmCisJCSAqIHRoZSBmcmFtZSBsZW5ndGggd2FzIGxvbmdlciB0aGFuIHRoZSBzaXplIG9mIHRoaXMKKwkJICogZGVzY3JpcHRvcidzIGJ1ZmZlci4gIElmIHRoZSBmcmFtZSBsZW5ndGggd2FzIGVxdWFsCisJCSAqIHRvIG9yIHNob3J0ZXIgdGhhbiBidWZmZXInc2l6ZSwgRlJBTUVfRU5EIGNvbmRpdGlvbgorCQkgKiB3b3VsZCBvY2N1ci4KKwkJICogQW55d2F5IHRoaXMgZnJhbWUgd2FzIGxvbmdlciB0aGFuIHRoZSBNVFUsCisJCSAqIGp1c3QgZHJvcCBpdC4KKwkJICovCisJCWRldl9pbmZvKGN0b2RldihjYXJkKSwgIm92ZXJsZW5ndGggZnJhbWVcbiIpOworCQlnb3RvIHJlZmlsbDsKKwl9CisJLyoKKwkgKiBkZXNjcmlwdG9lcnMgYW55IG90aGVyIHRoYW4gRlJBTUVfRU5EIGhlcmUgc2hvdWxkCisJICogYmUgdHJlYXRlZCBhcyBlcnJvci4KKwkgKi8KKwlpZiAoc3RhdHVzICE9IEdFTElDX05FVF9ERVNDUl9GUkFNRV9FTkQpIHsKIAkJZGV2X2RiZyhjdG9kZXYoY2FyZCksICJSWCBkZXNjcmlwdG9yIHdpdGggc3RhdGUgJXhcbiIsCiAJCQlzdGF0dXMpOwogCQlnb3RvIHJlZmlsbDsKIAl9CiAKIAkvKiBvaywgd2UndmUgZ290IGEgcGFja2V0IGluIGRlc2NyICovCi0JZ2VsaWNfbmV0X3Bhc3Nfc2tiX3VwKGRlc2NyLCBjYXJkKTsgLyogMTogc2tiX3VwIHNjY2VzcyAqLwotCisJZ2VsaWNfbmV0X3Bhc3Nfc2tiX3VwKGRlc2NyLCBjYXJkKTsKIHJlZmlsbDoKLQlkZXNjci0+bmV4dF9kZXNjcl9hZGRyID0gMDsgLyogdW5saW5rIHRoZSBkZXNjciAqLworCS8qCisJICogU28gdGhhdCBhbHdheXMgRE1BQyBjYW4gc2VlIHRoZSBlbmQKKwkgKiBvZiB0aGUgZGVzY3JpcHRvciBjaGFpbiB0byBhdm9pZAorCSAqIGZyb20gdW53YW50ZWQgRE1BQyBvdmVycnVuLgorCSAqLworCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSAwOwogCiAJLyogY2hhbmdlIHRoZSBkZXNjcmlwdG9yIHN0YXRlOiAqLwogCWdlbGljX25ldF9zZXRfZGVzY3Jfc3RhdHVzKGRlc2NyLCBHRUxJQ19ORVRfREVTQ1JfTk9UX0lOX1VTRSk7CiAKLQkvKiByZWZpbGwgb25lIGRlc2MKLQkgKiBGSVhNRTogdGhpcyBjYW4gZmFpbCwgYnV0IGZvciBub3csIGp1c3QgbGVhdmUgdGhpcwotCSAqIGRlc2NyaXB0b3Igd2l0aG91dCBza2IKKwkvKgorCSAqIHRoaXMgY2FsbCBjYW4gZmFpbCwgYnV0IGZvciBub3csIGp1c3QgbGVhdmUgdGhpcworCSAqIGRlY3JpcHRvciB3aXRob3V0IHNrYgogCSAqLwogCWdlbGljX25ldF9wcmVwYXJlX3J4X2Rlc2NyKGNhcmQsIGRlc2NyKTsKKwogCWNoYWluLT5oZWFkID0gZGVzY3I7CiAJY2hhaW4tPnRhaWwgPSBkZXNjci0+bmV4dDsKKworCS8qCisJICogU2V0IHRoaXMgZGVzY3JpcHRvciB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKwkgKi8KIAlkZXNjci0+cHJldi0+bmV4dF9kZXNjcl9hZGRyID0gZGVzY3ItPmJ1c19hZGRyOwogCisJLyoKKwkgKiBJZiBkbWFjIGNoYWluIHdhcyBtZXQsIERNQUMgc3RvcHBlZC4KKwkgKiB0aHVzIHJlLWVuYWJsZSBpdAorCSAqLwogCWlmIChkbWFjX2NoYWluX2VuZGVkKSB7Ci0JCWdlbGljX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOwotCQlkZXZfZGJnKGN0b2RldihjYXJkKSwgInJlZW5hYmxlIHJ4IGRtYVxuIik7CisJCWNhcmQtPnJ4X2RtYV9yZXN0YXJ0X3JlcXVpcmVkID0gMTsKKwkJZGV2X2RiZyhjdG9kZXYoY2FyZCksICJyZWVuYWJsZSByeCBkbWEgc2NoZWR1bGVkXG4iKTsKIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTk2OCwyMCArMTAxNSw2IEBACiAJfSBlbHNlCiAJCXJldHVybiAxOwogfQotCi0vKioKLSAqIGdlbGljX25ldF9nZXRfc3RhdHMgLSBnZXQgaW50ZXJmYWNlIHN0YXRpc3RpY3MKLSAqIEBuZXRkZXY6IGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogcmV0dXJucyB0aGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MgcmVzaWRpbmcgaW4gdGhlIGdlbGljX25ldF9jYXJkIHN0cnVjdAotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdlbGljX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgZ2VsaWNfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JcmV0dXJuICZjYXJkLT5uZXRkZXZfc3RhdHM7Ci19Ci0KIC8qKgogICogZ2VsaWNfbmV0X2NoYW5nZV9tdHUgLSBjaGFuZ2VzIHRoZSBNVFUgb2YgYW4gaW50ZXJmYWNlCiAgKiBAbmV0ZGV2OiBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTAxNiw2ICsxMDQ5LDExIEBACiAJaWYgKCFzdGF0dXMpCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCWlmIChjYXJkLT5yeF9kbWFfcmVzdGFydF9yZXF1aXJlZCkgeworCQljYXJkLT5yeF9kbWFfcmVzdGFydF9yZXF1aXJlZCA9IDA7CisJCWdlbGljX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOworCX0KKwogCWlmIChzdGF0dXMgJiBHRUxJQ19ORVRfUlhJTlQpIHsKIAkJZ2VsaWNfbmV0X3J4X2lycV9vZmYoY2FyZCk7CiAJCW5ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CkBAIC0xMDI0LDkgKzEwNjIsMTAgQEAKIAlpZiAoc3RhdHVzICYgR0VMSUNfTkVUX1RYSU5UKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50eF9kbWFfbG9jaywgZmxhZ3MpOwogCQljYXJkLT50eF9kbWFfcHJvZ3Jlc3MgPSAwOworCQlnZWxpY19uZXRfcmVsZWFzZV90eF9jaGFpbihjYXJkLCAwKTsKKwkJLyoga2ljayBvdXRzdGFuZGluZyB0eCBkZXNjcmlwdG9yIGlmIGFueSAqLworCQlnZWxpY19uZXRfa2lja190eGRtYShjYXJkLCBjYXJkLT50eF9jaGFpbi50YWlsKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dHhfZG1hX2xvY2ssIGZsYWdzKTsKLQkJLyogc3RhcnQgcGVuZGluZyBETUEgKi8KLQkJZ2VsaWNfbmV0X3htaXQoTlVMTCwgbmV0ZGV2KTsKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTA2OCw3ICsxMTA3LDcgQEAKIAl9CiAKIAlyZXN1bHQgPSByZXF1ZXN0X2lycShjYXJkLT5uZXRkZXYtPmlycSwgZ2VsaWNfbmV0X2ludGVycnVwdCwKLQkJCSAgICAgSVJRRl9ESVNBQkxFRCwgImdlbGljIG5ldHdvcmsiLCBjYXJkLT5uZXRkZXYpOworCQkJICAgICBJUlFGX0RJU0FCTEVELCBjYXJkLT5uZXRkZXYtPm5hbWUsIGNhcmQtPm5ldGRldik7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9pbmZvKGN0b2RldihjYXJkKSwgIiVzOiVkOiByZXF1ZXN0X2lycSBmYWlsZWQgKCVkKVxuIiwKQEAgLTExMDcsNyArMTE0Niw3IEBACiAJCQljYXJkLT5kZXNjciwgR0VMSUNfTkVUX1RYX0RFU0NSSVBUT1JTKSkKIAkJZ290byBhbGxvY190eF9mYWlsZWQ7CiAJaWYgKGdlbGljX25ldF9pbml0X2NoYWluKGNhcmQsICZjYXJkLT5yeF9jaGFpbiwKLQkJCQkgY2FyZC0+ZGVzY3IgKyBHRUxJQ19ORVRfUlhfREVTQ1JJUFRPUlMsCisJCQkJIGNhcmQtPmRlc2NyICsgR0VMSUNfTkVUX1RYX0RFU0NSSVBUT1JTLAogCQkJCSBHRUxJQ19ORVRfUlhfREVTQ1JJUFRPUlMpKQogCQlnb3RvIGFsbG9jX3J4X2ZhaWxlZDsKIApAQCAtMTEyOSw3ICsxMTY4LDYgQEAKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwotCW5ldGlmX3BvbGxfZW5hYmxlKG5ldGRldik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTE0MSw3ICsxMTc5LDYgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotI2lmZGVmIEdFTElDX05FVF9FVEhUT09MCiBzdGF0aWMgdm9pZCBnZWxpY19uZXRfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkJICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKQEAgLTEyNjEsNyArMTI5OCw2IEBACiAJLmdldF9yeF9jc3VtCT0gZ2VsaWNfbmV0X2dldF9yeF9jc3VtLAogCS5zZXRfcnhfY3N1bQk9IGdlbGljX25ldF9zZXRfcnhfY3N1bSwKIH07Ci0jZW5kaWYKIAogLyoqCiAgKiBnZWxpY19uZXRfdHhfdGltZW91dF90YXNrIC0gdGFzayBzY2hlZHVsZWQgYnkgdGhlIHdhdGNoZG9nIHRpbWVvdXQKQEAgLTEzMjAsNyArMTM1Niw2IEBACiAJbmV0ZGV2LT5vcGVuID0gJmdlbGljX25ldF9vcGVuOwogCW5ldGRldi0+c3RvcCA9ICZnZWxpY19uZXRfc3RvcDsKIAluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZnZWxpY19uZXRfeG1pdDsKLQluZXRkZXYtPmdldF9zdGF0cyA9ICZnZWxpY19uZXRfZ2V0X3N0YXRzOwogCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmdlbGljX25ldF9zZXRfbXVsdGk7CiAJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJmdlbGljX25ldF9jaGFuZ2VfbXR1OwogCS8qIHR4IHdhdGNoZG9nICovCkBAIC0xMzI5LDkgKzEzNjQsNyBAQAogCS8qIE5BUEkgKi8KIAluZXRkZXYtPnBvbGwgPSAmZ2VsaWNfbmV0X3BvbGw7CiAJbmV0ZGV2LT53ZWlnaHQgPSBHRUxJQ19ORVRfTkFQSV9XRUlHSFQ7Ci0jaWZkZWYgR0VMSUNfTkVUX0VUSFRPT0wKIAluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmdlbGljX25ldF9ldGh0b29sX29wczsKLSNlbmRpZgogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuaCBiL2RyaXZlcnMvbmV0L3BzM19nZWxpY19uZXQuaAppbmRleCA1ZTFjMjg2Li5hOWM0YzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wczNfZ2VsaWNfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvcHMzX2dlbGljX25ldC5oCkBAIC0yOCwyMSArMjgsMTIgQEAKICNpZm5kZWYgX0dFTElDX05FVF9ICiAjZGVmaW5lIF9HRUxJQ19ORVRfSAogCi0jZGVmaW5lIEdFTElDX05FVF9EUlZfTkFNRSAiR2VsaWMgTmV0d29yayBEcml2ZXIiCi0jZGVmaW5lIEdFTElDX05FVF9EUlZfVkVSU0lPTiAiMS4wIgotCi0jZGVmaW5lIEdFTElDX05FVF9FVEhUT09MICAgICAgICAgICAgICAgLyogdXNlIGV0aHRvb2wgKi8KLQotLyogaW9jdGwgKi8KLSNkZWZpbmUgR0VMSUNfTkVUX0dFVF9NT0RFICAgICAgICAgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyAwKQotI2RlZmluZSBHRUxJQ19ORVRfU0VUX01PREUgICAgICAgICAgICAgIChTSU9DREVWUFJJVkFURSArIDEpCi0KIC8qIGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIEdFTElDX05FVF9SWF9ERVNDUklQVE9SUyAgICAgICAgMTI4IC8qIG51bSBvZiBkZXNjcmlwdG9ycyAqLwogI2RlZmluZSBHRUxJQ19ORVRfVFhfREVTQ1JJUFRPUlMgICAgICAgIDEyOCAvKiBudW0gb2YgZGVzY3JpcHRvcnMgKi8KIAotI2RlZmluZSBHRUxJQ19ORVRfTUFYX01UVSAgICAgICAgICAgICAgIDIzMDgKLSNkZWZpbmUgR0VMSUNfTkVUX01JTl9NVFUgICAgICAgICAgICAgICA2NAorI2RlZmluZSBHRUxJQ19ORVRfTUFYX01UVSAgICAgICAgICAgICAgIFZMQU5fRVRIX0ZSQU1FX0xFTgorI2RlZmluZSBHRUxJQ19ORVRfTUlOX01UVSAgICAgICAgICAgICAgIFZMQU5fRVRIX1pMRU4KICNkZWZpbmUgR0VMSUNfTkVUX1JYQlVGX0FMSUdOICAgICAgICAgICAxMjgKICNkZWZpbmUgR0VMSUNfTkVUX1JYX0NTVU1fREVGQVVMVCAgICAgICAxIC8qIGh3IGNoa3N1bSAqLwogI2RlZmluZSBHRUxJQ19ORVRfV0FUQ0hET0dfVElNRU9VVCAgICAgIDUqSFoKQEAgLTkwLDcgKzgxLDggQEAKIAkJCQkJICAgICovCiAjZGVmaW5lIEdFTElDX05FVF9SWFZMTlBLVAkweDAwMjAwMDAwIC8qIFZMQU4gcGFja2V0ICovCiAvKiBiaXQgMjAuLjE2IHJlc2VydmVkICovCi0jZGVmaW5lIEdFTElDX05FVF9SWFJFQ05VTQkweDAwMDBmZjAwIC8qIHJlY2VwdGlvbiByZWNlaXB0IG51bWJlciAqLworI2RlZmluZSBHRUxJQ19ORVRfUlhSUkVDTlVNCTB4MDAwMGZmMDAgLyogcmVjZXB0aW9uIHJlY2VpcHQgbnVtYmVyICovCisjZGVmaW5lIEdFTElDX05FVF9SWFJSRUNOVU1fU0hJRlQJOAogLyogYml0IDcuLjAgcmVzZXJ2ZWQgKi8KIAogI2RlZmluZSBHRUxJQ19ORVRfVFhERVNDX1RBSUwJCTAKQEAgLTEzMywxOSArMTI1LDE5IEBACiAJCQkJCQkgICAgICAqIGludGVycnVwdCBzdGF0dXMgKi8KIAogI2RlZmluZSBHRUxJQ19ORVRfRE1BQ19DTURTVEFUX0NIQUlOX0VORCAgMHgwMDAwMDAwMiAvKiBSWERDRUlTOkRNQSBzdG9wcGVkICovCi0jZGVmaW5lIEdFTElDX05FVF9ETUFDX0NNRFNUQVRfTk9UX0lOX1VTRSAweGIwMDAwMDAwCiAjZGVmaW5lIEdFTElDX05FVF9ERVNDUl9JTkRfUFJPQ19TSElGVCAgICAyOAogI2RlZmluZSBHRUxJQ19ORVRfREVTQ1JfSU5EX1BST0NfTUFTS08gICAgMHgwZmZmZmZmZgogCiAKIGVudW0gZ2VsaWNfbmV0X2Rlc2NyX3N0YXR1cyB7Ci0JR0VMSUNfTkVUX0RFU0NSX0NPTVBMRVRFICAgICAgICAgICAgPSAweDAwLCAvKiB1c2VkIGluIHJ4IGFuZCB0eCAqLworCUdFTElDX05FVF9ERVNDUl9DT01QTEVURSAgICAgICAgICAgID0gMHgwMCwgLyogdXNlZCBpbiB0eCAqLworCUdFTElDX05FVF9ERVNDUl9CVUZGRVJfRlVMTCAgICAgICAgID0gMHgwMCwgLyogdXNlZCBpbiByeCAqLwogCUdFTElDX05FVF9ERVNDUl9SRVNQT05TRV9FUlJPUiAgICAgID0gMHgwMSwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KIAlHRUxJQ19ORVRfREVTQ1JfUFJPVEVDVElPTl9FUlJPUiAgICA9IDB4MDIsIC8qIHVzZWQgaW4gcnggYW5kIHR4ICovCiAJR0VMSUNfTkVUX0RFU0NSX0ZSQU1FX0VORCAgICAgICAgICAgPSAweDA0LCAvKiB1c2VkIGluIHJ4ICovCiAJR0VMSUNfTkVUX0RFU0NSX0ZPUkNFX0VORCAgICAgICAgICAgPSAweDA1LCAvKiB1c2VkIGluIHJ4IGFuZCB0eCAqLwogCUdFTElDX05FVF9ERVNDUl9DQVJET1dORUQgICAgICAgICAgID0gMHgwYSwgLyogdXNlZCBpbiByeCBhbmQgdHggKi8KLQlHRUxJQ19ORVRfREVTQ1JfTk9UX0lOX1VTRSAgICAgICAgICAgICAgICAgIC8qIGFueSBvdGhlciB2YWx1ZSAqLworCUdFTElDX05FVF9ERVNDUl9OT1RfSU5fVVNFICAgICAgICAgID0gMHgwYiAgLyogYW55IG90aGVyIHZhbHVlICovCiB9OwogLyogZm9yIGx2MV9uZXRfY29udHJvbCAqLwogI2RlZmluZSBHRUxJQ19ORVRfR0VUX01BQ19BRERSRVNTICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCkBAIC0yMTYsMTAgKzIwOCwxMCBAQAogCiAJc3RydWN0IGdlbGljX25ldF9kZXNjcl9jaGFpbiB0eF9jaGFpbjsKIAlzdHJ1Y3QgZ2VsaWNfbmV0X2Rlc2NyX2NoYWluIHJ4X2NoYWluOworCWludCByeF9kbWFfcmVzdGFydF9yZXF1aXJlZDsKIAkvKiBndXJhZCBkbWFjIGRlc2NyaXB0b3IgY2hhaW4qLwogCXNwaW5sb2NrX3QgY2hhaW5fbG9jazsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldGRldl9zdGF0czsKIAlpbnQgcnhfY3N1bTsKIAkvKiBndWFyZCB0eF9kbWFfcHJvZ3Jlc3MgKi8KIAlzcGlubG9ja190IHR4X2RtYV9sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmggYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAppbmRleCA0Y2I3MTBiLi5jZmEyNjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaApAQCAtNzQ3LDEwICs3NDcsOSBAQAogI2RlZmluZSBNQ19FUlJfUkVHX01JUklfQ1JJX0VSUl8xICAgICAgICAgIEJJVCgyMykKICNkZWZpbmUgTUNfRVJSX1JFR19TTV9FUlIgICAgICAgICAgICAgICAgICBCSVQoMzEpCiAjZGVmaW5lIE1DX0VSUl9SRUdfRUNDX0FMTF9TTkcJCSAgIChCSVQoMikgfCBCSVQoMykgfCBCSVQoNCkgfCBCSVQoNSkgfFwKLQkJCQkJICAgIEJJVCg2KSB8IEJJVCg3KSB8IEJJVCgxNykgfCBCSVQoMTkpKQorCQkJCQlCSVQoMTcpIHwgQklUKDE5KSkKICNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfQUxMX0RCTAkJICAgKEJJVCgxMCkgfCBCSVQoMTEpIHwgQklUKDEyKSB8XAotCQkJCQkgICAgQklUKDEzKSB8IEJJVCgxNCkgfCBCSVQoMTUpIHxcCi0JCQkJCSAgICBCSVQoMTgpIHwgQklUKDIwKSkKKwkJCQkJQklUKDEzKSB8IEJJVCgxOCkgfCBCSVQoMjApKQogCXU2NCBtY19lcnJfbWFzazsKIAl1NjQgbWNfZXJyX2FsYXJtOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggYWZlZjZjMC4uMmJlMGEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtMzIsMTIgKzMyLDEyIEBACiAgKiByeF9yaW5nX3N6OiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiByZWNlaXZlIGJsb2NrcyBlYWNoIHJpbmcgY2FuIGhhdmUuCiAgKiAgICAgVGhpcyBpcyBhbHNvIGFuIGFycmF5IG9mIHNpemUgOC4KICAqIHJ4X3JpbmdfbW9kZTogVGhpcyBkZWZpbmVzIHRoZSBvcGVyYXRpb24gbW9kZSBvZiBhbGwgOCByaW5ncy4gVGhlIHZhbGlkCi0gKgkJdmFsdWVzIGFyZSAxLCAyIGFuZCAzLgorICoJCXZhbHVlcyBhcmUgMSwgMi4KICAqIHR4X2ZpZm9fbnVtOiBUaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBUeCBGSUZPcyB0aGF0cyB1c2VkIGludCB0aGUgZHJpdmVyLgogICogdHhfZmlmb19sZW46IFRoaXMgdG9vIGlzIGFuIGFycmF5IG9mIDguIEVhY2ggZWxlbWVudCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKICAqIFR4IGRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvcnJlc3BvbmRpbmcgRklGTy4KICAqIGludHJfdHlwZTogVGhpcyBkZWZpbmVzIHRoZSB0eXBlIG9mIGludGVycnVwdC4gVGhlIHZhbHVlcyBjYW4gYmUgMChJTlRBKSwKLSAqICAgICAxKE1TSSksIDIoTVNJX1gpLiBEZWZhdWx0IHZhbHVlIGlzICcwKElOVEEpJworICogICAgIDIoTVNJX1gpLiBEZWZhdWx0IHZhbHVlIGlzICcwKElOVEEpJwogICogbHJvOiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgTGFyZ2UgUmVjZWl2ZSBPZmZsb2FkIChMUk8pIG9yIG5vdC4KICAqICAgICBQb3NzaWJsZSB2YWx1ZXMgJzEnIGZvciBlbmFibGUgJzAnIGZvciBkaXNhYmxlLiBEZWZhdWx0IGlzICcwJwogICogbHJvX21heF9wa3RzOiBUaGlzIHBhcmFtZXRlciBkZWZpbmVzIG1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgY2FuIGJlCkBAIC04NCwxNCArODQsMTQgQEAKICNpbmNsdWRlICJzMmlvLmgiCiAjaW5jbHVkZSAiczJpby1yZWdzLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjIuMC4yMy4xIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjI1LjEiCiAKIC8qIFMyaW8gRHJpdmVyIG5hbWUgJiB2ZXJzaW9uLiAqLwogc3RhdGljIGNoYXIgczJpb19kcml2ZXJfbmFtZVtdID0gIk5ldGVyaW9uIjsKIHN0YXRpYyBjaGFyIHMyaW9fZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogCi1zdGF0aWMgaW50IHJ4ZF9zaXplWzRdID0gezMyLDQ4LDQ4LDY0fTsKLXN0YXRpYyBpbnQgcnhkX2NvdW50WzRdID0gezEyNyw4NSw4NSw2M307CitzdGF0aWMgaW50IHJ4ZF9zaXplWzJdID0gezMyLDQ4fTsKK3N0YXRpYyBpbnQgcnhkX2NvdW50WzJdID0gezEyNyw4NX07CiAKIHN0YXRpYyBpbmxpbmUgaW50IFJYRF9JU19VUDJEVChzdHJ1Y3QgUnhEX3QgKnJ4ZHApCiB7CkBAIC0yODIsNiArMjgyLDcgQEAKIAkoImxyb19mbHVzaF9kdWVfdG9fbWF4X3BrdHMiKSwKIAkoImxyb19hdmdfYWdncl9wa3RzIiksCiAJKCJtZW1fYWxsb2NfZmFpbF9jbnQiKSwKKwkoInBjaV9tYXBfZmFpbF9jbnQiKSwKIAkoIndhdGNoZG9nX3RpbWVyX2NudCIpLAogCSgibWVtX2FsbG9jYXRlZCIpLAogCSgibWVtX2ZyZWVkIiksCkBAIC00MjYsNyArNDI3LDcgQEAKIFMySU9fUEFSTV9JTlQobDNsNGhkcl9zaXplLCAxMjgpOwogLyogRnJlcXVlbmN5IG9mIFJ4IGRlc2Mgc3luY3MgZXhwcmVzc2VkIGFzIHBvd2VyIG9mIDIgKi8KIFMySU9fUEFSTV9JTlQocnhzeW5jX2ZyZXF1ZW5jeSwgMyk7Ci0vKiBJbnRlcnJ1cHQgdHlwZS4gVmFsdWVzIGNhbiBiZSAwKElOVEEpLCAxKE1TSSksIDIoTVNJX1gpICovCisvKiBJbnRlcnJ1cHQgdHlwZS4gVmFsdWVzIGNhbiBiZSAwKElOVEEpLCAyKE1TSV9YKSAqLwogUzJJT19QQVJNX0lOVChpbnRyX3R5cGUsIDApOwogLyogTGFyZ2UgcmVjZWl2ZSBvZmZsb2FkIGZlYXR1cmUgKi8KIFMySU9fUEFSTV9JTlQobHJvLCAwKTsKQEAgLTcwMSw3ICs3MDIsNyBAQAogCQkJICAgICh1NjQpIHRtcF9wX2FkZHJfbmV4dDsKIAkJfQogCX0KLQlpZiAobmljLT5yeGRfbW9kZSA+PSBSWERfTU9ERV8zQSkgeworCWlmIChuaWMtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNCKSB7CiAJCS8qCiAJCSAqIEFsbG9jYXRpb24gb2YgU3RvcmFnZXMgZm9yIGJ1ZmZlciBhZGRyZXNzZXMgaW4gMkJVRkYgbW9kZQogCQkgKiBhbmQgdGhlIGJ1ZmZlcnMgYXMgd2VsbC4KQEAgLTg3MCw3ICs4NzEsNyBAQAogCQl9CiAJfQogCi0JaWYgKG5pYy0+cnhkX21vZGUgPj0gUlhEX01PREVfM0EpIHsKKwlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8zQikgewogCQkvKiBGcmVlaW5nIGJ1ZmZlciBzdG9yYWdlIGFkZHJlc3NlcyBpbiAyQlVGRiBtb2RlLiAqLwogCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CiAJCQlibGtfY250ID0gY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAvCkBAIC0yMjMzLDQ0ICsyMjM0LDYgQEAKIAl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOwogfQogCi1zdGF0aWMgaW50IGZpbGxfcnhkXzNidWYoc3RydWN0IHMyaW9fbmljICpuaWMsIHN0cnVjdCBSeERfdCAqcnhkcCwgc3RydWN0IFwKLQkJCQlza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OwotCXN0cnVjdCBza19idWZmICpmcmFnX2xpc3Q7Ci0Jdm9pZCAqdG1wOwotCi0JLyogQnVmZmVyLTEgcmVjZWl2ZXMgTDMvTDQgaGVhZGVycyAqLwotCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIxX3B0ciA9IHBjaV9tYXBfc2luZ2xlCi0JCQkobmljLT5wZGV2LCBza2ItPmRhdGEsIGwzbDRoZHJfc2l6ZSArIDQsCi0JCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JLyogc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Qgd2lsbCBoYXZlIEw0IGRhdGEgcGF5bG9hZCAqLwotCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gZGV2X2FsbG9jX3NrYihkZXYtPm10dSArIEFMSUdOX1NJWkUpOwotCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9PSBOVUxMKSB7Ci0JCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NfZmFpbF9jbnQrKzsKLQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkXG4gIiwgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU0gOwotCX0KLQlmcmFnX2xpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKLQlza2ItPnRydWVzaXplICs9IGZyYWdfbGlzdC0+dHJ1ZXNpemU7Ci0JbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgCi0JCSs9IGZyYWdfbGlzdC0+dHJ1ZXNpemU7Ci0JZnJhZ19saXN0LT5uZXh0ID0gTlVMTDsKLQl0bXAgPSAodm9pZCAqKUFMSUdOKChsb25nKWZyYWdfbGlzdC0+ZGF0YSwgQUxJR05fU0laRSArIDEpOwotCWZyYWdfbGlzdC0+ZGF0YSA9IHRtcDsKLQlza2JfcmVzZXRfdGFpbF9wb2ludGVyKGZyYWdfbGlzdCk7Ci0KLQkvKiBCdWZmZXItMiByZWNlaXZlcyBMNCBkYXRhIHBheWxvYWQgKi8KLQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsCi0JCQkJZnJhZ19saXN0LT5kYXRhLCBkZXYtPm10dSwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMV9TSVpFXzMobDNsNGhkcl9zaXplICsgNCk7Ci0JcnhkcC0+Q29udHJvbF8yIHw9IFNFVF9CVUZGRVIyX1NJWkVfMyhkZXYtPm10dSk7Ci0KLQlyZXR1cm4gU1VDQ0VTUzsKLX0KLQogLyoqCiAgKiAgZmlsbF9yeF9idWZmZXJzIC0gQWxsb2NhdGVzIHRoZSBSeCBzaWRlIHNrYnMKICAqICBAbmljOiAgZGV2aWNlIHByaXZhdGUgdmFyaWFibGUKQEAgLTIzMDcsNiArMjI3MCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgUnhEX3QgKmZpcnN0X3J4ZHAgPSBOVUxMOwogCXU2NCBCdWZmZXIwX3B0ciA9IDAsIEJ1ZmZlcjFfcHRyID0gMDsKKwlzdHJ1Y3QgUnhEMSAqcnhkcDE7CisJc3RydWN0IFJ4RDMgKnJ4ZHAzOworCXN0cnVjdCBzd1N0YXQgKnN0YXRzID0gJm5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdDsKIAogCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CiAJY29uZmlnID0gJm5pYy0+Y29uZmlnOwpAQCAtMjM1OSw3ICsyMzI1LDcgQEAKIAkJCShibG9ja19ubyAqIChyeGRfY291bnRbbmljLT5yeGRfbW9kZV0gKyAxKSkgKyBvZmY7CiAJCX0KIAkJaWYgKChyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpICYmCi0JCQkoKG5pYy0+cnhkX21vZGUgPj0gUlhEX01PREVfM0EpICYmCisJCQkoKG5pYy0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpICYmCiAJCQkJKHJ4ZHAtPkNvbnRyb2xfMiAmIEJJVCgwKSkpKSB7CiAJCQltYWNfY29udHJvbC0+cmluZ3NbcmluZ19ub10ucnhfY3Vycl9wdXRfaW5mby4KIAkJCQkJb2Zmc2V0ID0gb2ZmOwpAQCAtMjM3MCwxMCArMjMzNiw4IEBACiAJCQkJSEVBREVSXzgwMl8yX1NJWkUgKyBIRUFERVJfU05BUF9TSVpFOwogCQlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKQogCQkJc2l6ZSArPSBORVRfSVBfQUxJR047Ci0JCWVsc2UgaWYgKG5pYy0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpCi0JCQlzaXplID0gZGV2LT5tdHUgKyBBTElHTl9TSVpFICsgQlVGMF9MRU4gKyA0OwogCQllbHNlCi0JCQlzaXplID0gbDNsNGhkcl9zaXplICsgQUxJR05fU0laRSArIEJVRjBfTEVOICsgNDsKKwkJCXNpemUgPSBkZXYtPm10dSArIEFMSUdOX1NJWkUgKyBCVUYwX0xFTiArIDQ7CiAKIAkJLyogYWxsb2NhdGUgc2tiICovCiAJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CkBAIC0yMzkyLDMzICsyMzU2LDM1IEBACiAJCQkrPSBza2ItPnRydWVzaXplOwogCQlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKSB7CiAJCQkvKiAxIGJ1ZmZlciBtb2RlIC0gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCisJCQlyeGRwMSA9IChzdHJ1Y3QgUnhEMSopcnhkcDsKIAkJCW1lbXNldChyeGRwLCAwLCBzaXplb2Yoc3RydWN0IFJ4RDEpKTsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKLQkJCSgoc3RydWN0IFJ4RDEqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9IHBjaV9tYXBfc2luZ2xlCisJCQlyeGRwMS0+QnVmZmVyMF9wdHIgPSBwY2lfbWFwX3NpbmdsZQogCQkJICAgIChuaWMtPnBkZXYsIHNrYi0+ZGF0YSwgc2l6ZSAtIE5FVF9JUF9BTElHTiwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYoIChyeGRwMS0+QnVmZmVyMF9wdHIgPT0gMCkgfHwKKwkJCQkocnhkcDEtPkJ1ZmZlcjBfcHRyID09CisJCQkJRE1BX0VSUk9SX0NPREUpKQorCQkJCWdvdG8gcGNpX21hcF9mYWlsZWQ7CisKIAkJCXJ4ZHAtPkNvbnRyb2xfMiA9IAogCQkJCVNFVF9CVUZGRVIwX1NJWkVfMShzaXplIC0gTkVUX0lQX0FMSUdOKTsKIAotCQl9IGVsc2UgaWYgKG5pYy0+cnhkX21vZGUgPj0gUlhEX01PREVfM0EpIHsKKwkJfSBlbHNlIGlmIChuaWMtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNCKSB7CiAJCQkvKgotCQkJICogMiBvciAzIGJ1ZmZlciBtb2RlIC0KLQkJCSAqIEJvdGggMiBidWZmZXIgbW9kZSBhbmQgMyBidWZmZXIgbW9kZSBwcm92aWRlcyAxMjgKKwkJCSAqIDIgYnVmZmVyIG1vZGUgLQorCQkJICogMiBidWZmZXIgbW9kZSBwcm92aWRlcyAxMjgKIAkJCSAqIGJ5dGUgYWxpZ25lZCByZWNlaXZlIGJ1ZmZlcnMuCi0JCQkgKgotCQkJICogMyBidWZmZXIgbW9kZSBwcm92aWRlcyBoZWFkZXIgc2VwYXJhdGlvbiB3aGVyZSBpbgotCQkJICogc2tiLT5kYXRhIHdpbGwgaGF2ZSBMMy9MNCBoZWFkZXJzIHdoZXJlIGFzCi0JCQkgKiBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCB3aWxsIGhhdmUgdGhlIEw0IGRhdGEKLQkJCSAqIHBheWxvYWQKIAkJCSAqLwogCisJCQlyeGRwMyA9IChzdHJ1Y3QgUnhEMyopcnhkcDsKIAkJCS8qIHNhdmUgYnVmZmVyIHBvaW50ZXJzIHRvIGF2b2lkIGZyZXF1ZW50IGRtYSBtYXBwaW5nICovCi0JCQlCdWZmZXIwX3B0ciA9ICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0cjsKLQkJCUJ1ZmZlcjFfcHRyID0gKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyOworCQkJQnVmZmVyMF9wdHIgPSByeGRwMy0+QnVmZmVyMF9wdHI7CisJCQlCdWZmZXIxX3B0ciA9IHJ4ZHAzLT5CdWZmZXIxX3B0cjsKIAkJCW1lbXNldChyeGRwLCAwLCBzaXplb2Yoc3RydWN0IFJ4RDMpKTsKIAkJCS8qIHJlc3RvcmUgdGhlIGJ1ZmZlciBwb2ludGVycyBmb3IgZG1hIHN5bmMqLwotCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyID0gQnVmZmVyMF9wdHI7Ci0JCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSBCdWZmZXIxX3B0cjsKKwkJCXJ4ZHAzLT5CdWZmZXIwX3B0ciA9IEJ1ZmZlcjBfcHRyOworCQkJcnhkcDMtPkJ1ZmZlcjFfcHRyID0gQnVmZmVyMV9wdHI7CiAKIAkJCWJhID0gJm1hY19jb250cm9sLT5yaW5nc1tyaW5nX25vXS5iYVtibG9ja19ub11bb2ZmXTsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgQlVGMF9MRU4pOwpAQCAtMjQyOCwxNCArMjM5NCwxOCBAQAogCQkJc2tiLT5kYXRhID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpdG1wOwogCQkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCi0JCQlpZiAoISgoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIpKQotCQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9CisJCQlpZiAoIShyeGRwMy0+QnVmZmVyMF9wdHIpKQorCQkJCXJ4ZHAzLT5CdWZmZXIwX3B0ciA9CiAJCQkJICAgcGNpX21hcF9zaW5nbGUobmljLT5wZGV2LCBiYS0+YmFfMCwgQlVGMF9MRU4sCiAJCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQllbHNlCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5pYy0+cGRldiwKLQkJCQkoZG1hX2FkZHJfdCkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLAorCQkJCShkbWFfYWRkcl90KSByeGRwMy0+QnVmZmVyMF9wdHIsCiAJCQkJICAgIEJVRjBfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYoIChyeGRwMy0+QnVmZmVyMF9wdHIgPT0gMCkgfHwKKwkJCQkocnhkcDMtPkJ1ZmZlcjBfcHRyID09IERNQV9FUlJPUl9DT0RFKSkKKwkJCQlnb3RvIHBjaV9tYXBfZmFpbGVkOworCiAJCQlyeGRwLT5Db250cm9sXzIgPSBTRVRfQlVGRkVSMF9TSVpFXzMoQlVGMF9MRU4pOwogCQkJaWYgKG5pYy0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpIHsKIAkJCQkvKiBUd28gYnVmZmVyIG1vZGUgKi8KQEAgLTI0NDQsMzMgKzI0MTQsMzAgQEAKIAkJCQkgKiBCdWZmZXIyIHdpbGwgaGF2ZSBMMy9MNCBoZWFkZXIgcGx1cwogCQkJCSAqIEw0IHBheWxvYWQKIAkJCQkgKi8KLQkJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZQorCQkJCXJ4ZHAzLT5CdWZmZXIyX3B0ciA9IHBjaV9tYXBfc2luZ2xlCiAJCQkJKG5pYy0+cGRldiwgc2tiLT5kYXRhLCBkZXYtPm10dSArIDQsCiAJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi0JCQkJLyogQnVmZmVyLTEgd2lsbCBiZSBkdW1teSBidWZmZXIuIE5vdCB1c2VkICovCi0JCQkJaWYgKCEoKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyKSkgewotCQkJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPQorCQkJCWlmKCAocnhkcDMtPkJ1ZmZlcjJfcHRyID09IDApIHx8CisJCQkJCShyeGRwMy0+QnVmZmVyMl9wdHIgPT0gRE1BX0VSUk9SX0NPREUpKQorCQkJCQlnb3RvIHBjaV9tYXBfZmFpbGVkOworCisJCQkJcnhkcDMtPkJ1ZmZlcjFfcHRyID0KIAkJCQkJCXBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwKIAkJCQkJCWJhLT5iYV8xLCBCVUYxX0xFTiwKIAkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJaWYoIChyeGRwMy0+QnVmZmVyMV9wdHIgPT0gMCkgfHwKKwkJCQkJKHJ4ZHAzLT5CdWZmZXIxX3B0ciA9PSBETUFfRVJST1JfQ09ERSkpIHsKKwkJCQkJcGNpX3VubWFwX3NpbmdsZQorCQkJCQkJKG5pYy0+cGRldiwKKwkJCQkJCShkbWFfYWRkcl90KXNrYi0+ZGF0YSwKKwkJCQkJCWRldi0+bXR1ICsgNCwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCWdvdG8gcGNpX21hcF9mYWlsZWQ7CiAJCQkJfQogCQkJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMV9TSVpFXzMoMSk7CiAJCQkJcnhkcC0+Q29udHJvbF8yIHw9IFNFVF9CVUZGRVIyX1NJWkVfMwogCQkJCQkJCQkoZGV2LT5tdHUgKyA0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogMyBidWZmZXIgbW9kZSAqLwotCQkJCWlmIChmaWxsX3J4ZF8zYnVmKG5pYywgcnhkcCwgc2tiKSA9PSAtRU5PTUVNKSB7Ci0JCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5cCi0JCQkJCW1lbV9mcmVlZCArPSBza2ItPnRydWVzaXplOwotCQkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCQkJCQlpZiAoZmlyc3RfcnhkcCkgewotCQkJCQkJd21iKCk7Ci0JCQkJCQlmaXJzdF9yeGRwLT5Db250cm9sXzEgfD0KLQkJCQkJCQlSWERfT1dOX1hFTkE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIC1FTk9NRU0gOwotCQkJCX0KIAkJCX0KIAkJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBCSVQoMCk7CiAJCX0KQEAgLTI1MDUsNiArMjQ3MiwxMSBAQAogCX0KIAogCXJldHVybiBTVUNDRVNTOworcGNpX21hcF9mYWlsZWQ6CisJc3RhdHMtPnBjaV9tYXBfZmFpbF9jbnQrKzsKKwlzdGF0cy0+bWVtX2ZyZWVkICs9IHNrYi0+dHJ1ZXNpemU7CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9yeGRfYmxrKHN0cnVjdCBzMmlvX25pYyAqc3AsIGludCByaW5nX25vLCBpbnQgYmxrKQpAQCAtMjUxNSw2ICsyNDg3LDggQEAKIAlzdHJ1Y3QgUnhEX3QgKnJ4ZHA7CiAJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgYnVmZkFkZCAqYmE7CisJc3RydWN0IFJ4RDEgKnJ4ZHAxOworCXN0cnVjdCBSeEQzICpyeGRwMzsKIAogCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKIAlmb3IgKGogPSAwIDsgaiA8IHJ4ZF9jb3VudFtzcC0+cnhkX21vZGVdOyBqKyspIHsKQEAgLTI1MjYsNDAgKzI1MDAsMzAgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfMSkgeworCQkJcnhkcDEgPSAoc3RydWN0IFJ4RDEqKXJ4ZHA7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkgKChzdHJ1Y3QgUnhEMSopcnhkcCktPkJ1ZmZlcjBfcHRyLAotCQkJCSBkZXYtPm10dSArCi0JCQkJIEhFQURFUl9FVEhFUk5FVF9JSV84MDJfM19TSVpFCi0JCQkJICsgSEVBREVSXzgwMl8yX1NJWkUgKwotCQkJCSBIRUFERVJfU05BUF9TSVpFLAotCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXJ4ZHAxLT5CdWZmZXIwX3B0ciwKKwkJCQlkZXYtPm10dSArCisJCQkJSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUKKwkJCQkrIEhFQURFUl84MDJfMl9TSVpFICsKKwkJCQlIRUFERVJfU05BUF9TSVpFLAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKHN0cnVjdCBSeEQxKSk7CiAJCX0gZWxzZSBpZihzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpIHsKKwkJCXJ4ZHAzID0gKHN0cnVjdCBSeEQzKilyeGRwOwogCQkJYmEgPSAmbWFjX2NvbnRyb2wtPnJpbmdzW3Jpbmdfbm9dLgogCQkJCWJhW2Jsa11bal07CiAJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLAotCQkJCSBCVUYwX0xFTiwKLQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQotCQkJCSAoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIsCi0JCQkJIEJVRjFfTEVOLAotCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciwKLQkJCQkgZGV2LT5tdHUgKyA0LAotCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihzdHJ1Y3QgUnhEMykpOwotCQl9IGVsc2UgewotCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLCBCVUYwX0xFTiwKKwkJCQlyeGRwMy0+QnVmZmVyMF9wdHIsCisJCQkJQlVGMF9MRU4sCiAJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQotCQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIxX3B0ciwKLQkJCQlsM2w0aGRyX3NpemUgKyA0LAorCQkJCXJ4ZHAzLT5CdWZmZXIxX3B0ciwKKwkJCQlCVUYxX0xFTiwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyLCBkZXYtPm10dSwKKwkJCQlyeGRwMy0+QnVmZmVyMl9wdHIsCisJCQkJZGV2LT5tdHUgKyA0LAogCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKHN0cnVjdCBSeEQzKSk7CiAJCX0KQEAgLTI3NTYsNiArMjcyMCw4IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgcGt0X2NudCA9IDA7CiAJaW50IGk7CisJc3RydWN0IFJ4RDEqIHJ4ZHAxOworCXN0cnVjdCBSeEQzKiByeGRwMzsKIAogCXNwaW5fbG9jaygmbmljLT5yeF9sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJm5pYy0+Y2FyZF9zdGF0ZSkgPT0gQ0FSRF9ET1dOKSB7CkBAIC0yNzk2LDMyICsyNzYyLDIzIEBACiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKG5pYy0+cnhkX21vZGUgPT0gUlhEX01PREVfMSkgeworCQkJcnhkcDEgPSAoc3RydWN0IFJ4RDEqKXJ4ZHA7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJICgoc3RydWN0IFJ4RDEqKXJ4ZHApLT5CdWZmZXIwX3B0ciwKLQkJCQkgZGV2LT5tdHUgKwotCQkJCSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRSArCi0JCQkJIEhFQURFUl84MDJfMl9TSVpFICsKLQkJCQkgSEVBREVSX1NOQVBfU0laRSwKLQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlyeGRwMS0+QnVmZmVyMF9wdHIsCisJCQkJZGV2LT5tdHUgKworCQkJCUhFQURFUl9FVEhFUk5FVF9JSV84MDJfM19TSVpFICsKKwkJCQlIRUFERVJfODAyXzJfU0laRSArCisJCQkJSEVBREVSX1NOQVBfU0laRSwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQl9IGVsc2UgaWYgKG5pYy0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpIHsKKwkJCXJ4ZHAzID0gKHN0cnVjdCBSeEQzKilyeGRwOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0ciwKLQkJCQkgQlVGMF9MRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJcnhkcDMtPkJ1ZmZlcjBfcHRyLAorCQkJCUJVRjBfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQotCQkJCSAoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIsCi0JCQkJIGRldi0+bXR1ICsgNCwKLQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJfSBlbHNlIHsKLQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQotCQkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLCBCVUYwX0xFTiwKLQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJCSAoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIsCi0JCQkJCSBsM2w0aGRyX3NpemUgKyA0LAotCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkJICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciwKLQkJCQkJIGRldi0+bXR1LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXJ4ZHAzLT5CdWZmZXIyX3B0ciwKKwkJCQlkZXYtPm10dSArIDQsCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJfQogCQlwcmVmZXRjaChza2ItPmRhdGEpOwogCQlyeF9vc21faGFuZGxlcihyaW5nX2RhdGEsIHJ4ZHApOwpAQCAtMzQyNSwyMyArMzM4Miw4IEBACiAJLyogQmFjayB1cCAgdGhlIFBDSS1YIENNRCByZWcsIGRvbnQgd2FudCB0byBsb3NlIE1NUkJDLCBPU1Qgc2V0dGluZ3MgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLCAmKHBjaV9jbWQpKTsKIAotCWlmIChzcC0+ZGV2aWNlX3R5cGUgPT0gWEZSQU1FX0lJX0RFVklDRSkgewotCQlpbnQgcmV0OwotCQlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHNwLT5wZGV2LCAzKTsKLQkJaWYgKCFyZXQpCi0JCQlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHNwLT5wZGV2LCAwKTsKLQkJZWxzZSB7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywiJXMgUE1FIGJhc2VkIFNXX1Jlc2V0IGZhaWxlZCFcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCQlnb3RvIG9sZF93YXk7Ci0JCX0KLQkJbXNsZWVwKDIwKTsKLQkJZ290byBuZXdfd2F5OwotCX0KLW9sZF93YXk6CiAJdmFsNjQgPSBTV19SRVNFVF9BTEw7CiAJd3JpdGVxKHZhbDY0LCAmYmFyMC0+c3dfcmVzZXQpOwotbmV3X3dheToKIAlpZiAoc3Ryc3RyKHNwLT5wcm9kdWN0X25hbWUsICJDWDQiKSkgewogCQltc2xlZXAoNzUwKTsKIAl9CkBAIC0zNzMxLDU2ICszNjczLDYgQEAKIAl9CiB9CiAKLWludCBzMmlvX2VuYWJsZV9tc2koc3RydWN0IHMyaW9fbmljICpuaWMpCi17Ci0Jc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwotCXUxNiBtc2lfY3RybCwgbXNnX3ZhbDsKLQlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWcgPSAmbmljLT5jb25maWc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OwotCXU2NCB2YWw2NCwgdHhfbWF0LCByeF9tYXQ7Ci0JaW50IGksIGVycjsKLQotCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnBpY19jb250cm9sKTsKLQl2YWw2NCAmPSB+QklUKDEpOwotCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnBpY19jb250cm9sKTsKLQotCWVyciA9IHBjaV9lbmFibGVfbXNpKG5pYy0+cGRldik7Ci0JaWYgKGVycikgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBlbmFibGluZyBNU0kgZmFpbGVkXG4iLAotCQkJICBuaWMtPmRldi0+bmFtZSk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgTVNJIGFuZCB1c2UgTVNJLTEgaW4gc3RlYWQgb2YgdGhlIHN0YW5kYXJkIE1TSS0wCi0JICogZm9yIGludGVycnVwdCBoYW5kbGluZy4KLQkgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChuaWMtPnBkZXYsIDB4NGMsICZtc2dfdmFsKTsKLQltc2dfdmFsIF49IDB4MTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQobmljLT5wZGV2LCAweDRjLCBtc2dfdmFsKTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChuaWMtPnBkZXYsIDB4NGMsICZtc2dfdmFsKTsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKG5pYy0+cGRldiwgMHg0MiwgJm1zaV9jdHJsKTsKLQltc2lfY3RybCB8PSAweDEwOwotCXBjaV93cml0ZV9jb25maWdfd29yZChuaWMtPnBkZXYsIDB4NDIsIG1zaV9jdHJsKTsKLQotCS8qIHByb2dyYW0gTVNJLTEgaW50byBhbGwgdXNhYmxlIFR4X01hdCBhbmQgUnhfTWF0IGZpZWxkcyAqLwotCXR4X21hdCA9IHJlYWRxKCZiYXIwLT50eF9tYXQwX25bMF0pOwotCWZvciAoaT0wOyBpPGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgewotCQl0eF9tYXQgfD0gVFhfTUFUX1NFVChpLCAxKTsKLQl9Ci0Jd3JpdGVxKHR4X21hdCwgJmJhcjAtPnR4X21hdDBfblswXSk7Ci0KLQlyeF9tYXQgPSByZWFkcSgmYmFyMC0+cnhfbWF0KTsKLQlmb3IgKGk9MDsgaTxjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKLQkJcnhfbWF0IHw9IFJYX01BVF9TRVQoaSwgMSk7Ci0JfQotCXdyaXRlcShyeF9tYXQsICZiYXIwLT5yeF9tYXQpOwotCi0JZGV2LT5pcnEgPSBuaWMtPnBkZXYtPmlycTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzMmlvX2VuYWJsZV9tc2lfeChzdHJ1Y3QgczJpb19uaWMgKm5pYykKIHsKIAlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CkBAIC00MDAxLDYgKzM4OTMsNyBAQAogCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCWludCBvZmZsb2FkX3R5cGU7CisJc3RydWN0IHN3U3RhdCAqc3RhdHMgPSAmc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQ7CiAKIAltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CiAJY29uZmlnID0gJnNwLT5jb25maWc7CkBAIC00MDg1LDExICszOTc4LDE4IEBACiAJCXR4ZHAtPkJ1ZmZlcl9Qb2ludGVyID0gcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsCiAJCQkJCXNwLT51Zm9faW5fYmFuZF92LAogCQkJCQlzaXplb2YodTY0KSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWlmKCh0eGRwLT5CdWZmZXJfUG9pbnRlciA9PSAwKSB8fAorCQkJKHR4ZHAtPkJ1ZmZlcl9Qb2ludGVyID09IERNQV9FUlJPUl9DT0RFKSkKKwkJCWdvdG8gcGNpX21hcF9mYWlsZWQ7CiAJCXR4ZHArKzsKIAl9CiAKIAl0eGRwLT5CdWZmZXJfUG9pbnRlciA9IHBjaV9tYXBfc2luZ2xlCiAJICAgIChzcC0+cGRldiwgc2tiLT5kYXRhLCBmcmdfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZigodHhkcC0+QnVmZmVyX1BvaW50ZXIgPT0gMCkgfHwKKwkJKHR4ZHAtPkJ1ZmZlcl9Qb2ludGVyID09IERNQV9FUlJPUl9DT0RFKSkKKwkJZ290byBwY2lfbWFwX2ZhaWxlZDsKKwogCXR4ZHAtPkhvc3RfQ29udHJvbCA9ICh1bnNpZ25lZCBsb25nKSBza2I7CiAJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9CVUZGRVIwX1NJWkUoZnJnX2xlbik7CiAJaWYgKG9mZmxvYWRfdHlwZSA9PSBTS0JfR1NPX1VEUCkKQEAgLTQxNDYsNiArNDA0NiwxMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKK3BjaV9tYXBfZmFpbGVkOgorCXN0YXRzLT5wY2lfbWFwX2ZhaWxfY250Kys7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXN0YXRzLT5tZW1fZnJlZWQgKz0gc2tiLT50cnVlc2l6ZTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTQxODYsMzkgKzQwOTMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgczJpb19tc2lfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKLQlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwotCWludCBpOwotCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7Ci0Jc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwotCi0JYXRvbWljX2luYygmc3AtPmlzcl9jbnQpOwotCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKLQljb25maWcgPSAmc3AtPmNvbmZpZzsKLQlEQkdfUFJJTlQoSU5UUl9EQkcsICIlczogTVNJIGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkvKiBJZiBJbnRyIGlzIGJlY2F1c2Ugb2YgUnggVHJhZmZpYyAqLwotCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspCi0JCXJ4X2ludHJfaGFuZGxlcigmbWFjX2NvbnRyb2wtPnJpbmdzW2ldKTsKLQotCS8qIElmIEludHIgaXMgYmVjYXVzZSBvZiBUeCBUcmFmZmljICovCi0JZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykKLQkJdHhfaW50cl9oYW5kbGVyKCZtYWNfY29udHJvbC0+Zmlmb3NbaV0pOwotCi0JLyoKLQkgKiBJZiB0aGUgUnggYnVmZmVyIGNvdW50IGlzIGJlbG93IHRoZSBwYW5pYyB0aHJlc2hvbGQgdGhlbgotCSAqIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXRzZWxmLAotCSAqIGVsc2Ugc2NoZWR1bGUgYSB0YXNrbGV0IHRvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykKLQkJczJpb19jaGtfcnhfYnVmZmVycyhzcCwgaSk7Ci0KLQlhdG9taWNfZGVjKCZzcC0+aXNyX2NudCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCiBzdGF0aWMgaXJxcmV0dXJuX3QgczJpb19tc2l4X3JpbmdfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgcmluZ19pbmZvICpyaW5nID0gKHN0cnVjdCByaW5nX2luZm8gKilkZXZfaWQ7CkBAIC00OTI3LDE5ICs0ODAxLDE3IEBACiAJCWVyaW5nLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9ERVNDXzE7CiAJZWxzZSBpZiAoc3AtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNCKQogCQllcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBNQVhfUlhfREVTQ18yOwotCWVsc2UgaWYgKHNwLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8zQSkKLQkJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gTUFYX1JYX0RFU0NfMzsKIAogCWVyaW5nLT50eF9tYXhfcGVuZGluZyA9IE1BWF9UWF9ERVNDOwotCWZvciAoaSA9IDAgOyBpIDwgc3AtPmNvbmZpZy50eF9maWZvX251bSA7IGkrKykgeworCWZvciAoaSA9IDAgOyBpIDwgc3AtPmNvbmZpZy50eF9maWZvX251bSA7IGkrKykgCiAJCXR4X2Rlc2NfY291bnQgKz0gc3AtPmNvbmZpZy50eF9jZmdbaV0uZmlmb19sZW47Ci0JfQorCQogCURCR19QUklOVChJTkZPX0RCRywiXG5tYXggdHhkcyA6ICVkXG4iLHNwLT5jb25maWcubWF4X3R4ZHMpOwogCWVyaW5nLT50eF9wZW5kaW5nID0gdHhfZGVzY19jb3VudDsKIAlyeF9kZXNjX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwIDsgaSA8IHNwLT5jb25maWcucnhfcmluZ19udW0gOyBpKyspIHsKKwlmb3IgKGkgPSAwIDsgaSA8IHNwLT5jb25maWcucnhfcmluZ19udW0gOyBpKyspIAogCQlyeF9kZXNjX2NvdW50ICs9IHNwLT5jb25maWcucnhfY2ZnW2ldLm51bV9yeGQ7Ci0JfQorCiAJZXJpbmctPnJ4X3BlbmRpbmcgPSByeF9kZXNjX2NvdW50OwogCiAJZXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOwpAQCAtNTkyMyw2ICs1Nzk1LDcgQEAKIAllbHNlCiAJCXRtcF9zdGF0c1tpKytdID0gMDsKIAl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NfZmFpbF9jbnQ7CisJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQucGNpX21hcF9mYWlsX2NudDsKIAl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC53YXRjaGRvZ190aW1lcl9jbnQ7CiAJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQubWVtX2FsbG9jYXRlZDsKIAl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5tZW1fZnJlZWQ7CkBAIC02MjY2LDkgKzYxMzksMTAgQEAKIAkJCQl1NjQgKnRlbXAyLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19saXN0OworCXN0cnVjdCBzd1N0YXQgKnN0YXRzID0gJnNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0OwogCiAJaWYgKChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfMSkgJiYgKHJ4ZHAtPkhvc3RfQ29udHJvbCA9PSAwKSkgeworCQlzdHJ1Y3QgUnhEMSAqcnhkcDEgPSAoc3RydWN0IFJ4RDEgKilyeGRwOwogCQkvKiBhbGxvY2F0ZSBza2IgKi8KIAkJaWYgKCpza2IpIHsKIAkJCURCR19QUklOVChJTkZPX0RCRywgIlNLQiBpcyBub3QgTlVMTFxuIik7CkBAIC02Mjc3LDcgKzYxNTEsNyBAQAogCQkJICogdXNpbmcgc2FtZSBtYXBwZWQgYWRkcmVzcyBmb3IgdGhlIFJ4ZAogCQkJICogYnVmZmVyIHBvaW50ZXIKIAkJCSAqLwotCQkJKChzdHJ1Y3QgUnhEMSopcnhkcCktPkJ1ZmZlcjBfcHRyID0gKnRlbXAwOworCQkJcnhkcDEtPkJ1ZmZlcjBfcHRyID0gKnRlbXAwOwogCQl9IGVsc2UgewogCQkJKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CiAJCQlpZiAoISgqc2tiKSkgewpAQCAtNjI5NCwxOCArNjE2OCwyMyBAQAogCQkJICogc3VjaCBpdCB3aWxsIGJlIHVzZWQgZm9yIG5leHQgcnhkIHdob3NlCiAJCQkgKiBIb3N0IENvbnRyb2wgaXMgTlVMTAogCQkJICovCi0JCQkoKHN0cnVjdCBSeEQxKilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQorCQkJcnhkcDEtPkJ1ZmZlcjBfcHRyID0gKnRlbXAwID0KIAkJCQlwY2lfbWFwX3NpbmdsZSggc3AtPnBkZXYsICgqc2tiKS0+ZGF0YSwKIAkJCQkJc2l6ZSAtIE5FVF9JUF9BTElHTiwKIAkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWlmKCAocnhkcDEtPkJ1ZmZlcjBfcHRyID09IDApIHx8CisJCQkJKHJ4ZHAxLT5CdWZmZXIwX3B0ciA9PSBETUFfRVJST1JfQ09ERSkpIHsKKwkJCQlnb3RvIG1lbWFsbG9jX2ZhaWxlZDsKKwkJCX0KIAkJCXJ4ZHAtPkhvc3RfQ29udHJvbCA9ICh1bnNpZ25lZCBsb25nKSAoKnNrYik7CiAJCX0KIAl9IGVsc2UgaWYgKChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpICYmIChyeGRwLT5Ib3N0X0NvbnRyb2wgPT0gMCkpIHsKKwkJc3RydWN0IFJ4RDMgKnJ4ZHAzID0gKHN0cnVjdCBSeEQzICopcnhkcDsKIAkJLyogVHdvIGJ1ZmZlciBNb2RlICovCiAJCWlmICgqc2tiKSB7Ci0JCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDI7Ci0JCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDA7Ci0JCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDE7CisJCQlyeGRwMy0+QnVmZmVyMl9wdHIgPSAqdGVtcDI7CisJCQlyeGRwMy0+QnVmZmVyMF9wdHIgPSAqdGVtcDA7CisJCQlyeGRwMy0+QnVmZmVyMV9wdHIgPSAqdGVtcDE7CiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKIAkJCWlmICghKCpza2IpKSB7CkBAIC02MzE4LDczICs2MTk3LDQ3IEBACiAJCQl9CiAJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkIAogCQkJCSs9ICgqc2tiKS0+dHJ1ZXNpemU7Ci0JCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDIgPQorCQkJcnhkcDMtPkJ1ZmZlcjJfcHRyID0gKnRlbXAyID0KIAkJCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgKCpza2IpLT5kYXRhLAogCQkJCQkgICAgICAgZGV2LT5tdHUgKyA0LAogCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9ICp0ZW1wMCA9CisJCQlpZiggKHJ4ZHAzLT5CdWZmZXIyX3B0ciA9PSAwKSB8fAorCQkJCShyeGRwMy0+QnVmZmVyMl9wdHIgPT0gRE1BX0VSUk9SX0NPREUpKSB7CisJCQkJZ290byBtZW1hbGxvY19mYWlsZWQ7CisJCQl9CisJCQlyeGRwMy0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQogCQkJCXBjaV9tYXBfc2luZ2xlKCBzcC0+cGRldiwgYmEtPmJhXzAsIEJVRjBfTEVOLAogCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWlmKCAocnhkcDMtPkJ1ZmZlcjBfcHRyID09IDApIHx8CisJCQkJKHJ4ZHAzLT5CdWZmZXIwX3B0ciA9PSBETUFfRVJST1JfQ09ERSkpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlIChzcC0+cGRldiwKKwkJCQkJKGRtYV9hZGRyX3QpKCpza2IpLT5kYXRhLAorCQkJCQlkZXYtPm10dSArIDQsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZ290byBtZW1hbGxvY19mYWlsZWQ7CisJCQl9CiAJCQlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgKCpza2IpOwogCiAJCQkvKiBCdWZmZXItMSB3aWxsIGJlIGR1bW15IGJ1ZmZlciBub3QgdXNlZCAqLwotCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyID0gKnRlbXAxID0KKwkJCXJ4ZHAzLT5CdWZmZXIxX3B0ciA9ICp0ZW1wMSA9CiAJCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsIGJhLT5iYV8xLCBCVUYxX0xFTiwKLQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCX0KLQl9IGVsc2UgaWYgKChyeGRwLT5Ib3N0X0NvbnRyb2wgPT0gMCkpIHsKLQkJLyogVGhyZWUgYnVmZmVyIG1vZGUgKi8KLQkJaWYgKCpza2IpIHsKLQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9ICp0ZW1wMDsKLQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIxX3B0ciA9ICp0ZW1wMTsKLQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9ICp0ZW1wMjsKLQkJfSBlbHNlIHsKLQkJCSpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOwotCQkJaWYgKCEoKnNrYikpIHsKLQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogT3V0IG9mICIsIGRldi0+bmFtZSk7Ci0JCQkJREJHX1BSSU5UKElORk9fREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlICIpOwotCQkJCURCR19QUklOVChJTkZPX0RCRywgIjMgYnVmIG1vZGUgU0tCc1xuIik7Ci0JCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuIFwKLQkJCQkJbWVtX2FsbG9jX2ZhaWxfY250Kys7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkIAotCQkJCSs9ICgqc2tiKS0+dHJ1ZXNpemU7Ci0JCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQotCQkJCXBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCBiYS0+YmFfMCwgQlVGMF9MRU4sCi0JCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJLyogQnVmZmVyLTEgcmVjZWl2ZXMgTDMvTDQgaGVhZGVycyAqLwotCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyID0gKnRlbXAxID0KLQkJCQlwY2lfbWFwX3NpbmdsZSggc3AtPnBkZXYsICgqc2tiKS0+ZGF0YSwKLQkJCQkJCWwzbDRoZHJfc2l6ZSArIDQsCiAJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJLyoKLQkJCSAqIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0IHdpbGwgaGF2ZSBMNAotCQkJICogZGF0YSBwYXlsb2FkCi0JCQkgKi8KLQkJCXNrYl9zaGluZm8oKnNrYiktPmZyYWdfbGlzdCA9IGRldl9hbGxvY19za2IoZGV2LT5tdHUgKwotCQkJCQkJCQkgICBBTElHTl9TSVpFKTsKLQkJCWlmIChza2Jfc2hpbmZvKCpza2IpLT5mcmFnX2xpc3QgPT0gTlVMTCkgewotCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IGRldl9hbGxvY19za2IgXAotCQkJCQkgIGZhaWxlZFxuICIsIGRldi0+bmFtZSk7Ci0JCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuIFwKLQkJCQkJbWVtX2FsbG9jX2ZhaWxfY250Kys7Ci0JCQkJcmV0dXJuIC1FTk9NRU0gOworCQkJaWYoIChyeGRwMy0+QnVmZmVyMV9wdHIgPT0gMCkgfHwKKwkJCQkocnhkcDMtPkJ1ZmZlcjFfcHRyID09IERNQV9FUlJPUl9DT0RFKSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUgKHNwLT5wZGV2LAorCQkJCQkoZG1hX2FkZHJfdCkoKnNrYiktPmRhdGEsCisJCQkJCWRldi0+bXR1ICsgNCwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlnb3RvIG1lbWFsbG9jX2ZhaWxlZDsKIAkJCX0KLQkJCWZyYWdfbGlzdCA9IHNrYl9zaGluZm8oKnNrYiktPmZyYWdfbGlzdDsKLQkJCWZyYWdfbGlzdC0+bmV4dCA9IE5VTEw7Ci0JCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkIAotCQkJCSs9IGZyYWdfbGlzdC0+dHJ1ZXNpemU7Ci0JCQkvKgotCQkJICogQnVmZmVyLTIgcmVjZWl2ZXMgTDQgZGF0YSBwYXlsb2FkCi0JCQkgKi8KLQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9ICp0ZW1wMiA9Ci0JCQkJcGNpX21hcF9zaW5nbGUoIHNwLT5wZGV2LCBmcmFnX2xpc3QtPmRhdGEsCi0JCQkJCQlkZXYtPm10dSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKKwltZW1hbGxvY19mYWlsZWQ6CisJCXN0YXRzLT5wY2lfbWFwX2ZhaWxfY250Kys7CisJCXN0YXRzLT5tZW1fZnJlZWQgKz0gKCpza2IpLT50cnVlc2l6ZTsKKwkJZGV2X2tmcmVlX3NrYigqc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CiB9CisKIHN0YXRpYyB2b2lkIHNldF9yeGRfYnVmZmVyX3NpemUoc3RydWN0IHMyaW9fbmljICpzcCwgc3RydWN0IFJ4RF90ICpyeGRwLAogCQkJCWludCBzaXplKQogewpAQCAtNjM5NSwxMCArNjI0OCw2IEBACiAJCXJ4ZHAtPkNvbnRyb2xfMiA9IFNFVF9CVUZGRVIwX1NJWkVfMyhCVUYwX0xFTik7CiAJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMV9TSVpFXzMoMSk7CiAJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMl9TSVpFXzMoIGRldi0+bXR1ICsgNCk7Ci0JfSBlbHNlIHsKLQkJcnhkcC0+Q29udHJvbF8yID0gU0VUX0JVRkZFUjBfU0laRV8zKEJVRjBfTEVOKTsKLQkJcnhkcC0+Q29udHJvbF8yIHw9IFNFVF9CVUZGRVIxX1NJWkVfMyhsM2w0aGRyX3NpemUgKyA0KTsKLQkJcnhkcC0+Q29udHJvbF8yIHw9IFNFVF9CVUZGRVIyX1NJWkVfMyhkZXYtPm10dSk7CiAJfQogfQogCkBAIC02NDIwLDggKzYyNjksNiBAQAogCQlzaXplICs9IE5FVF9JUF9BTElHTjsKIAllbHNlIGlmIChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpCiAJCXNpemUgPSBkZXYtPm10dSArIEFMSUdOX1NJWkUgKyBCVUYwX0xFTiArIDQ7Ci0JZWxzZQotCQlzaXplID0gbDNsNGhkcl9zaXplICsgQUxJR05fU0laRSArIEJVRjBfTEVOICsgNDsKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKIAkJYmxrX2NudCA9IGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLwpAQCAtNjQzMSw3ICs2Mjc4LDcgQEAKIAkJCWZvciAoayA9IDA7IGsgPCByeGRfY291bnRbc3AtPnJ4ZF9tb2RlXTsgaysrKSB7CiAJCQkJcnhkcCA9IG1hY19jb250cm9sLT5yaW5nc1tpXS4KIAkJCQkJcnhfYmxvY2tzW2pdLnJ4ZHNba10udmlydF9hZGRyOwotCQkJCWlmKHNwLT5yeGRfbW9kZSA+PSBSWERfTU9ERV8zQSkKKwkJCQlpZihzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpCiAJCQkJCWJhID0gJm1hY19jb250cm9sLT5yaW5nc1tpXS5iYVtqXVtrXTsKIAkJCQlpZiAoc2V0X3J4ZF9idWZmZXJfcG9pbnRlcihzcCwgcnhkcCwgYmEsCiAJCQkJCQkgICAgICAgJnNrYiwodTY0ICopJnRlbXAwXzY0LApAQCAtNjQ1OCw5ICs2MzA1LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChzcC0+aW50cl90eXBlID09IE1TSSkKLQkJcmV0ID0gczJpb19lbmFibGVfbXNpKHNwKTsKLQllbHNlIGlmIChzcC0+aW50cl90eXBlID09IE1TSV9YKQorCWlmIChzcC0+aW50cl90eXBlID09IE1TSV9YKQogCQlyZXQgPSBzMmlvX2VuYWJsZV9tc2lfeChzcCk7CiAJaWYgKHJldCkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBEZWZhdWx0aW5nIHRvIElOVEFcbiIsIGRldi0+bmFtZSk7CkBAIC02NDcxLDE2ICs2MzE2LDYgQEAKIAlzdG9yZV94bXNpX2RhdGEoc3ApOwogCiAJLyogQWZ0ZXIgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIEgvVywgcmVnaXN0ZXIgSVNSICovCi0JaWYgKHNwLT5pbnRyX3R5cGUgPT0gTVNJKSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKChpbnQpIHNwLT5wZGV2LT5pcnEsIHMyaW9fbXNpX2hhbmRsZSwKLQkJCUlSUUZfU0hBUkVELCBzcC0+bmFtZSwgZGV2KTsKLQkJaWYgKGVycikgewotCQkJcGNpX2Rpc2FibGVfbXNpKHNwLT5wZGV2KTsKLQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE1TSSByZWdpc3RyYXRpb24gZmFpbGVkXG4iLAotCQkJCSAgZGV2LT5uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KIAlpZiAoc3AtPmludHJfdHlwZSA9PSBNU0lfWCkgewogCQlpbnQgaSwgbXNpeF90eF9jbnQ9MCxtc2l4X3J4X2NudD0wOwogCkBAIC02NTY3LDE0ICs2NDAyLDYgQEAKIAkJcGNpX2Rpc2FibGVfbXNpeChzcC0+cGRldik7CiAJfSBlbHNlIHsKIAkJZnJlZV9pcnEoc3AtPnBkZXYtPmlycSwgZGV2KTsKLQkJaWYgKHNwLT5pbnRyX3R5cGUgPT0gTVNJKSB7Ci0JCQl1MTYgdmFsOwotCi0JCQlwY2lfZGlzYWJsZV9tc2koc3AtPnBkZXYpOwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIDB4NGMsICZ2YWwpOwotCQkJdmFsIF49IDB4MTsKLQkJCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgMHg0YywgdmFsKTsKLQkJfQogCX0KIAkvKiBXYWl0aW5nIHRpbGwgYWxsIEludGVycnVwdCBoYW5kbGVycyBhcmUgY29tcGxldGUgKi8KIAljbnQgPSAwOwpAQCAtNjkwNyw2ICs2NzM0LDcgQEAKIAl9CiAKIAkvKiBVcGRhdGluZyBzdGF0aXN0aWNzICovCisJc3AtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAwOwogCWlmIChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfMSkgewogCQlpbnQgbGVuID0gUlhEX0dFVF9CVUZGRVIwX1NJWkVfMShyeGRwLT5Db250cm9sXzIpOwpAQCAtNjkxNCw3ICs2NzQyLDcgQEAKIAkJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJc2tiX3B1dChza2IsIGxlbik7CiAKLQl9IGVsc2UgaWYgKHNwLT5yeGRfbW9kZSA+PSBSWERfTU9ERV8zQSkgeworCX0gZWxzZSBpZiAoc3AtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNCKSB7CiAJCWludCBnZXRfYmxvY2sgPSByaW5nX2RhdGEtPnJ4X2N1cnJfZ2V0X2luZm8uYmxvY2tfaW5kZXg7CiAJCWludCBnZXRfb2ZmID0gcmluZ19kYXRhLT5yeF9jdXJyX2dldF9pbmZvLm9mZnNldDsKIAkJaW50IGJ1ZjBfbGVuID0gUlhEX0dFVF9CVUZGRVIwX1NJWkVfMyhyeGRwLT5Db250cm9sXzIpOwpAQCAtNjkyNCwxOCArNjc1Miw3IEBACiAJCXN0cnVjdCBidWZmQWRkICpiYSA9ICZyaW5nX2RhdGEtPmJhW2dldF9ibG9ja11bZ2V0X29mZl07CiAJCXNwLT5zdGF0cy5yeF9ieXRlcyArPSBidWYwX2xlbiArIGJ1ZjJfbGVuOwogCQltZW1jcHkoYnVmZiwgYmEtPmJhXzAsIGJ1ZjBfbGVuKTsKLQotCQlpZiAoc3AtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNBKSB7Ci0JCQlpbnQgYnVmMV9sZW4gPSBSWERfR0VUX0JVRkZFUjFfU0laRV8zKHJ4ZHAtPkNvbnRyb2xfMik7Ci0KLQkJCXNrYl9wdXQoc2tiLCBidWYxX2xlbik7Ci0JCQlza2ItPmxlbiArPSBidWYyX2xlbjsKLQkJCXNrYi0+ZGF0YV9sZW4gKz0gYnVmMl9sZW47Ci0JCQlza2JfcHV0KHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0LCBidWYyX2xlbik7Ci0JCQlzcC0+c3RhdHMucnhfYnl0ZXMgKz0gYnVmMV9sZW47Ci0KLQkJfSBlbHNlCi0JCQlza2JfcHV0KHNrYiwgYnVmMl9sZW4pOworCQlza2JfcHV0KHNrYiwgYnVmMl9sZW4pOwogCX0KIAogCWlmICgocnhkcC0+Q29udHJvbF8xICYgVENQX09SX1VEUF9GUkFNRSkgJiYgKCghc3AtPmxybykgfHwKQEAgLTcxMzEsNyArNjk0OCw3IEBACiAJCSpkZXZfaW50cl90eXBlID0gSU5UQTsKIAl9CiAjZWxzZQotCWlmICgqZGV2X2ludHJfdHlwZSA+IE1TSV9YKSB7CisJaWYgKCgqZGV2X2ludHJfdHlwZSAhPSBJTlRBKSAmJiAoKmRldl9pbnRyX3R5cGUgIT0gTVNJX1gpKSB7CiAJCURCR19QUklOVChFUlJfREJHLCAiczJpbzogV3JvbmcgaW50cl90eXBlIHJlcXVlc3RlZC4gIgogCQkJICAiRGVmYXVsdGluZyB0byBJTlRBXG4iKTsKIAkJKmRldl9pbnRyX3R5cGUgPSBJTlRBOwpAQCAtNzE0NSwxMCArNjk2MiwxMCBAQAogCQkqZGV2X2ludHJfdHlwZSA9IElOVEE7CiAJfQogCi0JaWYgKHJ4X3JpbmdfbW9kZSA+IDMpIHsKKwlpZiAoKHJ4X3JpbmdfbW9kZSAhPSAxKSAmJiAocnhfcmluZ19tb2RlICE9IDIpKSB7CiAJCURCR19QUklOVChFUlJfREJHLCAiczJpbzogUmVxdWVzdGVkIHJpbmcgbW9kZSBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICJzMmlvOiBEZWZhdWx0aW5nIHRvIDMtYnVmZmVyIG1vZGVcbiIpOwotCQlyeF9yaW5nX21vZGUgPSAzOworCQlEQkdfUFJJTlQoRVJSX0RCRywgInMyaW86IERlZmF1bHRpbmcgdG8gMS1idWZmZXIgbW9kZVxuIik7CisJCXJ4X3JpbmdfbW9kZSA9IDE7CiAJfQogCXJldHVybiBTVUNDRVNTOwogfQpAQCAtNzI0MCwyOCArNzA1NywxMCBAQAogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlpZiAoZGV2X2ludHJfdHlwZSAhPSBNU0lfWCkgewotCQlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBzMmlvX2RyaXZlcl9uYW1lKSkgewotCQkJREJHX1BSSU5UKEVSUl9EQkcsICJSZXF1ZXN0IFJlZ2lvbnMgZmFpbGVkXG4iKTsKLQkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAoIShyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAotICAgICAgICAgICAgICAgCSAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCksIHMyaW9fZHJpdmVyX25hbWUpKSkgewotCQkJREJHX1BSSU5UKEVSUl9EQkcsICJiYXIwIFJlcXVlc3QgUmVnaW9ucyBmYWlsZWRcbiIpOwotCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLSAgICAgICAgCWlmICghKHJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCi0gICAgICAgICAgICAgICAJICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSwgczJpb19kcml2ZXJfbmFtZSkpKSB7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgImJhcjEgUmVxdWVzdCBSZWdpb25zIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOwotCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwlpZiAoKHJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgczJpb19kcml2ZXJfbmFtZSkpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFJlcXVlc3QgUmVnaW9ucyBmYWlsZWQgLSAleCBcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHMyaW9fbmljKSk7CkBAIC03Mjg4LDggKzcwODcsNiBAQAogCQlzcC0+cnhkX21vZGUgPSBSWERfTU9ERV8xOwogCWlmIChyeF9yaW5nX21vZGUgPT0gMikKIAkJc3AtPnJ4ZF9tb2RlID0gUlhEX01PREVfM0I7Ci0JaWYgKHJ4X3JpbmdfbW9kZSA9PSAzKQotCQlzcC0+cnhkX21vZGUgPSBSWERfTU9ERV8zQTsKIAogCXNwLT5pbnRyX3R5cGUgPSBkZXZfaW50cl90eXBlOwogCkBAIC03NTY1LDEwICs3MzYyLDYgQEAKIAkJICAgIERCR19QUklOVChFUlJfREJHLCAiJXM6IDItQnVmZmVyIHJlY2VpdmUgbW9kZSBlbmFibGVkXG4iLAogCQkJCQkJZGV2LT5uYW1lKTsKIAkJICAgIGJyZWFrOwotCQljYXNlIFJYRF9NT0RFXzNBOgotCQkgICAgREJHX1BSSU5UKEVSUl9EQkcsICIlczogMy1CdWZmZXIgcmVjZWl2ZSBtb2RlIGVuYWJsZWRcbiIsCi0JCQkJCQlkZXYtPm5hbWUpOwotCQkgICAgYnJlYWs7CiAJfQogCiAJaWYgKG5hcGkpCkBAIC03NTc3LDkgKzczNzAsNiBAQAogCQljYXNlIElOVEE6CiAJCSAgICBEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBJbnRlcnJ1cHQgdHlwZSBJTlRBXG4iLCBkZXYtPm5hbWUpOwogCQkgICAgYnJlYWs7Ci0JCWNhc2UgTVNJOgotCQkgICAgREJHX1BSSU5UKEVSUl9EQkcsICIlczogSW50ZXJydXB0IHR5cGUgTVNJXG4iLCBkZXYtPm5hbWUpOwotCQkgICAgYnJlYWs7CiAJCWNhc2UgTVNJX1g6CiAJCSAgICBEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBJbnRlcnJ1cHQgdHlwZSBNU0ktWFxuIiwgZGV2LT5uYW1lKTsKIAkJICAgIGJyZWFrOwpAQCAtNzYxOSwxNCArNzQwOSw3IEBACiAgICAgICBtZW1fYWxsb2NfZmFpbGVkOgogCWZyZWVfc2hhcmVkX21lbShzcCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCWlmIChkZXZfaW50cl90eXBlICE9IE1TSV9YKQotCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCWVsc2UgewotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAotCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCi0JCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpKTsKLQl9CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJZnJlZV9uZXRkZXYoZGV2KTsKIApAQCAtNzY2MSwxNCArNzQ0NCw3IEBACiAJZnJlZV9zaGFyZWRfbWVtKHNwKTsKIAlpb3VubWFwKHNwLT5iYXIwKTsKIAlpb3VubWFwKHNwLT5iYXIxKTsKLQlpZiAoc3AtPmludHJfdHlwZSAhPSBNU0lfWCkKLQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLQllbHNlIHsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOwotCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAotCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7Ci0JfQorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWZyZWVfbmV0ZGV2KGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5oIGIvZHJpdmVycy9uZXQvczJpby5oCmluZGV4IDM4ODdmZTYuLjkyOTgzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLmgKQEAgLTc0LDYgKzc0LDEwIEBACiAvKiBERUJVRyBtZXNzYWdlIHByaW50LiAqLwogI2RlZmluZSBEQkdfUFJJTlQoZGJnX2xldmVsLCBhcmdzLi4uKSAgaWYoIShkZWJ1Z19sZXZlbDxkYmdfbGV2ZWwpKSBwcmludGsoYXJncykKIAorI2lmbmRlZiBETUFfRVJST1JfQ09ERQorI2RlZmluZSBETUFfRVJST1JfQ09ERSAgICAgICAgICAofihkbWFfYWRkcl90KTB4MCkKKyNlbmRpZgorCiAvKiBQcm90b2NvbCBhc3Npc3QgZmVhdHVyZXMgb2YgdGhlIE5JQyAqLwogI2RlZmluZSBMM19DS1NVTV9PSyAweEZGRkYKICNkZWZpbmUgTDRfQ0tTVU1fT0sgMHhGRkZGCkBAIC05Nyw2ICsxMDEsNyBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBudW1fYWdncmVnYXRpb25zOwogCS8qIE90aGVyIHN0YXRpc3RpY3MgKi8KIAl1bnNpZ25lZCBsb25nIGxvbmcgbWVtX2FsbG9jX2ZhaWxfY250OworCXVuc2lnbmVkIGxvbmcgbG9uZyBwY2lfbWFwX2ZhaWxfY250OwogCXVuc2lnbmVkIGxvbmcgbG9uZyB3YXRjaGRvZ190aW1lcl9jbnQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9hbGxvY2F0ZWQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9mcmVlZDsKQEAgLTU3NSw4ICs1ODAsNyBAQAogI2RlZmluZSBTSVpFX09GX0JMT0NLCTQwOTYKIAogI2RlZmluZSBSWERfTU9ERV8xCTAgLyogT25lIEJ1ZmZlciBtb2RlICovCi0jZGVmaW5lIFJYRF9NT0RFXzNBCTEgLyogVGhyZWUgQnVmZmVyIG1vZGUgKi8KLSNkZWZpbmUgUlhEX01PREVfM0IJMiAvKiBUd28gQnVmZmVyIG1vZGUgKi8KKyNkZWZpbmUgUlhEX01PREVfM0IJMSAvKiBUd28gQnVmZmVyIG1vZGUgKi8KIAogLyogU3RydWN0dXJlIHRvIGhvbGQgdmlydHVhbCBhZGRyZXNzZXMgb2YgQnVmMCBhbmQgQnVmMSBpbgogICogMmJ1ZiBtb2RlLiAqLwpAQCAtODc2LDcgKzg4MCw2IEBACiAJdTE2CQlscm9fbWF4X2FnZ3JfcGVyX3Nlc3M7CiAKICNkZWZpbmUgSU5UQQkwCi0jZGVmaW5lIE1TSQkxCiAjZGVmaW5lIE1TSV9YCTIKIAl1OCBpbnRyX3R5cGU7CiAKQEAgLTEwMjAsOCArMTAyMyw2IEBACiBzdGF0aWMgdm9pZCBzMmlvX2luaXRfcGNpKHN0cnVjdCBzMmlvX25pYyAqIHNwKTsKIHN0YXRpYyBpbnQgczJpb19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKiBhZGRyKTsKIHN0YXRpYyB2b2lkIHMyaW9fYWxhcm1faGFuZGxlKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgaW50IHMyaW9fZW5hYmxlX21zaShzdHJ1Y3QgczJpb19uaWMgKm5pYyk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgczJpb19tc2lfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QKIHMyaW9fbXNpeF9yaW5nX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIGlycXJldHVybl90CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwppbmRleCBlNDczNmEzLi4xMmUwMWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKQEAgLTQzLDEwICs0Myw2IEBACiAKICN1bmRlZiBERUJVRwogCi0jZGVmaW5lIERSVl9ERVNDICJRRSBVQ0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIgotI2RlZmluZSBEUlZfTkFNRSAidWNjX2dldGgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIxLjEiCi0KICNkZWZpbmUgdWdldGhfcHJpbnRrKGxldmVsLCBmb3JtYXQsIGFyZy4uLikgIFwKICAgICAgICAgcHJpbnRrKGxldmVsIGZvcm1hdCAiXG4iLCAjIyBhcmcpCiAKQEAgLTY0LDkgKzYwLDE5IEBACiAjZWxzZQogI2RlZmluZSB1Z2V0aF92ZGJnKGZtdCwgYXJncy4uLikgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCQkJCS8qIFVHRVRIX1ZFUkJPU0VfREVCVUcgKi8KKyNkZWZpbmUgVUdFVEhfTVNHX0RFRkFVTFQJKE5FVElGX01TR19JRlVQIDw8IDEgKSAtIDEKIAordm9pZCB1ZWNfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworCQogc3RhdGljIERFRklORV9TUElOTE9DSyh1Z2V0aF9sb2NrKTsKIAorc3RhdGljIHN0cnVjdCB7CisJdTMyIG1zZ19lbmFibGU7Cit9IGRlYnVnID0geyAtMSB9OworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRlYnVnLm1zZ19lbmFibGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgdmVyYm9zaXR5IGxldmVsICgwPW5vbmUsIC4uLiwgMHhmZmZmPWFsbCkiKTsKKwogc3RhdGljIHN0cnVjdCB1Y2NfZ2V0aF9pbmZvIHVnZXRoX3ByaW1hcnlfaW5mbyA9IHsKIAkudWZfaW5mbyA9IHsKIAkJICAgIC5iZF9tZW1fcGFydCA9IE1FTV9QQVJUX1NZU1RFTSwKQEAgLTEwNCw2ICsxMTAsNyBAQAogCS5tYXhSZXRyYW5zbWlzc2lvbiA9IDB4ZiwKIAkuY29sbGlzaW9uV2luZG93ID0gMHgzNywKIAkucmVjZWl2ZUZsb3dDb250cm9sID0gMSwKKwkudHJhbnNtaXRGbG93Q29udHJvbCA9IDEsCiAJLm1heEdyb3VwQWRkckluSGFzaCA9IDQsCiAJLm1heEluZEFkZHJJbkhhc2ggPSA0LAogCS5wcmVsID0gNywKQEAgLTEzOSw3ICsxNDYsOSBAQAogCS5udW1TdGF0aW9uQWRkcmVzc2VzID0gVUNDX0dFVEhfTlVNX09GX1NUQVRJT05fQUREUkVTU0VTXzEsCiAJLmxhcmdlc3RleHRlcm5hbGxvb2t1cGtleXNpemUgPQogCSAgICBRRV9GTFRSX0xBUkdFU1RfRVhURVJOQUxfVEFCTEVfTE9PS1VQX0tFWV9TSVpFX05PTkUsCi0JLnN0YXRpc3RpY3NNb2RlID0gVUNDX0dFVEhfU1RBVElTVElDU19HQVRIRVJJTkdfTU9ERV9OT05FLAorCS5zdGF0aXN0aWNzTW9kZSA9IFVDQ19HRVRIX1NUQVRJU1RJQ1NfR0FUSEVSSU5HX01PREVfSEFSRFdBUkUgfAorCQlVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX0ZJUk1XQVJFX1RYIHwKKwkJVUNDX0dFVEhfU1RBVElTVElDU19HQVRIRVJJTkdfTU9ERV9GSVJNV0FSRV9SWCwKIAkudmxhbk9wZXJhdGlvblRhZ2dlZCA9IFVDQ19HRVRIX1ZMQU5fT1BFUkFUSU9OX1RBR0dFRF9OT1AsCiAJLnZsYW5PcGVyYXRpb25Ob25UYWdnZWQgPSBVQ0NfR0VUSF9WTEFOX09QRVJBVElPTl9OT05fVEFHR0VEX05PUCwKIAkucnhRb1NNb2RlID0gVUNDX0dFVEhfUU9TX01PREVfREVGQVVMVCwKQEAgLTI4MSw3ICsyOTAsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspIHsKIAkJaWYgKChzbnVtID0gcWVfZ2V0X3NudW0oKSkgPCAwKSB7Ci0JCQl1Z2V0aF9lcnIoImZpbGxfaW5pdF9lbmV0X2VudHJpZXM6IENhbiBub3QgZ2V0IFNOVU0uIik7CisJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJCXVnZXRoX2VycigiZmlsbF9pbml0X2VuZXRfZW50cmllczogQ2FuIG5vdCBnZXQgU05VTS4iKTsKIAkJCXJldHVybiBzbnVtOwogCQl9CiAJCWlmICgoaSA9PSAwKSAmJiBza2lwX3BhZ2VfZm9yX2ZpcnN0X2VudHJ5KQpAQCAtMjkxLDggKzMwMSw4IEBACiAJCQlpbml0X2VuZXRfb2Zmc2V0ID0KIAkJCSAgICBxZV9tdXJhbV9hbGxvYyh0aHJlYWRfc2l6ZSwgdGhyZWFkX2FsaWdubWVudCk7CiAJCQlpZiAoSVNfRVJSX1ZBTFVFKGluaXRfZW5ldF9vZmZzZXQpKSB7Ci0JCQkJdWdldGhfZXJyCi0JCSgiZmlsbF9pbml0X2VuZXRfZW50cmllczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkuIik7CisJCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCQkJdWdldGhfZXJyKCJmaWxsX2luaXRfZW5ldF9lbnRyaWVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeS4iKTsKIAkJCQlxZV9wdXRfc251bSgodTgpIHNudW0pOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQpAQCAtMTIwMCw3ICsxMjEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpbml0X2Zsb3dfY29udHJvbF9wYXJhbXModTMyIGF1dG9tYXRpY19mbG93X2NvbnRyb2xfbW9kZSwKK2ludCBpbml0X2Zsb3dfY29udHJvbF9wYXJhbXModTMyIGF1dG9tYXRpY19mbG93X2NvbnRyb2xfbW9kZSwKIAkJCQkgICAgaW50IHJ4X2Zsb3dfY29udHJvbF9lbmFibGUsCiAJCQkJICAgIGludCB0eF9mbG93X2NvbnRyb2xfZW5hYmxlLAogCQkJCSAgICB1MTYgcGF1c2VfcGVyaW9kLApAQCAtMTQ4Niw5ICsxNDk2LDkgQEAKIAogCXJldF92YWwgPSBpbml0X3ByZWFtYmxlX2xlbmd0aCh1Z19pbmZvLT5wcmVsLCAmdWdfcmVncy0+bWFjY2ZnMik7CiAJaWYgKHJldF92YWwgIT0gMCkgewotCQl1Z2V0aF9lcnIKLQkJICAgICgiJXM6IFByZWFtYmxlIGxlbmd0aCBtdXN0IGJlIGJldHdlZW4gMyBhbmQgNyBpbmNsdXNpdmUuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKKwkJCXVnZXRoX2VycigiJXM6IFByZWFtYmxlIGxlbmd0aCBtdXN0IGJlIGJldHdlZW4gMyBhbmQgNyBpbmNsdXNpdmUuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQogCkBAIC0xNzI2LDcgKzE3MzYsOCBAQAogCiAJLyogY2hlY2sgaWYgdGhlIFVDQyBudW1iZXIgaXMgaW4gcmFuZ2UuICovCiAJaWYgKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLnVjY19udW0gPj0gVUNDX01BWF9OVU0pIHsKLQkJdWdldGhfZXJyKCIlczogdWNjX251bSBvdXQgb2YgcmFuZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiB1Y2NfbnVtIG91dCBvZiByYW5nZS4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3NTQsNyArMTc2NSw4IEBACiAKIAkvKiBjaGVjayBpZiB0aGUgVUNDIG51bWJlciBpcyBpbiByYW5nZS4gKi8KIAlpZiAodWdldGgtPnVnX2luZm8tPnVmX2luZm8udWNjX251bSA+PSBVQ0NfTUFYX05VTSkgewotCQl1Z2V0aF9lcnIoIiVzOiB1Y2NfbnVtIG91dCBvZiByYW5nZS4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKKwkJCXVnZXRoX2VycigiJXM6IHVjY19udW0gb3V0IG9mIHJhbmdlLiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjMwNiw3ICsyMzE4LDkgQEAKIAogCWlmICghKCh1Zl9pbmZvLT5iZF9tZW1fcGFydCA9PSBNRU1fUEFSVF9TWVNURU0pIHx8CiAJICAgICAgKHVmX2luZm8tPmJkX21lbV9wYXJ0ID09IE1FTV9QQVJUX01VUkFNKSkpIHsKLQkJdWdldGhfZXJyKCIlczogQmFkIG1lbW9yeSBwYXJ0aXRpb24gdmFsdWUuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBCYWQgbWVtb3J5IHBhcnRpdGlvbiB2YWx1ZS4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIzMTUsOSArMjMyOSwxMCBAQAogCQlpZiAoKHVnX2luZm8tPmJkUmluZ0xlblJ4W2ldIDwgVUNDX0dFVEhfUlhfQkRfUklOR19TSVpFX01JTikgfHwKIAkJICAgICh1Z19pbmZvLT5iZFJpbmdMZW5SeFtpXSAlCiAJCSAgICAgVUNDX0dFVEhfUlhfQkRfUklOR19TSVpFX0FMSUdOTUVOVCkpIHsKLQkJCXVnZXRoX2VycgotCQkJICAgICgiJXM6IFJ4IEJEIHJpbmcgbGVuZ3RoIG11c3QgYmUgbXVsdGlwbGUgb2YgNCwiCi0JCQkJIiBubyBzbWFsbGVyIHRoYW4gOC4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCisJCQkJdWdldGhfZXJyCisJCQkJICAgICgiJXM6IFJ4IEJEIHJpbmcgbGVuZ3RoIG11c3QgYmUgbXVsdGlwbGUgb2YgNCwgbm8gc21hbGxlciB0aGFuIDguIiwKKwkJCQkJX19GVU5DVElPTl9fKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjMyNSw5ICsyMzQwLDEwIEBACiAJLyogVHggQkQgbGVuZ3RocyAqLwogCWZvciAoaSA9IDA7IGkgPCB1Z19pbmZvLT5udW1RdWV1ZXNUeDsgaSsrKSB7CiAJCWlmICh1Z19pbmZvLT5iZFJpbmdMZW5UeFtpXSA8IFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NSU4pIHsKLQkJCXVnZXRoX2VycgotCQkJICAgICgiJXM6IFR4IEJEIHJpbmcgbGVuZ3RoIG11c3QgYmUgbm8gc21hbGxlciB0aGFuIDIuIiwKLQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQorCQkJCXVnZXRoX2VycgorCQkJCSAgICAoIiVzOiBUeCBCRCByaW5nIGxlbmd0aCBtdXN0IGJlIG5vIHNtYWxsZXIgdGhhbiAyLiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMzM1LDMxICsyMzUxLDM1IEBACiAJLyogbXJibHIgKi8KIAlpZiAoKHVmX2luZm8tPm1heF9yeF9idWZfbGVuZ3RoID09IDApIHx8CiAJICAgICh1Zl9pbmZvLT5tYXhfcnhfYnVmX2xlbmd0aCAlIFVDQ19HRVRIX01SQkxSX0FMSUdOTUVOVCkpIHsKLQkJdWdldGhfZXJyCi0JCSAgICAoIiVzOiBtYXhfcnhfYnVmX2xlbmd0aCBtdXN0IGJlIG5vbi16ZXJvIG11bHRpcGxlIG9mIDEyOC4iLAotCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQorCQkJdWdldGhfZXJyCisJCQkgICAgKCIlczogbWF4X3J4X2J1Zl9sZW5ndGggbXVzdCBiZSBub24temVybyBtdWx0aXBsZSBvZiAxMjguIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogbnVtIFR4IHF1ZXVlcyAqLwogCWlmICh1Z19pbmZvLT5udW1RdWV1ZXNUeCA+IE5VTV9UWF9RVUVVRVMpIHsKLQkJdWdldGhfZXJyKCIlczogbnVtYmVyIG9mIHR4IHF1ZXVlcyB0b28gbGFyZ2UuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBudW1iZXIgb2YgdHggcXVldWVzIHRvbyBsYXJnZS4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBudW0gUnggcXVldWVzICovCiAJaWYgKHVnX2luZm8tPm51bVF1ZXVlc1J4ID4gTlVNX1JYX1FVRVVFUykgewotCQl1Z2V0aF9lcnIoIiVzOiBudW1iZXIgb2YgcnggcXVldWVzIHRvbyBsYXJnZS4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKKwkJCXVnZXRoX2VycigiJXM6IG51bWJlciBvZiByeCBxdWV1ZXMgdG9vIGxhcmdlLiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGwycXQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgVUNDX0dFVEhfVkxBTl9QUklPUklUWV9NQVg7IGkrKykgewogCQlpZiAodWdfaW5mby0+bDJxdFtpXSA+PSB1Z19pbmZvLT5udW1RdWV1ZXNSeCkgewotCQkJdWdldGhfZXJyCi0JCQkgICAgKCIlczogVkxBTiBwcmlvcml0eSB0YWJsZSBlbnRyeSBtdXN0IG5vdCBiZSIKLQkJCQkiIGxhcmdlciB0aGFuIG51bWJlciBvZiBSeCBxdWV1ZXMuIiwKLQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQorCQkJCXVnZXRoX2VycgorCQkJCSAgICAoIiVzOiBWTEFOIHByaW9yaXR5IHRhYmxlIGVudHJ5IG11c3Qgbm90IGJlIgorCQkJCQkiIGxhcmdlciB0aGFuIG51bWJlciBvZiBSeCBxdWV1ZXMuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTIzNjcsMjYgKzIzODcsMjkgQEAKIAkvKiBsM3F0ICovCiAJZm9yIChpID0gMDsgaSA8IFVDQ19HRVRIX0lQX1BSSU9SSVRZX01BWDsgaSsrKSB7CiAJCWlmICh1Z19pbmZvLT5sM3F0W2ldID49IHVnX2luZm8tPm51bVF1ZXVlc1J4KSB7Ci0JCQl1Z2V0aF9lcnIKLQkJCSAgICAoIiVzOiBJUCBwcmlvcml0eSB0YWJsZSBlbnRyeSBtdXN0IG5vdCBiZSIKLQkJCQkiIGxhcmdlciB0aGFuIG51bWJlciBvZiBSeCBxdWV1ZXMuIiwKLQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQorCQkJCXVnZXRoX2VycgorCQkJCSAgICAoIiVzOiBJUCBwcmlvcml0eSB0YWJsZSBlbnRyeSBtdXN0IG5vdCBiZSIKKwkJCQkJIiBsYXJnZXIgdGhhbiBudW1iZXIgb2YgUnggcXVldWVzLiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKIAlpZiAodWdfaW5mby0+Y2FtICYmICF1Z19pbmZvLT5lY2FtcHRyKSB7Ci0JCXVnZXRoX2VycigiJXM6IElmIGNhbSBtb2RlIGlzIGNob3NlbiwgbXVzdCBzdXBwbHkgY2FtIHB0ci4iLAotCQkJICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX3Byb2JlKHVnZXRoKSkKKwkJCXVnZXRoX2VycigiJXM6IElmIGNhbSBtb2RlIGlzIGNob3NlbiwgbXVzdCBzdXBwbHkgY2FtIHB0ci4iLAorCQkJCSAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKCh1Z19pbmZvLT5udW1TdGF0aW9uQWRkcmVzc2VzICE9CiAJICAgICBVQ0NfR0VUSF9OVU1fT0ZfU1RBVElPTl9BRERSRVNTRVNfMSkKIAkgICAgJiYgdWdfaW5mby0+cnhFeHRlbmRlZEZpbHRlcmluZykgewotCQl1Z2V0aF9lcnIoIiVzOiBOdW1iZXIgb2Ygc3RhdGlvbiBhZGRyZXNzZXMgZ3JlYXRlciB0aGFuIDEgIgotCQkJICAibm90IGFsbG93ZWQgaW4gZXh0ZW5kZWQgcGFyc2luZyBtb2RlLiIsCi0JCQkgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQorCQkJdWdldGhfZXJyKCIlczogTnVtYmVyIG9mIHN0YXRpb24gYWRkcmVzc2VzIGdyZWF0ZXIgdGhhbiAxICIKKwkJCQkgICJub3QgYWxsb3dlZCBpbiBleHRlbmRlZCBwYXJzaW5nIG1vZGUuIiwKKwkJCQkgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjM5OSw3ICsyNDIyLDggQEAKIAkJdWZfaW5mby0+dWNjbV9tYXNrIHw9IChVQ0NFX1RYQkZfU0lOR0xFX01BU0sgPDwgaSk7CiAJLyogSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhbCBmYXN0IFVDQyBibG9jay4gKi8KIAlpZiAodWNjX2Zhc3RfaW5pdCh1Zl9pbmZvLCAmdWdldGgtPnVjY2YpKSB7Ci0JCXVnZXRoX2VycigiJXM6IEZhaWxlZCB0byBpbml0IHVjY2YuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBGYWlsZWQgdG8gaW5pdCB1Y2NmLiIsIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjQ1Miw3ICsyNDc2LDkgQEAKIAkJbnVtVGhyZWFkc1J4TnVtZXJpY2FsID0gODsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJdWdldGhfZXJyKCIlczogQmFkIG51bWJlciBvZiBSeCB0aHJlYWRzIHZhbHVlLiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBCYWQgbnVtYmVyIG9mIFJ4IHRocmVhZHMgdmFsdWUuIiwKKwkJCQkgICAgICAgCV9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMjQ3NSw3ICsyNTAxLDkgQEAKIAkJbnVtVGhyZWFkc1R4TnVtZXJpY2FsID0gODsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJdWdldGhfZXJyKCIlczogQmFkIG51bWJlciBvZiBUeCB0aHJlYWRzIHZhbHVlLiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBCYWQgbnVtYmVyIG9mIFR4IHRocmVhZHMgdmFsdWUuIiwKKwkJCQkgICAgICAgCV9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMjUwNyw3ICsyNTM1LDcgQEAKIAkvKiBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgaGFyZHdhcmUgc3BlYy4gICAgICAgICAgICovCiAJaW5pdF9mbG93X2NvbnRyb2xfcGFyYW1zKHVnX2luZm8tPmF1ZmMsCiAJCQkJIHVnX2luZm8tPnJlY2VpdmVGbG93Q29udHJvbCwKLQkJCQkgMSwKKwkJCQkgdWdfaW5mby0+dHJhbnNtaXRGbG93Q29udHJvbCwKIAkJCQkgdWdfaW5mby0+cGF1c2VQZXJpb2QsCiAJCQkJIHVnX2luZm8tPmV4dGVuc2lvbkZpZWxkLAogCQkJCSAmdWZfcmVncy0+dXBzbXIsCkBAIC0yNTI3LDggKzI1NTUsOSBAQAogCQkJCQkgICAgICB1Z19pbmZvLT5iYWNrVG9CYWNrSW50ZXJGcmFtZUdhcCwKIAkJCQkJICAgICAgJnVnX3JlZ3MtPmlwZ2lmZyk7CiAJaWYgKHJldF92YWwgIT0gMCkgewotCQl1Z2V0aF9lcnIoIiVzOiBJUEdJRkcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvbyBsYXJnZS4iLAotCQkJICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyKCIlczogSVBHSUZHIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0b28gbGFyZ2UuIiwKKwkJCQkgIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQpAQCAtMjU0NCw3ICsyNTczLDggQEAKIAkJCQkJICB1Z19pbmZvLT5jb2xsaXNpb25XaW5kb3csCiAJCQkJCSAgJnVnX3JlZ3MtPmhhZmR1cCk7CiAJaWYgKHJldF92YWwgIT0gMCkgewotCQl1Z2V0aF9lcnIoIiVzOiBIYWxmIER1cGxleCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG9vIGxhcmdlLiIsCisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBIYWxmIER1cGxleCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG9vIGxhcmdlLiIsCiAJCQkgIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIHJldF92YWw7CkBAIC0yNTk3LDkgKzI2MjcsMTAgQEAKIAkJCQkJCQkgdHhfYmRfcmluZ19vZmZzZXRbal0pOwogCQl9CiAJCWlmICghdWdldGgtPnBfdHhfYmRfcmluZ1tqXSkgewotCQkJdWdldGhfZXJyCi0JCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFR4IGJkIHJpbmdzLiIsCi0JCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJCXVnZXRoX2VycgorCQkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgVHggYmQgcmluZ3MuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjYzMiw5ICsyNjYzLDEwIEBACiAJCQkJCQkJIHJ4X2JkX3Jpbmdfb2Zmc2V0W2pdKTsKIAkJfQogCQlpZiAoIXVnZXRoLT5wX3J4X2JkX3Jpbmdbal0pIHsKLQkJCXVnZXRoX2VycgotCQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBSeCBiZCByaW5ncy4iLAotCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCQl1Z2V0aF9lcnIKKwkJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFJ4IGJkIHJpbmdzLiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTI2NDgsOCArMjY4MCw5IEBACiAJCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCiAJCWlmICh1Z2V0aC0+dHhfc2tidWZmW2pdID09IE5VTEwpIHsKLQkJCXVnZXRoX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSB0eF9za2J1ZmYiLAotCQkJCSAgX19GVU5DVElPTl9fKTsKKwkJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQkJdWdldGhfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIHR4X3NrYnVmZiIsCisJCQkJCSAgX19GVU5DVElPTl9fKTsKIAkJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0yNjc5LDggKzI3MTIsOSBAQAogCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAogCQlpZiAodWdldGgtPnJ4X3NrYnVmZltqXSA9PSBOVUxMKSB7Ci0JCQl1Z2V0aF9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcnhfc2tidWZmIiwKLQkJCQkgIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJCXVnZXRoX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByeF9za2J1ZmYiLAorCQkJCQkgIF9fRlVOQ1RJT05fXyk7CiAJCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjcxMSw5ICsyNzQ1LDEwIEBACiAJICAgIHFlX211cmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdHhfZ2xvYmFsX3ByYW0pLAogCQkJICAgVUNDX0dFVEhfVFhfR0xPQkFMX1BSQU1fQUxJR05NRU5UKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKHVnZXRoLT50eF9nbGJsX3ByYW1fb2Zmc2V0KSkgewotCQl1Z2V0aF9lcnIKLQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciBwX3R4X2dsYmxfcHJhbS4iLAotCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIKKwkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF90eF9nbGJsX3ByYW0uIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNzMzLDkgKzI3NjgsMTAgQEAKIAkJCSAgIDMyICogKG51bVRocmVhZHNUeE51bWVyaWNhbCA9PSAxKSwKIAkJCSAgIFVDQ19HRVRIX1RIUkVBRF9EQVRBX0FMSUdOTUVOVCk7CiAJaWYgKElTX0VSUl9WQUxVRSh1Z2V0aC0+dGhyZWFkX2RhdF90eF9vZmZzZXQpKSB7Ci0JCXVnZXRoX2VycgotCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfdGhyZWFkX2RhdGFfdHguIiwKLQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyCisJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfdGhyZWFkX2RhdGFfdHguIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNzYxLDkgKzI3OTcsMTAgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9xZCksCiAJCQkgICBVQ0NfR0VUSF9TRU5EX1FVRVVFX1FVRVVFX0RFU0NSSVBUT1JfQUxJR05NRU5UKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKHVnZXRoLT5zZW5kX3FfbWVtX3JlZ19vZmZzZXQpKSB7Ci0JCXVnZXRoX2VycgotCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfc2VuZF9xX21lbV9yZWcuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyCisJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfc2VuZF9xX21lbV9yZWcuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yODA0LDkgKzI4NDEsMTAgQEAKIAkJICAgIHFlX211cmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfc2NoZWR1bGVyKSwKIAkJCQkgICBVQ0NfR0VUSF9TQ0hFRFVMRVJfQUxJR05NRU5UKTsKIAkJaWYgKElTX0VSUl9WQUxVRSh1Z2V0aC0+c2NoZWR1bGVyX29mZnNldCkpIHsKLQkJCXVnZXRoX2VycgotCQkJICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciBwX3NjaGVkdWxlci4iLAotCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCQl1Z2V0aF9lcnIKKwkJCQkgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfc2NoZWR1bGVyLiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTI4NTIsOSArMjg5MCwxMSBAQAogCQkJCSAgIChzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtKSwKIAkJCQkgICBVQ0NfR0VUSF9UWF9TVEFUSVNUSUNTX0FMSUdOTUVOVCk7CiAJCWlmIChJU19FUlJfVkFMVUUodWdldGgtPnR4X2Z3X3N0YXRpc3RpY3NfcHJhbV9vZmZzZXQpKSB7Ci0JCQl1Z2V0aF9lcnIKLQkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IiCi0JCQkJIiBwX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbS4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCQl1Z2V0aF9lcnIKKwkJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgorCQkJCQkiIHBfdHhfZndfc3RhdGlzdGljc19wcmFtLiIsCisJCQkJICAgICAgIAlfX0ZVTkNUSU9OX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTI4OTEsOSArMjkzMSwxMCBAQAogCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X2dsb2JhbF9wcmFtKSwKIAkJCSAgIFVDQ19HRVRIX1JYX0dMT0JBTF9QUkFNX0FMSUdOTUVOVCk7CiAJaWYgKElTX0VSUl9WQUxVRSh1Z2V0aC0+cnhfZ2xibF9wcmFtX29mZnNldCkpIHsKLQkJdWdldGhfZXJyCi0JCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9yeF9nbGJsX3ByYW0uIiwKLQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyCisJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfcnhfZ2xibF9wcmFtLiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjkxMiw5ICsyOTUzLDEwIEBACiAJCQkgICBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3J4KSwKIAkJCSAgIFVDQ19HRVRIX1RIUkVBRF9EQVRBX0FMSUdOTUVOVCk7CiAJaWYgKElTX0VSUl9WQUxVRSh1Z2V0aC0+dGhyZWFkX2RhdF9yeF9vZmZzZXQpKSB7Ci0JCXVnZXRoX2VycgotCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfdGhyZWFkX2RhdGFfcnguIiwKLQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyCisJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfdGhyZWFkX2RhdGFfcnguIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yOTM1LDkgKzI5NzcsMTAgQEAKIAkJCQkgICAoc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSksCiAJCQkJICAgVUNDX0dFVEhfUlhfU1RBVElTVElDU19BTElHTk1FTlQpOwogCQlpZiAoSVNfRVJSX1ZBTFVFKHVnZXRoLT5yeF9md19zdGF0aXN0aWNzX3ByYW1fb2Zmc2V0KSkgewotCQkJdWdldGhfZXJyCi0JCQkJKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgotCQkJCSIgcF9yeF9md19zdGF0aXN0aWNzX3ByYW0uIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQkJdWdldGhfZXJyCisJCQkJCSgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciIKKwkJCQkJIiBwX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbS4iLCBfX0ZVTkNUSU9OX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTI5NTcsOSArMzAwMCwxMCBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ19lbnRyeSkKIAkJCSAgICsgNCwgVUNDX0dFVEhfUlhfSU5URVJSVVBUX0NPQUxFU0NJTkdfQUxJR05NRU5UKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKHVnZXRoLT5yeF9pcnFfY29hbGVzY2luZ190Ymxfb2Zmc2V0KSkgewotCQl1Z2V0aF9lcnIKLQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciIKLQkJCSIgcF9yeF9pcnFfY29hbGVzY2luZ190YmwuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCXVnZXRoX2VycgorCQkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciIKKwkJCQkiIHBfcnhfaXJxX2NvYWxlc2NpbmdfdGJsLiIsIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzAyNSw5ICszMDY5LDEwIEBACiAJCQkgICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2JkcykpLAogCQkJICAgVUNDX0dFVEhfUlhfQkRfUVVFVUVTX0FMSUdOTUVOVCk7CiAJaWYgKElTX0VSUl9WQUxVRSh1Z2V0aC0+cnhfYmRfcXNfdGJsX29mZnNldCkpIHsKLQkJdWdldGhfZXJyCi0JCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9yeF9iZF9xc190YmwuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyCisJCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIHBfcnhfYmRfcXNfdGJsLiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzEwMiw4ICszMTQ3LDkgQEAKIAkvKiBpbml0aWFsaXplIGV4dGVuZGVkIGZpbHRlcmluZyAqLwogCWlmICh1Z19pbmZvLT5yeEV4dGVuZGVkRmlsdGVyaW5nKSB7CiAJCWlmICghdWdfaW5mby0+ZXh0ZW5kZWRGaWx0ZXJpbmdDaGFpblBvaW50ZXIpIHsKLQkJCXVnZXRoX2VycigiJXM6IE51bGwgRXh0ZW5kZWQgRmlsdGVyaW5nIENoYWluIFBvaW50ZXIuIiwKLQkJCQkgIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJCXVnZXRoX2VycigiJXM6IE51bGwgRXh0ZW5kZWQgRmlsdGVyaW5nIENoYWluIFBvaW50ZXIuIiwKKwkJCQkJICBfX0ZVTkNUSU9OX18pOwogCQkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTMxMTQsOSArMzE2MCwxMCBAQAogCQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW0pLAogCQlVQ0NfR0VUSF9SWF9FWFRFTkRFRF9GSUxURVJJTkdfR0xPQkFMX1BBUkFNRVRFUlNfQUxJR05NRU5UKTsKIAkJaWYgKElTX0VSUl9WQUxVRSh1Z2V0aC0+ZXhmX2dsYmxfcGFyYW1fb2Zmc2V0KSkgewotCQkJdWdldGhfZXJyCi0JCQkJKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgotCQkJCSIgcF9leGZfZ2xibF9wYXJhbS4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCQl1Z2V0aF9lcnIKKwkJCQkJKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgorCQkJCQkiIHBfZXhmX2dsYmxfcGFyYW0uIiwgX19GVU5DVElPTl9fKTsKIAkJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0zMTYxLDkgKzMyMDgsMTAgQEAKIAkgKi8KIAlpZiAoISh1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93ID0KIAkgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCXVnZXRoX2VycgotCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIgotCQkJIiBwX1VjY0luaXRFbmV0UGFyYW1TaGFkb3dzLiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIKKwkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IiCisJCQkJIiBwX1VjY0luaXRFbmV0UGFyYW1TaGFkb3dzLiIsIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMzE5Niw4ICszMjQ0LDkgQEAKIAkJUUVfRkxUUl9MQVJHRVNUX0VYVEVSTkFMX1RBQkxFX0xPT0tVUF9LRVlfU0laRV84X0JZVEVTKQogCSAgICAmJiAodWdfaW5mby0+bGFyZ2VzdGV4dGVybmFsbG9va3Vwa2V5c2l6ZSAhPQogCQlRRV9GTFRSX0xBUkdFU1RfRVhURVJOQUxfVEFCTEVfTE9PS1VQX0tFWV9TSVpFXzE2X0JZVEVTKSkgewotCQl1Z2V0aF9lcnIoIiVzOiBJbnZhbGlkIGxhcmdlc3QgRXh0ZXJuYWwgTG9va3VwIEtleSBTaXplLiIsCi0JCQkgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBJbnZhbGlkIGxhcmdlc3QgRXh0ZXJuYWwgTG9va3VwIEtleSBTaXplLiIsCisJCQkJICBfX0ZVTkNUSU9OX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMyMjIsOCArMzI3MSw5IEBACiAJCS8qIFJ4IG5lZWRzIG9uZSBleHRyYSBmb3IgdGVybWluYXRvciAqLwogCQksIHNpemUsIFVDQ19HRVRIX1RIUkVBRF9SWF9QUkFNX0FMSUdOTUVOVCwKIAkJdWdfaW5mby0+cmlzY1J4LCAxKSkgIT0gMCkgewotCQkJdWdldGhfZXJyKCIlczogQ2FuIG5vdCBmaWxsIHBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy4iLAotCQkJCV9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQkJdWdldGhfZXJyKCIlczogQ2FuIG5vdCBmaWxsIHBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiByZXRfdmFsOwogCX0KQEAgLTMyMzcsOCArMzI4Nyw5IEBACiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3R4X3ByYW0pLAogCQkJCSAgICBVQ0NfR0VUSF9USFJFQURfVFhfUFJBTV9BTElHTk1FTlQsCiAJCQkJICAgIHVnX2luZm8tPnJpc2NUeCwgMCkpICE9IDApIHsKLQkJdWdldGhfZXJyKCIlczogQ2FuIG5vdCBmaWxsIHBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy4iLAotCQkJICBfX0ZVTkNUSU9OX18pOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyKCIlczogQ2FuIG5vdCBmaWxsIHBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy4iLAorCQkJCSAgX19GVU5DVElPTl9fKTsKIAkJdWNjX2dldGhfbWVtY2xlYW4odWdldGgpOwogCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CkBAIC0zMjQ2LDggKzMyOTcsOSBAQAogCS8qIExvYWQgUnggYmRzIHdpdGggYnVmZmVycyAqLwogCWZvciAoaSA9IDA7IGkgPCB1Z19pbmZvLT5udW1RdWV1ZXNSeDsgaSsrKSB7CiAJCWlmICgocmV0X3ZhbCA9IHJ4X2JkX2J1ZmZlcl9zZXQodWdldGgsICh1OCkgaSkpICE9IDApIHsKLQkJCXVnZXRoX2VycigiJXM6IENhbiBub3QgZmlsbCBSeCBiZHMgd2l0aCBidWZmZXJzLiIsCi0JCQkJICBfX0ZVTkNUSU9OX18pOworCQkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCQl1Z2V0aF9lcnIoIiVzOiBDYW4gbm90IGZpbGwgUnggYmRzIHdpdGggYnVmZmVycy4iLAorCQkJCQkgIF9fRlVOQ1RJT05fXyk7CiAJCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJfQpAQCAtMzI1Niw5ICszMzA4LDEwIEBACiAJLyogQWxsb2NhdGUgSW5pdEVuZXQgY29tbWFuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCiAJaW5pdF9lbmV0X3ByYW1fb2Zmc2V0ID0gcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0pLCA0KTsKIAlpZiAoSVNfRVJSX1ZBTFVFKGluaXRfZW5ldF9wcmFtX29mZnNldCkpIHsKLQkJdWdldGhfZXJyCi0JCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9pbml0X2VuZXRfcHJhbS4iLAotCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIKKwkJCSAgICAoIiVzOiBDYW4gbm90IGFsbG9jYXRlIERQUkFNIG1lbW9yeSBmb3IgcF9pbml0X2VuZXRfcHJhbS4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM0MjgsOCArMzQ4MSw5IEBACiAJCWlmICghc2tiIHx8CiAJCSAgICAoIShiZF9zdGF0dXMgJiAoUl9GIHwgUl9MKSkpIHx8CiAJCSAgICAoYmRfc3RhdHVzICYgUl9FUlJPUlNfRkFUQUwpKSB7Ci0JCQl1Z2V0aF92ZGJnKCIlcywgJWQ6IEVSUk9SISEhIHNrYiAtIDB4JTA4eCIsCi0JCQkJICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKHUzMikgc2tiKTsKKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHVnZXRoKSkKKwkJCQl1Z2V0aF9lcnIoIiVzLCAlZDogRVJST1IhISEgc2tiIC0gMHglMDh4IiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgKHUzMikgc2tiKTsKIAkJCWlmIChza2IpCiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIApAQCAtMzQ1OCw3ICszNTEyLDggQEAKIAogCQlza2IgPSBnZXRfbmV3X3NrYih1Z2V0aCwgYmQpOwogCQlpZiAoIXNrYikgewotCQkJdWdldGhfd2FybigiJXM6IE5vIFJ4IERhdGEgQnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHVnZXRoKSkKKwkJCQl1Z2V0aF93YXJuKCIlczogTm8gUnggRGF0YSBCdWZmZXIiLCBfX0ZVTkNUSU9OX18pOwogCQkJdWdldGgtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zNjQ5LDI4ICszNzA0LDMyIEBACiAKIAkvKiBUZXN0IHN0YXRpb24gYWRkcmVzcyAqLwogCWlmIChkZXYtPmRldl9hZGRyWzBdICYgRU5FVF9HUk9VUF9BRERSKSB7Ci0JCXVnZXRoX2VycigiJXM6IE11bHRpY2FzdCBhZGRyZXNzIHVzZWQgZm9yIHN0YXRpb24gYWRkcmVzcyIKLQkJCSAgIiAtIGlzIHRoaXMgd2hhdCB5b3Ugd2FudGVkPyIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBNdWx0aWNhc3QgYWRkcmVzcyB1c2VkIGZvciBzdGF0aW9uIGFkZHJlc3MiCisJCQkJICAiIC0gaXMgdGhpcyB3aGF0IHlvdSB3YW50ZWQ/IiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXJyID0gdWNjX3N0cnVjdF9pbml0KHVnZXRoKTsKIAlpZiAoZXJyKSB7Ci0JCXVnZXRoX2VycigiJXM6IENhbm5vdCBjb25maWd1cmUgaW50ZXJuYWwgc3RydWN0LCBhYm9ydGluZy4iLCBkZXYtPm5hbWUpOworCQlpZiAobmV0aWZfbXNnX2lmdXAodWdldGgpKQorCQkJdWdldGhfZXJyKCIlczogQ2Fubm90IGNvbmZpZ3VyZSBpbnRlcm5hbCBzdHJ1Y3QsIGFib3J0aW5nLiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJZXJyID0gdWNjX2dldGhfc3RhcnR1cCh1Z2V0aCk7CiAJaWYgKGVycikgewotCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgY29uZmlndXJlIG5ldCBkZXZpY2UsIGFib3J0aW5nLiIsCi0JCQkgIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgY29uZmlndXJlIG5ldCBkZXZpY2UsIGFib3J0aW5nLiIsCisJCQkJICBkZXYtPm5hbWUpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IGFkanVzdF9lbmV0X2ludGVyZmFjZSh1Z2V0aCk7CiAJaWYgKGVycikgewotCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgY29uZmlndXJlIG5ldCBkZXZpY2UsIGFib3J0aW5nLiIsCi0JCQkgIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgY29uZmlndXJlIG5ldCBkZXZpY2UsIGFib3J0aW5nLiIsCisJCQkJICBkZXYtPm5hbWUpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMzY4Nyw3ICszNzQ2LDggQEAKIAogCWVyciA9IGluaXRfcGh5KGRldik7CiAJaWYgKGVycikgewotCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgaW5pdGlhbGl6ZSBQSFksIGFib3J0aW5nLiIsIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgaW5pdGlhbGl6ZSBQSFksIGFib3J0aW5nLiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0zNjk3LDE1ICszNzU3LDE3IEBACiAJICAgIHJlcXVlc3RfaXJxKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLmlycSwgdWNjX2dldGhfaXJxX2hhbmRsZXIsIDAsCiAJCQkiVUNDIEdldGgiLCBkZXYpOwogCWlmIChlcnIpIHsKLQkJdWdldGhfZXJyKCIlczogQ2Fubm90IGdldCBJUlEgZm9yIG5ldCBkZXZpY2UsIGFib3J0aW5nLiIsCi0JCQkgIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cCh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgZ2V0IElSUSBmb3IgbmV0IGRldmljZSwgYWJvcnRpbmcuIiwKKwkJCQkgIGRldi0+bmFtZSk7CiAJCXVjY19nZXRoX3N0b3AodWdldGgpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCWVyciA9IHVnZXRoX2VuYWJsZSh1Z2V0aCwgQ09NTV9ESVJfUlhfQU5EX1RYKTsKIAlpZiAoZXJyKSB7Ci0JCXVnZXRoX2VycigiJXM6IENhbm5vdCBlbmFibGUgbmV0IGRldmljZSwgYWJvcnRpbmcuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19pZnVwKHVnZXRoKSkKKwkJCXVnZXRoX2VycigiJXM6IENhbm5vdCBlbmFibGUgbmV0IGRldmljZSwgYWJvcnRpbmcuIiwgZGV2LT5uYW1lKTsKIAkJdWNjX2dldGhfc3RvcCh1Z2V0aCk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMzczMiw4ICszNzk0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHVjY19nZXRoX2V0aHRvb2xfb3BzID0geyB9OwotCiBzdGF0aWMgcGh5X2ludGVyZmFjZV90IHRvX3BoeV9pbnRlcmZhY2UoY29uc3QgY2hhciAqcGh5X2Nvbm5lY3Rpb25fdHlwZSkKIHsKIAlpZiAoc3RyY2FzZWNtcChwaHlfY29ubmVjdGlvbl90eXBlLCAibWlpIikgPT0gMCkKQEAgLTM3OTAsNiArMzg1MCwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXVnX2luZm8gPSAmdWdldGhfaW5mb1t1Y2NfbnVtXTsKKwlpZiAodWdfaW5mbyA9PSBOVUxMKSB7CisJCWlmIChuZXRpZl9tc2dfcHJvYmUoJmRlYnVnKSkKKwkJCXVnZXRoX2VycigiJXM6IFslZF0gTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhIiwKKwkJCQkgICAgICAgCV9fRlVOQ1RJT05fXywgdWNjX251bSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXVnX2luZm8tPnVmX2luZm8udWNjX251bSA9IHVjY19udW07CiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicngtY2xvY2siLCBOVUxMKTsKQEAgLTM4NjgsMTUgKzM5MzUsMTAgQEAKIAogCXVnX2luZm8tPm1kaW9fYnVzID0gcmVzLnN0YXJ0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAidWNjX2dldGg6IFVDQyUxZCBhdCAweCU4eCAoaXJxID0gJWQpIFxuIiwKLQkJdWdfaW5mby0+dWZfaW5mby51Y2NfbnVtICsgMSwgdWdfaW5mby0+dWZfaW5mby5yZWdzLAotCQl1Z19pbmZvLT51Zl9pbmZvLmlycSk7Ci0KLQlpZiAodWdfaW5mbyA9PSBOVUxMKSB7Ci0JCXVnZXRoX2VycigiJXM6IFslZF0gTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhIiwgX19GVU5DVElPTl9fLAotCQkJICB1Y2NfbnVtKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmIChuZXRpZl9tc2dfcHJvYmUoJmRlYnVnKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWNjX2dldGg6IFVDQyUxZCBhdCAweCU4eCAoaXJxID0gJWQpIFxuIiwKKwkJCXVnX2luZm8tPnVmX2luZm8udWNjX251bSArIDEsIHVnX2luZm8tPnVmX2luZm8ucmVncywKKwkJCXVnX2luZm8tPnVmX2luZm8uaXJxKTsKIAogCS8qIENyZWF0ZSBhbiBldGhlcm5ldCBkZXZpY2UgaW5zdGFuY2UgKi8KIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnVnZXRoKSk7CkBAIC0zODk2LDYgKzM5NTgsNyBAQAogCVNFVF9ORVRERVZfREVWKGRldiwgZGV2aWNlKTsKIAogCS8qIEZpbGwgaW4gdGhlIGRldiBzdHJ1Y3R1cmUgKi8KKwl1ZWNfc2V0X2V0aHRvb2xfb3BzKGRldik7CiAJZGV2LT5vcGVuID0gdWNjX2dldGhfb3BlbjsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHVjY19nZXRoX3N0YXJ0X3htaXQ7CiAJZGV2LT50eF90aW1lb3V0ID0gdWNjX2dldGhfdGltZW91dDsKQEAgLTM5MDksMTYgKzM5NzIsMTYgQEAKIC8vICAgIGRldi0+Y2hhbmdlX210dSA9IHVjY19nZXRoX2NoYW5nZV9tdHU7CiAJZGV2LT5tdHUgPSAxNTAwOwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdWNjX2dldGhfc2V0X211bHRpOwotCWRldi0+ZXRodG9vbF9vcHMgPSAmdWNjX2dldGhfZXRodG9vbF9vcHM7CiAKLQl1Z2V0aC0+bXNnX2VuYWJsZSA9IChORVRJRl9NU0dfSUZVUCA8PCAxICkgLSAxOworCXVnZXRoLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcubXNnX2VuYWJsZSwgVUdFVEhfTVNHX0RFRkFVTFQpOwogCXVnZXRoLT5waHlfaW50ZXJmYWNlID0gcGh5X2ludGVyZmFjZTsKIAl1Z2V0aC0+bWF4X3NwZWVkID0gbWF4X3NwZWVkOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewotCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuIiwKLQkJCSAgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCisJCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuIiwKKwkJCQkgIGRldi0+bmFtZSk7CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMzk3Miw3ICs0MDM1LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAidWNjX2dldGg6ICIgRFJWX0RFU0MgIlxuIik7CisJaWYgKG5ldGlmX21zZ19kcnYoJmRlYnVnKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWNjX2dldGg6ICIgRFJWX0RFU0MgIlxuIik7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJbWVtY3B5KCYodWdldGhfaW5mb1tpXSksICZ1Z2V0aF9wcmltYXJ5X2luZm8sCiAJCSAgICAgICBzaXplb2YodWdldGhfcHJpbWFyeV9pbmZvKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oIGIvZHJpdmVycy9uZXQvdWNjX2dldGguaAppbmRleCBhMjllMWMzLi5iYjRkYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKQEAgLTMwLDYgKzMwLDEwIEBACiAKICNpbmNsdWRlICJ1Y2NfZ2V0aF9taWkuaCIKIAorI2RlZmluZSBEUlZfREVTQyAiUUUgVUNDIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciIKKyNkZWZpbmUgRFJWX05BTUUgInVjY19nZXRoIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4xIgorCiAjZGVmaW5lIE5VTV9UWF9RVUVVRVMgICAgICAgICAgICAgICAgICAgOAogI2RlZmluZSBOVU1fUlhfUVVFVUVTICAgICAgICAgICAgICAgICAgIDgKICNkZWZpbmUgTlVNX0JEU19JTl9QUkVGRVRDSEVEX0JEUyAgICAgICA0CkBAIC04OTYsNiArOTAwLDcgQEAKICNkZWZpbmUgVUNDX0dFVEhfVFhfVlRBR19UQUJMRV9FTlRSWV9NQVggICAgICAgIDgKICNkZWZpbmUgVUNDX0dFVEhfUlhfQkRfUklOR19TSVpFX01JTiAgICAgICAgICAgIDgKICNkZWZpbmUgVUNDX0dFVEhfVFhfQkRfUklOR19TSVpFX01JTiAgICAgICAgICAgIDIKKyNkZWZpbmUgVUNDX0dFVEhfQkRfUklOR19TSVpFX01BWAkJMHhmZmZmCiAKICNkZWZpbmUgVUNDX0dFVEhfU0laRV9PRl9CRCAgICAgICAgICAgICAgICAgICAgIFFFX1NJWkVPRl9CRAogCkBAIC0xMTM1LDYgKzExNDAsNyBAQAogCWludCBicm87CiAJaW50IGVjbTsKIAlpbnQgcmVjZWl2ZUZsb3dDb250cm9sOworCWludCB0cmFuc21pdEZsb3dDb250cm9sOwogCXU4IG1heEdyb3VwQWRkckluSGFzaDsKIAl1OCBtYXhJbmRBZGRySW5IYXNoOwogCXU4IHByZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5OTRjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX2V0aHRvb2wuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERlc2NyaXB0aW9uOiBRRSBVQ0MgR2lnYWJpdCBFdGhlcm5ldCBFdGh0b29sIEFQSSBTZXQKKyAqCisgKiBBdXRob3I6IExpIFlhbmcgPGxlb2xpQGZyZWVzY2FsZS5jb20+CisgKgorICogTGltaXRhdGlvbjogCisgKiBDYW4gb25seSBnZXQvc2V0IHNldHR0aW5ncyBvZiB0aGUgZmlyc3QgcXVldWUuCisgKiBOZWVkIHRvIHJlLW9wZW4gdGhlIGludGVyZmFjZSBtYW51YWxseSBhZnRlciBjaGFuZ2luZyBzb21lIHBhcmFtdGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInVjY19nZXRoLmgiCisjaW5jbHVkZSAidWNjX2dldGhfbWlpLmgiCisKK3N0YXRpYyBjaGFyIGh3X3N0YXRfZ3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0geworCSJ0eC02NC1mcmFtZXMiLAorCSJ0eC02NS0xMjctZnJhbWVzIiwKKwkidHgtMTI4LTI1NS1mcmFtZXMiLAorCSJyeC02NC1mcmFtZXMiLAorCSJyeC02NS0xMjctZnJhbWVzIiwKKwkicngtMTI4LTI1NS1mcmFtZXMiLAorCSJ0eC1ieXRlcy1vayIsCisJInR4LXBhdXNlLWZyYW1lcyIsCisJInR4LW11bHRpY2FzdC1mcmFtZXMiLAorCSJ0eC1icm9hZGNhc3QtZnJhbWVzIiwKKwkicngtZnJhbWVzIiwKKwkicngtYnl0ZXMtb2siLAorCSJyeC1ieXRlcy1hbGwiLAorCSJyeC1tdWx0aWNhc3QtZnJhbWVzIiwKKwkicngtYnJvYWRjYXN0LWZyYW1lcyIsCisJInN0YXRzLWNvdW50ZXItY2FycnkiLAorCSJzdGF0cy1jb3VudGVyLW1hc2siLAorCSJyeC1kcm9wcGVkLWZyYW1lcyIsCit9OworCitzdGF0aWMgY2hhciB0eF9md19zdGF0X2dzdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkidHgtc2luZ2xlLWNvbGxpc2lvbiIsCisJInR4LW11bHRpcGxlLWNvbGxpc2lvbiIsCisJInR4LWxhdGUtY29sbHNpb24iLAorCSJ0eC1hYm9ydGVkLWZyYW1lcyIsCisJInR4LWxvc3QtZnJhbWVzIiwKKwkidHgtY2Fycmllci1zZW5zZS1lcnJvcnMiLAorCSJ0eC1mcmFtZXMtb2siLAorCSJ0eC1leGNlc3NpdmUtZGlmZmVyLWZyYW1lcyIsCisJInR4LTI1Ni01MTEtZnJhbWVzIiwKKwkidHgtMTAyNC0xNTE4LWZyYW1lcyIsCisJInR4LWp1bWJvLWZyYW1lcyIsCit9OworCitzdGF0aWMgY2hhciByeF9md19zdGF0X2dzdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkicngtY3JjLWVycm9ycyIsCisJInJ4LWFsaWdubWVudC1lcnJvcnMiLAorCSJyeC1pbi1yYW5nZS1sZW5ndGgtZXJyb3JzIiwKKwkicngtb3V0LW9mLXJhbmdlLWxlbmd0aC1lcnJvcnMiLAorCSJyeC10b28tbG9uZy1mcmFtZXMiLAorCSJyeC1ydW50IiwKKwkicngtdmVyeS1sb25nLWV2ZW50IiwKKwkicngtc3ltYm9sLWVycm9ycyIsCisJInJ4LWJ1c3ktZHJvcC1mcmFtZXMiLAorCSJyZXNlcnZlZCIsCisJInJlc2VydmVkIiwKKwkicngtbWlzbWF0Y2gtZHJvcC1mcmFtZXMiLAorCSJyeC1zbWFsbC10aGFuLTY0IiwKKwkicngtMjU2LTUxMS1mcmFtZXMiLAorCSJyeC01MTItMTAyMy1mcmFtZXMiLAorCSJyeC0xMDI0LTE1MTgtZnJhbWVzIiwKKwkicngtanVtYm8tZnJhbWVzIiwKKwkicngtbWFjLWVycm9yLWxvc3MiLAorCSJyeC1wYXVzZS1mcmFtZXMiLAorCSJyZXNlcnZlZCIsCisJInJ4LXZsYW4tcmVtb3ZlZCIsCisJInJ4LXZsYW4tcmVwbGFjZWQiLAorCSJyeC12bGFuLWluc2VydGVkIiwKKwkicngtaXAtY2hlY2tzdW0tZXJyb3JzIiwKK307CisKKyNkZWZpbmUgVUVDX0hXX1NUQVRTX0xFTiBBUlJBWV9TSVpFKGh3X3N0YXRfZ3N0cmluZ3MpCisjZGVmaW5lIFVFQ19UWF9GV19TVEFUU19MRU4gQVJSQVlfU0laRSh0eF9md19zdGF0X2dzdHJpbmdzKQorI2RlZmluZSBVRUNfUlhfRldfU1RBVFNfTEVOIEFSUkFZX1NJWkUocnhfZndfc3RhdF9nc3RyaW5ncykKKworZXh0ZXJuIGludCBpbml0X2Zsb3dfY29udHJvbF9wYXJhbXModTMyIGF1dG9tYXRpY19mbG93X2NvbnRyb2xfbW9kZSwKKwkJaW50IHJ4X2Zsb3dfY29udHJvbF9lbmFibGUsCisJCWludCB0eF9mbG93X2NvbnRyb2xfZW5hYmxlLCB1MTYgcGF1c2VfcGVyaW9kLAorCQl1MTYgZXh0ZW5zaW9uX2ZpZWxkLCB2b2xhdGlsZSB1MzIgKnVwc21yX3JlZ2lzdGVyLAorCQl2b2xhdGlsZSB1MzIgKnVlbXByX3JlZ2lzdGVyLCB2b2xhdGlsZSB1MzIgKm1hY2NmZzFfcmVnaXN0ZXIpOworCitzdGF0aWMgaW50Cit1ZWNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB1Z2V0aC0+cGh5ZGV2OworCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvID0gdWdldGgtPnVnX2luZm87CisKKwlpZiAoIXBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllY21kLT5tYXh0eHBrdCA9IDE7CisJZWNtZC0+bWF4cnhwa3QgPSB1Z19pbmZvLT5pbnRlcnJ1cHRjb2FsZXNjaW5nbWF4dmFsdWVbMF07CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGVjbWQpOworfQorCitzdGF0aWMgaW50Cit1ZWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB1Z2V0aC0+cGh5ZGV2OworCisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBlY21kKTsKK30KKworc3RhdGljIHZvaWQKK3VlY19nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXBhdXNlLT5hdXRvbmVnID0gdWdldGgtPnBoeWRldi0+YXV0b25lZzsKKworCWlmICh1Z2V0aC0+dWdfaW5mby0+cmVjZWl2ZUZsb3dDb250cm9sKQorCQlwYXVzZS0+cnhfcGF1c2UgPSAxOworCWlmICh1Z2V0aC0+dWdfaW5mby0+dHJhbnNtaXRGbG93Q29udHJvbCkKKwkJcGF1c2UtPnR4X3BhdXNlID0gMTsKK30KKworc3RhdGljIGludAordWVjX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXQgPSAwOworCisJdWdldGgtPnVnX2luZm8tPnJlY2VpdmVGbG93Q29udHJvbCA9IHBhdXNlLT5yeF9wYXVzZTsKKwl1Z2V0aC0+dWdfaW5mby0+dHJhbnNtaXRGbG93Q29udHJvbCA9IHBhdXNlLT50eF9wYXVzZTsKKwkKKwlpZiAodWdldGgtPnBoeWRldi0+YXV0b25lZykgeworCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCQkvKiBGSVhNRTogYXV0b21hdGljYWxseSByZXN0YXJ0ICovCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIlBsZWFzZSByZS1vcGVuIHRoZSBpbnRlcmZhY2UuXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvID0gdWdldGgtPnVnX2luZm87CisKKwkJcmV0ID0gaW5pdF9mbG93X2NvbnRyb2xfcGFyYW1zKHVnX2luZm8tPmF1ZmMsCisJCQkJCXVnX2luZm8tPnJlY2VpdmVGbG93Q29udHJvbCwKKwkJCQkJdWdfaW5mby0+dHJhbnNtaXRGbG93Q29udHJvbCwKKwkJCQkJdWdfaW5mby0+cGF1c2VQZXJpb2QsCisJCQkJCXVnX2luZm8tPmV4dGVuc2lvbkZpZWxkLAorCQkJCQkmdWdldGgtPnVjY2YtPnVmX3JlZ3MtPnVwc21yLAorCQkJCQkmdWdldGgtPnVnX3JlZ3MtPnVlbXByLAorCQkJCQkmdWdldGgtPnVnX3JlZ3MtPm1hY2NmZzEpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdAordWVjX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIHVnZXRoLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZAordWVjX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdWdldGgtPm1zZ19lbmFibGUgPSBkYXRhOworfQorCitzdGF0aWMgaW50Cit1ZWNfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdWNjX2dldGgpOworfQorCitzdGF0aWMgdm9pZAordWVjX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQoreworCWludCBpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyIF9faW9tZW0gKnVnX3JlZ3MgPSAodTMyIF9faW9tZW0gKil1Z2V0aC0+dWdfcmVnczsKKwl1MzIgKmJ1ZmYgPSBwOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgdWNjX2dldGgpIC8gc2l6ZW9mKHUzMik7IGkrKykKKwkJYnVmZltpXSA9IGluX2JlMzIoJnVnX3JlZ3NbaV0pOworfQorCitzdGF0aWMgdm9pZAordWVjX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm8gPSB1Z2V0aC0+dWdfaW5mbzsKKwlpbnQgcXVldWUgPSAwOworCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBVQ0NfR0VUSF9CRF9SSU5HX1NJWkVfTUFYOworCXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSBVQ0NfR0VUSF9CRF9SSU5HX1NJWkVfTUFYOworCXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gVUNDX0dFVEhfQkRfUklOR19TSVpFX01BWDsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IFVDQ19HRVRIX0JEX1JJTkdfU0laRV9NQVg7CisKKwlyaW5nLT5yeF9wZW5kaW5nID0gdWdfaW5mby0+YmRSaW5nTGVuUnhbcXVldWVdOworCXJpbmctPnJ4X21pbmlfcGVuZGluZyA9IHVnX2luZm8tPmJkUmluZ0xlblJ4W3F1ZXVlXTsKKwlyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gdWdfaW5mby0+YmRSaW5nTGVuUnhbcXVldWVdOworCXJpbmctPnR4X3BlbmRpbmcgPSB1Z19pbmZvLT5iZFJpbmdMZW5UeFtxdWV1ZV07Cit9CisKK3N0YXRpYyBpbnQKK3VlY19zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvID0gdWdldGgtPnVnX2luZm87CisJaW50IHF1ZXVlID0gMCwgcmV0ID0gMDsKKworCWlmIChyaW5nLT5yeF9wZW5kaW5nIDwgVUNDX0dFVEhfUlhfQkRfUklOR19TSVpFX01JTikgeworCQlwcmludGsoIiVzOiBSeEJEIHJpbmcgc2l6ZSBtdXN0IGJlIG5vIHNtYWxsZXIgdGhhbiAlZC5cbiIsCisJCQkgICAgICAgCW5ldGRldi0+bmFtZSwgVUNDX0dFVEhfUlhfQkRfUklOR19TSVpFX01JTik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmluZy0+cnhfcGVuZGluZyAlIFVDQ19HRVRIX1JYX0JEX1JJTkdfU0laRV9BTElHTk1FTlQpIHsKKwkJcHJpbnRrKCIlczogUnhCRCByaW5nIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAlZC5cbiIsCisJCQluZXRkZXYtPm5hbWUsIFVDQ19HRVRIX1JYX0JEX1JJTkdfU0laRV9BTElHTk1FTlQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJpbmctPnR4X3BlbmRpbmcgPCBVQ0NfR0VUSF9UWF9CRF9SSU5HX1NJWkVfTUlOKSB7CisJCXByaW50aygiJXM6IFR4QkQgcmluZyBzaXplIG11c3QgYmUgbm8gc21hbGxlciB0aGFuICVkLlxuIiwKKwkJCQluZXRkZXYtPm5hbWUsIFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NSU4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1Z19pbmZvLT5iZFJpbmdMZW5SeFtxdWV1ZV0gPSByaW5nLT5yeF9wZW5kaW5nOworCXVnX2luZm8tPmJkUmluZ0xlblR4W3F1ZXVlXSA9IHJpbmctPnR4X3BlbmRpbmc7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCS8qIEZJWE1FOiByZXN0YXJ0IGF1dG9tYXRpY2FsbHkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIlBsZWFzZSByZS1vcGVuIHRoZSBpbnRlcmZhY2UuXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVlY19nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiBzdGF0c19tb2RlID0gdWdldGgtPnVnX2luZm8tPnN0YXRpc3RpY3NNb2RlOworCWludCBsZW4gPSAwOworCisJaWYgKHN0YXRzX21vZGUgJiBVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX0hBUkRXQVJFKQorCQlsZW4gKz0gVUVDX0hXX1NUQVRTX0xFTjsKKwlpZiAoc3RhdHNfbW9kZSAmIFVDQ19HRVRIX1NUQVRJU1RJQ1NfR0FUSEVSSU5HX01PREVfRklSTVdBUkVfVFgpCisJCWxlbiArPSBVRUNfVFhfRldfU1RBVFNfTEVOOworCWlmIChzdGF0c19tb2RlICYgVUNDX0dFVEhfU1RBVElTVElDU19HQVRIRVJJTkdfTU9ERV9GSVJNV0FSRV9SWCkKKwkJbGVuICs9IFVFQ19SWF9GV19TVEFUU19MRU47CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCB1ZWNfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwgdTggKmJ1ZikKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiBzdGF0c19tb2RlID0gdWdldGgtPnVnX2luZm8tPnN0YXRpc3RpY3NNb2RlOworCisJaWYgKHN0YXRzX21vZGUgJiBVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX0hBUkRXQVJFKSB7CisJCW1lbWNweShidWYsIGh3X3N0YXRfZ3N0cmluZ3MsIFVFQ19IV19TVEFUU19MRU4gKgorCQkJICAgICAgIAlFVEhfR1NUUklOR19MRU4pOworCQlidWYgKz0gVUVDX0hXX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTjsKKwl9CisJaWYgKHN0YXRzX21vZGUgJiBVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX0ZJUk1XQVJFX1RYKSB7CisJCW1lbWNweShidWYsIHR4X2Z3X3N0YXRfZ3N0cmluZ3MsIFVFQ19UWF9GV19TVEFUU19MRU4gKgorCQkJICAgICAgIAlFVEhfR1NUUklOR19MRU4pOworCQlidWYgKz0gVUVDX1RYX0ZXX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTjsKKwl9CisJaWYgKHN0YXRzX21vZGUgJiBVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX0ZJUk1XQVJFX1JYKQorCQltZW1jcHkoYnVmLCB0eF9md19zdGF0X2dzdHJpbmdzLCBVRUNfUlhfRldfU1RBVFNfTEVOICoKKwkJCSAgICAgICAJRVRIX0dTVFJJTkdfTEVOKTsKK30KKworc3RhdGljIHZvaWQgdWVjX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdWludDY0X3QgKmRhdGEpCit7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgc3RhdHNfbW9kZSA9IHVnZXRoLT51Z19pbmZvLT5zdGF0aXN0aWNzTW9kZTsKKwl1MzIgX19pb21lbSAqYmFzZTsKKwlpbnQgaSwgaiA9IDA7CisKKwlpZiAoc3RhdHNfbW9kZSAmIFVDQ19HRVRIX1NUQVRJU1RJQ1NfR0FUSEVSSU5HX01PREVfSEFSRFdBUkUpIHsKKwkJYmFzZSA9ICh1MzIgX19pb21lbSAqKSZ1Z2V0aC0+dWdfcmVncy0+dHg2NDsKKwkJZm9yIChpID0gMDsgaSA8IFVFQ19IV19TVEFUU19MRU47IGkrKykKKwkJCWRhdGFbaisrXSA9ICh1NjQpaW5fYmUzMigmYmFzZVtpXSk7CisJfQorCWlmIChzdGF0c19tb2RlICYgVUNDX0dFVEhfU1RBVElTVElDU19HQVRIRVJJTkdfTU9ERV9GSVJNV0FSRV9UWCkgeworCQliYXNlID0gKHUzMiBfX2lvbWVtICopdWdldGgtPnBfdHhfZndfc3RhdGlzdGljc19wcmFtOworCQlmb3IgKGkgPSAwOyBpIDwgVUVDX1RYX0ZXX1NUQVRTX0xFTjsgaSsrKQorCQkJZGF0YVtqKytdID0gKHU2NClpbl9iZTMyKCZiYXNlW2ldKTsKKwl9CisJaWYgKHN0YXRzX21vZGUgJiBVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX0ZJUk1XQVJFX1JYKSB7CisJCWJhc2UgPSAodTMyIF9faW9tZW0gKil1Z2V0aC0+cF9yeF9md19zdGF0aXN0aWNzX3ByYW07CisJCWZvciAoaSA9IDA7IGkgPCBVRUNfUlhfRldfU1RBVFNfTEVOOyBpKyspCisJCQlkYXRhW2orK10gPSAodTY0KWluX2JlMzIoJmJhc2VbaV0pOworCX0KK30KKworc3RhdGljIGludCB1ZWNfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gcGh5X3N0YXJ0X2FuZWcodWdldGgtPnBoeWRldik7Cit9CisKKy8qIFJlcG9ydCBkcml2ZXIgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyB2b2lkCit1ZWNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sICJRVUlDQyBFTkdJTkUiLCAzMik7CisJZHJ2aW5mby0+bl9zdGF0cyA9IHVlY19nZXRfc3RhdHNfY291bnQobmV0ZGV2KTsKKwlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSAwOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOworCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gdWVjX2dldF9yZWdzX2xlbihuZXRkZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHVlY19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzICAgICAgICAgICA9IHVlY19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyAgICAgICAgICAgPSB1ZWNfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyAgICAgICAgICAgID0gdWVjX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gICAgICAgICAgID0gdWVjX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgICAgICAgICAgICAgICA9IHVlY19nZXRfcmVncywKKwkuZ2V0X21zZ2xldmVsICAgICAgICAgICA9IHVlY19nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCAgICAgICAgICAgPSB1ZWNfc2V0X21zZ2xldmVsLAorCS5ud2F5X3Jlc2V0ICAgICAgICAgICAgID0gdWVjX253YXlfcmVzZXQsCisJLmdldF9saW5rICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcmluZ3BhcmFtICAgICAgICAgID0gdWVjX2dldF9yaW5ncGFyYW0sCisJLnNldF9yaW5ncGFyYW0gICAgICAgICAgPSB1ZWNfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0gICAgICAgICA9IHVlY19nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gICAgICAgICA9IHVlY19zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3NnICAgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cgICAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF90c28gICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCisJLmdldF9zdGF0c19jb3VudCAgICAgICAgPSB1ZWNfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfc3RyaW5ncyAgICAgICAgICAgID0gdWVjX2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gdWVjX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfcGVybV9hZGRyICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfcGVybV9hZGRyLAorfTsKKwordm9pZCB1ZWNfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnVlY19ldGh0b29sX29wcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9taWkuYyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX21paS5jCmluZGV4IDdiY2I4MmYuLjVmOGMyZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoX21paS5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX21paS5jCkBAIC01NCw4ICs1NCw4IEBACiAjZGVmaW5lIHZkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlKDApCiAjZW5kaWYKIAotI2RlZmluZSBEUlZfREVTQyAiUUUgVUNDIEV0aGVybmV0IENvbnRyb2xsZXIgTUlJIEJ1cyIKLSNkZWZpbmUgRFJWX05BTUUgImZzbC11ZWNfbWRpbyIKKyNkZWZpbmUgTUlJX0RSVl9ERVNDICJRRSBVQ0MgRXRoZXJuZXQgQ29udHJvbGxlciBNSUkgQnVzIgorI2RlZmluZSBNSUlfRFJWX05BTUUgImZzbC11ZWNfbWRpbyIKIAogLyogV3JpdGUgdmFsdWUgdG8gdGhlIFBIWSBmb3IgdGhpcyBkZXZpY2UgdG8gdGhlIHJlZ2lzdGVyIGF0IHJlZ251bSwgKi8KIC8qIHdhaXRpbmcgdW50aWwgdGhlIHdyaXRlIGlzIGRvbmUgYmVmb3JlIGl0IHJldHVybnMuICBBbGwgUEhZICovCkBAIC0yNjEsNyArMjYxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHVlY19tZGlvX2RyaXZlciA9IHsKLQkubmFtZQk9IERSVl9OQU1FLAorCS5uYW1lCT0gTUlJX0RSVl9OQU1FLAogCS5wcm9iZQk9IHVlY19tZGlvX3Byb2JlLAogCS5yZW1vdmUJPSB1ZWNfbWRpb19yZW1vdmUsCiAJLm1hdGNoX3RhYmxlCT0gdWVjX21kaW9fbWF0Y2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYwppbmRleCBhMDVmZDk3Li4wNGNiYTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKQEAgLTc2OCwxMSArNzY4LDEzIEBACiBzdGF0aWMgdm9pZCB3cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlwZWdhc3VzX3QgKnBlZ2FzdXMgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IHBlZ2FzdXMtPm5ldDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwogCiAJaWYgKCFwZWdhc3VzKQogCQlyZXR1cm47CiAKKwluZXQgPSBwZWdhc3VzLT5uZXQ7CisKIAlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KG5ldCkgfHwgIW5ldGlmX3J1bm5pbmcobmV0KSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBjODA2MjQ5Li41YzZhNWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTIyMCw2ICsyMjAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfb3NjX2NvbnRyb2xfc2V0KTsKIAorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiAvKgogICogX1N4RCByZXR1cm5zIHRoZSBELXN0YXRlIHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIKICAqIChsb3dlc3QgRC1zdGF0ZSBudW1iZXIpIHN1cHBvcnRlZCBpbiB0aGUgUy1zdGF0ZSAieCIuCkBAIC0yNDUsMTYgKzI0NiwzNCBAQAogICogY3VycmVudGx5IHdlIHNpbXBseSByZXR1cm4gX1N4RCwgaWYgcHJlc2VudC4KICAqLwogCi1zdGF0aWMgaW50IGFjcGlfcGNpX2Nob29zZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIHBjaV9wb3dlcl90IGFjcGlfcGNpX2Nob29zZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwlwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JLyogVEJEICovCisJaW50IGFjcGlfc3RhdGU7CiAKLQlyZXR1cm4gLUVOT0RFVjsKKwlhY3BpX3N0YXRlID0gYWNwaV9wbV9kZXZpY2Vfc2xlZXBfc3RhdGUoJnBkZXYtPmRldiwKKwkJZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldiksIE5VTEwpOworCWlmIChhY3BpX3N0YXRlIDwgMCkKKwkJcmV0dXJuIFBDSV9QT1dFUl9FUlJPUjsKKworCXN3aXRjaCAoYWNwaV9zdGF0ZSkgeworCWNhc2UgQUNQSV9TVEFURV9EMDoKKwkJcmV0dXJuIFBDSV9EMDsKKwljYXNlIEFDUElfU1RBVEVfRDE6CisJCXJldHVybiBQQ0lfRDE7CisJY2FzZSBBQ1BJX1NUQVRFX0QyOgorCQlyZXR1cm4gUENJX0QyOworCWNhc2UgQUNQSV9TVEFURV9EMzoKKwkJcmV0dXJuIFBDSV9EM2hvdDsKKwl9CisJcmV0dXJuIFBDSV9QT1dFUl9FUlJPUjsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGFjcGlfcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJmRldi0+ZGV2KTsKKwlhY3BpX2hhbmRsZSB0bXA7CiAJc3RhdGljIGludCBzdGF0ZV9jb252W10gPSB7CiAJCVswXSA9IDAsCiAJCVsxXSA9IDEsCkBAIC0yNjYsNiArMjg1LDkgQEAKIAogCWlmICghaGFuZGxlKQogCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBJZiB0aGUgQUNQSSBkZXZpY2UgaGFzIF9FSjAsIGlnbm9yZSB0aGUgZGV2aWNlICovCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0VKMCIsICZ0bXApKSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIGFjcGlfYnVzX3NldF9wb3dlcihoYW5kbGUsIGFjcGlfc3RhdGUpOwogfQogCkBAIC0zMjAsNyArMzQyLDkgQEAKIAlyZXQgPSByZWdpc3Rlcl9hY3BpX2J1c190eXBlKCZhY3BpX3BjaV9idXMpOwogCWlmIChyZXQpCiAJCXJldHVybiAwOworI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQCiAJcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSA9IGFjcGlfcGNpX2Nob29zZV9zdGF0ZTsKKyNlbmRpZgogCXBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUgPSBhY3BpX3BjaV9zZXRfcG93ZXJfc3RhdGU7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDAzZmQ1OWUuLjFlZTljZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC00OTksNyArNDk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50ICgqcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3BjaV9wb3dlcl90ICgqcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKICAKIC8qKgogICogcGNpX2Nob29zZV9zdGF0ZSAtIENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCkBAIC01MTMsMTUgKzUxMywxNSBAQAogCiBwY2lfcG93ZXJfdCBwY2lfY2hvb3NlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpbnQgcmV0OworCXBjaV9wb3dlcl90IHJldDsKIAogCWlmICghcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUE0pKQogCQlyZXR1cm4gUENJX0QwOwogCiAJaWYgKHBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUpIHsKIAkJcmV0ID0gcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKTsKLQkJaWYgKHJldCA+PSAwKQotCQkJc3RhdGUuZXZlbnQgPSByZXQ7CisJCWlmIChyZXQgIT0gUENJX1BPV0VSX0VSUk9SKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlzd2l0Y2ggKHN0YXRlLmV2ZW50KSB7CkBAIC0xNTE3LDcgKzE1MTcsNyBAQAogLyoqCiAgKiBwY2llX3NldF9yZWFkcnEgLSBzZXQgUENJIEV4cHJlc3MgbWF4aW11bSBtZW1vcnkgcmVhZCByZXF1ZXN0CiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIHF1ZXJ5Ci0gKiBAY291bnQ6IG1heGltdW0gbWVtb3J5IHJlYWQgY291bnQgaW4gYnl0ZXMKKyAqIEBycTogbWF4aW11bSBtZW1vcnkgcmVhZCBjb3VudCBpbiBieXRlcwogICogICAgdmFsaWQgdmFsdWVzIGFyZSAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2CiAgKgogICogSWYgcG9zc2libGUgc2V0cyBtYXhpbXVtIHJlYWQgYnl0ZSBjb3VudApAQCAtMTYwNCw2ICsxNjA0LDcgQEAKIGRldmljZV9pbml0Y2FsbChwY2lfaW5pdCk7CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9yZXN0b3JlX2JhcnMpOworRVhQT1JUX1NZTUJPTChfX3BjaV9yZWVuYWJsZV9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX2RldmljZV9iYXJzKTsKIEVYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChwY2ltX2VuYWJsZV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCAzZmVjMTNkLi5jNmUxMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMSw2ICsxLDUgQEAKIC8qIEZ1bmN0aW9ucyBpbnRlcm5hbCB0byB0aGUgUENJIGNvcmUgY29kZSAqLwogCi1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBfX3BjaV9yZWVuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKik7CiBleHRlcm4gaW50IHBjaV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLAogCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7CiBleHRlcm4gaW50IHBjaV9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKQEAgLTEzLDcgKzEyLDcgQEAKIAkJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZV90LCByZXNvdXJjZV9zaXplX3QpLAogCQkJCSAgdm9pZCAqYWxpZ25mX2RhdGEpOwogLyogRmlybXdhcmUgY2FsbGJhY2tzICovCi1leHRlcm4gaW50ICgqcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK2V4dGVybiBwY2lfcG93ZXJfdCAoKnBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50ICgqcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpOwogCiBleHRlcm4gaW50IHBjaV91c2VyX3JlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1OCAqdmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NhcmQuYyBiL2RyaXZlcnMvcG5wL2NhcmQuYwppbmRleCBkZDYzODRiLi5iNmE0ZjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jYXJkLmMKKysrIGIvZHJpdmVycy9wbnAvY2FyZC5jCkBAIC0yLDcgKzIsNiBAQAogICogY2FyZC5jIC0gY29udGFpbnMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBncm91cHMgb2YgUG5QIGRldmljZXMKICAqCiAgKiBDb3B5cmlnaHQgMjAwMiBBZGFtIEJlbGF5IDxhbWJ4MUBuZW8ucnIuY29tPgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMywyNiArMTIsMzEgQEAKIExJU1RfSEVBRChwbnBfY2FyZHMpOwogc3RhdGljIExJU1RfSEVBRChwbnBfY2FyZF9kcml2ZXJzKTsKIAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqIG1hdGNoX2NhcmQoc3RydWN0IHBucF9jYXJkX2RyaXZlciAqIGRydiwgc3RydWN0IHBucF9jYXJkICogY2FyZCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICptYXRjaF9jYXJkKHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydiwKKwkJCQkJCSAgIHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkKIHsKLQljb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICogZHJ2X2lkID0gZHJ2LT5pZF90YWJsZTsKLQl3aGlsZSAoKmRydl9pZC0+aWQpewotCQlpZiAoY29tcGFyZV9wbnBfaWQoY2FyZC0+aWQsZHJ2X2lkLT5pZCkpIHsKKwljb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICpkcnZfaWQgPSBkcnYtPmlkX3RhYmxlOworCisJd2hpbGUgKCpkcnZfaWQtPmlkKSB7CisJCWlmIChjb21wYXJlX3BucF9pZChjYXJkLT5pZCwgZHJ2X2lkLT5pZCkpIHsKIAkJCWludCBpID0gMDsKKwogCQkJZm9yICg7OykgewogCQkJCWludCBmb3VuZDsKIAkJCQlzdHJ1Y3QgcG5wX2RldiAqZGV2OwotCQkJCWlmIChpID09IFBOUF9NQVhfREVWSUNFUyB8fCAhICpkcnZfaWQtPmRldnNbaV0uaWQpCisKKwkJCQlpZiAoaSA9PSBQTlBfTUFYX0RFVklDRVMKKwkJCQkgICAgfHwgISpkcnZfaWQtPmRldnNbaV0uaWQpCiAJCQkJCXJldHVybiBkcnZfaWQ7CiAJCQkJZm91bmQgPSAwOwogCQkJCWNhcmRfZm9yX2VhY2hfZGV2KGNhcmQsIGRldikgewotCQkJCQlpZiAoY29tcGFyZV9wbnBfaWQoZGV2LT5pZCwgZHJ2X2lkLT5kZXZzW2ldLmlkKSkgeworCQkJCQlpZiAoY29tcGFyZV9wbnBfaWQKKwkJCQkJICAgIChkZXYtPmlkLCBkcnZfaWQtPmRldnNbaV0uaWQpKSB7CiAJCQkJCQlmb3VuZCA9IDE7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCX0KLQkJCQlpZiAoISBmb3VuZCkKKwkJCQlpZiAoIWZvdW5kKQogCQkJCQlicmVhazsKIAkJCQlpKys7CiAJCQl9CkBAIC00MiwxNCArNDYsMTUgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgY2FyZF9yZW1vdmUoc3RydWN0IHBucF9kZXYgKiBkZXYpCitzdGF0aWMgdm9pZCBjYXJkX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewogCWRldi0+Y2FyZF9saW5rID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgY2FyZF9yZW1vdmVfZmlyc3Qoc3RydWN0IHBucF9kZXYgKiBkZXYpCitzdGF0aWMgdm9pZCBjYXJkX3JlbW92ZV9maXJzdChzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewotCXN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKiBkcnYgPSB0b19wbnBfY2FyZF9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydiA9IHRvX3BucF9jYXJkX2RyaXZlcihkZXYtPmRyaXZlcik7CisKIAlpZiAoIWRldi0+Y2FyZCB8fCAhZHJ2KQogCQlyZXR1cm47CiAJaWYgKGRydi0+cmVtb3ZlKQpAQCAtNjcsNyArNzIsNyBAQAogCiAJaWYgKCFkcnYtPnByb2JlKQogCQlyZXR1cm4gMDsKLQlpZCA9IG1hdGNoX2NhcmQoZHJ2LGNhcmQpOworCWlkID0gbWF0Y2hfY2FyZChkcnYsIGNhcmQpOwogCWlmICghaWQpCiAJCXJldHVybiAwOwogCkBAIC05NCwxMiArOTksMTEgQEAKICAqIHBucF9hZGRfY2FyZF9pZCAtIGFkZHMgYW4gRUlTQSBpZCB0byB0aGUgc3BlY2lmaWVkIGNhcmQKICAqIEBpZDogcG9pbnRlciB0byBhIHBucF9pZCBzdHJ1Y3R1cmUKICAqIEBjYXJkOiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGNhcmQKLSAqCiAgKi8KLQotaW50IHBucF9hZGRfY2FyZF9pZChzdHJ1Y3QgcG5wX2lkICppZCwgc3RydWN0IHBucF9jYXJkICogY2FyZCkKK2ludCBwbnBfYWRkX2NhcmRfaWQoc3RydWN0IHBucF9pZCAqaWQsIHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkKIHsKLQlzdHJ1Y3QgcG5wX2lkICogcHRyOworCXN0cnVjdCBwbnBfaWQgKnB0cjsKKwogCWlmICghaWQpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghY2FyZCkKQEAgLTExNSwxMCArMTE5LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBucF9mcmVlX2NhcmRfaWRzKHN0cnVjdCBwbnBfY2FyZCAqIGNhcmQpCitzdGF0aWMgdm9pZCBwbnBfZnJlZV9jYXJkX2lkcyhzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQpCiB7Ci0Jc3RydWN0IHBucF9pZCAqIGlkOworCXN0cnVjdCBwbnBfaWQgKmlkOwogCXN0cnVjdCBwbnBfaWQgKm5leHQ7CisKIAlpZiAoIWNhcmQpCiAJCXJldHVybjsKIAlpZCA9IGNhcmQtPmlkOwpAQCAtMTMxLDQ5ICsxMzYsNTUgQEAKIAogc3RhdGljIHZvaWQgcG5wX3JlbGVhc2VfY2FyZChzdHJ1Y3QgZGV2aWNlICpkbWRldikKIHsKLQlzdHJ1Y3QgcG5wX2NhcmQgKiBjYXJkID0gdG9fcG5wX2NhcmQoZG1kZXYpOworCXN0cnVjdCBwbnBfY2FyZCAqY2FyZCA9IHRvX3BucF9jYXJkKGRtZGV2KTsKKwogCXBucF9mcmVlX2NhcmRfaWRzKGNhcmQpOwogCWtmcmVlKGNhcmQpOwogfQogCi0KLXN0YXRpYyBzc2l6ZV90IHBucF9zaG93X2NhcmRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkbWRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBucF9zaG93X2NhcmRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkbWRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJY2hhciAqc3RyID0gYnVmOwogCXN0cnVjdCBwbnBfY2FyZCAqY2FyZCA9IHRvX3BucF9jYXJkKGRtZGV2KTsKLQlzdHIgKz0gc3ByaW50ZihzdHIsIiVzXG4iLCBjYXJkLT5uYW1lKTsKKworCXN0ciArPSBzcHJpbnRmKHN0ciwgIiVzXG4iLCBjYXJkLT5uYW1lKTsKIAlyZXR1cm4gKHN0ciAtIGJ1Zik7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLFNfSVJVR08scG5wX3Nob3dfY2FyZF9uYW1lLE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHBucF9zaG93X2NhcmRfbmFtZSwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHBucF9zaG93X2NhcmRfaWRzKHN0cnVjdCBkZXZpY2UgKmRtZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG5wX3Nob3dfY2FyZF9pZHMoc3RydWN0IGRldmljZSAqZG1kZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJY2hhciAqc3RyID0gYnVmOwogCXN0cnVjdCBwbnBfY2FyZCAqY2FyZCA9IHRvX3BucF9jYXJkKGRtZGV2KTsKLQlzdHJ1Y3QgcG5wX2lkICogcG9zID0gY2FyZC0+aWQ7CisJc3RydWN0IHBucF9pZCAqcG9zID0gY2FyZC0+aWQ7CiAKIAl3aGlsZSAocG9zKSB7Ci0JCXN0ciArPSBzcHJpbnRmKHN0ciwiJXNcbiIsIHBvcy0+aWQpOworCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlc1xuIiwgcG9zLT5pZCk7CiAJCXBvcyA9IHBvcy0+bmV4dDsKIAl9CiAJcmV0dXJuIChzdHIgLSBidWYpOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIoY2FyZF9pZCxTX0lSVUdPLHBucF9zaG93X2NhcmRfaWRzLE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcmRfaWQsIFNfSVJVR08sIHBucF9zaG93X2NhcmRfaWRzLCBOVUxMKTsKIAogc3RhdGljIGludCBwbnBfaW50ZXJmYWNlX2F0dGFjaF9jYXJkKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkKIHsKLQlpbnQgcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNhcmQtPmRldiwmZGV2X2F0dHJfbmFtZSk7Ci0JaWYgKHJjKSByZXR1cm4gcmM7CisJaW50IHJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjYXJkLT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKIAotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjYXJkLT5kZXYsJmRldl9hdHRyX2NhcmRfaWQpOwotCWlmIChyYykgZ290byBlcnJfbmFtZTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjYXJkLT5kZXYsICZkZXZfYXR0cl9jYXJkX2lkKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX25hbWU7CiAKIAlyZXR1cm4gMDsKIAotZXJyX25hbWU6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZjYXJkLT5kZXYsJmRldl9hdHRyX25hbWUpOworICAgICAgZXJyX25hbWU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZjYXJkLT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE4MSwxNSArMTkyLDE2IEBACiAgKiBwbnBfYWRkX2NhcmQgLSBhZGRzIGEgUG5QIGNhcmQgdG8gdGhlIFBuUCBMYXllcgogICogQGNhcmQ6IHBvaW50ZXIgdG8gdGhlIGNhcmQgdG8gYWRkCiAgKi8KLQotaW50IHBucF9hZGRfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKiBjYXJkKQoraW50IHBucF9hZGRfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQpCiB7CiAJaW50IGVycm9yOwotCXN0cnVjdCBsaXN0X2hlYWQgKiBwb3MsICogdGVtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOworCiAJaWYgKCFjYXJkIHx8ICFjYXJkLT5wcm90b2NvbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcHJpbnRmKGNhcmQtPmRldi5idXNfaWQsICIlMDJ4OiUwMngiLCBjYXJkLT5wcm90b2NvbC0+bnVtYmVyLCBjYXJkLT5udW1iZXIpOworCXNwcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgIiUwMng6JTAyeCIsIGNhcmQtPnByb3RvY29sLT5udW1iZXIsCisJCWNhcmQtPm51bWJlcik7CiAJY2FyZC0+ZGV2LnBhcmVudCA9ICZjYXJkLT5wcm90b2NvbC0+ZGV2OwogCWNhcmQtPmRldi5idXMgPSBOVUxMOwogCWNhcmQtPmRldi5yZWxlYXNlID0gJnBucF9yZWxlYXNlX2NhcmQ7CkBAIC0yMDUsMTggKzIxNywyMSBAQAogCQkvKiB3ZSB3YWl0IHVudGlsIG5vdyB0byBhZGQgZGV2aWNlcyBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGRyaXZlcnMKIAkJICogd2lsbCBiZSBhYmxlIHRvIHVzZSBhbGwgb2YgdGhlIHJlbGF0ZWQgZGV2aWNlcyBvbiB0aGUgY2FyZAogCQkgKiB3aXRob3V0IHdhaXRpbmcgYW55IHVucmVzb25hYmxlIGxlbmd0aCBvZiB0aW1lICovCi0JCWxpc3RfZm9yX2VhY2gocG9zLCZjYXJkLT5kZXZpY2VzKXsKKwkJbGlzdF9mb3JfZWFjaChwb3MsICZjYXJkLT5kZXZpY2VzKSB7CiAJCQlzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gY2FyZF90b19wbnBfZGV2KHBvcyk7CiAJCQlfX3BucF9hZGRfZGV2aWNlKGRldik7CiAJCX0KIAogCQkvKiBtYXRjaCB3aXRoIGNhcmQgZHJpdmVycyAqLwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLHRlbXAsJnBucF9jYXJkX2RyaXZlcnMpewotCQkJc3RydWN0IHBucF9jYXJkX2RyaXZlciAqIGRydiA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyLCBnbG9iYWxfbGlzdCk7Ci0JCQljYXJkX3Byb2JlKGNhcmQsZHJ2KTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJnBucF9jYXJkX2RyaXZlcnMpIHsKKwkJCXN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydiA9CisJCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIsCisJCQkJICAgICAgIGdsb2JhbF9saXN0KTsKKwkJCWNhcmRfcHJvYmUoY2FyZCwgZHJ2KTsKIAkJfQogCX0gZWxzZQotCQlwbnBfZXJyKCJzeXNmcyBmYWlsdXJlLCBjYXJkICclcycgd2lsbCBiZSB1bmF2YWlsYWJsZSIsIGNhcmQtPmRldi5idXNfaWQpOworCQlwbnBfZXJyKCJzeXNmcyBmYWlsdXJlLCBjYXJkICclcycgd2lsbCBiZSB1bmF2YWlsYWJsZSIsCisJCQljYXJkLT5kZXYuYnVzX2lkKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTIyNCwxMCArMjM5LDEwIEBACiAgKiBwbnBfcmVtb3ZlX2NhcmQgLSByZW1vdmVzIGEgUG5QIGNhcmQgZnJvbSB0aGUgUG5QIExheWVyCiAgKiBAY2FyZDogcG9pbnRlciB0byB0aGUgY2FyZCB0byByZW1vdmUKICAqLwotCi12b2lkIHBucF9yZW1vdmVfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKiBjYXJkKQordm9pZCBwbnBfcmVtb3ZlX2NhcmQoc3RydWN0IHBucF9jYXJkICpjYXJkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CisKIAlpZiAoIWNhcmQpCiAJCXJldHVybjsKIAlkZXZpY2VfdW5yZWdpc3RlcigmY2FyZC0+ZGV2KTsKQEAgLTIzNSw3ICsyNTAsNyBAQAogCWxpc3RfZGVsKCZjYXJkLT5nbG9iYWxfbGlzdCk7CiAJbGlzdF9kZWwoJmNhcmQtPnByb3RvY29sX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcyx0ZW1wLCZjYXJkLT5kZXZpY2VzKXsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmY2FyZC0+ZGV2aWNlcykgewogCQlzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gY2FyZF90b19wbnBfZGV2KHBvcyk7CiAJCXBucF9yZW1vdmVfY2FyZF9kZXZpY2UoZGV2KTsKIAl9CkBAIC0yNDYsMTUgKzI2MSwxNCBAQAogICogQGNhcmQ6IHBvaW50ZXIgdG8gdGhlIGNhcmQgdG8gYWRkIHRvCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdG8gYWRkCiAgKi8KLQotaW50IHBucF9hZGRfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9jYXJkICogY2FyZCwgc3RydWN0IHBucF9kZXYgKiBkZXYpCitpbnQgcG5wX2FkZF9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsIHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7CiAJaWYgKCFjYXJkIHx8ICFkZXYgfHwgIWRldi0+cHJvdG9jb2wpCiAJCXJldHVybiAtRUlOVkFMOwogCWRldi0+ZGV2LnBhcmVudCA9ICZjYXJkLT5kZXY7CiAJZGV2LT5jYXJkX2xpbmsgPSBOVUxMOwotCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlMDJ4OiUwMnguJTAyeCIsIGRldi0+cHJvdG9jb2wtPm51bWJlciwKLQkJIGNhcmQtPm51bWJlcixkZXYtPm51bWJlcik7CisJc25wcmludGYoZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiUwMng6JTAyeC4lMDJ4IiwKKwkJIGRldi0+cHJvdG9jb2wtPm51bWJlciwgY2FyZC0+bnVtYmVyLCBkZXYtPm51bWJlcik7CiAJc3Bpbl9sb2NrKCZwbnBfbG9jayk7CiAJZGV2LT5jYXJkID0gY2FyZDsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmNhcmRfbGlzdCwgJmNhcmQtPmRldmljZXMpOwpAQCAtMjY2LDggKzI4MCw3IEBACiAgKiBwbnBfcmVtb3ZlX2NhcmRfZGV2aWNlLSByZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHNwZWNpZmllZCBjYXJkCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgdG8gcmVtb3ZlCiAgKi8KLQotdm9pZCBwbnBfcmVtb3ZlX2NhcmRfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICogZGV2KQordm9pZCBwbnBfcmVtb3ZlX2NhcmRfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7CiAJc3Bpbl9sb2NrKCZwbnBfbG9jayk7CiAJZGV2LT5jYXJkID0gTlVMTDsKQEAgLTI4MiwxMyArMjk1LDE0IEBACiAgKiBAaWQ6IHBvaW50ZXIgdG8gYSBQblAgSUQgc3RydWN0dXJlIHRoYXQgZXhwbGFpbnMgdGhlIHJ1bGVzIGZvciBmaW5kaW5nIHRoZSBkZXZpY2UKICAqIEBmcm9tOiBTdGFydGluZyBwbGFjZSB0byBzZWFyY2ggZnJvbS4gSWYgTlVMTCBpdCB3aWxsIHN0YXJ0IGZyb20gdGhlIGJlZ2luaW5nLgogICovCi0KLXN0cnVjdCBwbnBfZGV2ICogcG5wX3JlcXVlc3RfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9jYXJkX2xpbmsgKmNsaW5rLCBjb25zdCBjaGFyICogaWQsIHN0cnVjdCBwbnBfZGV2ICogZnJvbSkKK3N0cnVjdCBwbnBfZGV2ICpwbnBfcmVxdWVzdF9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2xpbmssCisJCQkJCWNvbnN0IGNoYXIgKmlkLCBzdHJ1Y3QgcG5wX2RldiAqZnJvbSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogcG9zOwotCXN0cnVjdCBwbnBfZGV2ICogZGV2OwotCXN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKiBkcnY7Ci0Jc3RydWN0IHBucF9jYXJkICogY2FyZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IHBucF9kZXYgKmRldjsKKwlzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICpkcnY7CisJc3RydWN0IHBucF9jYXJkICpjYXJkOworCiAJaWYgKCFjbGluayB8fCAhaWQpCiAJCWdvdG8gZG9uZTsKIAljYXJkID0gY2xpbmstPmNhcmQ7CkBAIC0zMDIsMTUgKzMxNiwxNSBAQAogCX0KIAl3aGlsZSAocG9zICE9ICZjYXJkLT5kZXZpY2VzKSB7CiAJCWRldiA9IGNhcmRfdG9fcG5wX2Rldihwb3MpOwotCQlpZiAoKCFkZXYtPmNhcmRfbGluaykgJiYgY29tcGFyZV9wbnBfaWQoZGV2LT5pZCxpZCkpCisJCWlmICgoIWRldi0+Y2FyZF9saW5rKSAmJiBjb21wYXJlX3BucF9pZChkZXYtPmlkLCBpZCkpCiAJCQlnb3RvIGZvdW5kOwogCQlwb3MgPSBwb3MtPm5leHQ7CiAJfQogCi1kb25lOgorICAgICAgZG9uZToKIAlyZXR1cm4gTlVMTDsKIAotZm91bmQ6CisgICAgICBmb3VuZDoKIAlkZXYtPmNhcmRfbGluayA9IGNsaW5rOwogCWRldi0+ZGV2LmRyaXZlciA9ICZkcnYtPmxpbmsuZHJpdmVyOwogCWlmIChwbnBfYnVzX3R5cGUucHJvYmUoJmRldi0+ZGV2KSkKQEAgLTMyMCw3ICszMzQsNyBAQAogCiAJcmV0dXJuIGRldjsKIAotZXJyX291dDoKKyAgICAgIGVycl9vdXQ6CiAJZGV2LT5kZXYuZHJpdmVyID0gTlVMTDsKIAlkZXYtPmNhcmRfbGluayA9IE5VTEw7CiAJcmV0dXJuIE5VTEw7CkBAIC0zMzAsMTAgKzM0NCwxMCBAQAogICogcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2UgLSBjYWxsIHRoaXMgd2hlbiB0aGUgZHJpdmVyIG5vIGxvbmdlciBuZWVkcyB0aGUgZGV2aWNlCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBQblAgZGV2aWNlIHN0dWN0dXJlCiAgKi8KLQotdm9pZCBwbnBfcmVsZWFzZV9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqIGRldikKK3ZvaWQgcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICogZHJ2ID0gZGV2LT5jYXJkX2xpbmstPmRyaXZlcjsKKwlzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICpkcnYgPSBkZXYtPmNhcmRfbGluay0+ZHJpdmVyOworCiAJaWYgKCFkcnYpCiAJCXJldHVybjsKIAlkcnYtPmxpbmsucmVtb3ZlID0gJmNhcmRfcmVtb3ZlOwpAQCAtMzQ3LDYgKzM2MSw3IEBACiBzdGF0aWMgaW50IGNhcmRfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHBucF9jYXJkX2xpbmsgKmxpbmsgPSBkZXYtPmNhcmRfbGluazsKKwogCWlmIChsaW5rLT5wbV9zdGF0ZS5ldmVudCA9PSBzdGF0ZS5ldmVudCkKIAkJcmV0dXJuIDA7CiAJbGluay0+cG1fc3RhdGUgPSBzdGF0ZTsKQEAgLTM1Niw2ICszNzEsNyBAQAogc3RhdGljIGludCBjYXJkX3Jlc3VtZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewogCXN0cnVjdCBwbnBfY2FyZF9saW5rICpsaW5rID0gZGV2LT5jYXJkX2xpbms7CisKIAlpZiAobGluay0+cG1fc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCiAJCXJldHVybiAwOwogCWxpbmstPnBtX3N0YXRlID0gUE1TR19PTjsKQEAgLTM2Nyw4ICszODMsNyBAQAogICogcG5wX3JlZ2lzdGVyX2NhcmRfZHJpdmVyIC0gcmVnaXN0ZXJzIGEgUG5QIGNhcmQgZHJpdmVyIHdpdGggdGhlIFBuUCBMYXllcgogICogQGRydjogcG9pbnRlciB0byB0aGUgZHJpdmVyIHRvIHJlZ2lzdGVyCiAgKi8KLQotaW50IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcihzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICogZHJ2KQoraW50IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcihzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICpkcnYpCiB7CiAJaW50IGVycm9yOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CkBAIC0zODksOSArNDA0LDEwIEBACiAJbGlzdF9hZGRfdGFpbCgmZHJ2LT5nbG9iYWxfbGlzdCwgJnBucF9jYXJkX2RyaXZlcnMpOwogCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLHRlbXAsJnBucF9jYXJkcyl7Ci0JCXN0cnVjdCBwbnBfY2FyZCAqY2FyZCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcG5wX2NhcmQsIGdsb2JhbF9saXN0KTsKLQkJY2FyZF9wcm9iZShjYXJkLGRydik7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJnBucF9jYXJkcykgeworCQlzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQgPQorCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwbnBfY2FyZCwgZ2xvYmFsX2xpc3QpOworCQljYXJkX3Byb2JlKGNhcmQsIGRydik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDAwLDggKzQxNiw3IEBACiAgKiBwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlciAtIHVucmVnaXN0ZXJzIGEgUG5QIGNhcmQgZHJpdmVyIGZyb20gdGhlIFBuUCBMYXllcgogICogQGRydjogcG9pbnRlciB0byB0aGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKICAqLwotCi12b2lkIHBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKiBkcnYpCit2b2lkIHBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydikKIHsKIAlzcGluX2xvY2soJnBucF9sb2NrKTsKIAlsaXN0X2RlbCgmZHJ2LT5nbG9iYWxfbGlzdCk7CkBAIC00MDksMTMgKzQyNCw2IEBACiAJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZkcnYtPmxpbmspOwogfQogCi0jaWYgMAotRVhQT1JUX1NZTUJPTChwbnBfYWRkX2NhcmQpOwotRVhQT1JUX1NZTUJPTChwbnBfcmVtb3ZlX2NhcmQpOwotRVhQT1JUX1NZTUJPTChwbnBfYWRkX2NhcmRfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wocG5wX3JlbW92ZV9jYXJkX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBucF9hZGRfY2FyZF9pZCk7Ci0jZW5kaWYgIC8qICAwICAqLwogRVhQT1JUX1NZTUJPTChwbnBfcmVxdWVzdF9jYXJkX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBucF9yZWxlYXNlX2NhcmRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocG5wX3JlZ2lzdGVyX2NhcmRfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2NvcmUuYwppbmRleCA4ZTdiMmRkLi42MTA2NmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvY29yZS5jCkBAIC0yLDcgKzIsNiBAQAogICogY29yZS5jIC0gY29udGFpbnMgYWxsIGNvcmUgZGV2aWNlIGFuZCBwcm90b2NvbCByZWdpc3RyYXRpb24gZnVuY3Rpb25zCiAgKgogICogQ29weXJpZ2h0IDIwMDIgQWRhbSBCZWxheSA8YW1ieDFAbmVvLnJyLmNvbT4KLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgpAQCAtMTgsNyArMTcsNiBAQAogCiAjaW5jbHVkZSAiYmFzZS5oIgogCi0KIHN0YXRpYyBMSVNUX0hFQUQocG5wX3Byb3RvY29scyk7CiBMSVNUX0hFQUQocG5wX2dsb2JhbCk7CiBERUZJTkVfU1BJTkxPQ0socG5wX2xvY2spOwpAQCAtMzYsNyArMzQsNyBAQAogCXZvaWQgKnJlc3VsdDsKIAogCXJlc3VsdCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXN1bHQpeworCWlmICghcmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAicG5wOiBPdXQgb2YgTWVtb3J5XG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDksMTEgKzQ3LDEwIEBACiAgKgogICogIEV4IHByb3RvY29sczogSVNBUE5QLCBQTlBCSU9TLCBldGMKICAqLwotCiBpbnQgcG5wX3JlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBwbnBfcHJvdG9jb2wgKnByb3RvY29sKQogewogCWludCBub2RlbnVtOwotCXN0cnVjdCBsaXN0X2hlYWQgKiBwb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCiAJaWYgKCFwcm90b2NvbCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NCw5ICs2MSw5IEBACiAJc3Bpbl9sb2NrKCZwbnBfbG9jayk7CiAKIAkvKiBhc3NpZ24gdGhlIGxvd2VzdCB1bnVzZWQgbnVtYmVyICovCi0JbGlzdF9mb3JfZWFjaChwb3MsJnBucF9wcm90b2NvbHMpIHsKLQkJc3RydWN0IHBucF9wcm90b2NvbCAqIGN1ciA9IHRvX3BucF9wcm90b2NvbChwb3MpOwotCQlpZiAoY3VyLT5udW1iZXIgPT0gbm9kZW51bSl7CisJbGlzdF9mb3JfZWFjaChwb3MsICZwbnBfcHJvdG9jb2xzKSB7CisJCXN0cnVjdCBwbnBfcHJvdG9jb2wgKmN1ciA9IHRvX3BucF9wcm90b2NvbChwb3MpOworCQlpZiAoY3VyLT5udW1iZXIgPT0gbm9kZW51bSkgewogCQkJcG9zID0gJnBucF9wcm90b2NvbHM7CiAJCQlub2RlbnVtKys7CiAJCX0KQEAgLTgzLDcgKzgwLDYgQEAKIC8qKgogICogcG5wX3Byb3RvY29sX3VucmVnaXN0ZXIgLSByZW1vdmVzIGEgcG5wIHByb3RvY29sIGZyb20gdGhlIHBucCBsYXllcgogICogQHByb3RvY29sOiBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBucF9wcm90b2NvbCBzdHJ1Y3R1cmUKLSAqCiAgKi8KIHZvaWQgcG5wX3VucmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IHBucF9wcm90b2NvbCAqcHJvdG9jb2wpCiB7CkBAIC05MywxMSArODksMTEgQEAKIAlkZXZpY2VfdW5yZWdpc3RlcigmcHJvdG9jb2wtPmRldik7CiB9CiAKLQogc3RhdGljIHZvaWQgcG5wX2ZyZWVfaWRzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBucF9pZCAqIGlkOwotCXN0cnVjdCBwbnBfaWQgKiBuZXh0OworCXN0cnVjdCBwbnBfaWQgKmlkOworCXN0cnVjdCBwbnBfaWQgKm5leHQ7CisKIAlpZiAoIWRldikKIAkJcmV0dXJuOwogCWlkID0gZGV2LT5pZDsKQEAgLTExMCw3ICsxMDYsOCBAQAogCiBzdGF0aWMgdm9pZCBwbnBfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZG1kZXYpCiB7Ci0Jc3RydWN0IHBucF9kZXYgKiBkZXYgPSB0b19wbnBfZGV2KGRtZGV2KTsKKwlzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gdG9fcG5wX2RldihkbWRldik7CisKIAlwbnBfZnJlZV9vcHRpb24oZGV2LT5pbmRlcGVuZGVudCk7CiAJcG5wX2ZyZWVfb3B0aW9uKGRldi0+ZGVwZW5kZW50KTsKIAlwbnBfZnJlZV9pZHMoZGV2KTsKQEAgLTEyMCw2ICsxMTcsNyBAQAogaW50IF9fcG5wX2FkZF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlpbnQgcmV0OworCiAJcG5wX2ZpeHVwX2RldmljZShkZXYpOwogCWRldi0+ZGV2LmJ1cyA9ICZwbnBfYnVzX3R5cGU7CiAJZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKQEAgLTE0MywxMyArMTQxLDEzIEBACiAgKgogICogIGFkZHMgdG8gZHJpdmVyIG1vZGVsLCBuYW1lIGRhdGFiYXNlLCBmaXh1cHMsIGludGVyZmFjZSwgZXRjLgogICovCi0KIGludCBwbnBfYWRkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewogCWlmICghZGV2IHx8ICFkZXYtPnByb3RvY29sIHx8IGRldi0+Y2FyZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZGV2LT5kZXYucGFyZW50ID0gJmRldi0+cHJvdG9jb2wtPmRldjsKLQlzcHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgIiUwMng6JTAyeCIsIGRldi0+cHJvdG9jb2wtPm51bWJlciwgZGV2LT5udW1iZXIpOworCXNwcmludGYoZGV2LT5kZXYuYnVzX2lkLCAiJTAyeDolMDJ4IiwgZGV2LT5wcm90b2NvbC0+bnVtYmVyLAorCQlkZXYtPm51bWJlcik7CiAJcmV0dXJuIF9fcG5wX2FkZF9kZXZpY2UoZGV2KTsKIH0KIApAQCAtMTYyLDIxICsxNjAsNiBAQAogCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldik7CiB9CiAKLS8qKgotICogcG5wX3JlbW92ZV9kZXZpY2UgLSByZW1vdmVzIGEgcG5wIGRldmljZSBmcm9tIHRoZSBwbnAgbGF5ZXIKLSAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2IHRvIGFkZAotICoKLSAqIHRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCBtZW0gdXNlZCBieSBkZXYKLSAqLwotI2lmIDAKLXZvaWQgcG5wX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKLXsKLQlpZiAoIWRldiB8fCBkZXYtPmNhcmQpCi0JCXJldHVybjsKLQlfX3BucF9yZW1vdmVfZGV2aWNlKGRldik7Ci19Ci0jZW5kaWYgIC8qICAwICAqLwotCiBzdGF0aWMgaW50IF9faW5pdCBwbnBfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIkxpbnV4IFBsdWcgYW5kIFBsYXkgU3VwcG9ydCB2MC45NyAoYykgQWRhbSBCZWxheVxuIik7CkBAIC0xODQsMTAgKzE2NywzIEBACiB9CiAKIHN1YnN5c19pbml0Y2FsbChwbnBfaW5pdCk7Ci0KLSNpZiAwCi1FWFBPUlRfU1lNQk9MKHBucF9yZWdpc3Rlcl9wcm90b2NvbCk7Ci1FWFBPUlRfU1lNQk9MKHBucF91bnJlZ2lzdGVyX3Byb3RvY29sKTsKLUVYUE9SVF9TWU1CT0wocG5wX2FkZF9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChwbnBfcmVtb3ZlX2RldmljZSk7Ci0jZW5kaWYgIC8qICAwICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvZHJpdmVyLmMgYi9kcml2ZXJzL3BucC9kcml2ZXIuYwppbmRleCBlMTYxNDIzLi4zMGI4ZjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9kcml2ZXIuYworKysgYi9kcml2ZXJzL3BucC9kcml2ZXIuYwpAQCAtMiw3ICsyLDYgQEAKICAqIGRyaXZlci5jIC0gZGV2aWNlIGlkIG1hdGNoaW5nLCBkcml2ZXIgbW9kZWwsIGV0Yy4KICAqCiAgKiBDb3B5cmlnaHQgMjAwMiBBZGFtIEJlbGF5IDxhbWJ4MUBuZW8ucnIuY29tPgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0xNiwxMiArMTUsMTEgQEAKIHN0YXRpYyBpbnQgY29tcGFyZV9mdW5jKGNvbnN0IGNoYXIgKmlkYSwgY29uc3QgY2hhciAqaWRiKQogewogCWludCBpOworCiAJLyogd2Ugb25seSBuZWVkIHRvIGNvbXBhcmUgdGhlIGxhc3QgNCBjaGFycyAqLwotCWZvciAoaT0zOyBpPDc7IGkrKykKLQl7CisJZm9yIChpID0gMzsgaSA8IDc7IGkrKykgewogCQlpZiAoaWRhW2ldICE9ICdYJyAmJgotCQkgICAgaWRiW2ldICE9ICdYJyAmJgotCQkgICAgdG91cHBlcihpZGFbaV0pICE9IHRvdXBwZXIoaWRiW2ldKSkKKwkJICAgIGlkYltpXSAhPSAnWCcgJiYgdG91cHBlcihpZGFbaV0pICE9IHRvdXBwZXIoaWRiW2ldKSkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAgLTMxLDIwICsyOSwyMiBAQAogewogCWlmICghcG9zIHx8ICFpZCB8fCAoc3RybGVuKGlkKSAhPSA3KSkKIAkJcmV0dXJuIDA7Ci0JaWYgKG1lbWNtcChpZCwiQU5ZREVWUyIsNyk9PTApCisJaWYgKG1lbWNtcChpZCwgIkFOWURFVlMiLCA3KSA9PSAwKQogCQlyZXR1cm4gMTsKLQl3aGlsZSAocG9zKXsKLQkJaWYgKG1lbWNtcChwb3MtPmlkLGlkLDMpPT0wKQotCQkJaWYgKGNvbXBhcmVfZnVuYyhwb3MtPmlkLGlkKT09MSkKKwl3aGlsZSAocG9zKSB7CisJCWlmIChtZW1jbXAocG9zLT5pZCwgaWQsIDMpID09IDApCisJCQlpZiAoY29tcGFyZV9mdW5jKHBvcy0+aWQsIGlkKSA9PSAxKQogCQkJCXJldHVybiAxOwogCQlwb3MgPSBwb3MtPm5leHQ7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKiBtYXRjaF9kZXZpY2Uoc3RydWN0IHBucF9kcml2ZXIgKmRydiwgc3RydWN0IHBucF9kZXYgKmRldikKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqbWF0Y2hfZGV2aWNlKHN0cnVjdCBwbnBfZHJpdmVyICpkcnYsCisJCQkJCQlzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkcnZfaWQgPSBkcnYtPmlkX3RhYmxlOworCiAJaWYgKCFkcnZfaWQpCiAJCXJldHVybiBOVUxMOwogCkBAIC01OSw3ICs1OSw3IEBACiBpbnQgcG5wX2RldmljZV9hdHRhY2goc3RydWN0IHBucF9kZXYgKnBucF9kZXYpCiB7CiAJc3Bpbl9sb2NrKCZwbnBfbG9jayk7Ci0JaWYocG5wX2Rldi0+c3RhdHVzICE9IFBOUF9SRUFEWSl7CisJaWYgKHBucF9kZXYtPnN0YXR1cyAhPSBQTlBfUkVBRFkpIHsKIAkJc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC04Niw3ICs4Niw4IEBACiAJcG5wX2RldiA9IHRvX3BucF9kZXYoZGV2KTsKIAlwbnBfZHJ2ID0gdG9fcG5wX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKLQlwbnBfZGJnKCJtYXRjaCBmb3VuZCB3aXRoIHRoZSBQblAgZGV2aWNlICclcycgYW5kIHRoZSBkcml2ZXIgJyVzJyIsIGRldi0+YnVzX2lkLHBucF9kcnYtPm5hbWUpOworCXBucF9kYmcoIm1hdGNoIGZvdW5kIHdpdGggdGhlIFBuUCBkZXZpY2UgJyVzJyBhbmQgdGhlIGRyaXZlciAnJXMnIiwKKwkJZGV2LT5idXNfaWQsIHBucF9kcnYtPm5hbWUpOwogCiAJZXJyb3IgPSBwbnBfZGV2aWNlX2F0dGFjaChwbnBfZGV2KTsKIAlpZiAoZXJyb3IgPCAwKQpAQCAtOTksNyArMTAwLDcgQEAKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAl9IGVsc2UgaWYgKChwbnBfZHJ2LT5mbGFncyAmIFBOUF9EUklWRVJfUkVTX0RJU0FCTEUpCi0JCSAgICA9PSBQTlBfRFJJVkVSX1JFU19ESVNBQkxFKSB7CisJCSAgID09IFBOUF9EUklWRVJfUkVTX0RJU0FCTEUpIHsKIAkJZXJyb3IgPSBwbnBfZGlzYWJsZV9kZXYocG5wX2Rldik7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0xMTAsMjIgKzExMSwyMiBAQAogCQlpZiAoZGV2X2lkICE9IE5VTEwpCiAJCQllcnJvciA9IHBucF9kcnYtPnByb2JlKHBucF9kZXYsIGRldl9pZCk7CiAJfQotCWlmIChlcnJvciA+PSAwKXsKKwlpZiAoZXJyb3IgPj0gMCkgewogCQlwbnBfZGV2LT5kcml2ZXIgPSBwbnBfZHJ2OwogCQllcnJvciA9IDA7CiAJfSBlbHNlCiAJCWdvdG8gZmFpbDsKIAlyZXR1cm4gZXJyb3I7CiAKLWZhaWw6CisgICAgICBmYWlsOgogCXBucF9kZXZpY2VfZGV0YWNoKHBucF9kZXYpOwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBwbnBfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBucF9kZXYgKiBwbnBfZGV2ID0gdG9fcG5wX2RldihkZXYpOwotCXN0cnVjdCBwbnBfZHJpdmVyICogZHJ2ID0gcG5wX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2ID0gdG9fcG5wX2RldihkZXYpOworCXN0cnVjdCBwbnBfZHJpdmVyICpkcnYgPSBwbnBfZGV2LT5kcml2ZXI7CiAKIAlpZiAoZHJ2KSB7CiAJCWlmIChkcnYtPnJlbW92ZSkKQEAgLTEzOCw4ICsxMzksOSBAQAogCiBzdGF0aWMgaW50IHBucF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBwbnBfZGV2ICogcG5wX2RldiA9IHRvX3BucF9kZXYoZGV2KTsKLQlzdHJ1Y3QgcG5wX2RyaXZlciAqIHBucF9kcnYgPSB0b19wbnBfZHJpdmVyKGRydik7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXYgPSB0b19wbnBfZGV2KGRldik7CisJc3RydWN0IHBucF9kcml2ZXIgKnBucF9kcnYgPSB0b19wbnBfZHJpdmVyKGRydik7CisKIAlpZiAobWF0Y2hfZGV2aWNlKHBucF9kcnYsIHBucF9kZXYpID09IE5VTEwpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwpAQCAtMTQ3LDggKzE0OSw4IEBACiAKIHN0YXRpYyBpbnQgcG5wX2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBwbnBfZGV2ICogcG5wX2RldiA9IHRvX3BucF9kZXYoZGV2KTsKLQlzdHJ1Y3QgcG5wX2RyaXZlciAqIHBucF9kcnYgPSBwbnBfZGV2LT5kcml2ZXI7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXYgPSB0b19wbnBfZGV2KGRldik7CisJc3RydWN0IHBucF9kcml2ZXIgKnBucF9kcnYgPSBwbnBfZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yOwogCiAJaWYgKCFwbnBfZHJ2KQpAQCAtMTYyLDIzICsxNjQsMjggQEAKIAogCWlmICghKHBucF9kcnYtPmZsYWdzICYgUE5QX0RSSVZFUl9SRVNfRE9fTk9UX0NIQU5HRSkgJiYKIAkgICAgcG5wX2Nhbl9kaXNhYmxlKHBucF9kZXYpKSB7Ci0JICAgIAllcnJvciA9IHBucF9zdG9wX2RldihwbnBfZGV2KTsKLQkgICAgCWlmIChlcnJvcikKLQkgICAgCQlyZXR1cm4gZXJyb3I7CisJCWVycm9yID0gcG5wX3N0b3BfZGV2KHBucF9kZXYpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJaWYgKHBucF9kZXYtPnByb3RvY29sICYmIHBucF9kZXYtPnByb3RvY29sLT5zdXNwZW5kKQorCQlwbnBfZGV2LT5wcm90b2NvbC0+c3VzcGVuZChwbnBfZGV2LCBzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcG5wX2J1c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbnBfZGV2ICogcG5wX2RldiA9IHRvX3BucF9kZXYoZGV2KTsKLQlzdHJ1Y3QgcG5wX2RyaXZlciAqIHBucF9kcnYgPSBwbnBfZGV2LT5kcml2ZXI7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXYgPSB0b19wbnBfZGV2KGRldik7CisJc3RydWN0IHBucF9kcml2ZXIgKnBucF9kcnYgPSBwbnBfZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yOwogCiAJaWYgKCFwbnBfZHJ2KQogCQlyZXR1cm4gMDsKIAorCWlmIChwbnBfZGV2LT5wcm90b2NvbCAmJiBwbnBfZGV2LT5wcm90b2NvbC0+cmVzdW1lKQorCQlwbnBfZGV2LT5wcm90b2NvbC0+cmVzdW1lKHBucF9kZXYpOworCiAJaWYgKCEocG5wX2Rydi0+ZmxhZ3MgJiBQTlBfRFJJVkVSX1JFU19ET19OT1RfQ0hBTkdFKSkgewogCQllcnJvciA9IHBucF9zdGFydF9kZXYocG5wX2Rldik7CiAJCWlmIChlcnJvcikKQEAgLTE5MiwxMiArMTk5LDEyIEBACiB9CiAKIHN0cnVjdCBidXNfdHlwZSBwbnBfYnVzX3R5cGUgPSB7Ci0JLm5hbWUJPSAicG5wIiwKLQkubWF0Y2gJPSBwbnBfYnVzX21hdGNoLAotCS5wcm9iZQk9IHBucF9kZXZpY2VfcHJvYmUsCi0JLnJlbW92ZQk9IHBucF9kZXZpY2VfcmVtb3ZlLAorCS5uYW1lICAgID0gInBucCIsCisJLm1hdGNoICAgPSBwbnBfYnVzX21hdGNoLAorCS5wcm9iZSAgID0gcG5wX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlICA9IHBucF9kZXZpY2VfcmVtb3ZlLAogCS5zdXNwZW5kID0gcG5wX2J1c19zdXNwZW5kLAotCS5yZXN1bWUgPSBwbnBfYnVzX3Jlc3VtZSwKKwkucmVzdW1lICA9IHBucF9idXNfcmVzdW1lLAogfTsKIAogaW50IHBucF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBucF9kcml2ZXIgKmRydikKQEAgLTIyMCwxMiArMjI3LDExIEBACiAgKiBwbnBfYWRkX2lkIC0gYWRkcyBhbiBFSVNBIGlkIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlCiAgKiBAaWQ6IHBvaW50ZXIgdG8gYSBwbnBfaWQgc3RydWN0dXJlCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGRldmljZQotICoKICAqLwotCiBpbnQgcG5wX2FkZF9pZChzdHJ1Y3QgcG5wX2lkICppZCwgc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcG5wX2lkICpwdHI7CisKIAlpZiAoIWlkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWRldikKQEAgLTI0Myw4ICsyNDksNSBAQAogCiBFWFBPUlRfU1lNQk9MKHBucF9yZWdpc3Rlcl9kcml2ZXIpOwogRVhQT1JUX1NZTUJPTChwbnBfdW5yZWdpc3Rlcl9kcml2ZXIpOwotI2lmIDAKLUVYUE9SVF9TWU1CT0wocG5wX2FkZF9pZCk7Ci0jZW5kaWYKIEVYUE9SVF9TWU1CT0wocG5wX2RldmljZV9hdHRhY2gpOwogRVhQT1JUX1NZTUJPTChwbnBfZGV2aWNlX2RldGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcG5wL2ludGVyZmFjZS5jCmluZGV4IGFjOWZjZDQuLmZlNjY4NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcG5wL2ludGVyZmFjZS5jCkBAIC0zLDcgKzMsNiBAQAogICoKICAqIFNvbWUgY29kZSwgZXNwZWNpYWxseSBwb3NzaWJsZSByZXNvdXJjZSBkdW1waW5nIGlzIGJhc2VkIG9uIGlzYXBucF9wcm9jLmMgKGMpIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KICAqIENvcHlyaWdodCAyMDAyIEFkYW0gQmVsYXkgPGFtYngxQG5lby5yci5jb20+Ci0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KQEAgLTI5LDcgKzI4LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcG5wX2luZm9fYnVmZmVyIHBucF9pbmZvX2J1ZmZlcl90OwogCi1zdGF0aWMgaW50IHBucF9wcmludGYocG5wX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGNoYXIgKmZtdCwuLi4pCitzdGF0aWMgaW50IHBucF9wcmludGYocG5wX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlpbnQgcmVzOwpAQCAtNDgsMTQgKzQ3LDE4IEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIHZvaWQgcG5wX3ByaW50X3BvcnQocG5wX2luZm9fYnVmZmVyX3QgKmJ1ZmZlciwgY2hhciAqc3BhY2UsIHN0cnVjdCBwbnBfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIHBucF9wcmludF9wb3J0KHBucF9pbmZvX2J1ZmZlcl90ICogYnVmZmVyLCBjaGFyICpzcGFjZSwKKwkJCSAgIHN0cnVjdCBwbnBfcG9ydCAqcG9ydCkKIHsKLQlwbnBfcHJpbnRmKGJ1ZmZlciwgIiVzcG9ydCAweCV4LTB4JXgsIGFsaWduIDB4JXgsIHNpemUgMHgleCwgJWktYml0IGFkZHJlc3MgZGVjb2RpbmdcbiIsCi0JCQlzcGFjZSwgcG9ydC0+bWluLCBwb3J0LT5tYXgsIHBvcnQtPmFsaWduID8gKHBvcnQtPmFsaWduLTEpIDogMCwgcG9ydC0+c2l6ZSwKLQkJCXBvcnQtPmZsYWdzICYgUE5QX1BPUlRfRkxBR18xNkJJVEFERFIgPyAxNiA6IDEwKTsKKwlwbnBfcHJpbnRmKGJ1ZmZlciwKKwkJICAgIiVzcG9ydCAweCV4LTB4JXgsIGFsaWduIDB4JXgsIHNpemUgMHgleCwgJWktYml0IGFkZHJlc3MgZGVjb2RpbmdcbiIsCisJCSAgIHNwYWNlLCBwb3J0LT5taW4sIHBvcnQtPm1heCwKKwkJICAgcG9ydC0+YWxpZ24gPyAocG9ydC0+YWxpZ24gLSAxKSA6IDAsIHBvcnQtPnNpemUsCisJCSAgIHBvcnQtPmZsYWdzICYgUE5QX1BPUlRfRkxBR18xNkJJVEFERFIgPyAxNiA6IDEwKTsKIH0KIAotc3RhdGljIHZvaWQgcG5wX3ByaW50X2lycShwbnBfaW5mb19idWZmZXJfdCAqYnVmZmVyLCBjaGFyICpzcGFjZSwgc3RydWN0IHBucF9pcnEgKmlycSkKK3N0YXRpYyB2b2lkIHBucF9wcmludF9pcnEocG5wX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGNoYXIgKnNwYWNlLAorCQkJICBzdHJ1Y3QgcG5wX2lycSAqaXJxKQogewogCWludCBmaXJzdCA9IDEsIGk7CiAKQEAgLTg1LDE0ICs4OCwxNSBAQAogCXBucF9wcmludGYoYnVmZmVyLCAiXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgcG5wX3ByaW50X2RtYShwbnBfaW5mb19idWZmZXJfdCAqYnVmZmVyLCBjaGFyICpzcGFjZSwgc3RydWN0IHBucF9kbWEgKmRtYSkKK3N0YXRpYyB2b2lkIHBucF9wcmludF9kbWEocG5wX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGNoYXIgKnNwYWNlLAorCQkJICBzdHJ1Y3QgcG5wX2RtYSAqZG1hKQogewogCWludCBmaXJzdCA9IDEsIGk7CiAJY2hhciAqczsKIAogCXBucF9wcmludGYoYnVmZmVyLCAiJXNkbWEgIiwgc3BhY2UpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWlmIChkbWEtPm1hcCAmICgxPDxpKSkgeworCQlpZiAoZG1hLT5tYXAgJiAoMSA8PCBpKSkgewogCQkJaWYgKCFmaXJzdCkgewogCQkJCXBucF9wcmludGYoYnVmZmVyLCAiLCIpOwogCQkJfSBlbHNlIHsKQEAgLTEzNiwxMiArMTQwLDEzIEBACiAJcG5wX3ByaW50ZihidWZmZXIsICIgJXNcbiIsIHMpOwogfQogCi1zdGF0aWMgdm9pZCBwbnBfcHJpbnRfbWVtKHBucF9pbmZvX2J1ZmZlcl90ICpidWZmZXIsIGNoYXIgKnNwYWNlLCBzdHJ1Y3QgcG5wX21lbSAqbWVtKQorc3RhdGljIHZvaWQgcG5wX3ByaW50X21lbShwbnBfaW5mb19idWZmZXJfdCAqIGJ1ZmZlciwgY2hhciAqc3BhY2UsCisJCQkgIHN0cnVjdCBwbnBfbWVtICptZW0pCiB7CiAJY2hhciAqczsKIAogCXBucF9wcmludGYoYnVmZmVyLCAiJXNNZW1vcnkgMHgleC0weCV4LCBhbGlnbiAweCV4LCBzaXplIDB4JXgiLAotCQkJc3BhY2UsIG1lbS0+bWluLCBtZW0tPm1heCwgbWVtLT5hbGlnbiwgbWVtLT5zaXplKTsKKwkJICAgc3BhY2UsIG1lbS0+bWluLCBtZW0tPm1heCwgbWVtLT5hbGlnbiwgbWVtLT5zaXplKTsKIAlpZiAobWVtLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSkKIAkJcG5wX3ByaW50ZihidWZmZXIsICIsIHdyaXRlYWJsZSIpOwogCWlmIChtZW0tPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fQ0FDSEVBQkxFKQpAQCAtMTY4LDcgKzE3Myw3IEBACiAJcG5wX3ByaW50ZihidWZmZXIsICIsICVzXG4iLCBzKTsKIH0KIAotc3RhdGljIHZvaWQgcG5wX3ByaW50X29wdGlvbihwbnBfaW5mb19idWZmZXJfdCAqYnVmZmVyLCBjaGFyICpzcGFjZSwKK3N0YXRpYyB2b2lkIHBucF9wcmludF9vcHRpb24ocG5wX2luZm9fYnVmZmVyX3QgKiBidWZmZXIsIGNoYXIgKnNwYWNlLAogCQkJICAgICBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBpbnQgZGVwKQogewogCWNoYXIgKnM7CkBAIC0xNzksMTkgKzE4NCwxOSBAQAogCiAJaWYgKGRlcCkgewogCQlzd2l0Y2ggKG9wdGlvbi0+cHJpb3JpdHkpIHsKLQkJCWNhc2UgUE5QX1JFU19QUklPUklUWV9QUkVGRVJSRUQ6CisJCWNhc2UgUE5QX1JFU19QUklPUklUWV9QUkVGRVJSRUQ6CiAJCQlzID0gInByZWZlcnJlZCI7CiAJCQlicmVhazsKLQkJCWNhc2UgUE5QX1JFU19QUklPUklUWV9BQ0NFUFRBQkxFOgorCQljYXNlIFBOUF9SRVNfUFJJT1JJVFlfQUNDRVBUQUJMRToKIAkJCXMgPSAiYWNjZXB0YWJsZSI7CiAJCQlicmVhazsKLQkJCWNhc2UgUE5QX1JFU19QUklPUklUWV9GVU5DVElPTkFMOgorCQljYXNlIFBOUF9SRVNfUFJJT1JJVFlfRlVOQ1RJT05BTDoKIAkJCXMgPSAiZnVuY3Rpb25hbCI7CiAJCQlicmVhazsKLQkJCWRlZmF1bHQ6CisJCWRlZmF1bHQ6CiAJCQlzID0gImludmFsaWQiOwogCQl9Ci0JCXBucF9wcmludGYoYnVmZmVyLCAiRGVwZW5kZW50OiAlMDJpIC0gUHJpb3JpdHkgJXNcbiIsZGVwLCBzKTsKKwkJcG5wX3ByaW50ZihidWZmZXIsICJEZXBlbmRlbnQ6ICUwMmkgLSBQcmlvcml0eSAlc1xuIiwgZGVwLCBzKTsKIAl9CiAKIAlmb3IgKHBvcnQgPSBvcHRpb24tPnBvcnQ7IHBvcnQ7IHBvcnQgPSBwb3J0LT5uZXh0KQpAQCAtMjA0LDE2ICsyMDksMTYgQEAKIAkJcG5wX3ByaW50X21lbShidWZmZXIsIHNwYWNlLCBtZW0pOwogfQogCi0KLXN0YXRpYyBzc2l6ZV90IHBucF9zaG93X29wdGlvbnMoc3RydWN0IGRldmljZSAqZG1kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwbnBfc2hvd19vcHRpb25zKHN0cnVjdCBkZXZpY2UgKmRtZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBucF9kZXYgKmRldiA9IHRvX3BucF9kZXYoZG1kZXYpOwotCXN0cnVjdCBwbnBfb3B0aW9uICogaW5kZXBlbmRlbnQgPSBkZXYtPmluZGVwZW5kZW50OwotCXN0cnVjdCBwbnBfb3B0aW9uICogZGVwZW5kZW50ID0gZGV2LT5kZXBlbmRlbnQ7CisJc3RydWN0IHBucF9vcHRpb24gKmluZGVwZW5kZW50ID0gZGV2LT5pbmRlcGVuZGVudDsKKwlzdHJ1Y3QgcG5wX29wdGlvbiAqZGVwZW5kZW50ID0gZGV2LT5kZXBlbmRlbnQ7CiAJaW50IHJldCwgZGVwID0gMTsKIAogCXBucF9pbmZvX2J1ZmZlcl90ICpidWZmZXIgPSAocG5wX2luZm9fYnVmZmVyX3QgKikKLQkJCQkgcG5wX2FsbG9jKHNpemVvZihwbnBfaW5mb19idWZmZXJfdCkpOworCSAgICBwbnBfYWxsb2Moc2l6ZW9mKHBucF9pbmZvX2J1ZmZlcl90KSk7CiAJaWYgKCFidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjMsNyArMjI4LDcgQEAKIAlpZiAoaW5kZXBlbmRlbnQpCiAJCXBucF9wcmludF9vcHRpb24oYnVmZmVyLCAiIiwgaW5kZXBlbmRlbnQsIDApOwogCi0Jd2hpbGUgKGRlcGVuZGVudCl7CisJd2hpbGUgKGRlcGVuZGVudCkgewogCQlwbnBfcHJpbnRfb3B0aW9uKGJ1ZmZlciwgIiAgICIsIGRlcGVuZGVudCwgZGVwKTsKIAkJZGVwZW5kZW50ID0gZGVwZW5kZW50LT5uZXh0OwogCQlkZXArKzsKQEAgLTIzMywxMCArMjM4LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKG9wdGlvbnMsU19JUlVHTyxwbnBfc2hvd19vcHRpb25zLE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG9wdGlvbnMsIFNfSVJVR08sIHBucF9zaG93X29wdGlvbnMsIE5VTEwpOwogCi0KLXN0YXRpYyBzc2l6ZV90IHBucF9zaG93X2N1cnJlbnRfcmVzb3VyY2VzKHN0cnVjdCBkZXZpY2UgKmRtZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG5wX3Nob3dfY3VycmVudF9yZXNvdXJjZXMoc3RydWN0IGRldmljZSAqZG1kZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqYnVmKQogewogCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSB0b19wbnBfZGV2KGRtZGV2KTsKIAlpbnQgaSwgcmV0OwpAQCAtMjUyLDUyICsyNTgsNTYgQEAKIAlidWZmZXItPmJ1ZmZlciA9IGJ1ZjsKIAlidWZmZXItPmN1cnIgPSBidWZmZXItPmJ1ZmZlcjsKIAotCXBucF9wcmludGYoYnVmZmVyLCJzdGF0ZSA9ICIpOworCXBucF9wcmludGYoYnVmZmVyLCAic3RhdGUgPSAiKTsKIAlpZiAoZGV2LT5hY3RpdmUpCi0JCXBucF9wcmludGYoYnVmZmVyLCJhY3RpdmVcbiIpOworCQlwbnBfcHJpbnRmKGJ1ZmZlciwgImFjdGl2ZVxuIik7CiAJZWxzZQotCQlwbnBfcHJpbnRmKGJ1ZmZlciwiZGlzYWJsZWRcbiIpOworCQlwbnBfcHJpbnRmKGJ1ZmZlciwgImRpc2FibGVkXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX1BPUlQ7IGkrKykgewogCQlpZiAocG5wX3BvcnRfdmFsaWQoZGV2LCBpKSkgewotCQkJcG5wX3ByaW50ZihidWZmZXIsImlvIik7CisJCQlwbnBfcHJpbnRmKGJ1ZmZlciwgImlvIik7CiAJCQlpZiAocG5wX3BvcnRfZmxhZ3MoZGV2LCBpKSAmIElPUkVTT1VSQ0VfRElTQUJMRUQpCi0JCQkJcG5wX3ByaW50ZihidWZmZXIsIiBkaXNhYmxlZFxuIik7CisJCQkJcG5wX3ByaW50ZihidWZmZXIsICIgZGlzYWJsZWRcbiIpOwogCQkJZWxzZQotCQkJCXBucF9wcmludGYoYnVmZmVyLCIgMHglbGx4LTB4JWxseFxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwbnBfcG9ydF9zdGFydChkZXYsIGkpLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBucF9wb3J0X2VuZChkZXYsIGkpKTsKKwkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwgIiAweCVsbHgtMHglbGx4XG4iLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkgICBwbnBfcG9ydF9zdGFydChkZXYsIGkpLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXBucF9wb3J0X2VuZChkZXYsCisJCQkJCQkJCQkgICAgaSkpOwogCQl9CiAJfQogCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX01FTTsgaSsrKSB7CiAJCWlmIChwbnBfbWVtX3ZhbGlkKGRldiwgaSkpIHsKLQkJCXBucF9wcmludGYoYnVmZmVyLCJtZW0iKTsKKwkJCXBucF9wcmludGYoYnVmZmVyLCAibWVtIik7CiAJCQlpZiAocG5wX21lbV9mbGFncyhkZXYsIGkpICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkKLQkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwiIGRpc2FibGVkXG4iKTsKKwkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwgIiBkaXNhYmxlZFxuIik7CiAJCQllbHNlCi0JCQkJcG5wX3ByaW50ZihidWZmZXIsIiAweCVsbHgtMHglbGx4XG4iLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBucF9tZW1fc3RhcnQoZGV2LCBpKSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwbnBfbWVtX2VuZChkZXYsIGkpKTsKKwkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwgIiAweCVsbHgtMHglbGx4XG4iLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkgICBwbnBfbWVtX3N0YXJ0KGRldiwgaSksCisJCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG5wX21lbV9lbmQoZGV2LAorCQkJCQkJCQkJICAgaSkpOwogCQl9CiAJfQogCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX0lSUTsgaSsrKSB7CiAJCWlmIChwbnBfaXJxX3ZhbGlkKGRldiwgaSkpIHsKLQkJCXBucF9wcmludGYoYnVmZmVyLCJpcnEiKTsKKwkJCXBucF9wcmludGYoYnVmZmVyLCAiaXJxIik7CiAJCQlpZiAocG5wX2lycV9mbGFncyhkZXYsIGkpICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkKLQkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwiIGRpc2FibGVkXG4iKTsKKwkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwgIiBkaXNhYmxlZFxuIik7CiAJCQllbHNlCi0JCQkJcG5wX3ByaW50ZihidWZmZXIsIiAlbGxkXG4iLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBucF9pcnEoZGV2LCBpKSk7CisJCQkJcG5wX3ByaW50ZihidWZmZXIsICIgJWxsZFxuIiwKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwbnBfaXJxKGRldiwgaSkpOwogCQl9CiAJfQogCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX0RNQTsgaSsrKSB7CiAJCWlmIChwbnBfZG1hX3ZhbGlkKGRldiwgaSkpIHsKLQkJCXBucF9wcmludGYoYnVmZmVyLCJkbWEiKTsKKwkJCXBucF9wcmludGYoYnVmZmVyLCAiZG1hIik7CiAJCQlpZiAocG5wX2RtYV9mbGFncyhkZXYsIGkpICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkKLQkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwiIGRpc2FibGVkXG4iKTsKKwkJCQlwbnBfcHJpbnRmKGJ1ZmZlciwgIiBkaXNhYmxlZFxuIik7CiAJCQllbHNlCi0JCQkJcG5wX3ByaW50ZihidWZmZXIsIiAlbGxkXG4iLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBucF9kbWEoZGV2LCBpKSk7CisJCQkJcG5wX3ByaW50ZihidWZmZXIsICIgJWxsZFxuIiwKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwbnBfZG1hKGRldiwgaSkpOwogCQl9CiAJfQogCXJldCA9IChidWZmZXItPmN1cnIgLSBidWYpOwpAQCAtMzA4LDU1ICszMTgsNTcgQEAKIGV4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIHBucF9yZXNfbXV0ZXg7CiAKIHN0YXRpYyBzc2l6ZV90Ci1wbnBfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKHN0cnVjdCBkZXZpY2UgKiBkbWRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiB1YnVmLCBzaXplX3QgY291bnQpCitwbnBfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKHN0cnVjdCBkZXZpY2UgKmRtZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqdWJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSB0b19wbnBfZGV2KGRtZGV2KTsKLQljaGFyCSpidWYgPSAodm9pZCAqKXVidWY7Ci0JaW50CXJldHZhbCA9IDA7CisJY2hhciAqYnVmID0gKHZvaWQgKil1YnVmOworCWludCByZXR2YWwgPSAwOwogCiAJaWYgKGRldi0+c3RhdHVzICYgUE5QX0FUVEFDSEVEKSB7CiAJCXJldHZhbCA9IC1FQlVTWTsKLQkJcG5wX2luZm8oIkRldmljZSAlcyBjYW5ub3QgYmUgY29uZmlndXJlZCBiZWNhdXNlIGl0IGlzIGluIHVzZS4iLCBkZXYtPmRldi5idXNfaWQpOworCQlwbnBfaW5mbygiRGV2aWNlICVzIGNhbm5vdCBiZSBjb25maWd1cmVkIGJlY2F1c2UgaXQgaXMgaW4gdXNlLiIsCisJCQkgZGV2LT5kZXYuYnVzX2lkKTsKIAkJZ290byBkb25lOwogCX0KIAogCXdoaWxlIChpc3NwYWNlKCpidWYpKQogCQkrK2J1ZjsKLQlpZiAoIXN0cm5pY21wKGJ1ZiwiZGlzYWJsZSIsNykpIHsKKwlpZiAoIXN0cm5pY21wKGJ1ZiwgImRpc2FibGUiLCA3KSkgewogCQlyZXR2YWwgPSBwbnBfZGlzYWJsZV9kZXYoZGV2KTsKIAkJZ290byBkb25lOwogCX0KLQlpZiAoIXN0cm5pY21wKGJ1ZiwiYWN0aXZhdGUiLDgpKSB7CisJaWYgKCFzdHJuaWNtcChidWYsICJhY3RpdmF0ZSIsIDgpKSB7CiAJCXJldHZhbCA9IHBucF9hY3RpdmF0ZV9kZXYoZGV2KTsKIAkJZ290byBkb25lOwogCX0KLQlpZiAoIXN0cm5pY21wKGJ1ZiwiZmlsbCIsNCkpIHsKKwlpZiAoIXN0cm5pY21wKGJ1ZiwgImZpbGwiLCA0KSkgewogCQlpZiAoZGV2LT5hY3RpdmUpCiAJCQlnb3RvIGRvbmU7CiAJCXJldHZhbCA9IHBucF9hdXRvX2NvbmZpZ19kZXYoZGV2KTsKIAkJZ290byBkb25lOwogCX0KLQlpZiAoIXN0cm5pY21wKGJ1ZiwiYXV0byIsNCkpIHsKKwlpZiAoIXN0cm5pY21wKGJ1ZiwgImF1dG8iLCA0KSkgewogCQlpZiAoZGV2LT5hY3RpdmUpCiAJCQlnb3RvIGRvbmU7CiAJCXBucF9pbml0X3Jlc291cmNlX3RhYmxlKCZkZXYtPnJlcyk7CiAJCXJldHZhbCA9IHBucF9hdXRvX2NvbmZpZ19kZXYoZGV2KTsKIAkJZ290byBkb25lOwogCX0KLQlpZiAoIXN0cm5pY21wKGJ1ZiwiY2xlYXIiLDUpKSB7CisJaWYgKCFzdHJuaWNtcChidWYsICJjbGVhciIsIDUpKSB7CiAJCWlmIChkZXYtPmFjdGl2ZSkKIAkJCWdvdG8gZG9uZTsKIAkJcG5wX2luaXRfcmVzb3VyY2VfdGFibGUoJmRldi0+cmVzKTsKIAkJZ290byBkb25lOwogCX0KLQlpZiAoIXN0cm5pY21wKGJ1ZiwiZ2V0IiwzKSkgeworCWlmICghc3RybmljbXAoYnVmLCAiZ2V0IiwgMykpIHsKIAkJZG93bigmcG5wX3Jlc19tdXRleCk7CiAJCWlmIChwbnBfY2FuX3JlYWQoZGV2KSkKIAkJCWRldi0+cHJvdG9jb2wtPmdldChkZXYsICZkZXYtPnJlcyk7CiAJCXVwKCZwbnBfcmVzX211dGV4KTsKIAkJZ290byBkb25lOwogCX0KLQlpZiAoIXN0cm5pY21wKGJ1Ziwic2V0IiwzKSkgeworCWlmICghc3RybmljbXAoYnVmLCAic2V0IiwgMykpIHsKIAkJaW50IG5wb3J0ID0gMCwgbm1lbSA9IDAsIG5pcnEgPSAwLCBuZG1hID0gMDsKIAkJaWYgKGRldi0+YWN0aXZlKQogCQkJZ290byBkb25lOwpAQCAtMzY2LDY1ICszNzgsNzcgQEAKIAkJd2hpbGUgKDEpIHsKIAkJCXdoaWxlIChpc3NwYWNlKCpidWYpKQogCQkJCSsrYnVmOwotCQkJaWYgKCFzdHJuaWNtcChidWYsImlvIiwyKSkgeworCQkJaWYgKCFzdHJuaWNtcChidWYsICJpbyIsIDIpKSB7CiAJCQkJYnVmICs9IDI7CiAJCQkJd2hpbGUgKGlzc3BhY2UoKmJ1ZikpCiAJCQkJCSsrYnVmOwotCQkJCWRldi0+cmVzLnBvcnRfcmVzb3VyY2VbbnBvcnRdLnN0YXJ0ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCZidWYsMCk7CisJCQkJZGV2LT5yZXMucG9ydF9yZXNvdXJjZVtucG9ydF0uc3RhcnQgPQorCQkJCSAgICBzaW1wbGVfc3RydG91bChidWYsICZidWYsIDApOwogCQkJCXdoaWxlIChpc3NwYWNlKCpidWYpKQogCQkJCQkrK2J1ZjsKLQkJCQlpZigqYnVmID09ICctJykgeworCQkJCWlmICgqYnVmID09ICctJykgewogCQkJCQlidWYgKz0gMTsKIAkJCQkJd2hpbGUgKGlzc3BhY2UoKmJ1ZikpCiAJCQkJCQkrK2J1ZjsKLQkJCQkJZGV2LT5yZXMucG9ydF9yZXNvdXJjZVtucG9ydF0uZW5kID0gc2ltcGxlX3N0cnRvdWwoYnVmLCZidWYsMCk7CisJCQkJCWRldi0+cmVzLnBvcnRfcmVzb3VyY2VbbnBvcnRdLmVuZCA9CisJCQkJCSAgICBzaW1wbGVfc3RydG91bChidWYsICZidWYsIDApOwogCQkJCX0gZWxzZQotCQkJCQlkZXYtPnJlcy5wb3J0X3Jlc291cmNlW25wb3J0XS5lbmQgPSBkZXYtPnJlcy5wb3J0X3Jlc291cmNlW25wb3J0XS5zdGFydDsKLQkJCQlkZXYtPnJlcy5wb3J0X3Jlc291cmNlW25wb3J0XS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCQkJCWRldi0+cmVzLnBvcnRfcmVzb3VyY2VbbnBvcnRdLmVuZCA9CisJCQkJCSAgICBkZXYtPnJlcy5wb3J0X3Jlc291cmNlW25wb3J0XS5zdGFydDsKKwkJCQlkZXYtPnJlcy5wb3J0X3Jlc291cmNlW25wb3J0XS5mbGFncyA9CisJCQkJICAgIElPUkVTT1VSQ0VfSU87CiAJCQkJbnBvcnQrKzsKIAkJCQlpZiAobnBvcnQgPj0gUE5QX01BWF9QT1JUKQogCQkJCQlicmVhazsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmICghc3RybmljbXAoYnVmLCJtZW0iLDMpKSB7CisJCQlpZiAoIXN0cm5pY21wKGJ1ZiwgIm1lbSIsIDMpKSB7CiAJCQkJYnVmICs9IDM7CiAJCQkJd2hpbGUgKGlzc3BhY2UoKmJ1ZikpCiAJCQkJCSsrYnVmOwotCQkJCWRldi0+cmVzLm1lbV9yZXNvdXJjZVtubWVtXS5zdGFydCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwmYnVmLDApOworCQkJCWRldi0+cmVzLm1lbV9yZXNvdXJjZVtubWVtXS5zdGFydCA9CisJCQkJICAgIHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmJ1ZiwgMCk7CiAJCQkJd2hpbGUgKGlzc3BhY2UoKmJ1ZikpCiAJCQkJCSsrYnVmOwotCQkJCWlmKCpidWYgPT0gJy0nKSB7CisJCQkJaWYgKCpidWYgPT0gJy0nKSB7CiAJCQkJCWJ1ZiArPSAxOwogCQkJCQl3aGlsZSAoaXNzcGFjZSgqYnVmKSkKIAkJCQkJCSsrYnVmOwotCQkJCQlkZXYtPnJlcy5tZW1fcmVzb3VyY2Vbbm1lbV0uZW5kID0gc2ltcGxlX3N0cnRvdWwoYnVmLCZidWYsMCk7CisJCQkJCWRldi0+cmVzLm1lbV9yZXNvdXJjZVtubWVtXS5lbmQgPQorCQkJCQkgICAgc2ltcGxlX3N0cnRvdWwoYnVmLCAmYnVmLCAwKTsKIAkJCQl9IGVsc2UKLQkJCQkJZGV2LT5yZXMubWVtX3Jlc291cmNlW25tZW1dLmVuZCA9IGRldi0+cmVzLm1lbV9yZXNvdXJjZVtubWVtXS5zdGFydDsKLQkJCQlkZXYtPnJlcy5tZW1fcmVzb3VyY2Vbbm1lbV0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJCQkJZGV2LT5yZXMubWVtX3Jlc291cmNlW25tZW1dLmVuZCA9CisJCQkJCSAgICBkZXYtPnJlcy5tZW1fcmVzb3VyY2Vbbm1lbV0uc3RhcnQ7CisJCQkJZGV2LT5yZXMubWVtX3Jlc291cmNlW25tZW1dLmZsYWdzID0KKwkJCQkgICAgSU9SRVNPVVJDRV9NRU07CiAJCQkJbm1lbSsrOwogCQkJCWlmIChubWVtID49IFBOUF9NQVhfTUVNKQogCQkJCQlicmVhazsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmICghc3RybmljbXAoYnVmLCJpcnEiLDMpKSB7CisJCQlpZiAoIXN0cm5pY21wKGJ1ZiwgImlycSIsIDMpKSB7CiAJCQkJYnVmICs9IDM7CiAJCQkJd2hpbGUgKGlzc3BhY2UoKmJ1ZikpCiAJCQkJCSsrYnVmOwogCQkJCWRldi0+cmVzLmlycV9yZXNvdXJjZVtuaXJxXS5zdGFydCA9Ci0JCQkJZGV2LT5yZXMuaXJxX3Jlc291cmNlW25pcnFdLmVuZCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwmYnVmLDApOwotCQkJCWRldi0+cmVzLmlycV9yZXNvdXJjZVtuaXJxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQkJCSAgICBkZXYtPnJlcy5pcnFfcmVzb3VyY2VbbmlycV0uZW5kID0KKwkJCQkgICAgc2ltcGxlX3N0cnRvdWwoYnVmLCAmYnVmLCAwKTsKKwkJCQlkZXYtPnJlcy5pcnFfcmVzb3VyY2VbbmlycV0uZmxhZ3MgPQorCQkJCSAgICBJT1JFU09VUkNFX0lSUTsKIAkJCQluaXJxKys7CiAJCQkJaWYgKG5pcnEgPj0gUE5QX01BWF9JUlEpCiAJCQkJCWJyZWFrOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKCFzdHJuaWNtcChidWYsImRtYSIsMykpIHsKKwkJCWlmICghc3RybmljbXAoYnVmLCAiZG1hIiwgMykpIHsKIAkJCQlidWYgKz0gMzsKIAkJCQl3aGlsZSAoaXNzcGFjZSgqYnVmKSkKIAkJCQkJKytidWY7CiAJCQkJZGV2LT5yZXMuZG1hX3Jlc291cmNlW25kbWFdLnN0YXJ0ID0KLQkJCQlkZXYtPnJlcy5kbWFfcmVzb3VyY2VbbmRtYV0uZW5kID0gc2ltcGxlX3N0cnRvdWwoYnVmLCZidWYsMCk7Ci0JCQkJZGV2LT5yZXMuZG1hX3Jlc291cmNlW25kbWFdLmZsYWdzID0gSU9SRVNPVVJDRV9ETUE7CisJCQkJICAgIGRldi0+cmVzLmRtYV9yZXNvdXJjZVtuZG1hXS5lbmQgPQorCQkJCSAgICBzaW1wbGVfc3RydG91bChidWYsICZidWYsIDApOworCQkJCWRldi0+cmVzLmRtYV9yZXNvdXJjZVtuZG1hXS5mbGFncyA9CisJCQkJICAgIElPUkVTT1VSQ0VfRE1BOwogCQkJCW5kbWErKzsKIAkJCQlpZiAobmRtYSA+PSBQTlBfTUFYX0RNQSkKIAkJCQkJYnJlYWs7CkBAIC00MzUsNDUgKzQ1OSw1MCBAQAogCQl1cCgmcG5wX3Jlc19tdXRleCk7CiAJCWdvdG8gZG9uZTsKIAl9Ci0gZG9uZToKKyAgICAgIGRvbmU6CiAJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIocmVzb3VyY2VzLFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICBwbnBfc2hvd19jdXJyZW50X3Jlc291cmNlcyxwbnBfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXNvdXJjZXMsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBwbnBfc2hvd19jdXJyZW50X3Jlc291cmNlcywgcG5wX3NldF9jdXJyZW50X3Jlc291cmNlcyk7CiAKLXN0YXRpYyBzc2l6ZV90IHBucF9zaG93X2N1cnJlbnRfaWRzKHN0cnVjdCBkZXZpY2UgKmRtZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG5wX3Nob3dfY3VycmVudF9pZHMoc3RydWN0IGRldmljZSAqZG1kZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJY2hhciAqc3RyID0gYnVmOwogCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSB0b19wbnBfZGV2KGRtZGV2KTsKLQlzdHJ1Y3QgcG5wX2lkICogcG9zID0gZGV2LT5pZDsKKwlzdHJ1Y3QgcG5wX2lkICpwb3MgPSBkZXYtPmlkOwogCiAJd2hpbGUgKHBvcykgewotCQlzdHIgKz0gc3ByaW50ZihzdHIsIiVzXG4iLCBwb3MtPmlkKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCAiJXNcbiIsIHBvcy0+aWQpOwogCQlwb3MgPSBwb3MtPm5leHQ7CiAJfQogCXJldHVybiAoc3RyIC0gYnVmKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGlkLFNfSVJVR08scG5wX3Nob3dfY3VycmVudF9pZHMsTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaWQsIFNfSVJVR08sIHBucF9zaG93X2N1cnJlbnRfaWRzLCBOVUxMKTsKIAogaW50IHBucF9pbnRlcmZhY2VfYXR0YWNoX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewotCWludCByYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsJmRldl9hdHRyX29wdGlvbnMpOwotCWlmIChyYykgZ290byBlcnI7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCZkZXZfYXR0cl9yZXNvdXJjZXMpOwotCWlmIChyYykgZ290byBlcnJfb3B0OwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwmZGV2X2F0dHJfaWQpOwotCWlmIChyYykgZ290byBlcnJfcmVzOworCWludCByYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9vcHRpb25zKTsKKworCWlmIChyYykKKwkJZ290byBlcnI7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfcmVzb3VyY2VzKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX29wdDsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pZCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9yZXM7CiAKIAlyZXR1cm4gMDsKIAotZXJyX3JlczoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCZkZXZfYXR0cl9yZXNvdXJjZXMpOwotZXJyX29wdDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCZkZXZfYXR0cl9vcHRpb25zKTsKLWVycjoKKyAgICAgIGVycl9yZXM6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3Jlc291cmNlcyk7CisgICAgICBlcnJfb3B0OgorCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9vcHRpb25zKTsKKyAgICAgIGVycjoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvY29tcGF0LmMgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29tcGF0LmMKaW5kZXggMDY5N2FiOC4uMTBiZGNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvbXBhdC5jCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb21wYXQuYwpAQCAtMywzNCArMywzMCBAQAogICogICAgICAgICAgICB0aGUgb2xkIGlzYXBucCBBUElzLiBJZiBwb3NzaWJsZSB1c2UgdGhlIG5ldyBBUElzIGluc3RlYWQuCiAgKgogICogQ29weXJpZ2h0IDIwMDIgQWRhbSBCZWxheSA8YW1ieDFAbmVvLnJyLmNvbT4KLSAqCiAgKi8KLSAKLS8qIFRPRE86IHNlZSBpZiBtb3JlIGlzYXBucCBmdW5jdGlvbnMgYXJlIG5lZWRlZCBoZXJlICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAotc3RhdGljIHZvaWQgcG5wX2NvbnZlcnRfaWQoY2hhciAqYnVmLCB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIHVuc2lnbmVkIHNob3J0IGRldmljZSkKK3N0YXRpYyB2b2lkIHBucF9jb252ZXJ0X2lkKGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgdmVuZG9yLAorCQkJICAgdW5zaWduZWQgc2hvcnQgZGV2aWNlKQogewogCXNwcmludGYoYnVmLCAiJWMlYyVjJXgleCV4JXgiLAotCQkJJ0EnICsgKCh2ZW5kb3IgPj4gMikgJiAweDNmKSAtIDEsCi0JCQknQScgKyAoKCh2ZW5kb3IgJiAzKSA8PCAzKSB8ICgodmVuZG9yID4+IDEzKSAmIDcpKSAtIDEsCi0JCQknQScgKyAoKHZlbmRvciA+PiA4KSAmIDB4MWYpIC0gMSwKLQkJCShkZXZpY2UgPj4gNCkgJiAweDBmLAotCQkJZGV2aWNlICYgMHgwZiwKLQkJCShkZXZpY2UgPj4gMTIpICYgMHgwZiwKLQkJCShkZXZpY2UgPj4gOCkgJiAweDBmKTsKKwkJJ0EnICsgKCh2ZW5kb3IgPj4gMikgJiAweDNmKSAtIDEsCisJCSdBJyArICgoKHZlbmRvciAmIDMpIDw8IDMpIHwgKCh2ZW5kb3IgPj4gMTMpICYgNykpIC0gMSwKKwkJJ0EnICsgKCh2ZW5kb3IgPj4gOCkgJiAweDFmKSAtIDEsCisJCShkZXZpY2UgPj4gNCkgJiAweDBmLCBkZXZpY2UgJiAweDBmLAorCQkoZGV2aWNlID4+IDEyKSAmIDB4MGYsIChkZXZpY2UgPj4gOCkgJiAweDBmKTsKIH0KIAotc3RydWN0IHBucF9jYXJkICpwbnBfZmluZF9jYXJkKHVuc2lnbmVkIHNob3J0IHZlbmRvciwKLQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2UsCitzdHJ1Y3QgcG5wX2NhcmQgKnBucF9maW5kX2NhcmQodW5zaWduZWQgc2hvcnQgdmVuZG9yLCB1bnNpZ25lZCBzaG9ydCBkZXZpY2UsCiAJCQkgICAgICAgc3RydWN0IHBucF9jYXJkICpmcm9tKQogewogCWNoYXIgaWRbOF07CiAJY2hhciBhbnlbOF07CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwogCXBucF9jb252ZXJ0X2lkKGlkLCB2ZW5kb3IsIGRldmljZSk7CiAJcG5wX2NvbnZlcnRfaWQoYW55LCBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lEKTsKIApAQCAtMzgsMjAgKzM0LDIwIEBACiAKIAl3aGlsZSAobGlzdCAhPSAmcG5wX2NhcmRzKSB7CiAJCXN0cnVjdCBwbnBfY2FyZCAqY2FyZCA9IGdsb2JhbF90b19wbnBfY2FyZChsaXN0KTsKLQkJaWYgKGNvbXBhcmVfcG5wX2lkKGNhcmQtPmlkLGlkKSB8fCAobWVtY21wKGlkLGFueSw3KT09MCkpCisKKwkJaWYgKGNvbXBhcmVfcG5wX2lkKGNhcmQtPmlkLCBpZCkgfHwgKG1lbWNtcChpZCwgYW55LCA3KSA9PSAwKSkKIAkJCXJldHVybiBjYXJkOwogCQlsaXN0ID0gbGlzdC0+bmV4dDsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBwbnBfZGV2ICpwbnBfZmluZF9kZXYoc3RydWN0IHBucF9jYXJkICpjYXJkLAotCQkJICAgICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsCi0JCQkgICAgIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uLAotCQkJICAgICBzdHJ1Y3QgcG5wX2RldiAqZnJvbSkKK3N0cnVjdCBwbnBfZGV2ICpwbnBfZmluZF9kZXYoc3RydWN0IHBucF9jYXJkICpjYXJkLCB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsCisJCQkgICAgIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uLCBzdHJ1Y3QgcG5wX2RldiAqZnJvbSkKIHsKIAljaGFyIGlkWzhdOwogCWNoYXIgYW55WzhdOworCiAJcG5wX2NvbnZlcnRfaWQoaWQsIHZlbmRvciwgZnVuY3Rpb24pOwogCXBucF9jb252ZXJ0X2lkKGFueSwgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkgewkvKiBsb29rIGZvciBhIGxvZ2ljYWwgZGV2aWNlIGZyb20gYWxsIGNhcmRzICovCkBAIC02Myw3ICs1OSw5IEBACiAKIAkJd2hpbGUgKGxpc3QgIT0gJnBucF9nbG9iYWwpIHsKIAkJCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSBnbG9iYWxfdG9fcG5wX2RldihsaXN0KTsKLQkJCWlmIChjb21wYXJlX3BucF9pZChkZXYtPmlkLGlkKSB8fCAobWVtY21wKGlkLGFueSw3KT09MCkpCisKKwkJCWlmIChjb21wYXJlX3BucF9pZChkZXYtPmlkLCBpZCkgfHwKKwkJCSAgICAobWVtY21wKGlkLCBhbnksIDcpID09IDApKQogCQkJCXJldHVybiBkZXY7CiAJCQlsaXN0ID0gbGlzdC0+bmV4dDsKIAkJfQpAQCAtNzgsNyArNzYsOCBAQAogCQl9CiAJCXdoaWxlIChsaXN0ICE9ICZjYXJkLT5kZXZpY2VzKSB7CiAJCQlzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gY2FyZF90b19wbnBfZGV2KGxpc3QpOwotCQkJaWYgKGNvbXBhcmVfcG5wX2lkKGRldi0+aWQsaWQpKQorCisJCQlpZiAoY29tcGFyZV9wbnBfaWQoZGV2LT5pZCwgaWQpKQogCQkJCXJldHVybiBkZXY7CiAJCQlsaXN0ID0gbGlzdC0+bmV4dDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKaW5kZXggOTE0ZDAwYy4uYjRlMmFhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCkBAIC01MSwxMCArNTEsMTAgQEAKICNkZWZpbmUgSVNBUE5QX0RFQlVHCiAjZW5kaWYKIAotaW50IGlzYXBucF9kaXNhYmxlOwkJCS8qIERpc2FibGUgSVNBIFBuUCAqLwotc3RhdGljIGludCBpc2FwbnBfcmRwOwkJCS8qIFJlYWQgRGF0YSBQb3J0ICovCi1zdGF0aWMgaW50IGlzYXBucF9yZXNldCA9IDE7CQkvKiByZXNldCBhbGwgUG5QIGNhcmRzIChkZWFjdGl2YXRlKSAqLwotc3RhdGljIGludCBpc2FwbnBfdmVyYm9zZSA9IDE7CQkvKiB2ZXJib3NlIG1vZGUgKi8KK2ludCBpc2FwbnBfZGlzYWJsZTsJCS8qIERpc2FibGUgSVNBIFBuUCAqLworc3RhdGljIGludCBpc2FwbnBfcmRwOwkJLyogUmVhZCBEYXRhIFBvcnQgKi8KK3N0YXRpYyBpbnQgaXNhcG5wX3Jlc2V0ID0gMTsJLyogcmVzZXQgYWxsIFBuUCBjYXJkcyAoZGVhY3RpdmF0ZSkgKi8KK3N0YXRpYyBpbnQgaXNhcG5wX3ZlcmJvc2UgPSAxOwkvKiB2ZXJib3NlIG1vZGUgKi8KIAogTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIElTQSBQbHVnICYgUGxheSBzdXBwb3J0Iik7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAKIAl2YWwgPSBpc2FwbnBfcmVhZF9ieXRlKGlkeCk7Ci0JdmFsID0gKHZhbCA8PCA4KSArIGlzYXBucF9yZWFkX2J5dGUoaWR4KzEpOworCXZhbCA9ICh2YWwgPDwgOCkgKyBpc2FwbnBfcmVhZF9ieXRlKGlkeCArIDEpOwogCXJldHVybiB2YWw7CiB9CiAKQEAgLTEzOSw3ICsxMzksNyBAQAogc3RhdGljIHZvaWQgaXNhcG5wX3dyaXRlX3dvcmQodW5zaWduZWQgY2hhciBpZHgsIHVuc2lnbmVkIHNob3J0IHZhbCkKIHsKIAlpc2FwbnBfd3JpdGVfYnl0ZShpZHgsIHZhbCA+PiA4KTsKLQlpc2FwbnBfd3JpdGVfYnl0ZShpZHgrMSwgdmFsKTsKKwlpc2FwbnBfd3JpdGVfYnl0ZShpZHggKyAxLCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZCBpc2FwbnBfa2V5KHZvaWQpCkBAIC0xOTMsNyArMTkzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FwbnBfcGVlayh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgYnl0ZXMpCiB7CiAJaW50IGksIGo7Ci0JdW5zaWduZWQgY2hhciBkPTA7CisJdW5zaWduZWQgY2hhciBkID0gMDsKIAogCWZvciAoaSA9IDE7IGkgPD0gYnl0ZXM7IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgMjA7IGorKykgewpAQCAtMjIwLDE5ICsyMjAsMTggQEAKIHsKIAlpbnQgcmRwID0gaXNhcG5wX3JkcDsKIAlzdGF0aWMgaW50IG9sZF9yZHAgPSAwOwotCQotCWlmKG9sZF9yZHApCi0JeworCisJaWYgKG9sZF9yZHApIHsKIAkJcmVsZWFzZV9yZWdpb24ob2xkX3JkcCwgMSk7CiAJCW9sZF9yZHAgPSAwOwogCX0KIAl3aGlsZSAocmRwIDw9IDB4M2ZmKSB7CiAJCS8qCi0JCSAqCVdlIGNhbm5vdCB1c2UgTkUyMDAwIHByb2JlIHNwYWNlcyBmb3IgSVNBUG5QIG9yIHdlCi0JCSAqCXdpbGwgbG9jayB1cCBtYWNoaW5lcy4KKwkJICogICAgICBXZSBjYW5ub3QgdXNlIE5FMjAwMCBwcm9iZSBzcGFjZXMgZm9yIElTQVBuUCBvciB3ZQorCQkgKiAgICAgIHdpbGwgbG9jayB1cCBtYWNoaW5lcy4KIAkJICovCi0JCWlmICgocmRwIDwgMHgyODAgfHwgcmRwID4gIDB4MzgwKSAmJiByZXF1ZXN0X3JlZ2lvbihyZHAsIDEsICJJU0FQblAiKSkKLQkJeworCQlpZiAoKHJkcCA8IDB4MjgwIHx8IHJkcCA+IDB4MzgwKQorCQkgICAgJiYgcmVxdWVzdF9yZWdpb24ocmRwLCAxLCAiSVNBUG5QIikpIHsKIAkJCWlzYXBucF9yZHAgPSByZHA7CiAJCQlvbGRfcmRwID0gcmRwOwogCQkJcmV0dXJuIDA7CkBAIC0yNTMsNyArMjUyLDYgQEAKICAqCVBlcmZvcm0gYW4gaXNvbGF0aW9uLiBUaGUgcG9ydCBzZWxlY3Rpb24gY29kZSBub3cgdHJpZXMgdG8gYXZvaWQKICAqCSJkYW5nZXJvdXMgdG8gcmVhZCIgcG9ydHMuCiAgKi8KLQogc3RhdGljIGludCBfX2luaXQgaXNhcG5wX2lzb2xhdGVfcmRwX3NlbGVjdCh2b2lkKQogewogCWlzYXBucF93YWl0KCk7CkBAIC0yODIsNyArMjgwLDYgQEAKIC8qCiAgKiAgSXNvbGF0ZSAoYXNzaWduIHVuaXF1ZWQgQ1NOKSB0byBhbGwgSVNBIFBuUCBkZXZpY2VzLgogICovCi0KIHN0YXRpYyBpbnQgX19pbml0IGlzYXBucF9pc29sYXRlKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDB4NmE7CkBAIC0zMDUsNyArMzAyLDkgQEAKIAkJCXVkZWxheSgyNTApOwogCQkJaWYgKGRhdGEgPT0gMHg1NWFhKQogCQkJCWJpdCA9IDB4MDE7Ci0JCQljaGVja3N1bSA9ICgoKChjaGVja3N1bSBeIChjaGVja3N1bSA+PiAxKSkgJiAweDAxKSBeIGJpdCkgPDwgNykgfCAoY2hlY2tzdW0gPj4gMSk7CisJCQljaGVja3N1bSA9CisJCQkgICAgKCgoKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDEpKSAmIDB4MDEpIF4gYml0KSA8PCA3KQorCQkJICAgIHwgKGNoZWNrc3VtID4+IDEpOwogCQkJYml0ID0gMHgwMDsKIAkJfQogCQlmb3IgKGkgPSA2NTsgaSA8PSA3MjsgaSsrKSB7CkBAIC0zNTEsMTMgKzM1MCwxMiBAQAogLyoKICAqICBSZWFkIG9uZSB0YWcgZnJvbSBzdHJlYW0uCiAgKi8KLQogc3RhdGljIGludCBfX2luaXQgaXNhcG5wX3JlYWRfdGFnKHVuc2lnbmVkIGNoYXIgKnR5cGUsIHVuc2lnbmVkIHNob3J0ICpzaXplKQogewogCXVuc2lnbmVkIGNoYXIgdGFnLCB0bXBbMl07CiAKIAlpc2FwbnBfcGVlaygmdGFnLCAxKTsKLQlpZiAodGFnID09IDApCQkJCS8qIGludmFsaWQgdGFnICovCisJaWYgKHRhZyA9PSAwKQkJLyogaW52YWxpZCB0YWcgKi8KIAkJcmV0dXJuIC0xOwogCWlmICh0YWcgJiAweDgwKSB7CS8qIGxhcmdlIGl0ZW0gKi8KIAkJKnR5cGUgPSB0YWc7CkBAIC0zNjgsNyArMzY2LDggQEAKIAkJKnNpemUgPSB0YWcgJiAweDA3OwogCX0KICNpZiAwCi0JcHJpbnRrKEtFUk5fREVCVUcgInRhZyA9IDB4JXgsIHR5cGUgPSAweCV4LCBzaXplID0gJWlcbiIsIHRhZywgKnR5cGUsICpzaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidGFnID0gMHgleCwgdHlwZSA9IDB4JXgsIHNpemUgPSAlaVxuIiwgdGFnLCAqdHlwZSwKKwkgICAgICAgKnNpemUpOwogI2VuZGlmCiAJaWYgKCp0eXBlID09IDB4ZmYgJiYgKnNpemUgPT0gMHhmZmZmKQkvKiBwcm9iYWJseSBpbnZhbGlkIGRhdGEgKi8KIAkJcmV0dXJuIC0xOwpAQCAtMzc4LDcgKzM3Nyw2IEBACiAvKgogICogIFNraXAgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHN0cmVhbS4KICAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgaXNhcG5wX3NraXBfYnl0ZXMoaW50IGNvdW50KQogewogCWlzYXBucF9wZWVrKE5VTEwsIGNvdW50KTsKQEAgLTM4NywzMSArMzg1LDMwIEBACiAvKgogICogIFBhcnNlIEVJU0EgaWQuCiAgKi8KLQotc3RhdGljIHZvaWQgaXNhcG5wX3BhcnNlX2lkKHN0cnVjdCBwbnBfZGV2ICogZGV2LCB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIHVuc2lnbmVkIHNob3J0IGRldmljZSkKK3N0YXRpYyB2b2lkIGlzYXBucF9wYXJzZV9pZChzdHJ1Y3QgcG5wX2RldiAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgZGV2aWNlKQogewotCXN0cnVjdCBwbnBfaWQgKiBpZDsKKwlzdHJ1Y3QgcG5wX2lkICppZDsKKwogCWlmICghZGV2KQogCQlyZXR1cm47CiAJaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpZCkKIAkJcmV0dXJuOwogCXNwcmludGYoaWQtPmlkLCAiJWMlYyVjJXgleCV4JXgiLAotCQkJJ0EnICsgKCh2ZW5kb3IgPj4gMikgJiAweDNmKSAtIDEsCi0JCQknQScgKyAoKCh2ZW5kb3IgJiAzKSA8PCAzKSB8ICgodmVuZG9yID4+IDEzKSAmIDcpKSAtIDEsCi0JCQknQScgKyAoKHZlbmRvciA+PiA4KSAmIDB4MWYpIC0gMSwKLQkJCShkZXZpY2UgPj4gNCkgJiAweDBmLAotCQkJZGV2aWNlICYgMHgwZiwKLQkJCShkZXZpY2UgPj4gMTIpICYgMHgwZiwKLQkJCShkZXZpY2UgPj4gOCkgJiAweDBmKTsKKwkJJ0EnICsgKCh2ZW5kb3IgPj4gMikgJiAweDNmKSAtIDEsCisJCSdBJyArICgoKHZlbmRvciAmIDMpIDw8IDMpIHwgKCh2ZW5kb3IgPj4gMTMpICYgNykpIC0gMSwKKwkJJ0EnICsgKCh2ZW5kb3IgPj4gOCkgJiAweDFmKSAtIDEsCisJCShkZXZpY2UgPj4gNCkgJiAweDBmLAorCQlkZXZpY2UgJiAweDBmLCAoZGV2aWNlID4+IDEyKSAmIDB4MGYsIChkZXZpY2UgPj4gOCkgJiAweDBmKTsKIAlwbnBfYWRkX2lkKGlkLCBkZXYpOwogfQogCiAvKgogICogIFBhcnNlIGxvZ2ljYWwgZGV2aWNlIHRhZy4KICAqLwotCi1zdGF0aWMgc3RydWN0IHBucF9kZXYgKiBfX2luaXQgaXNhcG5wX3BhcnNlX2RldmljZShzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsIGludCBzaXplLCBpbnQgbnVtYmVyKQorc3RhdGljIHN0cnVjdCBwbnBfZGV2ICpfX2luaXQgaXNhcG5wX3BhcnNlX2RldmljZShzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsCisJCQkJCQkgIGludCBzaXplLCBpbnQgbnVtYmVyKQogewogCXVuc2lnbmVkIGNoYXIgdG1wWzZdOwogCXN0cnVjdCBwbnBfZGV2ICpkZXY7CkBAIC00MzUsMTMgKzQzMiwxMSBAQAogCXJldHVybiBkZXY7CiB9CiAKLQogLyoKICAqICBBZGQgSVJRIHJlc291cmNlIHRvIHJlc291cmNlcyBsaXN0LgogICovCi0KIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FwbnBfcGFyc2VfaXJxX3Jlc291cmNlKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCi0JCQkJCSAgICAgICBpbnQgc2l6ZSkKKwkJCQkJICAgICBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcFszXTsKIAlzdHJ1Y3QgcG5wX2lycSAqaXJxOwpAQCAtNDU4LDE1ICs0NTMsMTMgQEAKIAllbHNlCiAJCWlycS0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lSUV9ISUdIRURHRTsKIAlwbnBfcmVnaXN0ZXJfaXJxX3Jlc291cmNlKG9wdGlvbiwgaXJxKTsKLQlyZXR1cm47CiB9CiAKIC8qCiAgKiAgQWRkIERNQSByZXNvdXJjZSB0byByZXNvdXJjZXMgbGlzdC4KICAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgaXNhcG5wX3BhcnNlX2RtYV9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICBpbnQgc2l6ZSkKKwkJCQkJICAgICBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcFsyXTsKIAlzdHJ1Y3QgcG5wX2RtYSAqZG1hOwpAQCAtNDc4LDE1ICs0NzEsMTMgQEAKIAlkbWEtPm1hcCA9IHRtcFswXTsKIAlkbWEtPmZsYWdzID0gdG1wWzFdOwogCXBucF9yZWdpc3Rlcl9kbWFfcmVzb3VyY2Uob3B0aW9uLCBkbWEpOwotCXJldHVybjsKIH0KIAogLyoKICAqICBBZGQgcG9ydCByZXNvdXJjZSB0byByZXNvdXJjZXMgbGlzdC4KICAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgaXNhcG5wX3BhcnNlX3BvcnRfcmVzb3VyY2Uoc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKLQkJCQkJCWludCBzaXplKQorCQkJCQkgICAgICBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcFs3XTsKIAlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQ7CkBAIC01MDAsMTYgKzQ5MSwxNCBAQAogCXBvcnQtPmFsaWduID0gdG1wWzVdOwogCXBvcnQtPnNpemUgPSB0bXBbNl07CiAJcG9ydC0+ZmxhZ3MgPSB0bXBbMF0gPyBQTlBfUE9SVF9GTEFHXzE2QklUQUREUiA6IDA7Ci0JcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLHBvcnQpOwotCXJldHVybjsKKwlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24sIHBvcnQpOwogfQogCiAvKgogICogIEFkZCBmaXhlZCBwb3J0IHJlc291cmNlIHRvIHJlc291cmNlcyBsaXN0LgogICovCi0KIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FwbnBfcGFyc2VfZml4ZWRfcG9ydF9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCQkJCQkJICAgICAgaW50IHNpemUpCisJCQkJCQkgICAgaW50IHNpemUpCiB7CiAJdW5zaWduZWQgY2hhciB0bXBbM107CiAJc3RydWN0IHBucF9wb3J0ICpwb3J0OwpAQCAtNTIyLDE2ICs1MTEsMTQgQEAKIAlwb3J0LT5zaXplID0gdG1wWzJdOwogCXBvcnQtPmFsaWduID0gMDsKIAlwb3J0LT5mbGFncyA9IFBOUF9QT1JUX0ZMQUdfRklYRUQ7Ci0JcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLHBvcnQpOwotCXJldHVybjsKKwlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24sIHBvcnQpOwogfQogCiAvKgogICogIEFkZCBtZW1vcnkgcmVzb3VyY2UgdG8gcmVzb3VyY2VzIGxpc3QuCiAgKi8KLQogc3RhdGljIHZvaWQgX19pbml0IGlzYXBucF9wYXJzZV9tZW1fcmVzb3VyY2Uoc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKLQkJCQkJICAgICAgIGludCBzaXplKQorCQkJCQkgICAgIGludCBzaXplKQogewogCXVuc2lnbmVkIGNoYXIgdG1wWzldOwogCXN0cnVjdCBwbnBfbWVtICptZW07CkBAIC01NDUsMTYgKzUzMiwxNCBAQAogCW1lbS0+YWxpZ24gPSAodG1wWzZdIDw8IDgpIHwgdG1wWzVdOwogCW1lbS0+c2l6ZSA9ICgodG1wWzhdIDw8IDgpIHwgdG1wWzddKSA8PCA4OwogCW1lbS0+ZmxhZ3MgPSB0bXBbMF07Ci0JcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sbWVtKTsKLQlyZXR1cm47CisJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sIG1lbSk7CiB9CiAKIC8qCiAgKiAgQWRkIDMyLWJpdCBtZW1vcnkgcmVzb3VyY2UgdG8gcmVzb3VyY2VzIGxpc3QuCiAgKi8KLQogc3RhdGljIHZvaWQgX19pbml0IGlzYXBucF9wYXJzZV9tZW0zMl9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCQkJCQkJIGludCBzaXplKQorCQkJCQkgICAgICAgaW50IHNpemUpCiB7CiAJdW5zaWduZWQgY2hhciB0bXBbMTddOwogCXN0cnVjdCBwbnBfbWVtICptZW07CkBAIC01NjUsMTggKzU1MCwxOSBAQAogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAodG1wWzRdIDw8IDI0KSB8ICh0bXBbM10gPDwgMTYpIHwgKHRtcFsyXSA8PCA4KSB8IHRtcFsxXTsKIAltZW0tPm1heCA9ICh0bXBbOF0gPDwgMjQpIHwgKHRtcFs3XSA8PCAxNikgfCAodG1wWzZdIDw8IDgpIHwgdG1wWzVdOwotCW1lbS0+YWxpZ24gPSAodG1wWzEyXSA8PCAyNCkgfCAodG1wWzExXSA8PCAxNikgfCAodG1wWzEwXSA8PCA4KSB8IHRtcFs5XTsKLQltZW0tPnNpemUgPSAodG1wWzE2XSA8PCAyNCkgfCAodG1wWzE1XSA8PCAxNikgfCAodG1wWzE0XSA8PCA4KSB8IHRtcFsxM107CisJbWVtLT5hbGlnbiA9CisJICAgICh0bXBbMTJdIDw8IDI0KSB8ICh0bXBbMTFdIDw8IDE2KSB8ICh0bXBbMTBdIDw8IDgpIHwgdG1wWzldOworCW1lbS0+c2l6ZSA9CisJICAgICh0bXBbMTZdIDw8IDI0KSB8ICh0bXBbMTVdIDw8IDE2KSB8ICh0bXBbMTRdIDw8IDgpIHwgdG1wWzEzXTsKIAltZW0tPmZsYWdzID0gdG1wWzBdOwotCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2Uob3B0aW9uLG1lbSk7CisJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sIG1lbSk7CiB9CiAKIC8qCiAgKiAgQWRkIDMyLWJpdCBmaXhlZCBtZW1vcnkgcmVzb3VyY2UgdG8gcmVzb3VyY2VzIGxpc3QuCiAgKi8KLQogc3RhdGljIHZvaWQgX19pbml0IGlzYXBucF9wYXJzZV9maXhlZF9tZW0zMl9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCQkJCQkJICAgICAgIGludCBzaXplKQorCQkJCQkJICAgICBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcFs5XTsKIAlzdHJ1Y3QgcG5wX21lbSAqbWVtOwpAQCAtNTg1LDI4ICs1NzEsMjkgQEAKIAltZW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47Ci0JbWVtLT5taW4gPSBtZW0tPm1heCA9ICh0bXBbNF0gPDwgMjQpIHwgKHRtcFszXSA8PCAxNikgfCAodG1wWzJdIDw8IDgpIHwgdG1wWzFdOworCW1lbS0+bWluID0gbWVtLT5tYXggPQorCSAgICAodG1wWzRdIDw8IDI0KSB8ICh0bXBbM10gPDwgMTYpIHwgKHRtcFsyXSA8PCA4KSB8IHRtcFsxXTsKIAltZW0tPnNpemUgPSAodG1wWzhdIDw8IDI0KSB8ICh0bXBbN10gPDwgMTYpIHwgKHRtcFs2XSA8PCA4KSB8IHRtcFs1XTsKIAltZW0tPmFsaWduID0gMDsKIAltZW0tPmZsYWdzID0gdG1wWzBdOwotCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2Uob3B0aW9uLG1lbSk7CisJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sIG1lbSk7CiB9CiAKIC8qCiAgKiAgUGFyc2UgY2FyZCBuYW1lIGZvciBJU0EgUG5QIGRldmljZS4KLSAqLyAKLQorICovCiBzdGF0aWMgdm9pZCBfX2luaXQKIGlzYXBucF9wYXJzZV9uYW1lKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBuYW1lX21heCwgdW5zaWduZWQgc2hvcnQgKnNpemUpCiB7CiAJaWYgKG5hbWVbMF0gPT0gJ1wwJykgewotCQl1bnNpZ25lZCBzaG9ydCBzaXplMSA9ICpzaXplID49IG5hbWVfbWF4ID8gKG5hbWVfbWF4IC0gMSkgOiAqc2l6ZTsKKwkJdW5zaWduZWQgc2hvcnQgc2l6ZTEgPQorCQkgICAgKnNpemUgPj0gbmFtZV9tYXggPyAobmFtZV9tYXggLSAxKSA6ICpzaXplOwogCQlpc2FwbnBfcGVlayhuYW1lLCBzaXplMSk7CiAJCW5hbWVbc2l6ZTFdID0gJ1wwJzsKIAkJKnNpemUgLT0gc2l6ZTE7CiAKIAkJLyogY2xlYW4gd2hpdGVzcGFjZSBmcm9tIGVuZCBvZiBzdHJpbmcgKi8KLQkJd2hpbGUgKHNpemUxID4gMCAgJiYgIG5hbWVbLS1zaXplMV0gPT0gJyAnKQorCQl3aGlsZSAoc2l6ZTEgPiAwICYmIG5hbWVbLS1zaXplMV0gPT0gJyAnKQogCQkJbmFtZVtzaXplMV0gPSAnXDAnOwogCX0KIH0KQEAgLTYxNCw3ICs2MDEsNiBAQAogLyoKICAqICBQYXJzZSByZXNvdXJjZSBtYXAgZm9yIGxvZ2ljYWwgZGV2aWNlLgogICovCi0KIHN0YXRpYyBpbnQgX19pbml0IGlzYXBucF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCwKIAkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgc2l6ZSkKIHsKQEAgLTYyMiw2ICs2MDgsNyBAQAogCXVuc2lnbmVkIGNoYXIgdHlwZSwgdG1wWzE3XTsKIAlzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uOwogCXN0cnVjdCBwbnBfZGV2ICpkZXY7CisKIAlpZiAoKGRldiA9IGlzYXBucF9wYXJzZV9kZXZpY2UoY2FyZCwgc2l6ZSwgbnVtYmVyKyspKSA9PSBOVUxMKQogCQlyZXR1cm4gMTsKIAlvcHRpb24gPSBwbnBfcmVnaXN0ZXJfaW5kZXBlbmRlbnRfb3B0aW9uKGRldik7CkBAIC02MjksMTcgKzYxNiwxOSBAQAogCQlrZnJlZShkZXYpOwogCQlyZXR1cm4gMTsKIAl9Ci0JcG5wX2FkZF9jYXJkX2RldmljZShjYXJkLGRldik7CisJcG5wX2FkZF9jYXJkX2RldmljZShjYXJkLCBkZXYpOwogCiAJd2hpbGUgKDEpIHsKLQkJaWYgKGlzYXBucF9yZWFkX3RhZygmdHlwZSwgJnNpemUpPDApCisJCWlmIChpc2FwbnBfcmVhZF90YWcoJnR5cGUsICZzaXplKSA8IDApCiAJCQlyZXR1cm4gMTsKIAkJaWYgKHNraXAgJiYgdHlwZSAhPSBfU1RBR19MT0dERVZJRCAmJiB0eXBlICE9IF9TVEFHX0VORCkKIAkJCWdvdG8gX19za2lwOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBfU1RBR19MT0dERVZJRDoKIAkJCWlmIChzaXplID49IDUgJiYgc2l6ZSA8PSA2KSB7Ci0JCQkJaWYgKChkZXYgPSBpc2FwbnBfcGFyc2VfZGV2aWNlKGNhcmQsIHNpemUsIG51bWJlcisrKSkgPT0gTlVMTCkKKwkJCQlpZiAoKGRldiA9CisJCQkJICAgICBpc2FwbnBfcGFyc2VfZGV2aWNlKGNhcmQsIHNpemUsCisJCQkJCQkJIG51bWJlcisrKSkgPT0gTlVMTCkKIAkJCQkJcmV0dXJuIDE7CiAJCQkJc2l6ZSA9IDA7CiAJCQkJc2tpcCA9IDA7CkBAIC02NDgsNyArNjM3LDcgQEAKIAkJCQkJa2ZyZWUoZGV2KTsKIAkJCQkJcmV0dXJuIDE7CiAJCQkJfQotCQkJCXBucF9hZGRfY2FyZF9kZXZpY2UoY2FyZCxkZXYpOworCQkJCXBucF9hZGRfY2FyZF9kZXZpY2UoY2FyZCwgZGV2KTsKIAkJCX0gZWxzZSB7CiAJCQkJc2tpcCA9IDE7CiAJCQl9CkBAIC02NTgsNyArNjQ3LDggQEAKIAkJY2FzZSBfU1RBR19DT01QQVRERVZJRDoKIAkJCWlmIChzaXplID09IDQgJiYgY29tcGF0IDwgREVWSUNFX0NPVU5UX0NPTVBBVElCTEUpIHsKIAkJCQlpc2FwbnBfcGVlayh0bXAsIDQpOwotCQkJCWlzYXBucF9wYXJzZV9pZChkZXYsKHRtcFsxXSA8PCA4KSB8IHRtcFswXSwgKHRtcFszXSA8PCA4KSB8IHRtcFsyXSk7CisJCQkJaXNhcG5wX3BhcnNlX2lkKGRldiwgKHRtcFsxXSA8PCA4KSB8IHRtcFswXSwKKwkJCQkJCSh0bXBbM10gPDwgOCkgfCB0bXBbMl0pOwogCQkJCWNvbXBhdCsrOwogCQkJCXNpemUgPSAwOwogCQkJfQpAQCAtNjg0LDcgKzY3NCw3IEBACiAJCQkJcHJpb3JpdHkgPSAweDEwMCB8IHRtcFswXTsKIAkJCQlzaXplID0gMDsKIAkJCX0KLQkJCW9wdGlvbiA9IHBucF9yZWdpc3Rlcl9kZXBlbmRlbnRfb3B0aW9uKGRldixwcmlvcml0eSk7CisJCQlvcHRpb24gPSBwbnBfcmVnaXN0ZXJfZGVwZW5kZW50X29wdGlvbihkZXYsIHByaW9yaXR5KTsKIAkJCWlmICghb3B0aW9uKQogCQkJCXJldHVybiAxOwogCQkJYnJlYWs7CkBAIC03MzksMTEgKzcyOSwxMyBAQAogCQkJCWlzYXBucF9za2lwX2J5dGVzKHNpemUpOwogCQkJcmV0dXJuIDE7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImlzYXBucDogdW5leHBlY3RlZCBvciB1bmtub3duIHRhZyB0eXBlIDB4JXggZm9yIGxvZ2ljYWwgZGV2aWNlICVpIChkZXZpY2UgJWkpLCBpZ25vcmVkXG4iLCB0eXBlLCBkZXYtPm51bWJlciwgY2FyZC0+bnVtYmVyKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJpc2FwbnA6IHVuZXhwZWN0ZWQgb3IgdW5rbm93biB0YWcgdHlwZSAweCV4IGZvciBsb2dpY2FsIGRldmljZSAlaSAoZGV2aWNlICVpKSwgaWdub3JlZFxuIiwKKwkJCSAgICAgICB0eXBlLCBkZXYtPm51bWJlciwgY2FyZC0+bnVtYmVyKTsKIAkJfQogCSAgICAgIF9fc2tpcDoKLQkgICAgICAJaWYgKHNpemUgPiAwKQotCQkgICAgICAJaXNhcG5wX3NraXBfYnl0ZXMoc2l6ZSk7CisJCWlmIChzaXplID4gMCkKKwkJCWlzYXBucF9za2lwX2J5dGVzKHNpemUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc1MSwxNCArNzQzLDEzIEBACiAvKgogICogIFBhcnNlIHJlc291cmNlIG1hcCBmb3IgSVNBIFBuUCBjYXJkLgogICovCi0KIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FwbnBfcGFyc2VfcmVzb3VyY2VfbWFwKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkKIHsKIAl1bnNpZ25lZCBjaGFyIHR5cGUsIHRtcFsxN107CiAJdW5zaWduZWQgc2hvcnQgc2l6ZTsKIAogCXdoaWxlICgxKSB7Ci0JCWlmIChpc2FwbnBfcmVhZF90YWcoJnR5cGUsICZzaXplKTwwKQorCQlpZiAoaXNhcG5wX3JlYWRfdGFnKCZ0eXBlLCAmc2l6ZSkgPCAwKQogCQkJcmV0dXJuOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBfU1RBR19QTlBWRVJOTzoKQEAgLTc3MSw3ICs3NjIsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgX1NUQUdfTE9HREVWSUQ6CiAJCQlpZiAoc2l6ZSA+PSA1ICYmIHNpemUgPD0gNikgewotCQkJCWlmIChpc2FwbnBfY3JlYXRlX2RldmljZShjYXJkLCBzaXplKT09MSkKKwkJCQlpZiAoaXNhcG5wX2NyZWF0ZV9kZXZpY2UoY2FyZCwgc2l6ZSkgPT0gMSkKIAkJCQkJcmV0dXJuOwogCQkJCXNpemUgPSAwOwogCQkJfQpAQCAtNzc5LDcgKzc3MCw4IEBACiAJCWNhc2UgX1NUQUdfVkVORE9SOgogCQkJYnJlYWs7CiAJCWNhc2UgX0xUQUdfQU5TSVNUUjoKLQkJCWlzYXBucF9wYXJzZV9uYW1lKGNhcmQtPm5hbWUsIHNpemVvZihjYXJkLT5uYW1lKSwgJnNpemUpOworCQkJaXNhcG5wX3BhcnNlX25hbWUoY2FyZC0+bmFtZSwgc2l6ZW9mKGNhcmQtPm5hbWUpLAorCQkJCQkgICZzaXplKTsKIAkJCWJyZWFrOwogCQljYXNlIF9MVEFHX1VOSUNPREVTVFI6CiAJCQkvKiBzaWxlbnRseSBpZ25vcmUgKi8KQEAgLTc5MiwxOCArNzg0LDE5IEBACiAJCQkJaXNhcG5wX3NraXBfYnl0ZXMoc2l6ZSk7CiAJCQlyZXR1cm47CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImlzYXBucDogdW5leHBlY3RlZCBvciB1bmtub3duIHRhZyB0eXBlIDB4JXggZm9yIGRldmljZSAlaSwgaWdub3JlZFxuIiwgdHlwZSwgY2FyZC0+bnVtYmVyKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJpc2FwbnA6IHVuZXhwZWN0ZWQgb3IgdW5rbm93biB0YWcgdHlwZSAweCV4IGZvciBkZXZpY2UgJWksIGlnbm9yZWRcbiIsCisJCQkgICAgICAgdHlwZSwgY2FyZC0+bnVtYmVyKTsKIAkJfQogCSAgICAgIF9fc2tpcDoKLQkgICAgICAJaWYgKHNpemUgPiAwKQotCQkgICAgICAJaXNhcG5wX3NraXBfYnl0ZXMoc2l6ZSk7CisJCWlmIChzaXplID4gMCkKKwkJCWlzYXBucF9za2lwX2J5dGVzKHNpemUpOwogCX0KIH0KIAogLyoKICAqICBDb21wdXRlIElTQSBQblAgY2hlY2tzdW0gZm9yIGZpcnN0IGVpZ2h0IGJ5dGVzLgogICovCi0KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW5pdCBpc2FwbnBfY2hlY2tzdW0odW5zaWduZWQgY2hhciAqZGF0YSkKIHsKIAlpbnQgaSwgajsKQEAgLTgxNSw3ICs4MDgsOSBAQAogCQkJYml0ID0gMDsKIAkJCWlmIChiICYgKDEgPDwgaikpCiAJCQkJYml0ID0gMTsKLQkJCWNoZWNrc3VtID0gKCgoKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDEpKSAmIDB4MDEpIF4gYml0KSA8PCA3KSB8IChjaGVja3N1bSA+PiAxKTsKKwkJCWNoZWNrc3VtID0KKwkJCSAgICAoKCgoY2hlY2tzdW0gXiAoY2hlY2tzdW0gPj4gMSkpICYgMHgwMSkgXiBiaXQpIDw8IDcpCisJCQkgICAgfCAoY2hlY2tzdW0gPj4gMSk7CiAJCX0KIAl9CiAJcmV0dXJuIGNoZWNrc3VtOwpAQCAtODI0LDI3ICs4MTksMjUgQEAKIC8qCiAgKiAgUGFyc2UgRUlTQSBpZCBmb3IgSVNBIFBuUCBjYXJkLgogICovCi0KLXN0YXRpYyB2b2lkIGlzYXBucF9wYXJzZV9jYXJkX2lkKHN0cnVjdCBwbnBfY2FyZCAqIGNhcmQsIHVuc2lnbmVkIHNob3J0IHZlbmRvciwgdW5zaWduZWQgc2hvcnQgZGV2aWNlKQorc3RhdGljIHZvaWQgaXNhcG5wX3BhcnNlX2NhcmRfaWQoc3RydWN0IHBucF9jYXJkICpjYXJkLCB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsCisJCQkJIHVuc2lnbmVkIHNob3J0IGRldmljZSkKIHsKLQlzdHJ1Y3QgcG5wX2lkICogaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHBucF9pZCAqaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CisKIAlpZiAoIWlkKQogCQlyZXR1cm47CiAJc3ByaW50ZihpZC0+aWQsICIlYyVjJWMleCV4JXgleCIsCi0JCQknQScgKyAoKHZlbmRvciA+PiAyKSAmIDB4M2YpIC0gMSwKLQkJCSdBJyArICgoKHZlbmRvciAmIDMpIDw8IDMpIHwgKCh2ZW5kb3IgPj4gMTMpICYgNykpIC0gMSwKLQkJCSdBJyArICgodmVuZG9yID4+IDgpICYgMHgxZikgLSAxLAotCQkJKGRldmljZSA+PiA0KSAmIDB4MGYsCi0JCQlkZXZpY2UgJiAweDBmLAotCQkJKGRldmljZSA+PiAxMikgJiAweDBmLAotCQkJKGRldmljZSA+PiA4KSAmIDB4MGYpOwotCXBucF9hZGRfY2FyZF9pZChpZCxjYXJkKTsKKwkJJ0EnICsgKCh2ZW5kb3IgPj4gMikgJiAweDNmKSAtIDEsCisJCSdBJyArICgoKHZlbmRvciAmIDMpIDw8IDMpIHwgKCh2ZW5kb3IgPj4gMTMpICYgNykpIC0gMSwKKwkJJ0EnICsgKCh2ZW5kb3IgPj4gOCkgJiAweDFmKSAtIDEsCisJCShkZXZpY2UgPj4gNCkgJiAweDBmLAorCQlkZXZpY2UgJiAweDBmLCAoZGV2aWNlID4+IDEyKSAmIDB4MGYsIChkZXZpY2UgPj4gOCkgJiAweDBmKTsKKwlwbnBfYWRkX2NhcmRfaWQoaWQsIGNhcmQpOwogfQogCiAvKgogICogIEJ1aWxkIGRldmljZSBsaXN0IGZvciBhbGwgcHJlc2VudCBJU0EgUG5QIGRldmljZXMuCiAgKi8KLQogc3RhdGljIGludCBfX2luaXQgaXNhcG5wX2J1aWxkX2RldmljZV9saXN0KHZvaWQpCiB7CiAJaW50IGNzbjsKQEAgLTg1OCwyMiArODUxLDI5IEBACiAJCWlzYXBucF9wZWVrKGhlYWRlciwgOSk7CiAJCWNoZWNrc3VtID0gaXNhcG5wX2NoZWNrc3VtKGhlYWRlcik7CiAjaWYgMAotCQlwcmludGsoS0VSTl9ERUJVRyAidmVuZG9yOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCWhlYWRlclswXSwgaGVhZGVyWzFdLCBoZWFkZXJbMl0sIGhlYWRlclszXSwKLQkJCWhlYWRlcls0XSwgaGVhZGVyWzVdLCBoZWFkZXJbNl0sIGhlYWRlcls3XSwgaGVhZGVyWzhdKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJ2ZW5kb3I6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgICAgICAgaGVhZGVyWzBdLCBoZWFkZXJbMV0sIGhlYWRlclsyXSwgaGVhZGVyWzNdLCBoZWFkZXJbNF0sCisJCSAgICAgICBoZWFkZXJbNV0sIGhlYWRlcls2XSwgaGVhZGVyWzddLCBoZWFkZXJbOF0pOwogCQlwcmludGsoS0VSTl9ERUJVRyAiY2hlY2tzdW0gPSAweCV4XG4iLCBjaGVja3N1bSk7CiAjZW5kaWYKLQkJaWYgKChjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWlmICgoY2FyZCA9CisJCSAgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCQljb250aW51ZTsKIAogCQljYXJkLT5udW1iZXIgPSBjc247CiAJCUlOSVRfTElTVF9IRUFEKCZjYXJkLT5kZXZpY2VzKTsKLQkJaXNhcG5wX3BhcnNlX2NhcmRfaWQoY2FyZCwgKGhlYWRlclsxXSA8PCA4KSB8IGhlYWRlclswXSwgKGhlYWRlclszXSA8PCA4KSB8IGhlYWRlclsyXSk7Ci0JCWNhcmQtPnNlcmlhbCA9IChoZWFkZXJbN10gPDwgMjQpIHwgKGhlYWRlcls2XSA8PCAxNikgfCAoaGVhZGVyWzVdIDw8IDgpIHwgaGVhZGVyWzRdOworCQlpc2FwbnBfcGFyc2VfY2FyZF9pZChjYXJkLCAoaGVhZGVyWzFdIDw8IDgpIHwgaGVhZGVyWzBdLAorCQkJCSAgICAgKGhlYWRlclszXSA8PCA4KSB8IGhlYWRlclsyXSk7CisJCWNhcmQtPnNlcmlhbCA9CisJCSAgICAoaGVhZGVyWzddIDw8IDI0KSB8IChoZWFkZXJbNl0gPDwgMTYpIHwgKGhlYWRlcls1XSA8PCA4KSB8CisJCSAgICBoZWFkZXJbNF07CiAJCWlzYXBucF9jaGVja3N1bV92YWx1ZSA9IDB4MDA7CiAJCWlzYXBucF9wYXJzZV9yZXNvdXJjZV9tYXAoY2FyZCk7CiAJCWlmIChpc2FwbnBfY2hlY2tzdW1fdmFsdWUgIT0gMHgwMCkKLQkJCXByaW50ayhLRVJOX0VSUiAiaXNhcG5wOiBjaGVja3N1bSBmb3IgZGV2aWNlICVpIGlzIG5vdCB2YWxpZCAoMHgleClcbiIsIGNzbiwgaXNhcG5wX2NoZWNrc3VtX3ZhbHVlKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJpc2FwbnA6IGNoZWNrc3VtIGZvciBkZXZpY2UgJWkgaXMgbm90IHZhbGlkICgweCV4KVxuIiwKKwkJCSAgICAgICBjc24sIGlzYXBucF9jaGVja3N1bV92YWx1ZSk7CiAJCWNhcmQtPmNoZWNrc3VtID0gaXNhcG5wX2NoZWNrc3VtX3ZhbHVlOwogCQljYXJkLT5wcm90b2NvbCA9ICZpc2FwbnBfcHJvdG9jb2w7CiAKQEAgLTg5MCw2ICs4OTAsNyBAQAogaW50IGlzYXBucF9wcmVzZW50KHZvaWQpCiB7CiAJc3RydWN0IHBucF9jYXJkICpjYXJkOworCiAJcG5wX2Zvcl9lYWNoX2NhcmQoY2FyZCkgewogCQlpZiAoY2FyZC0+cHJvdG9jb2wgPT0gJmlzYXBucF9wcm90b2NvbCkKIAkJCXJldHVybiAxOwpAQCAtOTExLDEzICs5MTIsMTMgQEAKIAkvKiBpdCBpcyBwb3NzaWJsZSB0byBzZXQgUkRQIG9ubHkgaW4gdGhlIGlzb2xhdGlvbiBwaGFzZSAqLwogCS8qICAgSmVucyBUaG9tcyBUb2VycmluZyA8SmVucy5Ub2VycmluZ0BwaHlzaWsuZnUtYmVybGluLmRlPiAqLwogCWlzYXBucF93cml0ZV9ieXRlKDB4MDIsIDB4MDQpOwkvKiBjbGVhciBDU04gb2YgY2FyZCAqLwotCW1kZWxheSgyKTsJCQkvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KLQlpc2FwbnBfd2FrZShjc24pOwkJLyogYnJpbmcgY2FyZCBpbnRvIHNsZWVwIHN0YXRlICovCi0JaXNhcG5wX3dha2UoMCk7CQkJLyogYnJpbmcgY2FyZCBpbnRvIGlzb2xhdGlvbiBzdGF0ZSAqLwotCWlzYXBucF9zZXRfcmRwKCk7CQkvKiByZXNldCB0aGUgUkRQIHBvcnQgKi8KLQl1ZGVsYXkoMTAwMCk7CQkJLyogZGVsYXkgMTAwMHVzICovCisJbWRlbGF5KDIpOwkJLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisJaXNhcG5wX3dha2UoY3NuKTsJLyogYnJpbmcgY2FyZCBpbnRvIHNsZWVwIHN0YXRlICovCisJaXNhcG5wX3dha2UoMCk7CQkvKiBicmluZyBjYXJkIGludG8gaXNvbGF0aW9uIHN0YXRlICovCisJaXNhcG5wX3NldF9yZHAoKTsJLyogcmVzZXQgdGhlIFJEUCBwb3J0ICovCisJdWRlbGF5KDEwMDApOwkJLyogZGVsYXkgMTAwMHVzICovCiAJaXNhcG5wX3dyaXRlX2J5dGUoMHgwNiwgY3NuKTsJLyogcmVzZXQgQ1NOIHRvIHByZXZpb3VzIHZhbHVlICovCi0JdWRlbGF5KDI1MCk7CQkJLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisJdWRlbGF5KDI1MCk7CQkvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KICNlbmRpZgogCWlmIChsb2dkZXYgPj0gMCkKIAkJaXNhcG5wX2RldmljZShsb2dkZXYpOwpAQCAtOTMxLDEyICs5MzIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKgotICogIEluaXRpdGlhbGl6YXRpb24uCisgKiAgSW5pdGlhbGl6YXRpb24uCiAgKi8KIAotCiBFWFBPUlRfU1lNQk9MKGlzYXBucF9wcm90b2NvbCk7CiBFWFBPUlRfU1lNQk9MKGlzYXBucF9wcmVzZW50KTsKIEVYUE9SVF9TWU1CT0woaXNhcG5wX2NmZ19iZWdpbik7CkBAIC05NDYsNyArOTQ1LDggQEAKICNlbmRpZgogRVhQT1JUX1NZTUJPTChpc2FwbnBfd3JpdGVfYnl0ZSk7CiAKLXN0YXRpYyBpbnQgaXNhcG5wX3JlYWRfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKK3N0YXRpYyBpbnQgaXNhcG5wX3JlYWRfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsCisJCQkJIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAlpbnQgdG1wLCByZXQ7CiAKQEAgLTk2MCwzMSArOTYwLDM3IEBACiAJCQlyZXMtPnBvcnRfcmVzb3VyY2VbdG1wXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CiAJCX0KIAkJZm9yICh0bXAgPSAwOyB0bXAgPCBQTlBfTUFYX01FTTsgdG1wKyspIHsKLQkJCXJldCA9IGlzYXBucF9yZWFkX3dvcmQoSVNBUE5QX0NGR19NRU0gKyAodG1wIDw8IDMpKSA8PCA4OworCQkJcmV0ID0KKwkJCSAgICBpc2FwbnBfcmVhZF93b3JkKElTQVBOUF9DRkdfTUVNICsgKHRtcCA8PCAzKSkgPDwgODsKIAkJCWlmICghcmV0KQogCQkJCWNvbnRpbnVlOwogCQkJcmVzLT5tZW1fcmVzb3VyY2VbdG1wXS5zdGFydCA9IHJldDsKIAkJCXJlcy0+bWVtX3Jlc291cmNlW3RtcF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAkJfQogCQlmb3IgKHRtcCA9IDA7IHRtcCA8IFBOUF9NQVhfSVJROyB0bXArKykgewotCQkJcmV0ID0gKGlzYXBucF9yZWFkX3dvcmQoSVNBUE5QX0NGR19JUlEgKyAodG1wIDw8IDEpKSA+PiA4KTsKKwkJCXJldCA9CisJCQkgICAgKGlzYXBucF9yZWFkX3dvcmQoSVNBUE5QX0NGR19JUlEgKyAodG1wIDw8IDEpKSA+PgorCQkJICAgICA4KTsKIAkJCWlmICghcmV0KQogCQkJCWNvbnRpbnVlOwotCQkJcmVzLT5pcnFfcmVzb3VyY2VbdG1wXS5zdGFydCA9IHJlcy0+aXJxX3Jlc291cmNlW3RtcF0uZW5kID0gcmV0OworCQkJcmVzLT5pcnFfcmVzb3VyY2VbdG1wXS5zdGFydCA9CisJCQkgICAgcmVzLT5pcnFfcmVzb3VyY2VbdG1wXS5lbmQgPSByZXQ7CiAJCQlyZXMtPmlycV9yZXNvdXJjZVt0bXBdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CiAJCX0KIAkJZm9yICh0bXAgPSAwOyB0bXAgPCBQTlBfTUFYX0RNQTsgdG1wKyspIHsKIAkJCXJldCA9IGlzYXBucF9yZWFkX2J5dGUoSVNBUE5QX0NGR19ETUEgKyB0bXApOwogCQkJaWYgKHJldCA9PSA0KQogCQkJCWNvbnRpbnVlOwotCQkJcmVzLT5kbWFfcmVzb3VyY2VbdG1wXS5zdGFydCA9IHJlcy0+ZG1hX3Jlc291cmNlW3RtcF0uZW5kID0gcmV0OworCQkJcmVzLT5kbWFfcmVzb3VyY2VbdG1wXS5zdGFydCA9CisJCQkgICAgcmVzLT5kbWFfcmVzb3VyY2VbdG1wXS5lbmQgPSByZXQ7CiAJCQlyZXMtPmRtYV9yZXNvdXJjZVt0bXBdLmZsYWdzID0gSU9SRVNPVVJDRV9ETUE7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXNhcG5wX2dldF9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcykKK3N0YXRpYyBpbnQgaXNhcG5wX2dldF9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldiwKKwkJCQlzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMpCiB7CiAJaW50IHJldDsKIAlwbnBfaW5pdF9yZXNvdXJjZV90YWJsZShyZXMpOwpAQCAtOTk0LDI0ICsxMDAwLDQ0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpc2FwbnBfc2V0X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2LCBzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzKQorc3RhdGljIGludCBpc2FwbnBfc2V0X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2LAorCQkJCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAlpbnQgdG1wOwogCiAJaXNhcG5wX2NmZ19iZWdpbihkZXYtPmNhcmQtPm51bWJlciwgZGV2LT5udW1iZXIpOwogCWRldi0+YWN0aXZlID0gMTsKLQlmb3IgKHRtcCA9IDA7IHRtcCA8IFBOUF9NQVhfUE9SVCAmJiAocmVzLT5wb3J0X3Jlc291cmNlW3RtcF0uZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfVU5TRVQpKSA9PSBJT1JFU09VUkNFX0lPOyB0bXArKykKLQkJaXNhcG5wX3dyaXRlX3dvcmQoSVNBUE5QX0NGR19QT1JUKyh0bXA8PDEpLCByZXMtPnBvcnRfcmVzb3VyY2VbdG1wXS5zdGFydCk7Ci0JZm9yICh0bXAgPSAwOyB0bXAgPCBQTlBfTUFYX0lSUSAmJiAocmVzLT5pcnFfcmVzb3VyY2VbdG1wXS5mbGFncyAmIChJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfVU5TRVQpKSA9PSBJT1JFU09VUkNFX0lSUTsgdG1wKyspIHsKKwlmb3IgKHRtcCA9IDA7CisJICAgICB0bXAgPCBQTlBfTUFYX1BPUlQKKwkgICAgICYmIChyZXMtPnBvcnRfcmVzb3VyY2VbdG1wXS4KKwkJIGZsYWdzICYgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX1VOU0VUKSkgPT0gSU9SRVNPVVJDRV9JTzsKKwkgICAgIHRtcCsrKQorCQlpc2FwbnBfd3JpdGVfd29yZChJU0FQTlBfQ0ZHX1BPUlQgKyAodG1wIDw8IDEpLAorCQkJCSAgcmVzLT5wb3J0X3Jlc291cmNlW3RtcF0uc3RhcnQpOworCWZvciAodG1wID0gMDsKKwkgICAgIHRtcCA8IFBOUF9NQVhfSVJRCisJICAgICAmJiAocmVzLT5pcnFfcmVzb3VyY2VbdG1wXS4KKwkJIGZsYWdzICYgKElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9VTlNFVCkpID09IElPUkVTT1VSQ0VfSVJROworCSAgICAgdG1wKyspIHsKIAkJaW50IGlycSA9IHJlcy0+aXJxX3Jlc291cmNlW3RtcF0uc3RhcnQ7CiAJCWlmIChpcnEgPT0gMikKIAkJCWlycSA9IDk7Ci0JCWlzYXBucF93cml0ZV9ieXRlKElTQVBOUF9DRkdfSVJRKyh0bXA8PDEpLCBpcnEpOworCQlpc2FwbnBfd3JpdGVfYnl0ZShJU0FQTlBfQ0ZHX0lSUSArICh0bXAgPDwgMSksIGlycSk7CiAJfQotCWZvciAodG1wID0gMDsgdG1wIDwgUE5QX01BWF9ETUEgJiYgKHJlcy0+ZG1hX3Jlc291cmNlW3RtcF0uZmxhZ3MgJiAoSU9SRVNPVVJDRV9ETUEgfCBJT1JFU09VUkNFX1VOU0VUKSkgPT0gSU9SRVNPVVJDRV9ETUE7IHRtcCsrKQotCQlpc2FwbnBfd3JpdGVfYnl0ZShJU0FQTlBfQ0ZHX0RNQSt0bXAsIHJlcy0+ZG1hX3Jlc291cmNlW3RtcF0uc3RhcnQpOwotCWZvciAodG1wID0gMDsgdG1wIDwgUE5QX01BWF9NRU0gJiYgKHJlcy0+bWVtX3Jlc291cmNlW3RtcF0uZmxhZ3MgJiAoSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1VOU0VUKSkgPT0gSU9SRVNPVVJDRV9NRU07IHRtcCsrKQotCQlpc2FwbnBfd3JpdGVfd29yZChJU0FQTlBfQ0ZHX01FTSsodG1wPDwzKSwgKHJlcy0+bWVtX3Jlc291cmNlW3RtcF0uc3RhcnQgPj4gOCkgJiAweGZmZmYpOworCWZvciAodG1wID0gMDsKKwkgICAgIHRtcCA8IFBOUF9NQVhfRE1BCisJICAgICAmJiAocmVzLT5kbWFfcmVzb3VyY2VbdG1wXS4KKwkJIGZsYWdzICYgKElPUkVTT1VSQ0VfRE1BIHwgSU9SRVNPVVJDRV9VTlNFVCkpID09IElPUkVTT1VSQ0VfRE1BOworCSAgICAgdG1wKyspCisJCWlzYXBucF93cml0ZV9ieXRlKElTQVBOUF9DRkdfRE1BICsgdG1wLAorCQkJCSAgcmVzLT5kbWFfcmVzb3VyY2VbdG1wXS5zdGFydCk7CisJZm9yICh0bXAgPSAwOworCSAgICAgdG1wIDwgUE5QX01BWF9NRU0KKwkgICAgICYmIChyZXMtPm1lbV9yZXNvdXJjZVt0bXBdLgorCQkgZmxhZ3MgJiAoSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1VOU0VUKSkgPT0gSU9SRVNPVVJDRV9NRU07CisJICAgICB0bXArKykKKwkJaXNhcG5wX3dyaXRlX3dvcmQoSVNBUE5QX0NGR19NRU0gKyAodG1wIDw8IDMpLAorCQkJCSAgKHJlcy0+bWVtX3Jlc291cmNlW3RtcF0uc3RhcnQgPj4gOCkgJiAweGZmZmYpOwogCS8qIEZJWE1FOiBXZSBhcmVuJ3QgaGFuZGxpbmcgMzJiaXQgbWVtcyBwcm9wZXJseSBoZXJlICovCiAJaXNhcG5wX2FjdGl2YXRlKGRldi0+bnVtYmVyKTsKIAlpc2FwbnBfY2ZnX2VuZCgpOwpAQCAtMTAzMCw5ICsxMDU2LDkgQEAKIH0KIAogc3RydWN0IHBucF9wcm90b2NvbCBpc2FwbnBfcHJvdG9jb2wgPSB7Ci0JLm5hbWUJPSAiSVNBIFBsdWcgYW5kIFBsYXkiLAotCS5nZXQJPSBpc2FwbnBfZ2V0X3Jlc291cmNlcywKLQkuc2V0CT0gaXNhcG5wX3NldF9yZXNvdXJjZXMsCisJLm5hbWUgPSAiSVNBIFBsdWcgYW5kIFBsYXkiLAorCS5nZXQgPSBpc2FwbnBfZ2V0X3Jlc291cmNlcywKKwkuc2V0ID0gaXNhcG5wX3NldF9yZXNvdXJjZXMsCiAJLmRpc2FibGUgPSBpc2FwbnBfZGlzYWJsZV9yZXNvdXJjZXMsCiB9OwogCkBAIC0xMDUzLDMxICsxMDc5LDM2IEBACiAjZW5kaWYKICNpZmRlZiBJU0FQTlBfUkVHSU9OX09LCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihfUElEWFIsIDEsICJpc2FwbnAgaW5kZXgiKSkgewotCQlwcmludGsoS0VSTl9FUlIgImlzYXBucDogSW5kZXggUmVnaXN0ZXIgMHgleCBhbHJlYWR5IHVzZWRcbiIsIF9QSURYUik7CisJCXByaW50ayhLRVJOX0VSUiAiaXNhcG5wOiBJbmRleCBSZWdpc3RlciAweCV4IGFscmVhZHkgdXNlZFxuIiwKKwkJICAgICAgIF9QSURYUik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogI2VuZGlmCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihfUE5QV1JQLCAxLCAiaXNhcG5wIHdyaXRlIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2FwbnA6IFdyaXRlIERhdGEgUmVnaXN0ZXIgMHgleCBhbHJlYWR5IHVzZWRcbiIsIF9QTlBXUlApOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpc2FwbnA6IFdyaXRlIERhdGEgUmVnaXN0ZXIgMHgleCBhbHJlYWR5IHVzZWRcbiIsCisJCSAgICAgICBfUE5QV1JQKTsKICNpZmRlZiBJU0FQTlBfUkVHSU9OX09LCiAJCXJlbGVhc2VfcmVnaW9uKF9QSURYUiwgMSk7CiAjZW5kaWYKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlpZihwbnBfcmVnaXN0ZXJfcHJvdG9jb2woJmlzYXBucF9wcm90b2NvbCk8MCkKKwlpZiAocG5wX3JlZ2lzdGVyX3Byb3RvY29sKCZpc2FwbnBfcHJvdG9jb2wpIDwgMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qCi0JICoJUHJpbnQgYSBtZXNzYWdlLiBUaGUgZXhpc3RpbmcgSVNBUG5QIGNvZGUgaXMgaGFuZ2luZyBtYWNoaW5lcwotCSAqCXNvIGxldCB0aGUgdXNlciBrbm93IHdoZXJlLgorCSAqICAgICAgUHJpbnQgYSBtZXNzYWdlLiBUaGUgZXhpc3RpbmcgSVNBUG5QIGNvZGUgaXMgaGFuZ2luZyBtYWNoaW5lcworCSAqICAgICAgc28gbGV0IHRoZSB1c2VyIGtub3cgd2hlcmUuCiAJICovCi0JIAorCiAJcHJpbnRrKEtFUk5fSU5GTyAiaXNhcG5wOiBTY2FubmluZyBmb3IgUG5QIGNhcmRzLi4uXG4iKTsKIAlpZiAoaXNhcG5wX3JkcCA+PSAweDIwMyAmJiBpc2FwbnBfcmRwIDw9IDB4M2ZmKSB7CiAJCWlzYXBucF9yZHAgfD0gMzsKIAkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpc2FwbnBfcmRwLCAxLCAiaXNhcG5wIHJlYWQiKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpc2FwbnA6IFJlYWQgRGF0YSBSZWdpc3RlciAweCV4IGFscmVhZHkgdXNlZFxuIiwgaXNhcG5wX3JkcCk7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiaXNhcG5wOiBSZWFkIERhdGEgUmVnaXN0ZXIgMHgleCBhbHJlYWR5IHVzZWRcbiIsCisJCQkgICAgICAgaXNhcG5wX3JkcCk7CiAjaWZkZWYgSVNBUE5QX1JFR0lPTl9PSwogCQkJcmVsZWFzZV9yZWdpb24oX1BJRFhSLCAxKTsKICNlbmRpZgpAQCAtMTA4OSwxNCArMTEyMCwxNCBAQAogCWlzYXBucF9kZXRlY3RlZCA9IDE7CiAJaWYgKGlzYXBucF9yZHAgPCAweDIwMyB8fCBpc2FwbnBfcmRwID4gMHgzZmYpIHsKIAkJY2FyZHMgPSBpc2FwbnBfaXNvbGF0ZSgpOwotCQlpZiAoY2FyZHMgPCAwIHx8IAotCQkgICAgKGlzYXBucF9yZHAgPCAweDIwMyB8fCBpc2FwbnBfcmRwID4gMHgzZmYpKSB7CisJCWlmIChjYXJkcyA8IDAgfHwgKGlzYXBucF9yZHAgPCAweDIwMyB8fCBpc2FwbnBfcmRwID4gMHgzZmYpKSB7CiAjaWZkZWYgSVNBUE5QX1JFR0lPTl9PSwogCQkJcmVsZWFzZV9yZWdpb24oX1BJRFhSLCAxKTsKICNlbmRpZgogCQkJcmVsZWFzZV9yZWdpb24oX1BOUFdSUCwgMSk7CiAJCQlpc2FwbnBfZGV0ZWN0ZWQgPSAwOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXNhcG5wOiBObyBQbHVnICYgUGxheSBkZXZpY2UgZm91bmRcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJpc2FwbnA6IE5vIFBsdWcgJiBQbGF5IGRldmljZSBmb3VuZFxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlyZXF1ZXN0X3JlZ2lvbihpc2FwbnBfcmRwLCAxLCAiaXNhcG5wIHJlYWQiKTsKQEAgLTExMDQsMTkgKzExMzUsMjMgQEAKIAlpc2FwbnBfYnVpbGRfZGV2aWNlX2xpc3QoKTsKIAljYXJkcyA9IDA7CiAKLQlwcm90b2NvbF9mb3JfZWFjaF9jYXJkKCZpc2FwbnBfcHJvdG9jb2wsY2FyZCkgeworCXByb3RvY29sX2Zvcl9lYWNoX2NhcmQoJmlzYXBucF9wcm90b2NvbCwgY2FyZCkgewogCQljYXJkcysrOwogCQlpZiAoaXNhcG5wX3ZlcmJvc2UpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImlzYXBucDogQ2FyZCAnJXMnXG4iLCBjYXJkLT5uYW1lWzBdP2NhcmQtPm5hbWU6IlVua25vd24iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImlzYXBucDogQ2FyZCAnJXMnXG4iLAorCQkJICAgICAgIGNhcmQtPm5hbWVbMF0gPyBjYXJkLT5uYW1lIDogIlVua25vd24iKTsKIAkJCWlmIChpc2FwbnBfdmVyYm9zZSA8IDIpCiAJCQkJY29udGludWU7Ci0JCQljYXJkX2Zvcl9lYWNoX2RldihjYXJkLGRldikgewotCQkJCXByaW50ayhLRVJOX0lORk8gImlzYXBucDogICBEZXZpY2UgJyVzJ1xuIiwgZGV2LT5uYW1lWzBdP2Rldi0+bmFtZToiVW5rbm93biIpOworCQkJY2FyZF9mb3JfZWFjaF9kZXYoY2FyZCwgZGV2KSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXNhcG5wOiAgIERldmljZSAnJXMnXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWVbMF0gPyBkZXYtPm5hbWUgOiAiVW5rbm93biIpOwogCQkJfQogCQl9CiAJfQogCWlmIChjYXJkcykgewotCQlwcmludGsoS0VSTl9JTkZPICJpc2FwbnA6ICVpIFBsdWcgJiBQbGF5IGNhcmQlcyBkZXRlY3RlZCB0b3RhbFxuIiwgY2FyZHMsIGNhcmRzPjE/InMiOiIiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgImlzYXBucDogJWkgUGx1ZyAmIFBsYXkgY2FyZCVzIGRldGVjdGVkIHRvdGFsXG4iLCBjYXJkcywKKwkJICAgICAgIGNhcmRzID4gMSA/ICJzIiA6ICIiKTsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9JTkZPICJpc2FwbnA6IE5vIFBsdWcgJiBQbGF5IGNhcmQgZm91bmRcbiIpOwogCX0KQEAgLTExNDEsMTEgKzExNzYsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgaXNhcG5wX3NldHVwX2lzYXBucChjaGFyICpzdHIpCiB7Ci0JKHZvaWQpKChnZXRfb3B0aW9uKCZzdHIsJmlzYXBucF9yZHApID09IDIpICYmCi0JICAgICAgIChnZXRfb3B0aW9uKCZzdHIsJmlzYXBucF9yZXNldCkgPT0gMikgJiYKLQkgICAgICAgKGdldF9vcHRpb24oJnN0ciwmaXNhcG5wX3ZlcmJvc2UpID09IDIpKTsKKwkodm9pZCkoKGdldF9vcHRpb24oJnN0ciwgJmlzYXBucF9yZHApID09IDIpICYmCisJICAgICAgIChnZXRfb3B0aW9uKCZzdHIsICZpc2FwbnBfcmVzZXQpID09IDIpICYmCisJICAgICAgIChnZXRfb3B0aW9uKCZzdHIsICZpc2FwbnBfdmVyYm9zZSkgPT0gMikpOwogCXJldHVybiAxOwogfQogCiBfX3NldHVwKCJpc2FwbnA9IiwgaXNhcG5wX3NldHVwX2lzYXBucCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9wcm9jLmMgYi9kcml2ZXJzL3BucC9pc2FwbnAvcHJvYy5jCmluZGV4IDQwYjcyNGUuLjNmYmMwZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9wcm9jLmMKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL3Byb2MuYwpAQCAtMiw3ICsyLDYgQEAKICAqICBJU0EgUGx1ZyAmIFBsYXkgc3VwcG9ydAogICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgogICoKLSAqCiAgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0xNiw3ICsxNSw2IEBACiAgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC01NCw3ICs1Miw4IEBACiAJcmV0dXJuIChmaWxlLT5mX3BvcyA9IG5ldyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGlzYXBucF9wcm9jX2J1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBpc2FwbnBfcHJvY19idXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqIHBwb3MpCiB7CiAJc3RydWN0IGlub2RlICppbm8gPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vKTsKQEAgLTc0LDcgKzczLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpc2FwbnBfY2ZnX2JlZ2luKGRldi0+Y2FyZC0+bnVtYmVyLCBkZXYtPm51bWJlcik7Ci0JZm9yICggOyBwb3MgPCAyNTYgJiYgY250ID4gMDsgcG9zKyssIGJ1ZisrLCBjbnQtLSkgeworCWZvciAoOyBwb3MgPCAyNTYgJiYgY250ID4gMDsgcG9zKyssIGJ1ZisrLCBjbnQtLSkgewogCQl1bnNpZ25lZCBjaGFyIHZhbDsKIAkJdmFsID0gaXNhcG5wX3JlYWRfYnl0ZShwb3MpOwogCQlfX3B1dF91c2VyKHZhbCwgYnVmKTsKQEAgLTg1LDEwICs4NCw5IEBACiAJcmV0dXJuIG5ieXRlczsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNhcG5wX3Byb2NfYnVzX2ZpbGVfb3BlcmF0aW9ucyA9Ci17Ci0JLmxsc2VlawkJPSBpc2FwbnBfcHJvY19idXNfbHNlZWssCi0JLnJlYWQJCT0gaXNhcG5wX3Byb2NfYnVzX3JlYWQsCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpc2FwbnBfcHJvY19idXNfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsgPSBpc2FwbnBfcHJvY19idXNfbHNlZWssCisJLnJlYWQgPSBpc2FwbnBfcHJvY19idXNfcmVhZCwKIH07CiAKIHN0YXRpYyBpbnQgaXNhcG5wX3Byb2NfYXR0YWNoX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQpAQCAtMTM5LDEzICsxMzcsMTQgQEAKIAlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBpc2FwbnBfcHJvY19idXNfZGlyKTsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBNT0RVTEUgKi8KKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KIAogaW50IF9faW5pdCBpc2FwbnBfcHJvY19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHBucF9kZXYgKmRldjsKKwogCWlzYXBucF9wcm9jX2J1c19kaXIgPSBwcm9jX21rZGlyKCJpc2FwbnAiLCBwcm9jX2J1cyk7Ci0JcHJvdG9jb2xfZm9yX2VhY2hfZGV2KCZpc2FwbnBfcHJvdG9jb2wsZGV2KSB7CisJcHJvdG9jb2xfZm9yX2VhY2hfZGV2KCZpc2FwbnBfcHJvdG9jb2wsIGRldikgewogCQlpc2FwbnBfcHJvY19hdHRhY2hfZGV2aWNlKGRldik7CiAJfQogCXJldHVybiAwOwpAQCAtMTY3LDQgKzE2Niw0IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJpc2FwbnAiLCBwcm9jX2J1cyk7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogTU9EVUxFICovCisjZW5kaWYJCQkJLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9tYW5hZ2VyLmMgYi9kcml2ZXJzL3BucC9tYW5hZ2VyLmMKaW5kZXggNTdlNmFiMS4uM2JkYTUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvcG5wL21hbmFnZXIuYwpAQCAtMyw3ICszLDYgQEAKICAqCiAgKiBiYXNlZCBvbiBpc2FwbnAuYyByZXNvdXJjZSBtYW5hZ2VtZW50IChjKSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CiAgKiBDb3B5cmlnaHQgMjAwMyBBZGFtIEJlbGF5IDxhbWJ4MUBuZW8ucnIuY29tPgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTI2LDcgKzI1LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaWR4ID49IFBOUF9NQVhfUE9SVCkgewotCQlwbnBfZXJyKCJNb3JlIHRoYW4gNCBwb3J0cyBpcyBpbmNvbXBhdGlibGUgd2l0aCBwbnAgc3BlY2lmaWNhdGlvbnMuIik7CisJCXBucF9lcnIKKwkJICAgICgiTW9yZSB0aGFuIDQgcG9ydHMgaXMgaW5jb21wYXRpYmxlIHdpdGggcG5wIHNwZWNpZmljYXRpb25zLiIpOwogCQkvKiBwcmV0ZW5kIHdlIHdlcmUgc3VjY2Vzc2Z1bCBzbyBhdCBsZWFzdCB0aGUgbWFuYWdlciB3b24ndCB0cnkgYWdhaW4gKi8KIAkJcmV0dXJuIDE7CiAJfQpAQCAtNDEsMTEgKzQxLDExIEBACiAKIAkvKiBzZXQgdGhlIGluaXRpYWwgdmFsdWVzICovCiAJKmZsYWdzIHw9IHJ1bGUtPmZsYWdzIHwgSU9SRVNPVVJDRV9JTzsKLQkqZmxhZ3MgJj0gIH5JT1JFU09VUkNFX1VOU0VUOworCSpmbGFncyAmPSB+SU9SRVNPVVJDRV9VTlNFVDsKIAogCWlmICghcnVsZS0+c2l6ZSkgewogCQkqZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKLQkJcmV0dXJuIDE7IC8qIHNraXAgZGlzYWJsZWQgcmVzb3VyY2UgcmVxdWVzdHMgKi8KKwkJcmV0dXJuIDE7CS8qIHNraXAgZGlzYWJsZWQgcmVzb3VyY2UgcmVxdWVzdHMgKi8KIAl9CiAKIAkqc3RhcnQgPSBydWxlLT5taW47CkBAIC03MCw3ICs3MCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGlkeCA+PSBQTlBfTUFYX01FTSkgewotCQlwbnBfZXJyKCJNb3JlIHRoYW4gOCBtZW1zIGlzIGluY29tcGF0aWJsZSB3aXRoIHBucCBzcGVjaWZpY2F0aW9ucy4iKTsKKwkJcG5wX2VycgorCQkgICAgKCJNb3JlIHRoYW4gOCBtZW1zIGlzIGluY29tcGF0aWJsZSB3aXRoIHBucCBzcGVjaWZpY2F0aW9ucy4iKTsKIAkJLyogcHJldGVuZCB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgc28gYXQgbGVhc3QgdGhlIG1hbmFnZXIgd29uJ3QgdHJ5IGFnYWluICovCiAJCXJldHVybiAxOwogCX0KQEAgLTg1LDcgKzg2LDcgQEAKIAogCS8qIHNldCB0aGUgaW5pdGlhbCB2YWx1ZXMgKi8KIAkqZmxhZ3MgfD0gcnVsZS0+ZmxhZ3MgfCBJT1JFU09VUkNFX01FTTsKLQkqZmxhZ3MgJj0gIH5JT1JFU09VUkNFX1VOU0VUOworCSpmbGFncyAmPSB+SU9SRVNPVVJDRV9VTlNFVDsKIAogCS8qIGNvbnZlcnQgcG5wIGZsYWdzIHRvIHN0YW5kYXJkIExpbnV4IGZsYWdzICovCiAJaWYgKCEocnVsZS0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV9XUklURUFCTEUpKQpAQCAtOTksMTEgKzEwMCwxMSBAQAogCiAJaWYgKCFydWxlLT5zaXplKSB7CiAJCSpmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwotCQlyZXR1cm4gMTsgLyogc2tpcCBkaXNhYmxlZCByZXNvdXJjZSByZXF1ZXN0cyAqLworCQlyZXR1cm4gMTsJLyogc2tpcCBkaXNhYmxlZCByZXNvdXJjZSByZXF1ZXN0cyAqLwogCX0KIAogCSpzdGFydCA9IHJ1bGUtPm1pbjsKLQkqZW5kID0gKnN0YXJ0ICsgcnVsZS0+c2l6ZSAtMTsKKwkqZW5kID0gKnN0YXJ0ICsgcnVsZS0+c2l6ZSAtIDE7CiAKIAkvKiBydW4gdGhyb3VnaCB1bnRpbCBwbnBfY2hlY2tfbWVtIGlzIGhhcHB5ICovCiAJd2hpbGUgKCFwbnBfY2hlY2tfbWVtKGRldiwgaWR4KSkgewpAQCAtMTE1LDcgKzExNiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgcG5wX2Fzc2lnbl9pcnEoc3RydWN0IHBucF9kZXYgKiBkZXYsIHN0cnVjdCBwbnBfaXJxICpydWxlLCBpbnQgaWR4KQorc3RhdGljIGludCBwbnBfYXNzaWduX2lycShzdHJ1Y3QgcG5wX2RldiAqZGV2LCBzdHJ1Y3QgcG5wX2lycSAqcnVsZSwgaW50IGlkeCkKIHsKIAlyZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCAqZW5kOwogCXVuc2lnbmVkIGxvbmcgKmZsYWdzOwpAQCAtMTMwLDcgKzEzMSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGlkeCA+PSBQTlBfTUFYX0lSUSkgewotCQlwbnBfZXJyKCJNb3JlIHRoYW4gMiBpcnFzIGlzIGluY29tcGF0aWJsZSB3aXRoIHBucCBzcGVjaWZpY2F0aW9ucy4iKTsKKwkJcG5wX2VycgorCQkgICAgKCJNb3JlIHRoYW4gMiBpcnFzIGlzIGluY29tcGF0aWJsZSB3aXRoIHBucCBzcGVjaWZpY2F0aW9ucy4iKTsKIAkJLyogcHJldGVuZCB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgc28gYXQgbGVhc3QgdGhlIG1hbmFnZXIgd29uJ3QgdHJ5IGFnYWluICovCiAJCXJldHVybiAxOwogCX0KQEAgLTE0NSwxMSArMTQ3LDExIEBACiAKIAkvKiBzZXQgdGhlIGluaXRpYWwgdmFsdWVzICovCiAJKmZsYWdzIHw9IHJ1bGUtPmZsYWdzIHwgSU9SRVNPVVJDRV9JUlE7Ci0JKmZsYWdzICY9ICB+SU9SRVNPVVJDRV9VTlNFVDsKKwkqZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CiAKIAlpZiAoYml0bWFwX2VtcHR5KHJ1bGUtPm1hcCwgUE5QX0lSUV9OUikpIHsKIAkJKmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7Ci0JCXJldHVybiAxOyAvKiBza2lwIGRpc2FibGVkIHJlc291cmNlIHJlcXVlc3RzICovCisJCXJldHVybiAxOwkvKiBza2lwIGRpc2FibGVkIHJlc291cmNlIHJlcXVlc3RzICovCiAJfQogCiAJLyogVEJEOiBuZWVkIGNoZWNrIGZvciA+MTYgSVJRICovCkBAIC0xNTksOSArMTYxLDkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWlmKHRlc3RfYml0KHh0YWJbaV0sIHJ1bGUtPm1hcCkpIHsKKwkJaWYgKHRlc3RfYml0KHh0YWJbaV0sIHJ1bGUtPm1hcCkpIHsKIAkJCSpzdGFydCA9ICplbmQgPSB4dGFiW2ldOwotCQkJaWYocG5wX2NoZWNrX2lycShkZXYsIGlkeCkpCisJCQlpZiAocG5wX2NoZWNrX2lycShkZXYsIGlkeCkpCiAJCQkJcmV0dXJuIDE7CiAJCX0KIAl9CkBAIC0xODMsNyArMTg1LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaWR4ID49IFBOUF9NQVhfRE1BKSB7Ci0JCXBucF9lcnIoIk1vcmUgdGhhbiAyIGRtYXMgaXMgaW5jb21wYXRpYmxlIHdpdGggcG5wIHNwZWNpZmljYXRpb25zLiIpOworCQlwbnBfZXJyCisJCSAgICAoIk1vcmUgdGhhbiAyIGRtYXMgaXMgaW5jb21wYXRpYmxlIHdpdGggcG5wIHNwZWNpZmljYXRpb25zLiIpOwogCQkvKiBwcmV0ZW5kIHdlIHdlcmUgc3VjY2Vzc2Z1bCBzbyBhdCBsZWFzdCB0aGUgbWFuYWdlciB3b24ndCB0cnkgYWdhaW4gKi8KIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTk4LDE3ICsyMDEsMTcgQEAKIAogCS8qIHNldCB0aGUgaW5pdGlhbCB2YWx1ZXMgKi8KIAkqZmxhZ3MgfD0gcnVsZS0+ZmxhZ3MgfCBJT1JFU09VUkNFX0RNQTsKLQkqZmxhZ3MgJj0gIH5JT1JFU09VUkNFX1VOU0VUOworCSpmbGFncyAmPSB+SU9SRVNPVVJDRV9VTlNFVDsKIAogCWlmICghcnVsZS0+bWFwKSB7CiAJCSpmbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwotCQlyZXR1cm4gMTsgLyogc2tpcCBkaXNhYmxlZCByZXNvdXJjZSByZXF1ZXN0cyAqLworCQlyZXR1cm4gMTsJLyogc2tpcCBkaXNhYmxlZCByZXNvdXJjZSByZXF1ZXN0cyAqLwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYocnVsZS0+bWFwICYgKDE8PHh0YWJbaV0pKSB7CisJCWlmIChydWxlLT5tYXAgJiAoMSA8PCB4dGFiW2ldKSkgewogCQkJKnN0YXJ0ID0gKmVuZCA9IHh0YWJbaV07Ci0JCQlpZihwbnBfY2hlY2tfZG1hKGRldiwgaWR4KSkKKwkJCWlmIChwbnBfY2hlY2tfZG1hKGRldiwgaWR4KSkKIAkJCQlyZXR1cm4gMTsKIAkJfQogCX0KQEAgLTIxOCw3MiArMjIxLDgwIEBACiAvKioKICAqIHBucF9pbml0X3Jlc291cmNlcyAtIFJlc2V0cyBhIHJlc291cmNlIHRhYmxlIHRvIGRlZmF1bHQgdmFsdWVzLgogICogQHRhYmxlOiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIHJlc291cmNlIHRhYmxlCi0gKgogICovCiB2b2lkIHBucF9pbml0X3Jlc291cmNlX3RhYmxlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnRhYmxlKQogewogCWludCBpZHg7CisKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IFBOUF9NQVhfSVJROyBpZHgrKykgewogCQl0YWJsZS0+aXJxX3Jlc291cmNlW2lkeF0ubmFtZSA9IE5VTEw7CiAJCXRhYmxlLT5pcnFfcmVzb3VyY2VbaWR4XS5zdGFydCA9IC0xOwogCQl0YWJsZS0+aXJxX3Jlc291cmNlW2lkeF0uZW5kID0gLTE7Ci0JCXRhYmxlLT5pcnFfcmVzb3VyY2VbaWR4XS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKKwkJdGFibGUtPmlycV9yZXNvdXJjZVtpZHhdLmZsYWdzID0KKwkJICAgIElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKIAl9CiAJZm9yIChpZHggPSAwOyBpZHggPCBQTlBfTUFYX0RNQTsgaWR4KyspIHsKIAkJdGFibGUtPmRtYV9yZXNvdXJjZVtpZHhdLm5hbWUgPSBOVUxMOwogCQl0YWJsZS0+ZG1hX3Jlc291cmNlW2lkeF0uc3RhcnQgPSAtMTsKIAkJdGFibGUtPmRtYV9yZXNvdXJjZVtpZHhdLmVuZCA9IC0xOwotCQl0YWJsZS0+ZG1hX3Jlc291cmNlW2lkeF0uZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSB8IElPUkVTT1VSQ0VfQVVUTyB8IElPUkVTT1VSQ0VfVU5TRVQ7CisJCXRhYmxlLT5kbWFfcmVzb3VyY2VbaWR4XS5mbGFncyA9CisJCSAgICBJT1JFU09VUkNFX0RNQSB8IElPUkVTT1VSQ0VfQVVUTyB8IElPUkVTT1VSQ0VfVU5TRVQ7CiAJfQogCWZvciAoaWR4ID0gMDsgaWR4IDwgUE5QX01BWF9QT1JUOyBpZHgrKykgewogCQl0YWJsZS0+cG9ydF9yZXNvdXJjZVtpZHhdLm5hbWUgPSBOVUxMOwogCQl0YWJsZS0+cG9ydF9yZXNvdXJjZVtpZHhdLnN0YXJ0ID0gMDsKIAkJdGFibGUtPnBvcnRfcmVzb3VyY2VbaWR4XS5lbmQgPSAwOwotCQl0YWJsZS0+cG9ydF9yZXNvdXJjZVtpZHhdLmZsYWdzID0gSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfQVVUTyB8IElPUkVTT1VSQ0VfVU5TRVQ7CisJCXRhYmxlLT5wb3J0X3Jlc291cmNlW2lkeF0uZmxhZ3MgPQorCQkgICAgSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfQVVUTyB8IElPUkVTT1VSQ0VfVU5TRVQ7CiAJfQogCWZvciAoaWR4ID0gMDsgaWR4IDwgUE5QX01BWF9NRU07IGlkeCsrKSB7CiAJCXRhYmxlLT5tZW1fcmVzb3VyY2VbaWR4XS5uYW1lID0gTlVMTDsKIAkJdGFibGUtPm1lbV9yZXNvdXJjZVtpZHhdLnN0YXJ0ID0gMDsKIAkJdGFibGUtPm1lbV9yZXNvdXJjZVtpZHhdLmVuZCA9IDA7Ci0JCXRhYmxlLT5tZW1fcmVzb3VyY2VbaWR4XS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKKwkJdGFibGUtPm1lbV9yZXNvdXJjZVtpZHhdLmZsYWdzID0KKwkJICAgIElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKIAl9CiB9CiAKIC8qKgogICogcG5wX2NsZWFuX3Jlc291cmNlcyAtIGNsZWFycyByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBtYW51YWxseSBzZXQKICAqIEByZXM6IHRoZSByZXNvdXJjZXMgdG8gY2xlYW4KLSAqCiAgKi8KLXN0YXRpYyB2b2lkIHBucF9jbGVhbl9yZXNvdXJjZV90YWJsZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzKQorc3RhdGljIHZvaWQgcG5wX2NsZWFuX3Jlc291cmNlX3RhYmxlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAlpbnQgaWR4OworCiAJZm9yIChpZHggPSAwOyBpZHggPCBQTlBfTUFYX0lSUTsgaWR4KyspIHsKIAkJaWYgKCEocmVzLT5pcnFfcmVzb3VyY2VbaWR4XS5mbGFncyAmIElPUkVTT1VSQ0VfQVVUTykpCiAJCQljb250aW51ZTsKIAkJcmVzLT5pcnFfcmVzb3VyY2VbaWR4XS5zdGFydCA9IC0xOwogCQlyZXMtPmlycV9yZXNvdXJjZVtpZHhdLmVuZCA9IC0xOwotCQlyZXMtPmlycV9yZXNvdXJjZVtpZHhdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0FVVE8gfCBJT1JFU09VUkNFX1VOU0VUOworCQlyZXMtPmlycV9yZXNvdXJjZVtpZHhdLmZsYWdzID0KKwkJICAgIElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKIAl9CiAJZm9yIChpZHggPSAwOyBpZHggPCBQTlBfTUFYX0RNQTsgaWR4KyspIHsKIAkJaWYgKCEocmVzLT5kbWFfcmVzb3VyY2VbaWR4XS5mbGFncyAmIElPUkVTT1VSQ0VfQVVUTykpCiAJCQljb250aW51ZTsKIAkJcmVzLT5kbWFfcmVzb3VyY2VbaWR4XS5zdGFydCA9IC0xOwogCQlyZXMtPmRtYV9yZXNvdXJjZVtpZHhdLmVuZCA9IC0xOwotCQlyZXMtPmRtYV9yZXNvdXJjZVtpZHhdLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEgfCBJT1JFU09VUkNFX0FVVE8gfCBJT1JFU09VUkNFX1VOU0VUOworCQlyZXMtPmRtYV9yZXNvdXJjZVtpZHhdLmZsYWdzID0KKwkJICAgIElPUkVTT1VSQ0VfRE1BIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKIAl9CiAJZm9yIChpZHggPSAwOyBpZHggPCBQTlBfTUFYX1BPUlQ7IGlkeCsrKSB7CiAJCWlmICghKHJlcy0+cG9ydF9yZXNvdXJjZVtpZHhdLmZsYWdzICYgSU9SRVNPVVJDRV9BVVRPKSkKIAkJCWNvbnRpbnVlOwogCQlyZXMtPnBvcnRfcmVzb3VyY2VbaWR4XS5zdGFydCA9IDA7CiAJCXJlcy0+cG9ydF9yZXNvdXJjZVtpZHhdLmVuZCA9IDA7Ci0JCXJlcy0+cG9ydF9yZXNvdXJjZVtpZHhdLmZsYWdzID0gSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfQVVUTyB8IElPUkVTT1VSQ0VfVU5TRVQ7CisJCXJlcy0+cG9ydF9yZXNvdXJjZVtpZHhdLmZsYWdzID0KKwkJICAgIElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX0FVVE8gfCBJT1JFU09VUkNFX1VOU0VUOwogCX0KIAlmb3IgKGlkeCA9IDA7IGlkeCA8IFBOUF9NQVhfTUVNOyBpZHgrKykgewogCQlpZiAoIShyZXMtPm1lbV9yZXNvdXJjZVtpZHhdLmZsYWdzICYgSU9SRVNPVVJDRV9BVVRPKSkKIAkJCWNvbnRpbnVlOwogCQlyZXMtPm1lbV9yZXNvdXJjZVtpZHhdLnN0YXJ0ID0gMDsKIAkJcmVzLT5tZW1fcmVzb3VyY2VbaWR4XS5lbmQgPSAwOwotCQlyZXMtPm1lbV9yZXNvdXJjZVtpZHhdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0FVVE8gfCBJT1JFU09VUkNFX1VOU0VUOworCQlyZXMtPm1lbV9yZXNvdXJjZVtpZHhdLmZsYWdzID0KKwkJICAgIElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9BVVRPIHwgSU9SRVNPVVJDRV9VTlNFVDsKIAl9CiB9CiAKQEAgLTMwNiw3ICszMTcsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWRvd24oJnBucF9yZXNfbXV0ZXgpOwotCXBucF9jbGVhbl9yZXNvdXJjZV90YWJsZSgmZGV2LT5yZXMpOyAvKiBzdGFydCB3aXRoIGEgZnJlc2ggc2xhdGUgKi8KKwlwbnBfY2xlYW5fcmVzb3VyY2VfdGFibGUoJmRldi0+cmVzKTsJLyogc3RhcnQgd2l0aCBhIGZyZXNoIHNsYXRlICovCiAJaWYgKGRldi0+aW5kZXBlbmRlbnQpIHsKIAkJcG9ydCA9IGRldi0+aW5kZXBlbmRlbnQtPnBvcnQ7CiAJCW1lbSA9IGRldi0+aW5kZXBlbmRlbnQtPm1lbTsKQEAgLTM0MSwxMCArMzUyLDExIEBACiAJaWYgKGRlcG51bSkgewogCQlzdHJ1Y3QgcG5wX29wdGlvbiAqZGVwOwogCQlpbnQgaTsKLQkJZm9yIChpPTEsZGVwPWRldi0+ZGVwZW5kZW50OyBpPGRlcG51bTsgaSsrLCBkZXA9ZGVwLT5uZXh0KQotCQkJaWYoIWRlcCkKKwkJZm9yIChpID0gMSwgZGVwID0gZGV2LT5kZXBlbmRlbnQ7IGkgPCBkZXBudW07CisJCSAgICAgaSsrLCBkZXAgPSBkZXAtPm5leHQpCisJCQlpZiAoIWRlcCkKIAkJCQlnb3RvIGZhaWw7Ci0JCXBvcnQgPWRlcC0+cG9ydDsKKwkJcG9ydCA9IGRlcC0+cG9ydDsKIAkJbWVtID0gZGVwLT5tZW07CiAJCWlycSA9IGRlcC0+aXJxOwogCQlkbWEgPSBkZXAtPmRtYTsKQEAgLTM3OCw3ICszOTAsNyBAQAogCXVwKCZwbnBfcmVzX211dGV4KTsKIAlyZXR1cm4gMTsKIAotZmFpbDoKKyAgICAgIGZhaWw6CiAJcG5wX2NsZWFuX3Jlc291cmNlX3RhYmxlKCZkZXYtPnJlcyk7CiAJdXAoJnBucF9yZXNfbXV0ZXgpOwogCXJldHVybiAwOwpAQCAtMzkyLDEwICs0MDQsMTIgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGRyaXZlcnMgdGhhdCB3YW50IHRvIG1hbnVhbGx5IHNldCB0aGllciByZXNvdXJjZXMuCiAgKi8KLWludCBwbnBfbWFudWFsX2NvbmZpZ19kZXYoc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgaW50IG1vZGUpCitpbnQgcG5wX21hbnVhbF9jb25maWdfZGV2KHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKKwkJCSAgaW50IG1vZGUpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIGJhazsKKwlzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpiYWs7CisKIAlpZiAoIWRldiB8fCAhcmVzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXBucF9jYW5fY29uZmlndXJlKGRldikpCkBAIC00MDksMTkgKzQyMywxOSBAQAogCWRldi0+cmVzID0gKnJlczsKIAlpZiAoIShtb2RlICYgUE5QX0NPTkZJR19GT1JDRSkpIHsKIAkJZm9yIChpID0gMDsgaSA8IFBOUF9NQVhfUE9SVDsgaSsrKSB7Ci0JCQlpZighcG5wX2NoZWNrX3BvcnQoZGV2LGkpKQorCQkJaWYgKCFwbnBfY2hlY2tfcG9ydChkZXYsIGkpKQogCQkJCWdvdG8gZmFpbDsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgUE5QX01BWF9NRU07IGkrKykgewotCQkJaWYoIXBucF9jaGVja19tZW0oZGV2LGkpKQorCQkJaWYgKCFwbnBfY2hlY2tfbWVtKGRldiwgaSkpCiAJCQkJZ290byBmYWlsOwogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX0lSUTsgaSsrKSB7Ci0JCQlpZighcG5wX2NoZWNrX2lycShkZXYsaSkpCisJCQlpZiAoIXBucF9jaGVja19pcnEoZGV2LCBpKSkKIAkJCQlnb3RvIGZhaWw7CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IFBOUF9NQVhfRE1BOyBpKyspIHsKLQkJCWlmKCFwbnBfY2hlY2tfZG1hKGRldixpKSkKKwkJCWlmICghcG5wX2NoZWNrX2RtYShkZXYsIGkpKQogCQkJCWdvdG8gZmFpbDsKIAkJfQogCX0KQEAgLTQzMCw3ICs0NDQsNyBAQAogCWtmcmVlKGJhayk7CiAJcmV0dXJuIDA7CiAKLWZhaWw6CisgICAgICBmYWlsOgogCWRldi0+cmVzID0gKmJhazsKIAl1cCgmcG5wX3Jlc19tdXRleCk7CiAJa2ZyZWUoYmFrKTsKQEAgLTQ0MCwxOCArNDU0LDE4IEBACiAvKioKICAqIHBucF9hdXRvX2NvbmZpZ19kZXYgLSBhdXRvbWF0aWNhbGx5IGFzc2lnbnMgcmVzb3VyY2VzIHRvIGEgZGV2aWNlCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGRldmljZQotICoKICAqLwogaW50IHBucF9hdXRvX2NvbmZpZ19kZXYoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcG5wX29wdGlvbiAqZGVwOwogCWludCBpID0gMTsKIAotCWlmKCFkZXYpCisJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoIXBucF9jYW5fY29uZmlndXJlKGRldikpIHsKLQkJcG5wX2RiZygiRGV2aWNlICVzIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4iLCBkZXYtPmRldi5idXNfaWQpOworCWlmICghcG5wX2Nhbl9jb25maWd1cmUoZGV2KSkgeworCQlwbnBfZGJnKCJEZXZpY2UgJXMgZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBjb25maWd1cmF0aW9uLiIsCisJCQlkZXYtPmRldi5idXNfaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTQ3NiwyMyArNDkwLDIyIEBACiAgKiBwbnBfc3RhcnRfZGV2IC0gbG93LWxldmVsIHN0YXJ0IG9mIHRoZSBQblAgZGV2aWNlCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXNpcmVkIGRldmljZQogICoKLSAqIGFzc3VtZXMgdGhhdCByZXNvdXJjZXMgaGF2ZSBhbHJlYWQgYmVlbiBhbGxvY2F0ZWQKKyAqIGFzc3VtZXMgdGhhdCByZXNvdXJjZXMgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkCiAgKi8KLQogaW50IHBucF9zdGFydF9kZXYoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlpZiAoIXBucF9jYW5fd3JpdGUoZGV2KSkgewotCQlwbnBfZGJnKCJEZXZpY2UgJXMgZG9lcyBub3Qgc3VwcG9ydCBhY3RpdmF0aW9uLiIsIGRldi0+ZGV2LmJ1c19pZCk7CisJCXBucF9kYmcoIkRldmljZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGFjdGl2YXRpb24uIiwKKwkJCWRldi0+ZGV2LmJ1c19pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChkZXYtPnByb3RvY29sLT5zZXQoZGV2LCAmZGV2LT5yZXMpPDApIHsKKwlpZiAoZGV2LT5wcm90b2NvbC0+c2V0KGRldiwgJmRldi0+cmVzKSA8IDApIHsKIAkJcG5wX2VycigiRmFpbGVkIHRvIGFjdGl2YXRlIGRldmljZSAlcy4iLCBkZXYtPmRldi5idXNfaWQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlwbnBfaW5mbygiRGV2aWNlICVzIGFjdGl2YXRlZC4iLCBkZXYtPmRldi5idXNfaWQpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUwMiwyMCArNTE1LDE5IEBACiAgKgogICogZG9lcyBub3QgZnJlZSByZXNvdXJjZXMKICAqLwotCiBpbnQgcG5wX3N0b3BfZGV2KHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7CiAJaWYgKCFwbnBfY2FuX2Rpc2FibGUoZGV2KSkgewotCQlwbnBfZGJnKCJEZXZpY2UgJXMgZG9lcyBub3Qgc3VwcG9ydCBkaXNhYmxpbmcuIiwgZGV2LT5kZXYuYnVzX2lkKTsKKwkJcG5wX2RiZygiRGV2aWNlICVzIGRvZXMgbm90IHN1cHBvcnQgZGlzYWJsaW5nLiIsCisJCQlkZXYtPmRldi5idXNfaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKGRldi0+cHJvdG9jb2wtPmRpc2FibGUoZGV2KTwwKSB7CisJaWYgKGRldi0+cHJvdG9jb2wtPmRpc2FibGUoZGV2KSA8IDApIHsKIAkJcG5wX2VycigiRmFpbGVkIHRvIGRpc2FibGUgZGV2aWNlICVzLiIsIGRldi0+ZGV2LmJ1c19pZCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCXBucF9pbmZvKCJEZXZpY2UgJXMgZGlzYWJsZWQuIiwgZGV2LT5kZXYuYnVzX2lkKTsKLQogCXJldHVybiAwOwogfQogCkBAIC01MzEsOSArNTQzLDggQEAKIAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGV2LT5hY3RpdmUpIHsKLQkJcmV0dXJuIDA7IC8qIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBhY3RpdmUgKi8KLQl9CisJaWYgKGRldi0+YWN0aXZlKQorCQlyZXR1cm4gMDsJLyogdGhlIGRldmljZSBpcyBhbHJlYWR5IGFjdGl2ZSAqLwogCiAJLyogZW5zdXJlIHJlc291cmNlcyBhcmUgYWxsb2NhdGVkICovCiAJaWYgKHBucF9hdXRvX2NvbmZpZ19kZXYoZGV2KSkKQEAgLTU0NCw3ICs1NTUsNiBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAlkZXYtPmFjdGl2ZSA9IDE7Ci0KIAlyZXR1cm4gMTsKIH0KIApAQCAtNTU4LDExICs1NjgsMTAgQEAKIHsKIAlpbnQgZXJyb3I7CiAKLSAgICAgICAgaWYgKCFkZXYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFkZXYtPmFjdGl2ZSkgewotCQlyZXR1cm4gMDsgLyogdGhlIGRldmljZSBpcyBhbHJlYWR5IGRpc2FibGVkICovCi0JfQorCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWRldi0+YWN0aXZlKQorCQlyZXR1cm4gMDsJLyogdGhlIGRldmljZSBpcyBhbHJlYWR5IGRpc2FibGVkICovCiAKIAllcnJvciA9IHBucF9zdG9wX2RldihkZXYpOwogCWlmIChlcnJvcikKQEAgLTU4MywxMCArNTkyLDkgQEAKICAqIEByZXNvdXJjZTogcG9pbnRlciB0byByZXNvdXJjZSB0byBiZSBjaGFuZ2VkCiAgKiBAc3RhcnQ6IHN0YXJ0IG9mIHJlZ2lvbgogICogQHNpemU6IHNpemUgb2YgcmVnaW9uCi0gKgogICovCiB2b2lkIHBucF9yZXNvdXJjZV9jaGFuZ2Uoc3RydWN0IHJlc291cmNlICpyZXNvdXJjZSwgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAotCQkJCXJlc291cmNlX3NpemVfdCBzaXplKQorCQkJIHJlc291cmNlX3NpemVfdCBzaXplKQogewogCWlmIChyZXNvdXJjZSA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC01OTUsMTEgKzYwMyw3IEBACiAJcmVzb3VyY2UtPmVuZCA9IHN0YXJ0ICsgc2l6ZSAtIDE7CiB9CiAKLQogRVhQT1JUX1NZTUJPTChwbnBfbWFudWFsX2NvbmZpZ19kZXYpOwotI2lmIDAKLUVYUE9SVF9TWU1CT0wocG5wX2F1dG9fY29uZmlnX2Rldik7Ci0jZW5kaWYKIEVYUE9SVF9TWU1CT0wocG5wX3N0YXJ0X2Rldik7CiBFWFBPUlRfU1lNQk9MKHBucF9zdG9wX2Rldik7CiBFWFBPUlRfU1lNQk9MKHBucF9hY3RpdmF0ZV9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwppbmRleCBhMDA1NDg3Li42MTZmYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwpAQCAtMjEsNyArMjEsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CisKICNpbmNsdWRlICJwbnBhY3BpLmgiCiAKIHN0YXRpYyBpbnQgbnVtID0gMDsKQEAgLTMxLDE3ICszNCwxOSBAQAogICogdXNlZCBieSB0aGUga2VybmVsIChQQ0kgcm9vdCwgLi4uKSwgYXMgaXQgaXMgaGFybWxlc3MgYW5kIHRoZXJlIHdlcmUKICAqIGFscmVhZHkgcHJlc2VudCBpbiBwbnBiaW9zLiBCdXQgdGhlcmUgaXMgYW4gZXhjZXB0aW9uIGZvciBkZXZpY2VzIHRoYXQKICAqIGhhdmUgaXJxcyAoUElDLCBUaW1lcikgYmVjYXVzZSB3ZSBjYWxsIGFjcGlfcmVnaXN0ZXJfZ3NpLgotICogRmluYWx5IG9ubHkgZGV2aWNlcyB0aGF0IGhhdmUgYSBDUlMgbWV0aG9kIG5lZWQgdG8gYmUgaW4gdGhpcyBsaXN0LgorICogRmluYWxseSwgb25seSBkZXZpY2VzIHRoYXQgaGF2ZSBhIENSUyBtZXRob2QgbmVlZCB0byBiZSBpbiB0aGlzIGxpc3QuCiAgKi8KLXN0YXRpYyBjaGFyIF9faW5pdGRhdGEgZXhjbHVkZWRfaWRfbGlzdFtdID0KLQkiUE5QMEMwOSwiIC8qIEVDICovCi0JIlBOUDBDMEYsIiAvKiBMaW5rIGRldmljZSAqLwotCSJQTlAwMDAwLCIgLyogUElDICovCi0JIlBOUDAxMDAsIiAvKiBUaW1lciAqLwotCTsKK3N0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBhY3BpX2RldmljZV9pZCBleGNsdWRlZF9pZF9saXN0W10gPSB7CisJeyJQTlAwQzA5IiwgMH0sCQkvKiBFQyAqLworCXsiUE5QMEMwRiIsIDB9LAkJLyogTGluayBkZXZpY2UgKi8KKwl7IlBOUDAwMDAiLCAwfSwJCS8qIFBJQyAqLworCXsiUE5QMDEwMCIsIDB9LAkJLyogVGltZXIgKi8KKwl7IiIsIDB9LAorfTsKKwogc3RhdGljIGlubGluZSBpbnQgaXNfZXhjbHVzaXZlX2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKCFhY3BpX21hdGNoX2lkcyhkZXYsIGV4Y2x1ZGVkX2lkX2xpc3QpKTsKKwlyZXR1cm4gKCFhY3BpX21hdGNoX2RldmljZV9pZHMoZGV2LCBleGNsdWRlZF9pZF9saXN0KSk7CiB9CiAKIC8qCkBAIC03OSwxNSArODQsMTggQEAKIAlzdHJbN10gPSAnXDAnOwogfQogCi1zdGF0aWMgaW50IHBucGFjcGlfZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqIGRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcykKK3N0YXRpYyBpbnQgcG5wYWNwaV9nZXRfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsCisJCQkJIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RhdHVzID0gcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2UoKGFjcGlfaGFuZGxlKWRldi0+ZGF0YSwKLQkJJmRldi0+cmVzKTsKKworCXN0YXR1cyA9IHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX3Jlc291cmNlKChhY3BpX2hhbmRsZSkgZGV2LT5kYXRhLAorCQkJCQkJICAmZGV2LT5yZXMpOwogCXJldHVybiBBQ1BJX0ZBSUxVUkUoc3RhdHVzKSA/IC1FTk9ERVYgOiAwOwogfQogCi1zdGF0aWMgaW50IHBucGFjcGlfc2V0X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqIGRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcykKK3N0YXRpYyBpbnQgcG5wYWNwaV9zZXRfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsCisJCQkJIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBkZXYtPmRhdGE7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKQEAgLTExNCwxNiArMTIyLDM2IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJLyogYWNwaV91bnJlZ2lzdGVyX2dzaShwbnBfaXJxKGRldiwgMCkpOyAqLwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KChhY3BpX2hhbmRsZSlkZXYtPmRhdGEsCi0JCSJfRElTIiwgTlVMTCwgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoKGFjcGlfaGFuZGxlKSBkZXYtPmRhdGEsCisJCQkJICAgICAgIl9ESVMiLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gQUNQSV9GQUlMVVJFKHN0YXR1cykgPyAtRU5PREVWIDogMDsKIH0KIAorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCitzdGF0aWMgaW50IHBucGFjcGlfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIGFjcGlfYnVzX3NldF9wb3dlcigoYWNwaV9oYW5kbGUpIGRldi0+ZGF0YSwKKwkJCQkgIGFjcGlfcG1fZGV2aWNlX3NsZWVwX3N0YXRlKCZkZXYtPmRldiwKKwkJCQkJCQkgICAgIGRldmljZV9tYXlfd2FrZXVwCisJCQkJCQkJICAgICAoJmRldi0+ZGV2KSwKKwkJCQkJCQkgICAgIE5VTEwpKTsKK30KKworc3RhdGljIGludCBwbnBhY3BpX3Jlc3VtZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCXJldHVybiBhY3BpX2J1c19zZXRfcG93ZXIoKGFjcGlfaGFuZGxlKSBkZXYtPmRhdGEsIEFDUElfU1RBVEVfRDApOworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcG5wX3Byb3RvY29sIHBucGFjcGlfcHJvdG9jb2wgPSB7Ci0JLm5hbWUJPSAiUGx1ZyBhbmQgUGxheSBBQ1BJIiwKLQkuZ2V0CT0gcG5wYWNwaV9nZXRfcmVzb3VyY2VzLAotCS5zZXQJPSBwbnBhY3BpX3NldF9yZXNvdXJjZXMsCisJLm5hbWUJID0gIlBsdWcgYW5kIFBsYXkgQUNQSSIsCisJLmdldAkgPSBwbnBhY3BpX2dldF9yZXNvdXJjZXMsCisJLnNldAkgPSBwbnBhY3BpX3NldF9yZXNvdXJjZXMsCiAJLmRpc2FibGUgPSBwbnBhY3BpX2Rpc2FibGVfcmVzb3VyY2VzLAorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJLnN1c3BlbmQgPSBwbnBhY3BpX3N1c3BlbmQsCisJLnJlc3VtZSA9IHBucGFjcGlfcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwbnBhY3BpX2FkZF9kZXZpY2Uoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCkBAIC0xMzUsMTcgKzE2MywxNyBAQAogCiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0NSUyIsICZ0ZW1wKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWlzcG5waWRhY3BpKGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKSB8fAotCQlpc19leGNsdXNpdmVfZGV2aWNlKGRldmljZSkpCisJICAgIGlzX2V4Y2x1c2l2ZV9kZXZpY2UoZGV2aWNlKSkKIAkJcmV0dXJuIDA7CiAKIAlwbnBfZGJnKCJBQ1BJIGRldmljZSA6IGhpZCAlcyIsIGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKTsKLQlkZXYgPSAga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7CiAJCXBucF9lcnIoIk91dCBvZiBtZW1vcnkiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWRldi0+ZGF0YSA9IGRldmljZS0+aGFuZGxlOwotCS8qIC5lbmFibGVkIG1lYW5zIGlmIHRoZSBkZXZpY2UgY2FuIGRlY29kZSB0aGUgcmVzb3VyY2VzICovCisJLyogLmVuYWJsZWQgbWVhbnMgdGhlIGRldmljZSBjYW4gZGVjb2RlIHRoZSByZXNvdXJjZXMgKi8KIAlkZXYtPmFjdGl2ZSA9IGRldmljZS0+c3RhdHVzLmVuYWJsZWQ7CiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1NSUyIsICZ0ZW1wKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCkBAIC0xNzUsMjAgKzIwMywyMyBAQAogCXBucGlkYWNwaV90b19wbnBpZChhY3BpX2RldmljZV9oaWQoZGV2aWNlKSwgZGV2X2lkLT5pZCk7CiAJcG5wX2FkZF9pZChkZXZfaWQsIGRldik7CiAKLQlpZihkZXYtPmFjdGl2ZSkgeworCWlmIChkZXYtPmFjdGl2ZSkgewogCQkvKiBwYXJzZSBhbGxvY2F0ZWQgcmVzb3VyY2UgKi8KLQkJc3RhdHVzID0gcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2UoZGV2aWNlLT5oYW5kbGUsICZkZXYtPnJlcyk7CisJCXN0YXR1cyA9IHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX3Jlc291cmNlKGRldmljZS0+aGFuZGxlLAorCQkJCQkJCSAgJmRldi0+cmVzKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSkgewotCQkJcG5wX2VycigiUG5QQUNQSTogTUVUSE9EX05BTUVfX0NSUyBmYWlsdXJlIGZvciAlcyIsIGRldl9pZC0+aWQpOworCQkJcG5wX2VycigiUG5QQUNQSTogTUVUSE9EX05BTUVfX0NSUyBmYWlsdXJlIGZvciAlcyIsCisJCQkJZGV2X2lkLT5pZCk7CiAJCQlnb3RvIGVycjE7CiAJCX0KIAl9CiAKLQlpZihkZXYtPmNhcGFiaWxpdGllcyAmIFBOUF9DT05GSUdVUkFCTEUpIHsKKwlpZiAoZGV2LT5jYXBhYmlsaXRpZXMgJiBQTlBfQ09ORklHVVJBQkxFKSB7CiAJCXN0YXR1cyA9IHBucGFjcGlfcGFyc2VfcmVzb3VyY2Vfb3B0aW9uX2RhdGEoZGV2aWNlLT5oYW5kbGUsCi0JCQlkZXYpOworCQkJCQkJCSAgICBkZXYpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpKSB7Ci0JCQlwbnBfZXJyKCJQblBBQ1BJOiBNRVRIT0RfTkFNRV9fUFJTIGZhaWx1cmUgZm9yICVzIiwgZGV2X2lkLT5pZCk7CisJCQlwbnBfZXJyKCJQblBBQ1BJOiBNRVRIT0RfTkFNRV9fUFJTIGZhaWx1cmUgZm9yICVzIiwKKwkJCQlkZXZfaWQtPmlkKTsKIAkJCWdvdG8gZXJyMTsKIAkJfQogCX0KQEAgLTIxNCwxOCArMjQ1LDE5IEBACiAJaWYgKCFkZXYtPmFjdGl2ZSkKIAkJcG5wX2luaXRfcmVzb3VyY2VfdGFibGUoJmRldi0+cmVzKTsKIAlwbnBfYWRkX2RldmljZShkZXYpOwotCW51bSArKzsKKwludW0rKzsKIAogCXJldHVybiBBRV9PSzsKLWVycjE6CisgICAgICBlcnIxOgogCWtmcmVlKGRldl9pZCk7Ci1lcnI6CisgICAgICBlcnI6CiAJa2ZyZWUoZGV2KTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBwbnBhY3BpX2FkZF9kZXZpY2VfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsCi0JdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQorCQkJCQkJICAgICB1MzIgbHZsLCB2b2lkICpjb250ZXh0LAorCQkJCQkJICAgICB2b2lkICoqcnYpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CiAKQEAgLTIzOCwyMyArMjcwLDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcG5wX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqX3BucCkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmFjcGkgPSB0b19hY3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBwbnBfZGV2CQkqcG5wID0gX3BucDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGkgPSB0b19hY3BpX2RldmljZShkZXYpOworCXN0cnVjdCBwbnBfZGV2ICpwbnAgPSBfcG5wOwogCiAJLyogdHJ1ZSBtZWFucyBpdCBtYXRjaGVkICovCiAJcmV0dXJuIGFjcGktPmZsYWdzLmhhcmR3YXJlX2lkCi0JCSYmICFhY3BpX2dldF9waHlzaWNhbF9kZXZpY2UoYWNwaS0+aGFuZGxlKQotCQkmJiBjb21wYXJlX3BucF9pZChwbnAtPmlkLCBhY3BpLT5wbnAuaGFyZHdhcmVfaWQpOworCSAgICAmJiAhYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGFjcGktPmhhbmRsZSkKKwkgICAgJiYgY29tcGFyZV9wbnBfaWQocG5wLT5pZCwgYWNwaS0+cG5wLmhhcmR3YXJlX2lkKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWNwaV9wbnBfZmluZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBhY3BpX2hhbmRsZSAqaGFuZGxlKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wbnBfZmluZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBhY3BpX2hhbmRsZSAqIGhhbmRsZSkKIHsKLQlzdHJ1Y3QgZGV2aWNlCQkqYWRldjsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmFjcGk7CisJc3RydWN0IGRldmljZSAqYWRldjsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGk7CiAKIAlhZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZhY3BpX2J1c190eXBlLCBOVUxMLAotCQkJdG9fcG5wX2RldihkZXYpLAotCQkJYWNwaV9wbnBfbWF0Y2gpOworCQkJICAgICAgIHRvX3BucF9kZXYoZGV2KSwgYWNwaV9wbnBfbWF0Y2gpOwogCWlmICghYWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTI2OCw3ICsyOTksNyBAQAogICogcG5wZGV2LT5kZXYuYXJjaGRhdGEuYWNwaV9oYW5kbGUgcG9pbnQgdG8gaXRzIEFDUEkgc2libGluZy4KICAqLwogc3RhdGljIHN0cnVjdCBhY3BpX2J1c190eXBlIF9faW5pdGRhdGEgYWNwaV9wbnBfYnVzID0gewotCS5idXMgPSAmcG5wX2J1c190eXBlLAorCS5idXMJICAgICA9ICZwbnBfYnVzX3R5cGUsCiAJLmZpbmRfZGV2aWNlID0gYWNwaV9wbnBfZmluZF9kZXZpY2UsCiB9OwogCkBAIC0yODgsNiArMzE5LDcgQEAKIAlwbnBfcGxhdGZvcm1fZGV2aWNlcyA9IDE7CiAJcmV0dXJuIDA7CiB9CisKIHN1YnN5c19pbml0Y2FsbChwbnBhY3BpX2luaXQpOwogCiBzdGF0aWMgaW50IF9faW5pdCBwbnBhY3BpX3NldHVwKGNoYXIgKnN0cikKQEAgLTI5OCw4ICszMzAsNSBAQAogCQlwbnBhY3BpX2Rpc2FibGVkID0gMTsKIAlyZXR1cm4gMTsKIH0KLV9fc2V0dXAoInBucGFjcGk9IiwgcG5wYWNwaV9zZXR1cCk7CiAKLSNpZiAwCi1FWFBPUlRfU1lNQk9MKHBucGFjcGlfcHJvdG9jb2wpOwotI2VuZGlmCitfX3NldHVwKCJwbnBhY3BpPSIsIHBucGFjcGlfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCmluZGV4IDExOGFjOTcuLmNlNTAyN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKQEAgLTQwLDggKzQwLDcgQEAKIAkJCWZsYWcgPSBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTDsKIAkJZWxzZQogCQkJZmxhZyA9IElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWYgKHBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0xPVykKIAkJCWZsYWcgPSBJT1JFU09VUkNFX0lSUV9MT1dFREdFOwogCQllbHNlCkBAIC03Miw5ICs3MSw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLCB1MzIgZ3NpLAotCWludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHksIGludCBzaGFyZWFibGUpCitzdGF0aWMgdm9pZCBwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pcnFyZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMsCisJCQkJCQl1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywKKwkJCQkJCWludCBwb2xhcml0eSwgaW50IHNoYXJlYWJsZSkKIHsKIAlpbnQgaSA9IDA7CiAJaW50IGlycTsKQEAgLTgzLDEyICs4MiwxMiBAQAogCQlyZXR1cm47CiAKIAl3aGlsZSAoIShyZXMtPmlycV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCi0JCQlpIDwgUE5QX01BWF9JUlEpCisJICAgICAgIGkgPCBQTlBfTUFYX0lSUSkKIAkJaSsrOwogCWlmIChpID49IFBOUF9NQVhfSVJRKQogCQlyZXR1cm47CiAKLQlyZXMtPmlycV9yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROyAgLy8gQWxzbyBjbGVhcnMgX1VOU0VUIGZsYWcKKwlyZXMtPmlycV9yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROwkvLyBBbHNvIGNsZWFycyBfVU5TRVQgZmxhZwogCXJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzIHw9IGlycV9mbGFncyh0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CiAJaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koZ3NpLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CiAJaWYgKGlycSA8IDApIHsKQEAgLTE0NywxNyArMTQ2LDE5IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfZG1hcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLCB1MzIgZG1hLAotCWludCB0eXBlLCBpbnQgYnVzX21hc3RlciwgaW50IHRyYW5zZmVyKQorc3RhdGljIHZvaWQgcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfZG1hcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLAorCQkJCQkJdTMyIGRtYSwgaW50IHR5cGUsCisJCQkJCQlpbnQgYnVzX21hc3RlciwgaW50IHRyYW5zZmVyKQogewogCWludCBpID0gMDsKKwogCXdoaWxlIChpIDwgUE5QX01BWF9ETUEgJiYKLQkJCSEocmVzLT5kbWFfcmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSkKKwkgICAgICAgIShyZXMtPmRtYV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpKQogCQlpKys7CiAJaWYgKGkgPCBQTlBfTUFYX0RNQSkgewotCQlyZXMtPmRtYV9yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BOyAgLy8gQWxzbyBjbGVhcnMgX1VOU0VUIGZsYWcKLQkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uZmxhZ3MgfD0gZG1hX2ZsYWdzKHR5cGUsIGJ1c19tYXN0ZXIsIHRyYW5zZmVyKTsKKwkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0RNQTsJLy8gQWxzbyBjbGVhcnMgX1VOU0VUIGZsYWcKKwkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uZmxhZ3MgfD0KKwkJICAgIGRtYV9mbGFncyh0eXBlLCBidXNfbWFzdGVyLCB0cmFuc2Zlcik7CiAJCWlmIChkbWEgPT0gLTEpIHsKIAkJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CkBAIC0xNjcsMTkgKzE2OCwxOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lvcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLAotCXU2NCBpbywgdTY0IGxlbiwgaW50IGlvX2RlY29kZSkKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lvcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLAorCQkJCQkgICAgICAgdTY0IGlvLCB1NjQgbGVuLCBpbnQgaW9fZGVjb2RlKQogewogCWludCBpID0gMDsKKwogCXdoaWxlICghKHJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCi0JCQlpIDwgUE5QX01BWF9QT1JUKQorCSAgICAgICBpIDwgUE5QX01BWF9QT1JUKQogCQlpKys7CiAJaWYgKGkgPCBQTlBfTUFYX1BPUlQpIHsKLQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsgIC8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCisJCXJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CS8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCiAJCWlmIChpb19kZWNvZGUgPT0gQUNQSV9ERUNPREVfMTYpCiAJCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZmxhZ3MgfD0gUE5QX1BPUlRfRkxBR18xNkJJVEFERFI7Ci0JCWlmIChsZW4gPD0gMCB8fCAoaW8gKyBsZW4gLTEpID49IDB4MTAwMDMpIHsKKwkJaWYgKGxlbiA8PSAwIHx8IChpbyArIGxlbiAtIDEpID49IDB4MTAwMDMpIHsKIAkJCXJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xODgsMjEgKzE4OSwyMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKLQl1NjQgbWVtLCB1NjQgbGVuLCBpbnQgd3JpdGVfcHJvdGVjdCkKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKKwkJCQkJCXU2NCBtZW0sIHU2NCBsZW4sCisJCQkJCQlpbnQgd3JpdGVfcHJvdGVjdCkKIHsKIAlpbnQgaSA9IDA7CisKIAl3aGlsZSAoIShyZXMtPm1lbV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmCi0JCQkoaSA8IFBOUF9NQVhfTUVNKSkKKwkgICAgICAgKGkgPCBQTlBfTUFYX01FTSkpCiAJCWkrKzsKIAlpZiAoaSA8IFBOUF9NQVhfTUVNKSB7Ci0JCXJlcy0+bWVtX3Jlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07ICAvLyBBbHNvIGNsZWFycyBfVU5TRVQgZmxhZworCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwkvLyBBbHNvIGNsZWFycyBfVU5TRVQgZmxhZwogCQlpZiAobGVuIDw9IDApIHsKIAkJCXJlcy0+bWVtX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYod3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQorCQlpZiAod3JpdGVfcHJvdGVjdCA9PSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKQogCQkJcmVzLT5tZW1fcmVzb3VyY2VbaV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFOwogCiAJCXJlcy0+bWVtX3Jlc291cmNlW2ldLnN0YXJ0ID0gbWVtOwpAQCAtMjEwLDkgKzIxMiw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfYWRkcmVzc19zcGFjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXNfdGFibGUsCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcykKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2FkZHJlc3Nfc3BhY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzX3RhYmxlLAorCQkJCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzKQogewogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyLCAqcCA9ICZhZGRyOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTIyMCw3ICsyMjEsNyBAQAogCXN0YXR1cyA9IGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlcywgcCk7CiAJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlwbnBfd2FybigiUG5QQUNQSTogZmFpbGVkIHRvIGNvbnZlcnQgcmVzb3VyY2UgdHlwZSAlZCIsCi0JCQlyZXMtPnR5cGUpOworCQkJIHJlcy0+dHlwZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyOSwxNyArMjMwLDIwIEBACiAKIAlpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkKIAkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzX3RhYmxlLAotCQkJCXAtPm1pbmltdW0sIHAtPmFkZHJlc3NfbGVuZ3RoLCBwLT5pbmZvLm1lbS53cml0ZV9wcm90ZWN0KTsKKwkJCXAtPm1pbmltdW0sIHAtPmFkZHJlc3NfbGVuZ3RoLAorCQkJcC0+aW5mby5tZW0ud3JpdGVfcHJvdGVjdCk7CiAJZWxzZSBpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKQogCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pb3Jlc291cmNlKHJlc190YWJsZSwKLQkJCQlwLT5taW5pbXVtLCBwLT5hZGRyZXNzX2xlbmd0aCwKLQkJCQlwLT5ncmFudWxhcml0eSA9PSAweGZmZiA/IEFDUElfREVDT0RFXzEwIDogQUNQSV9ERUNPREVfMTYpOworCQkJcC0+bWluaW11bSwgcC0+YWRkcmVzc19sZW5ndGgsCisJCQlwLT5ncmFudWxhcml0eSA9PSAweGZmZiA/IEFDUElfREVDT0RFXzEwIDoKKwkJCQlBQ1BJX0RFQ09ERV8xNik7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX2FsbG9jYXRlZF9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLAotCXZvaWQgKmRhdGEpCisJCQkJCSAgICAgIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzX3RhYmxlID0gKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKilkYXRhOworCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlc190YWJsZSA9CisJICAgIChzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICopZGF0YTsKIAlpbnQgaTsKIAogCXN3aXRjaCAocmVzLT50eXBlKSB7CkBAIC0yNjAsMTcgKzI2NCwxNyBAQAogCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKIAkJaWYgKHJlcy0+ZGF0YS5kbWEuY2hhbm5lbF9jb3VudCA+IDApCiAJCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShyZXNfdGFibGUsCi0JCQkJCXJlcy0+ZGF0YS5kbWEuY2hhbm5lbHNbMF0sCi0JCQkJCXJlcy0+ZGF0YS5kbWEudHlwZSwKLQkJCQkJcmVzLT5kYXRhLmRtYS5idXNfbWFzdGVyLAotCQkJCQlyZXMtPmRhdGEuZG1hLnRyYW5zZmVyKTsKKwkJCQlyZXMtPmRhdGEuZG1hLmNoYW5uZWxzWzBdLAorCQkJCXJlcy0+ZGF0YS5kbWEudHlwZSwKKwkJCQlyZXMtPmRhdGEuZG1hLmJ1c19tYXN0ZXIsCisJCQkJcmVzLT5kYXRhLmRtYS50cmFuc2Zlcik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU86CiAJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lvcmVzb3VyY2UocmVzX3RhYmxlLAotCQkJCXJlcy0+ZGF0YS5pby5taW5pbXVtLAotCQkJCXJlcy0+ZGF0YS5pby5hZGRyZXNzX2xlbmd0aCwKLQkJCQlyZXMtPmRhdGEuaW8uaW9fZGVjb2RlKTsKKwkJCXJlcy0+ZGF0YS5pby5taW5pbXVtLAorCQkJcmVzLT5kYXRhLmlvLmFkZHJlc3NfbGVuZ3RoLAorCQkJcmVzLT5kYXRhLmlvLmlvX2RlY29kZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgpAQCAtMjc5LDkgKzI4Myw5IEBACiAKIAljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTzoKIAkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaW9yZXNvdXJjZShyZXNfdGFibGUsCi0JCQkJcmVzLT5kYXRhLmZpeGVkX2lvLmFkZHJlc3MsCi0JCQkJcmVzLT5kYXRhLmZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoLAotCQkJCUFDUElfREVDT0RFXzEwKTsKKwkJCXJlcy0+ZGF0YS5maXhlZF9pby5hZGRyZXNzLAorCQkJcmVzLT5kYXRhLmZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoLAorCQkJQUNQSV9ERUNPREVfMTApOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUjoKQEAgLTI5MiwyMSArMjk2LDIxIEBACiAKIAljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDoKIAkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzX3RhYmxlLAotCQkJCXJlcy0+ZGF0YS5tZW1vcnkyNC5taW5pbXVtLAotCQkJCXJlcy0+ZGF0YS5tZW1vcnkyNC5hZGRyZXNzX2xlbmd0aCwKLQkJCQlyZXMtPmRhdGEubWVtb3J5MjQud3JpdGVfcHJvdGVjdCk7CisJCQlyZXMtPmRhdGEubWVtb3J5MjQubWluaW11bSwKKwkJCXJlcy0+ZGF0YS5tZW1vcnkyNC5hZGRyZXNzX2xlbmd0aCwKKwkJCXJlcy0+ZGF0YS5tZW1vcnkyNC53cml0ZV9wcm90ZWN0KTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzI6CiAJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHJlc190YWJsZSwKLQkJCQlyZXMtPmRhdGEubWVtb3J5MzIubWluaW11bSwKLQkJCQlyZXMtPmRhdGEubWVtb3J5MzIuYWRkcmVzc19sZW5ndGgsCi0JCQkJcmVzLT5kYXRhLm1lbW9yeTMyLndyaXRlX3Byb3RlY3QpOworCQkJcmVzLT5kYXRhLm1lbW9yeTMyLm1pbmltdW0sCisJCQlyZXMtPmRhdGEubWVtb3J5MzIuYWRkcmVzc19sZW5ndGgsCisJCQlyZXMtPmRhdGEubWVtb3J5MzIud3JpdGVfcHJvdGVjdCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyOgogCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsCi0JCQkJcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3MsCi0JCQkJcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3NfbGVuZ3RoLAotCQkJCXJlcy0+ZGF0YS5maXhlZF9tZW1vcnkzMi53cml0ZV9wcm90ZWN0KTsKKwkJCXJlcy0+ZGF0YS5maXhlZF9tZW1vcnkzMi5hZGRyZXNzLAorCQkJcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3NfbGVuZ3RoLAorCQkJcmVzLT5kYXRhLmZpeGVkX21lbW9yeTMyLndyaXRlX3Byb3RlY3QpOwogCQlicmVhazsKIAljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTY6CiAJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgpAQCAtMzQzLDE4ICszNDcsMjEgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLWFjcGlfc3RhdHVzIHBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX3Jlc291cmNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzKQorYWNwaV9zdGF0dXMgcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2UoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCQkgICAgIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMpCiB7CiAJLyogQmxhbmsgdGhlIHJlc291cmNlIHRhYmxlIHZhbHVlcyAqLwogCXBucF9pbml0X3Jlc291cmNlX3RhYmxlKHJlcyk7CiAKLQlyZXR1cm4gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIHBucGFjcGlfYWxsb2NhdGVkX3Jlc291cmNlLCByZXMpOworCXJldHVybiBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQkgICBwbnBhY3BpX2FsbG9jYXRlZF9yZXNvdXJjZSwgcmVzKTsKIH0KIAotc3RhdGljIHZvaWQgcG5wYWNwaV9wYXJzZV9kbWFfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sIHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSAqcCkKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfZG1hX29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAorCQkJCSAgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hICpwKQogewogCWludCBpOwotCXN0cnVjdCBwbnBfZG1hICogZG1hOworCXN0cnVjdCBwbnBfZG1hICpkbWE7CiAKIAlpZiAocC0+Y2hhbm5lbF9jb3VudCA9PSAwKQogCQlyZXR1cm47CkBAIC0zNjIsMTggKzM2OSwxNiBAQAogCWlmICghZG1hKQogCQlyZXR1cm47CiAKLQlmb3IoaSA9IDA7IGkgPCBwLT5jaGFubmVsX2NvdW50OyBpKyspCisJZm9yIChpID0gMDsgaSA8IHAtPmNoYW5uZWxfY291bnQ7IGkrKykKIAkJZG1hLT5tYXAgfD0gMSA8PCBwLT5jaGFubmVsc1tpXTsKIAogCWRtYS0+ZmxhZ3MgPSBkbWFfZmxhZ3MocC0+dHlwZSwgcC0+YnVzX21hc3RlciwgcC0+dHJhbnNmZXIpOwogCiAJcG5wX3JlZ2lzdGVyX2RtYV9yZXNvdXJjZShvcHRpb24sIGRtYSk7Ci0JcmV0dXJuOwogfQogCi0KIHN0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfaXJxX29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCkKKwkJCQkgICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcG5wX2lycSAqaXJxOwpAQCAtMzg0LDE3ICszODksMTYgQEAKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCi0JZm9yKGkgPSAwOyBpIDwgcC0+aW50ZXJydXB0X2NvdW50OyBpKyspCisJZm9yIChpID0gMDsgaSA8IHAtPmludGVycnVwdF9jb3VudDsgaSsrKQogCQlpZiAocC0+aW50ZXJydXB0c1tpXSkKIAkJCV9fc2V0X2JpdChwLT5pbnRlcnJ1cHRzW2ldLCBpcnEtPm1hcCk7CiAJaXJxLT5mbGFncyA9IGlycV9mbGFncyhwLT50cmlnZ2VyaW5nLCBwLT5wb2xhcml0eSk7CiAKIAlwbnBfcmVnaXN0ZXJfaXJxX3Jlc291cmNlKG9wdGlvbiwgaXJxKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfZXh0X2lycV9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEgKnApCisJCQkJCSBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEgKnApCiB7CiAJaW50IGk7CiAJc3RydWN0IHBucF9pcnEgKmlycTsKQEAgLTQwNSwxOCArNDA5LDE2IEBACiAJaWYgKCFpcnEpCiAJCXJldHVybjsKIAotCWZvcihpID0gMDsgaSA8IHAtPmludGVycnVwdF9jb3VudDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwLT5pbnRlcnJ1cHRfY291bnQ7IGkrKykKIAkJaWYgKHAtPmludGVycnVwdHNbaV0pCiAJCQlfX3NldF9iaXQocC0+aW50ZXJydXB0c1tpXSwgaXJxLT5tYXApOwogCWlycS0+ZmxhZ3MgPSBpcnFfZmxhZ3MocC0+dHJpZ2dlcmluZywgcC0+cG9sYXJpdHkpOwogCiAJcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShvcHRpb24sIGlycSk7Ci0JcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9wb3J0X29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICppbykKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfcG9ydF9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKKwkJCQkgICAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqaW8pCiB7CiAJc3RydWN0IHBucF9wb3J0ICpwb3J0OwogCkBAIC00MzAsMTQgKzQzMiwxMiBAQAogCXBvcnQtPmFsaWduID0gaW8tPmFsaWdubWVudDsKIAlwb3J0LT5zaXplID0gaW8tPmFkZHJlc3NfbGVuZ3RoOwogCXBvcnQtPmZsYWdzID0gQUNQSV9ERUNPREVfMTYgPT0gaW8tPmlvX2RlY29kZSA/Ci0JCVBOUF9QT1JUX0ZMQUdfMTZCSVRBRERSIDogMDsKKwkgICAgUE5QX1BPUlRfRkxBR18xNkJJVEFERFIgOiAwOwogCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKG9wdGlvbiwgcG9ydCk7Ci0JcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9maXhlZF9wb3J0X29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICppbykKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKKwkJCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvICppbykKIHsKIAlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQ7CiAKQEAgLTQ1MSwxMiArNDUxLDEwIEBACiAJcG9ydC0+YWxpZ24gPSAwOwogCXBvcnQtPmZsYWdzID0gUE5QX1BPUlRfRkxBR19GSVhFRDsKIAlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24sIHBvcnQpOwotCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQKLXBucGFjcGlfcGFyc2VfbWVtMjRfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCi0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MjQgKnApCitzdGF0aWMgdm9pZCBwbnBhY3BpX3BhcnNlX21lbTI0X29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAorCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCAqcCkKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCkBAIC00NzEsMTUgKzQ2OSwxMyBAQAogCW1lbS0+c2l6ZSA9IHAtPmFkZHJlc3NfbGVuZ3RoOwogCiAJbWVtLT5mbGFncyA9IChBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09IHAtPndyaXRlX3Byb3RlY3QpID8KLQkJCUlPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CisJICAgIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CiAKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKLQlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX21lbTMyX29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAotCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTMyICpwKQorc3RhdGljIHZvaWQgcG5wYWNwaV9wYXJzZV9tZW0zMl9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKKwkJCQkgICAgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MzIgKnApCiB7CiAJc3RydWN0IHBucF9tZW0gKm1lbTsKIApAQCAtNDk0LDE1ICs0OTAsMTMgQEAKIAltZW0tPnNpemUgPSBwLT5hZGRyZXNzX2xlbmd0aDsKIAogCW1lbS0+ZmxhZ3MgPSAoQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PSBwLT53cml0ZV9wcm90ZWN0KSA/Ci0JCQlJT1JFU09VUkNFX01FTV9XUklURUFCTEUgOiAwOworCSAgICBJT1JFU09VUkNFX01FTV9XUklURUFCTEUgOiAwOwogCiAJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sIG1lbSk7Ci0JcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9maXhlZF9tZW0zMl9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiAqcCkKK3N0YXRpYyB2b2lkIHBucGFjcGlfcGFyc2VfZml4ZWRfbWVtMzJfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCisJCQkJCSBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiAqcCkKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCkBAIC01MTYsMTQgKzUxMCwxMyBAQAogCW1lbS0+YWxpZ24gPSAwOwogCiAJbWVtLT5mbGFncyA9IChBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09IHAtPndyaXRlX3Byb3RlY3QpID8KLQkJCUlPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CisJICAgIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CiAKIAlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKLQlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FkZHJlc3Nfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sIHN0cnVjdCBhY3BpX3Jlc291cmNlICpyKQorc3RhdGljIHZvaWQgcG5wYWNwaV9wYXJzZV9hZGRyZXNzX29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAorCQkJCQkgc3RydWN0IGFjcGlfcmVzb3VyY2UgKnIpCiB7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHIsICpwID0gJmFkZHI7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpAQCAtNTMyLDcgKzUyNSw4IEBACiAKIAlzdGF0dXMgPSBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyLCBwKTsKIAlpZiAoIUFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCXBucF93YXJuKCJQblBBQ1BJOiBmYWlsZWQgdG8gY29udmVydCByZXNvdXJjZSB0eXBlICVkIiwgci0+dHlwZSk7CisJCXBucF93YXJuKCJQblBBQ1BJOiBmYWlsZWQgdG8gY29udmVydCByZXNvdXJjZSB0eXBlICVkIiwKKwkJCSByLT50eXBlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTQ3LDcgKzU0MSw4IEBACiAJCW1lbS0+c2l6ZSA9IHAtPmFkZHJlc3NfbGVuZ3RoOwogCQltZW0tPmFsaWduID0gMDsKIAkJbWVtLT5mbGFncyA9IChwLT5pbmZvLm1lbS53cml0ZV9wcm90ZWN0ID09Ci0JCSAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKSA/IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CisJCQkgICAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKSA/IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRQorCQkgICAgOiAwOwogCQlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKIAl9IGVsc2UgaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkgewogCQlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CkBAIC01NjgsMTA5ICs1NjMsMTA4IEBACiB9OwogCiBzdGF0aWMgYWNwaV9zdGF0dXMgcG5wYWNwaV9vcHRpb25fcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywKLQl2b2lkICpkYXRhKQorCQkJCQkgICB2b2lkICpkYXRhKQogewogCWludCBwcmlvcml0eSA9IDA7Ci0Jc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgKnBhcnNlX2RhdGEgPSAoc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgKilkYXRhOworCXN0cnVjdCBhY3BpcG5wX3BhcnNlX29wdGlvbl9zICpwYXJzZV9kYXRhID0KKwkgICAgKHN0cnVjdCBhY3BpcG5wX3BhcnNlX29wdGlvbl9zICopZGF0YTsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gcGFyc2VfZGF0YS0+ZGV2OwogCXN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24gPSBwYXJzZV9kYXRhLT5vcHRpb247CiAKIAlzd2l0Y2ggKHJlcy0+dHlwZSkgewotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6Ci0JCQlwbnBhY3BpX3BhcnNlX2lycV9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLmlycSk7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgorCQlwbnBhY3BpX3BhcnNlX2lycV9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLmlycSk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BOgorCQlwbnBhY3BpX3BhcnNlX2RtYV9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLmRtYSk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgorCQlzd2l0Y2ggKHJlcy0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSkgeworCQljYXNlIEFDUElfR09PRF9DT05GSUdVUkFUSU9OOgorCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX1BSRUZFUlJFRDsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKLQkJCXBucGFjcGlfcGFyc2VfZG1hX29wdGlvbihvcHRpb24sICZyZXMtPmRhdGEuZG1hKTsKKwkJY2FzZSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjoKKwkJCXByaW9yaXR5ID0gUE5QX1JFU19QUklPUklUWV9BQ0NFUFRBQkxFOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgotCQkJc3dpdGNoIChyZXMtPmRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpIHsKLQkJCQljYXNlIEFDUElfR09PRF9DT05GSUdVUkFUSU9OOgotCQkJCQlwcmlvcml0eSA9IFBOUF9SRVNfUFJJT1JJVFlfUFJFRkVSUkVEOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT046Ci0JCQkJCXByaW9yaXR5ID0gUE5QX1JFU19QUklPUklUWV9BQ0NFUFRBQkxFOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQUNQSV9TVUJfT1BUSU1BTF9DT05GSUdVUkFUSU9OOgotCQkJCQlwcmlvcml0eSA9IFBOUF9SRVNfUFJJT1JJVFlfRlVOQ1RJT05BTDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX0lOVkFMSUQ7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJLyogVEJEOiBDb25zaWRlcmluZyBwZXJmb3JtYWNlL3JvYnVzdG5lc3MgYml0cyAqLwotCQkJb3B0aW9uID0gcG5wX3JlZ2lzdGVyX2RlcGVuZGVudF9vcHRpb24oZGV2LCBwcmlvcml0eSk7Ci0JCQlpZiAoIW9wdGlvbikKLQkJCQlyZXR1cm4gQUVfRVJST1I7Ci0JCQlwYXJzZV9kYXRhLT5vcHRpb24gPSBvcHRpb247CisJCWNhc2UgQUNQSV9TVUJfT1BUSU1BTF9DT05GSUdVUkFUSU9OOgorCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX0ZVTkNUSU9OQUw7CiAJCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgotCQkJLypvbmx5IG9uZSBFbmREZXBlbmRlbnRGbiBpcyBhbGxvd2VkKi8KLQkJCWlmICghcGFyc2VfZGF0YS0+b3B0aW9uX2luZGVwZW5kZW50KSB7Ci0JCQkJcG5wX3dhcm4oIlBuUEFDUEk6IG1vcmUgdGhhbiBvbmUgRW5kRGVwZW5kZW50Rm4iKTsKLQkJCQlyZXR1cm4gQUVfRVJST1I7Ci0JCQl9Ci0JCQlwYXJzZV9kYXRhLT5vcHRpb24gPSBwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQ7Ci0JCQlwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQgPSBOVUxMOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU86Ci0JCQlwbnBhY3BpX3BhcnNlX3BvcnRfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5pbyk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTzoKLQkJCXBucGFjcGlfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24ob3B0aW9uLAotCQkJCSZyZXMtPmRhdGEuZml4ZWRfaW8pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SOgotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQ6Ci0JCQlwbnBhY3BpX3BhcnNlX21lbTI0X29wdGlvbihvcHRpb24sICZyZXMtPmRhdGEubWVtb3J5MjQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzI6Ci0JCQlwbnBhY3BpX3BhcnNlX21lbTMyX29wdGlvbihvcHRpb24sICZyZXMtPmRhdGEubWVtb3J5MzIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzI6Ci0JCQlwbnBhY3BpX3BhcnNlX2ZpeGVkX21lbTMyX29wdGlvbihvcHRpb24sCi0JCQkJJnJlcy0+ZGF0YS5maXhlZF9tZW1vcnkzMik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTY6Ci0JCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMjoKLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgotCQkJcG5wYWNwaV9wYXJzZV9hZGRyZXNzX29wdGlvbihvcHRpb24sIHJlcyk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQ6Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6Ci0JCQlwbnBhY3BpX3BhcnNlX2V4dF9pcnFfb3B0aW9uKG9wdGlvbiwKLQkJCQkmcmVzLT5kYXRhLmV4dGVuZGVkX2lycSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSOgotCQkJYnJlYWs7Ci0KIAkJZGVmYXVsdDoKLQkJCXBucF93YXJuKCJQblBBQ1BJOiB1bmtub3duIHJlc291cmNlIHR5cGUgJWQiLCByZXMtPnR5cGUpOworCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX0lOVkFMSUQ7CisJCQlicmVhazsKKwkJfQorCQkvKiBUQkQ6IENvbnNpZGVyIHBlcmZvcm1hbmNlL3JvYnVzdG5lc3MgYml0cyAqLworCQlvcHRpb24gPSBwbnBfcmVnaXN0ZXJfZGVwZW5kZW50X29wdGlvbihkZXYsIHByaW9yaXR5KTsKKwkJaWYgKCFvcHRpb24pCiAJCQlyZXR1cm4gQUVfRVJST1I7CisJCXBhcnNlX2RhdGEtPm9wdGlvbiA9IG9wdGlvbjsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgorCQkvKm9ubHkgb25lIEVuZERlcGVuZGVudEZuIGlzIGFsbG93ZWQgKi8KKwkJaWYgKCFwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQpIHsKKwkJCXBucF93YXJuKCJQblBBQ1BJOiBtb3JlIHRoYW4gb25lIEVuZERlcGVuZGVudEZuIik7CisJCQlyZXR1cm4gQUVfRVJST1I7CisJCX0KKwkJcGFyc2VfZGF0YS0+b3B0aW9uID0gcGFyc2VfZGF0YS0+b3B0aW9uX2luZGVwZW5kZW50OworCQlwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQgPSBOVUxMOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lPOgorCQlwbnBhY3BpX3BhcnNlX3BvcnRfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5pbyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU86CisJCXBucGFjcGlfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLmZpeGVkX2lvKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1I6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDoKKwkJcG5wYWNwaV9wYXJzZV9tZW0yNF9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLm1lbW9yeTI0KTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjoKKwkJcG5wYWNwaV9wYXJzZV9tZW0zMl9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLm1lbW9yeTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMjoKKwkJcG5wYWNwaV9wYXJzZV9maXhlZF9tZW0zMl9vcHRpb24ob3B0aW9uLAorCQkJCQkJICZyZXMtPmRhdGEuZml4ZWRfbWVtb3J5MzIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNjoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzI6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgorCQlwbnBhY3BpX3BhcnNlX2FkZHJlc3Nfb3B0aW9uKG9wdGlvbiwgcmVzKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQ6CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROgorCQlwbnBhY3BpX3BhcnNlX2V4dF9pcnFfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5leHRlbmRlZF9pcnEpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0dFTkVSSUNfUkVHSVNURVI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcG5wX3dhcm4oIlBuUEFDUEk6IHVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlcy0+dHlwZSk7CisJCXJldHVybiBBRV9FUlJPUjsKIAl9CiAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKIGFjcGlfc3RhdHVzIHBucGFjcGlfcGFyc2VfcmVzb3VyY2Vfb3B0aW9uX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLAotCXN0cnVjdCBwbnBfZGV2ICpkZXYpCisJCQkJCSAgICAgICBzdHJ1Y3QgcG5wX2RldiAqIGRldikKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgcGFyc2VfZGF0YTsKQEAgLTY4MSw3ICs2NzUsNyBAQAogCXBhcnNlX2RhdGEub3B0aW9uX2luZGVwZW5kZW50ID0gcGFyc2VfZGF0YS5vcHRpb247CiAJcGFyc2VfZGF0YS5kZXYgPSBkZXY7CiAJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCi0JCXBucGFjcGlfb3B0aW9uX3Jlc291cmNlLCAmcGFyc2VfZGF0YSk7CisJCQkJICAgICBwbnBhY3BpX29wdGlvbl9yZXNvdXJjZSwgJnBhcnNlX2RhdGEpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTcwOSw3ICs3MDMsNyBAQAogICogU2V0IHJlc291cmNlCiAgKi8KIHN0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX2NvdW50X3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLAotCXZvaWQgKmRhdGEpCisJCQkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJaW50ICpyZXNfY250ID0gKGludCAqKWRhdGE7CiAKQEAgLTczMiwxNCArNzI2LDE0IEBACiB9CiAKIGludCBwbnBhY3BpX2J1aWxkX3Jlc291cmNlX3RlbXBsYXRlKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlcikKKwkJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIpCiB7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOwogCWludCByZXNfY250ID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJcG5wYWNwaV9jb3VudF9yZXNvdXJjZXMsICZyZXNfY250KTsKKwkJCQkgICAgIHBucGFjcGlfY291bnRfcmVzb3VyY2VzLCAmcmVzX2NudCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXBucF9lcnIoIkV2YWx1YXRlIF9DUlMgZmFpbGVkIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzUzLDcgKzc0Nyw3IEBACiAJcG5wX2RiZygiUmVzIGNudCAlZCIsIHJlc19jbnQpOwogCXJlc291cmNlID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlICopYnVmZmVyLT5wb2ludGVyOwogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQlwbnBhY3BpX3R5cGVfcmVzb3VyY2VzLCAmcmVzb3VyY2UpOworCQkJCSAgICAgcG5wYWNwaV90eXBlX3Jlc291cmNlcywgJnJlc291cmNlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJa2ZyZWUoYnVmZmVyLT5wb2ludGVyKTsKIAkJcG5wX2VycigiRXZhbHVhdGUgX0NSUyBmYWlsZWQiKTsKQEAgLTc2Niw3ICs3NjAsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9pcnEoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAotCXN0cnVjdCByZXNvdXJjZSAqcCkKKwkJCSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnApCiB7CiAJaW50IHRyaWdnZXJpbmcsIHBvbGFyaXR5OwogCkBAIC03ODIsNyArNzc2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfZXh0X2lycShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCi0Jc3RydWN0IHJlc291cmNlICpwKQorCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcCkKIHsKIAlpbnQgdHJpZ2dlcmluZywgcG9sYXJpdHk7CiAKQEAgLTc5OSwzMiArNzkzLDMyIEBACiB9CiAKIHN0YXRpYyB2b2lkIHBucGFjcGlfZW5jb2RlX2RtYShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCi0Jc3RydWN0IHJlc291cmNlICpwKQorCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcCkKIHsKIAkvKiBOb3RlOiBwbnBfYXNzaWduX2RtYSB3aWxsIGNvcHkgcG5wX2RtYS0+ZmxhZ3MgaW50byBwLT5mbGFncyAqLwogCXN3aXRjaCAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV9TUEVFRF9NQVNLKSB7Ci0JCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUE6Ci0JCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9BOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUI6Ci0JCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9COwotCQkJYnJlYWs7Ci0JCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUY6Ci0JCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9GOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfQ09NUEFUSUJJTElUWTsKKwljYXNlIElPUkVTT1VSQ0VfRE1BX1RZUEVBOgorCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9BOworCQlicmVhazsKKwljYXNlIElPUkVTT1VSQ0VfRE1BX1RZUEVCOgorCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9COworCQlicmVhazsKKwljYXNlIElPUkVTT1VSQ0VfRE1BX1RZUEVGOgorCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9GOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfQ09NUEFUSUJJTElUWTsKIAl9CiAKIAlzd2l0Y2ggKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfVFlQRV9NQVNLKSB7Ci0JCWNhc2UgSU9SRVNPVVJDRV9ETUFfOEJJVDoKLQkJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfODsKLQkJCWJyZWFrOwotCQljYXNlIElPUkVTT1VSQ0VfRE1BXzhBTkQxNkJJVDoKLQkJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfOF8xNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKKwljYXNlIElPUkVTT1VSQ0VfRE1BXzhCSVQ6CisJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfODsKKwkJYnJlYWs7CisJY2FzZSBJT1JFU09VUkNFX0RNQV84QU5EMTZCSVQ6CisJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfOF8xNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKIAl9CiAKIAlyZXNvdXJjZS0+ZGF0YS5kbWEuYnVzX21hc3RlciA9ICEhKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfTUFTVEVSKTsKQEAgLTgzMywzMSArODI3LDMxIEBACiB9CiAKIHN0YXRpYyB2b2lkIHBucGFjcGlfZW5jb2RlX2lvKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKLQlzdHJ1Y3QgcmVzb3VyY2UgKnApCisJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnApCiB7CiAJLyogTm90ZTogcG5wX2Fzc2lnbl9wb3J0IHdpbGwgY29weSBwbnBfcG9ydC0+ZmxhZ3MgaW50byBwLT5mbGFncyAqLwotCXJlc291cmNlLT5kYXRhLmlvLmlvX2RlY29kZSA9IChwLT5mbGFncyAmIFBOUF9QT1JUX0ZMQUdfMTZCSVRBRERSKT8KLQkJQUNQSV9ERUNPREVfMTYgOiBBQ1BJX0RFQ09ERV8xMDsKKwlyZXNvdXJjZS0+ZGF0YS5pby5pb19kZWNvZGUgPSAocC0+ZmxhZ3MgJiBQTlBfUE9SVF9GTEFHXzE2QklUQUREUikgPworCSAgICBBQ1BJX0RFQ09ERV8xNiA6IEFDUElfREVDT0RFXzEwOwogCXJlc291cmNlLT5kYXRhLmlvLm1pbmltdW0gPSBwLT5zdGFydDsKIAlyZXNvdXJjZS0+ZGF0YS5pby5tYXhpbXVtID0gcC0+ZW5kOwotCXJlc291cmNlLT5kYXRhLmlvLmFsaWdubWVudCA9IDA7IC8qIENvcnJlY3Q/ICovCisJcmVzb3VyY2UtPmRhdGEuaW8uYWxpZ25tZW50ID0gMDsJLyogQ29ycmVjdD8gKi8KIAlyZXNvdXJjZS0+ZGF0YS5pby5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfZml4ZWRfaW8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAotCXN0cnVjdCByZXNvdXJjZSAqcCkKKwkJCQkgICAgc3RydWN0IHJlc291cmNlICpwKQogewogCXJlc291cmNlLT5kYXRhLmZpeGVkX2lvLmFkZHJlc3MgPSBwLT5zdGFydDsKIAlyZXNvdXJjZS0+ZGF0YS5maXhlZF9pby5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfbWVtMjQoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAotCXN0cnVjdCByZXNvdXJjZSAqcCkKKwkJCQkgc3RydWN0IHJlc291cmNlICpwKQogewogCS8qIE5vdGU6IHBucF9hc3NpZ25fbWVtIHdpbGwgY29weSBwbnBfbWVtLT5mbGFncyBpbnRvIHAtPmZsYWdzICovCiAJcmVzb3VyY2UtPmRhdGEubWVtb3J5MjQud3JpdGVfcHJvdGVjdCA9Ci0JCShwLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSkgPwotCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZIDogQUNQSV9SRUFEX09OTFlfTUVNT1JZOworCSAgICAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV9XUklURUFCTEUpID8KKwkgICAgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA6IEFDUElfUkVBRF9PTkxZX01FTU9SWTsKIAlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkyNC5taW5pbXVtID0gcC0+c3RhcnQ7CiAJcmVzb3VyY2UtPmRhdGEubWVtb3J5MjQubWF4aW11bSA9IHAtPmVuZDsKIAlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkyNC5hbGlnbm1lbnQgPSAwOwpAQCAtODY1LDExICs4NTksMTEgQEAKIH0KIAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfbWVtMzIoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAotCXN0cnVjdCByZXNvdXJjZSAqcCkKKwkJCQkgc3RydWN0IHJlc291cmNlICpwKQogewogCXJlc291cmNlLT5kYXRhLm1lbW9yeTMyLndyaXRlX3Byb3RlY3QgPQotCQkocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV9XUklURUFCTEUpID8KLQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA6IEFDUElfUkVBRF9PTkxZX01FTU9SWTsKKwkgICAgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFKSA/CisJICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkgOiBBQ1BJX1JFQURfT05MWV9NRU1PUlk7CiAJcmVzb3VyY2UtPmRhdGEubWVtb3J5MzIubWluaW11bSA9IHAtPnN0YXJ0OwogCXJlc291cmNlLT5kYXRhLm1lbW9yeTMyLm1heGltdW0gPSBwLT5lbmQ7CiAJcmVzb3VyY2UtPmRhdGEubWVtb3J5MzIuYWxpZ25tZW50ID0gMDsKQEAgLTg3Nyw3NCArODcxLDc3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHBucGFjcGlfZW5jb2RlX2ZpeGVkX21lbTMyKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKLQlzdHJ1Y3QgcmVzb3VyY2UgKnApCisJCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcCkKIHsKIAlyZXNvdXJjZS0+ZGF0YS5maXhlZF9tZW1vcnkzMi53cml0ZV9wcm90ZWN0ID0KLQkJKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFKSA/Ci0JCUFDUElfUkVBRF9XUklURV9NRU1PUlkgOiBBQ1BJX1JFQURfT05MWV9NRU1PUlk7CisJICAgIChwLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSkgPworCSAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZIDogQUNQSV9SRUFEX09OTFlfTUVNT1JZOwogCXJlc291cmNlLT5kYXRhLmZpeGVkX21lbW9yeTMyLmFkZHJlc3MgPSBwLT5zdGFydDsKIAlyZXNvdXJjZS0+ZGF0YS5maXhlZF9tZW1vcnkzMi5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KIAogaW50IHBucGFjcGlfZW5jb2RlX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXNfdGFibGUsCi0Jc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIpCisJCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKQogewogCWludCBpID0gMDsKIAkvKiBwbnBhY3BpX2J1aWxkX3Jlc291cmNlX3RlbXBsYXRlIGFsbG9jYXRlcyBleHRyYSBtZW0gKi8KLQlpbnQgcmVzX2NudCA9IChidWZmZXItPmxlbmd0aCAtIDEpL3NpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSkgLSAxOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSopYnVmZmVyLT5wb2ludGVyOworCWludCByZXNfY250ID0gKGJ1ZmZlci0+bGVuZ3RoIC0gMSkgLyBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpIC0gMTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UgPQorCSAgICAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKilidWZmZXItPnBvaW50ZXI7CiAJaW50IHBvcnQgPSAwLCBpcnEgPSAwLCBkbWEgPSAwLCBtZW0gPSAwOwogCiAJcG5wX2RiZygicmVzIGNudCAlZCIsIHJlc19jbnQpOwogCXdoaWxlIChpIDwgcmVzX2NudCkgewotCQlzd2l0Y2gocmVzb3VyY2UtPnR5cGUpIHsKKwkJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgewogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6CiAJCQlwbnBfZGJnKCJFbmNvZGUgaXJxIik7CiAJCQlwbnBhY3BpX2VuY29kZV9pcnEocmVzb3VyY2UsCi0JCQkJJnJlc190YWJsZS0+aXJxX3Jlc291cmNlW2lycV0pOworCQkJCQkgICAmcmVzX3RhYmxlLT5pcnFfcmVzb3VyY2VbaXJxXSk7CiAJCQlpcnErKzsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKIAkJCXBucF9kYmcoIkVuY29kZSBkbWEiKTsKIAkJCXBucGFjcGlfZW5jb2RlX2RtYShyZXNvdXJjZSwKLQkJCQkmcmVzX3RhYmxlLT5kbWFfcmVzb3VyY2VbZG1hXSk7CisJCQkJCSAgICZyZXNfdGFibGUtPmRtYV9yZXNvdXJjZVtkbWFdKTsKIAkJCWRtYSsrOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lPOgogCQkJcG5wX2RiZygiRW5jb2RlIGlvIik7CiAJCQlwbnBhY3BpX2VuY29kZV9pbyhyZXNvdXJjZSwKLQkJCQkmcmVzX3RhYmxlLT5wb3J0X3Jlc291cmNlW3BvcnRdKTsKKwkJCQkJICAmcmVzX3RhYmxlLT5wb3J0X3Jlc291cmNlW3BvcnRdKTsKIAkJCXBvcnQrKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTzoKIAkJCXBucF9kYmcoIkVuY29kZSBmaXhlZCBpbyIpOwogCQkJcG5wYWNwaV9lbmNvZGVfZml4ZWRfaW8ocmVzb3VyY2UsCi0JCQkJJnJlc190YWJsZS0+cG9ydF9yZXNvdXJjZVtwb3J0XSk7CisJCQkJCQkmcmVzX3RhYmxlLT4KKwkJCQkJCXBvcnRfcmVzb3VyY2VbcG9ydF0pOwogCQkJcG9ydCsrOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTI0OgogCQkJcG5wX2RiZygiRW5jb2RlIG1lbTI0Iik7CiAJCQlwbnBhY3BpX2VuY29kZV9tZW0yNChyZXNvdXJjZSwKLQkJCQkmcmVzX3RhYmxlLT5tZW1fcmVzb3VyY2VbbWVtXSk7CisJCQkJCSAgICAgJnJlc190YWJsZS0+bWVtX3Jlc291cmNlW21lbV0pOwogCQkJbWVtKys7CiAJCQlicmVhazsKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzI6CiAJCQlwbnBfZGJnKCJFbmNvZGUgbWVtMzIiKTsKIAkJCXBucGFjcGlfZW5jb2RlX21lbTMyKHJlc291cmNlLAotCQkJCSZyZXNfdGFibGUtPm1lbV9yZXNvdXJjZVttZW1dKTsKKwkJCQkJICAgICAmcmVzX3RhYmxlLT5tZW1fcmVzb3VyY2VbbWVtXSk7CiAJCQltZW0rKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMjoKIAkJCXBucF9kYmcoIkVuY29kZSBmaXhlZCBtZW0zMiIpOwogCQkJcG5wYWNwaV9lbmNvZGVfZml4ZWRfbWVtMzIocmVzb3VyY2UsCi0JCQkJJnJlc190YWJsZS0+bWVtX3Jlc291cmNlW21lbV0pOworCQkJCQkJICAgJnJlc190YWJsZS0+CisJCQkJCQkgICBtZW1fcmVzb3VyY2VbbWVtXSk7CiAJCQltZW0rKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6CiAJCQlwbnBfZGJnKCJFbmNvZGUgZXh0IGlycSIpOwogCQkJcG5wYWNwaV9lbmNvZGVfZXh0X2lycShyZXNvdXJjZSwKLQkJCQkmcmVzX3RhYmxlLT5pcnFfcmVzb3VyY2VbaXJxXSk7CisJCQkJCSAgICAgICAmcmVzX3RhYmxlLT5pcnFfcmVzb3VyY2VbaXJxXSk7CiAJCQlpcnErKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6CkBAIC05NTYsNyArOTUzLDcgQEAKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQ6CiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0dFTkVSSUNfUkVHSVNURVI6Ci0JCWRlZmF1bHQ6IC8qIG90aGVyIHR5cGUgKi8KKwkJZGVmYXVsdDoJLyogb3RoZXIgdHlwZSAqLwogCQkJcG5wX3dhcm4oInVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlc291cmNlLT50eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL2Jpb3NjYWxscy5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9iaW9zY2FsbHMuYwppbmRleCBhMWYwYjBiLi41ZGJhNjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBiaW9zL2Jpb3NjYWxscy5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvYmlvc2NhbGxzLmMKQEAgLTEsNiArMSw1IEBACiAvKgogICogYmlvc2NhbGxzLmMgLSB0aGUgbG93bGV2ZWwgbGF5ZXIgb2YgdGhlIFBuUEJJT1MgZHJpdmVyCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMjYsMTEgKzI1LDEwIEBACiAjaW5jbHVkZSAicG5wYmlvcy5oIgogCiBzdGF0aWMgc3RydWN0IHsKLQl1MTYJb2Zmc2V0OwotCXUxNglzZWdtZW50OworCXUxNiBvZmZzZXQ7CisJdTE2IHNlZ21lbnQ7CiB9IHBucF9iaW9zX2NhbGxwb2ludDsKIAotCiAvKgogICogVGhlc2UgYXJlIHNvbWUgb3Bjb2RlcyBmb3IgYSAic3RhdGljIGFzbWxpbmthZ2UiCiAgKiBBcyB0aGlzIGNvZGUgaXMgKm5vdCogZXhlY3V0ZWQgaW5zaWRlIHRoZSBsaW51eCBrZXJuZWwgc2VnbWVudCwgYnV0IGluIGEKQEAgLTQ0LDggKzQyLDcgQEAKIAogYXNtbGlua2FnZSB2b2lkIHBucF9iaW9zX2NhbGxmdW5jKHZvaWQpOwogCi1fX2FzbV9fKAotCSIudGV4dAkJCVxuIgorX19hc21fXygiLnRleHQJCQlcbiIKIAlfX0FMSUdOX1NUUiAiXG4iCiAJInBucF9iaW9zX2NhbGxmdW5jOlxuIgogCSIJcHVzaGwgJWVkeAlcbiIKQEAgLTU1LDggKzUyLDcgQEAKIAkiCWxjYWxsdyAqcG5wX2Jpb3NfY2FsbHBvaW50XG4iCiAJIglhZGRsICQxNiwgJWVzcAlcbiIKIAkiCWxyZXQJCVxuIgotCSIucHJldmlvdXMJCVxuIgotKTsKKwkiLnByZXZpb3VzCQlcbiIpOwogCiAjZGVmaW5lIFEyX1NFVF9TRUwoY3B1LCBzZWxuYW1lLCBhZGRyZXNzLCBzaXplKSBcCiBkbyB7IFwKQEAgLTc4LDcgKzc0LDYgQEAKIAogc3RhdGljIHNwaW5sb2NrX3QgcG5wX2Jpb3NfbG9jazsKIAotCiAvKgogICogU3VwcG9ydCBGdW5jdGlvbnMKICAqLwpAQCAtOTcsNyArOTIsNyBAQAogCSAqIFBuUCBCSU9TZXMgYXJlIGdlbmVyYWxseSBub3QgdGVycmlibHkgcmUtZW50cmFudC4KIAkgKiBBbHNvLCBkb24ndCByZWx5IG9uIHRoZW0gdG8gc2F2ZSBldmVyeXRoaW5nIGNvcnJlY3RseS4KIAkgKi8KLQlpZihwbnBfYmlvc19pc191dHRlcl9jcmFwKQorCWlmIChwbnBfYmlvc19pc191dHRlcl9jcmFwKQogCQlyZXR1cm4gUE5QX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQ7CiAKIAljcHUgPSBnZXRfY3B1KCk7CkBAIC0xMTMsMTEyICsxMDgsMTI4IEBACiAJaWYgKHRzMl9zaXplKQogCQlRMl9TRVRfU0VMKHNtcF9wcm9jZXNzb3JfaWQoKSwgUE5QX1RTMiwgdHMyX2Jhc2UsIHRzMl9zaXplKTsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSAgICAgICAgInB1c2hsICUlZWJwXG5cdCIKLQkJInB1c2hsICUlZWRpXG5cdCIKLQkJInB1c2hsICUlZXNpXG5cdCIKLQkJInB1c2hsICUlZHNcblx0IgotCQkicHVzaGwgJSVlc1xuXHQiCi0JCSJwdXNobCAlJWZzXG5cdCIKLQkJInB1c2hsICUlZ3Ncblx0IgotCQkicHVzaGZsXG5cdCIKLQkJIm1vdmwgJSVlc3AsIHBucF9iaW9zX2ZhdWx0X2VzcFxuXHQiCi0JCSJtb3ZsICQxZiwgcG5wX2Jpb3NfZmF1bHRfZWlwXG5cdCIKLQkJImxjYWxsICU1LCU2XG5cdCIKLQkJIjE6cG9wZmxcblx0IgotCQkicG9wbCAlJWdzXG5cdCIKLQkJInBvcGwgJSVmc1xuXHQiCi0JCSJwb3BsICUlZXNcblx0IgotCQkicG9wbCAlJWRzXG5cdCIKLQkgICAgICAgICJwb3BsICUlZXNpXG5cdCIKLQkJInBvcGwgJSVlZGlcblx0IgotCQkicG9wbCAlJWVicFxuXHQiCi0JCTogIj1hIiAoc3RhdHVzKQotCQk6ICIwIiAoKGZ1bmMpIHwgKCgodTMyKWFyZzEpIDw8IDE2KSksCi0JCSAgImIiICgoYXJnMikgfCAoKCh1MzIpYXJnMykgPDwgMTYpKSwKLQkJICAiYyIgKChhcmc0KSB8ICgoKHUzMilhcmc1KSA8PCAxNikpLAotCQkgICJkIiAoKGFyZzYpIHwgKCgodTMyKWFyZzcpIDw8IDE2KSksCi0JCSAgImkiIChQTlBfQ1MzMiksCi0JCSAgImkiICgwKQotCQk6ICJtZW1vcnkiCi0JKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGwgJSVlYnBcblx0IgorCQkJICAgICAicHVzaGwgJSVlZGlcblx0IgorCQkJICAgICAicHVzaGwgJSVlc2lcblx0IgorCQkJICAgICAicHVzaGwgJSVkc1xuXHQiCisJCQkgICAgICJwdXNobCAlJWVzXG5cdCIKKwkJCSAgICAgInB1c2hsICUlZnNcblx0IgorCQkJICAgICAicHVzaGwgJSVnc1xuXHQiCisJCQkgICAgICJwdXNoZmxcblx0IgorCQkJICAgICAibW92bCAlJWVzcCwgcG5wX2Jpb3NfZmF1bHRfZXNwXG5cdCIKKwkJCSAgICAgIm1vdmwgJDFmLCBwbnBfYmlvc19mYXVsdF9laXBcblx0IgorCQkJICAgICAibGNhbGwgJTUsJTZcblx0IgorCQkJICAgICAiMTpwb3BmbFxuXHQiCisJCQkgICAgICJwb3BsICUlZ3Ncblx0IgorCQkJICAgICAicG9wbCAlJWZzXG5cdCIKKwkJCSAgICAgInBvcGwgJSVlc1xuXHQiCisJCQkgICAgICJwb3BsICUlZHNcblx0IgorCQkJICAgICAicG9wbCAlJWVzaVxuXHQiCisJCQkgICAgICJwb3BsICUlZWRpXG5cdCIKKwkJCSAgICAgInBvcGwgJSVlYnBcblx0IjoiPWEiKHN0YXR1cykKKwkJCSAgICAgOiIwIigoZnVuYykgfCAoKCh1MzIpIGFyZzEpIDw8IDE2KSksCisJCQkgICAgICJiIigoYXJnMikgfCAoKCh1MzIpIGFyZzMpIDw8IDE2KSksCisJCQkgICAgICJjIigoYXJnNCkgfCAoKCh1MzIpIGFyZzUpIDw8IDE2KSksCisJCQkgICAgICJkIigoYXJnNikgfCAoKCh1MzIpIGFyZzcpIDw8IDE2KSksCisJCQkgICAgICJpIihQTlBfQ1MzMiksICJpIigwKQorCQkJICAgICA6Im1lbW9yeSIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBucF9iaW9zX2xvY2ssIGZsYWdzKTsKIAogCWdldF9jcHVfZ2R0X3RhYmxlKGNwdSlbMHg0MCAvIDhdID0gc2F2ZV9kZXNjXzQwOwogCXB1dF9jcHUoKTsKIAogCS8qIElmIHdlIGdldCBoZXJlIGFuZCB0aGlzIGlzIHNldCB0aGVuIHRoZSBQblAgQklPUyBmYXVsdGVkIG9uIHVzLiAqLwotCWlmKHBucF9iaW9zX2lzX3V0dGVyX2NyYXApCi0JewotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFdhcm5pbmchIFlvdXIgUG5QIEJJT1MgY2F1c2VkIGEgZmF0YWwgZXJyb3IuIEF0dGVtcHRpbmcgdG8gY29udGludWVcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFlvdSBtYXkgbmVlZCB0byByZWJvb3Qgd2l0aCB0aGUgXCJwbnBiaW9zPW9mZlwiIG9wdGlvbiB0byBvcGVyYXRlIHN0YWJseVxuIik7Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogQ2hlY2sgd2l0aCB5b3VyIHZlbmRvciBmb3IgYW4gdXBkYXRlZCBCSU9TXG4iKTsKKwlpZiAocG5wX2Jpb3NfaXNfdXR0ZXJfY3JhcCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQblBCSU9TOiBXYXJuaW5nISBZb3VyIFBuUCBCSU9TIGNhdXNlZCBhIGZhdGFsIGVycm9yLiBBdHRlbXB0aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUG5QQklPUzogWW91IG1heSBuZWVkIHRvIHJlYm9vdCB3aXRoIHRoZSBcInBucGJpb3M9b2ZmXCIgb3B0aW9uIHRvIG9wZXJhdGUgc3RhYmx5XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUG5QQklPUzogQ2hlY2sgd2l0aCB5b3VyIHZlbmRvciBmb3IgYW4gdXBkYXRlZCBCSU9TXG4iKTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIHBucGJpb3NfcHJpbnRfc3RhdHVzKGNvbnN0IGNoYXIgKiBtb2R1bGUsIHUxNiBzdGF0dXMpCit2b2lkIHBucGJpb3NfcHJpbnRfc3RhdHVzKGNvbnN0IGNoYXIgKm1vZHVsZSwgdTE2IHN0YXR1cykKIHsKLQlzd2l0Y2goc3RhdHVzKSB7CisJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIFBOUF9TVUNDRVNTOgogCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBmdW5jdGlvbiBzdWNjZXNzZnVsXG4iLCBtb2R1bGUpOwogCQlicmVhazsKIAljYXNlIFBOUF9OT1RfU0VUX1NUQVRJQ0FMTFk6Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogJXM6IHVuYWJsZSB0byBzZXQgc3RhdGljIHJlc291cmNlc1xuIiwgbW9kdWxlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogdW5hYmxlIHRvIHNldCBzdGF0aWMgcmVzb3VyY2VzXG4iLAorCQkgICAgICAgbW9kdWxlKTsKIAkJYnJlYWs7CiAJY2FzZSBQTlBfVU5LTk9XTl9GVU5DVElPTjoKLQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogaW52YWxpZCBmdW5jdGlvbiBudW1iZXIgcGFzc2VkXG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBpbnZhbGlkIGZ1bmN0aW9uIG51bWJlciBwYXNzZWRcbiIsCisJCSAgICAgICBtb2R1bGUpOwogCQlicmVhazsKIAljYXNlIFBOUF9GVU5DVElPTl9OT1RfU1VQUE9SVEVEOgotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtXG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQblBCSU9TOiAlczogZnVuY3Rpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbVxuIiwKKwkJICAgICAgIG1vZHVsZSk7CiAJCWJyZWFrOwogCWNhc2UgUE5QX0lOVkFMSURfSEFORExFOgogCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBpbnZhbGlkIGhhbmRsZVxuIiwgbW9kdWxlKTsKIAkJYnJlYWs7CiAJY2FzZSBQTlBfQkFEX1BBUkFNRVRFUjoKLQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogaW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkXG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBpbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWRcbiIsCisJCSAgICAgICBtb2R1bGUpOwogCQlicmVhazsKIAljYXNlIFBOUF9TRVRfRkFJTEVEOgotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiB1bmFibGUgdG8gc2V0IHJlc291cmNlc1xuIiwgbW9kdWxlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogdW5hYmxlIHRvIHNldCByZXNvdXJjZXNcbiIsCisJCSAgICAgICBtb2R1bGUpOwogCQlicmVhazsKIAljYXNlIFBOUF9FVkVOVFNfTk9UX1BFTkRJTkc6CiAJCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogJXM6IG5vIGV2ZW50cyBhcmUgcGVuZGluZ1xuIiwgbW9kdWxlKTsKIAkJYnJlYWs7CiAJY2FzZSBQTlBfU1lTVEVNX05PVF9ET0NLRUQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogJXM6IHRoZSBzeXN0ZW0gaXMgbm90IGRvY2tlZFxuIiwgbW9kdWxlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogdGhlIHN5c3RlbSBpcyBub3QgZG9ja2VkXG4iLAorCQkgICAgICAgbW9kdWxlKTsKIAkJYnJlYWs7CiAJY2FzZSBQTlBfTk9fSVNBX1BOUF9DQVJEUzoKLQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogbm8gaXNhcG5wIGNhcmRzIGFyZSBpbnN0YWxsZWQgb24gdGhpcyBzeXN0ZW1cbiIsIG1vZHVsZSk7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlBuUEJJT1M6ICVzOiBubyBpc2FwbnAgY2FyZHMgYXJlIGluc3RhbGxlZCBvbiB0aGlzIHN5c3RlbVxuIiwKKwkJICAgICAgIG1vZHVsZSk7CiAJCWJyZWFrOwogCWNhc2UgUE5QX1VOQUJMRV9UT19ERVRFUk1JTkVfRE9DS19DQVBBQklMSVRJRVM6Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogJXM6IGNhbm5vdCBkZXRlcm1pbmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgZG9ja2luZyBzdGF0aW9uXG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQblBCSU9TOiAlczogY2Fubm90IGRldGVybWluZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkb2NraW5nIHN0YXRpb25cbiIsCisJCSAgICAgICBtb2R1bGUpOwogCQlicmVhazsKIAljYXNlIFBOUF9DT05GSUdfQ0hBTkdFX0ZBSUxFRF9OT19CQVRURVJZOgotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiB1bmFibGUgdG8gdW5kb2NrLCB0aGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSBiYXR0ZXJ5XG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQblBCSU9TOiAlczogdW5hYmxlIHRvIHVuZG9jaywgdGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgYmF0dGVyeVxuIiwKKwkJICAgICAgIG1vZHVsZSk7CiAJCWJyZWFrOwogCWNhc2UgUE5QX0NPTkZJR19DSEFOR0VfRkFJTEVEX1JFU09VUkNFX0NPTkZMSUNUOgotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBjb3VsZCBub3QgZG9jayBkdWUgdG8gcmVzb3VyY2UgY29uZmxpY3RzXG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQblBCSU9TOiAlczogY291bGQgbm90IGRvY2sgZHVlIHRvIHJlc291cmNlIGNvbmZsaWN0c1xuIiwKKwkJICAgICAgIG1vZHVsZSk7CiAJCWJyZWFrOwogCWNhc2UgUE5QX0JVRkZFUl9UT09fU01BTEw6Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogJXM6IHRoZSBidWZmZXIgcGFzc2VkIGlzIHRvbyBzbWFsbFxuIiwgbW9kdWxlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogdGhlIGJ1ZmZlciBwYXNzZWQgaXMgdG9vIHNtYWxsXG4iLAorCQkgICAgICAgbW9kdWxlKTsKIAkJYnJlYWs7CiAJY2FzZSBQTlBfVVNFX0VTQ0RfU1VQUE9SVDoKIAkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogdXNlIEVTQ0QgaW5zdGVhZFxuIiwgbW9kdWxlKTsKIAkJYnJlYWs7CiAJY2FzZSBQTlBfTUVTU0FHRV9OT1RfU1VQUE9SVEVEOgotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiB0aGUgbWVzc2FnZSBpcyB1bnN1cHBvcnRlZFxuIiwgbW9kdWxlKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogdGhlIG1lc3NhZ2UgaXMgdW5zdXBwb3J0ZWRcbiIsCisJCSAgICAgICBtb2R1bGUpOwogCQlicmVhazsKIAljYXNlIFBOUF9IQVJEV0FSRV9FUlJPUjoKLQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiAlczogYSBoYXJkd2FyZSBmYWlsdXJlIGhhcyBvY2N1cmVkXG4iLCBtb2R1bGUpOworCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiBhIGhhcmR3YXJlIGZhaWx1cmUgaGFzIG9jY3VyZWRcbiIsCisJCSAgICAgICBtb2R1bGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6ICVzOiB1bmV4cGVjdGVkIHN0YXR1cyAweCV4XG4iLCBtb2R1bGUsIHN0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogJXM6IHVuZXhwZWN0ZWQgc3RhdHVzIDB4JXhcbiIsIG1vZHVsZSwKKwkJICAgICAgIHN0YXR1cyk7CiAJCWJyZWFrOwogCX0KIH0KIAotCiAvKgogICogUG5QIEJJT1MgTG93IExldmVsIENhbGxzCiAgKi8KQEAgLTI0MywxOSArMjU0LDIyIEBACiBzdGF0aWMgaW50IF9fcG5wX2Jpb3NfZGV2X25vZGVfaW5mbyhzdHJ1Y3QgcG5wX2Rldl9ub2RlX2luZm8gKmRhdGEpCiB7CiAJdTE2IHN0YXR1czsKKwogCWlmICghcG5wX2Jpb3NfcHJlc2VudCgpKQogCQlyZXR1cm4gUE5QX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQ7Ci0Jc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX05VTV9TWVNfREVWX05PREVTLCAwLCBQTlBfVFMxLCAyLCBQTlBfVFMxLCBQTlBfRFMsIDAsIDAsCi0JCQkgICAgICAgZGF0YSwgc2l6ZW9mKHN0cnVjdCBwbnBfZGV2X25vZGVfaW5mbyksIE5VTEwsIDApOworCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX0dFVF9OVU1fU1lTX0RFVl9OT0RFUywgMCwgUE5QX1RTMSwgMiwKKwkJCSAgICAgICBQTlBfVFMxLCBQTlBfRFMsIDAsIDAsIGRhdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwbnBfZGV2X25vZGVfaW5mbyksIE5VTEwsIDApOwogCWRhdGEtPm5vX25vZGVzICY9IDB4ZmY7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogaW50IHBucF9iaW9zX2Rldl9ub2RlX2luZm8oc3RydWN0IHBucF9kZXZfbm9kZV9pbmZvICpkYXRhKQogewotCWludCBzdGF0dXMgPSBfX3BucF9iaW9zX2Rldl9ub2RlX2luZm8oIGRhdGEgKTsKLQlpZiAoIHN0YXR1cyApCi0JCXBucGJpb3NfcHJpbnRfc3RhdHVzKCAiZGV2X25vZGVfaW5mbyIsIHN0YXR1cyApOworCWludCBzdGF0dXMgPSBfX3BucF9iaW9zX2Rldl9ub2RlX2luZm8oZGF0YSk7CisKKwlpZiAoc3RhdHVzKQorCQlwbnBiaW9zX3ByaW50X3N0YXR1cygiZGV2X25vZGVfaW5mbyIsIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjczLDE3ICsyODcsMjAgQEAKICAqICAgICAgICAgICAgICAgb3Igdm9sYXRpbGUgY3VycmVudCAoMCkgY29uZmlnCiAgKiBPdXRwdXQ6ICpub2RlbnVtPW5leHQgbm9kZSBvciAweGZmIGlmIG5vIG1vcmUgbm9kZXMKICAqLwotc3RhdGljIGludCBfX3BucF9iaW9zX2dldF9kZXZfbm9kZSh1OCAqbm9kZW51bSwgY2hhciBib290LCBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqZGF0YSkKK3N0YXRpYyBpbnQgX19wbnBfYmlvc19nZXRfZGV2X25vZGUodTggKm5vZGVudW0sIGNoYXIgYm9vdCwKKwkJCQkgICBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqZGF0YSkKIHsKIAl1MTYgc3RhdHVzOwogCXUxNiB0bXBfbm9kZW51bTsKKwogCWlmICghcG5wX2Jpb3NfcHJlc2VudCgpKQogCQlyZXR1cm4gUE5QX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQ7Ci0JaWYgKCAhYm9vdCAmJiBwbnBiaW9zX2RvbnRfdXNlX2N1cnJlbnRfY29uZmlnICkKKwlpZiAoIWJvb3QgJiYgcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZykKIAkJcmV0dXJuIFBOUF9GVU5DVElPTl9OT1RfU1VQUE9SVEVEOwogCXRtcF9ub2RlbnVtID0gKm5vZGVudW07Ci0Jc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX1NZU19ERVZfTk9ERSwgMCwgUE5QX1RTMSwgMCwgUE5QX1RTMiwgYm9vdCA/IDIgOiAxLCBQTlBfRFMsIDAsCi0JCQkgICAgICAgJnRtcF9ub2RlbnVtLCBzaXplb2YodG1wX25vZGVudW0pLCBkYXRhLCA2NTUzNik7CisJc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX1NZU19ERVZfTk9ERSwgMCwgUE5QX1RTMSwgMCwgUE5QX1RTMiwKKwkJCSAgICAgICBib290ID8gMiA6IDEsIFBOUF9EUywgMCwgJnRtcF9ub2RlbnVtLAorCQkJICAgICAgIHNpemVvZih0bXBfbm9kZW51bSksIGRhdGEsIDY1NTM2KTsKIAkqbm9kZW51bSA9IHRtcF9ub2RlbnVtOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yOTEsMTA0ICszMDgsNjYgQEAKIGludCBwbnBfYmlvc19nZXRfZGV2X25vZGUodTggKm5vZGVudW0sIGNoYXIgYm9vdCwgc3RydWN0IHBucF9iaW9zX25vZGUgKmRhdGEpCiB7CiAJaW50IHN0YXR1czsKLQlzdGF0dXMgPSAgX19wbnBfYmlvc19nZXRfZGV2X25vZGUoIG5vZGVudW0sIGJvb3QsIGRhdGEgKTsKLQlpZiAoIHN0YXR1cyApCi0JCXBucGJpb3NfcHJpbnRfc3RhdHVzKCAiZ2V0X2Rldl9ub2RlIiwgc3RhdHVzICk7CisKKwlzdGF0dXMgPSBfX3BucF9iaW9zX2dldF9kZXZfbm9kZShub2RlbnVtLCBib290LCBkYXRhKTsKKwlpZiAoc3RhdHVzKQorCQlwbnBiaW9zX3ByaW50X3N0YXR1cygiZ2V0X2Rldl9ub2RlIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0KIC8qCiAgKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHgwMiwgInNldCBzeXN0ZW0gZGV2aWNlIG5vZGUiCiAgKiBJbnB1dDogKm5vZGVudW0gPSBkZXNpcmVkIG5vZGUsIAogICogICAgICAgIGJvb3QgPSB3aGV0aGVyIHRvIHNldCBub252b2xhdGlsZSBib290ICghPTApCiAgKiAgICAgICAgICAgICAgIG9yIHZvbGF0aWxlIGN1cnJlbnQgKDApIGNvbmZpZwogICovCi1zdGF0aWMgaW50IF9fcG5wX2Jpb3Nfc2V0X2Rldl9ub2RlKHU4IG5vZGVudW0sIGNoYXIgYm9vdCwgc3RydWN0IHBucF9iaW9zX25vZGUgKmRhdGEpCitzdGF0aWMgaW50IF9fcG5wX2Jpb3Nfc2V0X2Rldl9ub2RlKHU4IG5vZGVudW0sIGNoYXIgYm9vdCwKKwkJCQkgICBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqZGF0YSkKIHsKIAl1MTYgc3RhdHVzOworCiAJaWYgKCFwbnBfYmlvc19wcmVzZW50KCkpCiAJCXJldHVybiBQTlBfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDsKLQlpZiAoICFib290ICYmIHBucGJpb3NfZG9udF91c2VfY3VycmVudF9jb25maWcgKQorCWlmICghYm9vdCAmJiBwbnBiaW9zX2RvbnRfdXNlX2N1cnJlbnRfY29uZmlnKQogCQlyZXR1cm4gUE5QX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQ7Ci0Jc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfU0VUX1NZU19ERVZfTk9ERSwgbm9kZW51bSwgMCwgUE5QX1RTMSwgYm9vdCA/IDIgOiAxLCBQTlBfRFMsIDAsIDAsCi0JCQkgICAgICAgZGF0YSwgNjU1MzYsIE5VTEwsIDApOworCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX1NFVF9TWVNfREVWX05PREUsIG5vZGVudW0sIDAsIFBOUF9UUzEsCisJCQkgICAgICAgYm9vdCA/IDIgOiAxLCBQTlBfRFMsIDAsIDAsIGRhdGEsIDY1NTM2LCBOVUxMLAorCQkJICAgICAgIDApOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIGludCBwbnBfYmlvc19zZXRfZGV2X25vZGUodTggbm9kZW51bSwgY2hhciBib290LCBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqZGF0YSkKIHsKIAlpbnQgc3RhdHVzOwotCXN0YXR1cyA9ICBfX3BucF9iaW9zX3NldF9kZXZfbm9kZSggbm9kZW51bSwgYm9vdCwgZGF0YSApOwotCWlmICggc3RhdHVzICkgewotCQlwbnBiaW9zX3ByaW50X3N0YXR1cyggInNldF9kZXZfbm9kZSIsIHN0YXR1cyApOworCisJc3RhdHVzID0gX19wbnBfYmlvc19zZXRfZGV2X25vZGUobm9kZW51bSwgYm9vdCwgZGF0YSk7CisJaWYgKHN0YXR1cykgeworCQlwbnBiaW9zX3ByaW50X3N0YXR1cygic2V0X2Rldl9ub2RlIiwgc3RhdHVzKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0JaWYgKCAhYm9vdCApIHsgLyogVXBkYXRlIGRldmxpc3QgKi8KLQkJc3RhdHVzID0gIHBucF9iaW9zX2dldF9kZXZfbm9kZSggJm5vZGVudW0sIGJvb3QsIGRhdGEgKTsKLQkJaWYgKCBzdGF0dXMgKQorCWlmICghYm9vdCkgewkJLyogVXBkYXRlIGRldmxpc3QgKi8KKwkJc3RhdHVzID0gcG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKCZub2RlbnVtLCBib290LCBkYXRhKTsKKwkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CiAKLSNpZiBuZWVkZWQKLS8qCi0gKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHgwMywgImdldCBldmVudCIKLSAqLwotc3RhdGljIGludCBwbnBfYmlvc19nZXRfZXZlbnQodTE2ICpldmVudCkKLXsKLQl1MTYgc3RhdHVzOwotCWlmICghcG5wX2Jpb3NfcHJlc2VudCgpKQotCQlyZXR1cm4gUE5QX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQ7Ci0Jc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX0VWRU5ULCAwLCBQTlBfVFMxLCBQTlBfRFMsIDAsIDAgLDAgLDAsCi0JCQkgICAgICAgZXZlbnQsIHNpemVvZih1MTYpLCBOVUxMLCAwKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotI2VuZGlmCi0KLSNpZiBuZWVkZWQKLS8qCi0gKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHgwNCwgInNlbmQgbWVzc2FnZSIKLSAqLwotc3RhdGljIGludCBwbnBfYmlvc19zZW5kX21lc3NhZ2UodTE2IG1lc3NhZ2UpCi17Ci0JdTE2IHN0YXR1czsKLQlpZiAoIXBucF9iaW9zX3ByZXNlbnQoKSkKLQkJcmV0dXJuIFBOUF9GVU5DVElPTl9OT1RfU1VQUE9SVEVEOwotCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX1NFTkRfTUVTU0FHRSwgbWVzc2FnZSwgUE5QX0RTLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotI2VuZGlmCi0KIC8qCiAgKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHgwNSwgImdldCBkb2NraW5nIHN0YXRpb24gaW5mb3JtYXRpb24iCiAgKi8KIGludCBwbnBfYmlvc19kb2NrX3N0YXRpb25faW5mbyhzdHJ1Y3QgcG5wX2RvY2tpbmdfc3RhdGlvbl9pbmZvICpkYXRhKQogewogCXUxNiBzdGF0dXM7Ci0JaWYgKCFwbnBfYmlvc19wcmVzZW50KCkpCi0JCXJldHVybiBQTlBfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDsKLQlzdGF0dXMgPSBjYWxsX3BucF9iaW9zKFBOUF9HRVRfRE9DS0lOR19TVEFUSU9OX0lORk9STUFUSU9OLCAwLCBQTlBfVFMxLCBQTlBfRFMsIDAsIDAsIDAsIDAsCi0JCQkgICAgICAgZGF0YSwgc2l6ZW9mKHN0cnVjdCBwbnBfZG9ja2luZ19zdGF0aW9uX2luZm8pLCBOVUxMLCAwKTsKLQlyZXR1cm4gc3RhdHVzOwotfQogCi0jaWYgbmVlZGVkCi0vKgotICogQ2FsbCBQblAgQklPUyB3aXRoIGZ1bmN0aW9uIDB4MDksICJzZXQgc3RhdGljYWxseSBhbGxvY2F0ZWQgcmVzb3VyY2UKLSAqIGluZm9ybWF0aW9uIgotICovCi1zdGF0aWMgaW50IHBucF9iaW9zX3NldF9zdGF0X3JlcyhjaGFyICppbmZvKQotewotCXUxNiBzdGF0dXM7CiAJaWYgKCFwbnBfYmlvc19wcmVzZW50KCkpCiAJCXJldHVybiBQTlBfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDsKLQlzdGF0dXMgPSBjYWxsX3BucF9iaW9zKFBOUF9TRVRfU1RBVElDX0FMTE9DRURfUkVTX0lORk8sIDAsIFBOUF9UUzEsIFBOUF9EUywgMCwgMCwgMCwgMCwKLQkJCSAgICAgICBpbmZvLCAqKCh1MTYgKikgaW5mbyksIDAsIDApOworCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX0dFVF9ET0NLSU5HX1NUQVRJT05fSU5GT1JNQVRJT04sIDAsIFBOUF9UUzEsCisJCQkgICAgICAgUE5QX0RTLCAwLCAwLCAwLCAwLCBkYXRhLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcG5wX2RvY2tpbmdfc3RhdGlvbl9pbmZvKSwgTlVMTCwKKwkJCSAgICAgICAwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQotI2VuZGlmCiAKIC8qCiAgKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHgwYSwgImdldCBzdGF0aWNhbGx5IGFsbG9jYXRlZCByZXNvdXJjZQpAQCAtMzk3LDM2ICszNzYsMjMgQEAKIHN0YXRpYyBpbnQgX19wbnBfYmlvc19nZXRfc3RhdF9yZXMoY2hhciAqaW5mbykKIHsKIAl1MTYgc3RhdHVzOworCiAJaWYgKCFwbnBfYmlvc19wcmVzZW50KCkpCiAJCXJldHVybiBQTlBfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDsKLQlzdGF0dXMgPSBjYWxsX3BucF9iaW9zKFBOUF9HRVRfU1RBVElDX0FMTE9DRURfUkVTX0lORk8sIDAsIFBOUF9UUzEsIFBOUF9EUywgMCwgMCwgMCwgMCwKLQkJCSAgICAgICBpbmZvLCA2NTUzNiwgTlVMTCwgMCk7CisJc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX1NUQVRJQ19BTExPQ0VEX1JFU19JTkZPLCAwLCBQTlBfVFMxLAorCQkJICAgICAgIFBOUF9EUywgMCwgMCwgMCwgMCwgaW5mbywgNjU1MzYsIE5VTEwsIDApOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIGludCBwbnBfYmlvc19nZXRfc3RhdF9yZXMoY2hhciAqaW5mbykKIHsKIAlpbnQgc3RhdHVzOwotCXN0YXR1cyA9IF9fcG5wX2Jpb3NfZ2V0X3N0YXRfcmVzKCBpbmZvICk7Ci0JaWYgKCBzdGF0dXMgKQotCQlwbnBiaW9zX3ByaW50X3N0YXR1cyggImdldF9zdGF0X3JlcyIsIHN0YXR1cyApOwotCXJldHVybiBzdGF0dXM7Ci19CiAKLSNpZiBuZWVkZWQKLS8qCi0gKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHgwYiwgImdldCBBUE0gaWQgdGFibGUiCi0gKi8KLXN0YXRpYyBpbnQgcG5wX2Jpb3NfYXBtX2lkX3RhYmxlKGNoYXIgKnRhYmxlLCB1MTYgKnNpemUpCi17Ci0JdTE2IHN0YXR1czsKLQlpZiAoIXBucF9iaW9zX3ByZXNlbnQoKSkKLQkJcmV0dXJuIFBOUF9GVU5DVElPTl9OT1RfU1VQUE9SVEVEOwotCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX0dFVF9BUE1fSURfVEFCTEUsIDAsIFBOUF9UUzIsIDAsIFBOUF9UUzEsIFBOUF9EUywgMCwgMCwKLQkJCSAgICAgICB0YWJsZSwgKnNpemUsIHNpemUsIHNpemVvZih1MTYpKTsKKwlzdGF0dXMgPSBfX3BucF9iaW9zX2dldF9zdGF0X3JlcyhpbmZvKTsKKwlpZiAoc3RhdHVzKQorCQlwbnBiaW9zX3ByaW50X3N0YXR1cygiZ2V0X3N0YXRfcmVzIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQotI2VuZGlmCiAKIC8qCiAgKiBDYWxsIFBuUCBCSU9TIHdpdGggZnVuY3Rpb24gMHg0MCwgImdldCBpc2EgcG5wIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIgpAQCAtNDM0LDE5ICs0MDAsMjIgQEAKIHN0YXRpYyBpbnQgX19wbnBfYmlvc19pc2FwbnBfY29uZmlnKHN0cnVjdCBwbnBfaXNhX2NvbmZpZ19zdHJ1YyAqZGF0YSkKIHsKIAl1MTYgc3RhdHVzOworCiAJaWYgKCFwbnBfYmlvc19wcmVzZW50KCkpCiAJCXJldHVybiBQTlBfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDsKLQlzdGF0dXMgPSBjYWxsX3BucF9iaW9zKFBOUF9HRVRfUE5QX0lTQV9DT05GSUdfU1RSVUMsIDAsIFBOUF9UUzEsIFBOUF9EUywgMCwgMCwgMCwgMCwKLQkJCSAgICAgICBkYXRhLCBzaXplb2Yoc3RydWN0IHBucF9pc2FfY29uZmlnX3N0cnVjKSwgTlVMTCwgMCk7CisJc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX1BOUF9JU0FfQ09ORklHX1NUUlVDLCAwLCBQTlBfVFMxLCBQTlBfRFMsCisJCQkgICAgICAgMCwgMCwgMCwgMCwgZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHBucF9pc2FfY29uZmlnX3N0cnVjKSwgTlVMTCwgMCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogaW50IHBucF9iaW9zX2lzYXBucF9jb25maWcoc3RydWN0IHBucF9pc2FfY29uZmlnX3N0cnVjICpkYXRhKQogewogCWludCBzdGF0dXM7Ci0Jc3RhdHVzID0gX19wbnBfYmlvc19pc2FwbnBfY29uZmlnKCBkYXRhICk7Ci0JaWYgKCBzdGF0dXMgKQotCQlwbnBiaW9zX3ByaW50X3N0YXR1cyggImlzYXBucF9jb25maWciLCBzdGF0dXMgKTsKKworCXN0YXR1cyA9IF9fcG5wX2Jpb3NfaXNhcG5wX2NvbmZpZyhkYXRhKTsKKwlpZiAoc3RhdHVzKQorCQlwbnBiaW9zX3ByaW50X3N0YXR1cygiaXNhcG5wX2NvbmZpZyIsIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDU2LDE5ICs0MjUsMjIgQEAKIHN0YXRpYyBpbnQgX19wbnBfYmlvc19lc2NkX2luZm8oc3RydWN0IGVzY2RfaW5mb19zdHJ1YyAqZGF0YSkKIHsKIAl1MTYgc3RhdHVzOworCiAJaWYgKCFwbnBfYmlvc19wcmVzZW50KCkpCiAJCXJldHVybiBFU0NEX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQ7Ci0Jc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX0VTQ0RfSU5GTywgMCwgUE5QX1RTMSwgMiwgUE5QX1RTMSwgNCwgUE5QX1RTMSwgUE5QX0RTLAotCQkJICAgICAgIGRhdGEsIHNpemVvZihzdHJ1Y3QgZXNjZF9pbmZvX3N0cnVjKSwgTlVMTCwgMCk7CisJc3RhdHVzID0gY2FsbF9wbnBfYmlvcyhQTlBfR0VUX0VTQ0RfSU5GTywgMCwgUE5QX1RTMSwgMiwgUE5QX1RTMSwgNCwKKwkJCSAgICAgICBQTlBfVFMxLCBQTlBfRFMsIGRhdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBlc2NkX2luZm9fc3RydWMpLCBOVUxMLCAwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBpbnQgcG5wX2Jpb3NfZXNjZF9pbmZvKHN0cnVjdCBlc2NkX2luZm9fc3RydWMgKmRhdGEpCiB7CiAJaW50IHN0YXR1czsKLQlzdGF0dXMgPSBfX3BucF9iaW9zX2VzY2RfaW5mbyggZGF0YSApOwotCWlmICggc3RhdHVzICkKLQkJcG5wYmlvc19wcmludF9zdGF0dXMoICJlc2NkX2luZm8iLCBzdGF0dXMgKTsKKworCXN0YXR1cyA9IF9fcG5wX2Jpb3NfZXNjZF9pbmZvKGRhdGEpOworCWlmIChzdGF0dXMpCisJCXBucGJpb3NfcHJpbnRfc3RhdHVzKCJlc2NkX2luZm8iLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ3OSw1NyArNDUxLDQyIEBACiBzdGF0aWMgaW50IF9fcG5wX2Jpb3NfcmVhZF9lc2NkKGNoYXIgKmRhdGEsIHUzMiBudnJhbV9iYXNlKQogewogCXUxNiBzdGF0dXM7CisKIAlpZiAoIXBucF9iaW9zX3ByZXNlbnQoKSkKIAkJcmV0dXJuIEVTQ0RfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDsKLQlzdGF0dXMgPSBjYWxsX3BucF9iaW9zKFBOUF9SRUFEX0VTQ0QsIDAsIFBOUF9UUzEsIFBOUF9UUzIsIFBOUF9EUywgMCwgMCwgMCwKLQkJCSAgICAgICBkYXRhLCA2NTUzNiwgX192YShudnJhbV9iYXNlKSwgNjU1MzYpOworCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX1JFQURfRVNDRCwgMCwgUE5QX1RTMSwgUE5QX1RTMiwgUE5QX0RTLCAwLCAwLAorCQkJICAgICAgIDAsIGRhdGEsIDY1NTM2LCBfX3ZhKG52cmFtX2Jhc2UpLCA2NTUzNik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogaW50IHBucF9iaW9zX3JlYWRfZXNjZChjaGFyICpkYXRhLCB1MzIgbnZyYW1fYmFzZSkKIHsKIAlpbnQgc3RhdHVzOwotCXN0YXR1cyA9IF9fcG5wX2Jpb3NfcmVhZF9lc2NkKCBkYXRhLCBudnJhbV9iYXNlICk7Ci0JaWYgKCBzdGF0dXMgKQotCQlwbnBiaW9zX3ByaW50X3N0YXR1cyggInJlYWRfZXNjZCIsIHN0YXR1cyApOworCisJc3RhdHVzID0gX19wbnBfYmlvc19yZWFkX2VzY2QoZGF0YSwgbnZyYW1fYmFzZSk7CisJaWYgKHN0YXR1cykKKwkJcG5wYmlvc19wcmludF9zdGF0dXMoInJlYWRfZXNjZCIsIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotI2lmIG5lZWRlZAotLyoKLSAqIENhbGwgUG5QIEJJT1MgZnVuY3Rpb24gMHg0MywgIndyaXRlIEVTQ0QiCi0gKi8KLXN0YXRpYyBpbnQgcG5wX2Jpb3Nfd3JpdGVfZXNjZChjaGFyICpkYXRhLCB1MzIgbnZyYW1fYmFzZSkKLXsKLQl1MTYgc3RhdHVzOwotCWlmICghcG5wX2Jpb3NfcHJlc2VudCgpKQotCQlyZXR1cm4gRVNDRF9GVU5DVElPTl9OT1RfU1VQUE9SVEVEOwotCXN0YXR1cyA9IGNhbGxfcG5wX2Jpb3MoUE5QX1dSSVRFX0VTQ0QsIDAsIFBOUF9UUzEsIFBOUF9UUzIsIFBOUF9EUywgMCwgMCwgMCwKLQkJCSAgICAgICBkYXRhLCA2NTUzNiwgX192YShudnJhbV9iYXNlKSwgNjU1MzYpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYKLQotCi0vKgotICogSW5pdGlhbGl6YXRpb24KLSAqLwotCiB2b2lkIHBucGJpb3NfY2FsbHNfaW5pdCh1bmlvbiBwbnBfYmlvc19pbnN0YWxsX3N0cnVjdCAqaGVhZGVyKQogewogCWludCBpOworCiAJc3Bpbl9sb2NrX2luaXQoJnBucF9iaW9zX2xvY2spOwogCXBucF9iaW9zX2NhbGxwb2ludC5vZmZzZXQgPSBoZWFkZXItPmZpZWxkcy5wbTE2b2Zmc2V0OwogCXBucF9iaW9zX2NhbGxwb2ludC5zZWdtZW50ID0gUE5QX0NTMTY7CiAKIAlzZXRfYmFzZShiYWRfYmlvc19kZXNjLCBfX3ZhKCh1bnNpZ25lZCBsb25nKTB4NDAgPDwgNCkpOwogCV9zZXRfbGltaXQoKGNoYXIgKikmYmFkX2Jpb3NfZGVzYywgNDA5NSAtICgweDQwIDw8IDQpKTsKLSAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotICAJCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0ID0gZ2V0X2NwdV9nZHRfdGFibGUoaSk7Ci0gIAkJaWYgKCFnZHQpCi0gIAkJCWNvbnRpbnVlOwotIAkJc2V0X2Jhc2UoZ2R0W0dEVF9FTlRSWV9QTlBCSU9TX0NTMzJdLCAmcG5wX2Jpb3NfY2FsbGZ1bmMpOwotIAkJc2V0X2Jhc2UoZ2R0W0dEVF9FTlRSWV9QTlBCSU9TX0NTMTZdLCBfX3ZhKGhlYWRlci0+ZmllbGRzLnBtMTZjc2VnKSk7Ci0gCQlzZXRfYmFzZShnZHRbR0RUX0VOVFJZX1BOUEJJT1NfRFNdLCBfX3ZhKGhlYWRlci0+ZmllbGRzLnBtMTZkc2VnKSk7Ci0gIAl9CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdCA9IGdldF9jcHVfZ2R0X3RhYmxlKGkpOworCQlpZiAoIWdkdCkKKwkJCWNvbnRpbnVlOworCQlzZXRfYmFzZShnZHRbR0RUX0VOVFJZX1BOUEJJT1NfQ1MzMl0sICZwbnBfYmlvc19jYWxsZnVuYyk7CisJCXNldF9iYXNlKGdkdFtHRFRfRU5UUllfUE5QQklPU19DUzE2XSwKKwkJCSBfX3ZhKGhlYWRlci0+ZmllbGRzLnBtMTZjc2VnKSk7CisJCXNldF9iYXNlKGdkdFtHRFRfRU5UUllfUE5QQklPU19EU10sCisJCQkgX192YShoZWFkZXItPmZpZWxkcy5wbTE2ZHNlZykpOworCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggZWQxMTJlZS4uMzY5MmEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KLSAKKwogLyogQ2hhbmdlIExvZwogICoKICAqIEFkYW0gQmVsYXkgLSA8YW1ieDFAbmVvLnJyLmNvbT4gLSBNYXJjaCAxNiwgMjAwMwpAQCAtNzEsMTQgKzcxLDEzIEBACiAKICNpbmNsdWRlICJwbnBiaW9zLmgiCiAKLQogLyoKICAqCiAgKiBQblAgQklPUyBJTlRFUkZBQ0UKICAqCiAgKi8KIAotc3RhdGljIHVuaW9uIHBucF9iaW9zX2luc3RhbGxfc3RydWN0ICogcG5wX2Jpb3NfaW5zdGFsbCA9IE5VTEw7CitzdGF0aWMgdW5pb24gcG5wX2Jpb3NfaW5zdGFsbF9zdHJ1Y3QgKnBucF9iaW9zX2luc3RhbGwgPSBOVUxMOwogCiBpbnQgcG5wX2Jpb3NfcHJlc2VudCh2b2lkKQogewpAQCAtMTAxLDM2ICsxMDAsMzUgQEAKIC8qCiAgKiAoTXVjaCBvZiB0aGlzIGJlbG9uZ3MgaW4gYSBzaGFyZWQgcm91dGluZSBzb21ld2hlcmUpCiAgKi8KLSAKIHN0YXRpYyBpbnQgcG5wX2RvY2tfZXZlbnQoaW50IGRvY2ssIHN0cnVjdCBwbnBfZG9ja2luZ19zdGF0aW9uX2luZm8gKmluZm8pCiB7Ci0JY2hhciAqYXJndiBbM10sICoqZW52cCwgKmJ1ZiwgKnNjcmF0Y2g7CisJY2hhciAqYXJndlszXSwgKiplbnZwLCAqYnVmLCAqc2NyYXRjaDsKIAlpbnQgaSA9IDAsIHZhbHVlOwogCi0JaWYgKCFjdXJyZW50LT5mcy0+cm9vdCkgeworCWlmICghY3VycmVudC0+ZnMtPnJvb3QpCiAJCXJldHVybiAtRUFHQUlOOwotCX0KLQlpZiAoIShlbnZwID0ga2NhbGxvYygyMCwgc2l6ZW9mIChjaGFyICopLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShlbnZwID0ga2NhbGxvYygyMCwgc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWlmICghKGJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKSkpIHsKLQkJa2ZyZWUgKGVudnApOworCQlrZnJlZShlbnZwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogRklYTUU6IGlmIHRoZXJlIGFyZSBhY3R1YWwgdXNlcnMgb2YgdGhpcywgaXQgc2hvdWxkIGJlIGludGVncmF0ZWQgaW50bwotCSAqIHRoZSBkcml2ZXIgY29yZSBhbmQgdXNlIHRoZSB1c3VhbCBpbmZyYXN0cnVjdHVyZSBsaWtlIHN5c2ZzIGFuZCB1ZXZlbnRzICovCi0JYXJndiBbMF0gPSAiL3NiaW4vcG5wYmlvcyI7Ci0JYXJndiBbMV0gPSAiZG9jayI7Ci0JYXJndiBbMl0gPSBOVUxMOworCS8qIEZJWE1FOiBpZiB0aGVyZSBhcmUgYWN0dWFsIHVzZXJzIG9mIHRoaXMsIGl0IHNob3VsZCBiZQorCSAqIGludGVncmF0ZWQgaW50byB0aGUgZHJpdmVyIGNvcmUgYW5kIHVzZSB0aGUgdXN1YWwgaW5mcmFzdHJ1Y3R1cmUKKwkgKiBsaWtlIHN5c2ZzIGFuZCB1ZXZlbnRzCisJICovCisJYXJndlswXSA9ICIvc2Jpbi9wbnBiaW9zIjsKKwlhcmd2WzFdID0gImRvY2siOworCWFyZ3ZbMl0gPSBOVUxMOwogCiAJLyogbWluaW1hbCBjb21tYW5kIGVudmlyb25tZW50ICovCi0JZW52cCBbaSsrXSA9ICJIT01FPS8iOwotCWVudnAgW2krK10gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7CisJZW52cFtpKytdID0gIkhPTUU9LyI7CisJZW52cFtpKytdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOwogCiAjaWZkZWYJREVCVUcKIAkvKiBoaW50IHRoYXQgcG9saWN5IGFnZW50IHNob3VsZCBlbnRlciBuby1zdGRvdXQgZGVidWcgbW9kZSAqLwotCWVudnAgW2krK10gPSAiREVCVUc9a2VybmVsIjsKKwllbnZwW2krK10gPSAiREVCVUc9a2VybmVsIjsKICNlbmRpZgogCS8qIGV4dGVuc2libGUgc2V0IG9mIG5hbWVkIGJ1cy1zcGVjaWZpYyBwYXJhbWV0ZXJzLAogCSAqIHN1cHBvcnRpbmcgbXVsdGlwbGUgZHJpdmVyIHNlbGVjdGlvbiBhbGdvcml0aG1zLgpAQCAtMTM4LDMzICsxMzYsMzMgQEAKIAlzY3JhdGNoID0gYnVmOwogCiAJLyogYWN0aW9uOiAgYWRkLCByZW1vdmUgKi8KLQllbnZwIFtpKytdID0gc2NyYXRjaDsKLQlzY3JhdGNoICs9IHNwcmludGYgKHNjcmF0Y2gsICJBQ1RJT049JXMiLCBkb2NrPyJhZGQiOiJyZW1vdmUiKSArIDE7CisJZW52cFtpKytdID0gc2NyYXRjaDsKKwlzY3JhdGNoICs9IHNwcmludGYoc2NyYXRjaCwgIkFDVElPTj0lcyIsIGRvY2sgPyAiYWRkIiA6ICJyZW1vdmUiKSArIDE7CiAKIAkvKiBSZXBvcnQgdGhlIGlkZW50IGZvciB0aGUgZG9jayAqLwotCWVudnAgW2krK10gPSBzY3JhdGNoOwotCXNjcmF0Y2ggKz0gc3ByaW50ZiAoc2NyYXRjaCwgIkRPQ0s9JXgvJXgvJXgiLAotCQlpbmZvLT5sb2NhdGlvbl9pZCwgaW5mby0+c2VyaWFsLCBpbmZvLT5jYXBhYmlsaXRpZXMpOworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJc2NyYXRjaCArPSBzcHJpbnRmKHNjcmF0Y2gsICJET0NLPSV4LyV4LyV4IiwKKwkJCSAgIGluZm8tPmxvY2F0aW9uX2lkLCBpbmZvLT5zZXJpYWwsIGluZm8tPmNhcGFiaWxpdGllcyk7CiAJZW52cFtpXSA9IE5VTEw7Ci0JCi0JdmFsdWUgPSBjYWxsX3VzZXJtb2RlaGVscGVyIChhcmd2IFswXSwgYXJndiwgZW52cCwgVU1IX1dBSVRfRVhFQyk7Ci0Ja2ZyZWUgKGJ1Zik7Ci0Ja2ZyZWUgKGVudnApOworCisJdmFsdWUgPSBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3YgWzBdLCBhcmd2LCBlbnZwLCBVTUhfV0FJVF9FWEVDKTsKKwlrZnJlZShidWYpOworCWtmcmVlKGVudnApOwogCXJldHVybiAwOwogfQogCiAvKgogICogUG9sbCB0aGUgUG5QIGRvY2tpbmcgYXQgcmVndWxhciBpbnRlcnZhbHMKICAqLwotc3RhdGljIGludCBwbnBfZG9ja190aHJlYWQodm9pZCAqIHVudXNlZCkKK3N0YXRpYyBpbnQgcG5wX2RvY2tfdGhyZWFkKHZvaWQgKnVudXNlZCkKIHsKIAlzdGF0aWMgc3RydWN0IHBucF9kb2NraW5nX3N0YXRpb25faW5mbyBub3c7CiAJaW50IGRvY2tlZCA9IC0xLCBkID0gMDsKKwogCXNldF9mcmVlemFibGUoKTsKLQl3aGlsZSAoIXVubG9hZGluZykKLQl7CisJd2hpbGUgKCF1bmxvYWRpbmcpIHsKIAkJaW50IHN0YXR1czsKLQkJCisKIAkJLyoKIAkJICogUG9sbCBldmVyeSAyIHNlY29uZHMKIAkJICovCkBAIC0xNzUsMzAgKzE3MywyOSBAQAogCiAJCXN0YXR1cyA9IHBucF9iaW9zX2RvY2tfc3RhdGlvbl9pbmZvKCZub3cpOwogCi0JCXN3aXRjaChzdGF0dXMpCi0JCXsKKwkJc3dpdGNoIChzdGF0dXMpIHsKIAkJCS8qCiAJCQkgKiBObyBkb2NrIHRvIG1hbmFnZQogCQkJICovCi0JCQljYXNlIFBOUF9GVU5DVElPTl9OT1RfU1VQUE9SVEVEOgotCQkJCWNvbXBsZXRlX2FuZF9leGl0KCZ1bmxvYWRfc2VtLCAwKTsKLQkJCWNhc2UgUE5QX1NZU1RFTV9OT1RfRE9DS0VEOgotCQkJCWQgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQTlBfU1VDQ0VTUzoKLQkJCQlkID0gMTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcG5wYmlvc19wcmludF9zdGF0dXMoICJwbnBfZG9ja190aHJlYWQiLCBzdGF0dXMgKTsKLQkJCQljb250aW51ZTsKKwkJY2FzZSBQTlBfRlVOQ1RJT05fTk9UX1NVUFBPUlRFRDoKKwkJCWNvbXBsZXRlX2FuZF9leGl0KCZ1bmxvYWRfc2VtLCAwKTsKKwkJY2FzZSBQTlBfU1lTVEVNX05PVF9ET0NLRUQ6CisJCQlkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFBOUF9TVUNDRVNTOgorCQkJZCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBucGJpb3NfcHJpbnRfc3RhdHVzKCJwbnBfZG9ja190aHJlYWQiLCBzdGF0dXMpOworCQkJY29udGludWU7CiAJCX0KLQkJaWYoZCAhPSBkb2NrZWQpCi0JCXsKLQkJCWlmKHBucF9kb2NrX2V2ZW50KGQsICZub3cpPT0wKQotCQkJeworCQlpZiAoZCAhPSBkb2NrZWQpIHsKKwkJCWlmIChwbnBfZG9ja19ldmVudChkLCAmbm93KSA9PSAwKSB7CiAJCQkJZG9ja2VkID0gZDsKICNpZiAwCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiUG5QQklPUzogRG9ja2luZyBzdGF0aW9uICVzdGFjaGVkXG4iLCBkb2NrZWQ/ImF0IjoiZGUiKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJQblBCSU9TOiBEb2NraW5nIHN0YXRpb24gJXN0YWNoZWRcbiIsCisJCQkJICAgICAgIGRvY2tlZCA/ICJhdCIgOiAiZGUiKTsKICNlbmRpZgogCQkJfQogCQl9CkBAIC0yMDYsMjEgKzIwMywyMSBAQAogCWNvbXBsZXRlX2FuZF9leGl0KCZ1bmxvYWRfc2VtLCAwKTsKIH0KIAotI2VuZGlmICAgLyogQ09ORklHX0hPVFBMVUcgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfSE9UUExVRyAqLwogCi1zdGF0aWMgaW50IHBucGJpb3NfZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqIGRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcykKK3N0YXRpYyBpbnQgcG5wYmlvc19nZXRfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsCisJCQkJIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAl1OCBub2RlbnVtID0gZGV2LT5udW1iZXI7Ci0Jc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlOworCXN0cnVjdCBwbnBfYmlvc19ub2RlICpub2RlOwogCi0JLyoganVzdCBpbiBjYXNlICovCi0JaWYoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQorCWlmICghcG5wYmlvc19pc19keW5hbWljKGRldikpCiAJCXJldHVybiAtRVBFUk07CiAKIAlub2RlID0ga3phbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gLTE7Ci0JaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgKGNoYXIgKVBOUE1PREVfRFlOQU1JQywgbm9kZSkpIHsKKwlpZiAocG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKCZub2RlbnVtLCAoY2hhcilQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKSB7CiAJCWtmcmVlKG5vZGUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yMzAsMjQgKzIyNywyNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBucGJpb3Nfc2V0X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqIGRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcykKK3N0YXRpYyBpbnQgcG5wYmlvc19zZXRfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYsCisJCQkJIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcykKIHsKIAl1OCBub2RlbnVtID0gZGV2LT5udW1iZXI7Ci0Jc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlOworCXN0cnVjdCBwbnBfYmlvc19ub2RlICpub2RlOwogCWludCByZXQ7CiAKLQkvKiBqdXN0IGluIGNhc2UgKi8KIAlpZiAoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJbm9kZSA9IGt6YWxsb2Mobm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuIC0xOwotCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIChjaGFyIClQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKSB7CisJaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgKGNoYXIpUE5QTU9ERV9EWU5BTUlDLCBub2RlKSkgewogCQlrZnJlZShub2RlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmKHBucGJpb3Nfd3JpdGVfcmVzb3VyY2VzX3RvX25vZGUocmVzLCBub2RlKTwwKSB7CisJaWYgKHBucGJpb3Nfd3JpdGVfcmVzb3VyY2VzX3RvX25vZGUocmVzLCBub2RlKSA8IDApIHsKIAkJa2ZyZWUobm9kZSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yNTgsMTggKzI1NSwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHBucGJpb3NfemVyb19kYXRhX3N0cmVhbShzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqIG5vZGUpCitzdGF0aWMgdm9pZCBwbnBiaW9zX3plcm9fZGF0YV9zdHJlYW0oc3RydWN0IHBucF9iaW9zX25vZGUgKm5vZGUpCiB7Ci0JdW5zaWduZWQgY2hhciAqIHAgPSAoY2hhciAqKW5vZGUtPmRhdGE7Ci0JdW5zaWduZWQgY2hhciAqIGVuZCA9IChjaGFyICopKG5vZGUtPmRhdGEgKyBub2RlLT5zaXplKTsKKwl1bnNpZ25lZCBjaGFyICpwID0gKGNoYXIgKilub2RlLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgKmVuZCA9IChjaGFyICopKG5vZGUtPmRhdGEgKyBub2RlLT5zaXplKTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCWludCBpOworCiAJd2hpbGUgKChjaGFyICopcCA8IChjaGFyICopZW5kKSB7Ci0JCWlmKHBbMF0gJiAweDgwKSB7IC8qIGxhcmdlIHRhZyAqLworCQlpZiAocFswXSAmIDB4ODApIHsJLyogbGFyZ2UgdGFnICovCiAJCQlsZW4gPSAocFsyXSA8PCA4KSB8IHBbMV07CiAJCQlwICs9IDM7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoKChwWzBdPj4zKSAmIDB4MGYpID09IDB4MGYpCisJCQlpZiAoKChwWzBdID4+IDMpICYgMHgwZikgPT0gMHgwZikKIAkJCQlyZXR1cm47CiAJCQlsZW4gPSBwWzBdICYgMHgwNzsKIAkJCXAgKz0gMTsKQEAgLTI3OCwyNCArMjc2LDI0IEBACiAJCQlwW2ldID0gMDsKIAkJcCArPSBsZW47CiAJfQotCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogUmVzb3VyY2Ugc3RydWN0dXJlIGRpZCBub3QgY29udGFpbiBhbiBlbmQgdGFnLlxuIik7CisJcHJpbnRrKEtFUk5fRVJSCisJICAgICAgICJQblBCSU9TOiBSZXNvdXJjZSBzdHJ1Y3R1cmUgZGlkIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKIH0KIAogc3RhdGljIGludCBwbnBiaW9zX2Rpc2FibGVfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlOworCXN0cnVjdCBwbnBfYmlvc19ub2RlICpub2RlOwogCXU4IG5vZGVudW0gPSBkZXYtPm51bWJlcjsKIAlpbnQgcmV0OwogCi0JLyoganVzdCBpbiBjYXNlICovCi0JaWYoZGV2LT5mbGFncyAmIFBOUEJJT1NfTk9fRElTQUJMRSB8fCAhcG5wYmlvc19pc19keW5hbWljKGRldikpCisJaWYgKGRldi0+ZmxhZ3MgJiBQTlBCSU9TX05PX0RJU0FCTEUgfHwgIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJbm9kZSA9IGt6YWxsb2Mobm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAocG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKCZub2RlbnVtLCAoY2hhciApUE5QTU9ERV9EWU5BTUlDLCBub2RlKSkgeworCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIChjaGFyKVBOUE1PREVfRFlOQU1JQywgbm9kZSkpIHsKIAkJa2ZyZWUobm9kZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTMxMSwyMiArMzA5LDIyIEBACiAvKiBQblAgTGF5ZXIgc3VwcG9ydCAqLwogCiBzdHJ1Y3QgcG5wX3Byb3RvY29sIHBucGJpb3NfcHJvdG9jb2wgPSB7Ci0JLm5hbWUJPSAiUGx1ZyBhbmQgUGxheSBCSU9TIiwKLQkuZ2V0CT0gcG5wYmlvc19nZXRfcmVzb3VyY2VzLAotCS5zZXQJPSBwbnBiaW9zX3NldF9yZXNvdXJjZXMsCisJLm5hbWUgPSAiUGx1ZyBhbmQgUGxheSBCSU9TIiwKKwkuZ2V0ID0gcG5wYmlvc19nZXRfcmVzb3VyY2VzLAorCS5zZXQgPSBwbnBiaW9zX3NldF9yZXNvdXJjZXMsCiAJLmRpc2FibGUgPSBwbnBiaW9zX2Rpc2FibGVfcmVzb3VyY2VzLAogfTsKIAotc3RhdGljIGludCBpbnNlcnRfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfYmlvc19ub2RlICogbm9kZSkKK3N0YXRpYyBpbnQgaW5zZXJ0X2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2LCBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICogcG9zOwotCXN0cnVjdCBwbnBfZGV2ICogcG5wX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXY7CiAJc3RydWN0IHBucF9pZCAqZGV2X2lkOwogCWNoYXIgaWRbOF07CiAKIAkvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGFscmVhZHkgYWRkZWQgKi8KIAlkZXYtPm51bWJlciA9IG5vZGUtPmhhbmRsZTsKLQlsaXN0X2Zvcl9lYWNoIChwb3MsICZwbnBiaW9zX3Byb3RvY29sLmRldmljZXMpeworCWxpc3RfZm9yX2VhY2gocG9zLCAmcG5wYmlvc19wcm90b2NvbC5kZXZpY2VzKSB7CiAJCXBucF9kZXYgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBucF9kZXYsIHByb3RvY29sX2xpc3QpOwogCQlpZiAoZGV2LT5udW1iZXIgPT0gcG5wX2Rldi0+bnVtYmVyKQogCQkJcmV0dXJuIC0xOwpAQCAtMzM2LDggKzMzNCw4IEBACiAJZGV2X2lkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCWlmICghZGV2X2lkKQogCQlyZXR1cm4gLTE7Ci0JcG5waWQzMl90b19wbnBpZChub2RlLT5laXNhX2lkLGlkKTsKLQltZW1jcHkoZGV2X2lkLT5pZCxpZCw3KTsKKwlwbnBpZDMyX3RvX3BucGlkKG5vZGUtPmVpc2FfaWQsIGlkKTsKKwltZW1jcHkoZGV2X2lkLT5pZCwgaWQsIDcpOwogCXBucF9hZGRfaWQoZGV2X2lkLCBkZXYpOwogCXBucGJpb3NfcGFyc2VfZGF0YV9zdHJlYW0oZGV2LCBub2RlKTsKIAlkZXYtPmFjdGl2ZSA9IHBucF9pc19hY3RpdmUoZGV2KTsKQEAgLTM3NSwzNSArMzczLDQxIEBACiAJaWYgKCFub2RlKQogCQlyZXR1cm47CiAKLQlmb3Iobm9kZW51bT0wOyBub2RlbnVtPDB4ZmY7ICkgeworCWZvciAobm9kZW51bSA9IDA7IG5vZGVudW0gPCAweGZmOykgewogCQl1OCB0aGlzbm9kZW51bSA9IG5vZGVudW07CiAJCS8qIGV2ZW50dWFsbHkgd2Ugd2lsbCB3YW50IHRvIHVzZSBQTlBNT0RFX1NUQVRJQyBoZXJlIGJ1dCBmb3Igbm93CiAJCSAqIGR5bmFtaWMgd2lsbCBoZWxwIHVzIGNhdGNoIGJ1Z2d5IGJpb3NlcyB0byBhZGQgdG8gdGhlIGJsYWNrbGlzdC4KIAkJICovCiAJCWlmICghcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZykgewotCQkJaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgKGNoYXIgKVBOUE1PREVfRFlOQU1JQywgbm9kZSkpCisJCQlpZiAocG5wX2Jpb3NfZ2V0X2Rldl9ub2RlCisJCQkgICAgKCZub2RlbnVtLCAoY2hhcilQTlBNT0RFX0RZTkFNSUMsIG5vZGUpKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgewotCQkJaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgKGNoYXIgKVBOUE1PREVfU1RBVElDLCBub2RlKSkKKwkJCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUKKwkJCSAgICAoJm5vZGVudW0sIChjaGFyKVBOUE1PREVfU1RBVElDLCBub2RlKSkKIAkJCQlicmVhazsKIAkJfQogCQlub2Rlc19nb3QrKzsKLQkJZGV2ID0gIGt6YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgcG5wX2RldiksIEdGUF9LRVJORUwpOworCQlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RldiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWRldikKIAkJCWJyZWFrOwotCQlpZihpbnNlcnRfZGV2aWNlKGRldixub2RlKTwwKQorCQlpZiAoaW5zZXJ0X2RldmljZShkZXYsIG5vZGUpIDwgMCkKIAkJCWtmcmVlKGRldik7CiAJCWVsc2UKIAkJCWRldnMrKzsKIAkJaWYgKG5vZGVudW0gPD0gdGhpc25vZGVudW0pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogYnVpbGRfZGV2bGlzdDogTm9kZSBudW1iZXIgMHgleCBpcyBvdXQgb2Ygc2VxdWVuY2UgZm9sbG93aW5nIG5vZGUgMHgleC4gQWJvcnRpbmcuXG4iLCAodW5zaWduZWQgaW50KW5vZGVudW0sICh1bnNpZ25lZCBpbnQpdGhpc25vZGVudW0pOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlBuUEJJT1M6IGJ1aWxkX2Rldmxpc3Q6IE5vZGUgbnVtYmVyIDB4JXggaXMgb3V0IG9mIHNlcXVlbmNlIGZvbGxvd2luZyBub2RlIDB4JXguIEFib3J0aW5nLlxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW5vZGVudW0sCisJCQkgICAgICAgKHVuc2lnbmVkIGludCl0aGlzbm9kZW51bSk7CiAJCQlicmVhazsKIAkJfQogCX0KIAlrZnJlZShub2RlKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlBuUEJJT1M6ICVpIG5vZGUlcyByZXBvcnRlZCBieSBQblAgQklPUzsgJWkgcmVjb3JkZWQgYnkgZHJpdmVyXG4iLAotCQlub2Rlc19nb3QsIG5vZGVzX2dvdCAhPSAxID8gInMiIDogIiIsIGRldnMpOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIlBuUEJJT1M6ICVpIG5vZGUlcyByZXBvcnRlZCBieSBQblAgQklPUzsgJWkgcmVjb3JkZWQgYnkgZHJpdmVyXG4iLAorCSAgICAgICBub2Rlc19nb3QsIG5vZGVzX2dvdCAhPSAxID8gInMiIDogIiIsIGRldnMpOwogfQogCiAvKgpAQCAtNDEyLDggKzQxNiw4IEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQgcG5wYmlvc19kaXNhYmxlZDsgLyogPSAwICovCi1pbnQgcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZzsgLyogPSAwICovCitzdGF0aWMgaW50IHBucGJpb3NfZGlzYWJsZWQ7CitpbnQgcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZzsKIAogI2lmbmRlZiBNT0RVTEUKIHN0YXRpYyBpbnQgX19pbml0IHBucGJpb3Nfc2V0dXAoY2hhciAqc3RyKQpAQCAtNDIyLDkgKzQyNiw5IEBACiAKIAl3aGlsZSAoKHN0ciAhPSBOVUxMKSAmJiAoKnN0ciAhPSAnXDAnKSkgewogCQlpZiAoc3RybmNtcChzdHIsICJvZmYiLCAzKSA9PSAwKQotCQkJcG5wYmlvc19kaXNhYmxlZD0xOworCQkJcG5wYmlvc19kaXNhYmxlZCA9IDE7CiAJCWlmIChzdHJuY21wKHN0ciwgIm9uIiwgMikgPT0gMCkKLQkJCXBucGJpb3NfZGlzYWJsZWQ9MDsKKwkJCXBucGJpb3NfZGlzYWJsZWQgPSAwOwogCQlpbnZlcnQgPSAoc3RybmNtcChzdHIsICJuby0iLCAzKSA9PSAwKTsKIAkJaWYgKGludmVydCkKIAkJCXN0ciArPSAzOwpAQCAtNDUzLDM1ICs0NTcsNDEgQEAKIAlwcmludGsoS0VSTl9JTkZPICJQblBCSU9TOiBTY2FubmluZyBzeXN0ZW0gZm9yIFBuUCBCSU9TIHN1cHBvcnQuLi5cbiIpOwogCiAJLyoKLSAJICogU2VhcmNoIHRoZSBkZWZpbmVkIGFyZWEgKDB4ZjAwMDAtMHhmZmZmMCkgZm9yIGEgdmFsaWQgUG5QIEJJT1MKKwkgKiBTZWFyY2ggdGhlIGRlZmluZWQgYXJlYSAoMHhmMDAwMC0weGZmZmYwKSBmb3IgYSB2YWxpZCBQblAgQklPUwogCSAqIHN0cnVjdHVyZSBhbmQsIGlmIG9uZSBpcyBmb3VuZCwgc2V0cyB1cCB0aGUgc2VsZWN0b3JzIGFuZAogCSAqIGVudHJ5IHBvaW50cwogCSAqLwotCWZvciAoY2hlY2sgPSAodW5pb24gcG5wX2Jpb3NfaW5zdGFsbF9zdHJ1Y3QgKikgX192YSgweGYwMDAwKTsKLQkgICAgIGNoZWNrIDwgKHVuaW9uIHBucF9iaW9zX2luc3RhbGxfc3RydWN0ICopIF9fdmEoMHhmZmZmMCk7CisJZm9yIChjaGVjayA9ICh1bmlvbiBwbnBfYmlvc19pbnN0YWxsX3N0cnVjdCAqKV9fdmEoMHhmMDAwMCk7CisJICAgICBjaGVjayA8ICh1bmlvbiBwbnBfYmlvc19pbnN0YWxsX3N0cnVjdCAqKV9fdmEoMHhmZmZmMCk7CiAJICAgICBjaGVjayA9ICh2b2lkICopY2hlY2sgKyAxNikgewogCQlpZiAoY2hlY2stPmZpZWxkcy5zaWduYXR1cmUgIT0gUE5QX1NJR05BVFVSRSkKIAkJCWNvbnRpbnVlOwotCQlwcmludGsoS0VSTl9JTkZPICJQblBCSU9TOiBGb3VuZCBQblAgQklPUyBpbnN0YWxsYXRpb24gc3RydWN0dXJlIGF0IDB4JXBcbiIsIGNoZWNrKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIlBuUEJJT1M6IEZvdW5kIFBuUCBCSU9TIGluc3RhbGxhdGlvbiBzdHJ1Y3R1cmUgYXQgMHglcFxuIiwKKwkJICAgICAgIGNoZWNrKTsKIAkJbGVuZ3RoID0gY2hlY2stPmZpZWxkcy5sZW5ndGg7CiAJCWlmICghbGVuZ3RoKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IGluc3RhbGxhdGlvbiBzdHJ1Y3R1cmUgaXMgaW52YWxpZCwgc2tpcHBpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlBuUEJJT1M6IGluc3RhbGxhdGlvbiBzdHJ1Y3R1cmUgaXMgaW52YWxpZCwgc2tpcHBpbmdcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJZm9yIChzdW0gPSAwLCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogCQkJc3VtICs9IGNoZWNrLT5jaGFyc1tpXTsKIAkJaWYgKHN1bSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiBpbnN0YWxsYXRpb24gc3RydWN0dXJlIGlzIGNvcnJ1cHRlZCwgc2tpcHBpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlBuUEJJT1M6IGluc3RhbGxhdGlvbiBzdHJ1Y3R1cmUgaXMgY29ycnVwdGVkLCBza2lwcGluZ1xuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoY2hlY2stPmZpZWxkcy52ZXJzaW9uIDwgMHgxMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUG5QQklPUzogUG5QIEJJT1MgdmVyc2lvbiAlZC4lZCBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJQblBCSU9TOiBQblAgQklPUyB2ZXJzaW9uICVkLiVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQkgICAgICAgY2hlY2stPmZpZWxkcy52ZXJzaW9uID4+IDQsCiAJCQkgICAgICAgY2hlY2stPmZpZWxkcy52ZXJzaW9uICYgMTUpOwogCQkJY29udGludWU7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUG5QQklPUzogUG5QIEJJT1MgdmVyc2lvbiAlZC4lZCwgZW50cnkgMHgleDoweCV4LCBkc2VnIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNoZWNrLT5maWVsZHMudmVyc2lvbiA+PiA0LCBjaGVjay0+ZmllbGRzLnZlcnNpb24gJiAxNSwKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIlBuUEJJT1M6IFBuUCBCSU9TIHZlcnNpb24gJWQuJWQsIGVudHJ5IDB4JXg6MHgleCwgZHNlZyAweCV4XG4iLAorCQkgICAgICAgY2hlY2stPmZpZWxkcy52ZXJzaW9uID4+IDQsIGNoZWNrLT5maWVsZHMudmVyc2lvbiAmIDE1LAogCQkgICAgICAgY2hlY2stPmZpZWxkcy5wbTE2Y3NlZywgY2hlY2stPmZpZWxkcy5wbTE2b2Zmc2V0LAogCQkgICAgICAgY2hlY2stPmZpZWxkcy5wbTE2ZHNlZyk7CiAJCXBucF9iaW9zX2luc3RhbGwgPSBjaGVjazsKQEAgLTQ5OSwyNSArNTA5LDI1IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBwbnBiaW9zX2RtaV90YWJsZVtdIF9faW5pdGRhdGEgPSB7Ci0JewkvKiBQblBCSU9TIEdQRiBvbiBib290ICovCi0JCS5jYWxsYmFjayA9IGV4cGxvZGluZ19wbnBfYmlvcywKLQkJLmlkZW50ID0gIkhpZ3JhZGVkIFAxNEgiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJBbWVyaWNhbiBNZWdhdHJlbmRzIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiMDcuMDBUIiksCi0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIaWdyYWRlZCIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQMTRIIiksCi0JCX0sCi0JfSwKLQl7CS8qIFBuUEJJT1MgR1BGIG9uIGJvb3QgKi8KLQkJLmNhbGxiYWNrID0gZXhwbG9kaW5nX3BucF9iaW9zLAotCQkuaWRlbnQgPSAiQVNVUyBQNFA4MDAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQNFA4MDAiKSwKLQkJfSwKLQl9LAotCXsgfQorCXsJCQkvKiBQblBCSU9TIEdQRiBvbiBib290ICovCisJIC5jYWxsYmFjayA9IGV4cGxvZGluZ19wbnBfYmlvcywKKwkgLmlkZW50ID0gIkhpZ3JhZGVkIFAxNEgiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIiksCisJCSAgICAgRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICIwNy4wMFQiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIaWdyYWRlZCIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUDE0SCIpLAorCQkgICAgIH0sCisJIH0sCisJewkJCS8qIFBuUEJJT1MgR1BGIG9uIGJvb3QgKi8KKwkgLmNhbGxiYWNrID0gZXhwbG9kaW5nX3BucF9iaW9zLAorCSAuaWRlbnQgPSAiQVNVUyBQNFA4MDAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSW5jLiIpLAorCQkgICAgIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlA0UDgwMCIpLAorCQkgICAgIH0sCisJIH0sCisJe30KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBucGJpb3NfaW5pdCh2b2lkKQpAQCAtNTMzLDE0ICs1NDMsMTMgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUG5QQklPUzogRGlzYWJsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0KICNpZmRlZiBDT05GSUdfUE5QQUNQSQogCWlmICghYWNwaV9kaXNhYmxlZCAmJiAhcG5wYWNwaV9kaXNhYmxlZCkgewogCQlwbnBiaW9zX2Rpc2FibGVkID0gMTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUG5QQklPUzogRGlzYWJsZWQgYnkgQUNQSSBQTlBcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSSAqLwogCiAJLyogc2NhbiB0aGUgc3lzdGVtIGZvciBwbnBiaW9zIHN1cHBvcnQgKi8KIAlpZiAoIXBucGJpb3NfcHJvYmVfc3lzdGVtKCkpCkBAIC01NTIsMTQgKzU2MSwxNiBAQAogCS8qIHJlYWQgdGhlIG5vZGUgaW5mbyAqLwogCXJldCA9IHBucF9iaW9zX2Rldl9ub2RlX2luZm8oJm5vZGVfaW5mbyk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFVuYWJsZSB0byBnZXQgbm9kZSBpbmZvLiAgQWJvcnRpbmcuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUG5QQklPUzogVW5hYmxlIHRvIGdldCBub2RlIGluZm8uICBBYm9ydGluZy5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIHJlZ2lzdGVyIHdpdGggdGhlIHBucCBsYXllciAqLwogCXJldCA9IHBucF9yZWdpc3Rlcl9wcm90b2NvbCgmcG5wYmlvc19wcm90b2NvbCk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFVuYWJsZSB0byByZWdpc3RlciBkcml2ZXIuICBBYm9ydGluZy5cbiIpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQblBCSU9TOiBVbmFibGUgdG8gcmVnaXN0ZXIgZHJpdmVyLiAgQWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcHJvYy5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKaW5kZXggODAyNzA3My4uOWM4YzA3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9wcm9jLmMKQEAgLTE4LDkgKzE4LDYgQEAKICAqIFRoZSBvdGhlciBmaWxlcyBhcmUgaHVtYW4tcmVhZGFibGUuCiAgKi8KIAotLy8jaW5jbHVkZSA8cGNtY2lhL2NvbmZpZy5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2tfY29tcGF0Lmg+Ci0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zNyw0MiArMzQsMzcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfcG5wX2Jvb3QgPSBOVUxMOwogCiBzdGF0aWMgaW50IHByb2NfcmVhZF9wbnBjb25maWcoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQorCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBucF9pc2FfY29uZmlnX3N0cnVjIHBucHM7CiAKIAlpZiAocG5wX2Jpb3NfaXNhcG5wX2NvbmZpZygmcG5wcykpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiBzbnByaW50ZihidWYsIGNvdW50LAotCQkic3RydWN0dXJlX3JldmlzaW9uICVkXG4iCi0JCSJudW1iZXJfb2ZfQ1NOcyAlZFxuIgotCQkiSVNBX3JlYWRfZGF0YV9wb3J0IDB4JXhcbiIsCi0JCXBucHMucmV2aXNpb24sCi0JCXBucHMubm9fY3NucywKLQkJcG5wcy5pc2FfcmRfZGF0YV9wb3J0Ci0JKTsKKwkJCSJzdHJ1Y3R1cmVfcmV2aXNpb24gJWRcbiIKKwkJCSJudW1iZXJfb2ZfQ1NOcyAlZFxuIgorCQkJIklTQV9yZWFkX2RhdGFfcG9ydCAweCV4XG4iLAorCQkJcG5wcy5yZXZpc2lvbiwgcG5wcy5ub19jc25zLCBwbnBzLmlzYV9yZF9kYXRhX3BvcnQpOwogfQogCiBzdGF0aWMgaW50IHByb2NfcmVhZF9lc2NkaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKKwkJCSAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGVzY2RfaW5mb19zdHJ1YyBlc2NkOwogCiAJaWYgKHBucF9iaW9zX2VzY2RfaW5mbygmZXNjZCkpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiBzbnByaW50ZihidWYsIGNvdW50LAotCQkibWluX0VTQ0Rfd3JpdGVfc2l6ZSAlZFxuIgotCQkiRVNDRF9zaXplICVkXG4iCi0JCSJOVlJBTV9iYXNlIDB4JXhcbiIsCi0JCWVzY2QubWluX2VzY2Rfd3JpdGVfc2l6ZSwKLQkJZXNjZC5lc2NkX3NpemUsCi0JCWVzY2QubnZfc3RvcmFnZV9iYXNlCi0JKTsKKwkJCSJtaW5fRVNDRF93cml0ZV9zaXplICVkXG4iCisJCQkiRVNDRF9zaXplICVkXG4iCisJCQkiTlZSQU1fYmFzZSAweCV4XG4iLAorCQkJZXNjZC5taW5fZXNjZF93cml0ZV9zaXplLAorCQkJZXNjZC5lc2NkX3NpemUsIGVzY2QubnZfc3RvcmFnZV9iYXNlKTsKIH0KIAogI2RlZmluZSBNQVhfU0FORV9FU0NEX1NJWkUgKDMyKjEwMjQpCiBzdGF0aWMgaW50IHByb2NfcmVhZF9lc2NkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCisJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGVzY2RfaW5mb19zdHJ1YyBlc2NkOwogCWNoYXIgKnRtcGJ1ZjsKQEAgLTgzLDMwICs3NSwzNiBAQAogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKGVzY2QuZXNjZF9zaXplID4gTUFYX1NBTkVfRVNDRF9TSVpFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogcHJvY19yZWFkX2VzY2Q6IEVTQ0Qgc2l6ZSByZXBvcnRlZCBieSBCSU9TIGVzY2RfaW5mbyBjYWxsIGlzIHRvbyBncmVhdFxuIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlBuUEJJT1M6IHByb2NfcmVhZF9lc2NkOiBFU0NEIHNpemUgcmVwb3J0ZWQgYnkgQklPUyBlc2NkX2luZm8gY2FsbCBpcyB0b28gZ3JlYXRcbiIpOwogCQlyZXR1cm4gLUVGQklHOwogCX0KIAogCXRtcGJ1ZiA9IGt6YWxsb2MoZXNjZC5lc2NkX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghdG1wYnVmKSByZXR1cm4gLUVOT01FTTsKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAocG5wX2Jpb3NfcmVhZF9lc2NkKHRtcGJ1ZiwgZXNjZC5udl9zdG9yYWdlX2Jhc2UpKSB7CiAJCWtmcmVlKHRtcGJ1Zik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWVzY2Rfc2l6ZSA9ICh1bnNpZ25lZCBjaGFyKSh0bXBidWZbMF0pICsgKHVuc2lnbmVkIGNoYXIpKHRtcGJ1ZlsxXSkqMjU2OworCWVzY2Rfc2l6ZSA9CisJICAgICh1bnNpZ25lZCBjaGFyKSh0bXBidWZbMF0pICsgKHVuc2lnbmVkIGNoYXIpKHRtcGJ1ZlsxXSkgKiAyNTY7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoZXNjZF9zaXplID4gTUFYX1NBTkVfRVNDRF9TSVpFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogcHJvY19yZWFkX2VzY2Q6IEVTQ0Qgc2l6ZSByZXBvcnRlZCBieSBCSU9TIHJlYWRfZXNjZCBjYWxsIGlzIHRvbyBncmVhdFxuIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlBuUEJJT1M6IHByb2NfcmVhZF9lc2NkOiBFU0NEIHNpemUgcmVwb3J0ZWQgYnkgQklPUyByZWFkX2VzY2QgY2FsbCBpcyB0b28gZ3JlYXRcbiIpOwogCQlyZXR1cm4gLUVGQklHOwogCX0KIAogCWVzY2RfbGVmdF90b19yZWFkID0gZXNjZF9zaXplIC0gcG9zOwotCWlmIChlc2NkX2xlZnRfdG9fcmVhZCA8IDApIGVzY2RfbGVmdF90b19yZWFkID0gMDsKLQlpZiAoZXNjZF9sZWZ0X3RvX3JlYWQgPT0gMCkgKmVvZiA9IDE7Ci0JbiA9IG1pbihjb3VudCxlc2NkX2xlZnRfdG9fcmVhZCk7CisJaWYgKGVzY2RfbGVmdF90b19yZWFkIDwgMCkKKwkJZXNjZF9sZWZ0X3RvX3JlYWQgPSAwOworCWlmIChlc2NkX2xlZnRfdG9fcmVhZCA9PSAwKQorCQkqZW9mID0gMTsKKwluID0gbWluKGNvdW50LCBlc2NkX2xlZnRfdG9fcmVhZCk7CiAJbWVtY3B5KGJ1ZiwgdG1wYnVmICsgcG9zLCBuKTsKIAlrZnJlZSh0bXBidWYpOwogCSpzdGFydCA9IGJ1ZjsKQEAgLTExNCwxNyArMTEyLDE3IEBACiB9CiAKIHN0YXRpYyBpbnQgcHJvY19yZWFkX2xlZ2FjeXJlcyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCisJCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAkvKiBBc3N1bWUgdGhhdCB0aGUgZm9sbG93aW5nIHdvbid0IG92ZXJmbG93IHRoZSBidWZmZXIgKi8KLQlpZiAocG5wX2Jpb3NfZ2V0X3N0YXRfcmVzKGJ1ZikpIAorCWlmIChwbnBfYmlvc19nZXRfc3RhdF9yZXMoYnVmKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlyZXR1cm4gY291bnQ7ICAvLyBGSVhNRTogUmV0dXJuIGFjdHVhbCBsZW5ndGgKKwlyZXR1cm4gY291bnQ7CQkvLyBGSVhNRTogUmV0dXJuIGFjdHVhbCBsZW5ndGgKIH0KIAogc3RhdGljIGludCBwcm9jX3JlYWRfZGV2aWNlcyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQorCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwbnBfYmlvc19ub2RlICpub2RlOwogCXU4IG5vZGVudW07CkBAIC0xMzQsOSArMTMyLDEwIEBACiAJCXJldHVybiAwOwogCiAJbm9kZSA9IGt6YWxsb2Mobm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghbm9kZSkgcmV0dXJuIC1FTk9NRU07CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAobm9kZW51bT1wb3M7IG5vZGVudW08MHhmZjsgKSB7CisJZm9yIChub2RlbnVtID0gcG9zOyBub2RlbnVtIDwgMHhmZjspIHsKIAkJdTggdGhpc25vZGVudW0gPSBub2RlbnVtOwogCQkvKiAyNiA9IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgbGluZSBzcHJpbnRmJ2VkICovCiAJCWlmICgocCAtIGJ1ZiArIDI2KSA+IGNvdW50KQpAQCAtMTQ4LDcgKzE0NywxMSBAQAogCQkJICAgICBub2RlLT50eXBlX2NvZGVbMF0sIG5vZGUtPnR5cGVfY29kZVsxXSwKIAkJCSAgICAgbm9kZS0+dHlwZV9jb2RlWzJdLCBub2RlLT5mbGFncyk7CiAJCWlmIChub2RlbnVtIDw9IHRoaXNub2RlbnVtKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIE5vZGUgbnVtYmVyIDB4JXggaXMgb3V0IG9mIHNlcXVlbmNlIGZvbGxvd2luZyBub2RlIDB4JXguIEFib3J0aW5nLlxuIiwgIlBuUEJJT1M6IHByb2NfcmVhZF9kZXZpY2VzOiIsICh1bnNpZ25lZCBpbnQpbm9kZW51bSwgKHVuc2lnbmVkIGludCl0aGlzbm9kZW51bSk7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXMgTm9kZSBudW1iZXIgMHgleCBpcyBvdXQgb2Ygc2VxdWVuY2UgZm9sbG93aW5nIG5vZGUgMHgleC4gQWJvcnRpbmcuXG4iLAorCQkJICAgICAgICJQblBCSU9TOiBwcm9jX3JlYWRfZGV2aWNlczoiLAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpbm9kZW51bSwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KXRoaXNub2RlbnVtKTsKIAkJCSplb2YgPSAxOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1NiwxMiArMTU5LDEyIEBACiAJa2ZyZWUobm9kZSk7CiAJaWYgKG5vZGVudW0gPT0gMHhmZikKIAkJKmVvZiA9IDE7Ci0JKnN0YXJ0ID0gKGNoYXIgKikoKG9mZl90KW5vZGVudW0gLSBwb3MpOworCSpzdGFydCA9IChjaGFyICopKChvZmZfdCkgbm9kZW51bSAtIHBvcyk7CiAJcmV0dXJuIHAgLSBidWY7CiB9CiAKIHN0YXRpYyBpbnQgcHJvY19yZWFkX25vZGUoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKKwkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqbm9kZTsKIAlpbnQgYm9vdCA9IChsb25nKWRhdGEgPj4gODsKQEAgLTE2OSw3ICsxNzIsOCBAQAogCWludCBsZW47CiAKIAlub2RlID0ga3phbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFub2RlKSByZXR1cm4gLUVOT01FTTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5PTUVNOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIGJvb3QsIG5vZGUpKSB7CiAJCWtmcmVlKG5vZGUpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTE4MCw4ICsxODQsOCBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgcHJvY193cml0ZV9ub2RlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgcHJvY193cml0ZV9ub2RlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBucF9iaW9zX25vZGUgKm5vZGU7CiAJaW50IGJvb3QgPSAobG9uZylkYXRhID4+IDg7CkBAIC0yMDgsMTIgKzIxMiwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAJcmV0ID0gY291bnQ7Ci1vdXQ6CisgICAgICBvdXQ6CiAJa2ZyZWUobm9kZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHBucGJpb3NfaW50ZXJmYWNlX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlKQoraW50IHBucGJpb3NfaW50ZXJmYWNlX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBucF9iaW9zX25vZGUgKm5vZGUpCiB7CiAJY2hhciBuYW1lWzNdOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwpAQCAtMjIyLDcgKzIyNiw3IEBACiAKIAlpZiAoIXByb2NfcG5wKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAoICFwbnBiaW9zX2RvbnRfdXNlX2N1cnJlbnRfY29uZmlnICkgeworCWlmICghcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZykgewogCQllbnQgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCAwLCBwcm9jX3BucCk7CiAJCWlmIChlbnQpIHsKIAkJCWVudC0+cmVhZF9wcm9jID0gcHJvY19yZWFkX25vZGU7CkBAIC0yMzcsNyArMjQxLDcgQEAKIAlpZiAoZW50KSB7CiAJCWVudC0+cmVhZF9wcm9jID0gcHJvY19yZWFkX25vZGU7CiAJCWVudC0+d3JpdGVfcHJvYyA9IHByb2Nfd3JpdGVfbm9kZTsKLQkJZW50LT5kYXRhID0gKHZvaWQgKikobG9uZykobm9kZS0+aGFuZGxlKzB4MTAwKTsKKwkJZW50LT5kYXRhID0gKHZvaWQgKikobG9uZykobm9kZS0+aGFuZGxlICsgMHgxMDApOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI0OSw3ICsyNTMsNyBAQAogICogd29yayBhbmQgdGhlIHBucGJpb3NfZG9udF91c2VfY3VycmVudF9jb25maWcgZmxhZwogICogc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIHNldCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUKICAqLwotaW50IF9faW5pdCBwbnBiaW9zX3Byb2NfaW5pdCggdm9pZCApCitpbnQgX19pbml0IHBucGJpb3NfcHJvY19pbml0KHZvaWQpCiB7CiAJcHJvY19wbnAgPSBwcm9jX21rZGlyKCJwbnAiLCBwcm9jX2J1cyk7CiAJaWYgKCFwcm9jX3BucCkKQEAgLTI1OCwxMCArMjYyLDEzIEBACiAJaWYgKCFwcm9jX3BucF9ib290KQogCQlyZXR1cm4gLUVJTzsKIAljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJkZXZpY2VzIiwgMCwgcHJvY19wbnAsIHByb2NfcmVhZF9kZXZpY2VzLCBOVUxMKTsKLQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJjb25maWd1cmF0aW9uX2luZm8iLCAwLCBwcm9jX3BucCwgcHJvY19yZWFkX3BucGNvbmZpZywgTlVMTCk7Ci0JY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZXNjZF9pbmZvIiwgMCwgcHJvY19wbnAsIHByb2NfcmVhZF9lc2NkaW5mbywgTlVMTCk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiY29uZmlndXJhdGlvbl9pbmZvIiwgMCwgcHJvY19wbnAsCisJCQkgICAgICAgcHJvY19yZWFkX3BucGNvbmZpZywgTlVMTCk7CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZXNjZF9pbmZvIiwgMCwgcHJvY19wbnAsIHByb2NfcmVhZF9lc2NkaW5mbywKKwkJCSAgICAgICBOVUxMKTsKIAljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJlc2NkIiwgU19JUlVTUiwgcHJvY19wbnAsIHByb2NfcmVhZF9lc2NkLCBOVUxMKTsKLQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJsZWdhY3lfZGV2aWNlX3Jlc291cmNlcyIsIDAsIHByb2NfcG5wLCBwcm9jX3JlYWRfbGVnYWN5cmVzLCBOVUxMKTsKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJsZWdhY3lfZGV2aWNlX3Jlc291cmNlcyIsIDAsIHByb2NfcG5wLAorCQkJICAgICAgIHByb2NfcmVhZF9sZWdhY3lyZXMsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNzQsOSArMjgxLDkgQEAKIAlpZiAoIXByb2NfcG5wKQogCQlyZXR1cm47CiAKLQlmb3IgKGk9MDsgaTwweGZmOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMHhmZjsgaSsrKSB7CiAJCXNwcmludGYobmFtZSwgIiUwMngiLCBpKTsKLQkJaWYgKCAhcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZyApCisJCWlmICghcG5wYmlvc19kb250X3VzZV9jdXJyZW50X2NvbmZpZykKIAkJCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIHByb2NfcG5wKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkobmFtZSwgcHJvY19wbnBfYm9vdCk7CiAJfQpAQCAtMjg3LDYgKzI5NCw0IEBACiAJcmVtb3ZlX3Byb2NfZW50cnkoImRldmljZXMiLCBwcm9jX3BucCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImJvb3QiLCBwcm9jX3BucCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoInBucCIsIHByb2NfYnVzKTsKLQotCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYwppbmRleCAzYzJhYjgzOS4uMDRlY2Q3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYwpAQCAtMSw2ICsxLDUgQEAKIC8qCiAgKiByc3BhcnNlci5jIC0gcGFyc2VzIGFuZCBlbmNvZGVzIHBucGJpb3MgcmVzb3VyY2UgZGF0YSBzdHJlYW1zCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtMTIsOCArMTEsMTAgQEAKICNpZmRlZiBDT05GSUdfUENJCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjZWxzZQotaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpIHt9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLworaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCit7Cit9CisjZW5kaWYJCQkJLyogQ09ORklHX1BDSSAqLwogCiAjaW5jbHVkZSAicG5wYmlvcy5oIgogCkBAIC01Miw3NSArNTMsODggQEAKICAqIEFsbG9jYXRlZCBSZXNvdXJjZXMKICAqLwogCi1zdGF0aWMgdm9pZAotcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgaW50IGlycSkKK3N0YXRpYyB2b2lkIHBucGJpb3NfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKKwkJCQkJCWludCBpcnEpCiB7CiAJaW50IGkgPSAwOwotCXdoaWxlICghKHJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkgJiYgaSA8IFBOUF9NQVhfSVJRKSBpKys7CisKKwl3aGlsZSAoIShyZXMtPmlycV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpCisJICAgICAgICYmIGkgPCBQTlBfTUFYX0lSUSkKKwkJaSsrOwogCWlmIChpIDwgUE5QX01BWF9JUlEpIHsKLQkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsgIC8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCisJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CS8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCiAJCWlmIChpcnEgPT0gLTEpIHsKIAkJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KIAkJcmVzLT5pcnFfcmVzb3VyY2VbaV0uc3RhcnQgPQotCQlyZXMtPmlycV9yZXNvdXJjZVtpXS5lbmQgPSAodW5zaWduZWQgbG9uZykgaXJxOworCQkgICAgcmVzLT5pcnFfcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpaXJxOwogCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaXJxLCAxKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1wbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLCBpbnQgZG1hKQorc3RhdGljIHZvaWQgcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfZG1hcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLAorCQkJCQkJaW50IGRtYSkKIHsKIAlpbnQgaSA9IDA7CisKIAl3aGlsZSAoaSA8IFBOUF9NQVhfRE1BICYmCi0JCQkhKHJlcy0+ZG1hX3Jlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkpCisJICAgICAgICEocmVzLT5kbWFfcmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSkKIAkJaSsrOwogCWlmIChpIDwgUE5QX01BWF9ETUEpIHsKLQkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0RNQTsgIC8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCisJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9ETUE7CS8vIEFsc28gY2xlYXJzIF9VTlNFVCBmbGFnCiAJCWlmIChkbWEgPT0gLTEpIHsKIAkJCXJlcy0+ZG1hX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KIAkJcmVzLT5kbWFfcmVzb3VyY2VbaV0uc3RhcnQgPQotCQlyZXMtPmRtYV9yZXNvdXJjZVtpXS5lbmQgPSAodW5zaWduZWQgbG9uZykgZG1hOworCQkgICAgcmVzLT5kbWFfcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpZG1hOwogCX0KIH0KIAotc3RhdGljIHZvaWQKLXBucGJpb3NfcGFyc2VfYWxsb2NhdGVkX2lvcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgaW50IGlvLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfaW9yZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMsCisJCQkJCSAgICAgICBpbnQgaW8sIGludCBsZW4pCiB7CiAJaW50IGkgPSAwOwotCXdoaWxlICghKHJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmIGkgPCBQTlBfTUFYX1BPUlQpIGkrKzsKKworCXdoaWxlICghKHJlcy0+cG9ydF9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpCisJICAgICAgICYmIGkgPCBQTlBfTUFYX1BPUlQpCisJCWkrKzsKIAlpZiAoaSA8IFBOUF9NQVhfUE9SVCkgewotCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOyAgLy8gQWxzbyBjbGVhcnMgX1VOU0VUIGZsYWcKLQkJaWYgKGxlbiA8PSAwIHx8IChpbyArIGxlbiAtMSkgPj0gMHgxMDAwMykgeworCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwkvLyBBbHNvIGNsZWFycyBfVU5TRVQgZmxhZworCQlpZiAobGVuIDw9IDAgfHwgKGlvICsgbGVuIC0gMSkgPj0gMHgxMDAwMykgewogCQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGlvOworCQlyZXMtPnBvcnRfcmVzb3VyY2VbaV0uc3RhcnQgPSAodW5zaWduZWQgbG9uZylpbzsKIAkJcmVzLT5wb3J0X3Jlc291cmNlW2ldLmVuZCA9ICh1bnNpZ25lZCBsb25nKShpbyArIGxlbiAtIDEpOwogCX0KIH0KIAotc3RhdGljIHZvaWQKLXBucGJpb3NfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMsIGludCBtZW0sIGludCBsZW4pCitzdGF0aWMgdm9pZCBwbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMsCisJCQkJCQlpbnQgbWVtLCBpbnQgbGVuKQogewogCWludCBpID0gMDsKLQl3aGlsZSAoIShyZXMtPm1lbV9yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpICYmIGkgPCBQTlBfTUFYX01FTSkgaSsrOworCisJd2hpbGUgKCEocmVzLT5tZW1fcmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKQorCSAgICAgICAmJiBpIDwgUE5QX01BWF9NRU0pCisJCWkrKzsKIAlpZiAoaSA8IFBOUF9NQVhfTUVNKSB7Ci0JCXJlcy0+bWVtX3Jlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07ICAvLyBBbHNvIGNsZWFycyBfVU5TRVQgZmxhZworCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwkvLyBBbHNvIGNsZWFycyBfVU5TRVQgZmxhZwogCQlpZiAobGVuIDw9IDApIHsKIAkJCXJlcy0+bWVtX3Jlc291cmNlW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfRElTQUJMRUQ7CiAJCQlyZXR1cm47CiAJCX0KLQkJcmVzLT5tZW1fcmVzb3VyY2VbaV0uc3RhcnQgPSAodW5zaWduZWQgbG9uZykgbWVtOworCQlyZXMtPm1lbV9yZXNvdXJjZVtpXS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKW1lbTsKIAkJcmVzLT5tZW1fcmVzb3VyY2VbaV0uZW5kID0gKHVuc2lnbmVkIGxvbmcpKG1lbSArIGxlbiAtIDEpOwogCX0KIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2VfZGF0YSh1bnNpZ25lZCBjaGFyICogcCwgdW5zaWduZWQgY2hhciAqIGVuZCwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcykKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9yZXNvdXJjZV9kYXRhKHVuc2lnbmVkIGNoYXIgKnAsCisJCQkJCQkJICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKwkJCQkJCQkgICAgc3RydWN0CisJCQkJCQkJICAgIHBucF9yZXNvdXJjZV90YWJsZQorCQkJCQkJCSAgICAqcmVzKQogewogCXVuc2lnbmVkIGludCBsZW4sIHRhZzsKIAlpbnQgaW8sIHNpemUsIG1hc2ssIGk7CkBAIC0xMzQsMTIgKzE0OCwxMiBAQAogCXdoaWxlICgoY2hhciAqKXAgPCAoY2hhciAqKWVuZCkgewogCiAJCS8qIGRldGVybWluZSB0aGUgdHlwZSBvZiB0YWcgKi8KLQkJaWYgKHBbMF0gJiBMQVJHRV9UQUcpIHsgLyogbGFyZ2UgdGFnICovCisJCWlmIChwWzBdICYgTEFSR0VfVEFHKSB7CS8qIGxhcmdlIHRhZyAqLwogCQkJbGVuID0gKHBbMl0gPDwgOCkgfCBwWzFdOwogCQkJdGFnID0gcFswXTsKLQkJfSBlbHNlIHsgLyogc21hbGwgdGFnICovCisJCX0gZWxzZSB7CS8qIHNtYWxsIHRhZyAqLwogCQkJbGVuID0gcFswXSAmIDB4MDc7Ci0JCQl0YWcgPSAoKHBbMF0+PjMpICYgMHgwZik7CisJCQl0YWcgPSAoKHBbMF0gPj4gMykgJiAweDBmKTsKIAkJfQogCiAJCXN3aXRjaCAodGFnKSB7CkBAIC0xNDcsOCArMTYxLDggQEAKIAkJY2FzZSBMQVJHRV9UQUdfTUVNOgogCQkJaWYgKGxlbiAhPSA5KQogCQkJCWdvdG8gbGVuX2VycjsKLQkJCWlvID0gKihzaG9ydCAqKSAmcFs0XTsKLQkJCXNpemUgPSAqKHNob3J0ICopICZwWzEwXTsKKwkJCWlvID0gKihzaG9ydCAqKSZwWzRdOworCQkJc2l6ZSA9ICooc2hvcnQgKikmcFsxMF07CiAJCQlwbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXMsIGlvLCBzaXplKTsKIAkJCWJyZWFrOwogCkBAIC0xNjMsMTYgKzE3NywxNiBAQAogCQljYXNlIExBUkdFX1RBR19NRU0zMjoKIAkJCWlmIChsZW4gIT0gMTcpCiAJCQkJZ290byBsZW5fZXJyOwotCQkJaW8gPSAqKGludCAqKSAmcFs0XTsKLQkJCXNpemUgPSAqKGludCAqKSAmcFsxNl07CisJCQlpbyA9ICooaW50ICopJnBbNF07CisJCQlzaXplID0gKihpbnQgKikmcFsxNl07CiAJCQlwbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXMsIGlvLCBzaXplKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTEFSR0VfVEFHX0ZJWEVETUVNMzI6CiAJCQlpZiAobGVuICE9IDkpCiAJCQkJZ290byBsZW5fZXJyOwotCQkJaW8gPSAqKGludCAqKSAmcFs0XTsKLQkJCXNpemUgPSAqKGludCAqKSAmcFs4XTsKKwkJCWlvID0gKihpbnQgKikmcFs0XTsKKwkJCXNpemUgPSAqKGludCAqKSZwWzhdOwogCQkJcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzLCBpbywgc2l6ZSk7CiAJCQlicmVhazsKIApAQCAtMTgwLDkgKzE5NCwxMCBAQAogCQkJaWYgKGxlbiA8IDIgfHwgbGVuID4gMykKIAkJCQlnb3RvIGxlbl9lcnI7CiAJCQlpbyA9IC0xOwotCQkJbWFzaz0gcFsxXSArIHBbMl0qMjU2OwotCQkJZm9yIChpPTA7aTwxNjtpKyssIG1hc2s9bWFzaz4+MSkKLQkJCQlpZihtYXNrICYgMHgwMSkgaW89aTsKKwkJCW1hc2sgPSBwWzFdICsgcFsyXSAqIDI1NjsKKwkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCBtYXNrID0gbWFzayA+PiAxKQorCQkJCWlmIChtYXNrICYgMHgwMSkKKwkJCQkJaW8gPSBpOwogCQkJcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2UocmVzLCBpbyk7CiAJCQlicmVhazsKIApAQCAtMTkxLDE1ICsyMDYsMTYgQEAKIAkJCQlnb3RvIGxlbl9lcnI7CiAJCQlpbyA9IC0xOwogCQkJbWFzayA9IHBbMV07Ci0JCQlmb3IgKGk9MDtpPDg7aSsrLCBtYXNrID0gbWFzaz4+MSkKLQkJCQlpZihtYXNrICYgMHgwMSkgaW89aTsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIG1hc2sgPSBtYXNrID4+IDEpCisJCQkJaWYgKG1hc2sgJiAweDAxKQorCQkJCQlpbyA9IGk7CiAJCQlwbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9kbWFyZXNvdXJjZShyZXMsIGlvKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU01BTExfVEFHX1BPUlQ6CiAJCQlpZiAobGVuICE9IDcpCiAJCQkJZ290byBsZW5fZXJyOwotCQkJaW8gPSBwWzJdICsgcFszXSAqMjU2OworCQkJaW8gPSBwWzJdICsgcFszXSAqIDI1NjsKIAkJCXNpemUgPSBwWzddOwogCQkJcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfaW9yZXNvdXJjZShyZXMsIGlvLCBzaXplKTsKIAkJCWJyZWFrOwpAQCAtMjE4LDEyICsyMzQsMTQgQEAKIAogCQljYXNlIFNNQUxMX1RBR19FTkQ6CiAJCQlwID0gcCArIDI7Ci0gICAgICAgIAkJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopcDsKKwkJCXJldHVybiAodW5zaWduZWQgY2hhciAqKXA7CiAJCQlicmVhazsKIAotCQlkZWZhdWx0OiAvKiBhbiB1bmtvd24gdGFnICovCi0JCQlsZW5fZXJyOgotCQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiBVbmtub3duIHRhZyAnMHgleCcsIGxlbmd0aCAnJWQnLlxuIiwgdGFnLCBsZW4pOworCQlkZWZhdWx0OgkvKiBhbiB1bmtvd24gdGFnICovCisJCSAgICAgIGxlbl9lcnI6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiUG5QQklPUzogVW5rbm93biB0YWcgJzB4JXgnLCBsZW5ndGggJyVkJy5cbiIsCisJCQkgICAgICAgdGFnLCBsZW4pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjM0LDIwICsyNTIsMjEgQEAKIAkJCXAgKz0gbGVuICsgMTsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFJlc291cmNlIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIKKwkgICAgICAgIlBuUEJJT1M6IFJlc291cmNlIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKIAogCXJldHVybiBOVUxMOwogfQogCi0KIC8qCiAgKiBSZXNvdXJjZSBDb25maWd1cmF0aW9uIE9wdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZAotcG5wYmlvc19wYXJzZV9tZW1fb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLCBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQorc3RhdGljIHZvaWQgcG5wYmlvc19wYXJzZV9tZW1fb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLAorCQkJCSAgICAgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKLQlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKKwlzdHJ1Y3QgcG5wX21lbSAqbWVtOworCiAJbWVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwpAQCAtMjU2LDE0ICsyNzUsMTQgQEAKIAltZW0tPmFsaWduID0gKHBbOV0gPDwgOCkgfCBwWzhdOwogCW1lbS0+c2l6ZSA9ICgocFsxMV0gPDwgOCkgfCBwWzEwXSkgPDwgODsKIAltZW0tPmZsYWdzID0gcFszXTsKLQlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbixtZW0pOwotCXJldHVybjsKKwlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKIH0KIAotc3RhdGljIHZvaWQKLXBucGJpb3NfcGFyc2VfbWVtMzJfb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLCBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQorc3RhdGljIHZvaWQgcG5wYmlvc19wYXJzZV9tZW0zMl9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsCisJCQkJICAgICAgIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7Ci0Jc3RydWN0IHBucF9tZW0gKiBtZW07CisJc3RydWN0IHBucF9tZW0gKm1lbTsKKwogCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKQEAgLTI3MiwxNCArMjkxLDEzIEBACiAJbWVtLT5hbGlnbiA9IChwWzE1XSA8PCAyNCkgfCAocFsxNF0gPDwgMTYpIHwgKHBbMTNdIDw8IDgpIHwgcFsxMl07CiAJbWVtLT5zaXplID0gKHBbMTldIDw8IDI0KSB8IChwWzE4XSA8PCAxNikgfCAocFsxN10gPDwgOCkgfCBwWzE2XTsKIAltZW0tPmZsYWdzID0gcFszXTsKLQlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbixtZW0pOwotCXJldHVybjsKKwlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKIH0KIAotc3RhdGljIHZvaWQKLXBucGJpb3NfcGFyc2VfZml4ZWRfbWVtMzJfb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLCBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQorc3RhdGljIHZvaWQgcG5wYmlvc19wYXJzZV9maXhlZF9tZW0zMl9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsCisJCQkJCSAgICAgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKLQlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKKwlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKQEAgLTI4NywxNCArMzA1LDEzIEBACiAJbWVtLT5zaXplID0gKHBbMTFdIDw8IDI0KSB8IChwWzEwXSA8PCAxNikgfCAocFs5XSA8PCA4KSB8IHBbOF07CiAJbWVtLT5hbGlnbiA9IDA7CiAJbWVtLT5mbGFncyA9IHBbM107Ci0JcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sbWVtKTsKLQlyZXR1cm47CisJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sIG1lbSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1wbnBiaW9zX3BhcnNlX2lycV9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCitzdGF0aWMgdm9pZCBwbnBiaW9zX3BhcnNlX2lycV9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsCisJCQkJICAgICBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQogewotCXN0cnVjdCBwbnBfaXJxICogaXJxOworCXN0cnVjdCBwbnBfaXJxICppcnE7CiAJdW5zaWduZWQgbG9uZyBiaXRzOwogCiAJaXJxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKQEAgLTMwNiwyNyArMzIzLDI3IEBACiAJCWlycS0+ZmxhZ3MgPSBwWzNdOwogCWVsc2UKIAkJaXJxLT5mbGFncyA9IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFOwotCXBucF9yZWdpc3Rlcl9pcnFfcmVzb3VyY2Uob3B0aW9uLGlycSk7Ci0JcmV0dXJuOworCXBucF9yZWdpc3Rlcl9pcnFfcmVzb3VyY2Uob3B0aW9uLCBpcnEpOwogfQogCi1zdGF0aWMgdm9pZAotcG5wYmlvc19wYXJzZV9kbWFfb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLCBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQorc3RhdGljIHZvaWQgcG5wYmlvc19wYXJzZV9kbWFfb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLAorCQkJCSAgICAgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKLQlzdHJ1Y3QgcG5wX2RtYSAqIGRtYTsKKwlzdHJ1Y3QgcG5wX2RtYSAqZG1hOworCiAJZG1hID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kbWEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRtYSkKIAkJcmV0dXJuOwogCWRtYS0+bWFwID0gcFsxXTsKIAlkbWEtPmZsYWdzID0gcFsyXTsKLQlwbnBfcmVnaXN0ZXJfZG1hX3Jlc291cmNlKG9wdGlvbixkbWEpOwotCXJldHVybjsKKwlwbnBfcmVnaXN0ZXJfZG1hX3Jlc291cmNlKG9wdGlvbiwgZG1hKTsKIH0KIAotc3RhdGljIHZvaWQKLXBucGJpb3NfcGFyc2VfcG9ydF9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCitzdGF0aWMgdm9pZCBwbnBiaW9zX3BhcnNlX3BvcnRfb3B0aW9uKHVuc2lnbmVkIGNoYXIgKnAsIGludCBzaXplLAorCQkJCSAgICAgIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7Ci0Jc3RydWN0IHBucF9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQ7CisKIAlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CkBAIC0zMzUsMTQgKzM1MiwxNCBAQAogCXBvcnQtPmFsaWduID0gcFs2XTsKIAlwb3J0LT5zaXplID0gcFs3XTsKIAlwb3J0LT5mbGFncyA9IHBbMV0gPyBQTlBfUE9SVF9GTEFHXzE2QklUQUREUiA6IDA7Ci0JcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLHBvcnQpOwotCXJldHVybjsKKwlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24sIHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZAotcG5wYmlvc19wYXJzZV9maXhlZF9wb3J0X29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKK3N0YXRpYyB2b2lkIHBucGJpb3NfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsCisJCQkJCSAgICBzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uKQogewotCXN0cnVjdCBwbnBfcG9ydCAqIHBvcnQ7CisJc3RydWN0IHBucF9wb3J0ICpwb3J0OworCiAJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwpAQCAtMzUwLDEyICszNjcsMTIgQEAKIAlwb3J0LT5zaXplID0gcFszXTsKIAlwb3J0LT5hbGlnbiA9IDA7CiAJcG9ydC0+ZmxhZ3MgPSBQTlBfUE9SVF9GTEFHX0ZJWEVEOwotCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKG9wdGlvbixwb3J0KTsKLQlyZXR1cm47CisJcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLCBwb3J0KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcG5wYmlvc19wYXJzZV9yZXNvdXJjZV9vcHRpb25fZGF0YSh1bnNpZ25lZCBjaGFyICogcCwgdW5zaWduZWQgY2hhciAqIGVuZCwgc3RydWN0IHBucF9kZXYgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwbnBiaW9zX3BhcnNlX3Jlc291cmNlX29wdGlvbl9kYXRhKHVuc2lnbmVkIGNoYXIgKnAsCisJCQkJCQkJIHVuc2lnbmVkIGNoYXIgKmVuZCwKKwkJCQkJCQkgc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgbGVuLCB0YWc7CiAJaW50IHByaW9yaXR5ID0gMDsKQEAgLTM3MSwxMiArMzg4LDEyIEBACiAJd2hpbGUgKChjaGFyICopcCA8IChjaGFyICopZW5kKSB7CiAKIAkJLyogZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRhZyAqLwotCQlpZiAocFswXSAmIExBUkdFX1RBRykgeyAvKiBsYXJnZSB0YWcgKi8KKwkJaWYgKHBbMF0gJiBMQVJHRV9UQUcpIHsJLyogbGFyZ2UgdGFnICovCiAJCQlsZW4gPSAocFsyXSA8PCA4KSB8IHBbMV07CiAJCQl0YWcgPSBwWzBdOwotCQl9IGVsc2UgeyAvKiBzbWFsbCB0YWcgKi8KKwkJfSBlbHNlIHsJLyogc21hbGwgdGFnICovCiAJCQlsZW4gPSBwWzBdICYgMHgwNzsKLQkJCXRhZyA9ICgocFswXT4+MykgJiAweDBmKTsKKwkJCXRhZyA9ICgocFswXSA+PiAzKSAmIDB4MGYpOwogCQl9CiAKIAkJc3dpdGNoICh0YWcpIHsKQEAgLTQ0MiwxNiArNDU5LDE5IEBACiAJCQlpZiAobGVuICE9IDApCiAJCQkJZ290byBsZW5fZXJyOwogCQkJaWYgKG9wdGlvbl9pbmRlcGVuZGVudCA9PSBvcHRpb24pCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUG5QQklPUzogTWlzc2luZyBTTUFMTF9UQUdfU1RBUlRERVAgdGFnXG4iKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJQblBCSU9TOiBNaXNzaW5nIFNNQUxMX1RBR19TVEFSVERFUCB0YWdcbiIpOwogCQkJb3B0aW9uID0gb3B0aW9uX2luZGVwZW5kZW50OwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTTUFMTF9UQUdfRU5EOgotICAgICAgICAJCXJldHVybiBwICsgMjsKKwkJCXJldHVybiBwICsgMjsKIAotCQlkZWZhdWx0OiAvKiBhbiB1bmtvd24gdGFnICovCi0JCQlsZW5fZXJyOgotCQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiBVbmtub3duIHRhZyAnMHgleCcsIGxlbmd0aCAnJWQnLlxuIiwgdGFnLCBsZW4pOworCQlkZWZhdWx0OgkvKiBhbiB1bmtvd24gdGFnICovCisJCSAgICAgIGxlbl9lcnI6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiUG5QQklPUzogVW5rbm93biB0YWcgJzB4JXgnLCBsZW5ndGggJyVkJy5cbiIsCisJCQkgICAgICAgdGFnLCBsZW4pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDYyLDE5ICs0ODIsMTggQEAKIAkJCXAgKz0gbGVuICsgMTsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFJlc291cmNlIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIKKwkgICAgICAgIlBuUEJJT1M6IFJlc291cmNlIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKIAogCXJldHVybiBOVUxMOwogfQogCi0KIC8qCiAgKiBDb21wYXRpYmxlIERldmljZSBJRHMKICAqLwogCiAjZGVmaW5lIEhFWChpZCxhKSBoZXhbKChpZCk+PmEpICYgMTVdCiAjZGVmaW5lIENIQVIoaWQsYSkgKDB4NDAgKyAoKChpZCk+PmEpICYgMzEpKQotLy8KIAogdm9pZCBwbnBpZDMyX3RvX3BucGlkKHUzMiBpZCwgY2hhciAqc3RyKQogewpAQCAtNDgzLDIxICs1MDIsMjAgQEAKIAlpZCA9IGJlMzJfdG9fY3B1KGlkKTsKIAlzdHJbMF0gPSBDSEFSKGlkLCAyNik7CiAJc3RyWzFdID0gQ0hBUihpZCwgMjEpOwotCXN0clsyXSA9IENIQVIoaWQsMTYpOworCXN0clsyXSA9IENIQVIoaWQsIDE2KTsKIAlzdHJbM10gPSBIRVgoaWQsIDEyKTsKIAlzdHJbNF0gPSBIRVgoaWQsIDgpOwogCXN0cls1XSA9IEhFWChpZCwgNCk7CiAJc3RyWzZdID0gSEVYKGlkLCAwKTsKIAlzdHJbN10gPSAnXDAnOwotCi0JcmV0dXJuOwogfQotLy8KKwogI3VuZGVmIENIQVIKICN1bmRlZiBIRVgKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcG5wYmlvc19wYXJzZV9jb21wYXRpYmxlX2lkcyh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBjaGFyICplbmQsIHN0cnVjdCBwbnBfZGV2ICpkZXYpCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcG5wYmlvc19wYXJzZV9jb21wYXRpYmxlX2lkcyh1bnNpZ25lZCBjaGFyICpwLAorCQkJCQkJICAgdW5zaWduZWQgY2hhciAqZW5kLAorCQkJCQkJICAgc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlpbnQgbGVuLCB0YWc7CiAJY2hhciBpZFs4XTsKQEAgLTUwOSw0MCArNTI3LDQ1IEBACiAJd2hpbGUgKChjaGFyICopcCA8IChjaGFyICopZW5kKSB7CiAKIAkJLyogZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRhZyAqLwotCQlpZiAocFswXSAmIExBUkdFX1RBRykgeyAvKiBsYXJnZSB0YWcgKi8KKwkJaWYgKHBbMF0gJiBMQVJHRV9UQUcpIHsJLyogbGFyZ2UgdGFnICovCiAJCQlsZW4gPSAocFsyXSA8PCA4KSB8IHBbMV07CiAJCQl0YWcgPSBwWzBdOwotCQl9IGVsc2UgeyAvKiBzbWFsbCB0YWcgKi8KKwkJfSBlbHNlIHsJLyogc21hbGwgdGFnICovCiAJCQlsZW4gPSBwWzBdICYgMHgwNzsKLQkJCXRhZyA9ICgocFswXT4+MykgJiAweDBmKTsKKwkJCXRhZyA9ICgocFswXSA+PiAzKSAmIDB4MGYpOwogCQl9CiAKIAkJc3dpdGNoICh0YWcpIHsKIAogCQljYXNlIExBUkdFX1RBR19BTlNJU1RSOgotCQkJc3RybmNweShkZXYtPm5hbWUsIHAgKyAzLCBsZW4gPj0gUE5QX05BTUVfTEVOID8gUE5QX05BTUVfTEVOIC0gMiA6IGxlbik7Ci0JCQlkZXYtPm5hbWVbbGVuID49IFBOUF9OQU1FX0xFTiA/IFBOUF9OQU1FX0xFTiAtIDEgOiBsZW5dID0gJ1wwJzsKKwkJCXN0cm5jcHkoZGV2LT5uYW1lLCBwICsgMywKKwkJCQlsZW4gPj0gUE5QX05BTUVfTEVOID8gUE5QX05BTUVfTEVOIC0gMiA6IGxlbik7CisJCQlkZXYtPm5hbWVbbGVuID49CisJCQkJICBQTlBfTkFNRV9MRU4gPyBQTlBfTkFNRV9MRU4gLSAxIDogbGVuXSA9ICdcMCc7CiAJCQlicmVhazsKIAotCQljYXNlIFNNQUxMX1RBR19DT01QQVRERVZJRDogLyogY29tcGF0aWJsZSBJRCAqLworCQljYXNlIFNNQUxMX1RBR19DT01QQVRERVZJRDoJLyogY29tcGF0aWJsZSBJRCAqLwogCQkJaWYgKGxlbiAhPSA0KQogCQkJCWdvdG8gbGVuX2VycjsKLQkJCWRldl9pZCA9ICBremFsbG9jKHNpemVvZiAoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOworCQkJZGV2X2lkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFkZXZfaWQpCiAJCQkJcmV0dXJuIE5VTEw7Ci0JCQlwbnBpZDMyX3RvX3BucGlkKHBbMV0gfCBwWzJdIDw8IDggfCBwWzNdIDw8IDE2IHwgcFs0XSA8PCAyNCxpZCk7CisJCQlwbnBpZDMyX3RvX3BucGlkKHBbMV0gfCBwWzJdIDw8IDggfCBwWzNdIDw8IDE2IHwgcFs0XSA8PAorCQkJCQkgMjQsIGlkKTsKIAkJCW1lbWNweSgmZGV2X2lkLT5pZCwgaWQsIDcpOwogCQkJcG5wX2FkZF9pZChkZXZfaWQsIGRldik7CiAJCQlicmVhazsKIAogCQljYXNlIFNNQUxMX1RBR19FTkQ6CiAJCQlwID0gcCArIDI7Ci0gICAgICAgIAkJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopcDsKKwkJCXJldHVybiAodW5zaWduZWQgY2hhciAqKXA7CiAJCQlicmVhazsKIAotCQlkZWZhdWx0OiAvKiBhbiB1bmtvd24gdGFnICovCi0JCQlsZW5fZXJyOgotCQkJcHJpbnRrKEtFUk5fRVJSICJQblBCSU9TOiBVbmtub3duIHRhZyAnMHgleCcsIGxlbmd0aCAnJWQnLlxuIiwgdGFnLCBsZW4pOworCQlkZWZhdWx0OgkvKiBhbiB1bmtvd24gdGFnICovCisJCSAgICAgIGxlbl9lcnI6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiUG5QQklPUzogVW5rbm93biB0YWcgJzB4JXgnLCBsZW5ndGggJyVkJy5cbiIsCisJCQkgICAgICAgdGFnLCBsZW4pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTUzLDMzICs1NzYsMzQgQEAKIAkJCXAgKz0gbGVuICsgMTsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFJlc291cmNlIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIKKwkgICAgICAgIlBuUEJJT1M6IFJlc291cmNlIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGVuZCB0YWcuXG4iKTsKIAogCXJldHVybiBOVUxMOwogfQogCi0KIC8qCiAgKiBBbGxvY2F0ZWQgUmVzb3VyY2UgRW5jb2RpbmcKICAqLwogCi1zdGF0aWMgdm9pZCBwbnBiaW9zX2VuY29kZV9tZW0odW5zaWduZWQgY2hhciAqcCwgc3RydWN0IHJlc291cmNlICogcmVzKQorc3RhdGljIHZvaWQgcG5wYmlvc19lbmNvZGVfbWVtKHVuc2lnbmVkIGNoYXIgKnAsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCXVuc2lnbmVkIGxvbmcgYmFzZSA9IHJlcy0+c3RhcnQ7CiAJdW5zaWduZWQgbG9uZyBsZW4gPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCiAJcFs0XSA9IChiYXNlID4+IDgpICYgMHhmZjsKIAlwWzVdID0gKChiYXNlID4+IDgpID4+IDgpICYgMHhmZjsKIAlwWzZdID0gKGJhc2UgPj4gOCkgJiAweGZmOwogCXBbN10gPSAoKGJhc2UgPj4gOCkgPj4gOCkgJiAweGZmOwogCXBbMTBdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CiAJcFsxMV0gPSAoKGxlbiA+PiA4KSA+PiA4KSAmIDB4ZmY7Ci0JcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBwbnBiaW9zX2VuY29kZV9tZW0zMih1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgcmVzb3VyY2UgKiByZXMpCitzdGF0aWMgdm9pZCBwbnBiaW9zX2VuY29kZV9tZW0zMih1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAl1bnNpZ25lZCBsb25nIGJhc2UgPSByZXMtPnN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwogCXBbNF0gPSBiYXNlICYgMHhmZjsKIAlwWzVdID0gKGJhc2UgPj4gOCkgJiAweGZmOwogCXBbNl0gPSAoYmFzZSA+PiAxNikgJiAweGZmOwpAQCAtNTkyLDEyICs2MTYsMTMgQEAKIAlwWzE3XSA9IChsZW4gPj4gOCkgJiAweGZmOwogCXBbMThdID0gKGxlbiA+PiAxNikgJiAweGZmOwogCXBbMTldID0gKGxlbiA+PiAyNCkgJiAweGZmOwotCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgcG5wYmlvc19lbmNvZGVfZml4ZWRfbWVtMzIodW5zaWduZWQgY2hhciAqcCwgc3RydWN0IHJlc291cmNlICogcmVzKQotewl1bnNpZ25lZCBsb25nIGJhc2UgPSByZXMtPnN0YXJ0Oworc3RhdGljIHZvaWQgcG5wYmlvc19lbmNvZGVfZml4ZWRfbWVtMzIodW5zaWduZWQgY2hhciAqcCwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gcmVzLT5zdGFydDsKIAl1bnNpZ25lZCBsb25nIGxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisKIAlwWzRdID0gYmFzZSAmIDB4ZmY7CiAJcFs1XSA9IChiYXNlID4+IDgpICYgMHhmZjsKIAlwWzZdID0gKGJhc2UgPj4gMTYpICYgMHhmZjsKQEAgLTYwNiw1MCArNjMxLDUyIEBACiAJcFs5XSA9IChsZW4gPj4gOCkgJiAweGZmOwogCXBbMTBdID0gKGxlbiA+PiAxNikgJiAweGZmOwogCXBbMTFdID0gKGxlbiA+PiAyNCkgJiAweGZmOwotCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgcG5wYmlvc19lbmNvZGVfaXJxKHVuc2lnbmVkIGNoYXIgKnAsIHN0cnVjdCByZXNvdXJjZSAqIHJlcykKK3N0YXRpYyB2b2lkIHBucGJpb3NfZW5jb2RlX2lycSh1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAl1bnNpZ25lZCBsb25nIG1hcCA9IDA7CisKIAltYXAgPSAxIDw8IHJlcy0+c3RhcnQ7CiAJcFsxXSA9IG1hcCAmIDB4ZmY7CiAJcFsyXSA9IChtYXAgPj4gOCkgJiAweGZmOwotCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgcG5wYmlvc19lbmNvZGVfZG1hKHVuc2lnbmVkIGNoYXIgKnAsIHN0cnVjdCByZXNvdXJjZSAqIHJlcykKK3N0YXRpYyB2b2lkIHBucGJpb3NfZW5jb2RlX2RtYSh1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAl1bnNpZ25lZCBsb25nIG1hcCA9IDA7CisKIAltYXAgPSAxIDw8IHJlcy0+c3RhcnQ7CiAJcFsxXSA9IG1hcCAmIDB4ZmY7Ci0JcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBwbnBiaW9zX2VuY29kZV9wb3J0KHVuc2lnbmVkIGNoYXIgKnAsIHN0cnVjdCByZXNvdXJjZSAqIHJlcykKK3N0YXRpYyB2b2lkIHBucGJpb3NfZW5jb2RlX3BvcnQodW5zaWduZWQgY2hhciAqcCwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcmVzLT5zdGFydDsKIAl1bnNpZ25lZCBsb25nIGxlbiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisKIAlwWzJdID0gYmFzZSAmIDB4ZmY7CiAJcFszXSA9IChiYXNlID4+IDgpICYgMHhmZjsKIAlwWzRdID0gYmFzZSAmIDB4ZmY7CiAJcFs1XSA9IChiYXNlID4+IDgpICYgMHhmZjsKIAlwWzddID0gbGVuICYgMHhmZjsKLQlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIHBucGJpb3NfZW5jb2RlX2ZpeGVkX3BvcnQodW5zaWduZWQgY2hhciAqcCwgc3RydWN0IHJlc291cmNlICogcmVzKQorc3RhdGljIHZvaWQgcG5wYmlvc19lbmNvZGVfZml4ZWRfcG9ydCh1bnNpZ25lZCBjaGFyICpwLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAl1bnNpZ25lZCBsb25nIGJhc2UgPSByZXMtPnN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwogCXBbMV0gPSBiYXNlICYgMHhmZjsKIAlwWzJdID0gKGJhc2UgPj4gOCkgJiAweGZmOwogCXBbM10gPSBsZW4gJiAweGZmOwotCXJldHVybjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcG5wYmlvc19lbmNvZGVfYWxsb2NhdGVkX3Jlc291cmNlX2RhdGEodW5zaWduZWQgY2hhciAqIHAsIHVuc2lnbmVkIGNoYXIgKiBlbmQsIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMpCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcG5wYmlvc19lbmNvZGVfYWxsb2NhdGVkX3Jlc291cmNlX2RhdGEodW5zaWduZWQgY2hhciAqcCwKKwkJCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKwkJCQkJCQkgICAgIHN0cnVjdAorCQkJCQkJCSAgICAgcG5wX3Jlc291cmNlX3RhYmxlCisJCQkJCQkJICAgICAqcmVzKQogewogCXVuc2lnbmVkIGludCBsZW4sIHRhZzsKIAlpbnQgcG9ydCA9IDAsIGlycSA9IDAsIGRtYSA9IDAsIG1lbSA9IDA7CkBAIC02NjAsMTIgKzY4NywxMiBAQAogCXdoaWxlICgoY2hhciAqKXAgPCAoY2hhciAqKWVuZCkgewogCiAJCS8qIGRldGVybWluZSB0aGUgdHlwZSBvZiB0YWcgKi8KLQkJaWYgKHBbMF0gJiBMQVJHRV9UQUcpIHsgLyogbGFyZ2UgdGFnICovCisJCWlmIChwWzBdICYgTEFSR0VfVEFHKSB7CS8qIGxhcmdlIHRhZyAqLwogCQkJbGVuID0gKHBbMl0gPDwgOCkgfCBwWzFdOwogCQkJdGFnID0gcFswXTsKLQkJfSBlbHNlIHsgLyogc21hbGwgdGFnICovCisJCX0gZWxzZSB7CS8qIHNtYWxsIHRhZyAqLwogCQkJbGVuID0gcFswXSAmIDB4MDc7Ci0JCQl0YWcgPSAoKHBbMF0+PjMpICYgMHgwZik7CisJCQl0YWcgPSAoKHBbMF0gPj4gMykgJiAweDBmKTsKIAkJfQogCiAJCXN3aXRjaCAodGFnKSB7CkBAIC03MjUsMTIgKzc1MiwxNCBAQAogCiAJCWNhc2UgU01BTExfVEFHX0VORDoKIAkJCXAgPSBwICsgMjsKLSAgICAgICAgCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKilwOworCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyICopcDsKIAkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6IC8qIGFuIHVua293biB0YWcgKi8KLQkJCWxlbl9lcnI6Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBuUEJJT1M6IFVua25vd24gdGFnICcweCV4JywgbGVuZ3RoICclZCcuXG4iLCB0YWcsIGxlbik7CisJCWRlZmF1bHQ6CS8qIGFuIHVua293biB0YWcgKi8KKwkJICAgICAgbGVuX2VycjoKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJQblBCSU9TOiBVbmtub3duIHRhZyAnMHgleCcsIGxlbmd0aCAnJWQnLlxuIiwKKwkJCSAgICAgICB0YWcsIGxlbik7CiAJCQlicmVhazsKIAkJfQogCkBAIC03NDEsNTIgKzc3MCw1MiBAQAogCQkJcCArPSBsZW4gKyAxOwogCX0KIAotCXByaW50ayhLRVJOX0VSUiAiUG5QQklPUzogUmVzb3VyY2Ugc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW4gZW5kIHRhZy5cbiIpOworCXByaW50ayhLRVJOX0VSUgorCSAgICAgICAiUG5QQklPUzogUmVzb3VyY2Ugc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW4gZW5kIHRhZy5cbiIpOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLQogLyoKICAqIENvcmUgUGFyc2luZyBGdW5jdGlvbnMKICAqLwogCi1pbnQKLXBucGJpb3NfcGFyc2VfZGF0YV9zdHJlYW0oc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlKQoraW50IHBucGJpb3NfcGFyc2VfZGF0YV9zdHJlYW0oc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHBucF9iaW9zX25vZGUgKm5vZGUpCiB7Ci0JdW5zaWduZWQgY2hhciAqIHAgPSAoY2hhciAqKW5vZGUtPmRhdGE7Ci0JdW5zaWduZWQgY2hhciAqIGVuZCA9IChjaGFyICopKG5vZGUtPmRhdGEgKyBub2RlLT5zaXplKTsKLQlwID0gcG5wYmlvc19wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2VfZGF0YShwLGVuZCwmZGV2LT5yZXMpOworCXVuc2lnbmVkIGNoYXIgKnAgPSAoY2hhciAqKW5vZGUtPmRhdGE7CisJdW5zaWduZWQgY2hhciAqZW5kID0gKGNoYXIgKikobm9kZS0+ZGF0YSArIG5vZGUtPnNpemUpOworCisJcCA9IHBucGJpb3NfcGFyc2VfYWxsb2NhdGVkX3Jlc291cmNlX2RhdGEocCwgZW5kLCAmZGV2LT5yZXMpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FSU87Ci0JcCA9IHBucGJpb3NfcGFyc2VfcmVzb3VyY2Vfb3B0aW9uX2RhdGEocCxlbmQsZGV2KTsKKwlwID0gcG5wYmlvc19wYXJzZV9yZXNvdXJjZV9vcHRpb25fZGF0YShwLCBlbmQsIGRldik7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKLQlwID0gcG5wYmlvc19wYXJzZV9jb21wYXRpYmxlX2lkcyhwLGVuZCxkZXYpOworCXAgPSBwbnBiaW9zX3BhcnNlX2NvbXBhdGlibGVfaWRzKHAsIGVuZCwgZGV2KTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCi1pbnQKLXBucGJpb3NfcmVhZF9yZXNvdXJjZXNfZnJvbV9ub2RlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKLQkJCQkgc3RydWN0IHBucF9iaW9zX25vZGUgKiBub2RlKQoraW50IHBucGJpb3NfcmVhZF9yZXNvdXJjZXNfZnJvbV9ub2RlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKKwkJCQkgICAgIHN0cnVjdCBwbnBfYmlvc19ub2RlICpub2RlKQogewotCXVuc2lnbmVkIGNoYXIgKiBwID0gKGNoYXIgKilub2RlLT5kYXRhOwotCXVuc2lnbmVkIGNoYXIgKiBlbmQgPSAoY2hhciAqKShub2RlLT5kYXRhICsgbm9kZS0+c2l6ZSk7Ci0JcCA9IHBucGJpb3NfcGFyc2VfYWxsb2NhdGVkX3Jlc291cmNlX2RhdGEocCxlbmQscmVzKTsKKwl1bnNpZ25lZCBjaGFyICpwID0gKGNoYXIgKilub2RlLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgKmVuZCA9IChjaGFyICopKG5vZGUtPmRhdGEgKyBub2RlLT5zaXplKTsKKworCXAgPSBwbnBiaW9zX3BhcnNlX2FsbG9jYXRlZF9yZXNvdXJjZV9kYXRhKHAsIGVuZCwgcmVzKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCi1pbnQKLXBucGJpb3Nfd3JpdGVfcmVzb3VyY2VzX3RvX25vZGUoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLAotCQkJCXN0cnVjdCBwbnBfYmlvc19ub2RlICogbm9kZSkKK2ludCBwbnBiaW9zX3dyaXRlX3Jlc291cmNlc190b19ub2RlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKKwkJCQkgICAgc3RydWN0IHBucF9iaW9zX25vZGUgKm5vZGUpCiB7Ci0JdW5zaWduZWQgY2hhciAqIHAgPSAoY2hhciAqKW5vZGUtPmRhdGE7Ci0JdW5zaWduZWQgY2hhciAqIGVuZCA9IChjaGFyICopKG5vZGUtPmRhdGEgKyBub2RlLT5zaXplKTsKLQlwID0gcG5wYmlvc19lbmNvZGVfYWxsb2NhdGVkX3Jlc291cmNlX2RhdGEocCxlbmQscmVzKTsKKwl1bnNpZ25lZCBjaGFyICpwID0gKGNoYXIgKilub2RlLT5kYXRhOworCXVuc2lnbmVkIGNoYXIgKmVuZCA9IChjaGFyICopKG5vZGUtPmRhdGEgKyBub2RlLT5zaXplKTsKKworCXAgPSBwbnBiaW9zX2VuY29kZV9hbGxvY2F0ZWRfcmVzb3VyY2VfZGF0YShwLCBlbmQsIHJlcyk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3F1aXJrcy5jIGIvZHJpdmVycy9wbnAvcXVpcmtzLmMKaW5kZXggN2MzMjM2Ni4uOTA3NTVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wbnAvcXVpcmtzLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgImJhc2UuaCIKIAotCiBzdGF0aWMgdm9pZCBxdWlya19hd2UzMl9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQsICpwb3J0MiwgKnBvcnQzOwpAQCAtMzEsNyArMzAsNyBAQAogCSAqIHR3byBleHRyYSBwb3J0cyAoYXQgb2Zmc2V0IDB4NDAwIGFuZCAweDgwMCBmcm9tIHRoZSBvbmUgZ2l2ZW4pIGJ5CiAJICogaGFuZC4KIAkgKi8KLQlmb3IgKCA7IHJlcyA7IHJlcyA9IHJlcy0+bmV4dCApIHsKKwlmb3IgKDsgcmVzOyByZXMgPSByZXMtPm5leHQpIHsKIAkJcG9ydDIgPSBwbnBfYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCkpOwogCQlpZiAoIXBvcnQyKQogCQkJcmV0dXJuOwpAQCAtNTgsMTggKzU3LDE5IEBACiAJc3RydWN0IHBucF9vcHRpb24gKnJlcyA9IGRldi0+ZGVwZW5kZW50OwogCXVuc2lnbmVkIGxvbmcgdG1wOwogCi0JZm9yICggOyByZXMgOyByZXMgPSByZXMtPm5leHQgKSB7CisJZm9yICg7IHJlczsgcmVzID0gcmVzLT5uZXh0KSB7CiAKIAkJc3RydWN0IHBucF9pcnEgKmlycTsKIAkJc3RydWN0IHBucF9kbWEgKmRtYTsKIAotCQlmb3IoIGlycSA9IHJlcy0+aXJxOyBpcnE7IGlycSA9IGlycS0+bmV4dCApIHsJLy8gVmFsaWQgaXJxcyBhcmUgNSwgNywgMTAKKwkJZm9yIChpcnEgPSByZXMtPmlycTsgaXJxOyBpcnEgPSBpcnEtPm5leHQpIHsJLy8gVmFsaWQgaXJxcyBhcmUgNSwgNywgMTAKIAkJCXRtcCA9IDB4MDRBMDsKIAkJCWJpdG1hcF9jb3B5KGlycS0+bWFwLCAmdG1wLCAxNik7CS8vIDAwMDAgMDEwMCAxMDEwIDAwMDAKIAkJfQogCi0JCWZvciggZG1hID0gcmVzLT5kbWE7IGRtYTsgZG1hID0gZG1hLT5uZXh0ICkgLy8gVmFsaWQgOGJpdCBkbWEgY2hhbm5lbHMgYXJlIDEsMwotCQkJaWYoICggZG1hLT5mbGFncyAmIElPUkVTT1VSQ0VfRE1BX1RZUEVfTUFTSyApID09IElPUkVTT1VSQ0VfRE1BXzhCSVQgKQorCQlmb3IgKGRtYSA9IHJlcy0+ZG1hOyBkbWE7IGRtYSA9IGRtYS0+bmV4dCkJLy8gVmFsaWQgOGJpdCBkbWEgY2hhbm5lbHMgYXJlIDEsMworCQkJaWYgKChkbWEtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfVFlQRV9NQVNLKSA9PQorCQkJICAgIElPUkVTT1VSQ0VfRE1BXzhCSVQpCiAJCQkJZG1hLT5tYXAgPSAweDAwMEE7CiAJfQogCXByaW50ayhLRVJOX0lORk8gInBucDogQ01JODMzMCBxdWlyayAtIGZpeGluZyBpbnRlcnJ1cHRzIGFuZCBkbWFcbiIpOwpAQCAtNzksNyArNzksNyBAQAogewogCXN0cnVjdCBwbnBfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgcG5wX29wdGlvbiAqcmVzID0gZGV2LT5kZXBlbmRlbnQ7Ci0JaW50ICAgIGNoYW5nZWQgPSAwOworCWludCBjaGFuZ2VkID0gMDsKIAogCS8qCiAJICogVGhlIGRlZmF1bHQgcmFuZ2Ugb24gdGhlIG1wdSBwb3J0IGZvciB0aGVzZSBkZXZpY2VzIGlzIDB4Mzg4LTB4Mzg4LgpAQCAtODcsMjQgKzg3LDI0IEBACiAJICogYXV0by1jb25maWd1cmVkLgogCSAqLwogCi0JZm9yKCA7IHJlcyA7IHJlcyA9IHJlcy0+bmV4dCApIHsKKwlmb3IgKDsgcmVzOyByZXMgPSByZXMtPm5leHQpIHsKIAkJcG9ydCA9IHJlcy0+cG9ydDsKLQkJaWYoIXBvcnQpCisJCWlmICghcG9ydCkKIAkJCWNvbnRpbnVlOwogCQlwb3J0ID0gcG9ydC0+bmV4dDsKLQkJaWYoIXBvcnQpCisJCWlmICghcG9ydCkKIAkJCWNvbnRpbnVlOwogCQlwb3J0ID0gcG9ydC0+bmV4dDsKLQkJaWYoIXBvcnQpCisJCWlmICghcG9ydCkKIAkJCWNvbnRpbnVlOwotCQlpZihwb3J0LT5taW4gIT0gcG9ydC0+bWF4KQorCQlpZiAocG9ydC0+bWluICE9IHBvcnQtPm1heCkKIAkJCWNvbnRpbnVlOwogCQlwb3J0LT5tYXggKz0gMHg3MDsKIAkJY2hhbmdlZCA9IDE7CiAJfQotCWlmKGNoYW5nZWQpCi0JCXByaW50ayhLRVJOX0lORk8gInBucDogU0IgYXVkaW8gZGV2aWNlIHF1aXJrIC0gaW5jcmVhc2luZyBwb3J0IHJhbmdlXG4iKTsKLQlyZXR1cm47CisJaWYgKGNoYW5nZWQpCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJwbnA6IFNCIGF1ZGlvIGRldmljZSBxdWlyayAtIGluY3JlYXNpbmcgcG9ydCByYW5nZVxuIik7CiB9CiAKIHN0YXRpYyBpbnQgcXVpcmtfc21jX2Zpcl9lbmFibGVkKHN0cnVjdCBwbnBfZGV2ICpkZXYpCkBAIC0xMjQsNyArMTI0LDcgQEAKIAlvdXRiKGJhbmssIGZpcmJhc2UgKyA3KTsKIAogCWhpZ2ggPSBpbmIoZmlyYmFzZSArIDApOwotCWxvdyAgPSBpbmIoZmlyYmFzZSArIDEpOworCWxvdyA9IGluYihmaXJiYXNlICsgMSk7CiAJY2hpcCA9IGluYihmaXJiYXNlICsgMik7CiAKIAkvKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBjaGVjayBpbiBzbXNjX2lyY2NfcHJlc2VudCgpICovCkBAIC0xNTMsOCArMTUzLDggQEAKIAkgKi8KIAlkZXZfZXJyKCZkZXYtPmRldiwgIiVzIG5vdCByZXNwb25kaW5nIGF0IFNJUiAweCVseCwgRklSIDB4JWx4OyAiCiAJCSJhdXRvLWNvbmZpZ3VyaW5nXG4iLCBkZXYtPmlkLT5pZCwKLQkJKHVuc2lnbmVkIGxvbmcpIHBucF9wb3J0X3N0YXJ0KGRldiwgMCksCi0JCSh1bnNpZ25lZCBsb25nKSBwbnBfcG9ydF9zdGFydChkZXYsIDEpKTsKKwkJKHVuc2lnbmVkIGxvbmcpcG5wX3BvcnRfc3RhcnQoZGV2LCAwKSwKKwkJKHVuc2lnbmVkIGxvbmcpcG5wX3BvcnRfc3RhcnQoZGV2LCAxKSk7CiAKIAlwbnBfZGlzYWJsZV9kZXYoZGV2KTsKIAlwbnBfaW5pdF9yZXNvdXJjZV90YWJsZSgmZGV2LT5yZXMpOwpAQCAtMTYyLDggKzE2Miw4IEBACiAJcG5wX2FjdGl2YXRlX2RldihkZXYpOwogCWlmIChxdWlya19zbWNfZmlyX2VuYWJsZWQoZGV2KSkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgInJlc3BvbmRzIGF0IFNJUiAweCVseCwgRklSIDB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpIHBucF9wb3J0X3N0YXJ0KGRldiwgMCksCi0JCQkodW5zaWduZWQgbG9uZykgcG5wX3BvcnRfc3RhcnQoZGV2LCAxKSk7CisJCQkodW5zaWduZWQgbG9uZylwbnBfcG9ydF9zdGFydChkZXYsIDApLAorCQkJKHVuc2lnbmVkIGxvbmcpcG5wX3BvcnRfc3RhcnQoZGV2LCAxKSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3NSw4ICsxNzUsOCBAQAogCSAqLwogCWRldl9lcnIoJmRldi0+ZGV2LCAibm90IHJlc3BvbmRpbmcgYXQgU0lSIDB4JWx4LCBGSVIgMHglbHg7ICIKIAkJInN3YXBwaW5nIFNJUi9GSVIgYW5kIHJlY29uZmlndXJpbmdcbiIsCi0JCSh1bnNpZ25lZCBsb25nKSBwbnBfcG9ydF9zdGFydChkZXYsIDApLAotCQkodW5zaWduZWQgbG9uZykgcG5wX3BvcnRfc3RhcnQoZGV2LCAxKSk7CisJCSh1bnNpZ25lZCBsb25nKXBucF9wb3J0X3N0YXJ0KGRldiwgMCksCisJCSh1bnNpZ25lZCBsb25nKXBucF9wb3J0X3N0YXJ0KGRldiwgMSkpOwogCiAJLyoKIAkgKiBDbGVhciBJT1JFU09VUkNFX0FVVE8gc28gcG5wX2FjdGl2YXRlX2RldigpIGRvZXNuJ3QgcmVhc3NpZ24KQEAgLTIwMCw4ICsyMDAsOCBAQAogCiAJaWYgKHF1aXJrX3NtY19maXJfZW5hYmxlZChkZXYpKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAicmVzcG9uZHMgYXQgU0lSIDB4JWx4LCBGSVIgMHglbHhcbiIsCi0JCQkodW5zaWduZWQgbG9uZykgcG5wX3BvcnRfc3RhcnQoZGV2LCAwKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBwbnBfcG9ydF9zdGFydChkZXYsIDEpKTsKKwkJCSh1bnNpZ25lZCBsb25nKXBucF9wb3J0X3N0YXJ0KGRldiwgMCksCisJCQkodW5zaWduZWQgbG9uZylwbnBfcG9ydF9zdGFydChkZXYsIDEpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjA5LDcgKzIwOSw2IEBACiAJCSJlbWFpbCBiam9ybi5oZWxnYWFzQGhwLmNvbVxuIik7CiB9CiAKLQogLyoKICAqICBQblAgUXVpcmtzCiAgKiAgQ2FyZHMgb3IgZGV2aWNlcyB0aGF0IG5lZWQgc29tZSB0d2Vha2luZyBkdWUgdG8gaW5jb21wbGV0ZSByZXNvdXJjZSBpbmZvCkBAIC0yMTcsMjEgKzIxNiwyMSBAQAogCiBzdGF0aWMgc3RydWN0IHBucF9maXh1cCBwbnBfZml4dXBzW10gPSB7CiAJLyogU291bmRibGFzdGVyIGF3ZSBpbyBwb3J0IHF1aXJrICovCi0JeyAiQ1RMMDAyMSIsIHF1aXJrX2F3ZTMyX3Jlc291cmNlcyB9LAotCXsgIkNUTDAwMjIiLCBxdWlya19hd2UzMl9yZXNvdXJjZXMgfSwKLQl7ICJDVEwwMDIzIiwgcXVpcmtfYXdlMzJfcmVzb3VyY2VzIH0sCisJeyJDVEwwMDIxIiwgcXVpcmtfYXdlMzJfcmVzb3VyY2VzfSwKKwl7IkNUTDAwMjIiLCBxdWlya19hd2UzMl9yZXNvdXJjZXN9LAorCXsiQ1RMMDAyMyIsIHF1aXJrX2F3ZTMyX3Jlc291cmNlc30sCiAJLyogQ01JIDgzMzAgaW50ZXJydXB0IGFuZCBkbWEgZml4ICovCi0JeyAiQFhAMDAwMSIsIHF1aXJrX2NtaTgzMzBfcmVzb3VyY2VzIH0sCisJeyJAWEAwMDAxIiwgcXVpcmtfY21pODMzMF9yZXNvdXJjZXN9LAogCS8qIFNvdW5kYmxhc3RlciBhdWRpbyBkZXZpY2UgaW8gcG9ydCByYW5nZSBxdWlyayAqLwotCXsgIkNUTDAwMDEiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzIH0sCi0JeyAiQ1RMMDAzMSIsIHF1aXJrX3NiMTZhdWRpb19yZXNvdXJjZXMgfSwKLQl7ICJDVEwwMDQxIiwgcXVpcmtfc2IxNmF1ZGlvX3Jlc291cmNlcyB9LAotCXsgIkNUTDAwNDIiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzIH0sCi0JeyAiQ1RMMDA0MyIsIHF1aXJrX3NiMTZhdWRpb19yZXNvdXJjZXMgfSwKLQl7ICJDVEwwMDQ0IiwgcXVpcmtfc2IxNmF1ZGlvX3Jlc291cmNlcyB9LAotCXsgIkNUTDAwNDUiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzIH0sCi0JeyAiU01DZjAxMCIsIHF1aXJrX3NtY19lbmFibGUgfSwKLQl7ICIiIH0KKwl7IkNUTDAwMDEiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IkNUTDAwMzEiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IkNUTDAwNDEiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IkNUTDAwNDIiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IkNUTDAwNDMiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IkNUTDAwNDQiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IkNUTDAwNDUiLCBxdWlya19zYjE2YXVkaW9fcmVzb3VyY2VzfSwKKwl7IlNNQ2YwMTAiLCBxdWlya19zbWNfZW5hYmxlfSwKKwl7IiJ9CiB9OwogCiB2b2lkIHBucF9maXh1cF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKQEAgLTIzOSw5ICsyMzgsOCBAQAogCWludCBpID0gMDsKIAogCXdoaWxlICgqcG5wX2ZpeHVwc1tpXS5pZCkgewotCQlpZiAoY29tcGFyZV9wbnBfaWQoZGV2LT5pZCxwbnBfZml4dXBzW2ldLmlkKSkgewotCQkJcG5wX2RiZygiQ2FsbGluZyBxdWlyayBmb3IgJXMiLAotCQkgICAgICAgICAgICAgICAgICBkZXYtPmRldi5idXNfaWQpOworCQlpZiAoY29tcGFyZV9wbnBfaWQoZGV2LT5pZCwgcG5wX2ZpeHVwc1tpXS5pZCkpIHsKKwkJCXBucF9kYmcoIkNhbGxpbmcgcXVpcmsgZm9yICVzIiwgZGV2LT5kZXYuYnVzX2lkKTsKIAkJCXBucF9maXh1cHNbaV0ucXVpcmtfZnVuY3Rpb24oZGV2KTsKIAkJfQogCQlpKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9yZXNvdXJjZS5jIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwppbmRleCBhNjg1ZmJlLi5lYTZlYzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKQEAgLTMsNyArMyw2IEBACiAgKgogICogYmFzZWQgb24gaXNhcG5wLmMgcmVzb3VyY2UgbWFuYWdlbWVudCAoYykgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgogICogQ29weXJpZ2h0IDIwMDMgQWRhbSBCZWxheSA8YW1ieDFAbmVvLnJyLmNvbT4KLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjAsMjEgKzE5LDE5IEBACiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCi1zdGF0aWMgaW50IHBucF9yZXNlcnZlX2lycVsxNl0gPSB7IFswIC4uLiAxNV0gPSAtMSB9OwkvKiByZXNlcnZlIChkb24ndCB1c2UpIHNvbWUgSVJRICovCi1zdGF0aWMgaW50IHBucF9yZXNlcnZlX2RtYVs4XSA9IHsgWzAgLi4uIDddID0gLTEgfTsJLyogcmVzZXJ2ZSAoZG9uJ3QgdXNlKSBzb21lIERNQSAqLwotc3RhdGljIGludCBwbnBfcmVzZXJ2ZV9pb1sxNl0gPSB7IFswIC4uLiAxNV0gPSAtMSB9OwkvKiByZXNlcnZlIChkb24ndCB1c2UpIHNvbWUgSS9PIHJlZ2lvbiAqLwotc3RhdGljIGludCBwbnBfcmVzZXJ2ZV9tZW1bMTZdID0geyBbMCAuLi4gMTVdID0gLTEgfTsJLyogcmVzZXJ2ZSAoZG9uJ3QgdXNlKSBzb21lIG1lbW9yeSByZWdpb24gKi8KLQorc3RhdGljIGludCBwbnBfcmVzZXJ2ZV9pcnFbMTZdID0ge1swIC4uLiAxNV0gPSAtMSB9OwkvKiByZXNlcnZlIChkb24ndCB1c2UpIHNvbWUgSVJRICovCitzdGF0aWMgaW50IHBucF9yZXNlcnZlX2RtYVs4XSA9IHtbMCAuLi4gN10gPSAtMSB9OwkvKiByZXNlcnZlIChkb24ndCB1c2UpIHNvbWUgRE1BICovCitzdGF0aWMgaW50IHBucF9yZXNlcnZlX2lvWzE2XSA9IHtbMCAuLi4gMTVdID0gLTEgfTsJLyogcmVzZXJ2ZSAoZG9uJ3QgdXNlKSBzb21lIEkvTyByZWdpb24gKi8KK3N0YXRpYyBpbnQgcG5wX3Jlc2VydmVfbWVtWzE2XSA9IHtbMCAuLi4gMTVdID0gLTEgfTsJLyogcmVzZXJ2ZSAoZG9uJ3QgdXNlKSBzb21lIG1lbW9yeSByZWdpb24gKi8KIAogLyoKICAqIG9wdGlvbiByZWdpc3RyYXRpb24KICAqLwogCi1zdGF0aWMgc3RydWN0IHBucF9vcHRpb24gKiBwbnBfYnVpbGRfb3B0aW9uKGludCBwcmlvcml0eSkKK3N0YXRpYyBzdHJ1Y3QgcG5wX29wdGlvbiAqcG5wX2J1aWxkX29wdGlvbihpbnQgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiA9IHBucF9hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9vcHRpb24pKTsKIAotCS8qIGNoZWNrIGlmIHBucF9hbGxvYyByYW4gb3V0IG9mIG1lbW9yeSAqLwogCWlmICghb3B0aW9uKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNDYsOSArNDMsMTAgQEAKIAlyZXR1cm4gb3B0aW9uOwogfQogCi1zdHJ1Y3QgcG5wX29wdGlvbiAqIHBucF9yZWdpc3Rlcl9pbmRlcGVuZGVudF9vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldikKK3N0cnVjdCBwbnBfb3B0aW9uICpwbnBfcmVnaXN0ZXJfaW5kZXBlbmRlbnRfb3B0aW9uKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbjsKKwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNjEsOSArNTksMTEgQEAKIAlyZXR1cm4gb3B0aW9uOwogfQogCi1zdHJ1Y3QgcG5wX29wdGlvbiAqIHBucF9yZWdpc3Rlcl9kZXBlbmRlbnRfb3B0aW9uKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGludCBwcmlvcml0eSkKK3N0cnVjdCBwbnBfb3B0aW9uICpwbnBfcmVnaXN0ZXJfZGVwZW5kZW50X29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2LAorCQkJCQkJIGludCBwcmlvcml0eSkKIHsKIAlzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uOworCiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwogCkBAIC04Miw2ICs4Miw3IEBACiBpbnQgcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgcG5wX2lycSAqZGF0YSkKIHsKIAlzdHJ1Y3QgcG5wX2lycSAqcHRyOworCiAJaWYgKCFvcHRpb24pCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghZGF0YSkKQEAgLTExMCw2ICsxMTEsNyBAQAogaW50IHBucF9yZWdpc3Rlcl9kbWFfcmVzb3VyY2Uoc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwgc3RydWN0IHBucF9kbWEgKmRhdGEpCiB7CiAJc3RydWN0IHBucF9kbWEgKnB0cjsKKwogCWlmICghb3B0aW9uKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWRhdGEpCkBAIC0xMjksNiArMTMxLDcgQEAKIGludCBwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgcG5wX3BvcnQgKmRhdGEpCiB7CiAJc3RydWN0IHBucF9wb3J0ICpwdHI7CisKIAlpZiAoIW9wdGlvbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFkYXRhKQpAQCAtMTQ4LDYgKzE1MSw3IEBACiBpbnQgcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgcG5wX21lbSAqZGF0YSkKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqcHRyOworCiAJaWYgKCFvcHRpb24pCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghZGF0YSkKQEAgLTIyMiw3ICsyMjYsNiBAQAogCX0KIH0KIAotCiAvKgogICogcmVzb3VyY2UgdmFsaWRpdHkgY2hlY2tpbmcKICAqLwpAQCAtMjM2LDExICsyMzksMTIgQEAKICNkZWZpbmUgY2Fubm90X2NvbXBhcmUoZmxhZ3MpIFwKICgoZmxhZ3MpICYgKElPUkVTT1VSQ0VfVU5TRVQgfCBJT1JFU09VUkNFX0RJU0FCTEVEKSkKIAotaW50IHBucF9jaGVja19wb3J0KHN0cnVjdCBwbnBfZGV2ICogZGV2LCBpbnQgaWR4KQoraW50IHBucF9jaGVja19wb3J0KHN0cnVjdCBwbnBfZGV2ICpkZXYsIGludCBpZHgpCiB7CiAJaW50IHRtcDsKIAlzdHJ1Y3QgcG5wX2RldiAqdGRldjsKIAlyZXNvdXJjZV9zaXplX3QgKnBvcnQsICplbmQsICp0cG9ydCwgKnRlbmQ7CisKIAlwb3J0ID0gJmRldi0+cmVzLnBvcnRfcmVzb3VyY2VbaWR4XS5zdGFydDsKIAllbmQgPSAmZGV2LT5yZXMucG9ydF9yZXNvdXJjZVtpZHhdLmVuZDsKIApAQCAtMjUwLDggKzI1NCw4IEBACiAKIAkvKiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgYWxyZWFkeSBpbiB1c2UsIHNraXAgaWYgdGhlCiAJICogZGV2aWNlIGlzIGFjdGl2ZSBiZWNhdXNlIGl0IGl0c2VsZiBtYXkgYmUgaW4gdXNlICovCi0JaWYoIWRldi0+YWN0aXZlKSB7Ci0JCWlmIChfX2NoZWNrX3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAqcG9ydCwgbGVuZ3RoKHBvcnQsZW5kKSkpCisJaWYgKCFkZXYtPmFjdGl2ZSkgeworCQlpZiAoX19jaGVja19yZWdpb24oJmlvcG9ydF9yZXNvdXJjZSwgKnBvcnQsIGxlbmd0aChwb3J0LCBlbmQpKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMjU5LDcgKzI2Myw3IEBACiAJZm9yICh0bXAgPSAwOyB0bXAgPCA4OyB0bXArKykgewogCQlpbnQgcnBvcnQgPSBwbnBfcmVzZXJ2ZV9pb1t0bXAgPDwgMV07CiAJCWludCByZW5kID0gcG5wX3Jlc2VydmVfaW9bKHRtcCA8PCAxKSArIDFdICsgcnBvcnQgLSAxOwotCQlpZiAocmFuZ2VkX2NvbmZsaWN0KHBvcnQsZW5kLCZycG9ydCwmcmVuZCkpCisJCWlmIChyYW5nZWRfY29uZmxpY3QocG9ydCwgZW5kLCAmcnBvcnQsICZyZW5kKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMjY4LDcgKzI3Miw3IEBACiAJCWlmIChkZXYtPnJlcy5wb3J0X3Jlc291cmNlW3RtcF0uZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCQl0cG9ydCA9ICZkZXYtPnJlcy5wb3J0X3Jlc291cmNlW3RtcF0uc3RhcnQ7CiAJCQl0ZW5kID0gJmRldi0+cmVzLnBvcnRfcmVzb3VyY2VbdG1wXS5lbmQ7Ci0JCQlpZiAocmFuZ2VkX2NvbmZsaWN0KHBvcnQsZW5kLHRwb3J0LHRlbmQpKQorCQkJaWYgKHJhbmdlZF9jb25mbGljdChwb3J0LCBlbmQsIHRwb3J0LCB0ZW5kKSkKIAkJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTI3OSwxMSArMjgzLDEyIEBACiAJCQljb250aW51ZTsKIAkJZm9yICh0bXAgPSAwOyB0bXAgPCBQTlBfTUFYX1BPUlQ7IHRtcCsrKSB7CiAJCQlpZiAodGRldi0+cmVzLnBvcnRfcmVzb3VyY2VbdG1wXS5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJCQlpZiAoY2Fubm90X2NvbXBhcmUodGRldi0+cmVzLnBvcnRfcmVzb3VyY2VbdG1wXS5mbGFncykpCisJCQkJaWYgKGNhbm5vdF9jb21wYXJlCisJCQkJICAgICh0ZGV2LT5yZXMucG9ydF9yZXNvdXJjZVt0bXBdLmZsYWdzKSkKIAkJCQkJY29udGludWU7CiAJCQkJdHBvcnQgPSAmdGRldi0+cmVzLnBvcnRfcmVzb3VyY2VbdG1wXS5zdGFydDsKIAkJCQl0ZW5kID0gJnRkZXYtPnJlcy5wb3J0X3Jlc291cmNlW3RtcF0uZW5kOwotCQkJCWlmIChyYW5nZWRfY29uZmxpY3QocG9ydCxlbmQsdHBvcnQsdGVuZCkpCisJCQkJaWYgKHJhbmdlZF9jb25mbGljdChwb3J0LCBlbmQsIHRwb3J0LCB0ZW5kKSkKIAkJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTI5MiwxMSArMjk3LDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBwbnBfY2hlY2tfbWVtKHN0cnVjdCBwbnBfZGV2ICogZGV2LCBpbnQgaWR4KQoraW50IHBucF9jaGVja19tZW0oc3RydWN0IHBucF9kZXYgKmRldiwgaW50IGlkeCkKIHsKIAlpbnQgdG1wOwogCXN0cnVjdCBwbnBfZGV2ICp0ZGV2OwogCXJlc291cmNlX3NpemVfdCAqYWRkciwgKmVuZCwgKnRhZGRyLCAqdGVuZDsKKwogCWFkZHIgPSAmZGV2LT5yZXMubWVtX3Jlc291cmNlW2lkeF0uc3RhcnQ7CiAJZW5kID0gJmRldi0+cmVzLm1lbV9yZXNvdXJjZVtpZHhdLmVuZDsKIApAQCAtMzA2LDggKzMxMiw4IEBACiAKIAkvKiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgYWxyZWFkeSBpbiB1c2UsIHNraXAgaWYgdGhlCiAJICogZGV2aWNlIGlzIGFjdGl2ZSBiZWNhdXNlIGl0IGl0c2VsZiBtYXkgYmUgaW4gdXNlICovCi0JaWYoIWRldi0+YWN0aXZlKSB7Ci0JCWlmIChjaGVja19tZW1fcmVnaW9uKCphZGRyLCBsZW5ndGgoYWRkcixlbmQpKSkKKwlpZiAoIWRldi0+YWN0aXZlKSB7CisJCWlmIChjaGVja19tZW1fcmVnaW9uKCphZGRyLCBsZW5ndGgoYWRkciwgZW5kKSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMxNSw3ICszMjEsNyBAQAogCWZvciAodG1wID0gMDsgdG1wIDwgODsgdG1wKyspIHsKIAkJaW50IHJhZGRyID0gcG5wX3Jlc2VydmVfbWVtW3RtcCA8PCAxXTsKIAkJaW50IHJlbmQgPSBwbnBfcmVzZXJ2ZV9tZW1bKHRtcCA8PCAxKSArIDFdICsgcmFkZHIgLSAxOwotCQlpZiAocmFuZ2VkX2NvbmZsaWN0KGFkZHIsZW5kLCZyYWRkciwmcmVuZCkpCisJCWlmIChyYW5nZWRfY29uZmxpY3QoYWRkciwgZW5kLCAmcmFkZHIsICZyZW5kKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMzI0LDcgKzMzMCw3IEBACiAJCWlmIChkZXYtPnJlcy5tZW1fcmVzb3VyY2VbdG1wXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CiAJCQl0YWRkciA9ICZkZXYtPnJlcy5tZW1fcmVzb3VyY2VbdG1wXS5zdGFydDsKIAkJCXRlbmQgPSAmZGV2LT5yZXMubWVtX3Jlc291cmNlW3RtcF0uZW5kOwotCQkJaWYgKHJhbmdlZF9jb25mbGljdChhZGRyLGVuZCx0YWRkcix0ZW5kKSkKKwkJCWlmIChyYW5nZWRfY29uZmxpY3QoYWRkciwgZW5kLCB0YWRkciwgdGVuZCkpCiAJCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0zMzUsMTEgKzM0MSwxMiBAQAogCQkJY29udGludWU7CiAJCWZvciAodG1wID0gMDsgdG1wIDwgUE5QX01BWF9NRU07IHRtcCsrKSB7CiAJCQlpZiAodGRldi0+cmVzLm1lbV9yZXNvdXJjZVt0bXBdLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKLQkJCQlpZiAoY2Fubm90X2NvbXBhcmUodGRldi0+cmVzLm1lbV9yZXNvdXJjZVt0bXBdLmZsYWdzKSkKKwkJCQlpZiAoY2Fubm90X2NvbXBhcmUKKwkJCQkgICAgKHRkZXYtPnJlcy5tZW1fcmVzb3VyY2VbdG1wXS5mbGFncykpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXRhZGRyID0gJnRkZXYtPnJlcy5tZW1fcmVzb3VyY2VbdG1wXS5zdGFydDsKIAkJCQl0ZW5kID0gJnRkZXYtPnJlcy5tZW1fcmVzb3VyY2VbdG1wXS5lbmQ7Ci0JCQkJaWYgKHJhbmdlZF9jb25mbGljdChhZGRyLGVuZCx0YWRkcix0ZW5kKSkKKwkJCQlpZiAocmFuZ2VkX2NvbmZsaWN0KGFkZHIsIGVuZCwgdGFkZHIsIHRlbmQpKQogCQkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMzUzLDExICszNjAsMTEgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLWludCBwbnBfY2hlY2tfaXJxKHN0cnVjdCBwbnBfZGV2ICogZGV2LCBpbnQgaWR4KQoraW50IHBucF9jaGVja19pcnEoc3RydWN0IHBucF9kZXYgKmRldiwgaW50IGlkeCkKIHsKIAlpbnQgdG1wOwogCXN0cnVjdCBwbnBfZGV2ICp0ZGV2OwotCXJlc291cmNlX3NpemVfdCAqIGlycSA9ICZkZXYtPnJlcy5pcnFfcmVzb3VyY2VbaWR4XS5zdGFydDsKKwlyZXNvdXJjZV9zaXplX3QgKmlycSA9ICZkZXYtPnJlcy5pcnFfcmVzb3VyY2VbaWR4XS5zdGFydDsKIAogCS8qIGlmIHRoZSByZXNvdXJjZSBkb2Vzbid0IGV4aXN0LCBkb24ndCBjb21wbGFpbiBhYm91dCBpdCAqLwogCWlmIChjYW5ub3RfY29tcGFyZShkZXYtPnJlcy5pcnFfcmVzb3VyY2VbaWR4XS5mbGFncykpCkBAIC0zOTQsOSArNDAxLDkgQEAKIAogCS8qIGNoZWNrIGlmIHRoZSByZXNvdXJjZSBpcyBhbHJlYWR5IGluIHVzZSwgc2tpcCBpZiB0aGUKIAkgKiBkZXZpY2UgaXMgYWN0aXZlIGJlY2F1c2UgaXQgaXRzZWxmIG1heSBiZSBpbiB1c2UgKi8KLQlpZighZGV2LT5hY3RpdmUpIHsKKwlpZiAoIWRldi0+YWN0aXZlKSB7CiAJCWlmIChyZXF1ZXN0X2lycSgqaXJxLCBwbnBfdGVzdF9oYW5kbGVyLAotCQkJCUlSUUZfRElTQUJMRUR8SVJRRl9QUk9CRV9TSEFSRUQsICJwbnAiLCBOVUxMKSkKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9QUk9CRV9TSEFSRUQsICJwbnAiLCBOVUxMKSkKIAkJCXJldHVybiAwOwogCQlmcmVlX2lycSgqaXJxLCBOVUxMKTsKIAl9CkBAIC00MDcsNyArNDE0LDggQEAKIAkJCWNvbnRpbnVlOwogCQlmb3IgKHRtcCA9IDA7IHRtcCA8IFBOUF9NQVhfSVJROyB0bXArKykgewogCQkJaWYgKHRkZXYtPnJlcy5pcnFfcmVzb3VyY2VbdG1wXS5mbGFncyAmIElPUkVTT1VSQ0VfSVJRKSB7Ci0JCQkJaWYgKGNhbm5vdF9jb21wYXJlKHRkZXYtPnJlcy5pcnFfcmVzb3VyY2VbdG1wXS5mbGFncykpCisJCQkJaWYgKGNhbm5vdF9jb21wYXJlCisJCQkJICAgICh0ZGV2LT5yZXMuaXJxX3Jlc291cmNlW3RtcF0uZmxhZ3MpKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoKHRkZXYtPnJlcy5pcnFfcmVzb3VyY2VbdG1wXS5zdGFydCA9PSAqaXJxKSkKIAkJCQkJcmV0dXJuIDA7CkBAIC00MTgsMTIgKzQyNiwxMiBAQAogCXJldHVybiAxOwogfQogCi1pbnQgcG5wX2NoZWNrX2RtYShzdHJ1Y3QgcG5wX2RldiAqIGRldiwgaW50IGlkeCkKK2ludCBwbnBfY2hlY2tfZG1hKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGludCBpZHgpCiB7CiAjaWZuZGVmIENPTkZJR19JQTY0CiAJaW50IHRtcDsKIAlzdHJ1Y3QgcG5wX2RldiAqdGRldjsKLQlyZXNvdXJjZV9zaXplX3QgKiBkbWEgPSAmZGV2LT5yZXMuZG1hX3Jlc291cmNlW2lkeF0uc3RhcnQ7CisJcmVzb3VyY2Vfc2l6ZV90ICpkbWEgPSAmZGV2LT5yZXMuZG1hX3Jlc291cmNlW2lkeF0uc3RhcnQ7CiAKIAkvKiBpZiB0aGUgcmVzb3VyY2UgZG9lc24ndCBleGlzdCwgZG9uJ3QgY29tcGxhaW4gYWJvdXQgaXQgKi8KIAlpZiAoY2Fubm90X2NvbXBhcmUoZGV2LT5yZXMuZG1hX3Jlc291cmNlW2lkeF0uZmxhZ3MpKQpAQCAtNDQ5LDcgKzQ1Nyw3IEBACiAKIAkvKiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgYWxyZWFkeSBpbiB1c2UsIHNraXAgaWYgdGhlCiAJICogZGV2aWNlIGlzIGFjdGl2ZSBiZWNhdXNlIGl0IGl0c2VsZiBtYXkgYmUgaW4gdXNlICovCi0JaWYoIWRldi0+YWN0aXZlKSB7CisJaWYgKCFkZXYtPmFjdGl2ZSkgewogCQlpZiAocmVxdWVzdF9kbWEoKmRtYSwgInBucCIpKQogCQkJcmV0dXJuIDA7CiAJCWZyZWVfZG1hKCpkbWEpOwpAQCAtNDYxLDcgKzQ2OSw4IEBACiAJCQljb250aW51ZTsKIAkJZm9yICh0bXAgPSAwOyB0bXAgPCBQTlBfTUFYX0RNQTsgdG1wKyspIHsKIAkJCWlmICh0ZGV2LT5yZXMuZG1hX3Jlc291cmNlW3RtcF0uZmxhZ3MgJiBJT1JFU09VUkNFX0RNQSkgewotCQkJCWlmIChjYW5ub3RfY29tcGFyZSh0ZGV2LT5yZXMuZG1hX3Jlc291cmNlW3RtcF0uZmxhZ3MpKQorCQkJCWlmIChjYW5ub3RfY29tcGFyZQorCQkJCSAgICAodGRldi0+cmVzLmRtYV9yZXNvdXJjZVt0bXBdLmZsYWdzKSkKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKCh0ZGV2LT5yZXMuZG1hX3Jlc291cmNlW3RtcF0uc3RhcnQgPT0gKmRtYSkpCiAJCQkJCXJldHVybiAwOwpAQCAtNDcxLDMwICs0ODAsMTggQEAKIAogCXJldHVybiAxOwogI2Vsc2UKLQkvKiBJQTY0IGhhc24ndCBsZWdhY3kgRE1BICovCisJLyogSUE2NCBkb2VzIG5vdCBoYXZlIGxlZ2FjeSBETUEgKi8KIAlyZXR1cm4gMDsKICNlbmRpZgogfQogCi0KLSNpZiAwCi1FWFBPUlRfU1lNQk9MKHBucF9yZWdpc3Rlcl9kZXBlbmRlbnRfb3B0aW9uKTsKLUVYUE9SVF9TWU1CT0wocG5wX3JlZ2lzdGVyX2luZGVwZW5kZW50X29wdGlvbik7Ci1FWFBPUlRfU1lNQk9MKHBucF9yZWdpc3Rlcl9pcnFfcmVzb3VyY2UpOwotRVhQT1JUX1NZTUJPTChwbnBfcmVnaXN0ZXJfZG1hX3Jlc291cmNlKTsKLUVYUE9SVF9TWU1CT0wocG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2UpOwotRVhQT1JUX1NZTUJPTChwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKTsKLSNlbmRpZiAgLyogIDAgICovCi0KLQogLyogZm9ybWF0IGlzOiBwbnBfcmVzZXJ2ZV9pcnE9aXJxMVssaXJxMl0gLi4uLiAqLwotCiBzdGF0aWMgaW50IF9faW5pdCBwbnBfc2V0dXBfcmVzZXJ2ZV9pcnEoY2hhciAqc3RyKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCWlmIChnZXRfb3B0aW9uKCZzdHIsJnBucF9yZXNlcnZlX2lycVtpXSkgIT0gMikKKwkJaWYgKGdldF9vcHRpb24oJnN0ciwgJnBucF9yZXNlcnZlX2lycVtpXSkgIT0gMikKIAkJCWJyZWFrOwogCXJldHVybiAxOwogfQpAQCAtNTAyLDEzICs0OTksMTIgQEAKIF9fc2V0dXAoInBucF9yZXNlcnZlX2lycT0iLCBwbnBfc2V0dXBfcmVzZXJ2ZV9pcnEpOwogCiAvKiBmb3JtYXQgaXM6IHBucF9yZXNlcnZlX2RtYT1kbWExWyxkbWEyXSAuLi4uICovCi0KIHN0YXRpYyBpbnQgX19pbml0IHBucF9zZXR1cF9yZXNlcnZlX2RtYShjaGFyICpzdHIpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlpZiAoZ2V0X29wdGlvbigmc3RyLCZwbnBfcmVzZXJ2ZV9kbWFbaV0pICE9IDIpCisJCWlmIChnZXRfb3B0aW9uKCZzdHIsICZwbnBfcmVzZXJ2ZV9kbWFbaV0pICE9IDIpCiAJCQlicmVhazsKIAlyZXR1cm4gMTsKIH0KQEAgLTUxNiwxMyArNTEyLDEyIEBACiBfX3NldHVwKCJwbnBfcmVzZXJ2ZV9kbWE9IiwgcG5wX3NldHVwX3Jlc2VydmVfZG1hKTsKIAogLyogZm9ybWF0IGlzOiBwbnBfcmVzZXJ2ZV9pbz1pbzEsc2l6ZTFbLGlvMixzaXplMl0gLi4uLiAqLwotCiBzdGF0aWMgaW50IF9faW5pdCBwbnBfc2V0dXBfcmVzZXJ2ZV9pbyhjaGFyICpzdHIpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJaWYgKGdldF9vcHRpb24oJnN0ciwmcG5wX3Jlc2VydmVfaW9baV0pICE9IDIpCisJCWlmIChnZXRfb3B0aW9uKCZzdHIsICZwbnBfcmVzZXJ2ZV9pb1tpXSkgIT0gMikKIAkJCWJyZWFrOwogCXJldHVybiAxOwogfQpAQCAtNTMwLDEzICs1MjUsMTIgQEAKIF9fc2V0dXAoInBucF9yZXNlcnZlX2lvPSIsIHBucF9zZXR1cF9yZXNlcnZlX2lvKTsKIAogLyogZm9ybWF0IGlzOiBwbnBfcmVzZXJ2ZV9tZW09bWVtMSxzaXplMVssbWVtMixzaXplMl0gLi4uLiAqLwotCiBzdGF0aWMgaW50IF9faW5pdCBwbnBfc2V0dXBfcmVzZXJ2ZV9tZW0oY2hhciAqc3RyKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCWlmIChnZXRfb3B0aW9uKCZzdHIsJnBucF9yZXNlcnZlX21lbVtpXSkgIT0gMikKKwkJaWYgKGdldF9vcHRpb24oJnN0ciwgJnBucF9yZXNlcnZlX21lbVtpXSkgIT0gMikKIAkJCWJyZWFrOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvc3VwcG9ydC5jIGIvZHJpdmVycy9wbnAvc3VwcG9ydC5jCmluZGV4IDk0NmEwZGMuLjEzYzYwOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3N1cHBvcnQuYworKysgYi9kcml2ZXJzL3BucC9zdXBwb3J0LmMKQEAgLTEsOCArMSw3IEBACiAvKgotICogc3VwcG9ydC5jIC0gcHJvdmlkZXMgc3RhbmRhcmQgcG5wIGZ1bmN0aW9ucyBmb3IgdGhlIHVzZSBvZiBwbnAgcHJvdG9jb2wgZHJpdmVycywKKyAqIHN1cHBvcnQuYyAtIHN0YW5kYXJkIGZ1bmN0aW9ucyBmb3IgdGhlIHVzZSBvZiBwbnAgcHJvdG9jb2wgZHJpdmVycwogICoKICAqIENvcHlyaWdodCAyMDAzIEFkYW0gQmVsYXkgPGFtYngxQG5lby5yci5jb20+Ci0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTExLDIyICsxMCwxOCBAQAogI2luY2x1ZGUgImJhc2UuaCIKIAogLyoqCi0gKiBwbnBfaXNfYWN0aXZlIC0gRGV0ZXJtaW5lcyBpZiBhIGRldmljZSBpcyBhY3RpdmUgYmFzZWQgb24gaXRzIGN1cnJlbnQgcmVzb3VyY2VzCisgKiBwbnBfaXNfYWN0aXZlIC0gRGV0ZXJtaW5lcyBpZiBhIGRldmljZSBpcyBhY3RpdmUgYmFzZWQgb24gaXRzIGN1cnJlbnQKKyAqCXJlc291cmNlcwogICogQGRldjogcG9pbnRlciB0byB0aGUgZGVzaXJlZCBQblAgZGV2aWNlCi0gKgogICovCi0KLWludCBwbnBfaXNfYWN0aXZlKHN0cnVjdCBwbnBfZGV2ICogZGV2KQoraW50IHBucF9pc19hY3RpdmUoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlpZiAoIXBucF9wb3J0X3N0YXJ0KGRldiwgMCkgJiYgcG5wX3BvcnRfbGVuKGRldiwgMCkgPD0gMSAmJgogCSAgICAhcG5wX21lbV9zdGFydChkZXYsIDApICYmIHBucF9tZW1fbGVuKGRldiwgMCkgPD0gMSAmJgotCSAgICBwbnBfaXJxKGRldiwgMCkgPT0gLTEgJiYKLQkgICAgcG5wX2RtYShkZXYsIDApID09IC0xKQotCSAgICAJcmV0dXJuIDA7CisJICAgIHBucF9pcnEoZGV2LCAwKSA9PSAtMSAmJiBwbnBfZG1hKGRldiwgMCkgPT0gLTEpCisJCXJldHVybiAwOwogCWVsc2UKIAkJcmV0dXJuIDE7CiB9CiAKLQotCiBFWFBPUlRfU1lNQk9MKHBucF9pc19hY3RpdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvc3lzdGVtLmMgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwppbmRleCBhOGE5NTU0Li5hMDZmOTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9zeXN0ZW0uYworKysgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwpAQCAtMTYsMTMgKzE2LDE0IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfZGV2X3RhYmxlW10gPSB7CiAJLyogR2VuZXJhbCBJRCBmb3IgcmVzZXJ2aW5nIHJlc291cmNlcyAqLwotCXsJIlBOUDBjMDIiLAkJMAl9LAorCXsiUE5QMGMwMiIsIDB9LAogCS8qIG1lbW9yeSBjb250cm9sbGVyICovCi0JewkiUE5QMGMwMSIsCQkwCX0sCi0JewkiIiwJCQkwCX0KKwl7IlBOUDBjMDEiLCAwfSwKKwl7IiIsIDB9CiB9OwogCi1zdGF0aWMgdm9pZCByZXNlcnZlX3JhbmdlKGNvbnN0IGNoYXIgKnBucGlkLCByZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBlbmQsIGludCBwb3J0KQorc3RhdGljIHZvaWQgcmVzZXJ2ZV9yYW5nZShjb25zdCBjaGFyICpwbnBpZCwgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAorCQkJICByZXNvdXJjZV9zaXplX3QgZW5kLCBpbnQgcG9ydCkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAljaGFyICpyZWdpb25pZDsKQEAgLTMyLDkgKzMzLDkgQEAKIAkJcmV0dXJuOwogCXNucHJpbnRmKHJlZ2lvbmlkLCAxNiwgInBucCAlcyIsIHBucGlkKTsKIAlpZiAocG9ydCkKLQkJcmVzID0gcmVxdWVzdF9yZWdpb24oc3RhcnQsIGVuZC1zdGFydCsxLCByZWdpb25pZCk7CisJCXJlcyA9IHJlcXVlc3RfcmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEsIHJlZ2lvbmlkKTsKIAllbHNlCi0JCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgZW5kLXN0YXJ0KzEsIHJlZ2lvbmlkKTsKKwkJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEsIHJlZ2lvbmlkKTsKIAlpZiAocmVzID09IE5VTEwpCiAJCWtmcmVlKHJlZ2lvbmlkKTsKIAllbHNlCkBAIC00NCwxMSArNDUsMTAgQEAKIAkgKiBleGFtcGxlIGRvIHJlc2VydmUgc3R1ZmYgdGhleSBrbm93IGFib3V0IHRvbywgc28gd2UgbWF5IHdlbGwKIAkgKiBoYXZlIGRvdWJsZSByZXNlcnZhdGlvbnMuCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTwotCQkicG5wOiAlczogJXMgcmFuZ2UgMHglbGx4LTB4JWxseCAlcyByZXNlcnZlZFxuIiwKLQkJcG5waWQsIHBvcnQgPyAiaW9wb3J0IiA6ICJpb21lbSIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQsCi0JCU5VTEwgIT0gcmVzID8gImhhcyBiZWVuIiA6ICJjb3VsZCBub3QgYmUiKTsKKwlwcmludGsoS0VSTl9JTkZPICJwbnA6ICVzOiAlcyByYW5nZSAweCVsbHgtMHglbGx4ICVzIHJlc2VydmVkXG4iLAorCSAgICAgICBwbnBpZCwgcG9ydCA/ICJpb3BvcnQiIDogImlvbWVtIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQsCisJICAgICAgIE5VTEwgIT0gcmVzID8gImhhcyBiZWVuIiA6ICJjb3VsZCBub3QgYmUiKTsKIH0KIAogc3RhdGljIHZvaWQgcmVzZXJ2ZV9yZXNvdXJjZXNfb2ZfZGV2KGNvbnN0IHN0cnVjdCBwbnBfZGV2ICpkZXYpCkBAIC03NCw3ICs3NCw3IEBACiAJCQljb250aW51ZTsJLyogaW52YWxpZCAqLwogCiAJCXJlc2VydmVfcmFuZ2UoZGV2LT5kZXYuYnVzX2lkLCBwbnBfcG9ydF9zdGFydChkZXYsIGkpLAotCQkJcG5wX3BvcnRfZW5kKGRldiwgaSksIDEpOworCQkJICAgICAgcG5wX3BvcnRfZW5kKGRldiwgaSksIDEpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX01FTTsgaSsrKSB7CkBAIC04MiwyNCArODIsMjIgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXJlc2VydmVfcmFuZ2UoZGV2LT5kZXYuYnVzX2lkLCBwbnBfbWVtX3N0YXJ0KGRldiwgaSksCi0JCQlwbnBfbWVtX2VuZChkZXYsIGkpLCAwKTsKKwkJCSAgICAgIHBucF9tZW1fZW5kKGRldiwgaSksIDApOwogCX0KLQotCXJldHVybjsKIH0KIAotc3RhdGljIGludCBzeXN0ZW1fcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICogZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQorc3RhdGljIGludCBzeXN0ZW1fcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKIHsKIAlyZXNlcnZlX3Jlc291cmNlc19vZl9kZXYoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIHN5c3RlbV9wbnBfZHJpdmVyID0gewotCS5uYW1lCQk9ICJzeXN0ZW0iLAotCS5pZF90YWJsZQk9IHBucF9kZXZfdGFibGUsCi0JLmZsYWdzCQk9IFBOUF9EUklWRVJfUkVTX0RPX05PVF9DSEFOR0UsCi0JLnByb2JlCQk9IHN5c3RlbV9wbnBfcHJvYmUsCi0JLnJlbW92ZQkJPSBOVUxMLAorCS5uYW1lICAgICA9ICJzeXN0ZW0iLAorCS5pZF90YWJsZSA9IHBucF9kZXZfdGFibGUsCisJLmZsYWdzICAgID0gUE5QX0RSSVZFUl9SRVNfRE9fTk9UX0NIQU5HRSwKKwkucHJvYmUgICAgPSBzeXN0ZW1fcG5wX3Byb2JlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcG5wX3N5c3RlbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IDdlZGU5ZTcuLmQzYTMzYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0xNSwzNCArMTUsMzYgQEAKIHJ0Yy1jb3JlLSQoQ09ORklHX1JUQ19JTlRGX1BST0MpICs9IHJ0Yy1wcm9jLm8KIHJ0Yy1jb3JlLSQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTKSArPSBydGMtc3lzZnMubwogCisjIEtlZXAgdGhlIGxpc3Qgb3JkZXJlZC4KKworb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWCkrPSBydGMtYXQzMmFwNzAweC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwKSs9IHJ0Yy1hdDkxcm05MjAwLm8KK29iai0kKENPTkZJR19SVENfRFJWX0JGSU4pCSs9IHJ0Yy1iZmluLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0NNT1MpCSs9IHJ0Yy1jbW9zLm8KLW9iai0kKENPTkZJR19SVENfRFJWX1gxMjA1KQkrPSBydGMteDEyMDUubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfSVNMMTIwOCkJKz0gcnRjLWlzbDEyMDgubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfVEVTVCkJKz0gcnRjLXRlc3Qubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWCkJKz0gcnRjLWF0MzJhcDcwMHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMjE2KQkrPSBydGMtZHMxMjE2Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTMwNykJKz0gcnRjLWRzMTMwNy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzE1NTMpCSs9IHJ0Yy1kczE1NTMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNjcyKQkrPSBydGMtZHMxNjcyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTc0MikJKz0gcnRjLWRzMTc0Mi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9FUDkzWFgpCSs9IHJ0Yy1lcDkzeHgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfSVNMMTIwOCkJKz0gcnRjLWlzbDEyMDgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQxVDgwKQkrPSBydGMtbTQxdDgwLm8KK29iai0kKENPTkZJR19SVENfRFJWX000OFQ1OSkJKz0gcnRjLW00OHQ1OS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NNDhUODYpCSs9IHJ0Yy1tNDh0ODYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYNjkwMCkJKz0gcnRjLW1heDY5MDAubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYNjkwMikJKz0gcnRjLW1heDY5MDIubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfT01BUCkJKz0gcnRjLW9tYXAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU2MykJKz0gcnRjLXBjZjg1NjMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU4MykJKz0gcnRjLXBjZjg1ODMubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzEzKQkrPSBydGMtcnM1YzMxMy5vCitvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzQ4KQkrPSBydGMtcnM1YzM0OC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzcyKQkrPSBydGMtcnM1YzM3Mi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TM0MpCSs9IHJ0Yy1zM2Mubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzM0OCkJKz0gcnRjLXJzNWMzNDgubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQxVDgwKQkrPSBydGMtbTQxdDgwLm8KLW9iai0kKENPTkZJR19SVENfRFJWX000OFQ4NikJKz0gcnRjLW00OHQ4Ni5vCi1vYmotJChDT05GSUdfUlRDX0RSVl9EUzE1NTMpCSs9IHJ0Yy1kczE1NTMubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfU1RLMTdUQTgpCSs9IHJ0Yy1zdGsxN3RhOC5vCi1vYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzEzKQkrPSBydGMtcnM1YzMxMy5vCi1vYmotJChDT05GSUdfUlRDX0RSVl9FUDkzWFgpCSs9IHJ0Yy1lcDkzeHgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfU0ExMTAwKQkrPSBydGMtc2ExMTAwLm8KLW9iai0kKENPTkZJR19SVENfRFJWX1ZSNDFYWCkJKz0gcnRjLXZyNDF4eC5vCi1vYmotJChDT05GSUdfUlRDX0RSVl9QTDAzMSkJKz0gcnRjLXBsMDMxLm8KLW9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDApCSs9IHJ0Yy1tYXg2OTAwLm8KLW9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDIpCSs9IHJ0Yy1tYXg2OTAyLm8KLW9iai0kKENPTkZJR19SVENfRFJWX1YzMDIwKQkrPSBydGMtdjMwMjAubwotb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMCkrPSBydGMtYXQ5MXJtOTIwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TSCkJKz0gcnRjLXNoLm8KLW9iai0kKENPTkZJR19SVENfRFJWX0JGSU4pCSs9IHJ0Yy1iZmluLm8KLW9iai0kKENPTkZJR19SVENfRFJWX000OFQ1OSkJKz0gcnRjLW00OHQ1OS5vCi1vYmotJChDT05GSUdfUlRDX0RSVl9EUzEyMTYpCSs9IHJ0Yy1kczEyMTYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfU1RLMTdUQTgpCSs9IHJ0Yy1zdGsxN3RhOC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9URVNUKQkrPSBydGMtdGVzdC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9WMzAyMCkJKz0gcnRjLXYzMDIwLm8KK29iai0kKENPTkZJR19SVENfRFJWX1ZSNDFYWCkJKz0gcnRjLXZyNDF4eC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9YMTIwNSkJKz0gcnRjLXgxMjA1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IDhiM2NkMzEuLjEwYWIzYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2NsYXNzLmMKKysrIGIvZHJpdmVycy9ydGMvY2xhc3MuYwpAQCAtNDYsNiArNDYsNyBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlCSpydGMgPSB0b19ydGNfZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y190aW1lCQl0bTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXRzID0gY3VycmVudF9rZXJuZWxfdGltZSgpOwogCiAJaWYgKHN0cm5jbXAocnRjLT5kZXYuYnVzX2lkLAogCQkJCUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0UsCkBAIC01Nyw4ICs1OCw4IEBACiAKIAkvKiBSVEMgcHJlY2lzaW9uIGlzIDEgc2Vjb25kOyBhZGp1c3QgZGVsdGEgZm9yIGF2ZyAxLzIgc2VjIGVyciAqLwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZkZWx0YSwKLQkJCQl4dGltZS50dl9zZWMgLSBvbGR0aW1lLAotCQkJCXh0aW1lLnR2X25zZWMgLSAoTlNFQ19QRVJfU0VDID4+IDEpKTsKKwkJCQl0cy50dl9zZWMgLSBvbGR0aW1lLAorCQkJCXRzLnR2X25zZWMgLSAoTlNFQ19QRVJfU0VDID4+IDEpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWJmaW4uYyBiL2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMKaW5kZXggMjYwZWFkOS4uMWFhNzA5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWJmaW4uYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEJsYWNrZmluIE9uLUNoaXAgUmVhbCBUaW1lIENsb2NrIERyaXZlcgotICogIFN1cHBvcnRzIEJGNTMxL0JGNTMyL0JGNTMzL0JGNTM0L0JGNTM2L0JGNTM3CisgKiAgU3VwcG9ydHMgQkY1M1sxMjNdL0JGNTNbNDY3XS9CRjU0WzI0ODldCiAgKgogICogQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCmluZGV4IDUxNThhNjIuLmRiNmYzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTM1Miw3ICszNTIsNyBAQAogCQkvKiBvc2NpbGxhdG9yIGZhdWx0PyAgY2xlYXIgZmxhZywgYW5kIHdhcm4gKi8KIAkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0NPTlRST0xdICYgRFMxMzM4X0JJVF9PU0YpIHsKIAkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX0NPTlRST0wsCi0JCQkJCWRzMTMwNy0+cmVnc1tEUzEzMzdfUkVHX0NPTlRST0xdCisJCQkJCWRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0NPTlRST0xdCiAJCQkJCSYgfkRTMTMzOF9CSVRfT1NGKTsKIAkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CiAJCQlnb3RvIHJlYWRfcnRjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXN0azE3dGE4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwppbmRleCBmMTBkM2ZhLi44Mjg4YjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYwpAQCAtMjU4LDcgKzI1OCw4IEBACiAJLmlvY3RsCQk9IHN0azE3dGE4X3J0Y19pb2N0bCwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IHN0azE3dGE4X252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHN0azE3dGE4X252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCiAJCQkJIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPQpAQCAtMjcyLDcgKzI3Myw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdGsxN3RhOF9udnJhbV93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3Qgc3RrMTd0YThfbnZyYW1fd3JpdGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQkJCSAgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCBiZmVjYTU3Li5lNmJmY2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTExODcsNyArMTE4Nyw3IEBACiBzdGF0aWMgdm9pZAogX19kYXNkX3Byb2Nlc3NfYmxrX3F1ZXVlKHN0cnVjdCBkYXNkX2RldmljZSAqIGRldmljZSkKIHsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKIAlpbnQgbnJfcXVldWVkOwpAQCAtMTc0MCw3ICsxNzQwLDcgQEAKICAqIERhc2QgcmVxdWVzdCBxdWV1ZSBmdW5jdGlvbi4gQ2FsbGVkIGZyb20gbGxfcndfYmxrLmMKICAqLwogc3RhdGljIHZvaWQKLWRvX2Rhc2RfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxdWV1ZSkKK2RvX2Rhc2RfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHF1ZXVlKQogewogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaCBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCmluZGV4IDI0MTI5NGMuLmFlZGE1MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCkBAIC0yOTMsNyArMjkzLDcgQEAKIHN0cnVjdCBkYXNkX2RldmljZSB7CiAJLyogQmxvY2sgZGV2aWNlIHN0dWZmLiAqLwogCXN0cnVjdCBnZW5kaXNrICpnZHA7Ci0JcmVxdWVzdF9xdWV1ZV90ICpyZXF1ZXN0X3F1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpyZXF1ZXN0X3F1ZXVlOwogCXNwaW5sb2NrX3QgcmVxdWVzdF9xdWV1ZV9sb2NrOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAgICAgICAgIHVuc2lnbmVkIGludCBkZXZpbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCmluZGV4IDM1NzY1ZjYuLjRkODc5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwpAQCAtNjIxLDcgKzYyMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRjc3NibGtfbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQorZGNzc2Jsa19tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyAqZGV2X2luZm87CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYyBiL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCmluZGV4IGEwNGQ5MTIuLjM1NGEwNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIC8qCiAgKiBCbG9jayBkZXZpY2UgbWFrZSByZXF1ZXN0IGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IHhwcmFtX21ha2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbnQgeHByYW1fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJeHByYW1fZGV2aWNlX3QgKnhkZXYgPSBiaW8tPmJpX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL0tjb25maWcgYi9kcml2ZXJzL3MzOTAvY2hhci9LY29uZmlnCmluZGV4IDNmMzZjYjMuLjY0MzAzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvS2NvbmZpZwpAQCAtNDQsMTUgKzQ0LDkgQEAKIAlkZXBlbmRzIG9uIFROMzIxNV9DT05TT0xFIHx8IFROMzI3MF9DT05TT0xFCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBTQ0xQCi0JYm9vbCAiU3VwcG9ydCBmb3IgU0NMUCIKLQlkZXBlbmRzIG9uIFMzOTAKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBTQ0xQIGludGVyZmFjZSB0byB0aGUgc2VydmljZSBlbGVtZW50LgotCiBjb25maWcgU0NMUF9UVFkKIAlib29sICJTdXBwb3J0IGZvciBTQ0xQIGxpbmUgbW9kZSB0ZXJtaW5hbCIKLQlkZXBlbmRzIG9uIFNDTFAKKwlkZXBlbmRzIG9uIFMzOTAKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIElCTSBTQ0xQIGxpbmUtbW9kZSB0ZXJtaW5hbHMuCiAKQEAgLTY1LDcgKzU5LDcgQEAKIAogY29uZmlnIFNDTFBfVlQyMjBfVFRZCiAJYm9vbCAiU3VwcG9ydCBmb3IgU0NMUCBWVDIyMC1jb21wYXRpYmxlIHRlcm1pbmFsIgotCWRlcGVuZHMgb24gU0NMUAorCWRlcGVuZHMgb24gUzM5MAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgYW4gSUJNIFNDTFAgVlQyMjAtY29tcGF0aWJsZSB0ZXJtaW5hbC4KIApAQCAtNzgsNyArNzIsNyBAQAogCiBjb25maWcgU0NMUF9DUEkKIAl0cmlzdGF0ZSAiQ29udHJvbC1Qcm9ncmFtIElkZW50aWZpY2F0aW9uIgotCWRlcGVuZHMgb24gU0NMUAorCWRlcGVuZHMgb24gUzM5MAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGhhcmR3YXJlIGNvbnNvbGUgaW50ZXJmYWNlIGZvciBzeXN0ZW0KIAkgIGlkZW50aWZpY2F0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgZm9yIHdvcmtsb2FkIG1hbmFnZW1lbnQgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9yYXczMjcwLmMKaW5kZXggNzQzOTQ0YS4uNGYyZjgxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvcmF3MzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3JhdzMyNzAuYwpAQCAtMTQ3LDggKzE0Nyw3IEBACiAgKiBBbGxvY2F0ZSBhIG5ldyAzMjcwIGNjdyByZXF1ZXN0IGZyb20gYm9vdG1lbS4gT25seSB3b3JrcyB2ZXJ5CiAgKiBlYXJseSBpbiB0aGUgYm9vdCBwcm9jZXNzLiBPbmx5IGNvbjMyNzAuYyBzaG91bGQgYmUgdXNpbmcgdGhpcy4KICAqLwotc3RydWN0IHJhdzMyNzBfcmVxdWVzdCAqCi1yYXczMjcwX3JlcXVlc3RfYWxsb2NfYm9vdG1lbShzaXplX3Qgc2l6ZSkKK3N0cnVjdCByYXczMjcwX3JlcXVlc3QgX19pbml0ICpyYXczMjcwX3JlcXVlc3RfYWxsb2NfYm9vdG1lbShzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgcmF3MzI3MF9yZXF1ZXN0ICpycTsKIApAQCAtODQ4LDggKzg0Nyw3IEBACiAvKgogICogU2V0dXAgMzI3MCBkZXZpY2UgY29uZmlndXJlZCBhcyBjb25zb2xlLgogICovCi1zdHJ1Y3QgcmF3MzI3MCAqCi1yYXczMjcwX3NldHVwX2NvbnNvbGUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCitzdHJ1Y3QgcmF3MzI3MCBfX2luaXQgKnJhdzMyNzBfc2V0dXBfY29uc29sZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgcmF3MzI3MCAqcnA7CiAJY2hhciAqYXNjZWJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jCmluZGV4IDcyNjMzNDcuLjQwY2QyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMKQEAgLTYyMSwxMSArNjIxLDI0IEBACiAvKgogICogSW5pdGlhbGl6ZSBhbGwgcmVsZXZhbnQgY29tcG9uZW50cyBhbmQgcmVnaXN0ZXIgZHJpdmVyIHdpdGggc3lzdGVtLgogICovCi1zdGF0aWMgaW50Ci1fX3NjbHBfdnQyMjBfaW5pdChpbnQgZWFybHkpCitzdGF0aWMgdm9pZCBfX2luaXQgX19zY2xwX3Z0MjIwX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlLCAqcDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwYWdlLCBwLCAmc2NscF92dDIyMF9lbXB0eSkgeworCQlsaXN0X2RlbChwYWdlKTsKKwkJaWYgKHNsYWJfaXNfYXZhaWxhYmxlKCkpCisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworCQllbHNlCisJCQlmcmVlX2Jvb3RtZW0oKHVuc2lnbmVkIGxvbmcpIHBhZ2UsIFBBR0VfU0laRSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBfX3NjbHBfdnQyMjBfaW5pdCh2b2lkKQogewogCXZvaWQgKnBhZ2U7CiAJaW50IGk7CisJaW50IG51bV9wYWdlczsKIAogCWlmIChzY2xwX3Z0MjIwX2luaXRpYWxpemVkKQogCQlyZXR1cm4gMDsKQEAgLTY0MiwxMyArNjU1LDE2IEBACiAJc2NscF92dDIyMF9mbHVzaF9sYXRlciA9IDA7CiAKIAkvKiBBbGxvY2F0ZSBwYWdlcyBmb3Igb3V0cHV0IGJ1ZmZlcmluZyAqLwotCWZvciAoaSA9IDA7IGkgPCAoZWFybHkgPyBNQVhfQ09OU09MRV9QQUdFUyA6IE1BWF9LTUVNX1BBR0VTKTsgaSsrKSB7Ci0JCWlmIChlYXJseSkKLQkJCXBhZ2UgPSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOwotCQllbHNlCisJbnVtX3BhZ2VzID0gc2xhYl9pc19hdmFpbGFibGUoKSA/IE1BWF9LTUVNX1BBR0VTIDogTUFYX0NPTlNPTEVfUEFHRVM7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKQogCQkJcGFnZSA9ICh2b2lkICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JCWlmICghcGFnZSkKKwkJZWxzZQorCQkJcGFnZSA9IGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJCWlmICghcGFnZSkgeworCQkJX19zY2xwX3Z0MjIwX2NsZWFudXAoKTsKIAkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJCWxpc3RfYWRkX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKikgcGFnZSwgJnNjbHBfdnQyMjBfZW1wdHkpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTY2MiwxNCArNjc4LDEzIEBACiAJLmZsdXNoX2NoYXJzID0gc2NscF92dDIyMF9mbHVzaF9jaGFycywKIAkud3JpdGVfcm9vbSA9IHNjbHBfdnQyMjBfd3JpdGVfcm9vbSwKIAkuY2hhcnNfaW5fYnVmZmVyID0gc2NscF92dDIyMF9jaGFyc19pbl9idWZmZXIsCi0JLmZsdXNoX2J1ZmZlciA9IHNjbHBfdnQyMjBfZmx1c2hfYnVmZmVyCisJLmZsdXNoX2J1ZmZlciA9IHNjbHBfdnQyMjBfZmx1c2hfYnVmZmVyLAogfTsKIAogLyoKICAqIFJlZ2lzdGVyIGRyaXZlciB3aXRoIFNDTFAgYW5kIExpbnV4IGFuZCBpbml0aWFsaXplIGludGVybmFsIHR0eSBzdHJ1Y3R1cmVzLgogICovCi1zdGF0aWMgaW50IF9faW5pdAotc2NscF92dDIyMF90dHlfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2NscF92dDIyMF90dHlfaW5pdCh2b2lkKQogewogCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CiAJaW50IHJjOwpAQCAtNjc5LDE4ICs2OTQsMTUgQEAKIAlkcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKDEpOwogCWlmICghZHJpdmVyKQogCQlyZXR1cm4gLUVOT01FTTsKLQlyYyA9IF9fc2NscF92dDIyMF9pbml0KDApOwotCWlmIChyYykgewotCQlwdXRfdHR5X2RyaXZlcihkcml2ZXIpOwotCQlyZXR1cm4gcmM7Ci0JfQorCXJjID0gX19zY2xwX3Z0MjIwX2luaXQoKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2RyaXZlcjsKIAlyYyA9IHNjbHBfcmVnaXN0ZXIoJnNjbHBfdnQyMjBfcmVnaXN0ZXIpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgU0NMUF9WVDIyMF9QUklOVF9IRUFERVIKIAkJICAgICAgICJjb3VsZCBub3QgcmVnaXN0ZXIgdHR5IC0gIgogCQkgICAgICAgInNjbHBfcmVnaXN0ZXIgcmV0dXJuZWQgJWRcbiIsIHJjKTsKLQkJcHV0X3R0eV9kcml2ZXIoZHJpdmVyKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dF9pbml0OwogCX0KIAogCWRyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTcwOSwxNCArNzIxLDIwIEBACiAJCXByaW50ayhLRVJOX0VSUiBTQ0xQX1ZUMjIwX1BSSU5UX0hFQURFUgogCQkgICAgICAgImNvdWxkIG5vdCByZWdpc3RlciB0dHkgLSAiCiAJCSAgICAgICAidHR5X3JlZ2lzdGVyX2RyaXZlciByZXR1cm5lZCAlZFxuIiwgcmMpOwotCQlwdXRfdHR5X2RyaXZlcihkcml2ZXIpOwotCQlyZXR1cm4gcmM7CisJCWdvdG8gb3V0X3NjbHA7CiAJfQogCXNjbHBfdnQyMjBfZHJpdmVyID0gZHJpdmVyOwogCXJldHVybiAwOwotfQogCi1tb2R1bGVfaW5pdChzY2xwX3Z0MjIwX3R0eV9pbml0KTsKK291dF9zY2xwOgorCXNjbHBfdW5yZWdpc3Rlcigmc2NscF92dDIyMF9yZWdpc3Rlcik7CitvdXRfaW5pdDoKKwlfX3NjbHBfdnQyMjBfY2xlYW51cCgpOworb3V0X2RyaXZlcjoKKwlwdXRfdHR5X2RyaXZlcihkcml2ZXIpOworCXJldHVybiByYzsKK30KK19faW5pdGNhbGwoc2NscF92dDIyMF90dHlfaW5pdCk7CiAKICNpZmRlZiBDT05GSUdfU0NMUF9WVDIyMF9DT05TT0xFCiAKQEAgLTc2Miw3ICs3ODAsNyBAQAogCiAJaWYgKCFDT05TT0xFX0lTX1NDTFApCiAJCXJldHVybiAwOwotCXJjID0gX19zY2xwX3Z0MjIwX2luaXQoMSk7CisJcmMgPSBfX3NjbHBfdnQyMjBfaW5pdCgpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCS8qIEF0dGFjaCBsaW51eCBjb25zb2xlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlLmggYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlLmgKaW5kZXggM2I1MmY1Yy4uZGRkZjhkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZS5oCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGUuaApAQCAtMTg4LDcgKzE4OCw3IEBACiB7CiAJc3RydWN0IHRhcGVfZGV2aWNlICoJZGV2aWNlOwogCS8qIEJsb2NrIGRldmljZSByZXF1ZXN0IHF1ZXVlLiAqLwotCXJlcXVlc3RfcXVldWVfdCAqCXJlcXVlc3RfcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKglyZXF1ZXN0X3F1ZXVlOwogCXNwaW5sb2NrX3QJCXJlcXVlc3RfcXVldWVfbG9jazsKIAogCS8qIFRhc2sgdG8gbW92ZSBlbnRyaWVzIGZyb20gYmxvY2sgcmVxdWVzdCB0byBDQ1MgcmVxdWVzdCBxdWV1ZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYwppbmRleCBkZDBlY2FlLi5lZWI5MmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIHRhcGVibG9ja19yZXF1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgewogCXN0cnVjdCB0YXBlX2Jsa19kYXRhICoJYmxrZGF0OwogCXN0cnVjdCB0YXBlX2RldmljZSAqCWRldmljZTsKLQlyZXF1ZXN0X3F1ZXVlX3QgKglxdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqCXF1ZXVlOwogCWludAkJCW5yX3F1ZXVlZDsKIAlzdHJ1Y3QgcmVxdWVzdCAqCXJlcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICoJbDsKQEAgLTE5NCw3ICsxOTQsNyBAQAogICogVGFwZSByZXF1ZXN0IHF1ZXVlIGZ1bmN0aW9uLiBDYWxsZWQgZnJvbSBsbF9yd19ibGsuYwogICovCiBzdGF0aWMgdm9pZAotdGFwZWJsb2NrX3JlcXVlc3RfZm4ocmVxdWVzdF9xdWV1ZV90ICpxdWV1ZSkKK3RhcGVibG9ja19yZXF1ZXN0X2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZSkKIHsKIAlzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm11ci5jCmluZGV4IGU5MGIwZjguLjE2MTg2N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCQl9CiAJCWlmIChyYykKIAkJCWdvdG8gZmFpbDsKLQkJaWYgKHJlY2xlbikKKwkJaWYgKHJlY2xlbiAmJiAoY29waWVkID09IDApICYmICgqb2ZmcyA8IFBBR0VfU0laRSkpCiAJCQkqKCh1MTYgKikgJmJ1ZltGSUxFX1JFQ0xFTl9PRkZTRVRdKSA9IHJlY2xlbjsKIAkJbGVuID0gbWluKGNvdW50IC0gY29waWVkLCBQQUdFX1NJWkUgLSByZXMpOwogCQlpZiAoY29weV90b191c2VyKHVidWYgKyBjb3BpZWQsIGJ1ZiArIHJlcywgbGVuKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYyBiL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMKaW5kZXggZWMwNDA0OC4uYmQ1ZjE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCkBAIC01MSw3ICs1MSw3IEBACiAJCXRvID0gZnJvbTsKIAogCWlmIChmcm9tID4gdG8gfHwgdG8gPiBfX01BWF9TVUJDSEFOTkVMIHx8IHNzaWQgPiBfX01BWF9TU0lEKSB7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGJsYWNrbGlzdCByYW5nZSAiCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJjaW86IEludmFsaWQgYmxhY2tsaXN0IHJhbmdlICIKIAkJCSIwLiV4LiUwNHggdG8gMC4leC4lMDR4LCBza2lwcGluZ1xuIiwKIAkJCXNzaWQsIGZyb20sIHNzaWQsIHRvKTsKIAkJcmV0dXJuOwpAQCAtMTE5LDcgKzExOSw3IEBACiAJcmV0dXJuIDA7CiBjb25mdXNlZDoKIAlzdHJzZXAoc3RyLCAiLFxuIik7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiSW52YWxpZCBjaW9faWdub3JlIHBhcmFtZXRlciAnJXMnXG4iLCBzYXYpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogSW52YWxpZCBjaW9faWdub3JlIHBhcmFtZXRlciAnJXMnXG4iLCBzYXYpOwogCXJldHVybiAxOwogfQogCkBAIC0xNjYsMjIgKzE2NiwxOSBAQAogCQkJCQljb250aW51ZTsKIAkJCX0KIAkJCWlmICgqc3RyID09ICctJykgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImludmFsaWQgY2lvX2lnbm9yZSAiCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2lvOiBpbnZhbGlkIGNpb19pZ25vcmUgIgogCQkJCQkicGFyYW1ldGVyICclcydcbiIsCiAJCQkJCXN0cnNlcCgmc3RyLCAiLFxuIikpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKChmcm9tX2lkMCAhPSB0b19pZDApIHx8CiAJCQkgICAgKGZyb21fc3NpZCAhPSB0b19zc2lkKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImludmFsaWQgY2lvX2lnbm9yZSByYW5nZSAiCi0JCQkJCSIleC4leC4lMDR4LSV4LiV4LiUwNHhcbiIsCi0JCQkJCWZyb21faWQwLCBmcm9tX3NzaWQsIGZyb20sCi0JCQkJCXRvX2lkMCwgdG9fc3NpZCwgdG8pOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogaW52YWxpZCBjaW9faWdub3JlICIKKwkJCQkgICAgICAgInJhbmdlICV4LiV4LiUwNHgtJXguJXguJTA0eFxuIiwKKwkJCQkgICAgICAgZnJvbV9pZDAsIGZyb21fc3NpZCwgZnJvbSwKKwkJCQkgICAgICAgdG9faWQwLCB0b19zc2lkLCB0byk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlwcl9kZWJ1ZygiYmxhY2tsaXN0X3NldHVwOiBhZGRpbmcgcmFuZ2UgIgotCQkJCSAiZnJvbSAleC4leC4lMDR4IHRvICV4LiV4LiUwNHhcbiIsCi0JCQkJIGZyb21faWQwLCBmcm9tX3NzaWQsIGZyb20sIHRvX2lkMCwgdG9fc3NpZCwgdG8pOwogCQkJYmxhY2tsaXN0X3JhbmdlIChyYSwgZnJvbSwgdG8sIHRvX3NzaWQpOwogCQl9CiAJfQpAQCAtMjM5LDcgKzIzNiw3IEBACiAJCSAqLwogCQlibGFja2xpc3RfcGFyc2VfcGFyYW1ldGVycyAoYnVmICsgNCwgYWRkKTsKIAl9IGVsc2UgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAiY2lvX2lnbm9yZTogUGFyc2UgZXJyb3I7IFxuIgorCQlwcmludGsgKEtFUk5fV0FSTklORyAiY2lvOiBjaW9faWdub3JlOiBQYXJzZSBlcnJvcjsgXG4iCiAJCQlLRVJOX1dBUk5JTkcgInRyeSB1c2luZyAnZnJlZSBhbGx8PGRldm5vLXJhbmdlPiwiCiAJCQkJICAgICAiPGRldm5vLXJhbmdlPiwuLi4nXG4iCiAJCQlLRVJOX1dBUk5JTkcgIm9yICdhZGQgPGRldm5vLXJhbmdlPiwiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKaW5kZXggZTVjY2RhNi4uYjBhMThmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtMzU5LDcgKzM1OSw2IEBACiAJaWYgKChyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfb25saW5lKSkpCiAJCXJldHVybiByZXQ7CiAKLQlwcl9kZWJ1ZygiJXM6IGRldmljZSAlc1xuIiwgX19mdW5jX18sIGdkZXYtPmRldi5idXNfaWQpOwogCXJldCA9IGdkcnYtPnByb2JlID8gZ2Rydi0+cHJvYmUoZ2RldikgOiAtRU5PREVWOwogCWlmIChyZXQpCiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9vbmxpbmUpOwpAQCAtMzc2LDggKzM3NSw2IEBACiAJZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CiAJZ2RydiA9IHRvX2Njd2dyb3VwZHJ2KGRldi0+ZHJpdmVyKTsKIAotCXByX2RlYnVnKCIlczogZGV2aWNlICVzXG4iLCBfX2Z1bmNfXywgZ2Rldi0+ZGV2LmJ1c19pZCk7Ci0KIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfb25saW5lKTsKIAogCWlmIChnZHJ2ICYmIGdkcnYtPnJlbW92ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2NocC5jCmluZGV4IGI1N2Q5M2QuLjkyMGRkNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwpAQCAtMTIxLDE0ICsxMjEsOCBAQAogCUNJT19UUkFDRV9FVkVOVCggMiwgZGJmX3RleHQpOwogCiAJc3RhdHVzID0gY2hwX2dldF9zdGF0dXMoY2hwaWQpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgdmFyeSB1bmtub3duIGNocGlkICV4LiUwMnhcbiIsCi0JCSAgICAgICBjaHBpZC5jc3NpZCwgY2hwaWQuaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAoIW9uICYmICFzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjaHBpZCAleC4lMDJ4IGlzIGFscmVhZHkgb2ZmbGluZVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJjaW86IGNocGlkICV4LiUwMnggaXMgYWxyZWFkeSBvZmZsaW5lXG4iLAogCQkgICAgICAgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDIxLDIxICs0MTUsMTQgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJfSBlbHNlIHsKLQkJc3RhdGljIGludCBtc2dfZG9uZTsKLQotCQlpZiAoIW1zZ19kb25lKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaW86IENoYW5uZWwgbWVhc3VyZW1lbnRzIG5vdCAiCi0JCQkgICAgICAgImF2YWlsYWJsZSwgY29udGludWluZy5cbiIpOwotCQkJbXNnX2RvbmUgPSAxOwotCQl9CiAJCWNocC0+Y21nID0gLTE7CiAJfQogCiAJLyogbWFrZSBpdCBrbm93biB0byB0aGUgc3lzdGVtICovCiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZjaHAtPmRldik7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IHJlZ2lzdGVyICV4LiUwMnhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKKwkJQ0lPX01TR19FVkVOVCgwLCAiQ291bGQgbm90IHJlZ2lzdGVyIGNocCV4LiUwMng6ICVkXG4iLAorCQkJICAgICAgY2hwaWQuY3NzaWQsIGNocGlkLmlkLCByZXQpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNocC0+ZGV2LmtvYmosICZjaHBfYXR0cl9ncm91cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCmluZGV4IGVhOTJhYzQuLjU5N2MwYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCkBAIC05OTAsMTYgKzk5MCwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1jaHNjX2FsbG9jX3NlaV9hcmVhKHZvaWQpCitpbnQgX19pbml0IGNoc2NfYWxsb2Nfc2VpX2FyZWEodm9pZCkKIHsKIAlzZWlfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIXNlaV9wYWdlKQotCQlwcmludGsoS0VSTl9XQVJOSU5HIkNhbid0IGFsbG9jYXRlIHBhZ2UgZm9yIHByb2Nlc3Npbmcgb2YgIiBcCi0JCSAgICAgICAiY2hzYyBtYWNoaW5lIGNoZWNrcyFcbiIpOworCQlDSU9fTVNHX0VWRU5UKDAsICJDYW4ndCBhbGxvY2F0ZSBwYWdlIGZvciBwcm9jZXNzaW5nIG9mICIKKwkJCSAgICAgICJjaHNjIG1hY2hpbmUgY2hlY2tzIVxuIik7CiAJcmV0dXJuIChzZWlfcGFnZSA/IDAgOiAtRU5PTUVNKTsKIH0KIAordm9pZCBfX2luaXQgY2hzY19mcmVlX3NlaV9hcmVhKHZvaWQpCit7CisJa2ZyZWUoc2VpX3BhZ2UpOworfQorCiBpbnQgX19pbml0CiBjaHNjX2VuYWJsZV9mYWNpbGl0eShpbnQgb3BlcmF0aW9uX2NvZGUpCiB7CkBAIC0xMDUxLDggKzEwNTUsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN1YnN5c19pbml0Y2FsbChjaHNjX2FsbG9jX3NlaV9hcmVhKTsKLQogc3RydWN0IGNzc19nZW5lcmFsX2NoYXIgY3NzX2dlbmVyYWxfY2hhcmFjdGVyaXN0aWNzOwogc3RydWN0IGNzc19jaHNjX2NoYXIgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzOwogCkBAIC0xMDczLDggKzEwNzUsOCBAQAogCiAJc2NzY19hcmVhID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCWlmICghc2NzY19hcmVhKSB7Ci0JICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HImNpbzogV2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBhdmFpbGFibGUiIFwKLQkJICAgICAgICJDSFNDcyBkdWUgdG8gbm8gbWVtb3J5LlxuIik7CisJCUNJT19NU0dfRVZFTlQoMCwgIldhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgYXZhaWxhYmxlIgorCQkJICAgICAgIkNIU0NzIGR1ZSB0byBubyBtZW1vcnkuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDgzLDE1ICsxMDg1LDE1IEBACiAKIAlyZXN1bHQgPSBjaHNjKHNjc2NfYXJlYSk7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HImNpbzogV2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSAiIFwKLQkJICAgICAgICJhdmFpbGFibGUgQ0hTQ3MsIGNjPSVpLlxuIiwgcmVzdWx0KTsKKwkJQ0lPX01TR19FVkVOVCgwLCAiV2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBhdmFpbGFibGUgQ0hTQ3MsICIKKwkJCSAgICAgICJjYz0laS5cbiIsIHJlc3VsdCk7CiAJCXJlc3VsdCA9IC1FSU87CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoc2NzY19hcmVhLT5yZXNwb25zZS5jb2RlICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyJjaW86IFdhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgIiBcCi0JCSAgICAgICAiYXZhaWxhYmxlIENIU0NzLlxuIik7CisJCUNJT19NU0dfRVZFTlQoMCwgIldhcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgIgorCQkJICAgICAgImF2YWlsYWJsZSBDSFNDcy5cbiIpOwogCQlyZXN1bHQgPSAtRUlPOwogCQlnb3RvIGV4aXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaAppbmRleCAyYWQ4MWQxLi5kMWY1ZGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaApAQCAtNzksNiArNzksOCBAQAogCQkJICAgICBzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkKTsKIGV4dGVybiBpbnQgY2hzY19kZXRlcm1pbmVfY3NzX2NoYXJhY3RlcmlzdGljcyh2b2lkKTsKIGV4dGVybiBpbnQgY3NzX2NoYXJhY3RlcmlzdGljc19hdmFpbDsKK2V4dGVybiBpbnQgY2hzY19hbGxvY19zZWlfYXJlYSh2b2lkKTsKK2V4dGVybiB2b2lkIGNoc2NfZnJlZV9zZWlfYXJlYSh2b2lkKTsKIAogZXh0ZXJuIGludCBjaHNjX2VuYWJsZV9mYWNpbGl0eShpbnQpOwogc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggZWExZGVmYi4uZjI3MDhkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC00Nyw4ICs0Nyw4IEBACiAJZWxzZSBpZiAoIXN0cmNtcCAocGFybSwgIm5vIikpCiAJCWNpb19zaG93X21zZyA9IDA7CiAJZWxzZQotCQlwcmludGsgKEtFUk5fRVJSICJjaW9fc2V0dXAgOiBpbnZhbGlkIGNpb19tc2cgcGFyYW1ldGVyICclcyciLAotCQkJcGFybSk7CisJCXByaW50ayhLRVJOX0VSUiAiY2lvOiBjaW9fc2V0dXA6ICIKKwkJICAgICAgICJpbnZhbGlkIGNpb19tc2cgcGFyYW1ldGVyICclcyciLCBwYXJtKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtODAsNyArODAsNiBAQAogCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcgKGNpb19kZWJ1Z19jcndfaWQsICZkZWJ1Z19zcHJpbnRmX3ZpZXcpOwogCWRlYnVnX3NldF9sZXZlbCAoY2lvX2RlYnVnX2Nyd19pZCwgMik7Ci0JcHJfZGVidWcoImRlYnVnZ2luZyBpbml0aWFsaXplZFxuIik7CiAJcmV0dXJuIDA7CiAKIG91dF91bnJlZ2lzdGVyOgpAQCAtOTAsNyArODksNyBAQAogCQlkZWJ1Z191bnJlZ2lzdGVyIChjaW9fZGVidWdfdHJhY2VfaWQpOwogCWlmIChjaW9fZGVidWdfY3J3X2lkKQogCQlkZWJ1Z191bnJlZ2lzdGVyIChjaW9fZGVidWdfY3J3X2lkKTsKLQlwcl9kZWJ1ZygiY291bGQgbm90IGluaXRpYWxpemUgZGVidWdnaW5nXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HImNpbzogY291bGQgbm90IGluaXRpYWxpemUgZGVidWdnaW5nXG4iKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTU2OCw3ICs1NjcsNyBAQAogCSAqLwogCWlmIChzY2gtPnN0ICE9IDApIHsKIAkJQ0lPX0RFQlVHKEtFUk5fSU5GTywgMCwKLQkJCSAgIlN1YmNoYW5uZWwgMC4leC4lMDR4IHJlcG9ydHMgIgorCQkJICAiY2lvOiBTdWJjaGFubmVsIDAuJXguJTA0eCByZXBvcnRzICIKIAkJCSAgIm5vbi1JL08gc3ViY2hhbm5lbCB0eXBlICUwNFhcbiIsCiAJCQkgIHNjaC0+c2NoaWQuc3NpZCwgc2NoLT5zY2hpZC5zY2hfbm8sIHNjaC0+c3QpOwogCQkvKiBXZSBzdG9wIGhlcmUgZm9yIG5vbi1pbyBzdWJjaGFubmVscy4gKi8KQEAgLTYwMSw3ICs2MDAsNyBAQAogCXNjaC0+bHBtID0gc2NoLT5zY2hpYi5wbWN3LnBhbSAmIHNjaC0+b3BtOwogCiAJQ0lPX0RFQlVHKEtFUk5fSU5GTywgMCwKLQkJICAiRGV0ZWN0ZWQgZGV2aWNlICUwNHggb24gc3ViY2hhbm5lbCAwLiV4LiUwNFgiCisJCSAgImNpbzogRGV0ZWN0ZWQgZGV2aWNlICUwNHggb24gc3ViY2hhbm5lbCAwLiV4LiUwNFgiCiAJCSAgIiAtIFBJTSA9ICUwMlgsIFBBTSA9ICUwMlgsIFBPTSA9ICUwMlhcbiIsCiAJCSAgc2NoLT5zY2hpYi5wbWN3LmRldiwgc2NoLT5zY2hpZC5zc2lkLAogCQkgIHNjaC0+c2NoaWQuc2NoX25vLCBzY2gtPnNjaGliLnBtY3cucGltLApAQCAtNzY2LDcgKzc2NSw3IEBACiAJCS8qIHVubGlrZSBpbiAyLjQsIHdlIGNhbm5vdCBhdXRvcHJvYmUgaGVyZSwgc2luY2UKIAkJICogdGhlIGNoYW5uZWwgc3Vic3lzdGVtIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZC4KIAkJICogV2l0aCBzb21lIGx1Y2ssIHRoZSBIV0MgY29uc29sZSBjYW4gdGFrZSBvdmVyICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIGNjdyBjb25zb2xlIGZvdW5kIVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogTm8gY2N3IGNvbnNvbGUgZm91bmQhXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXR1cm4gY29uc29sZV9pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Npb19kZWJ1Zy5oIGIvZHJpdmVycy9zMzkwL2Npby9jaW9fZGVidWcuaAppbmRleCBmODg4NDRhLi5jOWJmODk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Npb19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvX2RlYnVnLmgKQEAgLTIzLDYgKzIzLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogQ0lPX0hFWF9FVkVOVChpbnQgbGV2ZWwsIHZvaWQgKmRhdGEsIGludCBsZW5ndGgpCiB7CisJaWYgKHVubGlrZWx5KCFjaW9fZGVidWdfdHJhY2VfaWQpKQorCQlyZXR1cm47CiAJd2hpbGUgKGxlbmd0aCA+IDApIHsKIAkJZGVidWdfZXZlbnQoY2lvX2RlYnVnX3RyYWNlX2lkLCBsZXZlbCwgZGF0YSwgbGVuZ3RoKTsKIAkJbGVuZ3RoIC09IGNpb19kZWJ1Z190cmFjZV9pZC0+YnVmX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NtZi5jIGIvZHJpdmVycy9zMzkwL2Npby9jbWYuYwppbmRleCAyOGFiZDY5Li4wMmZkMDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2NtZi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY21mLmMKQEAgLTExODUsMTIgKzExODUsMTIgQEAKIAljYXNlICcwJzoKIAkJcmV0ID0gZGlzYWJsZV9jbWYoY2Rldik7CiAJCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9JTkZPICJkaXNhYmxlX2NtZiBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJCWRldl9pbmZvKCZjZGV2LT5kZXYsICJkaXNhYmxlX2NtZiBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIAkJYnJlYWs7CiAJY2FzZSAnMSc6CiAJCXJldCA9IGVuYWJsZV9jbWYoY2Rldik7CiAJCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKLQkJCXByaW50ayhLRVJOX0lORk8gImVuYWJsZV9jbWYgZmFpbGVkICglZClcbiIsIHJldCk7CisJCQlkZXZfaW5mbygmY2Rldi0+ZGV2LCAiZW5hYmxlX2NtZiBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMjgwLDEwICsxMjgwLDEwIEBACiAJCWZvcm1hdF9zdHJpbmcgPSAiYmFzaWMiOwogCQljbWJvcHMgPSAmY21ib3BzX2Jhc2ljOwogCQlpZiAoY21iX2FyZWEubnVtX2NoYW5uZWxzID4gNDA5NiB8fCBjbWJfYXJlYS5udW1fY2hhbm5lbHMgPCAxKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkJhc2ljIGNoYW5uZWwgbWVhc3VyZW1lbnQgZmFjaWxpdHkiCi0JCQkJCSIgY2FuIG9ubHkgdXNlIDEgdG8gNDA5NiBkZXZpY2VzXG4iCisJCQlwcmludGsoS0VSTl9FUlIgImNpbzogQmFzaWMgY2hhbm5lbCBtZWFzdXJlbWVudCAiCisJCQkgICAgICAgImZhY2lsaXR5IGNhbiBvbmx5IHVzZSAxIHRvIDQwOTYgZGV2aWNlc1xuIgogCQkJICAgICAgIEtFUk5fRVJSICJ3aGVuIHRoZSBjbWYgZHJpdmVyIGlzIGJ1aWx0IgotCQkJCQkiIGFzIGEgbG9hZGFibGUgbW9kdWxlXG4iKTsKKwkJCSAgICAgICAiIGFzIGEgbG9hZGFibGUgbW9kdWxlXG4iKTsKIAkJCXJldHVybiAxOwogCQl9CiAJCWJyZWFrOwpAQCAtMTI5MiwxMyArMTI5MiwxMyBAQAogCQljbWJvcHMgPSAmY21ib3BzX2V4dGVuZGVkOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgZm9ybWF0ICVkIGZvciBjaGFubmVsICIKKwkJcHJpbnRrKEtFUk5fRVJSICJjaW86IEludmFsaWQgZm9ybWF0ICVkIGZvciBjaGFubmVsICIKIAkJCSJtZWFzdXJlbWVudCBmYWNpbGl0eVxuIiwgZm9ybWF0KTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ2hhbm5lbCBtZWFzdXJlbWVudCBmYWNpbGl0eSB1c2luZyAlcyBmb3JtYXQgKCVzKVxuIiwKLQkJZm9ybWF0X3N0cmluZywgZGV0ZWN0X3N0cmluZyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY2lvOiBDaGFubmVsIG1lYXN1cmVtZW50IGZhY2lsaXR5IHVzaW5nICVzICIKKwkgICAgICAgImZvcm1hdCAoJXMpXG4iLCBmb3JtYXRfc3RyaW5nLCBkZXRlY3Rfc3RyaW5nKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggZGZjYTBlZi4uMWMyN2E1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAl9CiB9CiAKLWludCBjc3Nfc2NoX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIGludCBjc3Nfc2NoX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewogCWludCByZXQ7CiAKQEAgLTE4NCw4ICsxODQsOCBAQAogCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLwogCXJldCA9IGNzc19zY2hfZGV2aWNlX3JlZ2lzdGVyKHNjaCk7CiAJaWYgKHJldCkgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCByZWdpc3RlciAlc1xuIiwKLQkJCV9fZnVuY19fLCBzY2gtPmRldi5idXNfaWQpOworCQlDSU9fTVNHX0VWRU5UKDAsICJDb3VsZCBub3QgcmVnaXN0ZXIgc2NoIDAuJXguJTA0eDogJWRcbiIsCisJCQkgICAgICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMzcxLDE1ICszNzEsMTIgQEAKIAlzcGluX2xvY2tfaW5pdCgmc2xvd19zdWJjaGFubmVsX2xvY2spOwogCXNsb3dfc3ViY2hhbm5lbF9zZXQgPSBpZHNldF9zY2hfbmV3KCk7CiAJaWYgKCFzbG93X3N1YmNoYW5uZWxfc2V0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogY291bGQgbm90IGFsbG9jYXRlIHNsb3cgc3ViY2hhbm5lbCAiCi0JCSAgICAgICAic2V0XG4iKTsKKwkJQ0lPX01TR19FVkVOVCgwLCAiY291bGQgbm90IGFsbG9jYXRlIHNsb3cgc3ViY2hhbm5lbCBzZXRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN1YnN5c19pbml0Y2FsbChzbG93X3N1YmNoYW5uZWxfaW5pdCk7Ci0KIHN0YXRpYyB2b2lkIGNzc19zbG93X3BhdGhfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKQEAgLTQyNSw4ICs0MjIsOCBAQAogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJaW50IHJldDsKIAotCUNJT19ERUJVRyhLRVJOX0lORk8sIDYsICJjaW86IHJlcHJvYmUgMC4leC4lMDR4XG4iLAotCQkgIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7CisJQ0lPX01TR19FVkVOVCg2LCAiY2lvOiByZXByb2JlIDAuJXguJTA0eFxuIiwKKwkJICAgICAgc2NoaWQuc3NpZCwgc2NoaWQuc2NoX25vKTsKIAlpZiAobmVlZF9yZXByb2JlKQogCQlyZXR1cm4gLUVBR0FJTjsKIApAQCAtNjQyLDkgKzYzOSwyMCBAQAogewogCWludCByZXQsIGk7CiAKLQlpZiAoY2hzY19kZXRlcm1pbmVfY3NzX2NoYXJhY3RlcmlzdGljcygpID09IDApCisJcmV0ID0gY2hzY19kZXRlcm1pbmVfY3NzX2NoYXJhY3RlcmlzdGljcygpOworCWlmIChyZXQgPT0gLUVOT01FTSkKKwkJZ290byBvdXQ7IC8qIE5vIG5lZWQgdG8gY29udGludWUuICovCisJaWYgKHJldCA9PSAwKQogCQljc3NfY2hhcmFjdGVyaXN0aWNzX2F2YWlsID0gMTsKIAorCXJldCA9IGNoc2NfYWxsb2Nfc2VpX2FyZWEoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHNsb3dfc3ViY2hhbm5lbF9pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKIAlpZiAoKHJldCA9IGJ1c19yZWdpc3RlcigmY3NzX2J1c190eXBlKSkpCiAJCWdvdG8gb3V0OwogCkBAIC03MTAsNiArNzE4LDEwIEBACiBvdXRfYnVzOgogCWJ1c191bnJlZ2lzdGVyKCZjc3NfYnVzX3R5cGUpOwogb3V0OgorCWNoc2NfZnJlZV9zZWlfYXJlYSgpOworCWtmcmVlKHNsb3dfc3ViY2hhbm5lbF9zZXQpOworCXByaW50ayhLRVJOX1dBUk5JTkciY2lvOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjc3MgZHJpdmVyICglZCkhXG4iLAorCSAgICAgICByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCmluZGV4IGVkNzk3NzUuLjVkNjVlODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaApAQCAtMTM5LDcgKzEzOSw2IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgY3NzX2J1c190eXBlOwogCi1leHRlcm4gaW50IGNzc19zY2hfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBzdWJjaGFubmVsICopOwogZXh0ZXJuIHZvaWQgY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIGV4dGVybiBzdHJ1Y3Qgc3ViY2hhbm5lbCAqIGdldF9zdWJjaGFubmVsX2J5X3NjaGlkKHN0cnVjdCBzdWJjaGFubmVsX2lkKTsKIGV4dGVybiBpbnQgY3NzX2luaXRfZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IDAwMTY4MmUuLjI5NzY1OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMzM4LDE1ICszMzgsMjAgQEAKIAkJcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soJmNkZXYtPmRldiwKIAkJCQkJICAgICAgY2N3X2RldmljZV9yZW1vdmVfb3JwaGFuX2NiKTsKIAkJaWYgKHJjKQotCQkJZGV2X2luZm8oJmNkZXYtPmRldiwgIkNvdWxkbid0IHVucmVnaXN0ZXIgb3JwaGFuXG4iKTsKKwkJCUNJT19NU0dfRVZFTlQoMiwgIkNvdWxkbid0IHVucmVnaXN0ZXIgb3JwaGFuICIKKwkJCQkgICAgICAiMC4leC4lMDR4XG4iLAorCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CiAJCXJldHVybjsKIAl9CiAJLyogRGVyZWdpc3RlciBzdWJjaGFubmVsLCB3aGljaCB3aWxsIGtpbGwgdGhlIGNjdyBkZXZpY2UuICovCiAJcmMgPSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soY2Rldi0+ZGV2LnBhcmVudCwKIAkJCQkgICAgICBjY3dfZGV2aWNlX3JlbW92ZV9zY2hfY2IpOwogCWlmIChyYykKLQkJZGV2X2luZm8oJmNkZXYtPmRldiwKLQkJCSAiQ291bGRuJ3QgdW5yZWdpc3RlciBkaXNjb25uZWN0ZWQgZGV2aWNlXG4iKTsKKwkJQ0lPX01TR19FVkVOVCgyLCAiQ291bGRuJ3QgdW5yZWdpc3RlciBkaXNjb25uZWN0ZWQgZGV2aWNlICIKKwkJCSAgICAgICIwLiV4LiUwNHhcbiIsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CiB9CiAKIGludApAQCAtMzc5LDggKzM4NCwxMCBAQAogCWlmIChyZXQgPT0gMCkKIAkJd2FpdF9ldmVudChjZGV2LT5wcml2YXRlLT53YWl0X3EsIGRldl9mc21fZmluYWxfc3RhdGUoY2RldikpOwogCWVsc2UgewotCQlwcl9kZWJ1ZygiY2N3X2RldmljZV9vZmZsaW5lIHJldHVybmVkICVkLCBkZXZpY2UgJXNcbiIsCi0JCQkgcmV0LCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJQ0lPX01TR19FVkVOVCgyLCAiY2N3X2RldmljZV9vZmZsaW5lIHJldHVybmVkICVkLCAiCisJCQkgICAgICAiZGV2aWNlIDAuJXguJTA0eFxuIiwKKwkJCSAgICAgIHJldCwgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8pOwogCQljZGV2LT5vbmxpbmUgPSAxOwogCX0KICAJcmV0dXJuIHJldDsKQEAgLTQwMiw4ICs0MDksMTAgQEAKIAlpZiAocmV0ID09IDApCiAJCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLCBkZXZfZnNtX2ZpbmFsX3N0YXRlKGNkZXYpKTsKIAllbHNlIHsKLQkJcHJfZGVidWcoImNjd19kZXZpY2Vfb25saW5lIHJldHVybmVkICVkLCBkZXZpY2UgJXNcbiIsCi0JCQkgcmV0LCBjZGV2LT5kZXYuYnVzX2lkKTsKKwkJQ0lPX01TR19FVkVOVCgyLCAiY2N3X2RldmljZV9vbmxpbmUgcmV0dXJuZWQgJWQsICIKKwkJCSAgICAgICJkZXZpY2UgMC4leC4lMDR4XG4iLAorCQkJICAgICAgcmV0LCBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CiAJCXJldHVybiByZXQ7CiAJfQogCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FKQpAQCAtNDE3LDkgKzQyNiwxMSBAQAogCXNwaW5fdW5sb2NrX2lycShjZGV2LT5jY3dsb2NrKTsKIAlpZiAocmV0ID09IDApCiAJCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLCBkZXZfZnNtX2ZpbmFsX3N0YXRlKGNkZXYpKTsKLQllbHNlIAotCQlwcl9kZWJ1ZygiY2N3X2RldmljZV9vZmZsaW5lIHJldHVybmVkICVkLCBkZXZpY2UgJXNcbiIsCi0JCQkgcmV0LCBjZGV2LT5kZXYuYnVzX2lkKTsKKwllbHNlCisJCUNJT19NU0dfRVZFTlQoMiwgImNjd19kZXZpY2Vfb2ZmbGluZSByZXR1cm5lZCAlZCwgIgorCQkJICAgICAgImRldmljZSAwLiV4LiUwNHhcbiIsCisJCQkgICAgICByZXQsIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vKTsKIAlyZXR1cm4gKHJldCA9PSAwKSA/IC1FTk9ERVYgOiByZXQ7CiB9CiAKQEAgLTQzOSw5ICs0NTAsMTAgQEAKIAlpZiAoY2Rldi0+aWQuY3VfdHlwZSA9PSAwKSB7CiAJCXJldCA9IGNjd19kZXZpY2VfcmVjb2duaXRpb24oY2Rldik7CiAJCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkciQ291bGRuJ3Qgc3RhcnQgcmVjb2duaXRpb24gIgotCQkJICAgICAgICJmb3IgZGV2aWNlICVzIChyZXQ9JWQpXG4iLAotCQkJICAgICAgIGNkZXYtPmRldi5idXNfaWQsIHJldCk7CisJCQlDSU9fTVNHX0VWRU5UKDAsICJDb3VsZG4ndCBzdGFydCByZWNvZ25pdGlvbiAiCisJCQkJICAgICAgImZvciBkZXZpY2UgMC4leC4lMDR4IChyZXQ9JWQpXG4iLAorCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJd2FpdF9ldmVudChjZGV2LT5wcml2YXRlLT53YWl0X3EsCkBAIC00NjEsOCArNDczLDggQEAKIAlpZiAoZm9yY2UgJiYgY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0JPWEVEKSB7CiAJCXJldCA9IGNjd19kZXZpY2Vfc3RsY2soY2Rldik7CiAJCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkciY2N3X2RldmljZV9zdGxjayBmb3IgZGV2aWNlICVzICIKLQkJCSAgICAgICAicmV0dXJuZWQgJWQhXG4iLCBjZGV2LT5kZXYuYnVzX2lkLCByZXQpOworCQkJZGV2X3dhcm4oJmNkZXYtPmRldiwKKwkJCQkgImNjd19kZXZpY2Vfc3RsY2sgcmV0dXJuZWQgJWQhXG4iLCByZXQpOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChjZGV2LT5pZC5jdV90eXBlID09IDApCkBAIC04OTMsOCArOTA1LDEwIEBACiAJCQlyZXQgPSBkZXZpY2VfcmVwcm9iZSgmY2Rldi0+ZGV2KTsKIAkJCWlmIChyZXQpCiAJCQkJLyogV2UgY2FuJ3QgZG8gbXVjaCBoZXJlLiAqLwotCQkJCWRldl9pbmZvKCZjZGV2LT5kZXYsICJkZXZpY2VfcmVwcm9iZSgpIHJldHVybmVkIgotCQkJCQkgIiAlZFxuIiwgcmV0KTsKKwkJCQlDSU9fTVNHX0VWRU5UKDIsICJkZXZpY2VfcmVwcm9iZSgpIHJldHVybmVkIgorCQkJCQkgICAgICAiICVkIGZvciAwLiV4LiUwNHhcbiIsIHJldCwKKwkJCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CiAJCX0KIAkJZ290byBvdXQ7CiAJfQpAQCAtOTA3LDggKzkyMSw5IEBACiAJLyogbWFrZSBpdCBrbm93biB0byB0aGUgc3lzdGVtICovCiAJcmV0ID0gY2N3X2RldmljZV9yZWdpc3RlcihjZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IHJlZ2lzdGVyICVzXG4iLAotCQkJX19mdW5jX18sIGNkZXYtPmRldi5idXNfaWQpOworCQlDSU9fTVNHX0VWRU5UKDAsICJDb3VsZCBub3QgcmVnaXN0ZXIgY2N3IGRldiAwLiV4LiUwNHg6ICVkXG4iLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHJldCk7CiAJCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOwogCQlzY2gtPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7CkBAIC0xMzYxLDcgKzEzNzYsNiBAQAogCXN0cnVjdCBjY3dfZHJpdmVyICpjZHJ2ID0gY2Rldi0+ZHJ2OwogCWludCByZXQ7CiAKLQlwcl9kZWJ1ZygicmVtb3ZpbmcgZGV2aWNlICVzXG4iLCBjZGV2LT5kZXYuYnVzX2lkKTsKIAlpZiAoY2Rydi0+cmVtb3ZlKQogCQljZHJ2LT5yZW1vdmUoY2Rldik7CiAJaWYgKGNkZXYtPm9ubGluZSkgewpAQCAtMTM3NCw4ICsxMzg4LDEwIEBACiAJCQkJICAgZGV2X2ZzbV9maW5hbF9zdGF0ZShjZGV2KSk7CiAJCWVsc2UKIAkJCS8vRklYTUU6IHdlIGNhbid0IGZhaWwhCi0JCQlwcl9kZWJ1ZygiY2N3X2RldmljZV9vZmZsaW5lIHJldHVybmVkICVkLCBkZXZpY2UgJXNcbiIsCi0JCQkJIHJldCwgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQlDSU9fTVNHX0VWRU5UKDIsICJjY3dfZGV2aWNlX29mZmxpbmUgcmV0dXJuZWQgJWQsICIKKwkJCQkgICAgICAiZGV2aWNlIDAuJXguJTA0eFxuIiwKKwkJCQkgICAgICByZXQsIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyk7CiAJfQogCWNjd19kZXZpY2Vfc2V0X3RpbWVvdXQoY2RldiwgMCk7CiAJY2Rldi0+ZHJ2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggNmJiYTgwOS4uODYzM2RjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIERFVl9TVEFURV9OT1RfT1BFUjoKIAkJQ0lPX0RFQlVHKEtFUk5fV0FSTklORywgMiwKLQkJCSAgIlNlbnNlSUQgOiB1bmtub3duIGRldmljZSAlMDR4IG9uIHN1YmNoYW5uZWwgIgorCQkJICAiY2lvOiBTZW5zZUlEIDogdW5rbm93biBkZXZpY2UgJTA0eCBvbiBzdWJjaGFubmVsICIKIAkJCSAgIjAuJXguJTA0eFxuIiwgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAogCQkJICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vKTsKIAkJYnJlYWs7CkBAIC0yOTMsNyArMjkzLDggQEAKIAkJCXJldHVybjsKIAkJfQogCQkvKiBJc3N1ZSBkZXZpY2UgaW5mbyBtZXNzYWdlLiAqLwotCQlDSU9fREVCVUcoS0VSTl9JTkZPLCAyLCAiU2Vuc2VJRCA6IGRldmljZSAwLiV4LiUwNHggcmVwb3J0czogIgorCQlDSU9fREVCVUcoS0VSTl9JTkZPLCAyLAorCQkJICAiY2lvOiBTZW5zZUlEIDogZGV2aWNlIDAuJXguJTA0eCByZXBvcnRzOiAiCiAJCQkgICJDVSAgVHlwZS9Nb2QgPSAlMDRYLyUwMlgsIERldiBUeXBlL01vZCA9ICIKIAkJCSAgIiUwNFgvJTAyWFxuIiwKIAkJCSAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCkBAIC0zMDMsNyArMzA0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBERVZfU1RBVEVfQk9YRUQ6CiAJCUNJT19ERUJVRyhLRVJOX1dBUk5JTkcsIDIsCi0JCQkgICJTZW5zZUlEIDogYm94ZWQgZGV2aWNlICUwNHggb24gc3ViY2hhbm5lbCAiCisJCQkgICJjaW86IFNlbnNlSUQgOiBib3hlZCBkZXZpY2UgJTA0eCBvbiBzdWJjaGFubmVsICIKIAkJCSAgIjAuJXguJTA0eFxuIiwgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLAogCQkJICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vKTsKIAkJYnJlYWs7CkBAIC0zODgsNyArMzg5LDcgQEAKIAogCWlmIChzdGF0ZSA9PSBERVZfU1RBVEVfQk9YRUQpCiAJCUNJT19ERUJVRyhLRVJOX1dBUk5JTkcsIDIsCi0JCQkgICJCb3hlZCBkZXZpY2UgJTA0eCBvbiBzdWJjaGFubmVsICUwNHhcbiIsCisJCQkgICJjaW86IEJveGVkIGRldmljZSAlMDR4IG9uIHN1YmNoYW5uZWwgJTA0eFxuIiwKIAkJCSAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCBzY2gtPnNjaGlkLnNjaF9ubyk7CiAKIAlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkpIHsKQEAgLTk0Niw5ICs5NDcsMTAgQEAKIAkJCS8qIEJhc2ljIHNlbnNlIGhhc24ndCBzdGFydGVkLiBUcnkgYWdhaW4uICovCiAJCQljY3dfZGV2aWNlX2RvX3NlbnNlKGNkZXYsIGlyYik7CiAJCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSHVoPyAlcyglcyk6IHVuc29saWNpdGVkICIKLQkJCSAgICAgICAiaW50ZXJydXB0Li4uXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgY2Rldi0+ZGV2LmJ1c19pZCk7CisJCQlDSU9fTVNHX0VWRU5UKDIsICJIdWg/IDAuJXguJTA0eDogdW5zb2xpY2l0ZWQgIgorCQkJCSAgICAgICJpbnRlcnJ1cHQgZHVyaW5nIHc0c2Vuc2UuLi5cbiIsCisJCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vKTsKIAkJCWlmIChjZGV2LT5oYW5kbGVyKQogCQkJCWNkZXYtPmhhbmRsZXIgKGNkZXYsIDAsIGlyYik7CiAJCX0KQEAgLTEyMTUsOCArMTIxNyw4IEBACiBzdGF0aWMgdm9pZAogY2N3X2RldmljZV9idWcoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGVudW0gZGV2X2V2ZW50IGRldl9ldmVudCkKIHsKLQlwcmludGsoS0VSTl9FTUVSRyAiZGV2X2p1bXB0YWJsZVslaV1bJWldID09IE5VTExcbiIsCi0JICAgICAgIGNkZXYtPnByaXZhdGUtPnN0YXRlLCBkZXZfZXZlbnQpOworCUNJT19NU0dfRVZFTlQoMCwgImRldl9qdW1wdGFibGVbJWldWyVpXSA9PSBOVUxMXG4iLAorCQkgICAgICBjZGV2LT5wcml2YXRlLT5zdGF0ZSwgZGV2X2V2ZW50KTsKIAlCVUcoKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYwppbmRleCBhNWQyNjNmLi4xNGViYTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYwpAQCAtMjg4LDI1MyArMjg4LDYgQEAKIAkJcmV0dXJuIHNjaC0+bHBtOwogfQogCi1zdGF0aWMgdm9pZAotY2N3X2RldmljZV93YWtlX3VwKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBsb25nIGlwLCBzdHJ1Y3QgaXJiICppcmIpCi17Ci0JaWYgKCFpcCkKLQkJLyogdW5zb2xpY2l0ZWQgaW50ZXJydXB0ICovCi0JCXJldHVybjsKLQotCS8qIEFidXNlIGludHBhcm0gZm9yIGVycm9yIHJlcG9ydGluZy4gKi8KLQlpZiAoSVNfRVJSKGlyYikpCi0JCWNkZXYtPnByaXZhdGUtPmludHBhcm0gPSAtRUlPOwotCWVsc2UgaWYgKGlyYi0+c2Nzdy5jYyA9PSAxKQotCQkvKiBSZXRyeSBmb3IgZGVmZXJyZWQgY29uZGl0aW9uIGNvZGUuICovCi0JCWNkZXYtPnByaXZhdGUtPmludHBhcm0gPSAtRUFHQUlOOwotCWVsc2UgaWYgKChpcmItPnNjc3cuZHN0YXQgIT0KLQkJICAoREVWX1NUQVRfQ0hOX0VORHxERVZfU1RBVF9ERVZfRU5EKSkgfHwKLQkJIChpcmItPnNjc3cuY3N0YXQgIT0gMCkpIHsKLQkJLyoKLQkJICogV2UgZGlkbid0IGdldCBjaGFubmVsIGVuZCAvIGRldmljZSBlbmQuIENoZWNrIGlmIHBhdGgKLQkJICogdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQ7IHdlIGNhbiByZXRyeSBhZnRlciBpdCBoYXMKLQkJICogZmluaXNoZWQuIFdlIGFsc28gcmV0cnkgdW5pdCBjaGVja3MgZXhjZXB0IGZvciBjb21tYW5kIHJlamVjdAotCQkgKiBvciBpbnRlcnZlbnRpb24gcmVxdWlyZWQuIEFsc28gY2hlY2sgZm9yIGxvbmcgYnVzeQotCQkgKiBjb25kaXRpb25zLgotCQkgKi8KLQkJIGlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5kb3ZlcmlmeSB8fAotCQkJIGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9WRVJJRlkpCi0JCQkgY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9IC1FQUdBSU47Ci0JCWVsc2UgaWYgKChpcmItPnNjc3cuZHN0YXQgJiBERVZfU1RBVF9VTklUX0NIRUNLKSAmJgotCQkJICEoaXJiLT5lY3dbMF0gJgotCQkJICAgKFNOUzBfQ01EX1JFSkVDVCB8IFNOUzBfSU5URVJWRU5USU9OX1JFUSkpKQotCQkJY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9IC1FQUdBSU47Ci0JCWVsc2UgaWYgKChpcmItPnNjc3cuZHN0YXQgJiBERVZfU1RBVF9BVFRFTlRJT04pICYmCi0JCQkgKGlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX0RFVl9FTkQpICYmCi0JCQkgKGlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX1VOSVRfRVhDRVApKQotCQkJY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9IC1FQUdBSU47Ci0JCSBlbHNlCi0JCQkgY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9IC1FSU87Ci0JCQkgCi0JfSBlbHNlCi0JCWNkZXYtPnByaXZhdGUtPmludHBhcm0gPSAwOwotCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7Ci19Ci0KLXN0YXRpYyBpbnQKLV9fY2N3X2RldmljZV9yZXRyeV9sb29wKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3QgY2N3MSAqY2N3LCBsb25nIG1hZ2ljLCBfX3U4IGxwbSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0KLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCWRvIHsKLQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCA2MCAqIEhaKTsKLQkJcmV0ID0gY2lvX3N0YXJ0IChzY2gsIGNjdywgbHBtKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKLQkJaWYgKHJldCA9PSAtRUJVU1kpIHsKLQkJCS8qIFRyeSBhZ2FpbiBsYXRlci4gKi8KLQkJCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotCQkJbXNsZWVwKDEwKTsKLQkJCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChyZXQgIT0gMCkKLQkJCS8qIE5vbi1yZXRyeWFibGUgZXJyb3IuICovCi0JCQlicmVhazsKLQkJLyogV2FpdCBmb3IgZW5kIG9mIHJlcXVlc3QuICovCi0JCWNkZXYtPnByaXZhdGUtPmludHBhcm0gPSBtYWdpYzsKLQkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7Ci0JCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAotCQkJICAgKGNkZXYtPnByaXZhdGUtPmludHBhcm0gPT0gLUVJTykgfHwKLQkJCSAgIChjZGV2LT5wcml2YXRlLT5pbnRwYXJtID09IC1FQUdBSU4pIHx8Ci0JCQkgICAoY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9PSAwKSk7Ci0JCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQkJLyogQ2hlY2sgYXQgbGVhc3QgZm9yIGNoYW5uZWwgZW5kIC8gZGV2aWNlIGVuZCAqLwotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9PSAtRUlPKSB7Ci0JCQkvKiBOb24tcmV0cnlhYmxlIGVycm9yLiAqLwotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjZGV2LT5wcml2YXRlLT5pbnRwYXJtID09IDApCi0JCQkvKiBTdWNjZXNzLiAqLwotCQkJYnJlYWs7Ci0JCS8qIFRyeSBhZ2FpbiBsYXRlci4gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7Ci0JCW1zbGVlcCgxMCk7Ci0JCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQl9IHdoaWxlICgxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogcmVhZF9kZXZfY2hhcnMoKSAtIHJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljcwotICogQHBhcmFtIGNkZXYgICB0YXJnZXQgY2N3IGRldmljZQotICogQHBhcmFtIGJ1ZmZlciBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgcmRjIGRhdGEKLSAqIEBwYXJhbSBsZW5ndGggc2l6ZSBvZiByZGMgZGF0YQotICogQHJldHVybnMgMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZQotICoKLSAqIENvbnRleHQ6Ci0gKiAgIGNhbGxlZCBmb3Igb25saW5lIGRldmljZSwgbG9jayBub3QgaGVsZAotICoqLwotaW50Ci1yZWFkX2Rldl9jaGFycyAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKipidWZmZXIsIGludCBsZW5ndGgpCi17Ci0Jdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpcmIgKik7Ci0Jc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKLQlpbnQgcmV0OwotCXN0cnVjdCBjY3cxICpyZGNfY2N3OwotCi0JaWYgKCFjZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWJ1ZmZlciB8fCAhbGVuZ3RoKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwotCi0JQ0lPX1RSQUNFX0VWRU5UICg0LCAicmRkZXZjaCIpOwotCUNJT19UUkFDRV9FVkVOVCAoNCwgc2NoLT5kZXYuYnVzX2lkKTsKLQotCXJkY19jY3cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2N3MSksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoIXJkY19jY3cpCi0JCXJldHVybiAtRU5PTUVNOwotCXJkY19jY3ctPmNtZF9jb2RlID0gQ0NXX0NNRF9SREM7Ci0JcmRjX2Njdy0+Y291bnQgPSBsZW5ndGg7Ci0JcmRjX2Njdy0+ZmxhZ3MgPSBDQ1dfRkxBR19TTEk7Ci0JcmV0ID0gc2V0X25vcm1hbGl6ZWRfY2RhIChyZGNfY2N3LCAoKmJ1ZmZlcikpOwotCWlmIChyZXQgIT0gMCkgewotCQlrZnJlZShyZGNfY2N3KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7Ci0JLyogU2F2ZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KLQloYW5kbGVyID0gY2Rldi0+aGFuZGxlcjsKLQkvKiBUZW1wb3JhcmlseSBpbnN0YWxsIG93biBoYW5kbGVyLiAqLwotCWNkZXYtPmhhbmRsZXIgPSBjY3dfZGV2aWNlX3dha2VfdXA7Ci0JaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9PTkxJTkUpCi0JCXJldCA9IC1FTk9ERVY7Ci0JZWxzZSBpZiAoKChzY2gtPnNjaGliLnNjc3cuc3RjdGwgJiBTQ1NXX1NUQ1RMX1BSSU1fU1RBVFVTKSAmJgotCQkgICEoc2NoLT5zY2hpYi5zY3N3LnN0Y3RsICYgU0NTV19TVENUTF9TRUNfU1RBVFVTKSkgfHwKLQkJIGNkZXYtPnByaXZhdGUtPmZsYWdzLmRvdmVyaWZ5KQotCQlyZXQgPSAtRUJVU1k7Ci0JZWxzZQotCQkvKiAweDAwRDlDNEMzID09IGViY2RpYyAiUkRDIiAqLwotCQlyZXQgPSBfX2Njd19kZXZpY2VfcmV0cnlfbG9vcChjZGV2LCByZGNfY2N3LCAweDAwRDlDNEMzLCAwKTsKLQotCS8qIFJlc3RvcmUgaW50ZXJydXB0IGhhbmRsZXIuICovCi0JY2Rldi0+aGFuZGxlciA9IGhhbmRsZXI7Ci0Jc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7Ci0KLQljbGVhcl9ub3JtYWxpemVkX2NkYSAocmRjX2Njdyk7Ci0Ja2ZyZWUocmRjX2Njdyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogIFJlYWQgQ29uZmlndXJhdGlvbiBkYXRhIHVzaW5nIHBhdGggbWFzawotICovCi1pbnQKLXJlYWRfY29uZl9kYXRhX2xwbSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKipidWZmZXIsIGludCAqbGVuZ3RoLCBfX3U4IGxwbSkKLXsKLQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNjd19kZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGlyYiAqKTsKLQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCXN0cnVjdCBjaXcgKmNpdzsKLQljaGFyICpyY2RfYnVmOwotCWludCByZXQ7Ci0Jc3RydWN0IGNjdzEgKnJjZF9jY3c7Ci0KLQlpZiAoIWNkZXYpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghYnVmZmVyIHx8ICFsZW5ndGgpCi0JCXJldHVybiAtRUlOVkFMOwotCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0KLQlDSU9fVFJBQ0VfRVZFTlQgKDQsICJyZGNvbmYiKTsKLQlDSU9fVFJBQ0VfRVZFTlQgKDQsIHNjaC0+ZGV2LmJ1c19pZCk7Ci0KLQkvKgotCSAqIHNjYW4gZm9yIFJDRCBjb21tYW5kIGluIGV4dGVuZGVkIFNlbnNlSUQgZGF0YQotCSAqLwotCWNpdyA9IGNjd19kZXZpY2VfZ2V0X2NpdyhjZGV2LCBDSVdfVFlQRV9SQ0QpOwotCWlmICghY2l3IHx8IGNpdy0+Y21kID09IDApCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIEFkanVzdCByZXF1ZXN0ZWQgcGF0aCBtYXNrIHRvIGV4Y2x1ZGVkIHZhcmllZCBvZmYgcGF0aHMuICovCi0JaWYgKGxwbSkgewotCQlscG0gJj0gc2NoLT5vcG07Ci0JCWlmIChscG0gPT0gMCkKLQkJCXJldHVybiAtRUFDQ0VTOwotCX0KLQotCXJjZF9jY3cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2N3MSksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoIXJjZF9jY3cpCi0JCXJldHVybiAtRU5PTUVNOwotCXJjZF9idWYgPSBremFsbG9jKGNpdy0+Y291bnQsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLSAJaWYgKCFyY2RfYnVmKSB7Ci0JCWtmcmVlKHJjZF9jY3cpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmNkX2Njdy0+Y21kX2NvZGUgPSBjaXctPmNtZDsKLQlyY2RfY2N3LT5jZGEgPSAoX191MzIpIF9fcGEgKHJjZF9idWYpOwotCXJjZF9jY3ctPmNvdW50ID0gY2l3LT5jb3VudDsKLQlyY2RfY2N3LT5mbGFncyA9IENDV19GTEFHX1NMSTsKLQotCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQkvKiBTYXZlIGludGVycnVwdCBoYW5kbGVyLiAqLwotCWhhbmRsZXIgPSBjZGV2LT5oYW5kbGVyOwotCS8qIFRlbXBvcmFyaWx5IGluc3RhbGwgb3duIGhhbmRsZXIuICovCi0JY2Rldi0+aGFuZGxlciA9IGNjd19kZXZpY2Vfd2FrZV91cDsKLQlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgIT0gREVWX1NUQVRFX09OTElORSkKLQkJcmV0ID0gLUVOT0RFVjsKLQllbHNlIGlmICgoKHNjaC0+c2NoaWIuc2Nzdy5zdGN0bCAmIFNDU1dfU1RDVExfUFJJTV9TVEFUVVMpICYmCi0JCSAgIShzY2gtPnNjaGliLnNjc3cuc3RjdGwgJiBTQ1NXX1NUQ1RMX1NFQ19TVEFUVVMpKSB8fAotCQkgY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG92ZXJpZnkpCi0JCXJldCA9IC1FQlVTWTsKLQllbHNlCi0JCS8qIDB4MDBEOUMzQzQgPT0gZWJjZGljICJSQ0QiICovCi0JCXJldCA9IF9fY2N3X2RldmljZV9yZXRyeV9sb29wKGNkZXYsIHJjZF9jY3csIDB4MDBEOUMzQzQsIGxwbSk7Ci0KLQkvKiBSZXN0b3JlIGludGVycnVwdCBoYW5kbGVyLiAqLwotCWNkZXYtPmhhbmRsZXIgPSBoYW5kbGVyOwotCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwotCi0gCS8qCi0gCSAqIG9uIHN1Y2Nlc3Mgd2UgdXBkYXRlIHRoZSB1c2VyIGlucHV0IHBhcm1zCi0gCSAqLwotIAlpZiAocmV0KSB7Ci0gCQlrZnJlZSAocmNkX2J1Zik7Ci0gCQkqYnVmZmVyID0gTlVMTDsKLSAJCSpsZW5ndGggPSAwOwotIAl9IGVsc2UgewotCQkqbGVuZ3RoID0gY2l3LT5jb3VudDsKLQkJKmJ1ZmZlciA9IHJjZF9idWY7Ci0JfQotCWtmcmVlKHJjZF9jY3cpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqICBSZWFkIENvbmZpZ3VyYXRpb24gZGF0YQotICovCi1pbnQKLXJlYWRfY29uZl9kYXRhIChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqKmJ1ZmZlciwgaW50ICpsZW5ndGgpCi17Ci0JcmV0dXJuIHJlYWRfY29uZl9kYXRhX2xwbSAoY2RldiwgYnVmZmVyLCBsZW5ndGgsIDApOwotfQotCiAvKgogICogVHJ5IHRvIGJyZWFrIHRoZSBsb2NrIG9uIGEgYm94ZWQgZGV2aWNlLgogICovCkBAIC02MzUsMTIgKzM4OCw2IEBACiAJcmV0dXJuIGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubzsKIH0KIAotaW50Ci1fY2N3X2RldmljZV9nZXRfZGV2aWNlX251bWJlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKLXsKLQlyZXR1cm4gY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vOwotfQotCiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIEVYUE9SVF9TWU1CT0woY2N3X2RldmljZV9zZXRfb3B0aW9uc19tYXNrKTsKQEAgLTY1NSw5ICs0MDIsNSBAQAogRVhQT1JUX1NZTUJPTChjY3dfZGV2aWNlX3N0YXJ0X2tleSk7CiBFWFBPUlRfU1lNQk9MKGNjd19kZXZpY2VfZ2V0X2Npdyk7CiBFWFBPUlRfU1lNQk9MKGNjd19kZXZpY2VfZ2V0X3BhdGhfbWFzayk7Ci1FWFBPUlRfU1lNQk9MKHJlYWRfY29uZl9kYXRhKTsKLUVYUE9SVF9TWU1CT0wocmVhZF9kZXZfY2hhcnMpOwogRVhQT1JUX1NZTUJPTChfY2N3X2RldmljZV9nZXRfc3ViY2hhbm5lbF9udW1iZXIpOwotRVhQT1JUX1NZTUJPTChfY2N3X2RldmljZV9nZXRfZGV2aWNlX251bWJlcik7CiBFWFBPUlRfU1lNQk9MX0dQTChjY3dfZGV2aWNlX2dldF9jaHBfZGVzYyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChyZWFkX2NvbmZfZGF0YV9scG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21haW4uYwppbmRleCBiMjBmZDA2Li45MmU4YTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21haW4uYwpAQCAtNjc0LDcgKzY3NCw3IEBACiAJaW50IGZpcnN0ID0gMTsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGR1cmF0aW9uOwotCXN0cnVjdCB0aW1lc3BlYyBkb25lX3N0YW1wID0geHRpbWU7CisJc3RydWN0IHRpbWVzcGVjIGRvbmVfc3RhbXAgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAKIAlEQkZfVEVYVCh0cmFjZSwgNCwgX19GVU5DVElPTl9fKTsKIApAQCAtNzMwLDcgKzczMCw3IEBACiAJCXNwaW5fdW5sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKIAkJY2gtPmNjd1sxXS5jb3VudCA9IGNoLT50cmFuc19za2ItPmxlbjsKIAkJZnNtX2FkZHRpbWVyKCZjaC0+dGltZXIsIENUQ19USU1FT1VUXzVTRUMsIENIX0VWRU5UX1RJTUVSLCBjaCk7Ci0JCWNoLT5wcm9mLnNlbmRfc3RhbXAgPSB4dGltZTsKKwkJY2gtPnByb2Yuc2VuZF9zdGFtcCA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKIAkJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNoLT5jZGV2LCAmY2gtPmNjd1swXSwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZykgY2gsIDB4ZmYsIDApOwogCQljaC0+cHJvZi5kb2lvc19tdWx0aSsrOwpAQCAtMjI4MSw3ICsyMjgxLDcgQEAKIAkJZnNtX25ld3N0YXRlKGNoLT5mc20sIENIX1NUQVRFX1RYKTsKIAkJZnNtX2FkZHRpbWVyKCZjaC0+dGltZXIsIENUQ19USU1FT1VUXzVTRUMsIENIX0VWRU5UX1RJTUVSLCBjaCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7Ci0JCWNoLT5wcm9mLnNlbmRfc3RhbXAgPSB4dGltZTsKKwkJY2gtPnByb2Yuc2VuZF9zdGFtcCA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKIAkJcmMgPSBjY3dfZGV2aWNlX3N0YXJ0KGNoLT5jZGV2LCAmY2gtPmNjd1tjY3dfaWR4XSwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZykgY2gsIDB4ZmYsIDApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaC0+Y2RldiksIHNhdmVmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCmluZGV4IDNkMjhlMWEuLjI2ODg4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCkBAIC03NTMsNyArNzUzLDcgQEAKIAogCWhlYWRlci5uZXh0ID0gMDsKIAltZW1jcHkoc2tiX3B1dChjb25uLT50eF9idWZmLCBORVRJVUNWX0hEUkxFTiksICZoZWFkZXIsIE5FVElVQ1ZfSERSTEVOKTsKLQljb25uLT5wcm9mLnNlbmRfc3RhbXAgPSB4dGltZTsKKwljb25uLT5wcm9mLnNlbmRfc3RhbXAgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAJdHhtc2cuY2xhc3MgPSAwOwogCXR4bXNnLnRhZyA9IDA7CiAJcmMgPSBpdWN2X21lc3NhZ2Vfc2VuZChjb25uLT5wYXRoLCAmdHhtc2csIDAsIDAsCkBAIC0xMTg1LDcgKzExODUsNyBAQAogCQltZW1jcHkoc2tiX3B1dChuc2tiLCBORVRJVUNWX0hEUkxFTiksICZoZWFkZXIsICBORVRJVUNWX0hEUkxFTik7CiAKIAkJZnNtX25ld3N0YXRlKGNvbm4tPmZzbSwgQ09OTl9TVEFURV9UWCk7Ci0JCWNvbm4tPnByb2Yuc2VuZF9zdGFtcCA9IHh0aW1lOworCQljb25uLT5wcm9mLnNlbmRfc3RhbXAgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAKIAkJbXNnLnRhZyA9IDE7CiAJCW1zZy5jbGFzcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZwppbmRleCAzNWE3MzE2Li40MDBjNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL0tjb25maWcKQEAgLTE1LDYgKzE1LDcgQEAKIAogY29uZmlnIFNVTl9NT1NURUtfUlRDCiAJdHJpc3RhdGUgIk1vc3RlayByZWFsIHRpbWUgY2xvY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNQQVJDMzIKIAloZWxwCiAJICBUaGUgTW9zdGVrIFJUQyBjaGlwIGlzIHVzZWQgb24gYWxsIGtub3duIFN1biBjb21wdXRlcnMgZXhjZXB0CiAJICBzb21lIEphdmFTdGF0aW9ucy4gRm9yIGEgSmF2YVN0YXRpb24geW91IG5lZWQgdG8gc2F5IFkgYm90aCBoZXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMgYi9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKaW5kZXggNTE1N2EyYS4uNGI3MDc5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBqc2ZkX2RvX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQganNmZF9kb19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9zYnVzLmMgYi9kcml2ZXJzL3NidXMvc2J1cy5jCmluZGV4IDI1NTM2MjkuLmMzN2Q3YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9zYnVzLmMKKysrIGIvZHJpdmVycy9zYnVzL3NidXMuYwpAQCAtMjEwLDYgKzIxMCwxMCBAQAogCiAJCQlzZGV2LT5idXMgPSBzYnVzOwogCQkJc2Rldi0+cGFyZW50ID0gcGFyZW50OworCQkJc2Rldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11ID0KKwkJCQlzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuaW9tbXU7CisJCQlzZGV2LT5vZmRldi5kZXYuYXJjaGRhdGEuc3RjID0KKwkJCQlzYnVzLT5vZmRldi5kZXYuYXJjaGRhdGEuc3RjOwogCiAJCQlmaWxsX3NidXNfZGV2aWNlKGRwLCBzZGV2KTsKIApAQCAtMjY5LDYgKzI3MywxMSBAQAogCiAJCQlzZGV2LT5idXMgPSBzYnVzOwogCQkJc2Rldi0+cGFyZW50ID0gTlVMTDsKKwkJCXNkZXYtPm9mZGV2LmRldi5hcmNoZGF0YS5pb21tdSA9CisJCQkJc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLmlvbW11OworCQkJc2Rldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLnN0YyA9CisJCQkJc2J1cy0+b2ZkZXYuZGV2LmFyY2hkYXRhLnN0YzsKKwogCQkJZmlsbF9zYnVzX2RldmljZShkZXZfZHAsIHNkZXYpOwogCiAJCQl3YWxrX2NoaWxkcmVuKGRldl9kcCwgc2Rldiwgc2J1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCmluZGV4IGEyNmJhYWIuLjY4MDBlNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0xOTQsOCArMTk0LDcgQEAKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKIAogCWlmICh1bmxpa2VseSghc2NzaWNtZCB8fCAhc2NzaWNtZC0+c2NzaV9kb25lICkpIHsKLQkJZHByaW50aygoS0VSTl9XQVJOSU5HICJhYWNfdmFsaWRfY29udGV4dDogc2NzaSBjb21tYW5kIGNvcnJ1cHRcbiIpKQotOworCQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgImFhY192YWxpZF9jb250ZXh0OiBzY3NpIGNvbW1hbmQgY29ycnVwdFxuIikpOwogICAgICAgICAgICAgICAgIGFhY19maWJfY29tcGxldGUoZmlicHRyKTsKICAgICAgICAgICAgICAgICBhYWNfZmliX2ZyZWUoZmlicHRyKTsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTE2ODksMjMgKzE2ODgsMjMgQEAKIAlpZiAoIWFhY192YWxpZF9jb250ZXh0KGNtZCwgZmlicHRyKSkKIAkJcmV0dXJuOwogCi0JZHByaW50aygoS0VSTl9ERUJVRyAic3luY2hyb25pemVfY2FsbGJhY2tbY3B1ICVkXTogdCA9ICVsZC5cbiIsIAorCWRwcmludGsoKEtFUk5fREVCVUcgInN5bmNocm9uaXplX2NhbGxiYWNrW2NwdSAlZF06IHQgPSAlbGQuXG4iLAogCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcykpOwogCUJVR19PTihmaWJwdHIgPT0gTlVMTCk7CiAKIAogCXN5bmNocm9uaXplcmVwbHkgPSBmaWJfZGF0YShmaWJwdHIpOwogCWlmIChsZTMyX3RvX2NwdShzeW5jaHJvbml6ZXJlcGx5LT5zdGF0dXMpID09IENUX09LKQotCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IAorCQljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8CiAJCQlDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9HT09EOwogCWVsc2UgewogCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKIAkJc3RydWN0IGFhY19kZXYgKmRldiA9IGZpYnB0ci0+ZGV2OwogCQl1MzIgY2lkID0gc2Rldl9pZChzZGV2KTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICJzeW5jaHJvbml6ZV9jYWxsYmFjazogc3luY2hyb25pemUgZmFpbGVkLCBzdGF0dXMgPSAlZFxuIiwKIAkJICAgICBsZTMyX3RvX2NwdShzeW5jaHJvbml6ZXJlcGx5LT5zdGF0dXMpKTsKLQkJY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCAKKwkJY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfAogCQkJQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCQlzZXRfc2Vuc2UoKHU4ICopJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCiAJCQkJICAgIEhBUkRXQVJFX0VSUk9SLApAQCAtMTcxMyw3ICsxNzEyLDcgQEAKIAkJCQkgICAgQVNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsIDAsIDAsCiAJCQkJICAgIDAsIDApOwogCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAotCQkgIG1pbihzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSksIAorCQkgIG1pbihzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSksCiAJCQkgIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpKTsKIAl9CiAKQEAgLTE3MzEsNiArMTczMCw5IEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gc2NzaWNtZC0+ZGV2aWNlOwogCWludCBhY3RpdmUgPSAwOwogCXN0cnVjdCBhYWNfZGV2ICphYWM7CisJdTY0IGxiYSA9ICgodTY0KXNjc2ljbWQtPmNtbmRbMl0gPDwgMjQpIHwgKHNjc2ljbWQtPmNtbmRbM10gPDwgMTYpIHwKKwkJKHNjc2ljbWQtPmNtbmRbNF0gPDwgOCkgfCBzY3NpY21kLT5jbW5kWzVdOworCXUzMiBjb3VudCA9IChzY3NpY21kLT5jbW5kWzddIDw8IDgpIHwgc2NzaWNtZC0+Y21uZFs4XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKQEAgLTE3MzksNyArMTc0MSw1MSBAQAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZzZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJnNkZXYtPmNtZF9saXN0LCBsaXN0KQotCQlpZiAoY21kICE9IHNjc2ljbWQgJiYgY21kLT5TQ3AucGhhc2UgPT0gQUFDX09XTkVSX0ZJUk1XQVJFKSB7CisJCWlmIChjbWQtPlNDcC5waGFzZSA9PSBBQUNfT1dORVJfRklSTVdBUkUpIHsKKwkJCXU2NCBjbW5kX2xiYTsKKwkJCXUzMiBjbW5kX2NvdW50OworCisJCQlpZiAoY21kLT5jbW5kWzBdID09IFdSSVRFXzYpIHsKKwkJCQljbW5kX2xiYSA9ICgoY21kLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwKKwkJCQkJKGNtZC0+Y21uZFsyXSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFszXTsKKwkJCQljbW5kX2NvdW50ID0gY21kLT5jbW5kWzRdOworCQkJCWlmIChjbW5kX2NvdW50ID09IDApCisJCQkJCWNtbmRfY291bnQgPSAyNTY7CisJCQl9IGVsc2UgaWYgKGNtZC0+Y21uZFswXSA9PSBXUklURV8xNikgeworCQkJCWNtbmRfbGJhID0gKCh1NjQpY21kLT5jbW5kWzJdIDw8IDU2KSB8CisJCQkJCSgodTY0KWNtZC0+Y21uZFszXSA8PCA0OCkgfAorCQkJCQkoKHU2NCljbWQtPmNtbmRbNF0gPDwgNDApIHwKKwkJCQkJKCh1NjQpY21kLT5jbW5kWzVdIDw8IDMyKSB8CisJCQkJCSgodTY0KWNtZC0+Y21uZFs2XSA8PCAyNCkgfAorCQkJCQkoY21kLT5jbW5kWzddIDw8IDE2KSB8CisJCQkJCShjbWQtPmNtbmRbOF0gPDwgOCkgfAorCQkJCQljbWQtPmNtbmRbOV07CisJCQkJY21uZF9jb3VudCA9IChjbWQtPmNtbmRbMTBdIDw8IDI0KSB8CisJCQkJCShjbWQtPmNtbmRbMTFdIDw8IDE2KSB8CisJCQkJCShjbWQtPmNtbmRbMTJdIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzEzXTsKKwkJCX0gZWxzZSBpZiAoY21kLT5jbW5kWzBdID09IFdSSVRFXzEyKSB7CisJCQkJY21uZF9sYmEgPSAoKHU2NCljbWQtPmNtbmRbMl0gPDwgMjQpIHwKKwkJCQkJKGNtZC0+Y21uZFszXSA8PCAxNikgfAorCQkJCQkoY21kLT5jbW5kWzRdIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQkJCWNtbmRfY291bnQgPSAoY21kLT5jbW5kWzZdIDw8IDI0KSB8CisJCQkJCShjbWQtPmNtbmRbN10gPDwgMTYpIHwKKwkJCQkJKGNtZC0+Y21uZFs4XSA8PCA4KSB8CisJCQkJCWNtZC0+Y21uZFs5XTsKKwkJCX0gZWxzZSBpZiAoY21kLT5jbW5kWzBdID09IFdSSVRFXzEwKSB7CisJCQkJY21uZF9sYmEgPSAoKHU2NCljbWQtPmNtbmRbMl0gPDwgMjQpIHwKKwkJCQkJKGNtZC0+Y21uZFszXSA8PCAxNikgfAorCQkJCQkoY21kLT5jbW5kWzRdIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzVdOworCQkJCWNtbmRfY291bnQgPSAoY21kLT5jbW5kWzddIDw8IDgpIHwKKwkJCQkJY21kLT5jbW5kWzhdOworCQkJfSBlbHNlCisJCQkJY29udGludWU7CisJCQlpZiAoKChjbW5kX2xiYSArIGNtbmRfY291bnQpIDwgbGJhKSB8fAorCQkJICAoY291bnQgJiYgKChsYmEgKyBjb3VudCkgPCBjbW5kX2xiYSkpKQorCQkJCWNvbnRpbnVlOwogCQkJKythY3RpdmU7CiAJCQlicmVhazsKIAkJfQpAQCAtMTc2OCw3ICsxODE0LDcgQEAKIAlzeW5jaHJvbml6ZWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTMyKFZNX0NvbnRhaW5lckNvbmZpZyk7CiAJc3luY2hyb25pemVjbWQtPnR5cGUgPSBjcHVfdG9fbGUzMihDVF9GTFVTSF9DQUNIRSk7CiAJc3luY2hyb25pemVjbWQtPmNpZCA9IGNwdV90b19sZTMyKHNjbWRfaWQoc2NzaWNtZCkpOwotCXN5bmNocm9uaXplY21kLT5jb3VudCA9IAorCXN5bmNocm9uaXplY21kLT5jb3VudCA9CiAJICAgICBjcHVfdG9fbGUzMihzaXplb2YoKChzdHJ1Y3QgYWFjX3N5bmNocm9uaXplX3JlcGx5ICopTlVMTCktPmRhdGEpKTsKIAogCS8qCkBAIC0xNzkwLDcgKzE4MzYsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HIAorCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJImFhY19zeW5jaHJvbml6ZTogYWFjX2ZpYl9zZW5kIGZhaWxlZCB3aXRoIHN0YXR1czogJWQuXG4iLCBzdGF0dXMpOwogCWFhY19maWJfY29tcGxldGUoY21kX2ZpYmNvbnRleHQpOwogCWFhY19maWJfZnJlZShjbWRfZmliY29udGV4dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmggYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKaW5kZXggNDAwZDAzNC4uOTQ3MjdiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaApAQCAtMTIsNyArMTIsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmbmRlZiBBQUNfRFJJVkVSX0JVSUxECi0jIGRlZmluZSBBQUNfRFJJVkVSX0JVSUxEIDI0NDcKKyMgZGVmaW5lIEFBQ19EUklWRVJfQlVJTEQgMjQ0OQogIyBkZWZpbmUgQUFDX0RSSVZFUl9CUkFOQ0ggIi1tcyIKICNlbmRpZgogI2RlZmluZSBNQVhJTVVNX05VTV9DT05UQUlORVJTCTMyCkBAIC0xODA3LDEwICsxODA3LDEwIEBACiAgKiAgCWFjY291bnRpbmcgZm9yIHRoZSBmYWN0IGNhcGFjaXR5IGNvdWxkIGJlIGEgNjQgYml0IHZhbHVlCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHUzMiBjYXBfdG9fY3lscyhzZWN0b3JfdCBjYXBhY2l0eSwgdTMyIGRpdmlzb3IpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYXBfdG9fY3lscyhzZWN0b3JfdCBjYXBhY2l0eSwgdW5zaWduZWQgZGl2aXNvcikKIHsKIAlzZWN0b3JfZGl2KGNhcGFjaXR5LCBkaXZpc29yKTsKLQlyZXR1cm4gKHUzMiljYXBhY2l0eTsKKwlyZXR1cm4gY2FwYWNpdHk7CiB9CiAKIC8qIFNDcC5waGFzZSB2YWx1ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCmluZGV4IGQ3NmUxYTguLjgxMzU1NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwpAQCAtNjM2LDYgKzYzNiw4IEBACiBzdGF0aWMgaW50IGFhY19jZmdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgIHN0cnVjdCBmaWxlICpmaWxlLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CiAJcmV0dXJuIGFhY19kb19pb2N0bChmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKIH0KIApAQCAtNjg5LDYgKzY5MSw4IEBACiAKIHN0YXRpYyBsb25nIGFhY19jb21wYXRfY2ZnX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogeworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAlyZXR1cm4gYWFjX2NvbXBhdF9kb19pb2N0bCgoc3RydWN0IGFhY19kZXYgKilmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgYXJnKTsKIH0KICNlbmRpZgpAQCAtODIyLDcgKzgyNiw3IEBACiAJdG1wID0gYWFjX2FkYXB0ZXJfY2hlY2tfaGVhbHRoKGRldik7CiAJaWYgKCh0bXAgPT0gMCkgJiYgZGV2LT5pbl9yZXNldCkKIAkJdG1wID0gLUVCVVNZOwotCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleCIsIHRtcCk7CisJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCV4XG4iLCB0bXApOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTExMjIsOSArMTEyNiw4IEBACiBzdGF0aWMgdm9pZCBhYWNfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYWNfZGV2ICphYWMgPSAoc3RydWN0IGFhY19kZXYgKilzaG9zdC0+aG9zdGRhdGE7CiAJc2NzaV9ibG9ja19yZXF1ZXN0cyhzaG9zdCk7Ci0JX19hYWNfc2h1dGRvd24oYWFjKTsKKwlfX2FhY19zaHV0ZG93bigoc3RydWN0IGFhY19kZXYgKilzaG9zdC0+aG9zdGRhdGEpOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWFjX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9uYXJrLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9uYXJrLmMKaW5kZXggYThhY2U1Ni4uYzU1ZjdjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvbmFyay5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL25hcmsuYwpAQCAtMSwxMSArMSwxMCBAQAogLyoKICAqCUFkYXB0ZWMgQUFDIHNlcmllcyBSQUlEIGNvbnRyb2xsZXIgZHJpdmVyCi0gKgkoYykgQ29weXJpZ2h0IDIwMDEgUmVkIEhhdCBJbmMuCTxhbGFuQHJlZGhhdC5jb20+CiAgKgogICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KICAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEFkYXB0ZWMsIEluYy4gKGFhY3JhaWRAYWRhcHRlYy5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9ya3QuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCmluZGV4IDljNWZjZmIuLjhjZDY1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3JrdC5jCkBAIC01LDcgKzUsNyBAQAogICogYmFzZWQgb24gdGhlIG9sZCBhYWNyYWlkIGRyaXZlciB0aGF0IGlzLi4KICAqIEFkYXB0ZWMgYWFjcmFpZCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgQWRhcHRlYywgSW5jLiAoYWFjcmFpZEBhZGFwdGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA3IEFkYXB0ZWMsIEluYy4gKGFhY3JhaWRAYWRhcHRlYy5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvcnguYwppbmRleCBlYmM2NWI5Li43M2VlZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9yeC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL3J4LmMKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQllbHNlIHsKIAkJCWJsZWQgPSBhYWNfYWRhcHRlcl9zeW5jX2NtZChkZXYsIElPUF9SRVNFVF9BTFdBWVMsCiAJCQkgIDAsIDAsIDAsIDAsIDAsIDAsICZ2YXIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotCQkJaWYgKCFibGVkICYmICh2YXIgIT0gMHgwMDAwMDAwMSkpCisJCQlpZiAoIWJsZWQgJiYgKHZhciAhPSAweDAwMDAwMDAxKSAmJiAodmFyICE9IDB4MzgwMzAwMEYpKQogCQkJCWJsZWQgPSAtRUlOVkFMOwogCQl9CiAJCWlmIChibGVkICYmIChibGVkICE9IC1FVElNRURPVVQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAyYjY2ODk3Li43OWMwYjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtMSw0ICsxLDQgQEAKLSNkZWZpbmUgQVNDX1ZFUlNJT04gIjMuM0siICAgIC8qIEFkdmFuU3lzIERyaXZlciBWZXJzaW9uICovCisjZGVmaW5lIEFTQ19WRVJTSU9OICIzLjNLIgkvKiBBZHZhblN5cyBEcml2ZXIgVmVyc2lvbiAqLwogCiAvKgogICogYWR2YW5zeXMuYyAtIExpbnV4IEhvc3QgRHJpdmVyIGZvciBBZHZhblN5cyBTQ1NJIEFkYXB0ZXJzCkBAIC04MDIsNyArODAyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKLQogLyoKICAqIC0tLSBEcml2ZXIgT3B0aW9ucwogICovCkBAIC04MTYsMTggKzgxNSw2IEBACiAvKiBFbmFibGUgZHJpdmVyIHRyYWNpbmcuICovCiAvKiAjZGVmaW5lIEFEVkFOU1lTX0RFQlVHICovCiAKLQotLyoKLSAqIC0tLSBEZWJ1Z2dpbmcgSGVhZGVyCi0gKi8KLQotI2lmZGVmIEFEVkFOU1lTX0RFQlVHCi0jZGVmaW5lIFNUQVRJQwotI2Vsc2UgLyogQURWQU5TWVNfREVCVUcgKi8KLSNkZWZpbmUgU1RBVElDIHN0YXRpYwotI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCi0KLQogLyoKICAqIC0tLSBBc2MgTGlicmFyeSBDb25zdGFudHMgYW5kIE1hY3JvcwogICovCkBAIC04NDUsMTAgKzgzMiwxMCBAQAogICogYXJlIGFsbCBjb25zaXN0ZW50IGF0IDgsIDE2LCBhbmQgMzIgYml0cyByZXNwZWN0aXZlbHkuIFBvaW50ZXJzCiAgKiBhbmQgbG9uZyB0eXBlcyBhcmUgNjQgYml0cyBvbiBBbHBoYSBhbmQgVWx0cmFTUEFSQy4KICAqLwotI2RlZmluZSBBU0NfUEFERFIgX191MzIgICAgICAgICAvKiBQaHlzaWNhbC9CdXMgYWRkcmVzcyBkYXRhIHR5cGUuICovCi0jZGVmaW5lIEFTQ19WQUREUiBfX3UzMiAgICAgICAgIC8qIFZpcnR1YWwgYWRkcmVzcyBkYXRhIHR5cGUuICovCi0jZGVmaW5lIEFTQ19EQ05UICBfX3UzMiAgICAgICAgIC8qIFVuc2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KLSNkZWZpbmUgQVNDX1NEQ05UIF9fczMyICAgICAgICAgLyogU2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KKyNkZWZpbmUgQVNDX1BBRERSIF9fdTMyCQkvKiBQaHlzaWNhbC9CdXMgYWRkcmVzcyBkYXRhIHR5cGUuICovCisjZGVmaW5lIEFTQ19WQUREUiBfX3UzMgkJLyogVmlydHVhbCBhZGRyZXNzIGRhdGEgdHlwZS4gKi8KKyNkZWZpbmUgQVNDX0RDTlQgIF9fdTMyCQkvKiBVbnNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisjZGVmaW5lIEFTQ19TRENOVCBfX3MzMgkJLyogU2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KIAogLyoKICAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBjb252ZXJ0IGEgdmlydHVhbCBhZGRyZXNzIHRvIGEKQEAgLTkxMSw3ICs4OTgsNyBAQAogI2RlZmluZSBDQ19WRVJZX0xPTkdfU0dfTElTVCAwCiAjZGVmaW5lIEFTQ19TUkIyU0NTSVEoc3JiX3B0cikgIChzcmJfcHRyKQogCi0jZGVmaW5lIFBvcnRBZGRyICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAvKiBwb3J0IGFkZHJlc3Mgc2l6ZSAgKi8KKyNkZWZpbmUgUG9ydEFkZHIgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0CS8qIHBvcnQgYWRkcmVzcyBzaXplICAqLwogI2RlZmluZSBpbnAocG9ydCkgICAgICAgICAgICAgICAgaW5iKHBvcnQpCiAjZGVmaW5lIG91dHAocG9ydCwgYnl0ZSkgICAgICAgICBvdXRiKChieXRlKSwgKHBvcnQpKQogCkBAIC0xMDM4LDE3ICsxMDI1LDE3IEBACiAjZGVmaW5lIEFTQ19JTlFfQ0xPQ0tJTkcoaW5xKSAgICAgICAoKChpbnEpLT5pbmZvICYgMHgwYykgPj4gMikKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgICAgICAgICAgICAgcGVyaXBoOwotICAgIHVjaGFyICAgICAgICAgICAgICAgZGV2dHlwZTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHZlcjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGJ5dGUzOwotICAgIHVjaGFyICAgICAgICAgICAgICAgYWRkX2xlbjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHJlczE7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICByZXMyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB2ZW5kb3JfaWRbOF07Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBwcm9kdWN0X2lkWzE2XTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHByb2R1Y3RfcmV2X2xldmVsWzRdOworCXVjaGFyIHBlcmlwaDsKKwl1Y2hhciBkZXZ0eXBlOworCXVjaGFyIHZlcjsKKwl1Y2hhciBieXRlMzsKKwl1Y2hhciBhZGRfbGVuOworCXVjaGFyIHJlczE7CisJdWNoYXIgcmVzMjsKKwl1Y2hhciBmbGFnczsKKwl1Y2hhciB2ZW5kb3JfaWRbOF07CisJdWNoYXIgcHJvZHVjdF9pZFsxNl07CisJdWNoYXIgcHJvZHVjdF9yZXZfbGV2ZWxbNF07CiB9IEFTQ19TQ1NJX0lOUVVJUlk7CiAKICNkZWZpbmUgQVNDX1NHX0xJU1RfUEVSX1EgICA3CkBAIC0xMTY1LDEzOSArMTE1MiwxMzkgQEAKICNkZWZpbmUgQVNDX1FOT19UT19RQUREUihxX25vKSAgICAgICgoQVNDX1FBRFJfQkVHKSsoKGludCkocV9ubykgPDwgNikpCiAKIHR5cGVkZWYgc3RydWN0IGFzY19zY3NpcV8xIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHFfbm87Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBjbnRsOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfcXVldWVfY250OwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2lkOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2x1bjsKLSAgICBBU0NfUEFERFIgICAgICAgICAgIGRhdGFfYWRkcjsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIGRhdGFfY250OwotICAgIEFTQ19QQUREUiAgICAgICAgICAgc2Vuc2VfYWRkcjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNlbnNlX2xlbjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzOworCXVjaGFyIHN0YXR1czsKKwl1Y2hhciBxX25vOworCXVjaGFyIGNudGw7CisJdWNoYXIgc2dfcXVldWVfY250OworCXVjaGFyIHRhcmdldF9pZDsKKwl1Y2hhciB0YXJnZXRfbHVuOworCUFTQ19QQUREUiBkYXRhX2FkZHI7CisJQVNDX0RDTlQgZGF0YV9jbnQ7CisJQVNDX1BBRERSIHNlbnNlX2FkZHI7CisJdWNoYXIgc2Vuc2VfbGVuOworCXVjaGFyIGV4dHJhX2J5dGVzOwogfSBBU0NfU0NTSVFfMTsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3Njc2lxXzIgewotICAgIEFTQ19WQUREUiAgICAgICAgICAgc3JiX3B0cjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHRhcmdldF9peDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGZsYWc7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBjZGJfbGVuOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGFnX2NvZGU7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICB2bV9pZDsKKwlBU0NfVkFERFIgc3JiX3B0cjsKKwl1Y2hhciB0YXJnZXRfaXg7CisJdWNoYXIgZmxhZzsKKwl1Y2hhciBjZGJfbGVuOworCXVjaGFyIHRhZ19jb2RlOworCXVzaG9ydCB2bV9pZDsKIH0gQVNDX1NDU0lRXzI7CiAKIHR5cGVkZWYgc3RydWN0IGFzY19zY3NpcV8zIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGRvbmVfc3RhdDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGhvc3Rfc3RhdDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNjc2lfc3RhdDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNjc2lfbXNnOworCXVjaGFyIGRvbmVfc3RhdDsKKwl1Y2hhciBob3N0X3N0YXQ7CisJdWNoYXIgc2NzaV9zdGF0OworCXVjaGFyIHNjc2lfbXNnOwogfSBBU0NfU0NTSVFfMzsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3Njc2lxXzQgewotICAgIHVjaGFyICAgICAgICAgICAgICAgY2RiW0FTQ19NQVhfQ0RCX0xFTl07Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB5X2ZpcnN0X3NnX2xpc3RfcXA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB5X3dvcmtpbmdfc2dfcXA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB5X3dvcmtpbmdfc2dfaXg7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB5X3JlczsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHhfcmVxX2NvdW50OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgeF9yZWNvbm5lY3RfcnRuOwotICAgIEFTQ19QQUREUiAgICAgICAgICAgeF9zYXZlZF9kYXRhX2FkZHI7Ci0gICAgQVNDX0RDTlQgICAgICAgICAgICB4X3NhdmVkX2RhdGFfY250OworCXVjaGFyIGNkYltBU0NfTUFYX0NEQl9MRU5dOworCXVjaGFyIHlfZmlyc3Rfc2dfbGlzdF9xcDsKKwl1Y2hhciB5X3dvcmtpbmdfc2dfcXA7CisJdWNoYXIgeV93b3JraW5nX3NnX2l4OworCXVjaGFyIHlfcmVzOworCXVzaG9ydCB4X3JlcV9jb3VudDsKKwl1c2hvcnQgeF9yZWNvbm5lY3RfcnRuOworCUFTQ19QQUREUiB4X3NhdmVkX2RhdGFfYWRkcjsKKwlBU0NfRENOVCB4X3NhdmVkX2RhdGFfY250OwogfSBBU0NfU0NTSVFfNDsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3FfZG9uZV9pbmZvIHsKLSAgICBBU0NfU0NTSVFfMiAgICAgICAgIGQyOwotICAgIEFTQ19TQ1NJUV8zICAgICAgICAgZDM7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBxX3N0YXR1czsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHFfbm87Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBjbnRsOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2Vuc2VfbGVuOwotICAgIHVjaGFyICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXM7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICByZXM7Ci0gICAgQVNDX0RDTlQgICAgICAgICAgICByZW1haW5fYnl0ZXM7CisJQVNDX1NDU0lRXzIgZDI7CisJQVNDX1NDU0lRXzMgZDM7CisJdWNoYXIgcV9zdGF0dXM7CisJdWNoYXIgcV9ubzsKKwl1Y2hhciBjbnRsOworCXVjaGFyIHNlbnNlX2xlbjsKKwl1Y2hhciBleHRyYV9ieXRlczsKKwl1Y2hhciByZXM7CisJQVNDX0RDTlQgcmVtYWluX2J5dGVzOwogfSBBU0NfUURPTkVfSU5GTzsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2xpc3QgewotICAgIEFTQ19QQUREUiAgICAgICAgICAgYWRkcjsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIGJ5dGVzOworCUFTQ19QQUREUiBhZGRyOworCUFTQ19EQ05UIGJ5dGVzOwogfSBBU0NfU0dfTElTVDsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2hlYWQgewotICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfY250OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgcXVldWVfY250OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgZW50cnlfdG9fY29weTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHJlczsKLSAgICBBU0NfU0dfTElTVCAgICAgICAgIHNnX2xpc3RbQVNDX01BWF9TR19MSVNUXTsKKwl1c2hvcnQgZW50cnlfY250OworCXVzaG9ydCBxdWV1ZV9jbnQ7CisJdXNob3J0IGVudHJ5X3RvX2NvcHk7CisJdXNob3J0IHJlczsKKwlBU0NfU0dfTElTVCBzZ19saXN0W0FTQ19NQVhfU0dfTElTVF07CiB9IEFTQ19TR19IRUFEOwogCiAjZGVmaW5lIEFTQ19NSU5fU0dfTElTVCAgIDIKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX21pbl9zZ19oZWFkIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGVudHJ5X2NudDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHF1ZXVlX2NudDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGVudHJ5X3RvX2NvcHk7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICByZXM7Ci0gICAgQVNDX1NHX0xJU1QgICAgICAgICBzZ19saXN0W0FTQ19NSU5fU0dfTElTVF07CisJdXNob3J0IGVudHJ5X2NudDsKKwl1c2hvcnQgcXVldWVfY250OworCXVzaG9ydCBlbnRyeV90b19jb3B5OworCXVzaG9ydCByZXM7CisJQVNDX1NHX0xJU1Qgc2dfbGlzdFtBU0NfTUlOX1NHX0xJU1RdOwogfSBBU0NfTUlOX1NHX0hFQUQ7CiAKICNkZWZpbmUgUUNYX1NPUlQgICAgICAgICgweDAwMDEpCiAjZGVmaW5lIFFDWF9DT0FMRUFTRSAgICAoMHgwMDAyKQogCiB0eXBlZGVmIHN0cnVjdCBhc2Nfc2NzaV9xIHsKLSAgICBBU0NfU0NTSVFfMSAgICAgICAgIHExOwotICAgIEFTQ19TQ1NJUV8yICAgICAgICAgcTI7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICAqY2RicHRyOwotICAgIEFTQ19TR19IRUFEICAgICAgICAgKnNnX2hlYWQ7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICByZW1haW5fc2dfZW50cnlfY250OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgbmV4dF9zZ19pbmRleDsKKwlBU0NfU0NTSVFfMSBxMTsKKwlBU0NfU0NTSVFfMiBxMjsKKwl1Y2hhciAqY2RicHRyOworCUFTQ19TR19IRUFEICpzZ19oZWFkOworCXVzaG9ydCByZW1haW5fc2dfZW50cnlfY250OworCXVzaG9ydCBuZXh0X3NnX2luZGV4OwogfSBBU0NfU0NTSV9ROwogCiB0eXBlZGVmIHN0cnVjdCBhc2Nfc2NzaV9yZXFfcSB7Ci0gICAgQVNDX1NDU0lRXzEgICAgICAgICByMTsKLSAgICBBU0NfU0NTSVFfMiAgICAgICAgIHIyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgKmNkYnB0cjsKLSAgICBBU0NfU0dfSEVBRCAgICAgICAgICpzZ19oZWFkOwotICAgIHVjaGFyICAgICAgICAgICAgICAgKnNlbnNlX3B0cjsKLSAgICBBU0NfU0NTSVFfMyAgICAgICAgIHIzOwotICAgIHVjaGFyICAgICAgICAgICAgICAgY2RiW0FTQ19NQVhfQ0RCX0xFTl07Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzZW5zZVtBU0NfTUlOX1NFTlNFX0xFTl07CisJQVNDX1NDU0lRXzEgcjE7CisJQVNDX1NDU0lRXzIgcjI7CisJdWNoYXIgKmNkYnB0cjsKKwlBU0NfU0dfSEVBRCAqc2dfaGVhZDsKKwl1Y2hhciAqc2Vuc2VfcHRyOworCUFTQ19TQ1NJUV8zIHIzOworCXVjaGFyIGNkYltBU0NfTUFYX0NEQl9MRU5dOworCXVjaGFyIHNlbnNlW0FTQ19NSU5fU0VOU0VfTEVOXTsKIH0gQVNDX1NDU0lfUkVRX1E7CiAKIHR5cGVkZWYgc3RydWN0IGFzY19zY3NpX2Jpb3NfcmVxX3EgewotICAgIEFTQ19TQ1NJUV8xICAgICAgICAgcjE7Ci0gICAgQVNDX1NDU0lRXzIgICAgICAgICByMjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgICpjZGJwdHI7Ci0gICAgQVNDX1NHX0hFQUQgICAgICAgICAqc2dfaGVhZDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgICpzZW5zZV9wdHI7Ci0gICAgQVNDX1NDU0lRXzMgICAgICAgICByMzsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGNkYltBU0NfTUFYX0NEQl9MRU5dOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2Vuc2VbQVNDX01JTl9TRU5TRV9MRU5dOworCUFTQ19TQ1NJUV8xIHIxOworCUFTQ19TQ1NJUV8yIHIyOworCXVjaGFyICpjZGJwdHI7CisJQVNDX1NHX0hFQUQgKnNnX2hlYWQ7CisJdWNoYXIgKnNlbnNlX3B0cjsKKwlBU0NfU0NTSVFfMyByMzsKKwl1Y2hhciBjZGJbQVNDX01BWF9DREJfTEVOXTsKKwl1Y2hhciBzZW5zZVtBU0NfTUlOX1NFTlNFX0xFTl07CiB9IEFTQ19TQ1NJX0JJT1NfUkVRX1E7CiAKIHR5cGVkZWYgc3RydWN0IGFzY19yaXNjX3EgewotICAgIHVjaGFyICAgICAgICAgICAgICAgZndkOwotICAgIHVjaGFyICAgICAgICAgICAgICAgYndkOwotICAgIEFTQ19TQ1NJUV8xICAgICAgICAgaTE7Ci0gICAgQVNDX1NDU0lRXzIgICAgICAgICBpMjsKLSAgICBBU0NfU0NTSVFfMyAgICAgICAgIGkzOwotICAgIEFTQ19TQ1NJUV80ICAgICAgICAgaTQ7CisJdWNoYXIgZndkOworCXVjaGFyIGJ3ZDsKKwlBU0NfU0NTSVFfMSBpMTsKKwlBU0NfU0NTSVFfMiBpMjsKKwlBU0NfU0NTSVFfMyBpMzsKKwlBU0NfU0NTSVFfNCBpNDsKIH0gQVNDX1JJU0NfUTsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2xpc3RfcSB7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzZXFfbm87Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBxX25vOwotICAgIHVjaGFyICAgICAgICAgICAgICAgY250bDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX2hlYWRfcXA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzZ19saXN0X2NudDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX2N1cl9saXN0X2NudDsKKwl1Y2hhciBzZXFfbm87CisJdWNoYXIgcV9ubzsKKwl1Y2hhciBjbnRsOworCXVjaGFyIHNnX2hlYWRfcXA7CisJdWNoYXIgc2dfbGlzdF9jbnQ7CisJdWNoYXIgc2dfY3VyX2xpc3RfY250OwogfSBBU0NfU0dfTElTVF9ROwogCiB0eXBlZGVmIHN0cnVjdCBhc2NfcmlzY19zZ19saXN0X3EgewotICAgIHVjaGFyICAgICAgICAgICAgICAgZndkOwotICAgIHVjaGFyICAgICAgICAgICAgICAgYndkOwotICAgIEFTQ19TR19MSVNUX1EgICAgICAgc2c7Ci0gICAgQVNDX1NHX0xJU1QgICAgICAgICBzZ19saXN0WzddOworCXVjaGFyIGZ3ZDsKKwl1Y2hhciBid2Q7CisJQVNDX1NHX0xJU1RfUSBzZzsKKwlBU0NfU0dfTElTVCBzZ19saXN0WzddOwogfSBBU0NfUklTQ19TR19MSVNUX1E7CiAKICNkZWZpbmUgQVNDX0VYRV9TQ1NJX0lPX01BWF9JRExFX0xPT1AgIDB4MTAwMDAwMFVMCkBAIC0xNDMxLDI1ICsxNDE4LDI1IEBACiAjZGVmaW5lIFNZTl9VTFRSQV9YRkVSX05TXzE1ICAxMDcKIAogdHlwZWRlZiBzdHJ1Y3QgZXh0X21zZyB7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBtc2dfdHlwZTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIG1zZ19sZW47Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBtc2dfcmVxOwotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl94ZmVyX3BlcmlvZDsKLSAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9yZXFfYWNrX29mZnNldDsKLSAgICAgICAgfSBzZHRyOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWNoYXIgICAgICAgICAgICAgICB3ZHRyX3dpZHRoOwotICAgICAgICB9IHdkdHI7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICB1Y2hhciAgICAgICAgICAgICAgIG1kcF9iMzsKLSAgICAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgbWRwX2IyOwotICAgICAgICAgICAgdWNoYXIgICAgICAgICAgICAgICBtZHBfYjE7Ci0gICAgICAgICAgICB1Y2hhciAgICAgICAgICAgICAgIG1kcF9iMDsKLSAgICAgICAgfSBtZHA7Ci0gICAgfSB1X2V4dF9tc2c7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICByZXM7CisJdWNoYXIgbXNnX3R5cGU7CisJdWNoYXIgbXNnX2xlbjsKKwl1Y2hhciBtc2dfcmVxOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVjaGFyIHNkdHJfeGZlcl9wZXJpb2Q7CisJCQl1Y2hhciBzZHRyX3JlcV9hY2tfb2Zmc2V0OworCQl9IHNkdHI7CisJCXN0cnVjdCB7CisJCQl1Y2hhciB3ZHRyX3dpZHRoOworCQl9IHdkdHI7CisJCXN0cnVjdCB7CisJCQl1Y2hhciBtZHBfYjM7CisJCQl1Y2hhciBtZHBfYjI7CisJCQl1Y2hhciBtZHBfYjE7CisJCQl1Y2hhciBtZHBfYjA7CisJCX0gbWRwOworCX0gdV9leHRfbXNnOworCXVjaGFyIHJlczsKIH0gRVhUX01TRzsKIAogI2RlZmluZSB4ZmVyX3BlcmlvZCAgICAgdV9leHRfbXNnLnNkdHIuc2R0cl94ZmVyX3BlcmlvZApAQCAtMTQ2MSwyNCArMTQ0OCwyNCBAQAogI2RlZmluZSBtZHBfYjAgICAgICAgICAgdV9leHRfbXNnLm1kcF9iMAogCiB0eXBlZGVmIHN0cnVjdCBhc2NfZHZjX2NmZyB7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgY2FuX3RhZ2dlZF9xbmc7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgY21kX3FuZ19lbmFibGVkOwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIGRpc2NfZW5hYmxlOwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHNkdHJfZW5hYmxlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgY2hpcF9zY3NpX2lkOwotICAgIHVjaGFyICAgICAgICAgICAgICAgaXNhX2RtYV9zcGVlZDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGlzYV9kbWFfY2hhbm5lbDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfdmVyc2lvbjsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGxpYl9zZXJpYWxfbm87Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBsaWJfdmVyc2lvbjsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIG1jb2RlX2RhdGU7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBtY29kZV92ZXJzaW9uOwotICAgIHVjaGFyICAgICAgICAgICAgICAgbWF4X3RhZ19xbmdbQVNDX01BWF9USUQgKyAxXTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgICpvdmVycnVuX2J1ZjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfcGVyaW9kX29mZnNldFtBU0NfTUFYX1RJRCArIDFdOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgcGNpX3Nsb3RfaW5mbzsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGFkYXB0ZXJfaW5mb1s2XTsKLSAgICBzdHJ1Y3QgZGV2aWNlCSpkZXY7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgY2FuX3RhZ2dlZF9xbmc7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgY21kX3FuZ19lbmFibGVkOworCUFTQ19TQ1NJX0JJVF9JRF9UWVBFIGRpc2NfZW5hYmxlOworCUFTQ19TQ1NJX0JJVF9JRF9UWVBFIHNkdHJfZW5hYmxlOworCXVjaGFyIGNoaXBfc2NzaV9pZDsKKwl1Y2hhciBpc2FfZG1hX3NwZWVkOworCXVjaGFyIGlzYV9kbWFfY2hhbm5lbDsKKwl1Y2hhciBjaGlwX3ZlcnNpb247CisJdXNob3J0IGxpYl9zZXJpYWxfbm87CisJdXNob3J0IGxpYl92ZXJzaW9uOworCXVzaG9ydCBtY29kZV9kYXRlOworCXVzaG9ydCBtY29kZV92ZXJzaW9uOworCXVjaGFyIG1heF90YWdfcW5nW0FTQ19NQVhfVElEICsgMV07CisJdWNoYXIgKm92ZXJydW5fYnVmOworCXVjaGFyIHNkdHJfcGVyaW9kX29mZnNldFtBU0NfTUFYX1RJRCArIDFdOworCXVzaG9ydCBwY2lfc2xvdF9pbmZvOworCXVjaGFyIGFkYXB0ZXJfaW5mb1s2XTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiB9IEFTQ19EVkNfQ0ZHOwogCiAjZGVmaW5lIEFTQ19ERUZfRFZDX0NOVEwgICAgICAgMHhGRkZGCkBAIC0xNTAxLDY0ICsxNDg4LDY0IEBACiAjZGVmaW5lIEFTQ19NSU5fVEFHR0VEX0NNRCAgNwogI2RlZmluZSBBU0NfTUFYX1NDU0lfUkVTRVRfV0FJVCAgICAgIDMwCiAKLXN0cnVjdCBhc2NfZHZjX3ZhcjsgICAgIC8qIEZvcndhcmQgRGVjbGFyYXRpb24uICovCitzdHJ1Y3QgYXNjX2R2Y192YXI7CQkvKiBGb3J3YXJkIERlY2xhcmF0aW9uLiAqLwogCi10eXBlZGVmIHZvaWQgKCogQVNDX0lTUl9DQUxMQkFDSykoc3RydWN0IGFzY19kdmNfdmFyICosIEFTQ19RRE9ORV9JTkZPICopOwotdHlwZWRlZiBpbnQgKCogQVNDX0VYRV9DQUxMQkFDSykoc3RydWN0IGFzY19kdmNfdmFyICosIEFTQ19TQ1NJX1EgKik7Cit0eXBlZGVmIHZvaWQgKCpBU0NfSVNSX0NBTExCQUNLKSAoc3RydWN0IGFzY19kdmNfdmFyICosIEFTQ19RRE9ORV9JTkZPICopOwordHlwZWRlZiBpbnQgKCpBU0NfRVhFX0NBTExCQUNLKSAoc3RydWN0IGFzY19kdmNfdmFyICosIEFTQ19TQ1NJX1EgKik7CiAKIHR5cGVkZWYgc3RydWN0IGFzY19kdmNfdmFyIHsKLSAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgZXJyX2NvZGU7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBkdmNfY250bDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGJ1Z19maXhfY250bDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGJ1c190eXBlOwotICAgIEFTQ19JU1JfQ0FMTEJBQ0sgICAgaXNyX2NhbGxiYWNrOwotICAgIEFTQ19FWEVfQ0FMTEJBQ0sgICAgZXhlX2NhbGxiYWNrOwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIGluaXRfc2R0cjsKLSAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBzZHRyX2RvbmU7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdXNlX3RhZ2dlZF9xbmc7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdW5pdF9ub3RfcmVhZHk7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgcXVldWVfZnVsbF9vcl9idXN5OwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHN0YXJ0X21vdG9yOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2NzaV9yZXNldF93YWl0OwotICAgIHVjaGFyICAgICAgICAgICAgICAgY2hpcF9ubzsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGlzX2luX2ludDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIG1heF90b3RhbF9xbmc7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBjdXJfdG90YWxfcW5nOwotICAgIHVjaGFyICAgICAgICAgICAgICAgaW5fY3JpdGljYWxfY250OwotICAgIHVjaGFyICAgICAgICAgICAgICAgaXJxX25vOwotICAgIHVjaGFyICAgICAgICAgICAgICAgbGFzdF9xX3Nob3J0YWdlOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgaW5pdF9zdGF0ZTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGN1cl9kdmNfcW5nW0FTQ19NQVhfVElEICsgMV07Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfZHZjX3FuZ1tBU0NfTUFYX1RJRCArIDFdOwotICAgIEFTQ19TQ1NJX1EgICpzY3NpcV9idXN5X2hlYWRbQVNDX01BWF9USUQgKyAxXTsKLSAgICBBU0NfU0NTSV9RICAqc2NzaXFfYnVzeV90YWlsW0FTQ19NQVhfVElEICsgMV07Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzZHRyX3BlcmlvZF90YmxbQVNDX01BWF9TWU5fWEZFUl9OT107Ci0gICAgQVNDX0RWQ19DRkcgKmNmZzsKLSAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSBwY2lfZml4X2FzeW5feGZlcl9hbHdheXM7Ci0gICAgY2hhciAgICAgICAgICAgICAgICByZWRvX3NjYW07Ci0gICAgdXNob3J0ICAgICAgICAgICAgICByZXMyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgZG9zX2ludDEzX3RhYmxlW0FTQ19NQVhfVElEICsgMV07Ci0gICAgQVNDX0RDTlQgICAgICAgICAgICBtYXhfZG1hX2NvdW50OwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIG5vX3NjYW07Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgcGNpX2ZpeF9hc3luX3hmZXI7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfc2R0cl9pbmRleDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGhvc3RfaW5pdF9zZHRyX2luZGV4OwotICAgIHN0cnVjdCBhc2NfYm9hcmQgICAgKmRydl9wdHI7Ci0gICAgQVNDX0RDTlQgICAgICAgICAgICB1Y19icmVhazsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwl1c2hvcnQgZXJyX2NvZGU7CisJdXNob3J0IGR2Y19jbnRsOworCXVzaG9ydCBidWdfZml4X2NudGw7CisJdXNob3J0IGJ1c190eXBlOworCUFTQ19JU1JfQ0FMTEJBQ0sgaXNyX2NhbGxiYWNrOworCUFTQ19FWEVfQ0FMTEJBQ0sgZXhlX2NhbGxiYWNrOworCUFTQ19TQ1NJX0JJVF9JRF9UWVBFIGluaXRfc2R0cjsKKwlBU0NfU0NTSV9CSVRfSURfVFlQRSBzZHRyX2RvbmU7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgdXNlX3RhZ2dlZF9xbmc7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgdW5pdF9ub3RfcmVhZHk7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgcXVldWVfZnVsbF9vcl9idXN5OworCUFTQ19TQ1NJX0JJVF9JRF9UWVBFIHN0YXJ0X21vdG9yOworCXVjaGFyIHNjc2lfcmVzZXRfd2FpdDsKKwl1Y2hhciBjaGlwX25vOworCWNoYXIgaXNfaW5faW50OworCXVjaGFyIG1heF90b3RhbF9xbmc7CisJdWNoYXIgY3VyX3RvdGFsX3FuZzsKKwl1Y2hhciBpbl9jcml0aWNhbF9jbnQ7CisJdWNoYXIgaXJxX25vOworCXVjaGFyIGxhc3RfcV9zaG9ydGFnZTsKKwl1c2hvcnQgaW5pdF9zdGF0ZTsKKwl1Y2hhciBjdXJfZHZjX3FuZ1tBU0NfTUFYX1RJRCArIDFdOworCXVjaGFyIG1heF9kdmNfcW5nW0FTQ19NQVhfVElEICsgMV07CisJQVNDX1NDU0lfUSAqc2NzaXFfYnVzeV9oZWFkW0FTQ19NQVhfVElEICsgMV07CisJQVNDX1NDU0lfUSAqc2NzaXFfYnVzeV90YWlsW0FTQ19NQVhfVElEICsgMV07CisJdWNoYXIgc2R0cl9wZXJpb2RfdGJsW0FTQ19NQVhfU1lOX1hGRVJfTk9dOworCUFTQ19EVkNfQ0ZHICpjZmc7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgcGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzOworCWNoYXIgcmVkb19zY2FtOworCXVzaG9ydCByZXMyOworCXVjaGFyIGRvc19pbnQxM190YWJsZVtBU0NfTUFYX1RJRCArIDFdOworCUFTQ19EQ05UIG1heF9kbWFfY291bnQ7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgbm9fc2NhbTsKKwlBU0NfU0NTSV9CSVRfSURfVFlQRSBwY2lfZml4X2FzeW5feGZlcjsKKwl1Y2hhciBtYXhfc2R0cl9pbmRleDsKKwl1Y2hhciBob3N0X2luaXRfc2R0cl9pbmRleDsKKwlzdHJ1Y3QgYXNjX2JvYXJkICpkcnZfcHRyOworCUFTQ19EQ05UIHVjX2JyZWFrOwogfSBBU0NfRFZDX1ZBUjsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX2R2Y19pbnFfaW5mbyB7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB0eXBlW0FTQ19NQVhfVElEICsgMV1bQVNDX01BWF9MVU4gKyAxXTsKKwl1Y2hhciB0eXBlW0FTQ19NQVhfVElEICsgMV1bQVNDX01BWF9MVU4gKyAxXTsKIH0gQVNDX0RWQ19JTlFfSU5GTzsKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX2NhcF9pbmZvIHsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIGxiYTsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIGJsa19zaXplOworCUFTQ19EQ05UIGxiYTsKKwlBU0NfRENOVCBibGtfc2l6ZTsKIH0gQVNDX0NBUF9JTkZPOwogCiB0eXBlZGVmIHN0cnVjdCBhc2NfY2FwX2luZm9fYXJyYXkgewotICAgIEFTQ19DQVBfSU5GTyAgICAgICAgY2FwX2luZm9bQVNDX01BWF9USUQgKyAxXVtBU0NfTUFYX0xVTiArIDFdOworCUFTQ19DQVBfSU5GTyBjYXBfaW5mb1tBU0NfTUFYX1RJRCArIDFdW0FTQ19NQVhfTFVOICsgMV07CiB9IEFTQ19DQVBfSU5GT19BUlJBWTsKIAogI2RlZmluZSBBU0NfTUNOVExfTk9fU0VMX1RJTUVPVVQgICh1c2hvcnQpMHgwMDAxCkBAIC0xNjAzLDIzICsxNTkwLDIzIEBACiAgICAoKGNmZyktPmlkX3NwZWVkID0gKChjZmcpLT5pZF9zcGVlZCAmIDB4MGYpIHwgKChzcGQpICYgMHgwZikgPDwgNCkKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjZWVwX2NvbmZpZyB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbHN3OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnX21zdzsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGluaXRfc2R0cjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGRpc2NfZW5hYmxlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdXNlX2NtZF9xbmc7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzdGFydF9tb3RvcjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIG1heF90b3RhbF9xbmc7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBtYXhfdGFnX3FuZzsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGJpb3Nfc2NhbjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHBvd2VyX3VwX3dhaXQ7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBub19zY2FtOwotICAgIHVjaGFyICAgICAgICAgICAgICAgaWRfc3BlZWQ7IC8qIGxvdyBvcmRlciA0IGJpdHMgaXMgY2hpcCBzY3NpIGlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGlnaCBvcmRlciA0IGJpdHMgaXMgaXNhIGRtYSBzcGVlZCAqLwotICAgIHVjaGFyICAgICAgICAgICAgICAgZG9zX2ludDEzX3RhYmxlW0FTQ19NQVhfVElEICsgMV07Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBhZGFwdGVyX2luZm9bNl07Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBjbnRsOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgY2hrc3VtOworCXVzaG9ydCBjZmdfbHN3OworCXVzaG9ydCBjZmdfbXN3OworCXVjaGFyIGluaXRfc2R0cjsKKwl1Y2hhciBkaXNjX2VuYWJsZTsKKwl1Y2hhciB1c2VfY21kX3FuZzsKKwl1Y2hhciBzdGFydF9tb3RvcjsKKwl1Y2hhciBtYXhfdG90YWxfcW5nOworCXVjaGFyIG1heF90YWdfcW5nOworCXVjaGFyIGJpb3Nfc2NhbjsKKwl1Y2hhciBwb3dlcl91cF93YWl0OworCXVjaGFyIG5vX3NjYW07CisJdWNoYXIgaWRfc3BlZWQ7CQkvKiBsb3cgb3JkZXIgNCBiaXRzIGlzIGNoaXAgc2NzaSBpZCAqLworCS8qIGhpZ2ggb3JkZXIgNCBiaXRzIGlzIGlzYSBkbWEgc3BlZWQgKi8KKwl1Y2hhciBkb3NfaW50MTNfdGFibGVbQVNDX01BWF9USUQgKyAxXTsKKwl1Y2hhciBhZGFwdGVyX2luZm9bNl07CisJdXNob3J0IGNudGw7CisJdXNob3J0IGNoa3N1bTsKIH0gQVNDRUVQX0NPTkZJRzsKIAogI2RlZmluZSBBU0NfUENJX0NGR19MU1dfU0NTSV9QQVJJVFkgIDB4MDgwMApAQCAtMTgyNyw4ICsxODE0LDggQEAKICNkZWZpbmUgQVNDX01DX1NBVkVfREFUQV9XU0laRSAgMHg0MAogCiB0eXBlZGVmIHN0cnVjdCBhc2NfbWNfc2F2ZWQgewotICAgIHVzaG9ydCAgICAgICAgICAgICAgZGF0YVtBU0NfTUNfU0FWRV9EQVRBX1dTSVpFXTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNvZGVbQVNDX01DX1NBVkVfQ09ERV9XU0laRV07CisJdXNob3J0IGRhdGFbQVNDX01DX1NBVkVfREFUQV9XU0laRV07CisJdXNob3J0IGNvZGVbQVNDX01DX1NBVkVfQ09ERV9XU0laRV07CiB9IEFTQ19NQ19TQVZFRDsKIAogI2RlZmluZSBBc2NHZXRRRG9uZUluUHJvZ3Jlc3MocG9ydCkgICAgICAgICBBc2NSZWFkTHJhbUJ5dGUoKHBvcnQpLCBBU0NWX1FfRE9ORV9JTl9QUk9HUkVTU19CKQpAQCAtMTkwMCwxMjAgKzE4ODcsMTEzIEBACiAjZGVmaW5lIEFzY1JlYWRDaGlwRHZjSUQocG9ydCkgICAgICAgICAgICAodWNoYXIpaW5wKChwb3J0KStJT1BfUkVHX0lEKQogI2RlZmluZSBBc2NXcml0ZUNoaXBEdmNJRChwb3J0LCBkYXRhKSAgICAgb3V0cCgocG9ydCkrSU9QX1JFR19JRCwgZGF0YSkKIAotU1RBVElDIGludCAgICAgICBBc2NXcml0ZUVFUENtZFJlZyhQb3J0QWRkciBpb3BfYmFzZSwgdWNoYXIgY21kX3JlZyk7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1dyaXRlRUVQRGF0YVJlZyhQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IGRhdGFfcmVnKTsKLVNUQVRJQyB2b2lkICAgICAgQXNjV2FpdEVFUFJlYWQodm9pZCk7Ci1TVEFUSUMgdm9pZCAgICAgIEFzY1dhaXRFRVBXcml0ZSh2b2lkKTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjUmVhZEVFUFdvcmQoUG9ydEFkZHIsIHVjaGFyKTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjV3JpdGVFRVBXb3JkKFBvcnRBZGRyLCB1Y2hhciwgdXNob3J0KTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjR2V0RUVQQ29uZmlnKFBvcnRBZGRyLCBBU0NFRVBfQ09ORklHICosIHVzaG9ydCk7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1NldEVFUENvbmZpZ09uY2UoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKLVNUQVRJQyBpbnQgICAgICAgQXNjU2V0RUVQQ29uZmlnKFBvcnRBZGRyLCBBU0NFRVBfQ09ORklHICosIHVzaG9ydCk7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1N0YXJ0Q2hpcChQb3J0QWRkcik7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1N0b3BDaGlwKFBvcnRBZGRyKTsKLVNUQVRJQyB2b2lkICAgICAgQXNjU2V0Q2hpcElIKFBvcnRBZGRyLCB1c2hvcnQpOwotU1RBVElDIGludCAgICAgICBBc2NJc0NoaXBIYWx0ZWQoUG9ydEFkZHIpOwotU1RBVElDIHZvaWQgICAgICBBc2NBY2tJbnRlcnJ1cHQoUG9ydEFkZHIpOwotU1RBVElDIHZvaWQgICAgICBBc2NEaXNhYmxlSW50ZXJydXB0KFBvcnRBZGRyKTsKLVNUQVRJQyB2b2lkICAgICAgQXNjRW5hYmxlSW50ZXJydXB0KFBvcnRBZGRyKTsKLVNUQVRJQyB2b2lkICAgICAgQXNjU2V0QmFuayhQb3J0QWRkciwgdWNoYXIpOwotU1RBVElDIGludCAgICAgICBBc2NSZXNldENoaXBBbmRTY3NpQnVzKEFTQ19EVkNfVkFSICopOworc3RhdGljIGludCBBc2NXcml0ZUVFUENtZFJlZyhQb3J0QWRkciBpb3BfYmFzZSwgdWNoYXIgY21kX3JlZyk7CitzdGF0aWMgaW50IEFzY1dyaXRlRUVQRGF0YVJlZyhQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IGRhdGFfcmVnKTsKK3N0YXRpYyB2b2lkIEFzY1dhaXRFRVBSZWFkKHZvaWQpOworc3RhdGljIHZvaWQgQXNjV2FpdEVFUFdyaXRlKHZvaWQpOworc3RhdGljIHVzaG9ydCBBc2NSZWFkRUVQV29yZChQb3J0QWRkciwgdWNoYXIpOworc3RhdGljIHVzaG9ydCBBc2NXcml0ZUVFUFdvcmQoUG9ydEFkZHIsIHVjaGFyLCB1c2hvcnQpOworc3RhdGljIHVzaG9ydCBBc2NHZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKK3N0YXRpYyBpbnQgQXNjU2V0RUVQQ29uZmlnT25jZShQb3J0QWRkciwgQVNDRUVQX0NPTkZJRyAqLCB1c2hvcnQpOworc3RhdGljIGludCBBc2NTZXRFRVBDb25maWcoUG9ydEFkZHIsIEFTQ0VFUF9DT05GSUcgKiwgdXNob3J0KTsKK3N0YXRpYyBpbnQgQXNjU3RhcnRDaGlwKFBvcnRBZGRyKTsKK3N0YXRpYyBpbnQgQXNjU3RvcENoaXAoUG9ydEFkZHIpOworc3RhdGljIHZvaWQgQXNjU2V0Q2hpcElIKFBvcnRBZGRyLCB1c2hvcnQpOworc3RhdGljIGludCBBc2NJc0NoaXBIYWx0ZWQoUG9ydEFkZHIpOworc3RhdGljIHZvaWQgQXNjQWNrSW50ZXJydXB0KFBvcnRBZGRyKTsKK3N0YXRpYyB2b2lkIEFzY0Rpc2FibGVJbnRlcnJ1cHQoUG9ydEFkZHIpOworc3RhdGljIHZvaWQgQXNjRW5hYmxlSW50ZXJydXB0KFBvcnRBZGRyKTsKK3N0YXRpYyB2b2lkIEFzY1NldEJhbmsoUG9ydEFkZHIsIHVjaGFyKTsKK3N0YXRpYyBpbnQgQXNjUmVzZXRDaGlwQW5kU2NzaUJ1cyhBU0NfRFZDX1ZBUiAqKTsKICNpZmRlZiBDT05GSUdfSVNBCi1TVEFUSUMgdXNob3J0ICAgIEFzY0dldElzYURtYUNoYW5uZWwoUG9ydEFkZHIpOwotU1RBVElDIHVzaG9ydCAgICBBc2NTZXRJc2FEbWFDaGFubmVsKFBvcnRBZGRyLCB1c2hvcnQpOwotU1RBVElDIHVjaGFyICAgICBBc2NTZXRJc2FEbWFTcGVlZChQb3J0QWRkciwgdWNoYXIpOwotU1RBVElDIHVjaGFyICAgICBBc2NHZXRJc2FEbWFTcGVlZChQb3J0QWRkcik7CitzdGF0aWMgdXNob3J0IEFzY0dldElzYURtYUNoYW5uZWwoUG9ydEFkZHIpOworc3RhdGljIHVzaG9ydCBBc2NTZXRJc2FEbWFDaGFubmVsKFBvcnRBZGRyLCB1c2hvcnQpOworc3RhdGljIHVjaGFyIEFzY1NldElzYURtYVNwZWVkKFBvcnRBZGRyLCB1Y2hhcik7CitzdGF0aWMgdWNoYXIgQXNjR2V0SXNhRG1hU3BlZWQoUG9ydEFkZHIpOwogI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KLVNUQVRJQyB1Y2hhciAgICAgQXNjUmVhZExyYW1CeXRlKFBvcnRBZGRyLCB1c2hvcnQpOwotU1RBVElDIHVzaG9ydCAgICBBc2NSZWFkTHJhbVdvcmQoUG9ydEFkZHIsIHVzaG9ydCk7CitzdGF0aWMgdWNoYXIgQXNjUmVhZExyYW1CeXRlKFBvcnRBZGRyLCB1c2hvcnQpOworc3RhdGljIHVzaG9ydCBBc2NSZWFkTHJhbVdvcmQoUG9ydEFkZHIsIHVzaG9ydCk7CiAjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKLVNUQVRJQyBBU0NfRENOVCAgQXNjUmVhZExyYW1EV29yZChQb3J0QWRkciwgdXNob3J0KTsKK3N0YXRpYyBBU0NfRENOVCBBc2NSZWFkTHJhbURXb3JkKFBvcnRBZGRyLCB1c2hvcnQpOwogI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCi1TVEFUSUMgdm9pZCAgICAgIEFzY1dyaXRlTHJhbVdvcmQoUG9ydEFkZHIsIHVzaG9ydCwgdXNob3J0KTsKLVNUQVRJQyB2b2lkICAgICAgQXNjV3JpdGVMcmFtQnl0ZShQb3J0QWRkciwgdXNob3J0LCB1Y2hhcik7Ci1TVEFUSUMgQVNDX0RDTlQgIEFzY01lbVN1bUxyYW1Xb3JkKFBvcnRBZGRyLCB1c2hvcnQsIGludCk7Ci1TVEFUSUMgdm9pZCAgICAgIEFzY01lbVdvcmRTZXRMcmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVzaG9ydCwgaW50KTsKLVNUQVRJQyB2b2lkICAgICAgQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKLVNUQVRJQyB2b2lkICAgICAgQXNjTWVtRFdvcmRDb3B5UHRyVG9McmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7Ci1TVEFUSUMgdm9pZCAgICAgIEFzY01lbVdvcmRDb3B5UHRyRnJvbUxyYW0oUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjSW5pdEFzY0R2Y1ZhcihBU0NfRFZDX1ZBUiAqKTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjSW5pdEZyb21FRVAoQVNDX0RWQ19WQVIgKik7Ci1TVEFUSUMgdXNob3J0ICAgIEFzY0luaXRGcm9tQXNjRHZjVmFyKEFTQ19EVkNfVkFSICopOwotU1RBVElDIHVzaG9ydCAgICBBc2NJbml0TWljcm9Db2RlVmFyKEFTQ19EVkNfVkFSICopOwotU1RBVElDIGludCAgICAgICBBc2NUZXN0RXh0ZXJuYWxMcmFtKEFTQ19EVkNfVkFSICopOwotU1RBVElDIHVjaGFyICAgICBBc2NNc2dPdXRTRFRSKEFTQ19EVkNfVkFSICosIHVjaGFyLCB1Y2hhcik7Ci1TVEFUSUMgdWNoYXIgICAgIEFzY0NhbFNEVFJEYXRhKEFTQ19EVkNfVkFSICosIHVjaGFyLCB1Y2hhcik7Ci1TVEFUSUMgdm9pZCAgICAgIEFzY1NldENoaXBTRFRSKFBvcnRBZGRyLCB1Y2hhciwgdWNoYXIpOwotU1RBVElDIHVjaGFyICAgICBBc2NHZXRTeW5QZXJpb2RJbmRleChBU0NfRFZDX1ZBUiAqLCB1Y2hhcik7Ci1TVEFUSUMgdWNoYXIgICAgIEFzY0FsbG9jRnJlZVF1ZXVlKFBvcnRBZGRyLCB1Y2hhcik7Ci1TVEFUSUMgdWNoYXIgICAgIEFzY0FsbG9jTXVsdGlwbGVGcmVlUXVldWUoUG9ydEFkZHIsIHVjaGFyLCB1Y2hhcik7Ci1TVEFUSUMgaW50ICAgICAgIEFzY0hvc3RSZXFSaXNjSGFsdChQb3J0QWRkcik7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1N0b3BRdWV1ZUV4ZShQb3J0QWRkcik7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1NlbmRTY3NpUXVldWUoQVNDX0RWQ19WQVIgKiwKLSAgICAgICAgICAgICAgICAgICAgQVNDX1NDU0lfUSAqIHNjc2lxLAotICAgICAgICAgICAgICAgICAgICB1Y2hhciBuX3FfcmVxdWlyZWQpOwotU1RBVElDIGludCAgICAgICBBc2NQdXRSZWFkeVF1ZXVlKEFTQ19EVkNfVkFSICosCi0gICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKiwgdWNoYXIpOwotU1RBVElDIGludCAgICAgICBBc2NQdXRSZWFkeVNnTGlzdFF1ZXVlKEFTQ19EVkNfVkFSICosCi0gICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKiwgdWNoYXIpOwotU1RBVElDIGludCAgICAgICBBc2NTZXRDaGlwU3luUmVnQXRJRChQb3J0QWRkciwgdWNoYXIsIHVjaGFyKTsKLVNUQVRJQyBpbnQgICAgICAgQXNjU2V0UnVuQ2hpcFN5blJlZ0F0SUQoUG9ydEFkZHIsIHVjaGFyLCB1Y2hhcik7Ci1TVEFUSUMgdXNob3J0ICAgIEFzY0luaXRMcmFtKEFTQ19EVkNfVkFSICopOwotU1RBVElDIHVzaG9ydCAgICBBc2NJbml0UUxpbmtWYXIoQVNDX0RWQ19WQVIgKik7Ci1TVEFUSUMgaW50ICAgICAgIEFzY1NldExpYkVycm9yQ29kZShBU0NfRFZDX1ZBUiAqLCB1c2hvcnQpOwotU1RBVElDIGludCAgICAgICBBc2NJc3JDaGlwSGFsdGVkKEFTQ19EVkNfVkFSICopOwotU1RBVElDIHVjaGFyICAgICBfQXNjQ29weUxyYW1TY3NpRG9uZVEoUG9ydEFkZHIsIHVzaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgQVNDX1FET05FX0lORk8gKiwgQVNDX0RDTlQpOwotU1RBVElDIGludCAgICAgICBBc2NJc3JRRG9uZShBU0NfRFZDX1ZBUiAqKTsKLVNUQVRJQyBpbnQgICAgICAgQXNjQ29tcGFyZVN0cmluZyh1Y2hhciAqLCB1Y2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgQXNjV3JpdGVMcmFtV29yZChQb3J0QWRkciwgdXNob3J0LCB1c2hvcnQpOworc3RhdGljIHZvaWQgQXNjV3JpdGVMcmFtQnl0ZShQb3J0QWRkciwgdXNob3J0LCB1Y2hhcik7CitzdGF0aWMgQVNDX0RDTlQgQXNjTWVtU3VtTHJhbVdvcmQoUG9ydEFkZHIsIHVzaG9ydCwgaW50KTsKK3N0YXRpYyB2b2lkIEFzY01lbVdvcmRTZXRMcmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVzaG9ydCwgaW50KTsKK3N0YXRpYyB2b2lkIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIEFzY01lbVdvcmRDb3B5UHRyRnJvbUxyYW0oUG9ydEFkZHIsIHVzaG9ydCwgdWNoYXIgKiwgaW50KTsKK3N0YXRpYyB1c2hvcnQgQXNjSW5pdEFzY0R2Y1ZhcihBU0NfRFZDX1ZBUiAqKTsKK3N0YXRpYyB1c2hvcnQgQXNjSW5pdEZyb21FRVAoQVNDX0RWQ19WQVIgKik7CitzdGF0aWMgdXNob3J0IEFzY0luaXRGcm9tQXNjRHZjVmFyKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVzaG9ydCBBc2NJbml0TWljcm9Db2RlVmFyKEFTQ19EVkNfVkFSICopOworc3RhdGljIGludCBBc2NUZXN0RXh0ZXJuYWxMcmFtKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVjaGFyIEFzY01zZ091dFNEVFIoQVNDX0RWQ19WQVIgKiwgdWNoYXIsIHVjaGFyKTsKK3N0YXRpYyB1Y2hhciBBc2NDYWxTRFRSRGF0YShBU0NfRFZDX1ZBUiAqLCB1Y2hhciwgdWNoYXIpOworc3RhdGljIHZvaWQgQXNjU2V0Q2hpcFNEVFIoUG9ydEFkZHIsIHVjaGFyLCB1Y2hhcik7CitzdGF0aWMgdWNoYXIgQXNjR2V0U3luUGVyaW9kSW5kZXgoQVNDX0RWQ19WQVIgKiwgdWNoYXIpOworc3RhdGljIHVjaGFyIEFzY0FsbG9jRnJlZVF1ZXVlKFBvcnRBZGRyLCB1Y2hhcik7CitzdGF0aWMgdWNoYXIgQXNjQWxsb2NNdWx0aXBsZUZyZWVRdWV1ZShQb3J0QWRkciwgdWNoYXIsIHVjaGFyKTsKK3N0YXRpYyBpbnQgQXNjSG9zdFJlcVJpc2NIYWx0KFBvcnRBZGRyKTsKK3N0YXRpYyBpbnQgQXNjU3RvcFF1ZXVlRXhlKFBvcnRBZGRyKTsKK3N0YXRpYyBpbnQgQXNjU2VuZFNjc2lRdWV1ZShBU0NfRFZDX1ZBUiAqLAorCQkJICAgIEFTQ19TQ1NJX1EgKnNjc2lxLCB1Y2hhciBuX3FfcmVxdWlyZWQpOworc3RhdGljIGludCBBc2NQdXRSZWFkeVF1ZXVlKEFTQ19EVkNfVkFSICosIEFTQ19TQ1NJX1EgKiwgdWNoYXIpOworc3RhdGljIGludCBBc2NQdXRSZWFkeVNnTGlzdFF1ZXVlKEFTQ19EVkNfVkFSICosIEFTQ19TQ1NJX1EgKiwgdWNoYXIpOworc3RhdGljIGludCBBc2NTZXRDaGlwU3luUmVnQXRJRChQb3J0QWRkciwgdWNoYXIsIHVjaGFyKTsKK3N0YXRpYyBpbnQgQXNjU2V0UnVuQ2hpcFN5blJlZ0F0SUQoUG9ydEFkZHIsIHVjaGFyLCB1Y2hhcik7CitzdGF0aWMgdXNob3J0IEFzY0luaXRMcmFtKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVzaG9ydCBBc2NJbml0UUxpbmtWYXIoQVNDX0RWQ19WQVIgKik7CitzdGF0aWMgaW50IEFzY1NldExpYkVycm9yQ29kZShBU0NfRFZDX1ZBUiAqLCB1c2hvcnQpOworc3RhdGljIGludCBBc2NJc3JDaGlwSGFsdGVkKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVjaGFyIF9Bc2NDb3B5THJhbVNjc2lEb25lUShQb3J0QWRkciwgdXNob3J0LAorCQkJCSAgIEFTQ19RRE9ORV9JTkZPICosIEFTQ19EQ05UKTsKK3N0YXRpYyBpbnQgQXNjSXNyUURvbmUoQVNDX0RWQ19WQVIgKik7CitzdGF0aWMgaW50IEFzY0NvbXBhcmVTdHJpbmcodWNoYXIgKiwgdWNoYXIgKiwgaW50KTsKICNpZmRlZiBDT05GSUdfSVNBCi1TVEFUSUMgdXNob3J0ICAgIEFzY0dldEVpc2FDaGlwQ2ZnKFBvcnRBZGRyKTsKLVNUQVRJQyBBU0NfRENOVCAgQXNjR2V0RWlzYVByb2R1Y3RJRChQb3J0QWRkcik7Ci1TVEFUSUMgUG9ydEFkZHIgIEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKFBvcnRBZGRyKTsKLVNUQVRJQyBQb3J0QWRkciAgQXNjU2VhcmNoSU9Qb3J0QWRkcjExKFBvcnRBZGRyKTsKLVNUQVRJQyBQb3J0QWRkciAgQXNjU2VhcmNoSU9Qb3J0QWRkcihQb3J0QWRkciwgdXNob3J0KTsKLVNUQVRJQyB2b2lkICAgICAgQXNjU2V0SVNBUE5QV2FpdEZvcktleSh2b2lkKTsKK3N0YXRpYyB1c2hvcnQgQXNjR2V0RWlzYUNoaXBDZmcoUG9ydEFkZHIpOworc3RhdGljIEFTQ19EQ05UIEFzY0dldEVpc2FQcm9kdWN0SUQoUG9ydEFkZHIpOworc3RhdGljIFBvcnRBZGRyIEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKFBvcnRBZGRyKTsKK3N0YXRpYyBQb3J0QWRkciBBc2NTZWFyY2hJT1BvcnRBZGRyMTEoUG9ydEFkZHIpOworc3RhdGljIFBvcnRBZGRyIEFzY1NlYXJjaElPUG9ydEFkZHIoUG9ydEFkZHIsIHVzaG9ydCk7CitzdGF0aWMgdm9pZCBBc2NTZXRJU0FQTlBXYWl0Rm9yS2V5KHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KLVNUQVRJQyB1Y2hhciAgICAgQXNjR2V0Q2hpcFNjc2lDdHJsKFBvcnRBZGRyKTsKLVNUQVRJQyB1Y2hhciAgICAgQXNjU2V0Q2hpcFNjc2lJRChQb3J0QWRkciwgdWNoYXIpOwotU1RBVElDIHVjaGFyICAgICBBc2NHZXRDaGlwVmVyc2lvbihQb3J0QWRkciwgdXNob3J0KTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjR2V0Q2hpcEJ1c1R5cGUoUG9ydEFkZHIpOwotU1RBVElDIEFTQ19EQ05UICBBc2NMb2FkTWljcm9Db2RlKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIHVzaG9ydCk7Ci1TVEFUSUMgaW50ICAgICAgIEFzY0ZpbmRTaWduYXR1cmUoUG9ydEFkZHIpOwotU1RBVElDIHZvaWQgICAgICBBc2NUb2dnbGVJUlFBY3QoUG9ydEFkZHIpOwotU1RBVElDIHVjaGFyICAgICBBc2NHZXRDaGlwSVJRKFBvcnRBZGRyLCB1c2hvcnQpOwotU1RBVElDIHVjaGFyICAgICBBc2NTZXRDaGlwSVJRKFBvcnRBZGRyLCB1Y2hhciwgdXNob3J0KTsKLVNUQVRJQyB1c2hvcnQgICAgQXNjR2V0Q2hpcEJpb3NBZGRyZXNzKFBvcnRBZGRyLCB1c2hvcnQpOwotU1RBVElDIGlubGluZSB1bG9uZyBEdmNFbnRlckNyaXRpY2FsKHZvaWQpOwotU1RBVElDIGlubGluZSB2b2lkIER2Y0xlYXZlQ3JpdGljYWwodWxvbmcpOworc3RhdGljIHVjaGFyIEFzY0dldENoaXBTY3NpQ3RybChQb3J0QWRkcik7CitzdGF0aWMgdWNoYXIgQXNjU2V0Q2hpcFNjc2lJRChQb3J0QWRkciwgdWNoYXIpOworc3RhdGljIHVjaGFyIEFzY0dldENoaXBWZXJzaW9uKFBvcnRBZGRyLCB1c2hvcnQpOworc3RhdGljIHVzaG9ydCBBc2NHZXRDaGlwQnVzVHlwZShQb3J0QWRkcik7CitzdGF0aWMgQVNDX0RDTlQgQXNjTG9hZE1pY3JvQ29kZShQb3J0QWRkciwgdXNob3J0LCB1Y2hhciAqLCB1c2hvcnQpOworc3RhdGljIGludCBBc2NGaW5kU2lnbmF0dXJlKFBvcnRBZGRyKTsKK3N0YXRpYyB2b2lkIEFzY1RvZ2dsZUlSUUFjdChQb3J0QWRkcik7CitzdGF0aWMgdWNoYXIgQXNjR2V0Q2hpcElSUShQb3J0QWRkciwgdXNob3J0KTsKK3N0YXRpYyB1Y2hhciBBc2NTZXRDaGlwSVJRKFBvcnRBZGRyLCB1Y2hhciwgdXNob3J0KTsKK3N0YXRpYyB1c2hvcnQgQXNjR2V0Q2hpcEJpb3NBZGRyZXNzKFBvcnRBZGRyLCB1c2hvcnQpOworc3RhdGljIGlubGluZSB1bG9uZyBEdmNFbnRlckNyaXRpY2FsKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkIER2Y0xlYXZlQ3JpdGljYWwodWxvbmcpOwogI2lmZGVmIENPTkZJR19QQ0kKLVNUQVRJQyB1Y2hhciAgICAgRHZjUmVhZFBDSUNvbmZpZ0J5dGUoQVNDX0RWQ19WQVIgKiwgdXNob3J0KTsKLVNUQVRJQyB2b2lkICAgICAgRHZjV3JpdGVQQ0lDb25maWdCeXRlKEFTQ19EVkNfVkFSICosCi0gICAgICAgICAgICAgICAgICAgIHVzaG9ydCwgdWNoYXIpOworc3RhdGljIHVjaGFyIER2Y1JlYWRQQ0lDb25maWdCeXRlKEFTQ19EVkNfVkFSICosIHVzaG9ydCk7CitzdGF0aWMgdm9pZCBEdmNXcml0ZVBDSUNvbmZpZ0J5dGUoQVNDX0RWQ19WQVIgKiwgdXNob3J0LCB1Y2hhcik7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwotU1RBVElDIHVzaG9ydCAgICAgIEFzY0dldENoaXBCaW9zQWRkcmVzcyhQb3J0QWRkciwgdXNob3J0KTsKLVNUQVRJQyB2b2lkICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZChBU0NfRENOVCk7Ci1TVEFUSUMgdm9pZCAgICAgIER2Y0RlbGF5TmFub1NlY29uZChBU0NfRFZDX1ZBUiAqLCBBU0NfRENOVCk7Ci1TVEFUSUMgdm9pZCAgICAgIER2Y1B1dFNjc2lRKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7Ci1TVEFUSUMgdm9pZCAgICAgIER2Y0dldFFpbmZvKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7Ci1TVEFUSUMgdXNob3J0ICAgIEFzY0luaXRHZXRDb25maWcoQVNDX0RWQ19WQVIgKik7Ci1TVEFUSUMgdXNob3J0ICAgIEFzY0luaXRTZXRDb25maWcoQVNDX0RWQ19WQVIgKik7Ci1TVEFUSUMgdXNob3J0ICAgIEFzY0luaXRBc2MxMDAwRHJpdmVyKEFTQ19EVkNfVkFSICopOwotU1RBVElDIHZvaWQgICAgICBBc2NBc3luY0ZpeChBU0NfRFZDX1ZBUiAqLCB1Y2hhciwKLSAgICAgICAgICAgICAgICAgICAgQVNDX1NDU0lfSU5RVUlSWSAqKTsKLVNUQVRJQyBpbnQgICAgICAgQXNjVGFnUXVldWluZ1NhZmUoQVNDX1NDU0lfSU5RVUlSWSAqKTsKLVNUQVRJQyB2b2lkICAgICAgQXNjSW5xdWlyeUhhbmRsaW5nKEFTQ19EVkNfVkFSICosCi0gICAgICAgICAgICAgICAgICAgIHVjaGFyLCBBU0NfU0NTSV9JTlFVSVJZICopOwotU1RBVElDIGludCAgICAgICBBc2NFeGVTY3NpUXVldWUoQVNDX0RWQ19WQVIgKiwgQVNDX1NDU0lfUSAqKTsKLVNUQVRJQyBpbnQgICAgICAgQXNjSVNSKEFTQ19EVkNfVkFSICopOwotU1RBVElDIHVpbnQgICAgICBBc2NHZXROdW1PZkZyZWVRdWV1ZShBU0NfRFZDX1ZBUiAqLCB1Y2hhciwKLSAgICAgICAgICAgICAgICAgICAgdWNoYXIpOwotU1RBVElDIGludCAgICAgICBBc2NTZ0xpc3RUb1F1ZXVlKGludCk7CitzdGF0aWMgdXNob3J0IEFzY0dldENoaXBCaW9zQWRkcmVzcyhQb3J0QWRkciwgdXNob3J0KTsKK3N0YXRpYyB2b2lkIER2Y1NsZWVwTWlsbGlTZWNvbmQoQVNDX0RDTlQpOworc3RhdGljIHZvaWQgRHZjRGVsYXlOYW5vU2Vjb25kKEFTQ19EVkNfVkFSICosIEFTQ19EQ05UKTsKK3N0YXRpYyB2b2lkIER2Y1B1dFNjc2lRKFBvcnRBZGRyLCB1c2hvcnQsIHVjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBEdmNHZXRRaW5mbyhQb3J0QWRkciwgdXNob3J0LCB1Y2hhciAqLCBpbnQpOworc3RhdGljIHVzaG9ydCBBc2NJbml0R2V0Q29uZmlnKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVzaG9ydCBBc2NJbml0U2V0Q29uZmlnKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVzaG9ydCBBc2NJbml0QXNjMTAwMERyaXZlcihBU0NfRFZDX1ZBUiAqKTsKK3N0YXRpYyB2b2lkIEFzY0FzeW5jRml4KEFTQ19EVkNfVkFSICosIHVjaGFyLCBBU0NfU0NTSV9JTlFVSVJZICopOworc3RhdGljIGludCBBc2NUYWdRdWV1aW5nU2FmZShBU0NfU0NTSV9JTlFVSVJZICopOworc3RhdGljIHZvaWQgQXNjSW5xdWlyeUhhbmRsaW5nKEFTQ19EVkNfVkFSICosIHVjaGFyLCBBU0NfU0NTSV9JTlFVSVJZICopOworc3RhdGljIGludCBBc2NFeGVTY3NpUXVldWUoQVNDX0RWQ19WQVIgKiwgQVNDX1NDU0lfUSAqKTsKK3N0YXRpYyBpbnQgQXNjSVNSKEFTQ19EVkNfVkFSICopOworc3RhdGljIHVpbnQgQXNjR2V0TnVtT2ZGcmVlUXVldWUoQVNDX0RWQ19WQVIgKiwgdWNoYXIsIHVjaGFyKTsKK3N0YXRpYyBpbnQgQXNjU2dMaXN0VG9RdWV1ZShpbnQpOwogI2lmZGVmIENPTkZJR19JU0EKLVNUQVRJQyB2b2lkICAgICAgQXNjRW5hYmxlSXNhRG1hKHVjaGFyKTsKK3N0YXRpYyB2b2lkIEFzY0VuYWJsZUlzYURtYSh1Y2hhcik7CiAjZW5kaWYgLyogQ09ORklHX0lTQSAqLwotU1RBVElDIEFTQ19EQ05UICBBc2NHZXRNYXhEbWFDb3VudCh1c2hvcnQpOwotc3RhdGljIGNvbnN0IGNoYXIgKmFkdmFuc3lzX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwKTsKK3N0YXRpYyBBU0NfRENOVCBBc2NHZXRNYXhEbWFDb3VudCh1c2hvcnQpOworc3RhdGljIGNvbnN0IGNoYXIgKmFkdmFuc3lzX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpOwogCiAvKgogICogLS0tIEFkdiBMaWJyYXJ5IENvbnN0YW50cyBhbmQgTWFjcm9zCkBAIC0yMDM1LDEwICsyMDE1LDEwIEBACiAgKiBhcmUgYWxsIGNvbnNpc3RlbnQgYXQgOCwgMTYsIGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gUG9pbnRlcnMKICAqIGFuZCBsb25nIHR5cGVzIGFyZSA2NCBiaXRzIG9uIEFscGhhIGFuZCBVbHRyYVNQQVJDLgogICovCi0jZGVmaW5lIEFEVl9QQUREUiBfX3UzMiAgICAgICAgIC8qIFBoeXNpY2FsIGFkZHJlc3MgZGF0YSB0eXBlLiAqLwotI2RlZmluZSBBRFZfVkFERFIgX191MzIgICAgICAgICAvKiBWaXJ0dWFsIGFkZHJlc3MgZGF0YSB0eXBlLiAqLwotI2RlZmluZSBBRFZfRENOVCAgX191MzIgICAgICAgICAvKiBVbnNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCi0jZGVmaW5lIEFEVl9TRENOVCBfX3MzMiAgICAgICAgIC8qIFNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisjZGVmaW5lIEFEVl9QQUREUiBfX3UzMgkJLyogUGh5c2ljYWwgYWRkcmVzcyBkYXRhIHR5cGUuICovCisjZGVmaW5lIEFEVl9WQUREUiBfX3UzMgkJLyogVmlydHVhbCBhZGRyZXNzIGRhdGEgdHlwZS4gKi8KKyNkZWZpbmUgQURWX0RDTlQgIF9fdTMyCQkvKiBVbnNpZ25lZCBEYXRhIGNvdW50IHR5cGUuICovCisjZGVmaW5lIEFEVl9TRENOVCBfX3MzMgkJLyogU2lnbmVkIERhdGEgY291bnQgdHlwZS4gKi8KIAogLyoKICAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBjb252ZXJ0IGEgdmlydHVhbCBhZGRyZXNzIHRvIGEKQEAgLTIwNTEsNyArMjAzMSw3IEBACiAjZGVmaW5lIEFEVl9WQUREUl9UT19VMzIgICB2aXJ0X3RvX2J1cwogI2RlZmluZSBBRFZfVTMyX1RPX1ZBRERSICAgYnVzX3RvX3ZpcnQKIAotI2RlZmluZSBBZHZQb3J0QWRkciAgdm9pZCBfX2lvbWVtICogICAgIC8qIFZpcnR1YWwgbWVtb3J5IGFkZHJlc3Mgc2l6ZSAqLworI2RlZmluZSBBZHZQb3J0QWRkciAgdm9pZCBfX2lvbWVtICoJLyogVmlydHVhbCBtZW1vcnkgYWRkcmVzcyBzaXplICovCiAKIC8qCiAgKiBEZWZpbmUgQWR2IExpYnJhcnkgcmVxdWlyZWQgbWVtb3J5IGFjY2VzcyBtYWNyb3MuCkBAIC0yMTAzLDIwICsyMDgzLDIwIEBACiAKICNkZWZpbmUgQURWX0VFUF9EVkNfQ0ZHX0JFR0lOICAgICAgICAgICAoMHgwMCkKICNkZWZpbmUgQURWX0VFUF9EVkNfQ0ZHX0VORCAgICAgICAgICAgICAoMHgxNSkKLSNkZWZpbmUgQURWX0VFUF9EVkNfQ1RMX0JFR0lOICAgICAgICAgICAoMHgxNikgIC8qIGxvY2F0aW9uIG9mIE9FTSBuYW1lICovCisjZGVmaW5lIEFEVl9FRVBfRFZDX0NUTF9CRUdJTiAgICAgICAgICAgKDB4MTYpCS8qIGxvY2F0aW9uIG9mIE9FTSBuYW1lICovCiAjZGVmaW5lIEFEVl9FRVBfTUFYX1dPUkRfQUREUiAgICAgICAgICAgKDB4MUUpCiAKICNkZWZpbmUgQURWX0VFUF9ERUxBWV9NUyAgICAgICAgICAgICAgICAxMDAKIAotI2RlZmluZSBBRFZfRUVQUk9NX0JJR19FTkRJQU4gICAgICAgICAgMHg4MDAwICAgLyogRUVQUk9NIEJpdCAxNSAqLwotI2RlZmluZSBBRFZfRUVQUk9NX0JJT1NfRU5BQkxFICAgICAgICAgMHg0MDAwICAgLyogRUVQUk9NIEJpdCAxNCAqLworI2RlZmluZSBBRFZfRUVQUk9NX0JJR19FTkRJQU4gICAgICAgICAgMHg4MDAwCS8qIEVFUFJPTSBCaXQgMTUgKi8KKyNkZWZpbmUgQURWX0VFUFJPTV9CSU9TX0VOQUJMRSAgICAgICAgIDB4NDAwMAkvKiBFRVBST00gQml0IDE0ICovCiAvKgogICogRm9yIHRoZSBBU0MzNTUwIEJpdCAxMyBpcyBUZXJtaW5hdGlvbiBQb2xhcml0eSBjb250cm9sIGJpdC4KICAqIEZvciBsYXRlciBJQ3MgQml0IDEzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIENJUyAoQ2FyZCBJbmZvcm1hdGlvbgogICogU2VydmljZSBTZWN0aW9uKSBpcyBsb2FkZWQgZnJvbSBFRVBST00uCiAgKi8KLSNkZWZpbmUgQURWX0VFUFJPTV9URVJNX1BPTCAgICAgICAgICAgIDB4MjAwMCAgIC8qIEVFUFJPTSBCaXQgMTMgKi8KLSNkZWZpbmUgQURWX0VFUFJPTV9DSVNfTEQgICAgICAgICAgICAgIDB4MjAwMCAgIC8qIEVFUFJPTSBCaXQgMTMgKi8KKyNkZWZpbmUgQURWX0VFUFJPTV9URVJNX1BPTCAgICAgICAgICAgIDB4MjAwMAkvKiBFRVBST00gQml0IDEzICovCisjZGVmaW5lIEFEVl9FRVBST01fQ0lTX0xEICAgICAgICAgICAgICAweDIwMDAJLyogRUVQUk9NIEJpdCAxMyAqLwogLyoKICAqIEFTQzM4QzE2MDAgQml0IDExCiAgKgpAQCAtMjEyOCwyODAgKzIxMDgsMjc3IEBACiAgKiBJTlQgQiBpbiB0aGUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgSW50IFBpbiBmaWVsZC4gSWYgaXQgaXMgMSwgdGhlbgogICogRnVuY3Rpb24gMSB3aWxsIHNwZWNpZnkgSU5UIEEuCiAgKi8KLSNkZWZpbmUgQURWX0VFUFJPTV9JTlRBQiAgICAgICAgICAgICAgIDB4MDgwMCAgIC8qIEVFUFJPTSBCaXQgMTEgKi8KKyNkZWZpbmUgQURWX0VFUFJPTV9JTlRBQiAgICAgICAgICAgICAgIDB4MDgwMAkvKiBFRVBST00gQml0IDExICovCiAKLXR5cGVkZWYgc3RydWN0IGFkdmVlcF8zNTUwX2NvbmZpZwotewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JkIE9mZnNldCwgRGVzY3JpcHRpb24gKi8KK3R5cGVkZWYgc3RydWN0IGFkdmVlcF8zNTUwX2NvbmZpZyB7CisJLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCiAKLSAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMyBzZXQgLSBUZXJtIFBvbGFyaXR5IENvbnRyb2wgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLwotICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgICAgICAqLwotICB1c2hvcnQgZGlzY19lbmFibGU7ICAgICAgICAgICAvKiAwMiBkaXNjb25uZWN0IGVuYWJsZSAqLwotICB1c2hvcnQgd2R0cl9hYmxlOyAgICAgICAgICAgICAvKiAwMyBXaWRlIERUUiBhYmxlICovCi0gIHVzaG9ydCBzZHRyX2FibGU7ICAgICAgICAgICAgIC8qIDA0IFN5bmNocm9ub3VzIERUUiBhYmxlICovCi0gIHVzaG9ydCBzdGFydF9tb3RvcjsgICAgICAgICAgIC8qIDA1IHNlbmQgc3RhcnQgdXAgbW90b3IgKi8KLSAgdXNob3J0IHRhZ3FuZ19hYmxlOyAgICAgICAgICAgLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLwotICB1c2hvcnQgYmlvc19zY2FuOyAgICAgICAgICAgICAvKiAwNyBCSU9TIGRldmljZSBjb250cm9sICovCi0gIHVzaG9ydCBzY2FtX3RvbGVyYW50OyAgICAgICAgIC8qIDA4IG5vIHNjYW0gKi8KKwl1c2hvcnQgY2ZnX2xzdzsJCS8qIDAwIHBvd2VyIHVwIGluaXRpYWxpemF0aW9uICovCisJLyogIGJpdCAxMyBzZXQgLSBUZXJtIFBvbGFyaXR5IENvbnRyb2wgKi8KKwkvKiAgYml0IDE0IHNldCAtIEJJT1MgRW5hYmxlICovCisJLyogIGJpdCAxNSBzZXQgLSBCaWcgRW5kaWFuIE1vZGUgKi8KKwl1c2hvcnQgY2ZnX21zdzsJCS8qIDAxIHVudXNlZCAgICAgICovCisJdXNob3J0IGRpc2NfZW5hYmxlOwkvKiAwMiBkaXNjb25uZWN0IGVuYWJsZSAqLworCXVzaG9ydCB3ZHRyX2FibGU7CS8qIDAzIFdpZGUgRFRSIGFibGUgKi8KKwl1c2hvcnQgc2R0cl9hYmxlOwkvKiAwNCBTeW5jaHJvbm91cyBEVFIgYWJsZSAqLworCXVzaG9ydCBzdGFydF9tb3RvcjsJLyogMDUgc2VuZCBzdGFydCB1cCBtb3RvciAqLworCXVzaG9ydCB0YWdxbmdfYWJsZTsJLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLworCXVzaG9ydCBiaW9zX3NjYW47CS8qIDA3IEJJT1MgZGV2aWNlIGNvbnRyb2wgKi8KKwl1c2hvcnQgc2NhbV90b2xlcmFudDsJLyogMDggbm8gc2NhbSAqLwogCi0gIHVjaGFyICBhZGFwdGVyX3Njc2lfaWQ7ICAgICAgIC8qIDA5IEhvc3QgQWRhcHRlciBJRCAqLwotICB1Y2hhciAgYmlvc19ib290X2RlbGF5OyAgICAgICAvKiAgICBwb3dlciB1cCB3YWl0ICovCisJdWNoYXIgYWRhcHRlcl9zY3NpX2lkOwkvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KKwl1Y2hhciBiaW9zX2Jvb3RfZGVsYXk7CS8qICAgIHBvd2VyIHVwIHdhaXQgKi8KIAotICB1Y2hhciAgc2NzaV9yZXNldF9kZWxheTsgICAgICAvKiAxMCByZXNldCBkZWxheSAqLwotICB1Y2hhciAgYmlvc19pZF9sdW47ICAgICAgICAgICAvKiAgICBmaXJzdCBib290IGRldmljZSBzY3NpIGlkICYgbHVuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGhpZ2ggbmliYmxlIGlzIGx1biAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBsb3cgbmliYmxlIGlzIHNjc2kgaWQgKi8KKwl1Y2hhciBzY3NpX3Jlc2V0X2RlbGF5OwkvKiAxMCByZXNldCBkZWxheSAqLworCXVjaGFyIGJpb3NfaWRfbHVuOwkvKiAgICBmaXJzdCBib290IGRldmljZSBzY3NpIGlkICYgbHVuICovCisJLyogICAgaGlnaCBuaWJibGUgaXMgbHVuICovCisJLyogICAgbG93IG5pYmJsZSBpcyBzY3NpIGlkICovCiAKLSAgdWNoYXIgIHRlcm1pbmF0aW9uOyAgICAgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisJdWNoYXIgdGVybWluYXRpb247CS8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKwkvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCisJLyogICAgMiAtIGxvdyBvZmYgLyBoaWdoIG9uICovCisJLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisJLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCiAKLSAgdWNoYXIgIHJlc2VydmVkMTsgICAgICAgICAgICAgLyogICAgcmVzZXJ2ZWQgYnl0ZSAobm90IHVzZWQpICovCisJdWNoYXIgcmVzZXJ2ZWQxOwkvKiAgICByZXNlcnZlZCBieXRlIChub3QgdXNlZCkgKi8KIAotICB1c2hvcnQgYmlvc19jdHJsOyAgICAgICAgICAgICAvKiAxMiBCSU9TIGNvbnRyb2wgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDAgIEJJT1MgZG9uJ3QgYWN0IGFzIGluaXRpYXRvci4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxICBCSU9TID4gMSBHQiBzdXBwb3J0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMiAgQklPUyA+IDIgRGlzayBTdXBwb3J0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMyAgQklPUyBkb24ndCBzdXBwb3J0IHJlbW92YWJsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA0ICBCSU9TIHN1cHBvcnQgYm9vdGFibGUgQ0QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA1ICBCSU9TIHNjYW4gZW5hYmxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDYgIEJJT1Mgc3VwcG9ydCBtdWx0aXBsZSBMVU5zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNyAgQklPUyBkaXNwbGF5IG9mIG1lc3NhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA4ICBTQ0FNIGRpc2FibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgOSAgUmVzZXQgU0NTSSBidXMgZHVyaW5nIGluaXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMSBObyB2ZXJib3NlIGluaXRpYWxpemF0aW9uLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEyIFNDU0kgcGFyaXR5IGVuYWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTUgKi8KLSAgdXNob3J0ICB1bHRyYV9hYmxlOyAgICAgICAgICAgLyogMTMgVUxUUkEgc3BlZWQgYWJsZSAqLwotICB1c2hvcnQgIHJlc2VydmVkMjsgICAgICAgICAgICAvKiAxNCByZXNlcnZlZCAqLwotICB1Y2hhciAgIG1heF9ob3N0X3FuZzsgICAgICAgICAvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWluZyAqLwotICB1Y2hhciAgIG1heF9kdmNfcW5nOyAgICAgICAgICAvKiAgICBtYXhpbXVtIHBlciBkZXZpY2UgcXVldWluZyAqLwotICB1c2hvcnQgIGR2Y19jbnRsOyAgICAgICAgICAgICAvKiAxNiBjb250cm9sIGJpdCBmb3IgZHJpdmVyICovCi0gIHVzaG9ydCAgYnVnX2ZpeDsgICAgICAgICAgICAgIC8qIDE3IGNvbnRyb2wgYml0IGZvciBidWcgZml4ICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMTsgIC8qIDE4IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAxICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMjsgIC8qIDE5IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAyICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMzsgIC8qIDIwIEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAzICovCi0gIHVzaG9ydCAgY2hlY2tfc3VtOyAgICAgICAgICAgIC8qIDIxIEVFUCBjaGVjayBzdW0gKi8KLSAgdWNoYXIgICBvZW1fbmFtZVsxNl07ICAgICAgICAgLyogMjIgT0VNIG5hbWUgKi8KLSAgdXNob3J0ICBkdmNfZXJyX2NvZGU7ICAgICAgICAgLyogMzAgbGFzdCBkZXZpY2UgZHJpdmVyIGVycm9yIGNvZGUgKi8KLSAgdXNob3J0ICBhZHZfZXJyX2NvZGU7ICAgICAgICAgLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCi0gIHVzaG9ydCAgYWR2X2Vycl9hZGRyOyAgICAgICAgIC8qIDMyIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAqLwotICB1c2hvcnQgIHNhdmVkX2R2Y19lcnJfY29kZTsgICAvKiAzMyBzYXZlZCBsYXN0IGRldi4gZHJpdmVyIGVycm9yIGNvZGUgICAqLwotICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfY29kZTsgICAvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KLSAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2FkZHI7ICAgLyogMzUgc2F2ZWQgbGFzdCB1YyBlcnJvciBhZGRyZXNzICAgICAgICAgKi8KLSAgdXNob3J0ICBudW1fb2ZfZXJyOyAgICAgICAgICAgLyogMzYgbnVtYmVyIG9mIGVycm9yICovCisJdXNob3J0IGJpb3NfY3RybDsJLyogMTIgQklPUyBjb250cm9sIGJpdHMgKi8KKwkvKiAgYml0IDAgIEJJT1MgZG9uJ3QgYWN0IGFzIGluaXRpYXRvci4gKi8KKwkvKiAgYml0IDEgIEJJT1MgPiAxIEdCIHN1cHBvcnQgKi8KKwkvKiAgYml0IDIgIEJJT1MgPiAyIERpc2sgU3VwcG9ydCAqLworCS8qICBiaXQgMyAgQklPUyBkb24ndCBzdXBwb3J0IHJlbW92YWJsZXMgKi8KKwkvKiAgYml0IDQgIEJJT1Mgc3VwcG9ydCBib290YWJsZSBDRCAqLworCS8qICBiaXQgNSAgQklPUyBzY2FuIGVuYWJsZWQgKi8KKwkvKiAgYml0IDYgIEJJT1Mgc3VwcG9ydCBtdWx0aXBsZSBMVU5zICovCisJLyogIGJpdCA3ICBCSU9TIGRpc3BsYXkgb2YgbWVzc2FnZSAqLworCS8qICBiaXQgOCAgU0NBTSBkaXNhYmxlZCAqLworCS8qICBiaXQgOSAgUmVzZXQgU0NTSSBidXMgZHVyaW5nIGluaXQuICovCisJLyogIGJpdCAxMCAqLworCS8qICBiaXQgMTEgTm8gdmVyYm9zZSBpbml0aWFsaXphdGlvbi4gKi8KKwkvKiAgYml0IDEyIFNDU0kgcGFyaXR5IGVuYWJsZWQgKi8KKwkvKiAgYml0IDEzICovCisJLyogIGJpdCAxNCAqLworCS8qICBiaXQgMTUgKi8KKwl1c2hvcnQgdWx0cmFfYWJsZTsJLyogMTMgVUxUUkEgc3BlZWQgYWJsZSAqLworCXVzaG9ydCByZXNlcnZlZDI7CS8qIDE0IHJlc2VydmVkICovCisJdWNoYXIgbWF4X2hvc3RfcW5nOwkvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWluZyAqLworCXVjaGFyIG1heF9kdmNfcW5nOwkvKiAgICBtYXhpbXVtIHBlciBkZXZpY2UgcXVldWluZyAqLworCXVzaG9ydCBkdmNfY250bDsJLyogMTYgY29udHJvbCBiaXQgZm9yIGRyaXZlciAqLworCXVzaG9ydCBidWdfZml4OwkJLyogMTcgY29udHJvbCBiaXQgZm9yIGJ1ZyBmaXggKi8KKwl1c2hvcnQgc2VyaWFsX251bWJlcl93b3JkMTsJLyogMTggQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDEgKi8KKwl1c2hvcnQgc2VyaWFsX251bWJlcl93b3JkMjsJLyogMTkgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDIgKi8KKwl1c2hvcnQgc2VyaWFsX251bWJlcl93b3JkMzsJLyogMjAgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDMgKi8KKwl1c2hvcnQgY2hlY2tfc3VtOwkvKiAyMSBFRVAgY2hlY2sgc3VtICovCisJdWNoYXIgb2VtX25hbWVbMTZdOwkvKiAyMiBPRU0gbmFtZSAqLworCXVzaG9ydCBkdmNfZXJyX2NvZGU7CS8qIDMwIGxhc3QgZGV2aWNlIGRyaXZlciBlcnJvciBjb2RlICovCisJdXNob3J0IGFkdl9lcnJfY29kZTsJLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCisJdXNob3J0IGFkdl9lcnJfYWRkcjsJLyogMzIgbGFzdCB1YyBlcnJvciBhZGRyZXNzICovCisJdXNob3J0IHNhdmVkX2R2Y19lcnJfY29kZTsJLyogMzMgc2F2ZWQgbGFzdCBkZXYuIGRyaXZlciBlcnJvciBjb2RlICAgKi8KKwl1c2hvcnQgc2F2ZWRfYWR2X2Vycl9jb2RlOwkvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKwl1c2hvcnQgc2F2ZWRfYWR2X2Vycl9hZGRyOwkvKiAzNSBzYXZlZCBsYXN0IHVjIGVycm9yIGFkZHJlc3MgICAgICAgICAqLworCXVzaG9ydCBudW1fb2ZfZXJyOwkvKiAzNiBudW1iZXIgb2YgZXJyb3IgKi8KIH0gQURWRUVQXzM1NTBfQ09ORklHOwogCi10eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzhDMDgwMF9jb25maWcKLXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCit0eXBlZGVmIHN0cnVjdCBhZHZlZXBfMzhDMDgwMF9jb25maWcgeworCS8qIFdvcmQgT2Zmc2V0LCBEZXNjcmlwdGlvbiAqLwogCi0gIHVzaG9ydCBjZmdfbHN3OyAgICAgICAgICAgICAgIC8qIDAwIHBvd2VyIHVwIGluaXRpYWxpemF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTMgc2V0IC0gTG9hZCBDSVMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLwotICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgICAgICAqLwotICB1c2hvcnQgZGlzY19lbmFibGU7ICAgICAgICAgICAvKiAwMiBkaXNjb25uZWN0IGVuYWJsZSAqLwotICB1c2hvcnQgd2R0cl9hYmxlOyAgICAgICAgICAgICAvKiAwMyBXaWRlIERUUiBhYmxlICovCi0gIHVzaG9ydCBzZHRyX3NwZWVkMTsgICAgICAgICAgIC8qIDA0IFNEVFIgU3BlZWQgVElEIDAtMyAqLwotICB1c2hvcnQgc3RhcnRfbW90b3I7ICAgICAgICAgICAvKiAwNSBzZW5kIHN0YXJ0IHVwIG1vdG9yICovCi0gIHVzaG9ydCB0YWdxbmdfYWJsZTsgICAgICAgICAgIC8qIDA2IHRhZyBxdWV1aW5nIGFibGUgKi8KLSAgdXNob3J0IGJpb3Nfc2NhbjsgICAgICAgICAgICAgLyogMDcgQklPUyBkZXZpY2UgY29udHJvbCAqLwotICB1c2hvcnQgc2NhbV90b2xlcmFudDsgICAgICAgICAvKiAwOCBubyBzY2FtICovCisJdXNob3J0IGNmZ19sc3c7CQkvKiAwMCBwb3dlciB1cCBpbml0aWFsaXphdGlvbiAqLworCS8qICBiaXQgMTMgc2V0IC0gTG9hZCBDSVMgKi8KKwkvKiAgYml0IDE0IHNldCAtIEJJT1MgRW5hYmxlICovCisJLyogIGJpdCAxNSBzZXQgLSBCaWcgRW5kaWFuIE1vZGUgKi8KKwl1c2hvcnQgY2ZnX21zdzsJCS8qIDAxIHVudXNlZCAgICAgICovCisJdXNob3J0IGRpc2NfZW5hYmxlOwkvKiAwMiBkaXNjb25uZWN0IGVuYWJsZSAqLworCXVzaG9ydCB3ZHRyX2FibGU7CS8qIDAzIFdpZGUgRFRSIGFibGUgKi8KKwl1c2hvcnQgc2R0cl9zcGVlZDE7CS8qIDA0IFNEVFIgU3BlZWQgVElEIDAtMyAqLworCXVzaG9ydCBzdGFydF9tb3RvcjsJLyogMDUgc2VuZCBzdGFydCB1cCBtb3RvciAqLworCXVzaG9ydCB0YWdxbmdfYWJsZTsJLyogMDYgdGFnIHF1ZXVpbmcgYWJsZSAqLworCXVzaG9ydCBiaW9zX3NjYW47CS8qIDA3IEJJT1MgZGV2aWNlIGNvbnRyb2wgKi8KKwl1c2hvcnQgc2NhbV90b2xlcmFudDsJLyogMDggbm8gc2NhbSAqLwogCi0gIHVjaGFyICBhZGFwdGVyX3Njc2lfaWQ7ICAgICAgIC8qIDA5IEhvc3QgQWRhcHRlciBJRCAqLwotICB1Y2hhciAgYmlvc19ib290X2RlbGF5OyAgICAgICAvKiAgICBwb3dlciB1cCB3YWl0ICovCisJdWNoYXIgYWRhcHRlcl9zY3NpX2lkOwkvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KKwl1Y2hhciBiaW9zX2Jvb3RfZGVsYXk7CS8qICAgIHBvd2VyIHVwIHdhaXQgKi8KIAotICB1Y2hhciAgc2NzaV9yZXNldF9kZWxheTsgICAgICAvKiAxMCByZXNldCBkZWxheSAqLwotICB1Y2hhciAgYmlvc19pZF9sdW47ICAgICAgICAgICAvKiAgICBmaXJzdCBib290IGRldmljZSBzY3NpIGlkICYgbHVuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGhpZ2ggbmliYmxlIGlzIGx1biAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBsb3cgbmliYmxlIGlzIHNjc2kgaWQgKi8KKwl1Y2hhciBzY3NpX3Jlc2V0X2RlbGF5OwkvKiAxMCByZXNldCBkZWxheSAqLworCXVjaGFyIGJpb3NfaWRfbHVuOwkvKiAgICBmaXJzdCBib290IGRldmljZSBzY3NpIGlkICYgbHVuICovCisJLyogICAgaGlnaCBuaWJibGUgaXMgbHVuICovCisJLyogICAgbG93IG5pYmJsZSBpcyBzY3NpIGlkICovCiAKLSAgdWNoYXIgIHRlcm1pbmF0aW9uX3NlOyAgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisJdWNoYXIgdGVybWluYXRpb25fc2U7CS8qIDExIDAgLSBhdXRvbWF0aWMgKi8KKwkvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCisJLyogICAgMiAtIGxvdyBvZmYgLyBoaWdoIG9uICovCisJLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCisJLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCiAKLSAgdWNoYXIgIHRlcm1pbmF0aW9uX2x2ZDsgICAgICAgLyogMTEgMCAtIGF1dG9tYXRpYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAxIC0gbG93IG9mZiAvIGhpZ2ggb2ZmICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgVGhlcmUgaXMgbm8gbG93IG9uICAvIGhpZ2ggb2ZmICovCisJdWNoYXIgdGVybWluYXRpb25fbHZkOwkvKiAxMSAwIC0gYXV0b21hdGljICovCisJLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworCS8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLworCS8qICAgIDMgLSBsb3cgb24gIC8gaGlnaCBvbiAqLworCS8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLwogCi0gIHVzaG9ydCBiaW9zX2N0cmw7ICAgICAgICAgICAgIC8qIDEyIEJJT1MgY29udHJvbCBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEgIEJJT1MgPiAxIEdCIHN1cHBvcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAyICBCSU9TID4gMiBEaXNrIFN1cHBvcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDQgIEJJT1Mgc3VwcG9ydCBib290YWJsZSBDRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDUgIEJJT1Mgc2NhbiBlbmFibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA3ICBCSU9TIGRpc3BsYXkgb2YgbWVzc2FnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDggIFNDQU0gZGlzYWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDExIE5vIHZlcmJvc2UgaW5pdGlhbGl6YXRpb24uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDEzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNSAqLwotICB1c2hvcnQgIHNkdHJfc3BlZWQyOyAgICAgICAgICAvKiAxMyBTRFRSIHNwZWVkIFRJRCA0LTcgKi8KLSAgdXNob3J0ICBzZHRyX3NwZWVkMzsgICAgICAgICAgLyogMTQgU0RUUiBzcGVlZCBUSUQgOC0xMSAqLwotICB1Y2hhciAgIG1heF9ob3N0X3FuZzsgICAgICAgICAvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWVpbmcgKi8KLSAgdWNoYXIgICBtYXhfZHZjX3FuZzsgICAgICAgICAgLyogICAgbWF4aW11bSBwZXIgZGV2aWNlIHF1ZXVpbmcgKi8KLSAgdXNob3J0ICBkdmNfY250bDsgICAgICAgICAgICAgLyogMTYgY29udHJvbCBiaXQgZm9yIGRyaXZlciAqLwotICB1c2hvcnQgIHNkdHJfc3BlZWQ0OyAgICAgICAgICAvKiAxNyBTRFRSIHNwZWVkIDQgVElEIDEyLTE1ICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMTsgIC8qIDE4IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAxICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMjsgIC8qIDE5IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAyICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMzsgIC8qIDIwIEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAzICovCi0gIHVzaG9ydCAgY2hlY2tfc3VtOyAgICAgICAgICAgIC8qIDIxIEVFUCBjaGVjayBzdW0gKi8KLSAgdWNoYXIgICBvZW1fbmFtZVsxNl07ICAgICAgICAgLyogMjIgT0VNIG5hbWUgKi8KLSAgdXNob3J0ICBkdmNfZXJyX2NvZGU7ICAgICAgICAgLyogMzAgbGFzdCBkZXZpY2UgZHJpdmVyIGVycm9yIGNvZGUgKi8KLSAgdXNob3J0ICBhZHZfZXJyX2NvZGU7ICAgICAgICAgLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCi0gIHVzaG9ydCAgYWR2X2Vycl9hZGRyOyAgICAgICAgIC8qIDMyIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAqLwotICB1c2hvcnQgIHNhdmVkX2R2Y19lcnJfY29kZTsgICAvKiAzMyBzYXZlZCBsYXN0IGRldi4gZHJpdmVyIGVycm9yIGNvZGUgICAqLwotICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfY29kZTsgICAvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KLSAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2FkZHI7ICAgLyogMzUgc2F2ZWQgbGFzdCB1YyBlcnJvciBhZGRyZXNzICAgICAgICAgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM2OyAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM3OyAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM4OyAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM5OyAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQwOyAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQxOyAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQyOyAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQzOyAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ0OyAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ1OyAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ2OyAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ3OyAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ4OyAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ5OyAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUwOyAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUxOyAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUyOyAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUzOyAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDU0OyAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDU1OyAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICBjaXNwdHJfbHN3OyAgICAgICAgICAgLyogNTYgQ0lTIFBUUiBMU1cgKi8KLSAgdXNob3J0ICBjaXNwcnRfbXN3OyAgICAgICAgICAgLyogNTcgQ0lTIFBUUiBNU1cgKi8KLSAgdXNob3J0ICBzdWJzeXN2aWQ7ICAgICAgICAgICAgLyogNTggU3ViU3lzdGVtIFZlbmRvciBJRCAqLwotICB1c2hvcnQgIHN1YnN5c2lkOyAgICAgICAgICAgICAvKiA1OSBTdWJTeXN0ZW0gSUQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYwOyAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYxOyAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYyOyAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYzOyAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KKwl1c2hvcnQgYmlvc19jdHJsOwkvKiAxMiBCSU9TIGNvbnRyb2wgYml0cyAqLworCS8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLworCS8qICBiaXQgMSAgQklPUyA+IDEgR0Igc3VwcG9ydCAqLworCS8qICBiaXQgMiAgQklPUyA+IDIgRGlzayBTdXBwb3J0ICovCisJLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLworCS8qICBiaXQgNCAgQklPUyBzdXBwb3J0IGJvb3RhYmxlIENEICovCisJLyogIGJpdCA1ICBCSU9TIHNjYW4gZW5hYmxlZCAqLworCS8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KKwkvKiAgYml0IDcgIEJJT1MgZGlzcGxheSBvZiBtZXNzYWdlICovCisJLyogIGJpdCA4ICBTQ0FNIGRpc2FibGVkICovCisJLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KKwkvKiAgYml0IDEwICovCisJLyogIGJpdCAxMSBObyB2ZXJib3NlIGluaXRpYWxpemF0aW9uLiAqLworCS8qICBiaXQgMTIgU0NTSSBwYXJpdHkgZW5hYmxlZCAqLworCS8qICBiaXQgMTMgKi8KKwkvKiAgYml0IDE0ICovCisJLyogIGJpdCAxNSAqLworCXVzaG9ydCBzZHRyX3NwZWVkMjsJLyogMTMgU0RUUiBzcGVlZCBUSUQgNC03ICovCisJdXNob3J0IHNkdHJfc3BlZWQzOwkvKiAxNCBTRFRSIHNwZWVkIFRJRCA4LTExICovCisJdWNoYXIgbWF4X2hvc3RfcW5nOwkvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWVpbmcgKi8KKwl1Y2hhciBtYXhfZHZjX3FuZzsJLyogICAgbWF4aW11bSBwZXIgZGV2aWNlIHF1ZXVpbmcgKi8KKwl1c2hvcnQgZHZjX2NudGw7CS8qIDE2IGNvbnRyb2wgYml0IGZvciBkcml2ZXIgKi8KKwl1c2hvcnQgc2R0cl9zcGVlZDQ7CS8qIDE3IFNEVFIgc3BlZWQgNCBUSUQgMTItMTUgKi8KKwl1c2hvcnQgc2VyaWFsX251bWJlcl93b3JkMTsJLyogMTggQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDEgKi8KKwl1c2hvcnQgc2VyaWFsX251bWJlcl93b3JkMjsJLyogMTkgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDIgKi8KKwl1c2hvcnQgc2VyaWFsX251bWJlcl93b3JkMzsJLyogMjAgQm9hcmQgc2VyaWFsIG51bWJlciB3b3JkIDMgKi8KKwl1c2hvcnQgY2hlY2tfc3VtOwkvKiAyMSBFRVAgY2hlY2sgc3VtICovCisJdWNoYXIgb2VtX25hbWVbMTZdOwkvKiAyMiBPRU0gbmFtZSAqLworCXVzaG9ydCBkdmNfZXJyX2NvZGU7CS8qIDMwIGxhc3QgZGV2aWNlIGRyaXZlciBlcnJvciBjb2RlICovCisJdXNob3J0IGFkdl9lcnJfY29kZTsJLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCisJdXNob3J0IGFkdl9lcnJfYWRkcjsJLyogMzIgbGFzdCB1YyBlcnJvciBhZGRyZXNzICovCisJdXNob3J0IHNhdmVkX2R2Y19lcnJfY29kZTsJLyogMzMgc2F2ZWQgbGFzdCBkZXYuIGRyaXZlciBlcnJvciBjb2RlICAgKi8KKwl1c2hvcnQgc2F2ZWRfYWR2X2Vycl9jb2RlOwkvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKwl1c2hvcnQgc2F2ZWRfYWR2X2Vycl9hZGRyOwkvKiAzNSBzYXZlZCBsYXN0IHVjIGVycm9yIGFkZHJlc3MgICAgICAgICAqLworCXVzaG9ydCByZXNlcnZlZDM2OwkvKiAzNiByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDM3OwkvKiAzNyByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDM4OwkvKiAzOCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDM5OwkvKiAzOSByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQwOwkvKiA0MCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQxOwkvKiA0MSByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQyOwkvKiA0MiByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQzOwkvKiA0MyByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQ0OwkvKiA0NCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQ1OwkvKiA0NSByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQ2OwkvKiA0NiByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQ3OwkvKiA0NyByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQ4OwkvKiA0OCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDQ5OwkvKiA0OSByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDUwOwkvKiA1MCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDUxOwkvKiA1MSByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDUyOwkvKiA1MiByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDUzOwkvKiA1MyByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDU0OwkvKiA1NCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDU1OwkvKiA1NSByZXNlcnZlZCAqLworCXVzaG9ydCBjaXNwdHJfbHN3OwkvKiA1NiBDSVMgUFRSIExTVyAqLworCXVzaG9ydCBjaXNwcnRfbXN3OwkvKiA1NyBDSVMgUFRSIE1TVyAqLworCXVzaG9ydCBzdWJzeXN2aWQ7CS8qIDU4IFN1YlN5c3RlbSBWZW5kb3IgSUQgKi8KKwl1c2hvcnQgc3Vic3lzaWQ7CS8qIDU5IFN1YlN5c3RlbSBJRCAqLworCXVzaG9ydCByZXNlcnZlZDYwOwkvKiA2MCByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDYxOwkvKiA2MSByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDYyOwkvKiA2MiByZXNlcnZlZCAqLworCXVzaG9ydCByZXNlcnZlZDYzOwkvKiA2MyByZXNlcnZlZCAqLwogfSBBRFZFRVBfMzhDMDgwMF9DT05GSUc7CiAKLXR5cGVkZWYgc3RydWN0IGFkdmVlcF8zOEMxNjAwX2NvbmZpZwotewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXb3JkIE9mZnNldCwgRGVzY3JpcHRpb24gKi8KK3R5cGVkZWYgc3RydWN0IGFkdmVlcF8zOEMxNjAwX2NvbmZpZyB7CisJLyogV29yZCBPZmZzZXQsIERlc2NyaXB0aW9uICovCiAKLSAgdXNob3J0IGNmZ19sc3c7ICAgICAgICAgICAgICAgLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMSBzZXQgLSBGdW5jLiAwIElOVEIsIEZ1bmMuIDEgSU5UQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBjbGVhciAtIEZ1bmMuIDAgSU5UQSwgRnVuYy4gMSBJTlRCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTMgc2V0IC0gTG9hZCBDSVMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNCBzZXQgLSBCSU9TIEVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDE1IHNldCAtIEJpZyBFbmRpYW4gTW9kZSAqLwotICB1c2hvcnQgY2ZnX21zdzsgICAgICAgICAgICAgICAvKiAwMSB1bnVzZWQgKi8KLSAgdXNob3J0IGRpc2NfZW5hYmxlOyAgICAgICAgICAgLyogMDIgZGlzY29ubmVjdCBlbmFibGUgKi8KLSAgdXNob3J0IHdkdHJfYWJsZTsgICAgICAgICAgICAgLyogMDMgV2lkZSBEVFIgYWJsZSAqLwotICB1c2hvcnQgc2R0cl9zcGVlZDE7ICAgICAgICAgICAvKiAwNCBTRFRSIFNwZWVkIFRJRCAwLTMgKi8KLSAgdXNob3J0IHN0YXJ0X21vdG9yOyAgICAgICAgICAgLyogMDUgc2VuZCBzdGFydCB1cCBtb3RvciAqLwotICB1c2hvcnQgdGFncW5nX2FibGU7ICAgICAgICAgICAvKiAwNiB0YWcgcXVldWluZyBhYmxlICovCi0gIHVzaG9ydCBiaW9zX3NjYW47ICAgICAgICAgICAgIC8qIDA3IEJJT1MgZGV2aWNlIGNvbnRyb2wgKi8KLSAgdXNob3J0IHNjYW1fdG9sZXJhbnQ7ICAgICAgICAgLyogMDggbm8gc2NhbSAqLworCXVzaG9ydCBjZmdfbHN3OwkJLyogMDAgcG93ZXIgdXAgaW5pdGlhbGl6YXRpb24gKi8KKwkvKiAgYml0IDExIHNldCAtIEZ1bmMuIDAgSU5UQiwgRnVuYy4gMSBJTlRBICovCisJLyogICAgICAgY2xlYXIgLSBGdW5jLiAwIElOVEEsIEZ1bmMuIDEgSU5UQiAqLworCS8qICBiaXQgMTMgc2V0IC0gTG9hZCBDSVMgKi8KKwkvKiAgYml0IDE0IHNldCAtIEJJT1MgRW5hYmxlICovCisJLyogIGJpdCAxNSBzZXQgLSBCaWcgRW5kaWFuIE1vZGUgKi8KKwl1c2hvcnQgY2ZnX21zdzsJCS8qIDAxIHVudXNlZCAqLworCXVzaG9ydCBkaXNjX2VuYWJsZTsJLyogMDIgZGlzY29ubmVjdCBlbmFibGUgKi8KKwl1c2hvcnQgd2R0cl9hYmxlOwkvKiAwMyBXaWRlIERUUiBhYmxlICovCisJdXNob3J0IHNkdHJfc3BlZWQxOwkvKiAwNCBTRFRSIFNwZWVkIFRJRCAwLTMgKi8KKwl1c2hvcnQgc3RhcnRfbW90b3I7CS8qIDA1IHNlbmQgc3RhcnQgdXAgbW90b3IgKi8KKwl1c2hvcnQgdGFncW5nX2FibGU7CS8qIDA2IHRhZyBxdWV1aW5nIGFibGUgKi8KKwl1c2hvcnQgYmlvc19zY2FuOwkvKiAwNyBCSU9TIGRldmljZSBjb250cm9sICovCisJdXNob3J0IHNjYW1fdG9sZXJhbnQ7CS8qIDA4IG5vIHNjYW0gKi8KIAotICB1Y2hhciAgYWRhcHRlcl9zY3NpX2lkOyAgICAgICAvKiAwOSBIb3N0IEFkYXB0ZXIgSUQgKi8KLSAgdWNoYXIgIGJpb3NfYm9vdF9kZWxheTsgICAgICAgLyogICAgcG93ZXIgdXAgd2FpdCAqLworCXVjaGFyIGFkYXB0ZXJfc2NzaV9pZDsJLyogMDkgSG9zdCBBZGFwdGVyIElEICovCisJdWNoYXIgYmlvc19ib290X2RlbGF5OwkvKiAgICBwb3dlciB1cCB3YWl0ICovCiAKLSAgdWNoYXIgIHNjc2lfcmVzZXRfZGVsYXk7ICAgICAgLyogMTAgcmVzZXQgZGVsYXkgKi8KLSAgdWNoYXIgIGJpb3NfaWRfbHVuOyAgICAgICAgICAgLyogICAgZmlyc3QgYm9vdCBkZXZpY2Ugc2NzaSBpZCAmIGx1biAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBoaWdoIG5pYmJsZSBpcyBsdW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgbG93IG5pYmJsZSBpcyBzY3NpIGlkICovCisJdWNoYXIgc2NzaV9yZXNldF9kZWxheTsJLyogMTAgcmVzZXQgZGVsYXkgKi8KKwl1Y2hhciBiaW9zX2lkX2x1bjsJLyogICAgZmlyc3QgYm9vdCBkZXZpY2Ugc2NzaSBpZCAmIGx1biAqLworCS8qICAgIGhpZ2ggbmliYmxlIGlzIGx1biAqLworCS8qICAgIGxvdyBuaWJibGUgaXMgc2NzaSBpZCAqLwogCi0gIHVjaGFyICB0ZXJtaW5hdGlvbl9zZTsgICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCXVjaGFyIHRlcm1pbmF0aW9uX3NlOwkvKiAxMSAwIC0gYXV0b21hdGljICovCisJLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLworCS8qICAgIDIgLSBsb3cgb2ZmIC8gaGlnaCBvbiAqLworCS8qICAgIDMgLSBsb3cgb24gIC8gaGlnaCBvbiAqLworCS8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLwogCi0gIHVjaGFyICB0ZXJtaW5hdGlvbl9sdmQ7ICAgICAgIC8qIDExIDAgLSBhdXRvbWF0aWMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMSAtIGxvdyBvZmYgLyBoaWdoIG9mZiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMyAtIGxvdyBvbiAgLyBoaWdoIG9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIFRoZXJlIGlzIG5vIGxvdyBvbiAgLyBoaWdoIG9mZiAqLworCXVjaGFyIHRlcm1pbmF0aW9uX2x2ZDsJLyogMTEgMCAtIGF1dG9tYXRpYyAqLworCS8qICAgIDEgLSBsb3cgb2ZmIC8gaGlnaCBvZmYgKi8KKwkvKiAgICAyIC0gbG93IG9mZiAvIGhpZ2ggb24gKi8KKwkvKiAgICAzIC0gbG93IG9uICAvIGhpZ2ggb24gKi8KKwkvKiAgICBUaGVyZSBpcyBubyBsb3cgb24gIC8gaGlnaCBvZmYgKi8KIAotICB1c2hvcnQgYmlvc19jdHJsOyAgICAgICAgICAgICAvKiAxMiBCSU9TIGNvbnRyb2wgYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDAgIEJJT1MgZG9uJ3QgYWN0IGFzIGluaXRpYXRvci4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxICBCSU9TID4gMSBHQiBzdXBwb3J0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMiAgQklPUyA+IDIgRGlzayBTdXBwb3J0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMyAgQklPUyBkb24ndCBzdXBwb3J0IHJlbW92YWJsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA0ICBCSU9TIHN1cHBvcnQgYm9vdGFibGUgQ0QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA1ICBCSU9TIHNjYW4gZW5hYmxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYml0IDYgIEJJT1Mgc3VwcG9ydCBtdWx0aXBsZSBMVU5zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgNyAgQklPUyBkaXNwbGF5IG9mIG1lc3NhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCA4ICBTQ0FNIGRpc2FibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgOSAgUmVzZXQgU0NTSSBidXMgZHVyaW5nIGluaXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTAgQmFzaWMgSW50ZWdyaXR5IENoZWNraW5nIGRpc2FibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTEgTm8gdmVyYm9zZSBpbml0aWFsaXphdGlvbi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxMiBTQ1NJIHBhcml0eSBlbmFibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTMgQUlQUCAoQXN5bi4gSW5mby4gUGguIFByb3QuKSBkaXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBiaXQgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGJpdCAxNSAqLwotICB1c2hvcnQgIHNkdHJfc3BlZWQyOyAgICAgICAgICAvKiAxMyBTRFRSIHNwZWVkIFRJRCA0LTcgKi8KLSAgdXNob3J0ICBzZHRyX3NwZWVkMzsgICAgICAgICAgLyogMTQgU0RUUiBzcGVlZCBUSUQgOC0xMSAqLwotICB1Y2hhciAgIG1heF9ob3N0X3FuZzsgICAgICAgICAvKiAxNSBtYXhpbXVtIGhvc3QgcXVldWVpbmcgKi8KLSAgdWNoYXIgICBtYXhfZHZjX3FuZzsgICAgICAgICAgLyogICAgbWF4aW11bSBwZXIgZGV2aWNlIHF1ZXVpbmcgKi8KLSAgdXNob3J0ICBkdmNfY250bDsgICAgICAgICAgICAgLyogMTYgY29udHJvbCBiaXQgZm9yIGRyaXZlciAqLwotICB1c2hvcnQgIHNkdHJfc3BlZWQ0OyAgICAgICAgICAvKiAxNyBTRFRSIHNwZWVkIDQgVElEIDEyLTE1ICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMTsgIC8qIDE4IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAxICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMjsgIC8qIDE5IEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAyICovCi0gIHVzaG9ydCAgc2VyaWFsX251bWJlcl93b3JkMzsgIC8qIDIwIEJvYXJkIHNlcmlhbCBudW1iZXIgd29yZCAzICovCi0gIHVzaG9ydCAgY2hlY2tfc3VtOyAgICAgICAgICAgIC8qIDIxIEVFUCBjaGVjayBzdW0gKi8KLSAgdWNoYXIgICBvZW1fbmFtZVsxNl07ICAgICAgICAgLyogMjIgT0VNIG5hbWUgKi8KLSAgdXNob3J0ICBkdmNfZXJyX2NvZGU7ICAgICAgICAgLyogMzAgbGFzdCBkZXZpY2UgZHJpdmVyIGVycm9yIGNvZGUgKi8KLSAgdXNob3J0ICBhZHZfZXJyX2NvZGU7ICAgICAgICAgLyogMzEgbGFzdCB1YyBhbmQgQWR2IExpYiBlcnJvciBjb2RlICovCi0gIHVzaG9ydCAgYWR2X2Vycl9hZGRyOyAgICAgICAgIC8qIDMyIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAqLwotICB1c2hvcnQgIHNhdmVkX2R2Y19lcnJfY29kZTsgICAvKiAzMyBzYXZlZCBsYXN0IGRldi4gZHJpdmVyIGVycm9yIGNvZGUgICAqLwotICB1c2hvcnQgIHNhdmVkX2Fkdl9lcnJfY29kZTsgICAvKiAzNCBzYXZlZCBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KLSAgdXNob3J0ICBzYXZlZF9hZHZfZXJyX2FkZHI7ICAgLyogMzUgc2F2ZWQgbGFzdCB1YyBlcnJvciBhZGRyZXNzICAgICAgICAgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM2OyAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM3OyAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM4OyAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDM5OyAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQwOyAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQxOyAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQyOyAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQzOyAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ0OyAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ1OyAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ2OyAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ3OyAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ4OyAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDQ5OyAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUwOyAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUxOyAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUyOyAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDUzOyAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDU0OyAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDU1OyAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICBjaXNwdHJfbHN3OyAgICAgICAgICAgLyogNTYgQ0lTIFBUUiBMU1cgKi8KLSAgdXNob3J0ICBjaXNwcnRfbXN3OyAgICAgICAgICAgLyogNTcgQ0lTIFBUUiBNU1cgKi8KLSAgdXNob3J0ICBzdWJzeXN2aWQ7ICAgICAgICAgICAgLyogNTggU3ViU3lzdGVtIFZlbmRvciBJRCAqLwotICB1c2hvcnQgIHN1YnN5c2lkOyAgICAgICAgICAgICAvKiA1OSBTdWJTeXN0ZW0gSUQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYwOyAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYxOyAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYyOyAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KLSAgdXNob3J0ICByZXNlcnZlZDYzOyAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KKwl1c2hvcnQgYmlvc19jdHJsOwkvKiAxMiBCSU9TIGNvbnRyb2wgYml0cyAqLworCS8qICBiaXQgMCAgQklPUyBkb24ndCBhY3QgYXMgaW5pdGlhdG9yLiAqLworCS8qICBiaXQgMSAgQklPUyA+IDEgR0Igc3VwcG9ydCAqLworCS8qICBiaXQgMiAgQklPUyA+IDIgRGlzayBTdXBwb3J0ICovCisJLyogIGJpdCAzICBCSU9TIGRvbid0IHN1cHBvcnQgcmVtb3ZhYmxlcyAqLworCS8qICBiaXQgNCAgQklPUyBzdXBwb3J0IGJvb3RhYmxlIENEICovCisJLyogIGJpdCA1ICBCSU9TIHNjYW4gZW5hYmxlZCAqLworCS8qICBiaXQgNiAgQklPUyBzdXBwb3J0IG11bHRpcGxlIExVTnMgKi8KKwkvKiAgYml0IDcgIEJJT1MgZGlzcGxheSBvZiBtZXNzYWdlICovCisJLyogIGJpdCA4ICBTQ0FNIGRpc2FibGVkICovCisJLyogIGJpdCA5ICBSZXNldCBTQ1NJIGJ1cyBkdXJpbmcgaW5pdC4gKi8KKwkvKiAgYml0IDEwIEJhc2ljIEludGVncml0eSBDaGVja2luZyBkaXNhYmxlZCAqLworCS8qICBiaXQgMTEgTm8gdmVyYm9zZSBpbml0aWFsaXphdGlvbi4gKi8KKwkvKiAgYml0IDEyIFNDU0kgcGFyaXR5IGVuYWJsZWQgKi8KKwkvKiAgYml0IDEzIEFJUFAgKEFzeW4uIEluZm8uIFBoLiBQcm90LikgZGlzLiAqLworCS8qICBiaXQgMTQgKi8KKwkvKiAgYml0IDE1ICovCisJdXNob3J0IHNkdHJfc3BlZWQyOwkvKiAxMyBTRFRSIHNwZWVkIFRJRCA0LTcgKi8KKwl1c2hvcnQgc2R0cl9zcGVlZDM7CS8qIDE0IFNEVFIgc3BlZWQgVElEIDgtMTEgKi8KKwl1Y2hhciBtYXhfaG9zdF9xbmc7CS8qIDE1IG1heGltdW0gaG9zdCBxdWV1ZWluZyAqLworCXVjaGFyIG1heF9kdmNfcW5nOwkvKiAgICBtYXhpbXVtIHBlciBkZXZpY2UgcXVldWluZyAqLworCXVzaG9ydCBkdmNfY250bDsJLyogMTYgY29udHJvbCBiaXQgZm9yIGRyaXZlciAqLworCXVzaG9ydCBzZHRyX3NwZWVkNDsJLyogMTcgU0RUUiBzcGVlZCA0IFRJRCAxMi0xNSAqLworCXVzaG9ydCBzZXJpYWxfbnVtYmVyX3dvcmQxOwkvKiAxOCBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMSAqLworCXVzaG9ydCBzZXJpYWxfbnVtYmVyX3dvcmQyOwkvKiAxOSBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMiAqLworCXVzaG9ydCBzZXJpYWxfbnVtYmVyX3dvcmQzOwkvKiAyMCBCb2FyZCBzZXJpYWwgbnVtYmVyIHdvcmQgMyAqLworCXVzaG9ydCBjaGVja19zdW07CS8qIDIxIEVFUCBjaGVjayBzdW0gKi8KKwl1Y2hhciBvZW1fbmFtZVsxNl07CS8qIDIyIE9FTSBuYW1lICovCisJdXNob3J0IGR2Y19lcnJfY29kZTsJLyogMzAgbGFzdCBkZXZpY2UgZHJpdmVyIGVycm9yIGNvZGUgKi8KKwl1c2hvcnQgYWR2X2Vycl9jb2RlOwkvKiAzMSBsYXN0IHVjIGFuZCBBZHYgTGliIGVycm9yIGNvZGUgKi8KKwl1c2hvcnQgYWR2X2Vycl9hZGRyOwkvKiAzMiBsYXN0IHVjIGVycm9yIGFkZHJlc3MgKi8KKwl1c2hvcnQgc2F2ZWRfZHZjX2Vycl9jb2RlOwkvKiAzMyBzYXZlZCBsYXN0IGRldi4gZHJpdmVyIGVycm9yIGNvZGUgICAqLworCXVzaG9ydCBzYXZlZF9hZHZfZXJyX2NvZGU7CS8qIDM0IHNhdmVkIGxhc3QgdWMgYW5kIEFkdiBMaWIgZXJyb3IgY29kZSAqLworCXVzaG9ydCBzYXZlZF9hZHZfZXJyX2FkZHI7CS8qIDM1IHNhdmVkIGxhc3QgdWMgZXJyb3IgYWRkcmVzcyAgICAgICAgICovCisJdXNob3J0IHJlc2VydmVkMzY7CS8qIDM2IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkMzc7CS8qIDM3IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkMzg7CS8qIDM4IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkMzk7CS8qIDM5IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDA7CS8qIDQwIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDE7CS8qIDQxIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDI7CS8qIDQyIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDM7CS8qIDQzIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDQ7CS8qIDQ0IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDU7CS8qIDQ1IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDY7CS8qIDQ2IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDc7CS8qIDQ3IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDg7CS8qIDQ4IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNDk7CS8qIDQ5IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNTA7CS8qIDUwIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNTE7CS8qIDUxIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNTI7CS8qIDUyIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNTM7CS8qIDUzIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNTQ7CS8qIDU0IHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNTU7CS8qIDU1IHJlc2VydmVkICovCisJdXNob3J0IGNpc3B0cl9sc3c7CS8qIDU2IENJUyBQVFIgTFNXICovCisJdXNob3J0IGNpc3BydF9tc3c7CS8qIDU3IENJUyBQVFIgTVNXICovCisJdXNob3J0IHN1YnN5c3ZpZDsJLyogNTggU3ViU3lzdGVtIFZlbmRvciBJRCAqLworCXVzaG9ydCBzdWJzeXNpZDsJLyogNTkgU3ViU3lzdGVtIElEICovCisJdXNob3J0IHJlc2VydmVkNjA7CS8qIDYwIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNjE7CS8qIDYxIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNjI7CS8qIDYyIHJlc2VydmVkICovCisJdXNob3J0IHJlc2VydmVkNjM7CS8qIDYzIHJlc2VydmVkICovCiB9IEFEVkVFUF8zOEMxNjAwX0NPTkZJRzsKIAogLyoKQEAgLTI0MjcsMTEgKzI0MDQsMTEgQEAKICNkZWZpbmUgQklPU19DVFJMX1NDU0lfUEFSSVRZICAgICAgICAweDEwMDAKICNkZWZpbmUgQklPU19DVFJMX0FJUFBfRElTICAgICAgICAgICAweDIwMDAKIAotI2RlZmluZSBBRFZfMzU1MF9NRU1TSVpFICAgMHgyMDAwICAgICAgIC8qIDggS0IgSW50ZXJuYWwgTWVtb3J5ICovCi0jZGVmaW5lIEFEVl8zNTUwX0lPTEVOICAgICAweDQwICAgICAgICAgLyogSS9PIFBvcnQgUmFuZ2UgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgQURWXzM1NTBfTUVNU0laRSAgIDB4MjAwMAkvKiA4IEtCIEludGVybmFsIE1lbW9yeSAqLworI2RlZmluZSBBRFZfMzU1MF9JT0xFTiAgICAgMHg0MAkvKiBJL08gUG9ydCBSYW5nZSBpbiBieXRlcyAqLwogCi0jZGVmaW5lIEFEVl8zOEMwODAwX01FTVNJWkUgIDB4NDAwMCAgICAgLyogMTYgS0IgSW50ZXJuYWwgTWVtb3J5ICovCi0jZGVmaW5lIEFEVl8zOEMwODAwX0lPTEVOICAgIDB4MTAwICAgICAgLyogSS9PIFBvcnQgUmFuZ2UgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgQURWXzM4QzA4MDBfTUVNU0laRSAgMHg0MDAwCS8qIDE2IEtCIEludGVybmFsIE1lbW9yeSAqLworI2RlZmluZSBBRFZfMzhDMDgwMF9JT0xFTiAgICAweDEwMAkvKiBJL08gUG9ydCBSYW5nZSBpbiBieXRlcyAqLwogCiAvKgogICogWFhYIC0gU2luY2UgQVNDMzhDMTYwMCBSZXYuMyBoYXMgYSBsb2NhbCBSQU0gZmFpbHVyZSBpc3N1ZSwgdGhlcmUgaXMKQEAgLTI0NDAsOSArMjQxNyw5IEBACiAgKgogICogI2RlZmluZSBBRFZfMzhDMTYwMF9NRU1TSVpFICAweDgwMDBMICAgKiAzMiBLQiBJbnRlcm5hbCBNZW1vcnkgKgogICovCi0jZGVmaW5lIEFEVl8zOEMxNjAwX01FTVNJWkUgIDB4NDAwMCAgIC8qIDE2IEtCIEludGVybmFsIE1lbW9yeSAqLwotI2RlZmluZSBBRFZfMzhDMTYwMF9JT0xFTiAgICAweDEwMCAgICAgLyogSS9PIFBvcnQgUmFuZ2UgMjU2IGJ5dGVzICovCi0jZGVmaW5lIEFEVl8zOEMxNjAwX01FTUxFTiAgIDB4MTAwMCAgICAvKiBNZW1vcnkgUmFuZ2UgNEtCIGJ5dGVzICovCisjZGVmaW5lIEFEVl8zOEMxNjAwX01FTVNJWkUgIDB4NDAwMAkvKiAxNiBLQiBJbnRlcm5hbCBNZW1vcnkgKi8KKyNkZWZpbmUgQURWXzM4QzE2MDBfSU9MRU4gICAgMHgxMDAJLyogSS9PIFBvcnQgUmFuZ2UgMjU2IGJ5dGVzICovCisjZGVmaW5lIEFEVl8zOEMxNjAwX01FTUxFTiAgIDB4MTAwMAkvKiBNZW1vcnkgUmFuZ2UgNEtCIGJ5dGVzICovCiAKIC8qCiAgKiBCeXRlIEkvTyByZWdpc3RlciBhZGRyZXNzIGZyb20gYmFzZSBvZiAnaW9wX2Jhc2UnLgpAQCAtMjUxNSwzOSArMjQ5MiwzOSBAQAogLyoKICAqIFdvcmQgSS9PIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBiYXNlIG9mICdpb3BfYmFzZScuCiAgKi8KLSNkZWZpbmUgSU9QV19DSElQX0lEXzAgICAgICAgICAgMHgwMCAgLyogQ0lEMCAgKi8KLSNkZWZpbmUgSU9QV19DVFJMX1JFRyAgICAgICAgICAgMHgwMiAgLyogQ0MgICAgKi8KLSNkZWZpbmUgSU9QV19SQU1fQUREUiAgICAgICAgICAgMHgwNCAgLyogTEEgICAgKi8KLSNkZWZpbmUgSU9QV19SQU1fREFUQSAgICAgICAgICAgMHgwNiAgLyogTEQgICAgKi8KKyNkZWZpbmUgSU9QV19DSElQX0lEXzAgICAgICAgICAgMHgwMAkvKiBDSUQwICAqLworI2RlZmluZSBJT1BXX0NUUkxfUkVHICAgICAgICAgICAweDAyCS8qIENDICAgICovCisjZGVmaW5lIElPUFdfUkFNX0FERFIgICAgICAgICAgIDB4MDQJLyogTEEgICAgKi8KKyNkZWZpbmUgSU9QV19SQU1fREFUQSAgICAgICAgICAgMHgwNgkvKiBMRCAgICAqLwogI2RlZmluZSBJT1BXX1JFU19BRERSXzA4ICAgICAgICAweDA4Ci0jZGVmaW5lIElPUFdfUklTQ19DU1IgICAgICAgICAgIDB4MEEgIC8qIENTUiAgICovCi0jZGVmaW5lIElPUFdfU0NTSV9DRkcwICAgICAgICAgIDB4MEMgIC8qIENGRzAgICovCi0jZGVmaW5lIElPUFdfU0NTSV9DRkcxICAgICAgICAgIDB4MEUgIC8qIENGRzEgICovCisjZGVmaW5lIElPUFdfUklTQ19DU1IgICAgICAgICAgIDB4MEEJLyogQ1NSICAgKi8KKyNkZWZpbmUgSU9QV19TQ1NJX0NGRzAgICAgICAgICAgMHgwQwkvKiBDRkcwICAqLworI2RlZmluZSBJT1BXX1NDU0lfQ0ZHMSAgICAgICAgICAweDBFCS8qIENGRzEgICovCiAjZGVmaW5lIElPUFdfUkVTX0FERFJfMTAgICAgICAgIDB4MTAKLSNkZWZpbmUgSU9QV19TRUxfTUFTSyAgICAgICAgICAgMHgxMiAgLyogU00gICAgKi8KKyNkZWZpbmUgSU9QV19TRUxfTUFTSyAgICAgICAgICAgMHgxMgkvKiBTTSAgICAqLwogI2RlZmluZSBJT1BXX1JFU19BRERSXzE0ICAgICAgICAweDE0Ci0jZGVmaW5lIElPUFdfRkxBU0hfQUREUiAgICAgICAgIDB4MTYgIC8qIEZBICAgICovCisjZGVmaW5lIElPUFdfRkxBU0hfQUREUiAgICAgICAgIDB4MTYJLyogRkEgICAgKi8KICNkZWZpbmUgSU9QV19SRVNfQUREUl8xOCAgICAgICAgMHgxOAotI2RlZmluZSBJT1BXX0VFX0NNRCAgICAgICAgICAgICAweDFBICAvKiBFQyAgICAqLwotI2RlZmluZSBJT1BXX0VFX0RBVEEgICAgICAgICAgICAweDFDICAvKiBFRCAgICAqLwotI2RlZmluZSBJT1BXX1NGSUZPX0NOVCAgICAgICAgICAweDFFICAvKiBTRkMgICAqLworI2RlZmluZSBJT1BXX0VFX0NNRCAgICAgICAgICAgICAweDFBCS8qIEVDICAgICovCisjZGVmaW5lIElPUFdfRUVfREFUQSAgICAgICAgICAgIDB4MUMJLyogRUQgICAgKi8KKyNkZWZpbmUgSU9QV19TRklGT19DTlQgICAgICAgICAgMHgxRQkvKiBTRkMgICAqLwogI2RlZmluZSBJT1BXX1JFU19BRERSXzIwICAgICAgICAweDIwCi0jZGVmaW5lIElPUFdfUV9CQVNFICAgICAgICAgICAgIDB4MjIgIC8qIFFCICAgICovCi0jZGVmaW5lIElPUFdfUVAgICAgICAgICAgICAgICAgIDB4MjQgIC8qIFFQICAgICovCi0jZGVmaW5lIElPUFdfSVggICAgICAgICAgICAgICAgIDB4MjYgIC8qIElYICAgICovCi0jZGVmaW5lIElPUFdfU1AgICAgICAgICAgICAgICAgIDB4MjggIC8qIFNQICAgICovCi0jZGVmaW5lIElPUFdfUEMgICAgICAgICAgICAgICAgIDB4MkEgIC8qIFBDICAgICovCisjZGVmaW5lIElPUFdfUV9CQVNFICAgICAgICAgICAgIDB4MjIJLyogUUIgICAgKi8KKyNkZWZpbmUgSU9QV19RUCAgICAgICAgICAgICAgICAgMHgyNAkvKiBRUCAgICAqLworI2RlZmluZSBJT1BXX0lYICAgICAgICAgICAgICAgICAweDI2CS8qIElYICAgICovCisjZGVmaW5lIElPUFdfU1AgICAgICAgICAgICAgICAgIDB4MjgJLyogU1AgICAgKi8KKyNkZWZpbmUgSU9QV19QQyAgICAgICAgICAgICAgICAgMHgyQQkvKiBQQyAgICAqLwogI2RlZmluZSBJT1BXX1JFU19BRERSXzJDICAgICAgICAweDJDCiAjZGVmaW5lIElPUFdfUkVTX0FERFJfMkUgICAgICAgIDB4MkUKLSNkZWZpbmUgSU9QV19TQ1NJX0RBVEEgICAgICAgICAgMHgzMCAgLyogU0QgICAgKi8KLSNkZWZpbmUgSU9QV19TQ1NJX0RBVEFfSFNISyAgICAgMHgzMiAgLyogU0RIICAgKi8KLSNkZWZpbmUgSU9QV19TQ1NJX0NUUkwgICAgICAgICAgMHgzNCAgLyogU0MgICAgKi8KLSNkZWZpbmUgSU9QV19IU0hLX0NGRyAgICAgICAgICAgMHgzNiAgLyogSENGRyAgKi8KLSNkZWZpbmUgSU9QV19TWEZSX1NUQVRVUyAgICAgICAgMHgzNiAgLyogU1hTICAgKi8KLSNkZWZpbmUgSU9QV19TWEZSX0NOVEwgICAgICAgICAgMHgzOCAgLyogU1hMICAgKi8KLSNkZWZpbmUgSU9QV19TWEZSX0NOVEggICAgICAgICAgMHgzQSAgLyogU1hIICAgKi8KKyNkZWZpbmUgSU9QV19TQ1NJX0RBVEEgICAgICAgICAgMHgzMAkvKiBTRCAgICAqLworI2RlZmluZSBJT1BXX1NDU0lfREFUQV9IU0hLICAgICAweDMyCS8qIFNESCAgICovCisjZGVmaW5lIElPUFdfU0NTSV9DVFJMICAgICAgICAgIDB4MzQJLyogU0MgICAgKi8KKyNkZWZpbmUgSU9QV19IU0hLX0NGRyAgICAgICAgICAgMHgzNgkvKiBIQ0ZHICAqLworI2RlZmluZSBJT1BXX1NYRlJfU1RBVFVTICAgICAgICAweDM2CS8qIFNYUyAgICovCisjZGVmaW5lIElPUFdfU1hGUl9DTlRMICAgICAgICAgIDB4MzgJLyogU1hMICAgKi8KKyNkZWZpbmUgSU9QV19TWEZSX0NOVEggICAgICAgICAgMHgzQQkvKiBTWEggICAqLwogI2RlZmluZSBJT1BXX1JFU19BRERSXzNDICAgICAgICAweDNDCi0jZGVmaW5lIElPUFdfUkZJRk9fREFUQSAgICAgICAgIDB4M0UgIC8qIFJGRCAgICovCisjZGVmaW5lIElPUFdfUkZJRk9fREFUQSAgICAgICAgIDB4M0UJLyogUkZEICAgKi8KIAogLyoKICAqIERvdWJsZXdvcmQgSS9PIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbSBiYXNlIG9mICdpb3BfYmFzZScuCkBAIC0yNjIxLDM2ICsyNTk4LDM2IEBACiAvKgogICogU0NTSV9DRkcwIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucwogICovCi0jZGVmaW5lIFRJTUVSX01PREVBQiAgICAweEMwMDAgIC8qIFdhdGNoZG9nLCBTZWNvbmQsIGFuZCBTZWxlY3QuIFRpbWVyIEN0cmwuICovCi0jZGVmaW5lIFBBUklUWV9FTiAgICAgICAweDIwMDAgIC8qIEVuYWJsZSBTQ1NJIFBhcml0eSBFcnJvciBkZXRlY3Rpb24gKi8KLSNkZWZpbmUgRVZFTl9QQVJJVFkgICAgIDB4MTAwMCAgLyogU2VsZWN0IEV2ZW4gUGFyaXR5ICovCi0jZGVmaW5lIFdEX0xPTkcgICAgICAgICAweDA4MDAgIC8qIFdhdGNoZG9nIEludGVydmFsLCAxOiA1NyBtaW4sIDA6IDEzIHNlYyAqLwotI2RlZmluZSBRVUVVRV8xMjggICAgICAgMHgwNDAwICAvKiBRdWV1ZSBTaXplLCAxOiAxMjggYnl0ZSwgMDogNjQgYnl0ZSAqLwotI2RlZmluZSBQUklNX01PREUgICAgICAgMHgwMTAwICAvKiBQcmltaXRpdmUgU0NTSSBtb2RlICovCi0jZGVmaW5lIFNDQU1fRU4gICAgICAgICAweDAwODAgIC8qIEVuYWJsZSBTQ0FNIHNlbGVjdGlvbiAqLwotI2RlZmluZSBTRUxfVE1PX0xPTkcgICAgMHgwMDQwICAvKiBTZWwvUmVzZWwgVGltZW91dCwgMTogNDAwIG1zLCAwOiAxLjYgbXMgKi8KLSNkZWZpbmUgQ0ZSTV9JRCAgICAgICAgIDB4MDAyMCAgLyogU0NBTSBpZCBzZWwuIGNvbmZpcm0uLCAxOiBmYXN0LCAwOiA2LjQgbXMgKi8KLSNkZWZpbmUgT1VSX0lEX0VOICAgICAgIDB4MDAxMCAgLyogRW5hYmxlIE9VUl9JRCBiaXRzICovCi0jZGVmaW5lIE9VUl9JRCAgICAgICAgICAweDAwMEYgIC8qIFNDU0kgSUQgKi8KKyNkZWZpbmUgVElNRVJfTU9ERUFCICAgIDB4QzAwMAkvKiBXYXRjaGRvZywgU2Vjb25kLCBhbmQgU2VsZWN0LiBUaW1lciBDdHJsLiAqLworI2RlZmluZSBQQVJJVFlfRU4gICAgICAgMHgyMDAwCS8qIEVuYWJsZSBTQ1NJIFBhcml0eSBFcnJvciBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgRVZFTl9QQVJJVFkgICAgIDB4MTAwMAkvKiBTZWxlY3QgRXZlbiBQYXJpdHkgKi8KKyNkZWZpbmUgV0RfTE9ORyAgICAgICAgIDB4MDgwMAkvKiBXYXRjaGRvZyBJbnRlcnZhbCwgMTogNTcgbWluLCAwOiAxMyBzZWMgKi8KKyNkZWZpbmUgUVVFVUVfMTI4ICAgICAgIDB4MDQwMAkvKiBRdWV1ZSBTaXplLCAxOiAxMjggYnl0ZSwgMDogNjQgYnl0ZSAqLworI2RlZmluZSBQUklNX01PREUgICAgICAgMHgwMTAwCS8qIFByaW1pdGl2ZSBTQ1NJIG1vZGUgKi8KKyNkZWZpbmUgU0NBTV9FTiAgICAgICAgIDB4MDA4MAkvKiBFbmFibGUgU0NBTSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0VMX1RNT19MT05HICAgIDB4MDA0MAkvKiBTZWwvUmVzZWwgVGltZW91dCwgMTogNDAwIG1zLCAwOiAxLjYgbXMgKi8KKyNkZWZpbmUgQ0ZSTV9JRCAgICAgICAgIDB4MDAyMAkvKiBTQ0FNIGlkIHNlbC4gY29uZmlybS4sIDE6IGZhc3QsIDA6IDYuNCBtcyAqLworI2RlZmluZSBPVVJfSURfRU4gICAgICAgMHgwMDEwCS8qIEVuYWJsZSBPVVJfSUQgYml0cyAqLworI2RlZmluZSBPVVJfSUQgICAgICAgICAgMHgwMDBGCS8qIFNDU0kgSUQgKi8KIAogLyoKICAqIFNDU0lfQ0ZHMSBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKICAqLwotI2RlZmluZSBCSUdfRU5ESUFOICAgICAgMHg4MDAwICAvKiBFbmFibGUgQmlnIEVuZGlhbiBNb2RlIE1JTzoxNSwgRUVQOjE1ICovCi0jZGVmaW5lIFRFUk1fUE9MICAgICAgICAweDIwMDAgIC8qIFRlcm1pbmF0b3IgUG9sYXJpdHkgQ3RybC4gTUlPOjEzLCBFRVA6MTMgKi8KLSNkZWZpbmUgU0xFV19SQVRFICAgICAgIDB4MTAwMCAgLyogU0NTSSBvdXRwdXQgYnVmZmVyIHNsZXcgcmF0ZSAqLwotI2RlZmluZSBGSUxURVJfU0VMICAgICAgMHgwQzAwICAvKiBGaWx0ZXIgUGVyaW9kIFNlbGVjdGlvbiAqLwotI2RlZmluZSAgRkxUUl9ESVNBQkxFICAgIDB4MDAwMCAgLyogSW5wdXQgRmlsdGVyaW5nIERpc2FibGVkICovCi0jZGVmaW5lICBGTFRSXzExX1RPXzIwTlMgMHgwODAwICAvKiBJbnB1dCBGaWx0ZXJpbmcgMTFucyB0byAyMG5zICovCi0jZGVmaW5lICBGTFRSXzIxX1RPXzM5TlMgMHgwQzAwICAvKiBJbnB1dCBGaWx0ZXJpbmcgMjFucyB0byAzOW5zICovCi0jZGVmaW5lIEFDVElWRV9EQkwgICAgICAweDAyMDAgIC8qIERpc2FibGUgQWN0aXZlIE5lZ2F0aW9uICovCi0jZGVmaW5lIERJRkZfTU9ERSAgICAgICAweDAxMDAgIC8qIFNDU0kgZGlmZmVyZW50aWFsIE1vZGUgKFJlYWQtT25seSkgKi8KLSNkZWZpbmUgRElGRl9TRU5TRSAgICAgIDB4MDA4MCAgLyogMTogTm8gU0UgY2FibGVzLCAwOiBTRSBjYWJsZSAoUmVhZC1Pbmx5KSAqLwotI2RlZmluZSBURVJNX0NUTF9TRUwgICAgMHgwMDQwICAvKiBFbmFibGUgVEVSTV9DVExfSCBhbmQgVEVSTV9DVExfTCAqLwotI2RlZmluZSBURVJNX0NUTCAgICAgICAgMHgwMDMwICAvKiBFeHRlcm5hbCBTQ1NJIFRlcm1pbmF0aW9uIEJpdHMgKi8KLSNkZWZpbmUgIFRFUk1fQ1RMX0ggICAgICAweDAwMjAgIC8qIEVuYWJsZSBFeHRlcm5hbCBTQ1NJIFVwcGVyIFRlcm1pbmF0aW9uICovCi0jZGVmaW5lICBURVJNX0NUTF9MICAgICAgMHgwMDEwICAvKiBFbmFibGUgRXh0ZXJuYWwgU0NTSSBMb3dlciBUZXJtaW5hdGlvbiAqLwotI2RlZmluZSBDQUJMRV9ERVRFQ1QgICAgMHgwMDBGICAvKiBFeHRlcm5hbCBTQ1NJIENhYmxlIENvbm5lY3Rpb24gU3RhdHVzICovCisjZGVmaW5lIEJJR19FTkRJQU4gICAgICAweDgwMDAJLyogRW5hYmxlIEJpZyBFbmRpYW4gTW9kZSBNSU86MTUsIEVFUDoxNSAqLworI2RlZmluZSBURVJNX1BPTCAgICAgICAgMHgyMDAwCS8qIFRlcm1pbmF0b3IgUG9sYXJpdHkgQ3RybC4gTUlPOjEzLCBFRVA6MTMgKi8KKyNkZWZpbmUgU0xFV19SQVRFICAgICAgIDB4MTAwMAkvKiBTQ1NJIG91dHB1dCBidWZmZXIgc2xldyByYXRlICovCisjZGVmaW5lIEZJTFRFUl9TRUwgICAgICAweDBDMDAJLyogRmlsdGVyIFBlcmlvZCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgIEZMVFJfRElTQUJMRSAgICAweDAwMDAJLyogSW5wdXQgRmlsdGVyaW5nIERpc2FibGVkICovCisjZGVmaW5lICBGTFRSXzExX1RPXzIwTlMgMHgwODAwCS8qIElucHV0IEZpbHRlcmluZyAxMW5zIHRvIDIwbnMgKi8KKyNkZWZpbmUgIEZMVFJfMjFfVE9fMzlOUyAweDBDMDAJLyogSW5wdXQgRmlsdGVyaW5nIDIxbnMgdG8gMzlucyAqLworI2RlZmluZSBBQ1RJVkVfREJMICAgICAgMHgwMjAwCS8qIERpc2FibGUgQWN0aXZlIE5lZ2F0aW9uICovCisjZGVmaW5lIERJRkZfTU9ERSAgICAgICAweDAxMDAJLyogU0NTSSBkaWZmZXJlbnRpYWwgTW9kZSAoUmVhZC1Pbmx5KSAqLworI2RlZmluZSBESUZGX1NFTlNFICAgICAgMHgwMDgwCS8qIDE6IE5vIFNFIGNhYmxlcywgMDogU0UgY2FibGUgKFJlYWQtT25seSkgKi8KKyNkZWZpbmUgVEVSTV9DVExfU0VMICAgIDB4MDA0MAkvKiBFbmFibGUgVEVSTV9DVExfSCBhbmQgVEVSTV9DVExfTCAqLworI2RlZmluZSBURVJNX0NUTCAgICAgICAgMHgwMDMwCS8qIEV4dGVybmFsIFNDU0kgVGVybWluYXRpb24gQml0cyAqLworI2RlZmluZSAgVEVSTV9DVExfSCAgICAgIDB4MDAyMAkvKiBFbmFibGUgRXh0ZXJuYWwgU0NTSSBVcHBlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSAgVEVSTV9DVExfTCAgICAgIDB4MDAxMAkvKiBFbmFibGUgRXh0ZXJuYWwgU0NTSSBMb3dlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSBDQUJMRV9ERVRFQ1QgICAgMHgwMDBGCS8qIEV4dGVybmFsIFNDU0kgQ2FibGUgQ29ubmVjdGlvbiBTdGF0dXMgKi8KIAogLyoKICAqIEFkZGVuZHVtIGZvciBBU0MtMzhDMDgwMCBDaGlwCkBAIC0yNjYzLDI0ICsyNjQwLDIzIEBACiAgKiBBbHNvIGVhY2ggQVNDLTM4QzE2MDAgZnVuY3Rpb24gb3IgY2hhbm5lbCB1c2VzIG9ubHkgY2FibGUgYml0cyBbNTo0XQogICogYW5kIFsxOjBdLiBCaXRzIFsxNF0sIFs3OjZdLCBbMzoyXSBhcmUgdW51c2VkLgogICovCi0jZGVmaW5lIERJU19URVJNX0RSViAgICAweDQwMDAgIC8qIDE6IFJlYWQgY19kZXRbMzowXSwgMDogY2Fubm90IHJlYWQgKi8KLSNkZWZpbmUgSFZEX0xWRF9TRSAgICAgIDB4MUMwMCAgLyogRGV2aWNlIERldGVjdCBCaXRzICovCi0jZGVmaW5lICBIVkQgICAgICAgICAgICAgMHgxMDAwICAvKiBIVkQgRGV2aWNlIERldGVjdCAqLwotI2RlZmluZSAgTFZEICAgICAgICAgICAgIDB4MDgwMCAgLyogTFZEIERldmljZSBEZXRlY3QgKi8KLSNkZWZpbmUgIFNFICAgICAgICAgICAgICAweDA0MDAgIC8qIFNFIERldmljZSBEZXRlY3QgKi8KLSNkZWZpbmUgVEVSTV9MVkQgICAgICAgIDB4MDBDMCAgLyogTFZEIFRlcm1pbmF0aW9uIEJpdHMgKi8KLSNkZWZpbmUgIFRFUk1fTFZEX0hJICAgICAweDAwODAgIC8qIEVuYWJsZSBMVkQgVXBwZXIgVGVybWluYXRpb24gKi8KLSNkZWZpbmUgIFRFUk1fTFZEX0xPICAgICAweDAwNDAgIC8qIEVuYWJsZSBMVkQgTG93ZXIgVGVybWluYXRpb24gKi8KLSNkZWZpbmUgVEVSTV9TRSAgICAgICAgIDB4MDAzMCAgLyogU0UgVGVybWluYXRpb24gQml0cyAqLwotI2RlZmluZSAgVEVSTV9TRV9ISSAgICAgIDB4MDAyMCAgLyogRW5hYmxlIFNFIFVwcGVyIFRlcm1pbmF0aW9uICovCi0jZGVmaW5lICBURVJNX1NFX0xPICAgICAgMHgwMDEwICAvKiBFbmFibGUgU0UgTG93ZXIgVGVybWluYXRpb24gKi8KLSNkZWZpbmUgQ19ERVRfTFZEICAgICAgIDB4MDAwQyAgLyogTFZEIENhYmxlIERldGVjdCBCaXRzICovCi0jZGVmaW5lICBDX0RFVDMgICAgICAgICAgMHgwMDA4ICAvKiBDYWJsZSBEZXRlY3QgZm9yIExWRCBFeHRlcm5hbCBXaWRlICovCi0jZGVmaW5lICBDX0RFVDIgICAgICAgICAgMHgwMDA0ICAvKiBDYWJsZSBEZXRlY3QgZm9yIExWRCBJbnRlcm5hbCBXaWRlICovCi0jZGVmaW5lIENfREVUX1NFICAgICAgICAweDAwMDMgIC8qIFNFIENhYmxlIERldGVjdCBCaXRzICovCi0jZGVmaW5lICBDX0RFVDEgICAgICAgICAgMHgwMDAyICAvKiBDYWJsZSBEZXRlY3QgZm9yIFNFIEludGVybmFsIFdpZGUgKi8KLSNkZWZpbmUgIENfREVUMCAgICAgICAgICAweDAwMDEgIC8qIENhYmxlIERldGVjdCBmb3IgU0UgSW50ZXJuYWwgTmFycm93ICovCi0KKyNkZWZpbmUgRElTX1RFUk1fRFJWICAgIDB4NDAwMAkvKiAxOiBSZWFkIGNfZGV0WzM6MF0sIDA6IGNhbm5vdCByZWFkICovCisjZGVmaW5lIEhWRF9MVkRfU0UgICAgICAweDFDMDAJLyogRGV2aWNlIERldGVjdCBCaXRzICovCisjZGVmaW5lICBIVkQgICAgICAgICAgICAgMHgxMDAwCS8qIEhWRCBEZXZpY2UgRGV0ZWN0ICovCisjZGVmaW5lICBMVkQgICAgICAgICAgICAgMHgwODAwCS8qIExWRCBEZXZpY2UgRGV0ZWN0ICovCisjZGVmaW5lICBTRSAgICAgICAgICAgICAgMHgwNDAwCS8qIFNFIERldmljZSBEZXRlY3QgKi8KKyNkZWZpbmUgVEVSTV9MVkQgICAgICAgIDB4MDBDMAkvKiBMVkQgVGVybWluYXRpb24gQml0cyAqLworI2RlZmluZSAgVEVSTV9MVkRfSEkgICAgIDB4MDA4MAkvKiBFbmFibGUgTFZEIFVwcGVyIFRlcm1pbmF0aW9uICovCisjZGVmaW5lICBURVJNX0xWRF9MTyAgICAgMHgwMDQwCS8qIEVuYWJsZSBMVkQgTG93ZXIgVGVybWluYXRpb24gKi8KKyNkZWZpbmUgVEVSTV9TRSAgICAgICAgIDB4MDAzMAkvKiBTRSBUZXJtaW5hdGlvbiBCaXRzICovCisjZGVmaW5lICBURVJNX1NFX0hJICAgICAgMHgwMDIwCS8qIEVuYWJsZSBTRSBVcHBlciBUZXJtaW5hdGlvbiAqLworI2RlZmluZSAgVEVSTV9TRV9MTyAgICAgIDB4MDAxMAkvKiBFbmFibGUgU0UgTG93ZXIgVGVybWluYXRpb24gKi8KKyNkZWZpbmUgQ19ERVRfTFZEICAgICAgIDB4MDAwQwkvKiBMVkQgQ2FibGUgRGV0ZWN0IEJpdHMgKi8KKyNkZWZpbmUgIENfREVUMyAgICAgICAgICAweDAwMDgJLyogQ2FibGUgRGV0ZWN0IGZvciBMVkQgRXh0ZXJuYWwgV2lkZSAqLworI2RlZmluZSAgQ19ERVQyICAgICAgICAgIDB4MDAwNAkvKiBDYWJsZSBEZXRlY3QgZm9yIExWRCBJbnRlcm5hbCBXaWRlICovCisjZGVmaW5lIENfREVUX1NFICAgICAgICAweDAwMDMJLyogU0UgQ2FibGUgRGV0ZWN0IEJpdHMgKi8KKyNkZWZpbmUgIENfREVUMSAgICAgICAgICAweDAwMDIJLyogQ2FibGUgRGV0ZWN0IGZvciBTRSBJbnRlcm5hbCBXaWRlICovCisjZGVmaW5lICBDX0RFVDAgICAgICAgICAgMHgwMDAxCS8qIENhYmxlIERldGVjdCBmb3IgU0UgSW50ZXJuYWwgTmFycm93ICovCiAKICNkZWZpbmUgQ0FCTEVfSUxMRUdBTF9BIDB4NwogICAgIC8qIHggMCAwIDAgIHwgb24gIG9uIHwgSWxsZWdhbCAoYWxsIDMgY29ubmVjdG9ycyBhcmUgdXNlZCkgKi8KQEAgLTI2OTEsMzkgKzI2NjcsMzkgQEAKIC8qCiAgKiBNRU1fQ0ZHIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucwogICovCi0jZGVmaW5lIEJJT1NfRU4gICAgICAgICAweDQwICAgIC8qIEJJT1MgRW5hYmxlIE1JTzoxNCxFRVA6MTQgKi8KLSNkZWZpbmUgRkFTVF9FRV9DTEsgICAgIDB4MjAgICAgLyogRGlhZ25vc3RpYyBCaXQgKi8KLSNkZWZpbmUgUkFNX1NaICAgICAgICAgIDB4MUMgICAgLyogU3BlY2lmeSBzaXplIG9mIFJBTSB0byBSSVNDICovCi0jZGVmaW5lICBSQU1fU1pfMktCICAgICAgMHgwMCAgICAvKiAyIEtCICovCi0jZGVmaW5lICBSQU1fU1pfNEtCICAgICAgMHgwNCAgICAvKiA0IEtCICovCi0jZGVmaW5lICBSQU1fU1pfOEtCICAgICAgMHgwOCAgICAvKiA4IEtCICovCi0jZGVmaW5lICBSQU1fU1pfMTZLQiAgICAgMHgwQyAgICAvKiAxNiBLQiAqLwotI2RlZmluZSAgUkFNX1NaXzMyS0IgICAgIDB4MTAgICAgLyogMzIgS0IgKi8KLSNkZWZpbmUgIFJBTV9TWl82NEtCICAgICAweDE0ICAgIC8qIDY0IEtCICovCisjZGVmaW5lIEJJT1NfRU4gICAgICAgICAweDQwCS8qIEJJT1MgRW5hYmxlIE1JTzoxNCxFRVA6MTQgKi8KKyNkZWZpbmUgRkFTVF9FRV9DTEsgICAgIDB4MjAJLyogRGlhZ25vc3RpYyBCaXQgKi8KKyNkZWZpbmUgUkFNX1NaICAgICAgICAgIDB4MUMJLyogU3BlY2lmeSBzaXplIG9mIFJBTSB0byBSSVNDICovCisjZGVmaW5lICBSQU1fU1pfMktCICAgICAgMHgwMAkvKiAyIEtCICovCisjZGVmaW5lICBSQU1fU1pfNEtCICAgICAgMHgwNAkvKiA0IEtCICovCisjZGVmaW5lICBSQU1fU1pfOEtCICAgICAgMHgwOAkvKiA4IEtCICovCisjZGVmaW5lICBSQU1fU1pfMTZLQiAgICAgMHgwQwkvKiAxNiBLQiAqLworI2RlZmluZSAgUkFNX1NaXzMyS0IgICAgIDB4MTAJLyogMzIgS0IgKi8KKyNkZWZpbmUgIFJBTV9TWl82NEtCICAgICAweDE0CS8qIDY0IEtCICovCiAKIC8qCiAgKiBETUFfQ0ZHMCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKICAqCiAgKiBUaGlzIHJlZ2lzdGVyIGlzIG9ubHkgYWNjZXNzaWJsZSB0byB0aGUgaG9zdC4KICAqLwotI2RlZmluZSBCQ19USFJFU0hfRU5CICAgMHg4MCAgICAvKiBQQ0kgRE1BIFN0YXJ0IENvbmRpdGlvbnMgKi8KLSNkZWZpbmUgRklGT19USFJFU0ggICAgIDB4NzAgICAgLyogUENJIERNQSBGSUZPIFRocmVzaG9sZCAqLwotI2RlZmluZSAgRklGT19USFJFU0hfMTZCICAweDAwICAgLyogMTYgYnl0ZXMgKi8KLSNkZWZpbmUgIEZJRk9fVEhSRVNIXzMyQiAgMHgyMCAgIC8qIDMyIGJ5dGVzICovCi0jZGVmaW5lICBGSUZPX1RIUkVTSF80OEIgIDB4MzAgICAvKiA0OCBieXRlcyAqLwotI2RlZmluZSAgRklGT19USFJFU0hfNjRCICAweDQwICAgLyogNjQgYnl0ZXMgKi8KLSNkZWZpbmUgIEZJRk9fVEhSRVNIXzgwQiAgMHg1MCAgIC8qIDgwIGJ5dGVzIChkZWZhdWx0KSAqLwotI2RlZmluZSAgRklGT19USFJFU0hfOTZCICAweDYwICAgLyogOTYgYnl0ZXMgKi8KLSNkZWZpbmUgIEZJRk9fVEhSRVNIXzExMkIgMHg3MCAgIC8qIDExMiBieXRlcyAqLwotI2RlZmluZSBTVEFSVF9DVEwgICAgICAgMHgwQyAgICAvKiBETUEgc3RhcnQgY29uZGl0aW9ucyAqLwotI2RlZmluZSAgU1RBUlRfQ1RMX1RIICAgIDB4MDAgICAgLyogV2FpdCB0aHJlc2hvbGQgbGV2ZWwgKGRlZmF1bHQpICovCi0jZGVmaW5lICBTVEFSVF9DVExfSUQgICAgMHgwNCAgICAvKiBXYWl0IFNETUEvU0JVUyBpZGxlICovCi0jZGVmaW5lICBTVEFSVF9DVExfVEhJRCAgMHgwOCAgICAvKiBXYWl0IHRocmVzaG9sZCBhbmQgU0RNQS9TQlVTIGlkbGUgKi8KLSNkZWZpbmUgIFNUQVJUX0NUTF9FTUZVICAweDBDICAgIC8qIFdhaXQgU0RNQSBGSUZPIGVtcHR5L2Z1bGwgKi8KLSNkZWZpbmUgUkVBRF9DTUQgICAgICAgIDB4MDMgICAgLyogTWVtb3J5IFJlYWQgTWV0aG9kICovCi0jZGVmaW5lICBSRUFEX0NNRF9NUiAgICAgMHgwMCAgICAvKiBNZW1vcnkgUmVhZCAqLwotI2RlZmluZSAgUkVBRF9DTURfTVJMICAgIDB4MDIgICAgLyogTWVtb3J5IFJlYWQgTG9uZyAqLwotI2RlZmluZSAgUkVBRF9DTURfTVJNICAgIDB4MDMgICAgLyogTWVtb3J5IFJlYWQgTXVsdGlwbGUgKGRlZmF1bHQpICovCisjZGVmaW5lIEJDX1RIUkVTSF9FTkIgICAweDgwCS8qIFBDSSBETUEgU3RhcnQgQ29uZGl0aW9ucyAqLworI2RlZmluZSBGSUZPX1RIUkVTSCAgICAgMHg3MAkvKiBQQ0kgRE1BIEZJRk8gVGhyZXNob2xkICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF8xNkIgIDB4MDAJLyogMTYgYnl0ZXMgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzMyQiAgMHgyMAkvKiAzMiBieXRlcyAqLworI2RlZmluZSAgRklGT19USFJFU0hfNDhCICAweDMwCS8qIDQ4IGJ5dGVzICovCisjZGVmaW5lICBGSUZPX1RIUkVTSF82NEIgIDB4NDAJLyogNjQgYnl0ZXMgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzgwQiAgMHg1MAkvKiA4MCBieXRlcyAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgIEZJRk9fVEhSRVNIXzk2QiAgMHg2MAkvKiA5NiBieXRlcyAqLworI2RlZmluZSAgRklGT19USFJFU0hfMTEyQiAweDcwCS8qIDExMiBieXRlcyAqLworI2RlZmluZSBTVEFSVF9DVEwgICAgICAgMHgwQwkvKiBETUEgc3RhcnQgY29uZGl0aW9ucyAqLworI2RlZmluZSAgU1RBUlRfQ1RMX1RIICAgIDB4MDAJLyogV2FpdCB0aHJlc2hvbGQgbGV2ZWwgKGRlZmF1bHQpICovCisjZGVmaW5lICBTVEFSVF9DVExfSUQgICAgMHgwNAkvKiBXYWl0IFNETUEvU0JVUyBpZGxlICovCisjZGVmaW5lICBTVEFSVF9DVExfVEhJRCAgMHgwOAkvKiBXYWl0IHRocmVzaG9sZCBhbmQgU0RNQS9TQlVTIGlkbGUgKi8KKyNkZWZpbmUgIFNUQVJUX0NUTF9FTUZVICAweDBDCS8qIFdhaXQgU0RNQSBGSUZPIGVtcHR5L2Z1bGwgKi8KKyNkZWZpbmUgUkVBRF9DTUQgICAgICAgIDB4MDMJLyogTWVtb3J5IFJlYWQgTWV0aG9kICovCisjZGVmaW5lICBSRUFEX0NNRF9NUiAgICAgMHgwMAkvKiBNZW1vcnkgUmVhZCAqLworI2RlZmluZSAgUkVBRF9DTURfTVJMICAgIDB4MDIJLyogTWVtb3J5IFJlYWQgTG9uZyAqLworI2RlZmluZSAgUkVBRF9DTURfTVJNICAgIDB4MDMJLyogTWVtb3J5IFJlYWQgTXVsdGlwbGUgKGRlZmF1bHQpICovCiAKIC8qCiAgKiBBU0MtMzhDMDgwMCBSQU0gQklTVCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKQEAgLTI3NDcsNyArMjcyMyw3IEBACiAgKiBJT1BCX1BDSV9JTlRfQ0ZHIEJpdCBGaWVsZCBEZWZpbml0aW9ucwogICovCiAKLSNkZWZpbmUgSU5UQUJfTEQgICAgICAgIDB4ODAgICAgLyogVmFsdWUgbG9hZGVkIGZyb20gRUVQUk9NIEJpdCAxMS4gKi8KKyNkZWZpbmUgSU5UQUJfTEQgICAgICAgIDB4ODAJLyogVmFsdWUgbG9hZGVkIGZyb20gRUVQUk9NIEJpdCAxMS4gKi8KIAogLyoKICAqIEJpdCAxIGNhbiBiZSBzZXQgdG8gY2hhbmdlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBGdW5jdGlvbiB0byBvcGVyYXRlIGluCkBAIC0yNzgwLDUzICsyNzU2LDUyIEBACiAjZGVmaW5lIEFEVl9CVVNZICAgICAgICAwCiAjZGVmaW5lIEFEVl9FUlJPUiAgICAgICAoLTEpCiAKLQogLyoKICAqIEFEVl9EVkNfVkFSICd3YXJuX2NvZGUnIHZhbHVlcwogICovCi0jZGVmaW5lIEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SICAgICAgICAgMHgwMDAxIC8qIFNDU0kgQnVzIFJlc2V0IGVycm9yICovCi0jZGVmaW5lIEFTQ19XQVJOX0VFUFJPTV9DSEtTVU0gICAgICAgICAgMHgwMDAyIC8qIEVFUCBjaGVjayBzdW0gZXJyb3IgKi8KLSNkZWZpbmUgQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OICAgICAweDAwMDQgLyogRUVQIHRlcm1pbmF0aW9uIGJhZCBmaWVsZCAqLwotI2RlZmluZSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRSAgIDB4MDA4MCAvKiBQQ0kgY29uZmlnIHNwYWNlIHNldCBlcnJvciAqLwotI2RlZmluZSBBU0NfV0FSTl9FUlJPUiAgICAgICAgICAgICAgICAgIDB4RkZGRiAvKiBBRFZfRVJST1IgcmV0dXJuICovCisjZGVmaW5lIEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SICAgICAgICAgMHgwMDAxCS8qIFNDU0kgQnVzIFJlc2V0IGVycm9yICovCisjZGVmaW5lIEFTQ19XQVJOX0VFUFJPTV9DSEtTVU0gICAgICAgICAgMHgwMDAyCS8qIEVFUCBjaGVjayBzdW0gZXJyb3IgKi8KKyNkZWZpbmUgQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OICAgICAweDAwMDQJLyogRUVQIHRlcm1pbmF0aW9uIGJhZCBmaWVsZCAqLworI2RlZmluZSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRSAgIDB4MDA4MAkvKiBQQ0kgY29uZmlnIHNwYWNlIHNldCBlcnJvciAqLworI2RlZmluZSBBU0NfV0FSTl9FUlJPUiAgICAgICAgICAgICAgICAgIDB4RkZGRgkvKiBBRFZfRVJST1IgcmV0dXJuICovCiAKLSNkZWZpbmUgQURWX01BWF9USUQgICAgICAgICAgICAgICAgICAgICAxNSAvKiBtYXguIHRhcmdldCBpZGVudGlmaWVyICovCi0jZGVmaW5lIEFEVl9NQVhfTFVOICAgICAgICAgICAgICAgICAgICAgNyAgLyogbWF4LiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCisjZGVmaW5lIEFEVl9NQVhfVElEICAgICAgICAgICAgICAgICAgICAgMTUJLyogbWF4LiB0YXJnZXQgaWRlbnRpZmllciAqLworI2RlZmluZSBBRFZfTUFYX0xVTiAgICAgICAgICAgICAgICAgICAgIDcJLyogbWF4LiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCiAKIC8qCiAgKiBFcnJvciBjb2RlIHZhbHVlcyBhcmUgc2V0IGluIEFEVl9EVkNfVkFSICdlcnJfY29kZScuCiAgKi8KLSNkZWZpbmUgQVNDX0lFUlJfV1JJVEVfRUVQUk9NICAgICAgIDB4MDAwMSAvKiB3cml0ZSBFRVBST00gZXJyb3IgKi8KLSNkZWZpbmUgQVNDX0lFUlJfTUNPREVfQ0hLU1VNICAgICAgIDB4MDAwMiAvKiBtaWNybyBjb2RlIGNoZWNrIHN1bSBlcnJvciAqLwotI2RlZmluZSBBU0NfSUVSUl9OT19DQVJSSUVSICAgICAgICAgMHgwMDA0IC8qIE5vIG1vcmUgY2FycmllciBtZW1vcnkuICovCi0jZGVmaW5lIEFTQ19JRVJSX1NUQVJUX1NUT1BfQ0hJUCAgICAweDAwMDggLyogc3RhcnQvc3RvcCBjaGlwIGZhaWxlZCAqLwotI2RlZmluZSBBU0NfSUVSUl9DSElQX1ZFUlNJT04gICAgICAgMHgwMDQwIC8qIHdyb25nIGNoaXAgdmVyc2lvbiAqLwotI2RlZmluZSBBU0NfSUVSUl9TRVRfU0NTSV9JRCAgICAgICAgMHgwMDgwIC8qIHNldCBTQ1NJIElEIGZhaWxlZCAqLwotI2RlZmluZSBBU0NfSUVSUl9IVkRfREVWSUNFICAgICAgICAgMHgwMTAwIC8qIEhWRCBhdHRhY2hlZCB0byBMVkQgY29ubmVjdG9yLiAqLwotI2RlZmluZSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFICAgICAgMHgwMjAwIC8qIHNpZ25hdHVyZSBub3QgZm91bmQgKi8KLSNkZWZpbmUgQVNDX0lFUlJfSUxMRUdBTF9DT05ORUNUSU9OIDB4MDQwMCAvKiBJbGxlZ2FsIGNhYmxlIGNvbm5lY3Rpb24gKi8KLSNkZWZpbmUgQVNDX0lFUlJfU0lOR0xFX0VORF9ERVZJQ0UgIDB4MDgwMCAvKiBTaW5nbGUtZW5kIHVzZWQgdy9kaWZmZXJlbnRpYWwgKi8KLSNkZWZpbmUgQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEUgICAgIDB4MTAwMCAvKiBOYXJyb3cgZmxhdCBjYWJsZSByZXZlcnNlZCAqLwotI2RlZmluZSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUICAgICAgMHgyMDAwIC8qIEJJU1QgcHJlLXRlc3QgZXJyb3IgKi8KLSNkZWZpbmUgQVNDX0lFUlJfQklTVF9SQU1fVEVTVCAgICAgIDB4NDAwMCAvKiBCSVNUIFJBTSB0ZXN0IGVycm9yICovCi0jZGVmaW5lIEFTQ19JRVJSX0JBRF9DSElQVFlQRSAgICAgICAweDgwMDAgLyogSW52YWxpZCAnY2hpcF90eXBlJyBzZXR0aW5nLiAqLworI2RlZmluZSBBU0NfSUVSUl9XUklURV9FRVBST00gICAgICAgMHgwMDAxCS8qIHdyaXRlIEVFUFJPTSBlcnJvciAqLworI2RlZmluZSBBU0NfSUVSUl9NQ09ERV9DSEtTVU0gICAgICAgMHgwMDAyCS8qIG1pY3JvIGNvZGUgY2hlY2sgc3VtIGVycm9yICovCisjZGVmaW5lIEFTQ19JRVJSX05PX0NBUlJJRVIgICAgICAgICAweDAwMDQJLyogTm8gbW9yZSBjYXJyaWVyIG1lbW9yeS4gKi8KKyNkZWZpbmUgQVNDX0lFUlJfU1RBUlRfU1RPUF9DSElQICAgIDB4MDAwOAkvKiBzdGFydC9zdG9wIGNoaXAgZmFpbGVkICovCisjZGVmaW5lIEFTQ19JRVJSX0NISVBfVkVSU0lPTiAgICAgICAweDAwNDAJLyogd3JvbmcgY2hpcCB2ZXJzaW9uICovCisjZGVmaW5lIEFTQ19JRVJSX1NFVF9TQ1NJX0lEICAgICAgICAweDAwODAJLyogc2V0IFNDU0kgSUQgZmFpbGVkICovCisjZGVmaW5lIEFTQ19JRVJSX0hWRF9ERVZJQ0UgICAgICAgICAweDAxMDAJLyogSFZEIGF0dGFjaGVkIHRvIExWRCBjb25uZWN0b3IuICovCisjZGVmaW5lIEFTQ19JRVJSX0JBRF9TSUdOQVRVUkUgICAgICAweDAyMDAJLyogc2lnbmF0dXJlIG5vdCBmb3VuZCAqLworI2RlZmluZSBBU0NfSUVSUl9JTExFR0FMX0NPTk5FQ1RJT04gMHgwNDAwCS8qIElsbGVnYWwgY2FibGUgY29ubmVjdGlvbiAqLworI2RlZmluZSBBU0NfSUVSUl9TSU5HTEVfRU5EX0RFVklDRSAgMHgwODAwCS8qIFNpbmdsZS1lbmQgdXNlZCB3L2RpZmZlcmVudGlhbCAqLworI2RlZmluZSBBU0NfSUVSUl9SRVZFUlNFRF9DQUJMRSAgICAgMHgxMDAwCS8qIE5hcnJvdyBmbGF0IGNhYmxlIHJldmVyc2VkICovCisjZGVmaW5lIEFTQ19JRVJSX0JJU1RfUFJFX1RFU1QgICAgICAweDIwMDAJLyogQklTVCBwcmUtdGVzdCBlcnJvciAqLworI2RlZmluZSBBU0NfSUVSUl9CSVNUX1JBTV9URVNUICAgICAgMHg0MDAwCS8qIEJJU1QgUkFNIHRlc3QgZXJyb3IgKi8KKyNkZWZpbmUgQVNDX0lFUlJfQkFEX0NISVBUWVBFICAgICAgIDB4ODAwMAkvKiBJbnZhbGlkICdjaGlwX3R5cGUnIHNldHRpbmcuICovCiAKIC8qCiAgKiBGaXhlZCBsb2NhdGlvbnMgb2YgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMuCiAgKi8KLSNkZWZpbmUgQVNDX01DX0NPREVfQkVHSU5fQUREUiAgICAgICAgICAweDAwMjggLyogbWljcm9jb2RlIHN0YXJ0IGFkZHJlc3MgKi8KLSNkZWZpbmUgQVNDX01DX0NPREVfRU5EX0FERFIgICAgICAgICAgICAweDAwMkEgLyogbWljcm9jb2RlIGVuZCBhZGRyZXNzICovCi0jZGVmaW5lIEFTQ19NQ19DT0RFX0NIS19TVU0gICAgICAgICAgICAgMHgwMDJDIC8qIG1pY3JvY29kZSBjb2RlIGNoZWNrc3VtICovCi0jZGVmaW5lIEFTQ19NQ19WRVJTSU9OX0RBVEUgICAgICAgICAgICAgMHgwMDM4IC8qIG1pY3JvY29kZSB2ZXJzaW9uICovCi0jZGVmaW5lIEFTQ19NQ19WRVJTSU9OX05VTSAgICAgICAgICAgICAgMHgwMDNBIC8qIG1pY3JvY29kZSBudW1iZXIgKi8KLSNkZWZpbmUgQVNDX01DX0JJT1NNRU0gICAgICAgICAgICAgICAgICAweDAwNDAgLyogQklPUyBSSVNDIE1lbW9yeSBTdGFydCAqLwotI2RlZmluZSBBU0NfTUNfQklPU0xFTiAgICAgICAgICAgICAgICAgIDB4MDA1MCAvKiBCSU9TIFJJU0MgTWVtb3J5IExlbmd0aCAqLwotI2RlZmluZSBBU0NfTUNfQklPU19TSUdOQVRVUkUgICAgICAgICAgIDB4MDA1OCAvKiBCSU9TIFNpZ25hdHVyZSAweDU1QUEgKi8KLSNkZWZpbmUgQVNDX01DX0JJT1NfVkVSU0lPTiAgICAgICAgICAgICAweDAwNUEgLyogQklPUyBWZXJzaW9uICgyIGJ5dGVzKSAqLwotI2RlZmluZSBBU0NfTUNfU0RUUl9TUEVFRDEgICAgICAgICAgICAgIDB4MDA5MCAvKiBTRFRSIFNwZWVkIGZvciBUSUQgMC0zICovCi0jZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVEMiAgICAgICAgICAgICAgMHgwMDkyIC8qIFNEVFIgU3BlZWQgZm9yIFRJRCA0LTcgKi8KLSNkZWZpbmUgQVNDX01DX1NEVFJfU1BFRUQzICAgICAgICAgICAgICAweDAwOTQgLyogU0RUUiBTcGVlZCBmb3IgVElEIDgtMTEgKi8KLSNkZWZpbmUgQVNDX01DX1NEVFJfU1BFRUQ0ICAgICAgICAgICAgICAweDAwOTYgLyogU0RUUiBTcGVlZCBmb3IgVElEIDEyLTE1ICovCisjZGVmaW5lIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIgICAgICAgICAgMHgwMDI4CS8qIG1pY3JvY29kZSBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIEFTQ19NQ19DT0RFX0VORF9BRERSICAgICAgICAgICAgMHgwMDJBCS8qIG1pY3JvY29kZSBlbmQgYWRkcmVzcyAqLworI2RlZmluZSBBU0NfTUNfQ09ERV9DSEtfU1VNICAgICAgICAgICAgIDB4MDAyQwkvKiBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSAqLworI2RlZmluZSBBU0NfTUNfVkVSU0lPTl9EQVRFICAgICAgICAgICAgIDB4MDAzOAkvKiBtaWNyb2NvZGUgdmVyc2lvbiAqLworI2RlZmluZSBBU0NfTUNfVkVSU0lPTl9OVU0gICAgICAgICAgICAgIDB4MDAzQQkvKiBtaWNyb2NvZGUgbnVtYmVyICovCisjZGVmaW5lIEFTQ19NQ19CSU9TTUVNICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEJJT1MgUklTQyBNZW1vcnkgU3RhcnQgKi8KKyNkZWZpbmUgQVNDX01DX0JJT1NMRU4gICAgICAgICAgICAgICAgICAweDAwNTAJLyogQklPUyBSSVNDIE1lbW9yeSBMZW5ndGggKi8KKyNkZWZpbmUgQVNDX01DX0JJT1NfU0lHTkFUVVJFICAgICAgICAgICAweDAwNTgJLyogQklPUyBTaWduYXR1cmUgMHg1NUFBICovCisjZGVmaW5lIEFTQ19NQ19CSU9TX1ZFUlNJT04gICAgICAgICAgICAgMHgwMDVBCS8qIEJJT1MgVmVyc2lvbiAoMiBieXRlcykgKi8KKyNkZWZpbmUgQVNDX01DX1NEVFJfU1BFRUQxICAgICAgICAgICAgICAweDAwOTAJLyogU0RUUiBTcGVlZCBmb3IgVElEIDAtMyAqLworI2RlZmluZSBBU0NfTUNfU0RUUl9TUEVFRDIgICAgICAgICAgICAgIDB4MDA5MgkvKiBTRFRSIFNwZWVkIGZvciBUSUQgNC03ICovCisjZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVEMyAgICAgICAgICAgICAgMHgwMDk0CS8qIFNEVFIgU3BlZWQgZm9yIFRJRCA4LTExICovCisjZGVmaW5lIEFTQ19NQ19TRFRSX1NQRUVENCAgICAgICAgICAgICAgMHgwMDk2CS8qIFNEVFIgU3BlZWQgZm9yIFRJRCAxMi0xNSAqLwogI2RlZmluZSBBU0NfTUNfQ0hJUF9UWVBFICAgICAgICAgICAgICAgIDB4MDA5QQogI2RlZmluZSBBU0NfTUNfSU5UUkJfQ09ERSAgICAgICAgICAgICAgIDB4MDA5QgogI2RlZmluZSBBU0NfTUNfV0RUUl9BQkxFICAgICAgICAgICAgICAgIDB4MDA5QwpAQCAtMjg0NCw5ICsyODE5LDkgQEAKICNkZWZpbmUgQVNDX01DX05VTUJFUl9PRl9RVUVVRURfQ01EICAgICAweDAwQzAKICNkZWZpbmUgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICAgICAgICAweDAwRDAKICNkZWZpbmUgQVNDX01DX0RFVklDRV9IU0hLX0NGR19UQUJMRSAgICAweDAxMDAKLSNkZWZpbmUgQVNDX01DX0NPTlRST0xfRkxBRyAgICAgICAgICAgICAweDAxMjIgLyogTWljcm9jb2RlIGNvbnRyb2wgZmxhZy4gKi8KKyNkZWZpbmUgQVNDX01DX0NPTlRST0xfRkxBRyAgICAgICAgICAgICAweDAxMjIJLyogTWljcm9jb2RlIGNvbnRyb2wgZmxhZy4gKi8KICNkZWZpbmUgQVNDX01DX1dEVFJfRE9ORSAgICAgICAgICAgICAgICAweDAxMjQKLSNkZWZpbmUgQVNDX01DX0NBTV9NT0RFX01BU0sgICAgICAgICAgICAweDAxNUUgLyogQ0FNIG1vZGUgVElEIGJpdG1hc2suICovCisjZGVmaW5lIEFTQ19NQ19DQU1fTU9ERV9NQVNLICAgICAgICAgICAgMHgwMTVFCS8qIENBTSBtb2RlIFRJRCBiaXRtYXNrLiAqLwogI2RlZmluZSBBU0NfTUNfSUNRICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MAogI2RlZmluZSBBU0NfTUNfSVJRICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NAogI2RlZmluZSBBU0NfTUNfUFBSX0FCTEUgICAgICAgICAgICAgICAgIDB4MDE3QQpAQCAtMjg2NSw4ICsyODQwLDggQEAKICAqIEZsYWdzIHNldCBieSB0aGUgQWR2IExpYnJhcnkgaW4gUklTQyB2YXJpYWJsZSAnY29udHJvbF9mbGFnJyAoMHgxMjIpCiAgKiBhbmQgaGFuZGxlZCBieSB0aGUgbWljcm9jb2RlLgogICovCi0jZGVmaW5lIENPTlRST0xfRkxBR19JR05PUkVfUEVSUiAgICAgICAgMHgwMDAxIC8qIElnbm9yZSBETUEgUGFyaXR5IEVycm9ycyAqLwotI2RlZmluZSBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFAgICAgICAgIDB4MDAwMiAvKiBFbmFibGVkIEFJUFAgY2hlY2tpbmcuICovCisjZGVmaW5lIENPTlRST0xfRkxBR19JR05PUkVfUEVSUiAgICAgICAgMHgwMDAxCS8qIElnbm9yZSBETUEgUGFyaXR5IEVycm9ycyAqLworI2RlZmluZSBDT05UUk9MX0ZMQUdfRU5BQkxFX0FJUFAgICAgICAgIDB4MDAwMgkvKiBFbmFibGVkIEFJUFAgY2hlY2tpbmcuICovCiAKIC8qCiAgKiBBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFIG1pY3JvY29kZSB0YWJsZSBvciBIU0hLX0NGRyByZWdpc3RlciBmb3JtYXQKQEAgLTI4NzUsNDUgKzI4NTAsNDQgQEAKICNkZWZpbmUgSFNIS19DRkdfUkFURSAgICAgICAgICAgMHgwRjAwCiAjZGVmaW5lIEhTSEtfQ0ZHX09GRlNFVCAgICAgICAgIDB4MDAxRgogCi0jZGVmaW5lIEFTQ19ERUZfTUFYX0hPU1RfUU5HICAgIDB4RkQgLyogTWF4LiBudW1iZXIgb2YgaG9zdCBjb21tYW5kcyAoMjUzKSAqLwotI2RlZmluZSBBU0NfREVGX01JTl9IT1NUX1FORyAgICAweDEwIC8qIE1pbi4gbnVtYmVyIG9mIGhvc3QgY29tbWFuZHMgKDE2KSAqLwotI2RlZmluZSBBU0NfREVGX01BWF9EVkNfUU5HICAgICAweDNGIC8qIE1heC4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDYzKSAqLwotI2RlZmluZSBBU0NfREVGX01JTl9EVkNfUU5HICAgICAweDA0IC8qIE1pbi4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDQpICovCisjZGVmaW5lIEFTQ19ERUZfTUFYX0hPU1RfUU5HICAgIDB4RkQJLyogTWF4LiBudW1iZXIgb2YgaG9zdCBjb21tYW5kcyAoMjUzKSAqLworI2RlZmluZSBBU0NfREVGX01JTl9IT1NUX1FORyAgICAweDEwCS8qIE1pbi4gbnVtYmVyIG9mIGhvc3QgY29tbWFuZHMgKDE2KSAqLworI2RlZmluZSBBU0NfREVGX01BWF9EVkNfUU5HICAgICAweDNGCS8qIE1heC4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDYzKSAqLworI2RlZmluZSBBU0NfREVGX01JTl9EVkNfUU5HICAgICAweDA0CS8qIE1pbi4gbnVtYmVyIGNvbW1hbmRzIHBlciBkZXZpY2UgKDQpICovCiAKLSNkZWZpbmUgQVNDX1FDX0RBVEFfQ0hFQ0sgIDB4MDEgLyogUmVxdWlyZSBBU0NfUUNfREFUQV9PVVQgc2V0IG9yIGNsZWFyLiAqLwotI2RlZmluZSBBU0NfUUNfREFUQV9PVVQgICAgMHgwMiAvKiBEYXRhIG91dCBETUEgdHJhbnNmZXIuICovCi0jZGVmaW5lIEFTQ19RQ19TVEFSVF9NT1RPUiAweDA0IC8qIFNlbmQgYXV0by1zdGFydCBtb3RvciBiZWZvcmUgcmVxdWVzdC4gKi8KLSNkZWZpbmUgQVNDX1FDX05PX09WRVJSVU4gIDB4MDggLyogRG9uJ3QgcmVwb3J0IG92ZXJydW4uICovCi0jZGVmaW5lIEFTQ19RQ19GUkVFWkVfVElEUSAweDEwIC8qIEZyZWV6ZSBUSUQgcXVldWUgYWZ0ZXIgcmVxdWVzdC4gWFhYIFRCRCAqLworI2RlZmluZSBBU0NfUUNfREFUQV9DSEVDSyAgMHgwMQkvKiBSZXF1aXJlIEFTQ19RQ19EQVRBX09VVCBzZXQgb3IgY2xlYXIuICovCisjZGVmaW5lIEFTQ19RQ19EQVRBX09VVCAgICAweDAyCS8qIERhdGEgb3V0IERNQSB0cmFuc2Zlci4gKi8KKyNkZWZpbmUgQVNDX1FDX1NUQVJUX01PVE9SIDB4MDQJLyogU2VuZCBhdXRvLXN0YXJ0IG1vdG9yIGJlZm9yZSByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUUNfTk9fT1ZFUlJVTiAgMHgwOAkvKiBEb24ndCByZXBvcnQgb3ZlcnJ1bi4gKi8KKyNkZWZpbmUgQVNDX1FDX0ZSRUVaRV9USURRIDB4MTAJLyogRnJlZXplIFRJRCBxdWV1ZSBhZnRlciByZXF1ZXN0LiBYWFggVEJEICovCiAKLSNkZWZpbmUgQVNDX1FTQ19OT19ESVNDICAgICAweDAxIC8qIERvbid0IGFsbG93IGRpc2Nvbm5lY3QgZm9yIHJlcXVlc3QuICovCi0jZGVmaW5lIEFTQ19RU0NfTk9fVEFHTVNHICAgMHgwMiAvKiBEb24ndCBhbGxvdyB0YWcgcXVldWluZyBmb3IgcmVxdWVzdC4gKi8KLSNkZWZpbmUgQVNDX1FTQ19OT19TWU5DICAgICAweDA0IC8qIERvbid0IHVzZSBTeW5jaC4gdHJhbnNmZXIgb24gcmVxdWVzdC4gKi8KLSNkZWZpbmUgQVNDX1FTQ19OT19XSURFICAgICAweDA4IC8qIERvbid0IHVzZSBXaWRlIHRyYW5zZmVyIG9uIHJlcXVlc3QuICovCi0jZGVmaW5lIEFTQ19RU0NfUkVET19EVFIgICAgMHgxMCAvKiBSZW5lZ290aWF0ZSBXRFRSL1NEVFIgYmVmb3JlIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fRElTQyAgICAgMHgwMQkvKiBEb24ndCBhbGxvdyBkaXNjb25uZWN0IGZvciByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUVNDX05PX1RBR01TRyAgIDB4MDIJLyogRG9uJ3QgYWxsb3cgdGFnIHF1ZXVpbmcgZm9yIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fU1lOQyAgICAgMHgwNAkvKiBEb24ndCB1c2UgU3luY2guIHRyYW5zZmVyIG9uIHJlcXVlc3QuICovCisjZGVmaW5lIEFTQ19RU0NfTk9fV0lERSAgICAgMHgwOAkvKiBEb24ndCB1c2UgV2lkZSB0cmFuc2ZlciBvbiByZXF1ZXN0LiAqLworI2RlZmluZSBBU0NfUVNDX1JFRE9fRFRSICAgIDB4MTAJLyogUmVuZWdvdGlhdGUgV0RUUi9TRFRSIGJlZm9yZSByZXF1ZXN0LiAqLwogLyoKICAqIE5vdGU6IElmIGEgVGFnIE1lc3NhZ2UgaXMgdG8gYmUgc2VudCBhbmQgbmVpdGhlciBBU0NfUVNDX0hFQURfVEFHIG9yCiAgKiBBU0NfUVNDX09SREVSRURfVEFHIGlzIHNldCwgdGhlbiBhIFNpbXBsZSBUYWcgTWVzc2FnZSAoMHgyMCkgaXMgdXNlZC4KICAqLwotI2RlZmluZSBBU0NfUVNDX0hFQURfVEFHICAgIDB4NDAgLyogVXNlIEhlYWQgVGFnIE1lc3NhZ2UgKDB4MjEpLiAqLwotI2RlZmluZSBBU0NfUVNDX09SREVSRURfVEFHIDB4ODAgLyogVXNlIE9yZGVyZWQgVGFnIE1lc3NhZ2UgKDB4MjIpLiAqLworI2RlZmluZSBBU0NfUVNDX0hFQURfVEFHICAgIDB4NDAJLyogVXNlIEhlYWQgVGFnIE1lc3NhZ2UgKDB4MjEpLiAqLworI2RlZmluZSBBU0NfUVNDX09SREVSRURfVEFHIDB4ODAJLyogVXNlIE9yZGVyZWQgVGFnIE1lc3NhZ2UgKDB4MjIpLiAqLwogCiAvKgogICogQWxsIGZpZWxkcyBoZXJlIGFyZSBhY2Nlc3NlZCBieSB0aGUgYm9hcmQgbWljcm9jb2RlIGFuZCBuZWVkIHRvIGJlCiAgKiBsaXR0bGUtZW5kaWFuLgogICovCi10eXBlZGVmIHN0cnVjdCBhZHZfY2Fycl90Ci17Ci0gICAgQURWX1ZBRERSICAgY2Fycl92YTsgICAgICAgLyogQ2FycmllciBWaXJ0dWFsIEFkZHJlc3MgKi8KLSAgICBBRFZfUEFERFIgICBjYXJyX3BhOyAgICAgICAvKiBDYXJyaWVyIFBoeXNpY2FsIEFkZHJlc3MgKi8KLSAgICBBRFZfVkFERFIgICBhcmVxX3ZwYTsgICAgICAvKiBBU0NfU0NTSV9SRVFfUSBWaXJ0dWFsIG9yIFBoeXNpY2FsIEFkZHJlc3MgKi8KLSAgICAvKgotICAgICAqIG5leHRfdnBhIFszMTo0XSAgICAgICAgICAgIENhcnJpZXIgVmlydHVhbCBvciBQaHlzaWNhbCBOZXh0IFBvaW50ZXIKLSAgICAgKgotICAgICAqIG5leHRfdnBhIFszOjFdICAgICAgICAgICAgIFJlc2VydmVkIEJpdHMKLSAgICAgKiBuZXh0X3ZwYSBbMF0gICAgICAgICAgICAgICBEb25lIEZsYWcgc2V0IGluIFJlc3BvbnNlIFF1ZXVlLgotICAgICAqLwotICAgIEFEVl9WQUREUiAgIG5leHRfdnBhOwordHlwZWRlZiBzdHJ1Y3QgYWR2X2NhcnJfdCB7CisJQURWX1ZBRERSIGNhcnJfdmE7CS8qIENhcnJpZXIgVmlydHVhbCBBZGRyZXNzICovCisJQURWX1BBRERSIGNhcnJfcGE7CS8qIENhcnJpZXIgUGh5c2ljYWwgQWRkcmVzcyAqLworCUFEVl9WQUREUiBhcmVxX3ZwYTsJLyogQVNDX1NDU0lfUkVRX1EgVmlydHVhbCBvciBQaHlzaWNhbCBBZGRyZXNzICovCisJLyoKKwkgKiBuZXh0X3ZwYSBbMzE6NF0gICAgICAgICAgICBDYXJyaWVyIFZpcnR1YWwgb3IgUGh5c2ljYWwgTmV4dCBQb2ludGVyCisJICoKKwkgKiBuZXh0X3ZwYSBbMzoxXSAgICAgICAgICAgICBSZXNlcnZlZCBCaXRzCisJICogbmV4dF92cGEgWzBdICAgICAgICAgICAgICAgRG9uZSBGbGFnIHNldCBpbiBSZXNwb25zZSBRdWV1ZS4KKwkgKi8KKwlBRFZfVkFERFIgbmV4dF92cGE7CiB9IEFEVl9DQVJSX1Q7CiAKIC8qCkBAIC0yOTQwLDEzICsyOTE0LDEzIEBACiAgKiBUaGUgQWR2IExpYnJhcnkgc2hvdWxkIGxpbWl0IHVzZSB0byB0aGUgbG93ZXIgbmliYmxlICg0IGJpdHMpIG9mCiAgKiBhX2ZsYWcuIERyaXZlcnMgYXJlIGZyZWUgdG8gdXNlIHRoZSB1cHBlciBuaWJibGUgKDQgYml0cykgb2YgYV9mbGFnLgogICovCi0jZGVmaW5lIEFEVl9QT0xMX1JFUVVFU1QgICAgICAgICAgICAgICAgMHgwMSAgIC8qIHBvbGwgZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqLwotI2RlZmluZSBBRFZfU0NTSVFfRE9ORSAgICAgICAgICAgICAgICAgIDB4MDIgICAvKiByZXF1ZXN0IGRvbmUgKi8KLSNkZWZpbmUgQURWX0RPTlRfUkVUUlkgICAgICAgICAgICAgICAgICAweDA4ICAgLyogZG9uJ3QgZG8gcmV0cnkgKi8KKyNkZWZpbmUgQURWX1BPTExfUkVRVUVTVCAgICAgICAgICAgICAgICAweDAxCS8qIHBvbGwgZm9yIHJlcXVlc3QgY29tcGxldGlvbiAqLworI2RlZmluZSBBRFZfU0NTSVFfRE9ORSAgICAgICAgICAgICAgICAgIDB4MDIJLyogcmVxdWVzdCBkb25lICovCisjZGVmaW5lIEFEVl9ET05UX1JFVFJZICAgICAgICAgICAgICAgICAgMHgwOAkvKiBkb24ndCBkbyByZXRyeSAqLwogCi0jZGVmaW5lIEFEVl9DSElQX0FTQzM1NTAgICAgICAgICAgMHgwMSAgIC8qIFVsdHJhLVdpZGUgSUMgKi8KLSNkZWZpbmUgQURWX0NISVBfQVNDMzhDMDgwMCAgICAgICAweDAyICAgLyogVWx0cmEyLVdpZGUvTFZEIElDICovCi0jZGVmaW5lIEFEVl9DSElQX0FTQzM4QzE2MDAgICAgICAgMHgwMyAgIC8qIFVsdHJhMy1XaWRlL0xWRDIgSUMgKi8KKyNkZWZpbmUgQURWX0NISVBfQVNDMzU1MCAgICAgICAgICAweDAxCS8qIFVsdHJhLVdpZGUgSUMgKi8KKyNkZWZpbmUgQURWX0NISVBfQVNDMzhDMDgwMCAgICAgICAweDAyCS8qIFVsdHJhMi1XaWRlL0xWRCBJQyAqLworI2RlZmluZSBBRFZfQ0hJUF9BU0MzOEMxNjAwICAgICAgIDB4MDMJLyogVWx0cmEzLVdpZGUvTFZEMiBJQyAqLwogCiAvKgogICogQWRhcHRlciB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKQEAgLTI5NjAsMzAgKzI5MzQsMzAgQEAKICAqICB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgbmV2ZXIgcmVzZXQuCiAgKi8KIHR5cGVkZWYgc3RydWN0IGFkdl9kdmNfY2ZnIHsKLSAgdXNob3J0IGRpc2NfZW5hYmxlOyAgICAgICAvKiBlbmFibGUgZGlzY29ubmVjdGlvbiAqLwotICB1Y2hhciAgY2hpcF92ZXJzaW9uOyAgICAgIC8qIGNoaXAgdmVyc2lvbiAqLwotICB1Y2hhciAgdGVybWluYXRpb247ICAgICAgIC8qIFRlcm0uIEN0cmwuIGJpdHMgNi01IG9mIFNDU0lfQ0ZHMSByZWdpc3RlciAqLwotICB1c2hvcnQgbGliX3ZlcnNpb247ICAgICAgIC8qIEFkdiBMaWJyYXJ5IHZlcnNpb24gbnVtYmVyICovCi0gIHVzaG9ydCBjb250cm9sX2ZsYWc7ICAgICAgLyogTWljcm9jb2RlIENvbnRyb2wgRmxhZyAqLwotICB1c2hvcnQgbWNvZGVfZGF0ZTsgICAgICAgIC8qIE1pY3JvY29kZSBkYXRlICovCi0gIHVzaG9ydCBtY29kZV92ZXJzaW9uOyAgICAgLyogTWljcm9jb2RlIHZlcnNpb24gKi8KLSAgdXNob3J0IHBjaV9zbG90X2luZm87ICAgICAvKiBoaWdoIGJ5dGUgZGV2aWNlL2Z1bmN0aW9uIG51bWJlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgNy0zIGRldmljZSBudW0uLCBiaXRzIDItMCBmdW5jdGlvbiBudW0uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93IGJ5dGUgYnVzIG51bS4gKi8KLSAgdXNob3J0IHNlcmlhbDE7ICAgICAgICAgICAvKiBFRVBST00gc2VyaWFsIG51bWJlciB3b3JkIDEgKi8KLSAgdXNob3J0IHNlcmlhbDI7ICAgICAgICAgICAvKiBFRVBST00gc2VyaWFsIG51bWJlciB3b3JkIDIgKi8KLSAgdXNob3J0IHNlcmlhbDM7ICAgICAgICAgICAvKiBFRVBST00gc2VyaWFsIG51bWJlciB3b3JkIDMgKi8KLSAgc3RydWN0IGRldmljZSAqZGV2OyAgLyogcG9pbnRlciB0byB0aGUgcGNpIGRldiBzdHJ1Y3R1cmUgZm9yIHRoaXMgYm9hcmQgKi8KKwl1c2hvcnQgZGlzY19lbmFibGU7CS8qIGVuYWJsZSBkaXNjb25uZWN0aW9uICovCisJdWNoYXIgY2hpcF92ZXJzaW9uOwkvKiBjaGlwIHZlcnNpb24gKi8KKwl1Y2hhciB0ZXJtaW5hdGlvbjsJLyogVGVybS4gQ3RybC4gYml0cyA2LTUgb2YgU0NTSV9DRkcxIHJlZ2lzdGVyICovCisJdXNob3J0IGxpYl92ZXJzaW9uOwkvKiBBZHYgTGlicmFyeSB2ZXJzaW9uIG51bWJlciAqLworCXVzaG9ydCBjb250cm9sX2ZsYWc7CS8qIE1pY3JvY29kZSBDb250cm9sIEZsYWcgKi8KKwl1c2hvcnQgbWNvZGVfZGF0ZTsJLyogTWljcm9jb2RlIGRhdGUgKi8KKwl1c2hvcnQgbWNvZGVfdmVyc2lvbjsJLyogTWljcm9jb2RlIHZlcnNpb24gKi8KKwl1c2hvcnQgcGNpX3Nsb3RfaW5mbzsJLyogaGlnaCBieXRlIGRldmljZS9mdW5jdGlvbiBudW1iZXIgKi8KKwkvKiBiaXRzIDctMyBkZXZpY2UgbnVtLiwgYml0cyAyLTAgZnVuY3Rpb24gbnVtLiAqLworCS8qIGxvdyBieXRlIGJ1cyBudW0uICovCisJdXNob3J0IHNlcmlhbDE7CQkvKiBFRVBST00gc2VyaWFsIG51bWJlciB3b3JkIDEgKi8KKwl1c2hvcnQgc2VyaWFsMjsJCS8qIEVFUFJPTSBzZXJpYWwgbnVtYmVyIHdvcmQgMiAqLworCXVzaG9ydCBzZXJpYWwzOwkJLyogRUVQUk9NIHNlcmlhbCBudW1iZXIgd29yZCAzICovCisJc3RydWN0IGRldmljZSAqZGV2OwkvKiBwb2ludGVyIHRvIHRoZSBwY2kgZGV2IHN0cnVjdHVyZSBmb3IgdGhpcyBib2FyZCAqLwogfSBBRFZfRFZDX0NGRzsKIAogc3RydWN0IGFkdl9kdmNfdmFyOwogc3RydWN0IGFkdl9zY3NpX3JlcV9xOwogCi10eXBlZGVmIHZvaWQgKCogQURWX0lTUl9DQUxMQkFDSykKLSAgICAoc3RydWN0IGFkdl9kdmNfdmFyICosIHN0cnVjdCBhZHZfc2NzaV9yZXFfcSAqKTsKK3R5cGVkZWYgdm9pZCAoKkFEVl9JU1JfQ0FMTEJBQ0spCisgKHN0cnVjdCBhZHZfZHZjX3ZhciAqLCBzdHJ1Y3QgYWR2X3Njc2lfcmVxX3EgKik7CiAKLXR5cGVkZWYgdm9pZCAoKiBBRFZfQVNZTkNfQ0FMTEJBQ0spCi0gICAgKHN0cnVjdCBhZHZfZHZjX3ZhciAqLCB1Y2hhcik7Cit0eXBlZGVmIHZvaWQgKCpBRFZfQVNZTkNfQ0FMTEJBQ0spCisgKHN0cnVjdCBhZHZfZHZjX3ZhciAqLCB1Y2hhcik7CiAKIC8qCiAgKiBBZGFwdGVyIG9wZXJhdGlvbiB2YXJpYWJsZSBzdHJ1Y3R1cmUuCkBAIC0yOTk4LDU1ICsyOTcyLDU1IEBACiAgKiAgb2YgdGhlIGZlYXR1cmUsIHRoZSBmaWVsZCBpcyBjbGVhcmVkLgogICovCiB0eXBlZGVmIHN0cnVjdCBhZHZfZHZjX3ZhciB7Ci0gIEFkdlBvcnRBZGRyIGlvcF9iYXNlOyAgIC8qIEkvTyBwb3J0IGFkZHJlc3MgKi8KLSAgdXNob3J0IGVycl9jb2RlOyAgICAgICAgLyogZmF0YWwgZXJyb3IgY29kZSAqLwotICB1c2hvcnQgYmlvc19jdHJsOyAgICAgICAvKiBCSU9TIGNvbnRyb2wgd29yZCwgRUVQUk9NIHdvcmQgMTIgKi8KLSAgQURWX0lTUl9DQUxMQkFDSyBpc3JfY2FsbGJhY2s7Ci0gIEFEVl9BU1lOQ19DQUxMQkFDSyBhc3luY19jYWxsYmFjazsKLSAgdXNob3J0IHdkdHJfYWJsZTsgICAgICAgLyogdHJ5IFdEVFIgZm9yIGEgZGV2aWNlICovCi0gIHVzaG9ydCBzZHRyX2FibGU7ICAgICAgIC8qIHRyeSBTRFRSIGZvciBhIGRldmljZSAqLwotICB1c2hvcnQgdWx0cmFfYWJsZTsgICAgICAvKiB0cnkgU0RUUiBVbHRyYSBzcGVlZCBmb3IgYSBkZXZpY2UgKi8KLSAgdXNob3J0IHNkdHJfc3BlZWQxOyAgICAgLyogRUVQUk9NIFNEVFIgU3BlZWQgZm9yIFRJRCAwLTMgICAqLwotICB1c2hvcnQgc2R0cl9zcGVlZDI7ICAgICAvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDQtNyAgICovCi0gIHVzaG9ydCBzZHRyX3NwZWVkMzsgICAgIC8qIEVFUFJPTSBTRFRSIFNwZWVkIGZvciBUSUQgOC0xMSAgKi8KLSAgdXNob3J0IHNkdHJfc3BlZWQ0OyAgICAgLyogRUVQUk9NIFNEVFIgU3BlZWQgZm9yIFRJRCAxMi0xNSAqLwotICB1c2hvcnQgdGFncW5nX2FibGU7ICAgICAvKiB0cnkgdGFnZ2VkIHF1ZXVpbmcgd2l0aCBhIGRldmljZSAqLwotICB1c2hvcnQgcHByX2FibGU7ICAgICAgICAvKiBQUFIgbWVzc2FnZSBjYXBhYmxlIHBlciBUSUQgYml0bWFzay4gKi8KLSAgdWNoYXIgIG1heF9kdmNfcW5nOyAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgdGFnZ2VkIGNvbW1hbmRzIHBlciBkZXZpY2UgKi8KLSAgdXNob3J0IHN0YXJ0X21vdG9yOyAgICAgLyogc3RhcnQgbW90b3IgY29tbWFuZCBhbGxvd2VkICovCi0gIHVjaGFyICBzY3NpX3Jlc2V0X3dhaXQ7IC8qIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgc2NzaSBidXMgcmVzZXQgKi8KLSAgdWNoYXIgIGNoaXBfbm87ICAgICAgICAgLyogc2hvdWxkIGJlIGFzc2lnbmVkIGJ5IGNhbGxlciAqLwotICB1Y2hhciAgbWF4X2hvc3RfcW5nOyAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBRJ2VkIGNvbW1hbmQgYWxsb3dlZCAqLwotICB1Y2hhciAgaXJxX25vOyAgICAgICAgICAvKiBJUlEgbnVtYmVyICovCi0gIHVzaG9ydCBub19zY2FtOyAgICAgICAgIC8qIHNjYW1fdG9sZXJhbnQgb2YgRUVQUk9NICovCi0gIHN0cnVjdCBhc2NfYm9hcmQgKmRydl9wdHI7IC8qIGRyaXZlciBwb2ludGVyIHRvIHByaXZhdGUgc3RydWN0dXJlICovCi0gIHVjaGFyICBjaGlwX3Njc2lfaWQ7ICAgIC8qIGNoaXAgU0NTSSB0YXJnZXQgSUQgKi8KLSAgdWNoYXIgIGNoaXBfdHlwZTsKLSAgdWNoYXIgIGJpc3RfZXJyX2NvZGU7Ci0gIEFEVl9DQVJSX1QgKmNhcnJpZXJfYnVmOwotICBBRFZfQ0FSUl9UICpjYXJyX2ZyZWVsaXN0OyAvKiBDYXJyaWVyIGZyZWUgbGlzdC4gKi8KLSAgQURWX0NBUlJfVCAqaWNxX3NwOyAgLyogSW5pdGlhdG9yIGNvbW1hbmQgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLwotICBBRFZfQ0FSUl9UICppcnFfc3A7ICAvKiBJbml0aWF0b3IgcmVzcG9uc2UgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLwotICB1c2hvcnQgY2Fycl9wZW5kaW5nX2NudDsgICAgLyogQ291bnQgb2YgcGVuZGluZyBjYXJyaWVycy4gKi8KLSAvKgotICAqIE5vdGU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIHdpbGwgbm90IGJlIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uIFRoZQotICAqIGRyaXZlciBtYXkgZGlzY2FyZCB0aGUgYnVmZmVyIGFmdGVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUuCi0gICovCi0gIEFEVl9EVkNfQ0ZHICpjZmc7IC8qIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAgKi8KKwlBZHZQb3J0QWRkciBpb3BfYmFzZTsJLyogSS9PIHBvcnQgYWRkcmVzcyAqLworCXVzaG9ydCBlcnJfY29kZTsJLyogZmF0YWwgZXJyb3IgY29kZSAqLworCXVzaG9ydCBiaW9zX2N0cmw7CS8qIEJJT1MgY29udHJvbCB3b3JkLCBFRVBST00gd29yZCAxMiAqLworCUFEVl9JU1JfQ0FMTEJBQ0sgaXNyX2NhbGxiYWNrOworCUFEVl9BU1lOQ19DQUxMQkFDSyBhc3luY19jYWxsYmFjazsKKwl1c2hvcnQgd2R0cl9hYmxlOwkvKiB0cnkgV0RUUiBmb3IgYSBkZXZpY2UgKi8KKwl1c2hvcnQgc2R0cl9hYmxlOwkvKiB0cnkgU0RUUiBmb3IgYSBkZXZpY2UgKi8KKwl1c2hvcnQgdWx0cmFfYWJsZTsJLyogdHJ5IFNEVFIgVWx0cmEgc3BlZWQgZm9yIGEgZGV2aWNlICovCisJdXNob3J0IHNkdHJfc3BlZWQxOwkvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDAtMyAgICovCisJdXNob3J0IHNkdHJfc3BlZWQyOwkvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDQtNyAgICovCisJdXNob3J0IHNkdHJfc3BlZWQzOwkvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDgtMTEgICovCisJdXNob3J0IHNkdHJfc3BlZWQ0OwkvKiBFRVBST00gU0RUUiBTcGVlZCBmb3IgVElEIDEyLTE1ICovCisJdXNob3J0IHRhZ3FuZ19hYmxlOwkvKiB0cnkgdGFnZ2VkIHF1ZXVpbmcgd2l0aCBhIGRldmljZSAqLworCXVzaG9ydCBwcHJfYWJsZTsJLyogUFBSIG1lc3NhZ2UgY2FwYWJsZSBwZXIgVElEIGJpdG1hc2suICovCisJdWNoYXIgbWF4X2R2Y19xbmc7CS8qIG1heGltdW0gbnVtYmVyIG9mIHRhZ2dlZCBjb21tYW5kcyBwZXIgZGV2aWNlICovCisJdXNob3J0IHN0YXJ0X21vdG9yOwkvKiBzdGFydCBtb3RvciBjb21tYW5kIGFsbG93ZWQgKi8KKwl1Y2hhciBzY3NpX3Jlc2V0X3dhaXQ7CS8qIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgc2NzaSBidXMgcmVzZXQgKi8KKwl1Y2hhciBjaGlwX25vOwkJLyogc2hvdWxkIGJlIGFzc2lnbmVkIGJ5IGNhbGxlciAqLworCXVjaGFyIG1heF9ob3N0X3FuZzsJLyogbWF4aW11bSBudW1iZXIgb2YgUSdlZCBjb21tYW5kIGFsbG93ZWQgKi8KKwl1Y2hhciBpcnFfbm87CQkvKiBJUlEgbnVtYmVyICovCisJdXNob3J0IG5vX3NjYW07CQkvKiBzY2FtX3RvbGVyYW50IG9mIEVFUFJPTSAqLworCXN0cnVjdCBhc2NfYm9hcmQgKmRydl9wdHI7CS8qIGRyaXZlciBwb2ludGVyIHRvIHByaXZhdGUgc3RydWN0dXJlICovCisJdWNoYXIgY2hpcF9zY3NpX2lkOwkvKiBjaGlwIFNDU0kgdGFyZ2V0IElEICovCisJdWNoYXIgY2hpcF90eXBlOworCXVjaGFyIGJpc3RfZXJyX2NvZGU7CisJQURWX0NBUlJfVCAqY2Fycmllcl9idWY7CisJQURWX0NBUlJfVCAqY2Fycl9mcmVlbGlzdDsJLyogQ2FycmllciBmcmVlIGxpc3QuICovCisJQURWX0NBUlJfVCAqaWNxX3NwOwkvKiBJbml0aWF0b3IgY29tbWFuZCBxdWV1ZSBzdG9wcGVyIHBvaW50ZXIuICovCisJQURWX0NBUlJfVCAqaXJxX3NwOwkvKiBJbml0aWF0b3IgcmVzcG9uc2UgcXVldWUgc3RvcHBlciBwb2ludGVyLiAqLworCXVzaG9ydCBjYXJyX3BlbmRpbmdfY250OwkvKiBDb3VudCBvZiBwZW5kaW5nIGNhcnJpZXJzLiAqLworCS8qCisJICogTm90ZTogVGhlIGZvbGxvd2luZyBmaWVsZHMgd2lsbCBub3QgYmUgdXNlZCBhZnRlciBpbml0aWFsaXphdGlvbi4gVGhlCisJICogZHJpdmVyIG1heSBkaXNjYXJkIHRoZSBidWZmZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gaXMgZG9uZS4KKwkgKi8KKwlBRFZfRFZDX0NGRyAqY2ZnOwkvKiB0ZW1wb3JhcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgICovCiB9IEFEVl9EVkNfVkFSOwogCiAjZGVmaW5lIE5PX09GX1NHX1BFUl9CTE9DSyAgICAgICAgICAgICAgMTUKIAogdHlwZWRlZiBzdHJ1Y3QgYXNjX3NnX2Jsb2NrIHsKLSAgICB1Y2hhciByZXNlcnZlZDE7Ci0gICAgdWNoYXIgcmVzZXJ2ZWQyOwotICAgIHVjaGFyIHJlc2VydmVkMzsKLSAgICB1Y2hhciBzZ19jbnQ7ICAgICAgICAgICAgICAgICAgICAgLyogVmFsaWQgZW50cmllcyBpbiBibG9jay4gKi8KLSAgICBBRFZfUEFERFIgc2dfcHRyOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IHNnIGJsb2NrLiAqLwotICAgIHN0cnVjdCAgewotICAgICAgICBBRFZfUEFERFIgc2dfYWRkcjsgICAgICAgICAgICAgICAgICAvKiBTRyBlbGVtZW50IGFkZHJlc3MuICovCi0gICAgICAgIEFEVl9EQ05UICBzZ19jb3VudDsgICAgICAgICAgICAgICAgIC8qIFNHIGVsZW1lbnQgY291bnQuICovCi0gICAgfSBzZ19saXN0W05PX09GX1NHX1BFUl9CTE9DS107CisJdWNoYXIgcmVzZXJ2ZWQxOworCXVjaGFyIHJlc2VydmVkMjsKKwl1Y2hhciByZXNlcnZlZDM7CisJdWNoYXIgc2dfY250OwkJLyogVmFsaWQgZW50cmllcyBpbiBibG9jay4gKi8KKwlBRFZfUEFERFIgc2dfcHRyOwkvKiBQb2ludGVyIHRvIG5leHQgc2cgYmxvY2suICovCisJc3RydWN0IHsKKwkJQURWX1BBRERSIHNnX2FkZHI7CS8qIFNHIGVsZW1lbnQgYWRkcmVzcy4gKi8KKwkJQURWX0RDTlQgc2dfY291bnQ7CS8qIFNHIGVsZW1lbnQgY291bnQuICovCisJfSBzZ19saXN0W05PX09GX1NHX1BFUl9CTE9DS107CiB9IEFEVl9TR19CTE9DSzsKIAogLyoKQEAgLTMwNjEsMzcgKzMwMzUsMzcgQEAKICAqIG9yZGVyLgogICovCiB0eXBlZGVmIHN0cnVjdCBhZHZfc2NzaV9yZXFfcSB7Ci0gICAgdWNoYXIgICAgICAgY250bDsgICAgICAgICAgIC8qIFVjb2RlIGZsYWdzIGFuZCBzdGF0ZSAoQVNDX01DX1FDXyopLiAqLwotICAgIHVjaGFyICAgICAgIHRhcmdldF9jbWQ7Ci0gICAgdWNoYXIgICAgICAgdGFyZ2V0X2lkOyAgICAgIC8qIERldmljZSB0YXJnZXQgaWRlbnRpZmllci4gKi8KLSAgICB1Y2hhciAgICAgICB0YXJnZXRfbHVuOyAgICAgLyogRGV2aWNlIHRhcmdldCBsb2dpY2FsIHVuaXQgbnVtYmVyLiAqLwotICAgIEFEVl9QQUREUiAgIGRhdGFfYWRkcjsgICAgICAvKiBEYXRhIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzLiAqLwotICAgIEFEVl9EQ05UICAgIGRhdGFfY250OyAgICAgICAvKiBEYXRhIGNvdW50LiBVY29kZSBzZXRzIHRvIHJlc2lkdWFsLiAqLwotICAgIEFEVl9QQUREUiAgIHNlbnNlX2FkZHI7Ci0gICAgQURWX1BBRERSICAgY2Fycl9wYTsKLSAgICB1Y2hhciAgICAgICBtZmxhZzsKLSAgICB1Y2hhciAgICAgICBzZW5zZV9sZW47Ci0gICAgdWNoYXIgICAgICAgY2RiX2xlbjsgICAgICAgIC8qIFNDU0kgQ0RCIGxlbmd0aC4gTXVzdCA8PSAxNiBieXRlcy4gKi8KLSAgICB1Y2hhciAgICAgICBzY3NpX2NudGw7Ci0gICAgdWNoYXIgICAgICAgZG9uZV9zdGF0dXM7ICAgIC8qIENvbXBsZXRpb24gc3RhdHVzLiAqLwotICAgIHVjaGFyICAgICAgIHNjc2lfc3RhdHVzOyAgICAvKiBTQ1NJIHN0YXR1cyBieXRlLiAqLwotICAgIHVjaGFyICAgICAgIGhvc3Rfc3RhdHVzOyAgICAvKiBVY29kZSBob3N0IHN0YXR1cy4gKi8KLSAgICB1Y2hhciAgICAgICBzZ193b3JraW5nX2l4OwotICAgIHVjaGFyICAgICAgIGNkYlsxMl07ICAgICAgICAvKiBTQ1NJIENEQiBieXRlcyAwLTExLiAqLwotICAgIEFEVl9QQUREUiAgIHNnX3JlYWxfYWRkcjsgICAvKiBTRyBsaXN0IHBoeXNpY2FsIGFkZHJlc3MuICovCi0gICAgQURWX1BBRERSICAgc2NzaXFfcnB0cjsKLSAgICB1Y2hhciAgICAgICBjZGIxNls0XTsgICAgICAgLyogU0NTSSBDREIgYnl0ZXMgMTItMTUuICovCi0gICAgQURWX1ZBRERSICAgc2NzaXFfcHRyOwotICAgIEFEVl9WQUREUiAgIGNhcnJfdmE7Ci0gICAgLyoKLSAgICAgKiBFbmQgb2YgbWljcm9jb2RlIHN0cnVjdHVyZSAtIDYwIGJ5dGVzLiBUaGUgcmVzdCBvZiB0aGUgc3RydWN0dXJlCi0gICAgICogaXMgdXNlZCBieSB0aGUgQWR2IExpYnJhcnkgYW5kIGlnbm9yZWQgYnkgdGhlIG1pY3JvY29kZS4KLSAgICAgKi8KLSAgICBBRFZfVkFERFIgICBzcmJfcHRyOwotICAgIEFEVl9TR19CTE9DSyAqc2dfbGlzdF9wdHI7IC8qIFNHIGxpc3QgdmlydHVhbCBhZGRyZXNzLiAqLwotICAgIGNoYXIgICAgICAgICp2ZGF0YV9hZGRyOyAgIC8qIERhdGEgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcy4gKi8KLSAgICB1Y2hhciAgICAgICBhX2ZsYWc7Ci0gICAgdWNoYXIgICAgICAgcGFkWzJdOyAgICAgICAgLyogUGFkIG91dCB0byBhIHdvcmQgYm91bmRhcnkuICovCisJdWNoYXIgY250bDsJCS8qIFVjb2RlIGZsYWdzIGFuZCBzdGF0ZSAoQVNDX01DX1FDXyopLiAqLworCXVjaGFyIHRhcmdldF9jbWQ7CisJdWNoYXIgdGFyZ2V0X2lkOwkvKiBEZXZpY2UgdGFyZ2V0IGlkZW50aWZpZXIuICovCisJdWNoYXIgdGFyZ2V0X2x1bjsJLyogRGV2aWNlIHRhcmdldCBsb2dpY2FsIHVuaXQgbnVtYmVyLiAqLworCUFEVl9QQUREUiBkYXRhX2FkZHI7CS8qIERhdGEgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJQURWX0RDTlQgZGF0YV9jbnQ7CS8qIERhdGEgY291bnQuIFVjb2RlIHNldHMgdG8gcmVzaWR1YWwuICovCisJQURWX1BBRERSIHNlbnNlX2FkZHI7CisJQURWX1BBRERSIGNhcnJfcGE7CisJdWNoYXIgbWZsYWc7CisJdWNoYXIgc2Vuc2VfbGVuOworCXVjaGFyIGNkYl9sZW47CQkvKiBTQ1NJIENEQiBsZW5ndGguIE11c3QgPD0gMTYgYnl0ZXMuICovCisJdWNoYXIgc2NzaV9jbnRsOworCXVjaGFyIGRvbmVfc3RhdHVzOwkvKiBDb21wbGV0aW9uIHN0YXR1cy4gKi8KKwl1Y2hhciBzY3NpX3N0YXR1czsJLyogU0NTSSBzdGF0dXMgYnl0ZS4gKi8KKwl1Y2hhciBob3N0X3N0YXR1czsJLyogVWNvZGUgaG9zdCBzdGF0dXMuICovCisJdWNoYXIgc2dfd29ya2luZ19peDsKKwl1Y2hhciBjZGJbMTJdOwkJLyogU0NTSSBDREIgYnl0ZXMgMC0xMS4gKi8KKwlBRFZfUEFERFIgc2dfcmVhbF9hZGRyOwkvKiBTRyBsaXN0IHBoeXNpY2FsIGFkZHJlc3MuICovCisJQURWX1BBRERSIHNjc2lxX3JwdHI7CisJdWNoYXIgY2RiMTZbNF07CQkvKiBTQ1NJIENEQiBieXRlcyAxMi0xNS4gKi8KKwlBRFZfVkFERFIgc2NzaXFfcHRyOworCUFEVl9WQUREUiBjYXJyX3ZhOworCS8qCisJICogRW5kIG9mIG1pY3JvY29kZSBzdHJ1Y3R1cmUgLSA2MCBieXRlcy4gVGhlIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZQorCSAqIGlzIHVzZWQgYnkgdGhlIEFkdiBMaWJyYXJ5IGFuZCBpZ25vcmVkIGJ5IHRoZSBtaWNyb2NvZGUuCisJICovCisJQURWX1ZBRERSIHNyYl9wdHI7CisJQURWX1NHX0JMT0NLICpzZ19saXN0X3B0cjsJLyogU0cgbGlzdCB2aXJ0dWFsIGFkZHJlc3MuICovCisJY2hhciAqdmRhdGFfYWRkcjsJLyogRGF0YSBidWZmZXIgdmlydHVhbCBhZGRyZXNzLiAqLworCXVjaGFyIGFfZmxhZzsKKwl1Y2hhciBwYWRbMl07CQkvKiBQYWQgb3V0IHRvIGEgd29yZCBib3VuZGFyeS4gKi8KIH0gQURWX1NDU0lfUkVRX1E7CiAKIC8qCkBAIC0zMTAzLDggKzMwNzcsOCBAQAogI2RlZmluZSBJRExFX0NNRF9TRU5EX0lOVCAgICAgICAgICAgIDB4MDAwNAogI2RlZmluZSBJRExFX0NNRF9BQk9SVCAgICAgICAgICAgICAgIDB4MDAwOAogI2RlZmluZSBJRExFX0NNRF9ERVZJQ0VfUkVTRVQgICAgICAgIDB4MDAxMAotI2RlZmluZSBJRExFX0NNRF9TQ1NJX1JFU0VUX1NUQVJUICAgIDB4MDAyMCAvKiBBc3NlcnQgU0NTSSBCdXMgUmVzZXQgKi8KLSNkZWZpbmUgSURMRV9DTURfU0NTSV9SRVNFVF9FTkQgICAgICAweDAwNDAgLyogRGVhc3NlcnQgU0NTSSBCdXMgUmVzZXQgKi8KKyNkZWZpbmUgSURMRV9DTURfU0NTSV9SRVNFVF9TVEFSVCAgICAweDAwMjAJLyogQXNzZXJ0IFNDU0kgQnVzIFJlc2V0ICovCisjZGVmaW5lIElETEVfQ01EX1NDU0lfUkVTRVRfRU5EICAgICAgMHgwMDQwCS8qIERlYXNzZXJ0IFNDU0kgQnVzIFJlc2V0ICovCiAjZGVmaW5lIElETEVfQ01EX1NDU0lSRVEgICAgICAgICAgICAgMHgwMDgwCiAKICNkZWZpbmUgSURMRV9DTURfU1RBVFVTX1NVQ0NFU1MgICAgICAweDAwMDEKQEAgLTMxMTgsNjAgKzMwOTIsNTkgQEAKIC8qCiAgKiBXYWl0IGxvb3AgdGltZSBvdXQgdmFsdWVzLgogICovCi0jZGVmaW5lIFNDU0lfV0FJVF8xMF9TRUMgICAgICAgICAgICAgMTBVTCAgICAvKiAxMCBzZWNvbmRzICovCi0jZGVmaW5lIFNDU0lfV0FJVF8xMDBfTVNFQyAgICAgICAgICAgMTAwVUwgICAvKiAxMDAgbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIFNDU0lfVVNfUEVSX01TRUMgICAgICAgICAgICAgMTAwMCAgICAvKiBtaWNyb3NlY29uZHMgcGVyIG1pbGxpc2Vjb25kICovCi0jZGVmaW5lIFNDU0lfTVNfUEVSX1NFQyAgICAgICAgICAgICAgMTAwMFVMICAvKiBtaWxsaXNlY29uZHMgcGVyIHNlY29uZCAqLwotI2RlZmluZSBTQ1NJX01BWF9SRVRSWSAgICAgICAgICAgICAgIDEwICAgICAgLyogcmV0cnkgY291bnQgKi8KKyNkZWZpbmUgU0NTSV9XQUlUXzEwX1NFQyAgICAgICAgICAgICAxMFVMCS8qIDEwIHNlY29uZHMgKi8KKyNkZWZpbmUgU0NTSV9XQUlUXzEwMF9NU0VDICAgICAgICAgICAxMDBVTAkvKiAxMDAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFNDU0lfVVNfUEVSX01TRUMgICAgICAgICAgICAgMTAwMAkvKiBtaWNyb3NlY29uZHMgcGVyIG1pbGxpc2Vjb25kICovCisjZGVmaW5lIFNDU0lfTVNfUEVSX1NFQyAgICAgICAgICAgICAgMTAwMFVMCS8qIG1pbGxpc2Vjb25kcyBwZXIgc2Vjb25kICovCisjZGVmaW5lIFNDU0lfTUFYX1JFVFJZICAgICAgICAgICAgICAgMTAJLyogcmV0cnkgY291bnQgKi8KIAotI2RlZmluZSBBRFZfQVNZTkNfUkRNQV9GQUlMVVJFICAgICAgICAgIDB4MDEgLyogRmF0YWwgUkRNQSBmYWlsdXJlLiAqLwotI2RlZmluZSBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUICAgIDB4MDIgLyogRGV0ZWN0ZWQgU0NTSSBCdXMgUmVzZXQuICovCi0jZGVmaW5lIEFEVl9BU1lOQ19DQVJSSUVSX1JFQURZX0ZBSUxVUkUgMHgwMyAvKiBDYXJyaWVyIFJlYWR5IGZhaWx1cmUuICovCi0jZGVmaW5lIEFEVl9SRE1BX0lOX0NBUlJfQU5EX1FfSU5WQUxJRCAgMHgwNCAvKiBSRE1BZWQtaW4gZGF0YSBpbnZhbGlkLiAqLworI2RlZmluZSBBRFZfQVNZTkNfUkRNQV9GQUlMVVJFICAgICAgICAgIDB4MDEJLyogRmF0YWwgUkRNQSBmYWlsdXJlLiAqLworI2RlZmluZSBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUICAgIDB4MDIJLyogRGV0ZWN0ZWQgU0NTSSBCdXMgUmVzZXQuICovCisjZGVmaW5lIEFEVl9BU1lOQ19DQVJSSUVSX1JFQURZX0ZBSUxVUkUgMHgwMwkvKiBDYXJyaWVyIFJlYWR5IGZhaWx1cmUuICovCisjZGVmaW5lIEFEVl9SRE1BX0lOX0NBUlJfQU5EX1FfSU5WQUxJRCAgMHgwNAkvKiBSRE1BZWQtaW4gZGF0YSBpbnZhbGlkLiAqLwogCi0KLSNkZWZpbmUgQURWX0hPU1RfU0NTSV9CVVNfUkVTRVQgICAgICAweDgwIC8qIEhvc3QgSW5pdGlhdGVkIFNDU0kgQnVzIFJlc2V0LiAqLworI2RlZmluZSBBRFZfSE9TVF9TQ1NJX0JVU19SRVNFVCAgICAgIDB4ODAJLyogSG9zdCBJbml0aWF0ZWQgU0NTSSBCdXMgUmVzZXQuICovCiAKIC8qCiAgKiBEZXZpY2UgZHJpdmVycyBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4KICAqLwotU1RBVElDIGlubGluZSB1bG9uZyBEdmNFbnRlckNyaXRpY2FsKHZvaWQpOwotU1RBVElDIGlubGluZSB2b2lkICBEdmNMZWF2ZUNyaXRpY2FsKHVsb25nKTsKLVNUQVRJQyB2b2lkICBEdmNTbGVlcE1pbGxpU2Vjb25kKEFEVl9EQ05UKTsKLVNUQVRJQyB1Y2hhciBEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShBRFZfRFZDX1ZBUiAqLCB1c2hvcnQpOwotU1RBVElDIHZvaWQgIER2Y0FkdldyaXRlUENJQ29uZmlnQnl0ZShBRFZfRFZDX1ZBUiAqLCB1c2hvcnQsIHVjaGFyKTsKLVNUQVRJQyBBRFZfUEFERFIgRHZjR2V0UGh5QWRkcihBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqLAotICAgICAgICAgICAgICAgIHVjaGFyICosIEFTQ19TRENOVCAqLCBpbnQpOwotU1RBVElDIHZvaWQgIER2Y0RlbGF5TWljcm9TZWNvbmQoQURWX0RWQ19WQVIgKiwgdXNob3J0KTsKK3N0YXRpYyBpbmxpbmUgdWxvbmcgRHZjRW50ZXJDcml0aWNhbCh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBEdmNMZWF2ZUNyaXRpY2FsKHVsb25nKTsKK3N0YXRpYyB2b2lkIER2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0RDTlQpOworc3RhdGljIHVjaGFyIER2Y0FkdlJlYWRQQ0lDb25maWdCeXRlKEFEVl9EVkNfVkFSICosIHVzaG9ydCk7CitzdGF0aWMgdm9pZCBEdmNBZHZXcml0ZVBDSUNvbmZpZ0J5dGUoQURWX0RWQ19WQVIgKiwgdXNob3J0LCB1Y2hhcik7CitzdGF0aWMgQURWX1BBRERSIER2Y0dldFBoeUFkZHIoQURWX0RWQ19WQVIgKiwgQURWX1NDU0lfUkVRX1EgKiwKKwkJCSAgICAgICB1Y2hhciAqLCBBU0NfU0RDTlQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIER2Y0RlbGF5TWljcm9TZWNvbmQoQURWX0RWQ19WQVIgKiwgdXNob3J0KTsKIAogLyoKICAqIEFkdiBMaWJyYXJ5IGZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gZHJpdmVycy4KICAqLwotU1RBVElDIGludCAgICAgQWR2RXhlU2NzaVF1ZXVlKEFEVl9EVkNfVkFSICosIEFEVl9TQ1NJX1JFUV9RICopOwotU1RBVElDIGludCAgICAgQWR2SVNSKEFEVl9EVkNfVkFSICopOwotU1RBVElDIGludCAgICAgQWR2SW5pdEdldENvbmZpZyhBRFZfRFZDX1ZBUiAqKTsKLVNUQVRJQyBpbnQgICAgIEFkdkluaXRBc2MzNTUwRHJpdmVyKEFEVl9EVkNfVkFSICopOwotU1RBVElDIGludCAgICAgQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoQURWX0RWQ19WQVIgKik7Ci1TVEFUSUMgaW50ICAgICBBZHZJbml0QXNjMzhDMTYwMERyaXZlcihBRFZfRFZDX1ZBUiAqKTsKLVNUQVRJQyBpbnQgICAgIEFkdlJlc2V0Q2hpcEFuZFNCKEFEVl9EVkNfVkFSICopOwotU1RBVElDIGludCAgICAgQWR2UmVzZXRTQihBRFZfRFZDX1ZBUiAqYXNjX2R2Yyk7CitzdGF0aWMgaW50IEFkdkV4ZVNjc2lRdWV1ZShBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKK3N0YXRpYyBpbnQgQWR2SVNSKEFEVl9EVkNfVkFSICopOworc3RhdGljIGludCBBZHZJbml0R2V0Q29uZmlnKEFEVl9EVkNfVkFSICopOworc3RhdGljIGludCBBZHZJbml0QXNjMzU1MERyaXZlcihBRFZfRFZDX1ZBUiAqKTsKK3N0YXRpYyBpbnQgQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoQURWX0RWQ19WQVIgKik7CitzdGF0aWMgaW50IEFkdkluaXRBc2MzOEMxNjAwRHJpdmVyKEFEVl9EVkNfVkFSICopOworc3RhdGljIGludCBBZHZSZXNldENoaXBBbmRTQihBRFZfRFZDX1ZBUiAqKTsKK3N0YXRpYyBpbnQgQWR2UmVzZXRTQihBRFZfRFZDX1ZBUiAqYXNjX2R2Yyk7CiAKIC8qCiAgKiBJbnRlcm5hbCBBZHYgTGlicmFyeSBmdW5jdGlvbnMuCiAgKi8KLVNUQVRJQyBpbnQgICAgQWR2U2VuZElkbGVDbWQoQURWX0RWQ19WQVIgKiwgdXNob3J0LCBBRFZfRENOVCk7Ci1TVEFUSUMgdm9pZCAgIEFkdklucXVpcnlIYW5kbGluZyhBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKLVNUQVRJQyBpbnQgICAgQWR2SW5pdEZyb20zNTUwRUVQKEFEVl9EVkNfVkFSICopOwotU1RBVElDIGludCAgICBBZHZJbml0RnJvbTM4QzA4MDBFRVAoQURWX0RWQ19WQVIgKik7Ci1TVEFUSUMgaW50ICAgIEFkdkluaXRGcm9tMzhDMTYwMEVFUChBRFZfRFZDX1ZBUiAqKTsKLVNUQVRJQyB1c2hvcnQgQWR2R2V0MzU1MEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM1NTBfQ09ORklHICopOwotU1RBVElDIHZvaWQgICBBZHZTZXQzNTUwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzU1MF9DT05GSUcgKik7Ci1TVEFUSUMgdXNob3J0IEFkdkdldDM4QzA4MDBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAqKTsKLVNUQVRJQyB2b2lkICAgQWR2U2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM4QzA4MDBfQ09ORklHICopOwotU1RBVElDIHVzaG9ydCBBZHZHZXQzOEMxNjAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMTYwMF9DT05GSUcgKik7Ci1TVEFUSUMgdm9pZCAgIEFkdlNldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqKTsKLVNUQVRJQyB2b2lkICAgQWR2V2FpdEVFUENtZChBZHZQb3J0QWRkcik7Ci1TVEFUSUMgdXNob3J0IEFkdlJlYWRFRVBXb3JkKEFkdlBvcnRBZGRyLCBpbnQpOworc3RhdGljIGludCBBZHZTZW5kSWRsZUNtZChBRFZfRFZDX1ZBUiAqLCB1c2hvcnQsIEFEVl9EQ05UKTsKK3N0YXRpYyB2b2lkIEFkdklucXVpcnlIYW5kbGluZyhBRFZfRFZDX1ZBUiAqLCBBRFZfU0NTSV9SRVFfUSAqKTsKK3N0YXRpYyBpbnQgQWR2SW5pdEZyb20zNTUwRUVQKEFEVl9EVkNfVkFSICopOworc3RhdGljIGludCBBZHZJbml0RnJvbTM4QzA4MDBFRVAoQURWX0RWQ19WQVIgKik7CitzdGF0aWMgaW50IEFkdkluaXRGcm9tMzhDMTYwMEVFUChBRFZfRFZDX1ZBUiAqKTsKK3N0YXRpYyB1c2hvcnQgQWR2R2V0MzU1MEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM1NTBfQ09ORklHICopOworc3RhdGljIHZvaWQgQWR2U2V0MzU1MEVFUENvbmZpZyhBZHZQb3J0QWRkciwgQURWRUVQXzM1NTBfQ09ORklHICopOworc3RhdGljIHVzaG9ydCBBZHZHZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKik7CitzdGF0aWMgdm9pZCBBZHZTZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyLCBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKik7CitzdGF0aWMgdXNob3J0IEFkdkdldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqKTsKK3N0YXRpYyB2b2lkIEFkdlNldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIsIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqKTsKK3N0YXRpYyB2b2lkIEFkdldhaXRFRVBDbWQoQWR2UG9ydEFkZHIpOworc3RhdGljIHVzaG9ydCBBZHZSZWFkRUVQV29yZChBZHZQb3J0QWRkciwgaW50KTsKIAogLyoKICAqIFBDSSBCdXMgRGVmaW5pdGlvbnMKQEAgLTMyNDEsNyArMzIxNCw2IEBACiAjZGVmaW5lIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCB3b3JkKSBcCiAgICAgIChBRFZfTUVNX1dSSVRFVygoaW9wX2Jhc2UpICsgSU9QV19SQU1fREFUQSwgKHdvcmQpKSkKIAotCiAvKgogICogRGVmaW5lIG1hY3JvIHRvIGNoZWNrIGZvciBDb25kb3Igc2lnbmF0dXJlLgogICoKQEAgLTMzMTMsNyArMzI4NSw3IEBACiAgKiBBU0NfU0NTSV9SRVFfUSAnZG9uZV9zdGF0dXMnIGFuZCAnaG9zdF9zdGF0dXMnIHJldHVybiB2YWx1ZXMuCiAgKi8KIAotI2RlZmluZSBRRF9OT19TVEFUVVMgICAgICAgICAweDAwICAgICAgIC8qIFJlcXVlc3Qgbm90IGNvbXBsZXRlZCB5ZXQuICovCisjZGVmaW5lIFFEX05PX1NUQVRVUyAgICAgICAgIDB4MDAJLyogUmVxdWVzdCBub3QgY29tcGxldGVkIHlldC4gKi8KICNkZWZpbmUgUURfTk9fRVJST1IgICAgICAgICAgMHgwMQogI2RlZmluZSBRRF9BQk9SVEVEX0JZX0hPU1QgICAweDAyCiAjZGVmaW5lIFFEX1dJVEhfRVJST1IgICAgICAgIDB4MDQKQEAgLTMzMjMsMzAgKzMyOTUsMjkgQEAKICNkZWZpbmUgUUhTVEFfTV9EQVRBX09WRVJfUlVOICAgICAgIDB4MTIKICNkZWZpbmUgUUhTVEFfTV9VTkVYUEVDVEVEX0JVU19GUkVFIDB4MTMKICNkZWZpbmUgUUhTVEFfTV9RVUVVRV9BQk9SVEVEICAgICAgIDB4MTUKLSNkZWZpbmUgUUhTVEFfTV9TWEZSX1NETUFfRVJSICAgICAgIDB4MTYgLyogU1hGUl9TVEFUVVMgU0NTSSBETUEgRXJyb3IgKi8KLSNkZWZpbmUgUUhTVEFfTV9TWEZSX1NYRlJfUEVSUiAgICAgIDB4MTcgLyogU1hGUl9TVEFUVVMgU0NTSSBCdXMgUGFyaXR5IEVycm9yICovCi0jZGVmaW5lIFFIU1RBX01fUkRNQV9QRVJSICAgICAgICAgICAweDE4IC8qIFJJU0MgUENJIERNQSBwYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgUUhTVEFfTV9TWEZSX09GRl9VRkxXICAgICAgIDB4MTkgLyogU1hGUl9TVEFUVVMgT2Zmc2V0IFVuZGVyZmxvdyAqLwotI2RlZmluZSBRSFNUQV9NX1NYRlJfT0ZGX09GTFcgICAgICAgMHgyMCAvKiBTWEZSX1NUQVRVUyBPZmZzZXQgT3ZlcmZsb3cgKi8KLSNkZWZpbmUgUUhTVEFfTV9TWEZSX1dEX1RNTyAgICAgICAgIDB4MjEgLyogU1hGUl9TVEFUVVMgV2F0Y2hkb2cgVGltZW91dCAqLwotI2RlZmluZSBRSFNUQV9NX1NYRlJfREVTRUxFQ1RFRCAgICAgMHgyMiAvKiBTWEZSX1NUQVRVUyBEZXNlbGVjdGVkICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9TRE1BX0VSUiAgICAgICAweDE2CS8qIFNYRlJfU1RBVFVTIFNDU0kgRE1BIEVycm9yICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9TWEZSX1BFUlIgICAgICAweDE3CS8qIFNYRlJfU1RBVFVTIFNDU0kgQnVzIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBRSFNUQV9NX1JETUFfUEVSUiAgICAgICAgICAgMHgxOAkvKiBSSVNDIFBDSSBETUEgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9PRkZfVUZMVyAgICAgICAweDE5CS8qIFNYRlJfU1RBVFVTIE9mZnNldCBVbmRlcmZsb3cgKi8KKyNkZWZpbmUgUUhTVEFfTV9TWEZSX09GRl9PRkxXICAgICAgIDB4MjAJLyogU1hGUl9TVEFUVVMgT2Zmc2V0IE92ZXJmbG93ICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9XRF9UTU8gICAgICAgICAweDIxCS8qIFNYRlJfU1RBVFVTIFdhdGNoZG9nIFRpbWVvdXQgKi8KKyNkZWZpbmUgUUhTVEFfTV9TWEZSX0RFU0VMRUNURUQgICAgIDB4MjIJLyogU1hGUl9TVEFUVVMgRGVzZWxlY3RlZCAqLwogLyogTm90ZTogUUhTVEFfTV9TWEZSX1hGUl9PRkxXIGlzIGlkZW50aWNhbCB0byBRSFNUQV9NX0RBVEFfT1ZFUl9SVU4uICovCi0jZGVmaW5lIFFIU1RBX01fU1hGUl9YRlJfT0ZMVyAgICAgICAweDEyIC8qIFNYRlJfU1RBVFVTIFRyYW5zZmVyIE92ZXJmbG93ICovCi0jZGVmaW5lIFFIU1RBX01fU1hGUl9YRlJfUEhfRVJSICAgICAweDI0IC8qIFNYRlJfU1RBVFVTIFRyYW5zZmVyIFBoYXNlIEVycm9yICovCi0jZGVmaW5lIFFIU1RBX01fU1hGUl9VTktOT1dOX0VSUk9SICAweDI1IC8qIFNYRlJfU1RBVFVTIFVua25vd24gRXJyb3IgKi8KLSNkZWZpbmUgUUhTVEFfTV9TQ1NJX0JVU19SRVNFVCAgICAgIDB4MzAgLyogUmVxdWVzdCBhYm9ydGVkIGZyb20gU0JSICovCi0jZGVmaW5lIFFIU1RBX01fU0NTSV9CVVNfUkVTRVRfVU5TT0wgMHgzMSAvKiBSZXF1ZXN0IGFib3J0ZWQgZnJvbSB1bnNvbC4gU0JSICovCi0jZGVmaW5lIFFIU1RBX01fQlVTX0RFVklDRV9SRVNFVCAgICAweDMyIC8qIFJlcXVlc3QgYWJvcnRlZCBmcm9tIEJEUiAqLwotI2RlZmluZSBRSFNUQV9NX0RJUkVDVElPTl9FUlIgICAgICAgMHgzNSAvKiBEYXRhIFBoYXNlIG1pc21hdGNoICovCi0jZGVmaW5lIFFIU1RBX01fRElSRUNUSU9OX0VSUl9IVU5HICAweDM2IC8qIERhdGEgUGhhc2UgbWlzbWF0Y2ggYW5kIGJ1cyBoYW5nICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9YRlJfT0ZMVyAgICAgICAweDEyCS8qIFNYRlJfU1RBVFVTIFRyYW5zZmVyIE92ZXJmbG93ICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9YRlJfUEhfRVJSICAgICAweDI0CS8qIFNYRlJfU1RBVFVTIFRyYW5zZmVyIFBoYXNlIEVycm9yICovCisjZGVmaW5lIFFIU1RBX01fU1hGUl9VTktOT1dOX0VSUk9SICAweDI1CS8qIFNYRlJfU1RBVFVTIFVua25vd24gRXJyb3IgKi8KKyNkZWZpbmUgUUhTVEFfTV9TQ1NJX0JVU19SRVNFVCAgICAgIDB4MzAJLyogUmVxdWVzdCBhYm9ydGVkIGZyb20gU0JSICovCisjZGVmaW5lIFFIU1RBX01fU0NTSV9CVVNfUkVTRVRfVU5TT0wgMHgzMQkvKiBSZXF1ZXN0IGFib3J0ZWQgZnJvbSB1bnNvbC4gU0JSICovCisjZGVmaW5lIFFIU1RBX01fQlVTX0RFVklDRV9SRVNFVCAgICAweDMyCS8qIFJlcXVlc3QgYWJvcnRlZCBmcm9tIEJEUiAqLworI2RlZmluZSBRSFNUQV9NX0RJUkVDVElPTl9FUlIgICAgICAgMHgzNQkvKiBEYXRhIFBoYXNlIG1pc21hdGNoICovCisjZGVmaW5lIFFIU1RBX01fRElSRUNUSU9OX0VSUl9IVU5HICAweDM2CS8qIERhdGEgUGhhc2UgbWlzbWF0Y2ggYW5kIGJ1cyBoYW5nICovCiAjZGVmaW5lIFFIU1RBX01fV1RNX1RJTUVPVVQgICAgICAgICAweDQxCiAjZGVmaW5lIFFIU1RBX01fQkFEX0NNUExfU1RBVFVTX0lOICAweDQyCiAjZGVmaW5lIFFIU1RBX01fTk9fQVVUT19SRVFfU0VOU0UgICAweDQzCiAjZGVmaW5lIFFIU1RBX01fQVVUT19SRVFfU0VOU0VfRkFJTCAweDQ0Ci0jZGVmaW5lIFFIU1RBX01fSU5WQUxJRF9ERVZJQ0UgICAgICAweDQ1IC8qIEJhZCB0YXJnZXQgSUQgKi8KLSNkZWZpbmUgUUhTVEFfTV9GUk9aRU5fVElEUSAgICAgICAgIDB4NDYgLyogVElEIFF1ZXVlIGZyb3plbi4gKi8KLSNkZWZpbmUgUUhTVEFfTV9TR0JBQ0tVUF9FUlJPUiAgICAgIDB4NDcgLyogU2NhdHRlci1HYXRoZXIgYmFja3VwIGVycm9yICovCi0KKyNkZWZpbmUgUUhTVEFfTV9JTlZBTElEX0RFVklDRSAgICAgIDB4NDUJLyogQmFkIHRhcmdldCBJRCAqLworI2RlZmluZSBRSFNUQV9NX0ZST1pFTl9USURRICAgICAgICAgMHg0NgkvKiBUSUQgUXVldWUgZnJvemVuLiAqLworI2RlZmluZSBRSFNUQV9NX1NHQkFDS1VQX0VSUk9SICAgICAgMHg0NwkvKiBTY2F0dGVyLUdhdGhlciBiYWNrdXAgZXJyb3IgKi8KIAogLyoKICAqIERlZmF1bHQgRUVQUk9NIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGRlZmluZWQgaW4gYV9pbml0LmMuCkBAIC0zMzU4LDEyICszMzI5LDEyIEBACiAvKgogICogRHZjR2V0UGh5QWRkcigpIGZsYWcgYXJndW1lbnRzCiAgKi8KLSNkZWZpbmUgQURWX0lTX1NDU0lRX0ZMQUcgICAgICAgMHgwMSAvKiAnYWRkcicgaXMgQVNDX1NDU0lfUkVRX1EgcG9pbnRlciAqLwotI2RlZmluZSBBRFZfQVNDR0VUU0dMSVNUX1ZBRERSICAweDAyIC8qICdhZGRyJyBpcyBBc2NHZXRTR0xpc3QoKSB2aXJ0dWFsIGFkZHIgKi8KLSNkZWZpbmUgQURWX0lTX1NFTlNFX0ZMQUcgICAgICAgMHgwNCAvKiAnYWRkcicgaXMgc2Vuc2UgdmlydHVhbCBwb2ludGVyICovCi0jZGVmaW5lIEFEVl9JU19EQVRBX0ZMQUcgICAgICAgIDB4MDggLyogJ2FkZHInIGlzIGRhdGEgdmlydHVhbCBwb2ludGVyICovCi0jZGVmaW5lIEFEVl9JU19TR0xJU1RfRkxBRyAgICAgIDB4MTAgLyogJ2FkZHInIGlzIHNnbGlzdCB2aXJ0dWFsIHBvaW50ZXIgKi8KLSNkZWZpbmUgQURWX0lTX0NBUlJJRVJfRkxBRyAgICAgMHgyMCAvKiAnYWRkcicgaXMgQURWX0NBUlJfVCBwb2ludGVyICovCisjZGVmaW5lIEFEVl9JU19TQ1NJUV9GTEFHICAgICAgIDB4MDEJLyogJ2FkZHInIGlzIEFTQ19TQ1NJX1JFUV9RIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURWX0FTQ0dFVFNHTElTVF9WQUREUiAgMHgwMgkvKiAnYWRkcicgaXMgQXNjR2V0U0dMaXN0KCkgdmlydHVhbCBhZGRyICovCisjZGVmaW5lIEFEVl9JU19TRU5TRV9GTEFHICAgICAgIDB4MDQJLyogJ2FkZHInIGlzIHNlbnNlIHZpcnR1YWwgcG9pbnRlciAqLworI2RlZmluZSBBRFZfSVNfREFUQV9GTEFHICAgICAgICAweDA4CS8qICdhZGRyJyBpcyBkYXRhIHZpcnR1YWwgcG9pbnRlciAqLworI2RlZmluZSBBRFZfSVNfU0dMSVNUX0ZMQUcgICAgICAweDEwCS8qICdhZGRyJyBpcyBzZ2xpc3QgdmlydHVhbCBwb2ludGVyICovCisjZGVmaW5lIEFEVl9JU19DQVJSSUVSX0ZMQUcgICAgIDB4MjAJLyogJ2FkZHInIGlzIEFEVl9DQVJSX1QgcG9pbnRlciAqLwogCiAvKiBSZXR1cm4gdGhlIGFkZHJlc3MgdGhhdCBpcyBhbGlnbmVkIGF0IHRoZSBuZXh0IGRvdWJsZXdvcmQgPj0gdG8gJ2FkZHInLiAqLwogI2RlZmluZSBBRFZfOEJBTElHTihhZGRyKSAgICAgICgoKHVsb25nKSAoYWRkcikgKyAweDcpICYgfjB4NykKQEAgLTM0MTMsNDMgKzMzODQsNDIgQEAKICNkZWZpbmUgQURWX0lOUV9DTE9DS0lORyhpbnEpICAgICAgICgoKGlucSktPmluZm8gJiAweDBjKSA+PiAyKQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIHVjaGFyIHBlcmlwaDsgICAgICAgICAgICAgICAgIC8qIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgWzA6NF0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyaXBoZXJhbCBxdWFsaWZpZXIgWzU6N10gKi8KLSAgdWNoYXIgZGV2dHlwZTsgICAgICAgICAgICAgICAgLyogZGV2aWNlIHR5cGUgbW9kaWZpZXIgKGZvciBTQ1NJIEkpIFswOjZdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJNQiAtIHJlbW92YWJsZSBtZWRpdW0gYml0IFs3XSAqLwotICB1Y2hhciB2ZXI7ICAgICAgICAgICAgICAgICAgICAvKiBBTlNJIGFwcHJvdmVkIHZlcnNpb24gWzA6Ml0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUNNQSB2ZXJzaW9uIFszOjVdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElTTyB2ZXJzaW9uIFs2OjddICovCi0gIHVjaGFyIGJ5dGUzOyAgICAgICAgICAgICAgICAgIC8qIHJlc3BvbnNlIGRhdGEgZm9ybWF0IFswOjNdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgU0NTSSAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgQ0NTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgU0NTSS0yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMtRiByZXNlcnZlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCBbNDo1XSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgSS9PIHByb2Nlc3MgYml0IChzZWUgNS42LjIyKSBbNl0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXN5bmNoLiBldmVudCBub3RpZmljYXRpb24gKHByb2Nlc3NvcikgWzddICovCi0gIHVjaGFyIGFkZF9sZW47ICAgICAgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgbGVuZ3RoICovCi0gIHVjaGFyIHJlczE7ICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCi0gIHVjaGFyIHJlczI7ICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkICovCi0gIHVjaGFyIGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIHNvZnQgcmVzZXQgaW1wbGVtZW50ZWQgWzBdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgcXVldWluZyBbMV0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgWzJdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbmtlZCBjb21tYW5kIGZvciB0aGlzIGxvZ2ljYWwgdW5pdCBbM10gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBbNF0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2lkZSBidXMgMTYgYml0IGRhdGEgdHJhbnNmZXIgWzVdICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpZGUgYnVzIDMyIGJpdCBkYXRhIHRyYW5zZmVyIFs2XSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUgWzddICovCi0gIHVjaGFyIHZlbmRvcl9pZFs4XTsgICAgICAgICAgIC8qIHZlbmRvciBpZGVudGlmaWNhdGlvbiAqLwotICB1Y2hhciBwcm9kdWN0X2lkWzE2XTsgICAgICAgICAvKiBwcm9kdWN0IGlkZW50aWZpY2F0aW9uICovCi0gIHVjaGFyIHByb2R1Y3RfcmV2X2xldmVsWzRdOyAgIC8qIHByb2R1Y3QgcmV2aXNpb24gbGV2ZWwgKi8KLSAgdWNoYXIgdmVuZG9yX3NwZWNpZmljWzIwXTsgICAgLyogdmVuZG9yIHNwZWNpZmljICovCi0gIHVjaGFyIGluZm87ICAgICAgICAgICAgICAgICAgIC8qIGluZm9ybWF0aW9uIHVuaXQgc3VwcG9ydGVkIFswXSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWljayBhcmJpdHJhdGUgc3VwcG9ydGVkIFsxXSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbG9ja2luZyBmaWVsZCBbMjozXSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCBbNDo3XSAqLwotICB1Y2hhciByZXMzOyAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLwotfSBBRFZfU0NTSV9JTlFVSVJZOyAvKiA1OCBieXRlcyAqLwotCisJdWNoYXIgcGVyaXBoOwkJLyogcGVyaXBoZXJhbCBkZXZpY2UgdHlwZSBbMDo0XSAqLworCS8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyIFs1OjddICovCisJdWNoYXIgZGV2dHlwZTsJCS8qIGRldmljZSB0eXBlIG1vZGlmaWVyIChmb3IgU0NTSSBJKSBbMDo2XSAqLworCS8qIFJNQiAtIHJlbW92YWJsZSBtZWRpdW0gYml0IFs3XSAqLworCXVjaGFyIHZlcjsJCS8qIEFOU0kgYXBwcm92ZWQgdmVyc2lvbiBbMDoyXSAqLworCS8qIEVDTUEgdmVyc2lvbiBbMzo1XSAqLworCS8qIElTTyB2ZXJzaW9uIFs2OjddICovCisJdWNoYXIgYnl0ZTM7CQkvKiByZXNwb25zZSBkYXRhIGZvcm1hdCBbMDozXSAqLworCS8qIDAgU0NTSSAxICovCisJLyogMSBDQ1MgKi8KKwkvKiAyIFNDU0ktMiAqLworCS8qIDMtRiByZXNlcnZlZCAqLworCS8qIHJlc2VydmVkIFs0OjVdICovCisJLyogdGVybWluYXRlIEkvTyBwcm9jZXNzIGJpdCAoc2VlIDUuNi4yMikgWzZdICovCisJLyogYXN5bmNoLiBldmVudCBub3RpZmljYXRpb24gKHByb2Nlc3NvcikgWzddICovCisJdWNoYXIgYWRkX2xlbjsJCS8qIGFkZGl0aW9uYWwgbGVuZ3RoICovCisJdWNoYXIgcmVzMTsJCS8qIHJlc2VydmVkICovCisJdWNoYXIgcmVzMjsJCS8qIHJlc2VydmVkICovCisJdWNoYXIgZmxhZ3M7CQkvKiBzb2Z0IHJlc2V0IGltcGxlbWVudGVkIFswXSAqLworCS8qIGNvbW1hbmQgcXVldWluZyBbMV0gKi8KKwkvKiByZXNlcnZlZCBbMl0gKi8KKwkvKiBsaW5rZWQgY29tbWFuZCBmb3IgdGhpcyBsb2dpY2FsIHVuaXQgWzNdICovCisJLyogc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBbNF0gKi8KKwkvKiB3aWRlIGJ1cyAxNiBiaXQgZGF0YSB0cmFuc2ZlciBbNV0gKi8KKwkvKiB3aWRlIGJ1cyAzMiBiaXQgZGF0YSB0cmFuc2ZlciBbNl0gKi8KKwkvKiByZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUgWzddICovCisJdWNoYXIgdmVuZG9yX2lkWzhdOwkvKiB2ZW5kb3IgaWRlbnRpZmljYXRpb24gKi8KKwl1Y2hhciBwcm9kdWN0X2lkWzE2XTsJLyogcHJvZHVjdCBpZGVudGlmaWNhdGlvbiAqLworCXVjaGFyIHByb2R1Y3RfcmV2X2xldmVsWzRdOwkvKiBwcm9kdWN0IHJldmlzaW9uIGxldmVsICovCisJdWNoYXIgdmVuZG9yX3NwZWNpZmljWzIwXTsJLyogdmVuZG9yIHNwZWNpZmljICovCisJdWNoYXIgaW5mbzsJCS8qIGluZm9ybWF0aW9uIHVuaXQgc3VwcG9ydGVkIFswXSAqLworCS8qIHF1aWNrIGFyYml0cmF0ZSBzdXBwb3J0ZWQgWzFdICovCisJLyogY2xvY2tpbmcgZmllbGQgWzI6M10gKi8KKwkvKiByZXNlcnZlZCBbNDo3XSAqLworCXVjaGFyIHJlczM7CQkvKiByZXNlcnZlZCAqLworfSBBRFZfU0NTSV9JTlFVSVJZOwkJLyogNTggYnl0ZXMgKi8KIAogLyoKICAqIC0tLSBEcml2ZXIgQ29uc3RhbnRzIGFuZCBNYWNyb3MKQEAgLTM0NjQsMTUgKzM0MzQsMTUgQEAKIAogLyogYXNjX2JvYXJkX3QgZmxhZ3MgKi8KICNkZWZpbmUgQVNDX0hPU1RfSU5fUkVTRVQgICAgICAgMHgwMQotI2RlZmluZSBBU0NfSVNfV0lERV9CT0FSRCAgICAgICAweDA0ICAgIC8qIEFkdmFuU3lzIFdpZGUgQm9hcmQgKi8KKyNkZWZpbmUgQVNDX0lTX1dJREVfQk9BUkQgICAgICAgMHgwNAkvKiBBZHZhblN5cyBXaWRlIEJvYXJkICovCiAjZGVmaW5lIEFTQ19TRUxFQ1RfUVVFVUVfREVQVEhTIDB4MDgKIAogI2RlZmluZSBBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkgKCgoYm9hcmRwKS0+ZmxhZ3MgJiBBU0NfSVNfV0lERV9CT0FSRCkgPT0gMCkKICNkZWZpbmUgQVNDX1dJREVfQk9BUkQoYm9hcmRwKSAgICgoYm9hcmRwKS0+ZmxhZ3MgJiBBU0NfSVNfV0lERV9CT0FSRCkKIAotI2RlZmluZSBOT19JU0FfRE1BICAgICAgICAgICAgICAweGZmICAgICAgICAvKiBObyBJU0EgRE1BIENoYW5uZWwgVXNlZCAqLworI2RlZmluZSBOT19JU0FfRE1BICAgICAgICAgICAgICAweGZmCS8qIE5vIElTQSBETUEgQ2hhbm5lbCBVc2VkICovCiAKLSNkZWZpbmUgQVNDX0lORk9fU0laRSAgICAgICAgICAgMTI4ICAgICAgICAgICAgLyogYWR2YW5zeXNfaW5mbygpIGxpbmUgc2l6ZSAqLworI2RlZmluZSBBU0NfSU5GT19TSVpFICAgICAgICAgICAxMjgJLyogYWR2YW5zeXNfaW5mbygpIGxpbmUgc2l6ZSAqLwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIC8qIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KQEAgLTM1MTQsNyArMzQ4NCw3IEBACiAgKiAgUkVRUFRJTUUocmVxcCkgLSByZXFwJ3MgdGltZSBzdGFtcCB2YWx1ZQogICogIFJFUVRJTUVTVEFNUCgpIC0gc3lzdGVtIHRpbWUgc3RhbXAgdmFsdWUKICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2NzaV9jbW5kICAgICBSRVEsICpSRVFQOwordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9jbW5kIFJFUSwgKlJFUVA7CiAjZGVmaW5lIFJFUVBORVhUKHJlcXApICAgICAgICgoUkVRUCkgKChyZXFwKS0+aG9zdF9zY3JpYmJsZSkpCiAjZGVmaW5lIFJFUVBORVhUUChyZXFwKSAgICAgICgoUkVRUCAqKSAmKChyZXFwKS0+aG9zdF9zY3JpYmJsZSkpCiAjZGVmaW5lIFJFUVBUSUQocmVxcCkgICAgICAgICgocmVxcCktPmRldmljZS0+aWQpCkBAIC0zNTY0LDE3ICszNTM0LDE3IEBACiAjZGVmaW5lIFBDSV9NQVhfU0xPVCAgICAgICAgICAgIDB4MUYKICNkZWZpbmUgUENJX01BWF9CVVMgICAgICAgICAgICAgMHhGRgogI2RlZmluZSBQQ0lfSU9BRERSRVNTX01BU0sgICAgICAweEZGRkUKLSNkZWZpbmUgQVNDX1BDSV9ERVZJQ0VfSURfQ05UICAgNiAgICAgICAvKiBQQ0kgRGV2aWNlIElEIGNvdW50LiAqLworI2RlZmluZSBBU0NfUENJX0RFVklDRV9JRF9DTlQgICA2CS8qIFBDSSBEZXZpY2UgSUQgY291bnQuICovCiAKICNpZm5kZWYgQURWQU5TWVNfU1RBVFMKLSNkZWZpbmUgQVNDX1NUQVRTKHNocCwgY291bnRlcikKLSNkZWZpbmUgQVNDX1NUQVRTX0FERChzaHAsIGNvdW50ZXIsIGNvdW50KQorI2RlZmluZSBBU0NfU1RBVFMoc2hvc3QsIGNvdW50ZXIpCisjZGVmaW5lIEFTQ19TVEFUU19BREQoc2hvc3QsIGNvdW50ZXIsIGNvdW50KQogI2Vsc2UgLyogQURWQU5TWVNfU1RBVFMgKi8KLSNkZWZpbmUgQVNDX1NUQVRTKHNocCwgY291bnRlcikgXAotICAgIChBU0NfQk9BUkRQKHNocCktPmFzY19zdGF0cy5jb3VudGVyKyspCisjZGVmaW5lIEFTQ19TVEFUUyhzaG9zdCwgY291bnRlcikgXAorICAgIChBU0NfQk9BUkRQKHNob3N0KS0+YXNjX3N0YXRzLmNvdW50ZXIrKykKIAotI2RlZmluZSBBU0NfU1RBVFNfQUREKHNocCwgY291bnRlciwgY291bnQpIFwKLSAgICAoQVNDX0JPQVJEUChzaHApLT5hc2Nfc3RhdHMuY291bnRlciArPSAoY291bnQpKQorI2RlZmluZSBBU0NfU1RBVFNfQUREKHNob3N0LCBjb3VudGVyLCBjb3VudCkgXAorICAgIChBU0NfQk9BUkRQKHNob3N0KS0+YXNjX3N0YXRzLmNvdW50ZXIgKz0gKGNvdW50KSkKICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwogCiAjZGVmaW5lIEFTQ19DRUlMSU5HKHZhbCwgdW5pdCkgKCgodmFsKSArICgodW5pdCkgLSAxKSkvKHVuaXQpKQpAQCAtMzYxNyw3ICszNTg3LDYgQEAKICAgICAgICAgcHJpbnRrKChzKSwgKGExKSwgKGEyKSwgKGEzKSwgKGE0KSk7IFwKICAgICB9CiAKLQogI2lmbmRlZiBBRFZBTlNZU19ERUJVRwogCiAjZGVmaW5lIEFTQ19EQkcobHZsLCBzKQpAQCAtMzc0Niw3ICszNzE1LDYgQEAKIAogI2VuZGlmIC8qIEFEVkFOU1lTX0FTU0VSVCAqLwogCi0KIC8qCiAgKiAtLS0gRHJpdmVyIFN0cnVjdHVyZXMKICAqLwpAQCAtMzc1NSwyNyArMzcyMywyNyBAQAogCiAvKiBQZXIgYm9hcmQgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBhc2Nfc3RhdHMgewotICAgIC8qIERyaXZlciBFbnRyeXBvaW50IFN0YXRpc3RpY3MgKi8KLSAgICBBRFZfRENOVCBxdWV1ZWNvbW1hbmQ7ICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfcXVldWVjb21tYW5kKCkgKi8KLSAgICBBRFZfRENOVCByZXNldDsgICAgICAgICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfZWhfYnVzX3Jlc2V0KCkgKi8KLSAgICBBRFZfRENOVCBiaW9zcGFyYW07ICAgICAgIC8qICMgY2FsbHMgdG8gYWR2YW5zeXNfYmlvc3BhcmFtKCkgKi8KLSAgICBBRFZfRENOVCBpbnRlcnJ1cHQ7ICAgICAgIC8qICMgYWR2YW5zeXNfaW50ZXJydXB0KCkgY2FsbHMgKi8KLSAgICBBRFZfRENOVCBjYWxsYmFjazsgICAgICAgIC8qICMgY2FsbHMgdG8gYXNjL2Fkdl9pc3JfY2FsbGJhY2soKSAqLwotICAgIEFEVl9EQ05UIGRvbmU7ICAgICAgICAgICAgLyogIyBjYWxscyB0byByZXF1ZXN0J3Mgc2NzaV9kb25lIGZ1bmN0aW9uICovCi0gICAgQURWX0RDTlQgYnVpbGRfZXJyb3I7ICAgICAvKiAjIGFzYy9hZHZfYnVpbGRfcmVxKCkgQVNDX0VSUk9SIHJldHVybnMuICovCi0gICAgQURWX0RDTlQgYWR2X2J1aWxkX25vcmVxOyAvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfcmVxX3QgYWxsb2MuIGZhaWwuICovCi0gICAgQURWX0RDTlQgYWR2X2J1aWxkX25vc2c7ICAvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfc2dibGtfdCBhbGxvYy4gZmFpbC4gKi8KLSAgICAvKiBBc2NFeGVTY3NpUXVldWUoKS9BZHZFeGVTY3NpUXVldWUoKSBTdGF0aXN0aWNzICovCi0gICAgQURWX0RDTlQgZXhlX25vZXJyb3I7ICAgICAvKiAjIEFTQ19OT0VSUk9SIHJldHVybnMuICovCi0gICAgQURWX0RDTlQgZXhlX2J1c3k7ICAgICAgICAvKiAjIEFTQ19CVVNZIHJldHVybnMuICovCi0gICAgQURWX0RDTlQgZXhlX2Vycm9yOyAgICAgICAvKiAjIEFTQ19FUlJPUiByZXR1cm5zLiAqLwotICAgIEFEVl9EQ05UIGV4ZV91bmtub3duOyAgICAgLyogIyB1bmtub3duIHJldHVybnMuICovCi0gICAgLyogRGF0YSBUcmFuc2ZlciBTdGF0aXN0aWNzICovCi0gICAgQURWX0RDTlQgY29udF9jbnQ7ICAgICAgICAvKiAjIG5vbi1zY2F0dGVyLWdhdGhlciBJL08gcmVxdWVzdHMgcmVjZWl2ZWQgKi8KLSAgICBBRFZfRENOVCBjb250X3hmZXI7ICAgICAgIC8qICMgY29udGlndW91cyB0cmFuc2ZlciA1MTItYnl0ZXMgKi8KLSAgICBBRFZfRENOVCBzZ19jbnQ7ICAgICAgICAgIC8qICMgc2NhdHRlci1nYXRoZXIgSS9PIHJlcXVlc3RzIHJlY2VpdmVkICovCi0gICAgQURWX0RDTlQgc2dfZWxlbTsgICAgICAgICAvKiAjIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzICovCi0gICAgQURWX0RDTlQgc2dfeGZlcjsgICAgICAgICAvKiAjIHNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVyIDUxMi1ieXRlcyAqLworCS8qIERyaXZlciBFbnRyeXBvaW50IFN0YXRpc3RpY3MgKi8KKwlBRFZfRENOVCBxdWV1ZWNvbW1hbmQ7CS8qICMgY2FsbHMgdG8gYWR2YW5zeXNfcXVldWVjb21tYW5kKCkgKi8KKwlBRFZfRENOVCByZXNldDsJCS8qICMgY2FsbHMgdG8gYWR2YW5zeXNfZWhfYnVzX3Jlc2V0KCkgKi8KKwlBRFZfRENOVCBiaW9zcGFyYW07CS8qICMgY2FsbHMgdG8gYWR2YW5zeXNfYmlvc3BhcmFtKCkgKi8KKwlBRFZfRENOVCBpbnRlcnJ1cHQ7CS8qICMgYWR2YW5zeXNfaW50ZXJydXB0KCkgY2FsbHMgKi8KKwlBRFZfRENOVCBjYWxsYmFjazsJLyogIyBjYWxscyB0byBhc2MvYWR2X2lzcl9jYWxsYmFjaygpICovCisJQURWX0RDTlQgZG9uZTsJCS8qICMgY2FsbHMgdG8gcmVxdWVzdCdzIHNjc2lfZG9uZSBmdW5jdGlvbiAqLworCUFEVl9EQ05UIGJ1aWxkX2Vycm9yOwkvKiAjIGFzYy9hZHZfYnVpbGRfcmVxKCkgQVNDX0VSUk9SIHJldHVybnMuICovCisJQURWX0RDTlQgYWR2X2J1aWxkX25vcmVxOwkvKiAjIGFkdl9idWlsZF9yZXEoKSBhZHZfcmVxX3QgYWxsb2MuIGZhaWwuICovCisJQURWX0RDTlQgYWR2X2J1aWxkX25vc2c7CS8qICMgYWR2X2J1aWxkX3JlcSgpIGFkdl9zZ2Jsa190IGFsbG9jLiBmYWlsLiAqLworCS8qIEFzY0V4ZVNjc2lRdWV1ZSgpL0FkdkV4ZVNjc2lRdWV1ZSgpIFN0YXRpc3RpY3MgKi8KKwlBRFZfRENOVCBleGVfbm9lcnJvcjsJLyogIyBBU0NfTk9FUlJPUiByZXR1cm5zLiAqLworCUFEVl9EQ05UIGV4ZV9idXN5OwkvKiAjIEFTQ19CVVNZIHJldHVybnMuICovCisJQURWX0RDTlQgZXhlX2Vycm9yOwkvKiAjIEFTQ19FUlJPUiByZXR1cm5zLiAqLworCUFEVl9EQ05UIGV4ZV91bmtub3duOwkvKiAjIHVua25vd24gcmV0dXJucy4gKi8KKwkvKiBEYXRhIFRyYW5zZmVyIFN0YXRpc3RpY3MgKi8KKwlBRFZfRENOVCBjb250X2NudDsJLyogIyBub24tc2NhdHRlci1nYXRoZXIgSS9PIHJlcXVlc3RzIHJlY2VpdmVkICovCisJQURWX0RDTlQgY29udF94ZmVyOwkvKiAjIGNvbnRpZ3VvdXMgdHJhbnNmZXIgNTEyLWJ5dGVzICovCisJQURWX0RDTlQgc2dfY250OwkvKiAjIHNjYXR0ZXItZ2F0aGVyIEkvTyByZXF1ZXN0cyByZWNlaXZlZCAqLworCUFEVl9EQ05UIHNnX2VsZW07CS8qICMgc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgKi8KKwlBRFZfRENOVCBzZ194ZmVyOwkvKiAjIHNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVyIDUxMi1ieXRlcyAqLwogfTsKICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwogCkBAIC0zNzgzLDE3ICszNzUxLDE3IEBACiAgKiBSZXF1ZXN0IHF1ZXVpbmcgc3RydWN0dXJlCiAgKi8KIHR5cGVkZWYgc3RydWN0IGFzY19xdWV1ZSB7Ci0gICAgQURWX1NDU0lfQklUX0lEX1RZUEUgIHFfdGlkbWFzazsgICAgICAgICAgICAgICAgLyogcXVldWUgbWFzayAqLwotICAgIFJFUVAgICAgICAgICAgICAgICAgICBxX2ZpcnN0W0FEVl9NQVhfVElEKzFdOyAgIC8qIGZpcnN0IHF1ZXVlZCByZXF1ZXN0ICovCi0gICAgUkVRUCAgICAgICAgICAgICAgICAgIHFfbGFzdFtBRFZfTUFYX1RJRCsxXTsgICAgLyogbGFzdCBxdWV1ZWQgcmVxdWVzdCAqLworCUFEVl9TQ1NJX0JJVF9JRF9UWVBFIHFfdGlkbWFzazsJLyogcXVldWUgbWFzayAqLworCVJFUVAgcV9maXJzdFtBRFZfTUFYX1RJRCArIDFdOwkvKiBmaXJzdCBxdWV1ZWQgcmVxdWVzdCAqLworCVJFUVAgcV9sYXN0W0FEVl9NQVhfVElEICsgMV07CS8qIGxhc3QgcXVldWVkIHJlcXVlc3QgKi8KICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgIHNob3J0ICAgICAgICAgICAgICAgICBxX2N1cl9jbnRbQURWX01BWF9USUQrMV07IC8qIGN1cnJlbnQgcXVldWUgY291bnQgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgcV9tYXhfY250W0FEVl9NQVhfVElEKzFdOyAvKiBtYXhpbXVtIHF1ZXVlIGNvdW50ICovCi0gICAgQURWX0RDTlQgICAgICAgICAgICAgIHFfdG90X2NudFtBRFZfTUFYX1RJRCsxXTsgLyogdG90YWwgZW5xdWV1ZSBjb3VudCAqLwotICAgIEFEVl9EQ05UICAgICAgICAgICAgICBxX3RvdF90aW1bQURWX01BWF9USUQrMV07IC8qIHRvdGFsIHRpbWUgcXVldWVkICovCi0gICAgdXNob3J0ICAgICAgICAgICAgICAgIHFfbWF4X3RpbVtBRFZfTUFYX1RJRCsxXTsgLyogbWF4aW11bSB0aW1lIHF1ZXVlZCAqLwotICAgIHVzaG9ydCAgICAgICAgICAgICAgICBxX21pbl90aW1bQURWX01BWF9USUQrMV07IC8qIG1pbmltdW0gdGltZSBxdWV1ZWQgKi8KLSNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLworCXNob3J0IHFfY3VyX2NudFtBRFZfTUFYX1RJRCArIDFdOwkvKiBjdXJyZW50IHF1ZXVlIGNvdW50ICovCisJc2hvcnQgcV9tYXhfY250W0FEVl9NQVhfVElEICsgMV07CS8qIG1heGltdW0gcXVldWUgY291bnQgKi8KKwlBRFZfRENOVCBxX3RvdF9jbnRbQURWX01BWF9USUQgKyAxXTsJLyogdG90YWwgZW5xdWV1ZSBjb3VudCAqLworCUFEVl9EQ05UIHFfdG90X3RpbVtBRFZfTUFYX1RJRCArIDFdOwkvKiB0b3RhbCB0aW1lIHF1ZXVlZCAqLworCXVzaG9ydCBxX21heF90aW1bQURWX01BWF9USUQgKyAxXTsJLyogbWF4aW11bSB0aW1lIHF1ZXVlZCAqLworCXVzaG9ydCBxX21pbl90aW1bQURWX01BWF9USUQgKyAxXTsJLyogbWluaW11bSB0aW1lIHF1ZXVlZCAqLworI2VuZGlmCQkJCS8qIEFEVkFOU1lTX1NUQVRTICovCiB9IGFzY19xdWV1ZV90OwogCiAvKgpAQCAtMzgxNCwxNyArMzc4MiwxNyBAQAogICogQm90aCBzdHJ1Y3R1cmVzIG11c3QgYmUgMzIgYnl0ZSBhbGlnbmVkLgogICovCiB0eXBlZGVmIHN0cnVjdCBhZHZfc2dibGsgewotICAgIEFEVl9TR19CTE9DSyAgICAgICAgc2dfYmxvY2s7ICAgICAvKiBTZ2Jsb2NrIHN0cnVjdHVyZS4gKi8KLSAgICB1Y2hhciAgICAgICAgICAgICAgIGFsaWduWzMyXTsgICAgLyogU2dibG9jayBzdHJ1Y3R1cmUgcGFkZGluZy4gKi8KLSAgICBzdHJ1Y3QgYWR2X3NnYmxrICAgICpuZXh0X3NnYmxrcDsgLyogTmV4dCBzY2F0dGVyLWdhdGhlciBzdHJ1Y3R1cmUuICovCisJQURWX1NHX0JMT0NLIHNnX2Jsb2NrOwkvKiBTZ2Jsb2NrIHN0cnVjdHVyZS4gKi8KKwl1Y2hhciBhbGlnblszMl07CS8qIFNnYmxvY2sgc3RydWN0dXJlIHBhZGRpbmcuICovCisJc3RydWN0IGFkdl9zZ2JsayAqbmV4dF9zZ2Jsa3A7CS8qIE5leHQgc2NhdHRlci1nYXRoZXIgc3RydWN0dXJlLiAqLwogfSBhZHZfc2dibGtfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgYWR2X3JlcSB7Ci0gICAgQURWX1NDU0lfUkVRX1EgICAgICBzY3NpX3JlcV9xOyAgIC8qIEFkdiBMaWJyYXJ5IHJlcXVlc3Qgc3RydWN0dXJlLiAqLwotICAgIHVjaGFyICAgICAgICAgICAgICAgYWxpZ25bMzJdOyAgICAvKiBSZXF1ZXN0IHN0cnVjdHVyZSBwYWRkaW5nLiAqLwotICAgIHN0cnVjdCBzY3NpX2NtbmQJKmNtbmRwOyAgICAgICAvKiBNaWQtTGV2ZWwgU0NTSSBjb21tYW5kIHBvaW50ZXIuICovCi0gICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dibGtwOyAgICAgIC8qIEFkdiBMaWJyYXJ5IHNjYXR0ZXItZ2F0aGVyIHBvaW50ZXIuICovCi0gICAgc3RydWN0IGFkdl9yZXEgICAgICAqbmV4dF9yZXFwOyAgIC8qIE5leHQgUmVxdWVzdCBTdHJ1Y3R1cmUuICovCisJQURWX1NDU0lfUkVRX1Egc2NzaV9yZXFfcTsJLyogQWR2IExpYnJhcnkgcmVxdWVzdCBzdHJ1Y3R1cmUuICovCisJdWNoYXIgYWxpZ25bMzJdOwkvKiBSZXF1ZXN0IHN0cnVjdHVyZSBwYWRkaW5nLiAqLworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmRwOwkvKiBNaWQtTGV2ZWwgU0NTSSBjb21tYW5kIHBvaW50ZXIuICovCisJYWR2X3NnYmxrX3QgKnNnYmxrcDsJLyogQWR2IExpYnJhcnkgc2NhdHRlci1nYXRoZXIgcG9pbnRlci4gKi8KKwlzdHJ1Y3QgYWR2X3JlcSAqbmV4dF9yZXFwOwkvKiBOZXh0IFJlcXVlc3QgU3RydWN0dXJlLiAqLwogfSBhZHZfcmVxX3Q7CiAKIC8qCkBAIC0zODM1LDExMyArMzgwMywxMDkgQEAKICAqIGZpZWxkLiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIGFsbG9jYXRlZCBmcm9tIERNQS1hYmxlIG1lbW9yeS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgYXNjX2JvYXJkIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBpZDsgICAgICAgICAgICAgICAgICAgIC8qIEJvYXJkIElkICovCi0gICAgdWludCAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAvKiBCb2FyZCBmbGFncyAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgQVNDX0RWQ19WQVIgICAgICBhc2NfZHZjX3ZhcjsgICAgICAgICAgIC8qIE5hcnJvdyBib2FyZCAqLwotICAgICAgICBBRFZfRFZDX1ZBUiAgICAgIGFkdl9kdmNfdmFyOyAgICAgICAgICAgLyogV2lkZSBib2FyZCAqLwotICAgIH0gZHZjX3ZhcjsKLSAgICB1bmlvbiB7Ci0gICAgICAgIEFTQ19EVkNfQ0ZHICAgICAgYXNjX2R2Y19jZmc7ICAgICAgICAgICAvKiBOYXJyb3cgYm9hcmQgKi8KLSAgICAgICAgQURWX0RWQ19DRkcgICAgICBhZHZfZHZjX2NmZzsgICAgICAgICAgIC8qIFdpZGUgYm9hcmQgKi8KLSAgICB9IGR2Y19jZmc7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgYXNjX25faW9fcG9ydDsgICAgICAgICAvKiBOdW1iZXIgSS9PIHBvcnRzLiAqLwotICAgIGFzY19xdWV1ZV90ICAgICAgICAgIGFjdGl2ZTsgICAgICAgICAgICAgICAgLyogQWN0aXZlIGNvbW1hbmQgcXVldWUgKi8KLSAgICBhc2NfcXVldWVfdCAgICAgICAgICB3YWl0aW5nOyAgICAgICAgICAgICAgIC8qIFdhaXRpbmcgY29tbWFuZCBxdWV1ZSAqLwotICAgIGFzY19xdWV1ZV90ICAgICAgICAgIGRvbmU7ICAgICAgICAgICAgICAgICAgLyogRG9uZSBjb21tYW5kIHF1ZXVlICovCi0gICAgQURWX1NDU0lfQklUX0lEX1RZUEUgaW5pdF90aWRtYXNrOyAgICAgICAgICAvKiBUYXJnZXQgaW5pdC4vdmFsaWQgbWFzayAqLwotICAgIHN0cnVjdCBzY3NpX2RldmljZQkqZGV2aWNlW0FEVl9NQVhfVElEKzFdOyAvKiBNaWQtTGV2ZWwgU2NzaSBEZXZpY2UgKi8KLSAgICB1c2hvcnQgICAgICAgICAgICAgICByZXFjbnRbQURWX01BWF9USUQrMV07IC8qIFN0YXJ2YXRpb24gcmVxdWVzdCBjb3VudCAqLwotICAgIEFEVl9TQ1NJX0JJVF9JRF9UWVBFIHF1ZXVlX2Z1bGw7ICAgICAgICAgICAgLyogUXVldWUgZnVsbCBtYXNrICovCi0gICAgdXNob3J0ICAgICAgICAgICAgICAgcXVldWVfZnVsbF9jbnRbQURWX01BWF9USUQrMV07IC8qIFF1ZXVlIGZ1bGwgY291bnQgKi8KLSAgICB1bmlvbiB7Ci0gICAgICAgIEFTQ0VFUF9DT05GSUcgICAgICAgICBhc2NfZWVwOyAgICAgICAgICAvKiBOYXJyb3cgRUVQUk9NIGNvbmZpZy4gKi8KLSAgICAgICAgQURWRUVQXzM1NTBfQ09ORklHICAgIGFkdl8zNTUwX2VlcDsgICAgIC8qIDM1NTAgRUVQUk9NIGNvbmZpZy4gKi8KLSAgICAgICAgQURWRUVQXzM4QzA4MDBfQ09ORklHIGFkdl8zOEMwODAwX2VlcDsgIC8qIDM4QzA4MDAgRUVQUk9NIGNvbmZpZy4gKi8KLSAgICAgICAgQURWRUVQXzM4QzE2MDBfQ09ORklHIGFkdl8zOEMxNjAwX2VlcDsgIC8qIDM4QzE2MDAgRUVQUk9NIGNvbmZpZy4gKi8KLSAgICB9IGVlcF9jb25maWc7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAgbGFzdF9yZXNldDsgICAgICAgICAgICAvKiBTYXZlZCBsYXN0IHJlc2V0IHRpbWUgKi8KLSAgICBzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvYXJkIHNwaW5sb2NrICovCisJaW50IGlkOwkJCS8qIEJvYXJkIElkICovCisJdWludCBmbGFnczsJCS8qIEJvYXJkIGZsYWdzICovCisJdW5pb24geworCQlBU0NfRFZDX1ZBUiBhc2NfZHZjX3ZhcjsJLyogTmFycm93IGJvYXJkICovCisJCUFEVl9EVkNfVkFSIGFkdl9kdmNfdmFyOwkvKiBXaWRlIGJvYXJkICovCisJfSBkdmNfdmFyOworCXVuaW9uIHsKKwkJQVNDX0RWQ19DRkcgYXNjX2R2Y19jZmc7CS8qIE5hcnJvdyBib2FyZCAqLworCQlBRFZfRFZDX0NGRyBhZHZfZHZjX2NmZzsJLyogV2lkZSBib2FyZCAqLworCX0gZHZjX2NmZzsKKwl1c2hvcnQgYXNjX25faW9fcG9ydDsJLyogTnVtYmVyIEkvTyBwb3J0cy4gKi8KKwlhc2NfcXVldWVfdCBhY3RpdmU7CS8qIEFjdGl2ZSBjb21tYW5kIHF1ZXVlICovCisJYXNjX3F1ZXVlX3Qgd2FpdGluZzsJLyogV2FpdGluZyBjb21tYW5kIHF1ZXVlICovCisJYXNjX3F1ZXVlX3QgZG9uZTsJLyogRG9uZSBjb21tYW5kIHF1ZXVlICovCisJQURWX1NDU0lfQklUX0lEX1RZUEUgaW5pdF90aWRtYXNrOwkvKiBUYXJnZXQgaW5pdC4vdmFsaWQgbWFzayAqLworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlW0FEVl9NQVhfVElEICsgMV07CS8qIE1pZC1MZXZlbCBTY3NpIERldmljZSAqLworCXVzaG9ydCByZXFjbnRbQURWX01BWF9USUQgKyAxXTsJLyogU3RhcnZhdGlvbiByZXF1ZXN0IGNvdW50ICovCisJQURWX1NDU0lfQklUX0lEX1RZUEUgcXVldWVfZnVsbDsJLyogUXVldWUgZnVsbCBtYXNrICovCisJdXNob3J0IHF1ZXVlX2Z1bGxfY250W0FEVl9NQVhfVElEICsgMV07CS8qIFF1ZXVlIGZ1bGwgY291bnQgKi8KKwl1bmlvbiB7CisJCUFTQ0VFUF9DT05GSUcgYXNjX2VlcDsJLyogTmFycm93IEVFUFJPTSBjb25maWcuICovCisJCUFEVkVFUF8zNTUwX0NPTkZJRyBhZHZfMzU1MF9lZXA7CS8qIDM1NTAgRUVQUk9NIGNvbmZpZy4gKi8KKwkJQURWRUVQXzM4QzA4MDBfQ09ORklHIGFkdl8zOEMwODAwX2VlcDsJLyogMzhDMDgwMCBFRVBST00gY29uZmlnLiAqLworCQlBRFZFRVBfMzhDMTYwMF9DT05GSUcgYWR2XzM4QzE2MDBfZWVwOwkvKiAzOEMxNjAwIEVFUFJPTSBjb25maWcuICovCisJfSBlZXBfY29uZmlnOworCXVsb25nIGxhc3RfcmVzZXQ7CS8qIFNhdmVkIGxhc3QgcmVzZXQgdGltZSAqLworCXNwaW5sb2NrX3QgbG9jazsJLyogQm9hcmQgc3BpbmxvY2sgKi8KICNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgIC8qIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dICovCi0gICAgY2hhciAgICAgICAgICAgICAgICAgKnBydGJ1ZjsgICAgICAgICAgICAgICAvKiAvcHJvYyBwcmludCBidWZmZXIgKi8KLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCS8qIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dICovCisJY2hhciAqcHJ0YnVmOwkJLyogL3Byb2MgcHJpbnQgYnVmZmVyICovCisjZW5kaWYJCQkJLyogQ09ORklHX1BST0NfRlMgKi8KICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgIHN0cnVjdCBhc2Nfc3RhdHMgICAgIGFzY19zdGF0czsgICAgICAgICAgICAgLyogQm9hcmQgc3RhdGlzdGljcyAqLwotI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCBvbmx5IGZvciBOYXJyb3cgQm9hcmRzLgotICAgICAqLwotICAgIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgc3RydWN0dXJlcyBtdXN0IGJlIGluIERNQS1hYmxlIG1lbW9yeS4gKi8KLSAgICBBU0NfU0NTSV9SRVFfUSAgICAgICBzY3NpcmVxcTsKLSAgICBBU0NfQ0FQX0lORk8gICAgICAgICBjYXBfaW5mbzsKLSAgICBBU0NfU0NTSV9JTlFVSVJZICAgICBpbnF1aXJ5OwotICAgIHVjaGFyICAgICAgICAgICAgICAgIHNkdHJfZGF0YVtBU0NfTUFYX1RJRCsxXTsgLyogU0RUUiBpbmZvcm1hdGlvbiAqLwotICAgIC8qCi0gICAgICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgb25seSBmb3IgV2lkZSBCb2FyZHMuCi0gICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgX19pb21lbSAqaW9yZW1hcF9hZGRyOyAvKiBJL08gTWVtb3J5IHJlbWFwIGFkZHJlc3MuICovCi0gICAgdXNob3J0ICAgICAgICAgICAgICAgaW9wb3J0OyAgICAgICAgICAgICAgICAvKiBJL08gUG9ydCBhZGRyZXNzLiAqLwotICAgIEFEVl9DQVJSX1QgICAgICAgICAgICpvcmlnX2NhcnJwOyAgICAgICAgICAgLyogQURWX0NBUlJfVCBtZW1vcnkgYmxvY2suICovCi0gICAgYWR2X3JlcV90ICAgICAgICAgICAgKm9yaWdfcmVxcDsgICAgICAgICAgICAvKiBhZHZfcmVxX3QgbWVtb3J5IGJsb2NrLiAqLwotICAgIGFkdl9yZXFfdCAgICAgICAgICAgICphZHZfcmVxcDsgICAgICAgICAgICAgLyogUmVxdWVzdCBzdHJ1Y3R1cmVzLiAqLwotICAgIGFkdl9zZ2Jsa190ICAgICAgICAgICphZHZfc2dibGtwOyAgICAgICAgICAgLyogU2NhdHRlci1nYXRoZXIgc3RydWN0dXJlcy4gKi8KLSAgICB1c2hvcnQgICAgICAgICAgICAgICBiaW9zX3NpZ25hdHVyZTsgICAgICAgIC8qIEJJT1MgU2lnbmF0dXJlLiAqLwotICAgIHVzaG9ydCAgICAgICAgICAgICAgIGJpb3NfdmVyc2lvbjsgICAgICAgICAgLyogQklPUyBWZXJzaW9uLiAqLwotICAgIHVzaG9ydCAgICAgICAgICAgICAgIGJpb3NfY29kZXNlZzsgICAgICAgICAgLyogQklPUyBDb2RlIFNlZ21lbnQuICovCi0gICAgdXNob3J0ICAgICAgICAgICAgICAgYmlvc19jb2RlbGVuOyAgICAgICAgICAvKiBCSU9TIENvZGUgU2VnbWVudCBMZW5ndGguICovCisJc3RydWN0IGFzY19zdGF0cyBhc2Nfc3RhdHM7CS8qIEJvYXJkIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgkJCQkvKiBBRFZBTlNZU19TVEFUUyAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgb25seSBmb3IgTmFycm93IEJvYXJkcy4KKwkgKi8KKwkvKiBUaGUgZm9sbG93aW5nIHRocmVlIHN0cnVjdHVyZXMgbXVzdCBiZSBpbiBETUEtYWJsZSBtZW1vcnkuICovCisJQVNDX1NDU0lfUkVRX1Egc2NzaXJlcXE7CisJQVNDX0NBUF9JTkZPIGNhcF9pbmZvOworCUFTQ19TQ1NJX0lOUVVJUlkgaW5xdWlyeTsKKwl1Y2hhciBzZHRyX2RhdGFbQVNDX01BWF9USUQgKyAxXTsJLyogU0RUUiBpbmZvcm1hdGlvbiAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgb25seSBmb3IgV2lkZSBCb2FyZHMuCisJICovCisJdm9pZCBfX2lvbWVtICppb3JlbWFwX2FkZHI7CS8qIEkvTyBNZW1vcnkgcmVtYXAgYWRkcmVzcy4gKi8KKwl1c2hvcnQgaW9wb3J0OwkJLyogSS9PIFBvcnQgYWRkcmVzcy4gKi8KKwlBRFZfQ0FSUl9UICpvcmlnX2NhcnJwOwkvKiBBRFZfQ0FSUl9UIG1lbW9yeSBibG9jay4gKi8KKwlhZHZfcmVxX3QgKm9yaWdfcmVxcDsJLyogYWR2X3JlcV90IG1lbW9yeSBibG9jay4gKi8KKwlhZHZfcmVxX3QgKmFkdl9yZXFwOwkvKiBSZXF1ZXN0IHN0cnVjdHVyZXMuICovCisJYWR2X3NnYmxrX3QgKmFkdl9zZ2Jsa3A7CS8qIFNjYXR0ZXItZ2F0aGVyIHN0cnVjdHVyZXMuICovCisJdXNob3J0IGJpb3Nfc2lnbmF0dXJlOwkvKiBCSU9TIFNpZ25hdHVyZS4gKi8KKwl1c2hvcnQgYmlvc192ZXJzaW9uOwkvKiBCSU9TIFZlcnNpb24uICovCisJdXNob3J0IGJpb3NfY29kZXNlZzsJLyogQklPUyBDb2RlIFNlZ21lbnQuICovCisJdXNob3J0IGJpb3NfY29kZWxlbjsJLyogQklPUyBDb2RlIFNlZ21lbnQgTGVuZ3RoLiAqLwogfSBhc2NfYm9hcmRfdDsKIAogLyoKICAqIFBDSSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMKICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1BDSV9EQVRBXwotewotICAgIHVjaGFyICAgIHR5cGU7Ci0gICAgdWNoYXIgICAgYnVzOwotICAgIHVjaGFyICAgIHNsb3Q7Ci0gICAgdWNoYXIgICAgZnVuYzsKLSAgICB1Y2hhciAgICBvZmZzZXQ7Cit0eXBlZGVmIHN0cnVjdCBfUENJX0RBVEFfIHsKKwl1Y2hhciB0eXBlOworCXVjaGFyIGJ1czsKKwl1Y2hhciBzbG90OworCXVjaGFyIGZ1bmM7CisJdWNoYXIgb2Zmc2V0OwogfSBQQ0lfREFUQTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1BDSV9ERVZJQ0VfCi17Ci0gICAgdXNob3J0ICAgdmVuZG9ySUQ7Ci0gICAgdXNob3J0ICAgZGV2aWNlSUQ7Ci0gICAgdXNob3J0ICAgc2xvdE51bWJlcjsKLSAgICB1c2hvcnQgICBzbG90Rm91bmQ7Ci0gICAgdWNoYXIgICAgYnVzTnVtYmVyOwotICAgIHVjaGFyICAgIG1heEJ1c051bWJlcjsKLSAgICB1Y2hhciAgICBkZXZGdW5jOwotICAgIHVzaG9ydCAgIHN0YXJ0U2xvdDsKLSAgICB1c2hvcnQgICBlbmRTbG90OwotICAgIHVjaGFyICAgIGJyaWRnZTsKLSAgICB1Y2hhciAgICB0eXBlOwordHlwZWRlZiBzdHJ1Y3QgX1BDSV9ERVZJQ0VfIHsKKwl1c2hvcnQgdmVuZG9ySUQ7CisJdXNob3J0IGRldmljZUlEOworCXVzaG9ydCBzbG90TnVtYmVyOworCXVzaG9ydCBzbG90Rm91bmQ7CisJdWNoYXIgYnVzTnVtYmVyOworCXVjaGFyIG1heEJ1c051bWJlcjsKKwl1Y2hhciBkZXZGdW5jOworCXVzaG9ydCBzdGFydFNsb3Q7CisJdXNob3J0IGVuZFNsb3Q7CisJdWNoYXIgYnJpZGdlOworCXVjaGFyIHR5cGU7CiB9IFBDSV9ERVZJQ0U7CiAKLXR5cGVkZWYgc3RydWN0IF9QQ0lfQ09ORklHX1NQQUNFXwotewotICAgIHVzaG9ydCAgIHZlbmRvcklEOwotICAgIHVzaG9ydCAgIGRldmljZUlEOwotICAgIHVzaG9ydCAgIGNvbW1hbmQ7Ci0gICAgdXNob3J0ICAgc3RhdHVzOwotICAgIHVjaGFyICAgIHJldmlzaW9uOwotICAgIHVjaGFyICAgIGNsYXNzQ29kZVszXTsKLSAgICB1Y2hhciAgICBjYWNoZVNpemU7Ci0gICAgdWNoYXIgICAgbGF0ZW5jeVRpbWVyOwotICAgIHVjaGFyICAgIGhlYWRlclR5cGU7Ci0gICAgdWNoYXIgICAgYmlzdDsKLSAgICBBRFZfUEFERFIgYmFzZUFkZHJlc3NbNl07Ci0gICAgdXNob3J0ICAgcmVzZXJ2ZWRbNF07Ci0gICAgQURWX1BBRERSIG9wdGlvblJvbUFkZHI7Ci0gICAgdXNob3J0ICAgcmVzZXJ2ZWQyWzRdOwotICAgIHVjaGFyICAgIGlycUxpbmU7Ci0gICAgdWNoYXIgICAgaXJxUGluOwotICAgIHVjaGFyICAgIG1pbkdudDsKLSAgICB1Y2hhciAgICBtYXhMYXRlbmN5OwordHlwZWRlZiBzdHJ1Y3QgX1BDSV9DT05GSUdfU1BBQ0VfIHsKKwl1c2hvcnQgdmVuZG9ySUQ7CisJdXNob3J0IGRldmljZUlEOworCXVzaG9ydCBjb21tYW5kOworCXVzaG9ydCBzdGF0dXM7CisJdWNoYXIgcmV2aXNpb247CisJdWNoYXIgY2xhc3NDb2RlWzNdOworCXVjaGFyIGNhY2hlU2l6ZTsKKwl1Y2hhciBsYXRlbmN5VGltZXI7CisJdWNoYXIgaGVhZGVyVHlwZTsKKwl1Y2hhciBiaXN0OworCUFEVl9QQUREUiBiYXNlQWRkcmVzc1s2XTsKKwl1c2hvcnQgcmVzZXJ2ZWRbNF07CisJQURWX1BBRERSIG9wdGlvblJvbUFkZHI7CisJdXNob3J0IHJlc2VydmVkMls0XTsKKwl1Y2hhciBpcnFMaW5lOworCXVjaGFyIGlycVBpbjsKKwl1Y2hhciBtaW5HbnQ7CisJdWNoYXIgbWF4TGF0ZW5jeTsKIH0gUENJX0NPTkZJR19TUEFDRTsKIAotCiAvKgogICogLS0tIERyaXZlciBEYXRhCiAgKi8KQEAgLTM5NDksNDQgKzM5MTMsNDIgQEAKIC8qIE5vdGU6IEFsbCBkcml2ZXIgZ2xvYmFsIGRhdGEgc2hvdWxkIGJlIGluaXRpYWxpemVkLiAqLwogCiAvKiBOdW1iZXIgb2YgYm9hcmRzIGRldGVjdGVkIGluIHN5c3RlbS4gKi8KLVNUQVRJQyBpbnQgYXNjX2JvYXJkX2NvdW50ID0gMDsKLVNUQVRJQyBzdHJ1Y3QgU2NzaV9Ib3N0ICAgICphc2NfaG9zdFtBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRF0gPSB7IE5VTEwgfTsKK3N0YXRpYyBpbnQgYXNjX2JvYXJkX2NvdW50ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICphc2NfaG9zdFtBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRF0gPSB7IE5VTEwgfTsKIAogLyogT3ZlcnJ1biBidWZmZXIgdXNlZCBieSBhbGwgbmFycm93IGJvYXJkcy4gKi8KLVNUQVRJQyB1Y2hhciBvdmVycnVuX2J1ZltBU0NfT1ZFUlJVTl9CU0laRV0gPSB7IDAgfTsKK3N0YXRpYyB1Y2hhciBvdmVycnVuX2J1ZltBU0NfT1ZFUlJVTl9CU0laRV0gPSB7IDAgfTsKIAogLyoKICAqIEdsb2JhbCBzdHJ1Y3R1cmVzIHJlcXVpcmVkIHRvIGlzc3VlIGEgY29tbWFuZC4KICAqLwotU1RBVElDIEFTQ19TQ1NJX1EgYXNjX3Njc2lfcSA9IHsgeyAwIH0gfTsKLVNUQVRJQyBBU0NfU0dfSEVBRCBhc2Nfc2dfaGVhZCA9IHsgMCB9Oworc3RhdGljIEFTQ19TQ1NJX1EgYXNjX3Njc2lfcSA9IHsgezB9IH07CitzdGF0aWMgQVNDX1NHX0hFQUQgYXNjX3NnX2hlYWQgPSB7IDAgfTsKIAogLyogTGlzdCBvZiBzdXBwb3J0ZWQgYnVzIHR5cGVzLiAqLwotU1RBVElDIHVzaG9ydCBhc2NfYnVzW0FTQ19OVU1fQlVTXSBfX2luaXRkYXRhID0gewotICAgIEFTQ19JU19JU0EsCi0gICAgQVNDX0lTX1ZMLAotICAgIEFTQ19JU19FSVNBLAotICAgIEFTQ19JU19QQ0ksCitzdGF0aWMgdXNob3J0IGFzY19idXNbQVNDX05VTV9CVVNdIF9faW5pdGRhdGEgPSB7CisJQVNDX0lTX0lTQSwKKwlBU0NfSVNfVkwsCisJQVNDX0lTX0VJU0EsCisJQVNDX0lTX1BDSSwKIH07CiAKLVNUQVRJQyBpbnQgYXNjX2lvcGZsYWcgPSBBU0NfRkFMU0U7Ci1TVEFUSUMgaW50IGFzY19pb3BvcnRbQVNDX05VTV9JT1BPUlRfUFJPQkVdID0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IGFzY19pb3BmbGFnID0gQVNDX0ZBTFNFOworc3RhdGljIGludCBhc2NfaW9wb3J0W0FTQ19OVU1fSU9QT1JUX1BST0JFXSA9IHsgMCwgMCwgMCwgMCB9OwogCiAjaWZkZWYgQURWQU5TWVNfREVCVUcKLVNUQVRJQyBjaGFyICoKLWFzY19idXNfbmFtZVtBU0NfTlVNX0JVU10gPSB7Ci0gICAgIkFTQ19JU19JU0EiLAotICAgICJBU0NfSVNfVkwiLAotICAgICJBU0NfSVNfRUlTQSIsCi0gICAgIkFTQ19JU19QQ0kiLAorc3RhdGljIGNoYXIgKmFzY19idXNfbmFtZVtBU0NfTlVNX0JVU10gPSB7CisJIkFTQ19JU19JU0EiLAorCSJBU0NfSVNfVkwiLAorCSJBU0NfSVNfRUlTQSIsCisJIkFTQ19JU19QQ0kiLAogfTsKIAotU1RBVElDIGludCAgICAgICAgICBhc2NfZGJnbHZsID0gMzsKK3N0YXRpYyBpbnQgYXNjX2RiZ2x2bCA9IDM7CiAjZW5kaWYgLyogQURWQU5TWVNfREVCVUcgKi8KIAogLyogRGVjbGFyYXRpb24gZm9yIEFzYyBMaWJyYXJ5IGludGVybmFsIGRhdGEgcmVmZXJlbmNlZCBieSBkcml2ZXIuICovCi1TVEFUSUMgUG9ydEFkZHIgICAgIF9hc2NfZGVmX2lvcF9iYXNlW107Ci0KK3N0YXRpYyBQb3J0QWRkciBfYXNjX2RlZl9pb3BfYmFzZVtdOwogCiAvKgogICogLS0tIERyaXZlciBGdW5jdGlvbiBQcm90b3R5cGVzCkBAIC0zOTk0LDYyICszOTU2LDYxIEBACiAgKiBhZHZhbnN5cy5oIGNvbnRhaW5zIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBnbG9iYWwgdG8gTGludXguCiAgKi8KIAotU1RBVElDIGlycXJldHVybl90IGFkdmFuc3lzX2ludGVycnVwdChpbnQsIHZvaWQgKik7Ci1TVEFUSUMgaW50CSAgYWR2YW5zeXNfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKLVNUQVRJQyB2b2lkICAgICAgIGFzY19zY3NpX2RvbmVfbGlzdChzdHJ1Y3Qgc2NzaV9jbW5kICopOwotU1RBVElDIGludCAgICAgICAgYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7Ci1TVEFUSUMgaW50ICAgICAgICBhc2NfYnVpbGRfcmVxKGFzY19ib2FyZF90ICosIHN0cnVjdCBzY3NpX2NtbmQgKik7Ci1TVEFUSUMgaW50ICAgICAgICBhZHZfYnVpbGRfcmVxKGFzY19ib2FyZF90ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwgQURWX1NDU0lfUkVRX1EgKiopOwotU1RBVElDIGludCAgICAgICAgYWR2X2dldF9zZ2xpc3QoYXNjX2JvYXJkX3QgKiwgYWR2X3JlcV90ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50KTsKLVNUQVRJQyB2b2lkICAgICAgIGFzY19pc3JfY2FsbGJhY2soQVNDX0RWQ19WQVIgKiwgQVNDX1FET05FX0lORk8gKik7Ci1TVEFUSUMgdm9pZCAgICAgICBhZHZfaXNyX2NhbGxiYWNrKEFEVl9EVkNfVkFSICosIEFEVl9TQ1NJX1JFUV9RICopOwotU1RBVElDIHZvaWQgICAgICAgYWR2X2FzeW5jX2NhbGxiYWNrKEFEVl9EVkNfVkFSICosIHVjaGFyKTsKLVNUQVRJQyB2b2lkICAgICAgIGFzY19lbnF1ZXVlKGFzY19xdWV1ZV90ICosIFJFUVAsIGludCk7Ci1TVEFUSUMgUkVRUCAgICAgICBhc2NfZGVxdWV1ZShhc2NfcXVldWVfdCAqLCBpbnQpOwotU1RBVElDIFJFUVAgICAgICAgYXNjX2RlcXVldWVfbGlzdChhc2NfcXVldWVfdCAqLCBSRVFQICosIGludCk7Ci1TVEFUSUMgaW50ICAgICAgICBhc2Nfcm1xdWV1ZShhc2NfcXVldWVfdCAqLCBSRVFQKTsKLVNUQVRJQyB2b2lkICAgICAgIGFzY19leGVjdXRlX3F1ZXVlKGFzY19xdWV1ZV90ICopOworc3RhdGljIGlycXJldHVybl90IGFkdmFuc3lzX2ludGVycnVwdChpbnQsIHZvaWQgKik7CitzdGF0aWMgaW50IGFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBhc2Nfc2NzaV9kb25lX2xpc3Qoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgaW50IGFzY19idWlsZF9yZXEoYXNjX2JvYXJkX3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgYWR2X2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIEFEVl9TQ1NJX1JFUV9RICoqKTsKK3N0YXRpYyBpbnQgYWR2X2dldF9zZ2xpc3QoYXNjX2JvYXJkX3QgKiwgYWR2X3JlcV90ICosIHN0cnVjdCBzY3NpX2NtbmQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGFzY19pc3JfY2FsbGJhY2soQVNDX0RWQ19WQVIgKiwgQVNDX1FET05FX0lORk8gKik7CitzdGF0aWMgdm9pZCBhZHZfaXNyX2NhbGxiYWNrKEFEVl9EVkNfVkFSICosIEFEVl9TQ1NJX1JFUV9RICopOworc3RhdGljIHZvaWQgYWR2X2FzeW5jX2NhbGxiYWNrKEFEVl9EVkNfVkFSICosIHVjaGFyKTsKK3N0YXRpYyB2b2lkIGFzY19lbnF1ZXVlKGFzY19xdWV1ZV90ICosIFJFUVAsIGludCk7CitzdGF0aWMgUkVRUCBhc2NfZGVxdWV1ZShhc2NfcXVldWVfdCAqLCBpbnQpOworc3RhdGljIFJFUVAgYXNjX2RlcXVldWVfbGlzdChhc2NfcXVldWVfdCAqLCBSRVFQICosIGludCk7CitzdGF0aWMgaW50IGFzY19ybXF1ZXVlKGFzY19xdWV1ZV90ICosIFJFUVApOworc3RhdGljIHZvaWQgYXNjX2V4ZWN1dGVfcXVldWUoYXNjX3F1ZXVlX3QgKik7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLVNUQVRJQyBpbnQgICAgICAgIGFzY19wcm9jX2NvcHkob2ZmX3QsIG9mZl90LCBjaGFyICosIGludCAsIGNoYXIgKiwgaW50KTsKLVNUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKLVNUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYWR2X2Jpb3Moc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7Ci1TVEFUSUMgaW50ICAgICAgICBhc2NfZ2V0X2VlcHJvbV9zdHJpbmcodXNob3J0ICpzZXJpYWxudW0sIHVjaGFyICpjcCk7Ci1TVEFUSUMgaW50ICAgICAgICBhc2NfcHJ0X2FzY19ib2FyZF9lZXByb20oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7Ci1TVEFUSUMgaW50ICAgICAgICBhc2NfcHJ0X2Fkdl9ib2FyZF9lZXByb20oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7Ci1TVEFUSUMgaW50ICAgICAgICBhc2NfcHJ0X2RyaXZlcl9jb25mKHN0cnVjdCBTY3NpX0hvc3QgKiwgY2hhciAqLCBpbnQpOwotU1RBVElDIGludCAgICAgICAgYXNjX3BydF9hc2NfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKLVNUQVRJQyBpbnQgICAgICAgIGFzY19wcnRfYWR2X2JvYXJkX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7Ci1TVEFUSUMgaW50ICAgICAgICBhc2NfcHJ0X2xpbmUoY2hhciAqLCBpbnQsIGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyBpbnQgYXNjX3Byb2NfY29weShvZmZfdCwgb2ZmX3QsIGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgYXNjX3BydF9hZHZfYmlvcyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgYXNjX2dldF9lZXByb21fc3RyaW5nKHVzaG9ydCAqc2VyaWFsbnVtLCB1Y2hhciAqY3ApOworc3RhdGljIGludCBhc2NfcHJ0X2FzY19ib2FyZF9lZXByb20oc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGFzY19wcnRfYWR2X2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgYXNjX3BydF9kcml2ZXJfY29uZihzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgYXNjX3BydF9hc2NfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgYXNjX3BydF9hZHZfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgYXNjX3BydF9saW5lKGNoYXIgKiwgaW50LCBjaGFyICpmbXQsIC4uLik7CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogLyogRGVjbGFyYXRpb24gZm9yIEFzYyBMaWJyYXJ5IGludGVybmFsIGZ1bmN0aW9ucyByZWZlcmVuY2VkIGJ5IGRyaXZlci4gKi8KLVNUQVRJQyBpbnQgICAgICAgICAgQXNjRmluZFNpZ25hdHVyZShQb3J0QWRkcik7Ci1TVEFUSUMgdXNob3J0ICAgICAgIEFzY0dldEVFUENvbmZpZyhQb3J0QWRkciwgQVNDRUVQX0NPTkZJRyAqLCB1c2hvcnQpOworc3RhdGljIGludCBBc2NGaW5kU2lnbmF0dXJlKFBvcnRBZGRyKTsKK3N0YXRpYyB1c2hvcnQgQXNjR2V0RUVQQ29uZmlnKFBvcnRBZGRyLCBBU0NFRVBfQ09ORklHICosIHVzaG9ydCk7CiAKIC8qIFN0YXRpc3RpY3MgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KICNpZmRlZiBBRFZBTlNZU19TVEFUUwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1TVEFUSUMgaW50ICAgICAgICAgIGFzY19wcnRfYm9hcmRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7Ci1TVEFUSUMgaW50ICAgICAgICAgIGFzY19wcnRfdGFyZ2V0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKiwgaW50LCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGFzY19wcnRfYm9hcmRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqLCBjaGFyICosIGludCk7CitzdGF0aWMgaW50IGFzY19wcnRfdGFyZ2V0X3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKiwgaW50LCBjaGFyICosIGludCk7CiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwogCiAvKiBEZWJ1ZyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLwogI2lmZGVmIEFEVkFOU1lTX0RFQlVHCi1TVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfc2NzaV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKik7Ci1TVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7Ci1TVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYXNjX2R2Y19jZmcoQVNDX0RWQ19DRkcgKik7Ci1TVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYXNjX2R2Y192YXIoQVNDX0RWQ19WQVIgKik7Ci1TVEFUSUMgdm9pZCAgICAgICAgIGFzY19wcnRfYXNjX3Njc2lfcShBU0NfU0NTSV9RICopOwotU1RBVElDIHZvaWQgICAgICAgICBhc2NfcHJ0X2FzY19xZG9uZV9pbmZvKEFTQ19RRE9ORV9JTkZPICopOwotU1RBVElDIHZvaWQgICAgICAgICBhc2NfcHJ0X2Fkdl9kdmNfY2ZnKEFEVl9EVkNfQ0ZHICopOwotU1RBVElDIHZvaWQgICAgICAgICBhc2NfcHJ0X2Fkdl9kdmNfdmFyKEFEVl9EVkNfVkFSICopOwotU1RBVElDIHZvaWQgICAgICAgICBhc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKEFEVl9TQ1NJX1JFUV9RICopOwotU1RBVElDIHZvaWQgICAgICAgICBhc2NfcHJ0X2Fkdl9zZ2Jsb2NrKGludCwgQURWX1NHX0JMT0NLICopOwotU1RBVElDIHZvaWQgICAgICAgICBhc2NfcHJ0X2hleChjaGFyICpmLCB1Y2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgYXNjX3BydF9zY3NpX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqKTsKK3N0YXRpYyB2b2lkIGFzY19wcnRfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CitzdGF0aWMgdm9pZCBhc2NfcHJ0X2FzY19kdmNfY2ZnKEFTQ19EVkNfQ0ZHICopOworc3RhdGljIHZvaWQgYXNjX3BydF9hc2NfZHZjX3ZhcihBU0NfRFZDX1ZBUiAqKTsKK3N0YXRpYyB2b2lkIGFzY19wcnRfYXNjX3Njc2lfcShBU0NfU0NTSV9RICopOworc3RhdGljIHZvaWQgYXNjX3BydF9hc2NfcWRvbmVfaW5mbyhBU0NfUURPTkVfSU5GTyAqKTsKK3N0YXRpYyB2b2lkIGFzY19wcnRfYWR2X2R2Y19jZmcoQURWX0RWQ19DRkcgKik7CitzdGF0aWMgdm9pZCBhc2NfcHJ0X2Fkdl9kdmNfdmFyKEFEVl9EVkNfVkFSICopOworc3RhdGljIHZvaWQgYXNjX3BydF9hZHZfc2NzaV9yZXFfcShBRFZfU0NTSV9SRVFfUSAqKTsKK3N0YXRpYyB2b2lkIGFzY19wcnRfYWR2X3NnYmxvY2soaW50LCBBRFZfU0dfQkxPQ0sgKik7CitzdGF0aWMgdm9pZCBhc2NfcHJ0X2hleChjaGFyICpmLCB1Y2hhciAqLCBpbnQpOwogI2VuZGlmIC8qIEFEVkFOU1lTX0RFQlVHICovCiAKLQogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAvKgogICogYWR2YW5zeXNfcHJvY19pbmZvKCkgLSAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLShBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRC0xKV0KQEAgLTQwNzMsMTM5MSArNDAzNCwyMTIgQEAKICAqLwogc3RhdGljIGludAogYWR2YW5zeXNfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKLQkJb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCisJCSAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQogewotICAgIHN0cnVjdCBTY3NpX0hvc3QgICAgKnNocDsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgICpib2FyZHA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIGNoYXIgICAgICAgICAgICAgICAgKmNwOwotICAgIGludAkJCWNwbGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgY250OwotICAgIGludCAgICAgICAgICAgICAgICAgdG90Y250OwotICAgIGludCAgICAgICAgICAgICAgICAgbGVmdGxlbjsKLSAgICBjaGFyICAgICAgICAgICAgICAgICpjdXJidWY7Ci0gICAgb2ZmX3QgICAgICAgICAgICAgICBhZHZvZmZzZXQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJaW50IGk7CisJY2hhciAqY3A7CisJaW50IGNwbGVuOworCWludCBjbnQ7CisJaW50IHRvdGNudDsKKwlpbnQgbGVmdGxlbjsKKwljaGFyICpjdXJidWY7CisJb2ZmX3QgYWR2b2Zmc2V0OwogI2lmZGVmIEFEVkFOU1lTX1NUQVRTCi0gICAgaW50ICAgICAgICAgICAgICAgICB0Z3RfaWQ7CisJaW50IHRndF9pZDsKICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwogCi0gICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiBiZWdpblxuIik7CisJQVNDX0RCRygxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiBiZWdpblxuIik7CiAKLSAgICAvKgotICAgICAqIFVzZXIgd3JpdGUgbm90IHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBpZiAoaW5vdXQgPT0gVFJVRSkgewotICAgICAgICByZXR1cm4oLUVOT1NZUyk7Ci0gICAgfQorCS8qCisJICogVXNlciB3cml0ZSBub3Qgc3VwcG9ydGVkLgorCSAqLworCWlmIChpbm91dCA9PSBUUlVFKSB7CisJCXJldHVybiAoLUVOT1NZUyk7CisJfQogCi0gICAgLyoKLSAgICAgKiBVc2VyIHJlYWQgb2YgL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC4uLl0gZmlsZS4KLSAgICAgKi8KKwkvKgorCSAqIFVzZXIgcmVhZCBvZiAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXSBmaWxlLgorCSAqLwogCi0gICAgLyogRmluZCB0aGUgc3BlY2lmaWVkIGJvYXJkLiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBhc2NfYm9hcmRfY291bnQ7IGkrKykgewotICAgICAgICBpZiAoYXNjX2hvc3RbaV0tPmhvc3Rfbm8gPT0gc2hvc3QtPmhvc3Rfbm8pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpID09IGFzY19ib2FyZF9jb3VudCkgewotICAgICAgICByZXR1cm4oLUVOT0VOVCk7Ci0gICAgfQorCS8qIEZpbmQgdGhlIHNwZWNpZmllZCBib2FyZC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXNjX2JvYXJkX2NvdW50OyBpKyspIHsKKwkJaWYgKGFzY19ob3N0W2ldLT5ob3N0X25vID09IHNob3N0LT5ob3N0X25vKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBhc2NfYm9hcmRfY291bnQpIHsKKwkJcmV0dXJuICgtRU5PRU5UKTsKKwl9CiAKLSAgICBzaHAgPSBhc2NfaG9zdFtpXTsKLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisJc2hwID0gYXNjX2hvc3RbaV07CisJYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOwogCi0gICAgLyogQ29weSByZWFkIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLwotICAgICpzdGFydCA9IGJ1ZmZlcjsKLSAgICBjdXJidWYgPSBidWZmZXI7Ci0gICAgYWR2b2Zmc2V0ID0gMDsKLSAgICB0b3RjbnQgPSAwOwotICAgIGxlZnRsZW4gPSBsZW5ndGg7CisJLyogQ29weSByZWFkIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLworCSpzdGFydCA9IGJ1ZmZlcjsKKwljdXJidWYgPSBidWZmZXI7CisJYWR2b2Zmc2V0ID0gMDsKKwl0b3RjbnQgPSAwOworCWxlZnRsZW4gPSBsZW5ndGg7CiAKLSAgICAvKgotICAgICAqIEdldCBib2FyZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogYWR2YW5zeXNfaW5mbygpIHJldHVybnMgdGhlIGJvYXJkIHN0cmluZyBmcm9tIGl0cyBvd24gc3RhdGljIGJ1ZmZlci4KLSAgICAgKi8KLSAgICBjcCA9IChjaGFyICopIGFkdmFuc3lzX2luZm8oc2hwKTsKLSAgICBzdHJjYXQoY3AsICJcbiIpOwotICAgIGNwbGVuID0gc3RybGVuKGNwKTsKLSAgICAvKiBDb3B5IGJvYXJkIGluZm9ybWF0aW9uLiAqLwotICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKLSAgICB0b3RjbnQgKz0gY250OwotICAgIGxlZnRsZW4gLT0gY250OwotICAgIGlmIChsZWZ0bGVuID09IDApIHsKLSAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOwotICAgICAgICByZXR1cm4gdG90Y250OwotICAgIH0KLSAgICBhZHZvZmZzZXQgKz0gY3BsZW47Ci0gICAgY3VyYnVmICs9IGNudDsKKwkvKgorCSAqIEdldCBib2FyZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorCSAqCisJICogYWR2YW5zeXNfaW5mbygpIHJldHVybnMgdGhlIGJvYXJkIHN0cmluZyBmcm9tIGl0cyBvd24gc3RhdGljIGJ1ZmZlci4KKwkgKi8KKwljcCA9IChjaGFyICopYWR2YW5zeXNfaW5mbyhzaHApOworCXN0cmNhdChjcCwgIlxuIik7CisJY3BsZW4gPSBzdHJsZW4oY3ApOworCS8qIENvcHkgYm9hcmQgaW5mb3JtYXRpb24uICovCisJY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworCXRvdGNudCArPSBjbnQ7CisJbGVmdGxlbiAtPSBjbnQ7CisJaWYgKGxlZnRsZW4gPT0gMCkgeworCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisJCXJldHVybiB0b3RjbnQ7CisJfQorCWFkdm9mZnNldCArPSBjcGxlbjsKKwljdXJidWYgKz0gY250OwogCi0gICAgLyoKLSAgICAgKiBEaXNwbGF5IFdpZGUgQm9hcmQgQklPUyBJbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBpZiAoQVNDX1dJREVfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICBjcCA9IGJvYXJkcC0+cHJ0YnVmOwotICAgICAgICBjcGxlbiA9IGFzY19wcnRfYWR2X2Jpb3Moc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKLSAgICAgICAgQVNDX0FTU0VSVChjcGxlbiA8IEFTQ19QUlRCVUZfU0laRSk7Ci0gICAgICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKLSAgICAgICAgdG90Y250ICs9IGNudDsKLSAgICAgICAgbGVmdGxlbiAtPSBjbnQ7Ci0gICAgICAgIGlmIChsZWZ0bGVuID09IDApIHsKLSAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19wcm9jX2luZm86IHRvdGNudCAlZFxuIiwgdG90Y250KTsKLSAgICAgICAgICAgIHJldHVybiB0b3RjbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYWR2b2Zmc2V0ICs9IGNwbGVuOwotICAgICAgICBjdXJidWYgKz0gY250OwotICAgIH0KKwkvKgorCSAqIERpc3BsYXkgV2lkZSBCb2FyZCBCSU9TIEluZm9ybWF0aW9uLgorCSAqLworCWlmIChBU0NfV0lERV9CT0FSRChib2FyZHApKSB7CisJCWNwID0gYm9hcmRwLT5wcnRidWY7CisJCWNwbGVuID0gYXNjX3BydF9hZHZfYmlvcyhzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworCQlBU0NfQVNTRVJUKGNwbGVuIDwgQVNDX1BSVEJVRl9TSVpFKTsKKwkJY250ID0KKwkJICAgIGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsCisJCQkJICBjcGxlbik7CisJCXRvdGNudCArPSBjbnQ7CisJCWxlZnRsZW4gLT0gY250OworCQlpZiAobGVmdGxlbiA9PSAwKSB7CisJCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisJCQlyZXR1cm4gdG90Y250OworCQl9CisJCWFkdm9mZnNldCArPSBjcGxlbjsKKwkJY3VyYnVmICs9IGNudDsKKwl9CiAKLSAgICAvKgotICAgICAqIERpc3BsYXkgZHJpdmVyIGluZm9ybWF0aW9uIGZvciBlYWNoIGRldmljZSBhdHRhY2hlZCB0byB0aGUgYm9hcmQuCi0gICAgICovCi0gICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKLSAgICBjcGxlbiA9IGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOwotICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOwotICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKLSAgICB0b3RjbnQgKz0gY250OwotICAgIGxlZnRsZW4gLT0gY250OwotICAgIGlmIChsZWZ0bGVuID09IDApIHsKLSAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOwotICAgICAgICByZXR1cm4gdG90Y250OwotICAgIH0KLSAgICBhZHZvZmZzZXQgKz0gY3BsZW47Ci0gICAgY3VyYnVmICs9IGNudDsKKwkvKgorCSAqIERpc3BsYXkgZHJpdmVyIGluZm9ybWF0aW9uIGZvciBlYWNoIGRldmljZSBhdHRhY2hlZCB0byB0aGUgYm9hcmQuCisJICovCisJY3AgPSBib2FyZHAtPnBydGJ1ZjsKKwljcGxlbiA9IGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworCUFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOworCWNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKKwl0b3RjbnQgKz0gY250OworCWxlZnRsZW4gLT0gY250OworCWlmIChsZWZ0bGVuID09IDApIHsKKwkJQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworCQlyZXR1cm4gdG90Y250OworCX0KKwlhZHZvZmZzZXQgKz0gY3BsZW47CisJY3VyYnVmICs9IGNudDsKIAotICAgIC8qCi0gICAgICogRGlzcGxheSBFRVBST00gY29uZmlndXJhdGlvbiBmb3IgdGhlIGJvYXJkLgotICAgICAqLwotICAgIGNwID0gYm9hcmRwLT5wcnRidWY7Ci0gICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICBjcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2VlcHJvbShzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNwbGVuID0gYXNjX3BydF9hZHZfYm9hcmRfZWVwcm9tKHNocCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7Ci0gICAgfQotICAgIEFTQ19BU1NFUlQoY3BsZW4gPCBBU0NfUFJUQlVGX1NJWkUpOwotICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKLSAgICB0b3RjbnQgKz0gY250OwotICAgIGxlZnRsZW4gLT0gY250OwotICAgIGlmIChsZWZ0bGVuID09IDApIHsKLSAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOwotICAgICAgICByZXR1cm4gdG90Y250OwotICAgIH0KLSAgICBhZHZvZmZzZXQgKz0gY3BsZW47Ci0gICAgY3VyYnVmICs9IGNudDsKKwkvKgorCSAqIERpc3BsYXkgRUVQUk9NIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBib2FyZC4KKwkgKi8KKwljcCA9IGJvYXJkcC0+cHJ0YnVmOworCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJY3BsZW4gPSBhc2NfcHJ0X2FzY19ib2FyZF9lZXByb20oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKwl9IGVsc2UgeworCQljcGxlbiA9IGFzY19wcnRfYWR2X2JvYXJkX2VlcHJvbShzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOworCX0KKwlBU0NfQVNTRVJUKGNwbGVuIDwgQVNDX1BSVEJVRl9TSVpFKTsKKwljbnQgPSBhc2NfcHJvY19jb3B5KGFkdm9mZnNldCwgb2Zmc2V0LCBjdXJidWYsIGxlZnRsZW4sIGNwLCBjcGxlbik7CisJdG90Y250ICs9IGNudDsKKwlsZWZ0bGVuIC09IGNudDsKKwlpZiAobGVmdGxlbiA9PSAwKSB7CisJCUFTQ19EQkcxKDEsICJhZHZhbnN5c19wcm9jX2luZm86IHRvdGNudCAlZFxuIiwgdG90Y250KTsKKwkJcmV0dXJuIHRvdGNudDsKKwl9CisJYWR2b2Zmc2V0ICs9IGNwbGVuOworCWN1cmJ1ZiArPSBjbnQ7CiAKLSAgICAvKgotICAgICAqIERpc3BsYXkgZHJpdmVyIGNvbmZpZ3VyYXRpb24gYW5kIGluZm9ybWF0aW9uIGZvciB0aGUgYm9hcmQuCi0gICAgICovCi0gICAgY3AgPSBib2FyZHAtPnBydGJ1ZjsKLSAgICBjcGxlbiA9IGFzY19wcnRfZHJpdmVyX2NvbmYoc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKLSAgICBBU0NfQVNTRVJUKGNwbGVuIDwgQVNDX1BSVEJVRl9TSVpFKTsKLSAgICBjbnQgPSBhc2NfcHJvY19jb3B5KGFkdm9mZnNldCwgb2Zmc2V0LCBjdXJidWYsIGxlZnRsZW4sIGNwLCBjcGxlbik7Ci0gICAgdG90Y250ICs9IGNudDsKLSAgICBsZWZ0bGVuIC09IGNudDsKLSAgICBpZiAobGVmdGxlbiA9PSAwKSB7Ci0gICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19wcm9jX2luZm86IHRvdGNudCAlZFxuIiwgdG90Y250KTsKLSAgICAgICAgcmV0dXJuIHRvdGNudDsKLSAgICB9Ci0gICAgYWR2b2Zmc2V0ICs9IGNwbGVuOwotICAgIGN1cmJ1ZiArPSBjbnQ7CisJLyoKKwkgKiBEaXNwbGF5IGRyaXZlciBjb25maWd1cmF0aW9uIGFuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGJvYXJkLgorCSAqLworCWNwID0gYm9hcmRwLT5wcnRidWY7CisJY3BsZW4gPSBhc2NfcHJ0X2RyaXZlcl9jb25mKHNocCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7CisJQVNDX0FTU0VSVChjcGxlbiA8IEFTQ19QUlRCVUZfU0laRSk7CisJY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworCXRvdGNudCArPSBjbnQ7CisJbGVmdGxlbiAtPSBjbnQ7CisJaWYgKGxlZnRsZW4gPT0gMCkgeworCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisJCXJldHVybiB0b3RjbnQ7CisJfQorCWFkdm9mZnNldCArPSBjcGxlbjsKKwljdXJidWYgKz0gY250OwogCiAjaWZkZWYgQURWQU5TWVNfU1RBVFMKLSAgICAvKgotICAgICAqIERpc3BsYXkgZHJpdmVyIHN0YXRpc3RpY3MgZm9yIHRoZSBib2FyZC4KLSAgICAgKi8KLSAgICBjcCA9IGJvYXJkcC0+cHJ0YnVmOwotICAgIGNwbGVuID0gYXNjX3BydF9ib2FyZF9zdGF0cyhzaHAsIGNwLCBBU0NfUFJUQlVGX1NJWkUpOwotICAgIEFTQ19BU1NFUlQoY3BsZW4gPD0gQVNDX1BSVEJVRl9TSVpFKTsKLSAgICBjbnQgPSBhc2NfcHJvY19jb3B5KGFkdm9mZnNldCwgb2Zmc2V0LCBjdXJidWYsIGxlZnRsZW4sIGNwLCBjcGxlbik7Ci0gICAgdG90Y250ICs9IGNudDsKLSAgICBsZWZ0bGVuIC09IGNudDsKLSAgICBpZiAobGVmdGxlbiA9PSAwKSB7Ci0gICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19wcm9jX2luZm86IHRvdGNudCAlZFxuIiwgdG90Y250KTsKLSAgICAgICAgcmV0dXJuIHRvdGNudDsKLSAgICB9Ci0gICAgYWR2b2Zmc2V0ICs9IGNwbGVuOwotICAgIGN1cmJ1ZiArPSBjbnQ7CisJLyoKKwkgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciB0aGUgYm9hcmQuCisJICovCisJY3AgPSBib2FyZHAtPnBydGJ1ZjsKKwljcGxlbiA9IGFzY19wcnRfYm9hcmRfc3RhdHMoc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKwlBU0NfQVNTRVJUKGNwbGVuIDw9IEFTQ19QUlRCVUZfU0laRSk7CisJY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworCXRvdGNudCArPSBjbnQ7CisJbGVmdGxlbiAtPSBjbnQ7CisJaWYgKGxlZnRsZW4gPT0gMCkgeworCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisJCXJldHVybiB0b3RjbnQ7CisJfQorCWFkdm9mZnNldCArPSBjcGxlbjsKKwljdXJidWYgKz0gY250OwogCi0gICAgLyoKLSAgICAgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciBlYWNoIHRhcmdldC4KLSAgICAgKi8KLSAgICBmb3IgKHRndF9pZCA9IDA7IHRndF9pZCA8PSBBRFZfTUFYX1RJRDsgdGd0X2lkKyspIHsKLSAgICAgIGNwID0gYm9hcmRwLT5wcnRidWY7Ci0gICAgICBjcGxlbiA9IGFzY19wcnRfdGFyZ2V0X3N0YXRzKHNocCwgdGd0X2lkLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKLSAgICAgIEFTQ19BU1NFUlQoY3BsZW4gPD0gQVNDX1BSVEJVRl9TSVpFKTsKLSAgICAgIGNudCA9IGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsIGNwbGVuKTsKLSAgICAgIHRvdGNudCArPSBjbnQ7Ci0gICAgICBsZWZ0bGVuIC09IGNudDsKLSAgICAgIGlmIChsZWZ0bGVuID09IDApIHsKLSAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOwotICAgICAgICByZXR1cm4gdG90Y250OwotICAgICAgfQotICAgICAgYWR2b2Zmc2V0ICs9IGNwbGVuOwotICAgICAgY3VyYnVmICs9IGNudDsKLSAgICB9CisJLyoKKwkgKiBEaXNwbGF5IGRyaXZlciBzdGF0aXN0aWNzIGZvciBlYWNoIHRhcmdldC4KKwkgKi8KKwlmb3IgKHRndF9pZCA9IDA7IHRndF9pZCA8PSBBRFZfTUFYX1RJRDsgdGd0X2lkKyspIHsKKwkJY3AgPSBib2FyZHAtPnBydGJ1ZjsKKwkJY3BsZW4gPSBhc2NfcHJ0X3RhcmdldF9zdGF0cyhzaHAsIHRndF9pZCwgY3AsIEFTQ19QUlRCVUZfU0laRSk7CisJCUFTQ19BU1NFUlQoY3BsZW4gPD0gQVNDX1BSVEJVRl9TSVpFKTsKKwkJY250ID0KKwkJICAgIGFzY19wcm9jX2NvcHkoYWR2b2Zmc2V0LCBvZmZzZXQsIGN1cmJ1ZiwgbGVmdGxlbiwgY3AsCisJCQkJICBjcGxlbik7CisJCXRvdGNudCArPSBjbnQ7CisJCWxlZnRsZW4gLT0gY250OworCQlpZiAobGVmdGxlbiA9PSAwKSB7CisJCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisJCQlyZXR1cm4gdG90Y250OworCQl9CisJCWFkdm9mZnNldCArPSBjcGxlbjsKKwkJY3VyYnVmICs9IGNudDsKKwl9CiAjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KIAotICAgIC8qCi0gICAgICogRGlzcGxheSBBc2MgTGlicmFyeSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBmb3IgdGhlIGJvYXJkLgotICAgICAqLwotICAgIGNwID0gYm9hcmRwLT5wcnRidWY7Ci0gICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICBjcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjcGxlbiA9IGFzY19wcnRfYWR2X2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKLSAgICB9Ci0gICAgQVNDX0FTU0VSVChjcGxlbiA8IEFTQ19QUlRCVUZfU0laRSk7Ci0gICAgY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOwotICAgIHRvdGNudCArPSBjbnQ7Ci0gICAgbGVmdGxlbiAtPSBjbnQ7Ci0gICAgaWYgKGxlZnRsZW4gPT0gMCkgewotICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7Ci0gICAgICAgIHJldHVybiB0b3RjbnQ7Ci0gICAgfQotICAgIGFkdm9mZnNldCArPSBjcGxlbjsKLSAgICBjdXJidWYgKz0gY250OworCS8qCisJICogRGlzcGxheSBBc2MgTGlicmFyeSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKwkgKiBmb3IgdGhlIGJvYXJkLgorCSAqLworCWNwID0gYm9hcmRwLT5wcnRidWY7CisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCQljcGxlbiA9IGFzY19wcnRfYXNjX2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKwl9IGVsc2UgeworCQljcGxlbiA9IGFzY19wcnRfYWR2X2JvYXJkX2luZm8oc2hwLCBjcCwgQVNDX1BSVEJVRl9TSVpFKTsKKwl9CisJQVNDX0FTU0VSVChjcGxlbiA8IEFTQ19QUlRCVUZfU0laRSk7CisJY250ID0gYXNjX3Byb2NfY29weShhZHZvZmZzZXQsIG9mZnNldCwgY3VyYnVmLCBsZWZ0bGVuLCBjcCwgY3BsZW4pOworCXRvdGNudCArPSBjbnQ7CisJbGVmdGxlbiAtPSBjbnQ7CisJaWYgKGxlZnRsZW4gPT0gMCkgeworCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfcHJvY19pbmZvOiB0b3RjbnQgJWRcbiIsIHRvdGNudCk7CisJCXJldHVybiB0b3RjbnQ7CisJfQorCWFkdm9mZnNldCArPSBjcGxlbjsKKwljdXJidWYgKz0gY250OwogCi0gICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Byb2NfaW5mbzogdG90Y250ICVkXG4iLCB0b3RjbnQpOworCUFTQ19EQkcxKDEsICJhZHZhbnN5c19wcm9jX2luZm86IHRvdGNudCAlZFxuIiwgdG90Y250KTsKIAotICAgIHJldHVybiB0b3RjbnQ7CisJcmV0dXJuIHRvdGNudDsKIH0KICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAvKgotICogYWR2YW5zeXNfZGV0ZWN0KCkKLSAqCi0gKiBEZXRlY3QgZnVuY3Rpb24gZm9yIEFkdmFuU3lzIGFkYXB0ZXJzLgotICoKLSAqIEFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgaG9zdCBkcml2ZXIncyBzY3NpX2hvc3RzIGVudHJ5LgotICoKLSAqIFJldHVybiBudW1iZXIgb2YgYWRhcHRlcnMgZm91bmQuCi0gKgotICogTm90ZTogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uCi0gKiBpdCBtdXN0IG5vdCBjYWxsIFNDU0kgbWlkLWxldmVsIGZ1bmN0aW9ucyBpbmNsdWRpbmcgc2NzaV9tYWxsb2MoKQotICogYW5kIHNjc2lfZnJlZSgpLgotICovCi1zdGF0aWMgaW50IF9faW5pdAotYWR2YW5zeXNfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0gICAgc3RhdGljIGludCAgICAgICAgICBkZXRlY3RfY2FsbGVkID0gQVNDX0ZBTFNFOwotICAgIGludCAgICAgICAgICAgICAgICAgaW9wOwotICAgIGludCAgICAgICAgICAgICAgICAgYnVzOwotICAgIHN0cnVjdCBTY3NpX0hvc3QgICAgKnNocCA9IE5VTEw7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwID0gTlVMTDsKLSAgICBBU0NfRFZDX1ZBUiAgICAgICAgICphc2NfZHZjX3ZhcnAgPSBOVUxMOwotICAgIEFEVl9EVkNfVkFSICAgICAgICAgKmFkdl9kdmNfdmFycCA9IE5VTEw7Ci0gICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dwID0gTlVMTDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGlvcG9ydCA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBzaGFyZV9pcnEgPSBGQUxTRTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGlvbGVuID0gMDsKLSAgICBzdHJ1Y3QgZGV2aWNlCSpkZXYgPSBOVUxMOwotI2lmZGVmIENPTkZJR19QQ0kKLSAgICBpbnQgICAgICAgICAgICAgICAgIHBjaV9pbml0X3NlYXJjaCA9IDA7Ci0gICAgc3RydWN0IHBjaV9kZXYgICAgICAqcGNpX2RldmljZXBbQVNDX05VTV9CT0FSRF9TVVBQT1JURURdOwotICAgIGludCAgICAgICAgICAgICAgICAgcGNpX2NhcmRfY250X21heCA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBwY2lfY2FyZF9jbnQgPSAwOwotICAgIHN0cnVjdCBwY2lfZGV2ICAgICAgKnBjaV9kZXZwID0gTlVMTDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHBjaV9kZXZpY2VfaWRfY250ID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBjaV9kZXZpY2VfaWRbQVNDX1BDSV9ERVZJQ0VfSURfQ05UXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfQVNQXzEyMDBBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MFVXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF8zOEMwODAwX1JFVjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEXzM4QzE2MDBfUkVWMQotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBBRFZfUEFERFIgICAgICAgICAgIHBjaV9tZW1vcnlfYWRkcmVzczsKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0gICAgaW50ICAgICAgICAgICAgICAgICB3YXJuX2NvZGUsIGVycl9jb2RlOwotICAgIGludCAgICAgICAgICAgICAgICAgcmV0OwotCi0gICAgaWYgKGRldGVjdF9jYWxsZWQgPT0gQVNDX0ZBTFNFKSB7Ci0gICAgICAgIGRldGVjdF9jYWxsZWQgPSBBU0NfVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGsoIkFkdmFuU3lzIFNDU0k6IGFkdmFuc3lzX2RldGVjdCgpIG11bHRpcGxlIGNhbGxzIGlnbm9yZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IGJlZ2luXG4iKTsKLQotICAgIGFzY19ib2FyZF9jb3VudCA9IDA7Ci0KLSAgICAvKgotICAgICAqIElmIEkvTyBwb3J0IHByb2JpbmcgaGFzIGJlZW4gbW9kaWZpZWQsIHRoZW4gdmVyaWZ5IGFuZAotICAgICAqIGNsZWFuLXVwIHRoZSAnYXNjX2lvcG9ydCcgbGlzdC4KLSAgICAgKi8KLSAgICBpZiAoYXNjX2lvcGZsYWcgPT0gQVNDX1RSVUUpIHsKLSAgICAgICAgZm9yIChpb3BvcnQgPSAwOyBpb3BvcnQgPCBBU0NfTlVNX0lPUE9SVF9QUk9CRTsgaW9wb3J0KyspIHsKLSAgICAgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19kZXRlY3Q6IGFzY19pb3BvcnRbJWRdIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgaW9wb3J0LCBhc2NfaW9wb3J0W2lvcG9ydF0pOwotICAgICAgICAgICAgaWYgKGFzY19pb3BvcnRbaW9wb3J0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpb3AgPSAwOyBpb3AgPCBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYOyBpb3ArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoX2FzY19kZWZfaW9wX2Jhc2VbaW9wXSA9PSBhc2NfaW9wb3J0W2lvcG9ydF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpb3AgPT0gQVNDX0lPQURSX1RBQkxFX01BWF9JWCkgewotICAgICAgICAgICAgICAgICAgICBwcmludGsoCi0iQWR2YW5TeXMgU0NTSTogc3BlY2lmaWVkIEkvTyBQb3J0IDB4JVggaXMgaW52YWxpZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY19pb3BvcnRbaW9wb3J0XSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19pb3BvcnRbaW9wb3J0XSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlvcG9ydCA9IDA7Ci0gICAgfQotCi0gICAgZm9yIChidXMgPSAwOyBidXMgPCBBU0NfTlVNX0JVUzsgYnVzKyspIHsKLQotICAgICAgICBBU0NfREJHMigxLCAiYWR2YW5zeXNfZGV0ZWN0OiBidXMgc2VhcmNoIHR5cGUgJWQgKCVzKVxuIiwKLSAgICAgICAgICAgIGJ1cywgYXNjX2J1c19uYW1lW2J1c10pOwotICAgICAgICBpb3AgPSAwOwotCi0gICAgICAgIHdoaWxlIChhc2NfYm9hcmRfY291bnQgPCBBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRCkgewotCi0gICAgICAgICAgICBBU0NfREJHMSgyLCAiYWR2YW5zeXNfZGV0ZWN0OiBhc2NfYm9hcmRfY291bnQgJWRcbiIsCi0gICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50KTsKLQotICAgICAgICAgICAgc3dpdGNoIChhc2NfYnVzW2J1c10pIHsKLSAgICAgICAgICAgIGNhc2UgQVNDX0lTX0lTQToKLSAgICAgICAgICAgIGNhc2UgQVNDX0lTX1ZMOgotI2lmZGVmIENPTkZJR19JU0EKLSAgICAgICAgICAgICAgICBpZiAoYXNjX2lvcGZsYWcgPT0gQVNDX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlvcCA9IEFzY1NlYXJjaElPUG9ydEFkZHIoaW9wLCBhc2NfYnVzW2J1c10pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIElTQSBhbmQgVkwgSS9PIHBvcnQgc2Nhbm5pbmcgaGFzIGVpdGhlciBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAqIGVsaW1pbmF0ZWQgb3IgbGltaXRlZCB0byBzZWxlY3RlZCBwb3J0cyBvbgotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgTElMTyBjb21tYW5kIGxpbmUsIC9ldGMvbGlsby5jb25mLCBvcgotICAgICAgICAgICAgICAgICAgICAgKiBieSBzZXR0aW5nIHZhcmlhYmxlcyB3aGVuIHRoZSBtb2R1bGUgd2FzIGxvYWRlZC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogSS9PIHBvcnQgc2Nhbm5pbmcgbW9kaWZpZWRcbiIpOwotICAgICAgICAgICAgICAgIGlvcG9ydF90cnlfYWdhaW46Ci0gICAgICAgICAgICAgICAgICAgIGlvcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoOyBpb3BvcnQgPCBBU0NfTlVNX0lPUE9SVF9QUk9CRTsgaW9wb3J0KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW9wID0gYXNjX2lvcG9ydFtpb3BvcnRdKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRzEoMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogcHJvYmluZyBJL08gcG9ydCAweCV4Li4uXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvcCk7Ci0JCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvcCwgQVNDX0lPQURSX0dBUCwgImFkdmFuc3lzIikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygKLSJBZHZhblN5cyBTQ1NJOiBzcGVjaWZpZWQgSS9PIFBvcnQgMHglWCBpcyBidXN5XG4iLCBpb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHRyeSB0aGlzIEkvTyBwb3J0IHR3aWNlLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19pb3BvcnRbaW9wb3J0XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpb3BvcnRfdHJ5X2FnYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBc2NGaW5kU2lnbmF0dXJlKGlvcCkgPT0gQVNDX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKAotIkFkdmFuU3lzIFNDU0k6IHNwZWNpZmllZCBJL08gUG9ydCAweCVYIGhhcyBubyBhZGFwdGVyXG4iLCBpb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHRyeSB0aGlzIEkvTyBwb3J0IHR3aWNlLiAqLwotCQkJICAgIHJlbGVhc2VfcmVnaW9uKGlvcCwgQVNDX0lPQURSX0dBUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhpcyBpc24ndCBhbiBJU0EgYm9hcmQsIHRoZW4gaXQgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGEgVkwgYm9hcmQuIElmIGN1cnJlbnRseSBsb29raW5nIGFuIElTQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJvYXJkIGlzIGJlaW5nIGxvb2tlZCBmb3IgdGhlbiB0cnkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5vdGhlciBJU0EgYm9hcmQgaW4gJ2FzY19pb3BvcnQnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhc2NfYnVzW2J1c10gPT0gQVNDX0lTX0lTQSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wLCBBU0NfSVNfSVNBKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0hJUF9WRVJfSVNBX0JJVCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERvbid0IGNsZWFyICdhc2NfaW9wb3J0W2lvcG9ydF0nLiBUcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYm9hcmQgYWdhaW4gZm9yIFZMLiBJbmNyZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdpb3BvcnQnIHBhc3QgdGhpcyBib2FyZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9wb3J0Kys7Ci0JCQkJIHJlbGVhc2VfcmVnaW9uKGlvcCwgQVNDX0lPQURSX0dBUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlvcG9ydF90cnlfYWdhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgYm9hcmQgYXBwZWFycyBnb29kLCBkb24ndCB0cnkgdGhlIEkvTyBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhZ2FpbiBieSBjbGVhcmluZyBpdHMgdmFsdWUuIEluY3JlbWVudCAnaW9wb3J0JwotICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2lvcG9ydFtpb3BvcnQrK10gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBBU0NfSVNfRUlTQToKLSNpZmRlZiBDT05GSUdfSVNBCi0gICAgICAgICAgICAgICAgaW9wID0gQXNjU2VhcmNoSU9Qb3J0QWRkcihpb3AsIGFzY19idXNbYnVzXSk7Ci0jZW5kaWYgLyogQ09ORklHX0lTQSAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEFTQ19JU19QQ0k6Ci0jaWZkZWYgQ09ORklHX1BDSQotICAgICAgICAgICAgICAgIGlmIChwY2lfaW5pdF9zZWFyY2ggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaSwgajsKLQotICAgICAgICAgICAgICAgICAgICBwY2lfaW5pdF9zZWFyY2ggPSAxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgYWxsIFBDSSBjYXJkcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBjaV9kZXZpY2VfaWRfY250IDwgQVNDX1BDSV9ERVZJQ0VfSURfQ05UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBjaV9kZXZwID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQVNQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZpY2VfaWRbcGNpX2RldmljZV9pZF9jbnRdLCBwY2lfZGV2cCkpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZpY2VfaWRfY250Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2cCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2aWNlcFtwY2lfY2FyZF9jbnRfbWF4KytdID0gcGNpX2RldnA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU29ydCBQQ0kgY2FyZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IFBDSSBCdXMsIFNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAqIGFuZCBEZXZpY2UgTnVtYmVyLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBjaV9jYXJkX2NudF9tYXggLSAxOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgcGNpX2NhcmRfY250X21heDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwY2lfZGV2aWNlcFtqXS0+YnVzLT5udW1iZXIgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZXBbaV0tPmJ1cy0+bnVtYmVyKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBjaV9kZXZpY2VwW2pdLT5idXMtPm51bWJlciA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kZXZpY2VwW2ldLT5idXMtPm51bWJlcikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGNpX2RldmljZXBbal0tPmRldmZuIDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZXBbaV0tPmRldmZuKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldnAgPSBwY2lfZGV2aWNlcFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZXBbaV0gPSBwY2lfZGV2aWNlcFtqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2RldmljZXBbal0gPSBwY2lfZGV2cDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwY2lfY2FyZF9jbnQgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBjaV9jYXJkX2NudCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwY2lfY2FyZF9jbnQgPT0gcGNpX2NhcmRfY250X21heCkgewotICAgICAgICAgICAgICAgICAgICBpb3AgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBjaV9kZXZwID0gcGNpX2RldmljZXBbcGNpX2NhcmRfY250XTsKLQotICAgICAgICAgICAgICAgICAgICBBU0NfREJHMigyLAotICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogZGV2Zm4gJWQsIGJ1cyBudW1iZXIgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2cC0+ZGV2Zm4sIHBjaV9kZXZwLT5idXMtPm51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlvcCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2cCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19EQkcyKDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiB2ZW5kb3JJRCAlWCwgZGV2aWNlSUQgJVhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGV2cC0+dmVuZG9yLCBwY2lfZGV2cC0+ZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgQVNDX0RCRzIoMiwgImFkdmFuc3lzX2RldGVjdDogaW9wICVYLCBpcnFMaW5lICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaW9wLCBwY2lfZGV2cC0+aXJxKTsKLSAgICAgICAgICAgICAgICB9Ci0JCWlmKHBjaV9kZXZwKQotCQkgICAgZGV2ID0gJnBjaV9kZXZwLT5kZXY7Ci0KLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgiYWR2YW5zeXNfZGV0ZWN0OiB1bmtub3duIGJ1cyB0eXBlOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgYXNjX2J1c1tidXNdKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGlvcCAweCV4XG4iLCBpb3ApOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQWRhcHRlciBub3QgZm91bmQsIHRyeSBuZXh0IGJ1cyB0eXBlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaW9wID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFkYXB0ZXIgZm91bmQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogUmVnaXN0ZXIgdGhlIGFkYXB0ZXIsIGdldCBpdHMgY29uZmlndXJhdGlvbiwgYW5kCi0gICAgICAgICAgICAgKiBpbml0aWFsaXplIGl0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBBU0NfREJHKDIsICJhZHZhbnN5c19kZXRlY3Q6IHNjc2lfcmVnaXN0ZXIoKVxuIik7Ci0gICAgICAgICAgICBzaHAgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihhc2NfYm9hcmRfdCkpOwotCi0gICAgICAgICAgICBpZiAoc2hwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIFNjc2lfSG9zdCBvZiBlYWNoIGJvYXJkIGZvdW5kLiAqLwotICAgICAgICAgICAgYXNjX2hvc3RbYXNjX2JvYXJkX2NvdW50KytdID0gc2hwOwotCi0gICAgICAgICAgICAvKiBJbml0aWFsaXplIHByaXZhdGUgcGVyIGJvYXJkIGRhdGEgKi8KLSAgICAgICAgICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKLSAgICAgICAgICAgIG1lbXNldChib2FyZHAsIDAsIHNpemVvZihhc2NfYm9hcmRfdCkpOwotICAgICAgICAgICAgYm9hcmRwLT5pZCA9IGFzY19ib2FyZF9jb3VudCAtIDE7Ci0KLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgc3BpbmxvY2suICovCi0gICAgICAgICAgICBzcGluX2xvY2tfaW5pdCgmYm9hcmRwLT5sb2NrKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEhhbmRsZSBib3RoIG5hcnJvdyBhbmQgd2lkZSBib2FyZHMuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogSWYgYSBXaWRlIGJvYXJkIHdhcyBkZXRlY3RlZCwgc2V0IHRoZSBib2FyZCBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAqIHdpZGUgYm9hcmQgZmxhZy4gU2V0LXVwIHRoZSBib2FyZCBzdHJ1Y3R1cmUgYmFzZWQgb24KLSAgICAgICAgICAgICAqIHRoZSBib2FyZCB0eXBlLgotICAgICAgICAgICAgICovCi0jaWZkZWYgQ09ORklHX1BDSQotICAgICAgICAgICAgaWYgKGFzY19idXNbYnVzXSA9PSBBU0NfSVNfUENJICYmCi0gICAgICAgICAgICAgICAgKHBjaV9kZXZwLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVVcgfHwKLSAgICAgICAgICAgICAgICAgcGNpX2RldnAtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzM4QzA4MDBfUkVWMSB8fAotICAgICAgICAgICAgICAgICBwY2lfZGV2cC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfMzhDMTYwMF9SRVYxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib2FyZHAtPmZsYWdzIHw9IEFTQ19JU19XSURFX0JPQVJEOwotICAgICAgICAgICAgfQotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQotICAgICAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogbmFycm93IGJvYXJkXG4iKTsKLSAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyOwotICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+YnVzX3R5cGUgPSBhc2NfYnVzW2J1c107Ci0gICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5kcnZfcHRyID0gYm9hcmRwOwotICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+Y2ZnID0gJmJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZzsKLSAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmNmZy0+b3ZlcnJ1bl9idWYgPSAmb3ZlcnJ1bl9idWZbMF07Ci0gICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5pb3BfYmFzZSA9IGlvcDsKLSAgICAgICAgICAgICAgICBhc2NfZHZjX3ZhcnAtPmlzcl9jYWxsYmFjayA9IGFzY19pc3JfY2FsbGJhY2s7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogd2lkZSBib2FyZFxuIik7Ci0gICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKLSAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmRydl9wdHIgPSBib2FyZHA7Ci0gICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmcgPSAmYm9hcmRwLT5kdmNfY2ZnLmFkdl9kdmNfY2ZnOwotICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+aXNyX2NhbGxiYWNrID0gYWR2X2lzcl9jYWxsYmFjazsKLSAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmFzeW5jX2NhbGxiYWNrID0gYWR2X2FzeW5jX2NhbGxiYWNrOwotI2lmZGVmIENPTkZJR19QQ0kKLSAgICAgICAgICAgICAgICBpZiAocGNpX2RldnAtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FTUF9BQlA5NDBVVykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogQVNDLTM1NTBcbiIpOwotICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9IEFEVl9DSElQX0FTQzM1NTA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwY2lfZGV2cC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfMzhDMDgwMF9SRVYxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfZGV0ZWN0OiBBU0MtMzhDMDgwMFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID0gQURWX0NISVBfQVNDMzhDMDgwMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2RldGVjdDogQVNDLTM4QzE2MDBcbiIpOwotICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9IEFEVl9DSElQX0FTQzM4QzE2MDA7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogTWFwIHRoZSBib2FyZCdzIHJlZ2lzdGVycyBpbnRvIHZpcnR1YWwgbWVtb3J5IGZvcgotICAgICAgICAgICAgICAgICAqIFBDSSBzbGF2ZSBhY2Nlc3MuIE9ubHkgbWVtb3J5IGFjY2Vzc2VzIGFyZSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICogYWNjZXNzIHRoZSBib2FyZCdzIHJlZ2lzdGVycy4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIE5vdGU6IFRoZSBQQ0kgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIGlzIG5vdCBhbHdheXMKLSAgICAgICAgICAgICAgICAgKiBwYWdlIGFsaWduZWQsIGJ1dCB0aGUgYWRkcmVzcyBwYXNzZWQgdG8gaW9yZW1hcCgpCi0gICAgICAgICAgICAgICAgICogbXVzdCBiZSBwYWdlIGFsaWduZWQuIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgKiBQQ0kgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIHdpbGwgbm90IGNyb3NzIGEgcGFnZQotICAgICAgICAgICAgICAgICAqIGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW9sZW4gPSBBRFZfMzU1MF9JT0xFTjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpb2xlbiA9IEFEVl8zOEMwODAwX0lPTEVOOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW9sZW4gPSBBRFZfMzhDMTYwMF9JT0xFTjsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQ09ORklHX1BDSQotICAgICAgICAgICAgICAgIHBjaV9tZW1vcnlfYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2cCwgMSk7Ci0gICAgICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogcGNpX21lbW9yeV9hZGRyZXNzOiAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAgICAgKHVsb25nKSBwY2lfbWVtb3J5X2FkZHJlc3MpOwotICAgICAgICAgICAgICAgIGlmICgoYm9hcmRwLT5pb3JlbWFwX2FkZHIgPQotICAgICAgICAgICAgICAgICAgICBpb3JlbWFwKHBjaV9tZW1vcnlfYWRkcmVzcyAmIFBBR0VfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKLSJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiBpb3JlbWFwKCV4LCAlZCkgcmV0dXJuZWQgTlVMTFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgcGNpX21lbW9yeV9hZGRyZXNzLCBpb2xlbik7Ci0gICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7Ci0gICAgICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07Ci0gICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGlvcmVtYXBfYWRkcjogMHglbHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICh1bG9uZykgYm9hcmRwLT5pb3JlbWFwX2FkZHIpOwotICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UgPSAoQWR2UG9ydEFkZHIpCi0gICAgICAgICAgICAgICAgICAgIChib2FyZHAtPmlvcmVtYXBfYWRkciArCi0gICAgICAgICAgICAgICAgICAgICAocGNpX21lbW9yeV9hZGRyZXNzIC0gKHBjaV9tZW1vcnlfYWRkcmVzcyAmIFBBR0VfTUFTSykpKTsKLSAgICAgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBpb3BfYmFzZTogMHglbHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UpOwotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRXZlbiB0aG91Z2ggaXQgaXNuJ3QgdXNlZCB0byBhY2Nlc3Mgd2lkZSBib2FyZHMsIG90aGVyCi0gICAgICAgICAgICAgICAgICogdGhhbiBmb3IgdGhlIGRlYnVnIGxpbmUgYmVsb3csIHNhdmUgSS9PIFBvcnQgYWRkcmVzcyBzbwotICAgICAgICAgICAgICAgICAqIHRoYXQgaXQgY2FuIGJlIHJlcG9ydGVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvYXJkcC0+aW9wb3J0ID0gaW9wOwotCi0gICAgICAgICAgICAgICAgQVNDX0RCRzIoMSwKLSJhZHZhbnN5c19kZXRlY3Q6IGlvcGJfY2hpcF9pZF8xIDB4JXgsIGlvcHdfY2hpcF9pZF8wIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIGlucChpb3AgKyAxKSwgKHVzaG9ydCkgaW5wdyhpb3ApKTsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciBwcmludGluZyBpbmZvcm1hdGlvbiBmcm9tCi0gICAgICAgICAgICAgKiAvcHJvYy9zY3NpL2FkdmFuc3lzL1swLi4uXS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChib2FyZHAtPnBydGJ1ZiA9Ci0gICAgICAgICAgICAgICAga21hbGxvYyhBU0NfUFJUQlVGX1NJWkUsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKLSJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiBrbWFsbG9jKCVkLCAlZCkgcmV0dXJuZWQgTlVMTFxuIiwKLSAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgQVNDX1BSVEJVRl9TSVpFLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgICAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKLSAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQtLTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotCi0gICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0JCWFzY19kdmNfdmFycC0+Y2ZnLT5kZXYgPSBkZXY7Ci0JCS8qCi0gICAgICAgICAgICAgICAgICogU2V0IHRoZSBib2FyZCBidXMgdHlwZSBhbmQgUENJIElSUSBiZWZvcmUKLSAgICAgICAgICAgICAgICAgKiBjYWxsaW5nIEFzY0luaXRHZXRDb25maWcoKS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFzY19kdmNfdmFycC0+YnVzX3R5cGUpIHsKLSNpZmRlZiBDT05GSUdfSVNBCi0gICAgICAgICAgICAgICAgY2FzZSBBU0NfSVNfSVNBOgotICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVNDX0lTX1ZMOgotICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJlX2lycSA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFTQ19JU19FSVNBOgotICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJlX2lycSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KLSNpZmRlZiBDT05GSUdfUENJCi0gICAgICAgICAgICAgICAgY2FzZSBBU0NfSVNfUENJOgotICAgICAgICAgICAgICAgICAgICBzaHAtPmlycSA9IGFzY19kdmNfdmFycC0+aXJxX25vID0gcGNpX2RldnAtPmlycTsKLSAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5jZmctPnBjaV9zbG90X2luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BDSV9NS0lEKHBjaV9kZXZwLT5idXMtPm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfU0xPVChwY2lfZGV2cC0+ZGV2Zm4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9GVU5DKHBjaV9kZXZwLT5kZXZmbikpOwotICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHNoYXJlX2lycSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQyKAotImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQ6IHVua25vd24gYWRhcHRlciB0eXBlOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+YnVzX3R5cGUpOwotICAgICAgICAgICAgICAgICAgICBzaHAtPnVuY2hlY2tlZF9pc2FfZG1hID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgc2hhcmVfaXJxID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWR2X2R2Y192YXJwLT5jZmctPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEZvciBXaWRlIGJvYXJkcyBzZXQgUENJIGluZm9ybWF0aW9uIGJlZm9yZSBjYWxsaW5nCi0gICAgICAgICAgICAgICAgICogQWR2SW5pdEdldENvbmZpZygpLgotICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIENPTkZJR19QQ0kKLSAgICAgICAgICAgICAgICBzaHAtPmlycSA9IGFkdl9kdmNfdmFycC0+aXJxX25vID0gcGNpX2RldnAtPmlycTsKLSAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+cGNpX3Nsb3RfaW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QQ0lfTUtJRChwY2lfZGV2cC0+YnVzLT5udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQQ0lfU0xPVChwY2lfZGV2cC0+ZGV2Zm4pLAotICAgICAgICAgICAgICAgICAgICAgICAgUENJX0ZVTkMocGNpX2RldnAtPmRldmZuKSk7Ci0gICAgICAgICAgICAgICAgc2hwLT51bmNoZWNrZWRfaXNhX2RtYSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHNoYXJlX2lycSA9IFRSVUU7Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmVhZCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgKiBOT1RFOiBBc2NJbml0R2V0Q29uZmlnKCkgbWF5IGNoYW5nZSB0aGUgYm9hcmQncwotICAgICAgICAgICAgICAgICAgKiBidXNfdHlwZSB2YWx1ZS4gVGhlIGFzY19idXNbYnVzXSB2YWx1ZSBzaG91bGQgbm8KLSAgICAgICAgICAgICAgICAgICogbG9uZ2VyIGJlIHVzZWQuIElmIHRoZSBidXNfdHlwZSBmaWVsZCBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAqIHJlZmVyZW5jZWQgb25seSB1c2UgdGhlIGJpdC13aXNlIEFORCBvcGVyYXRvciAiJiIuCi0gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFTQ19EQkcoMiwgImFkdmFuc3lzX2RldGVjdDogQXNjSW5pdEdldENvbmZpZygpXG4iKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gocmV0ID0gQXNjSW5pdEdldENvbmZpZyhhc2NfZHZjX3ZhcnApKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOiAgICAvKiBObyBlcnJvciAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0lPX1BPUlRfUk9UQVRFOgotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAotIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiBJL08gcG9ydCBhZGRyZXNzIG1vZGlmaWVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fQVVUT19DT05GSUc6Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCi0iQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IEkvTyBwb3J0IGluY3JlbWVudCBzd2l0Y2ggZW5hYmxlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0VFUFJPTV9DSEtTVU06Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCi0iQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IEVFUFJPTSBjaGVja3N1bSBlcnJvclxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFTQ19XQVJOX0lSUV9NT0RJRklFRDoKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKLSJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogSVJRIG1vZGlmaWVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fQ01EX1FOR19DT05GTElDVDoKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKLSJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogdGFnIHF1ZXVpbmcgZW5hYmxlZCB3L28gZGlzY29ubmVjdHNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigKLSJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogdW5rbm93biB3YXJuaW5nOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoZXJyX2NvZGUgPSBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCi0iQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQgZXJyb3I6IGluaXRfc3RhdGUgMHgleCwgZXJyX2NvZGUgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+aW5pdF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNDX0RCRygyLCAiYWR2YW5zeXNfZGV0ZWN0OiBBZHZJbml0R2V0Q29uZmlnKClcbiIpOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gQWR2SW5pdEdldENvbmZpZyhhZHZfZHZjX3ZhcnApKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDIoIkFkdkluaXRHZXRDb25maWc6IGJvYXJkICVkOiB3YXJuaW5nOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgcmV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChlcnJfY29kZSA9IGFkdl9kdmNfdmFycC0+ZXJyX2NvZGUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigKLSJBZHZJbml0R2V0Q29uZmlnOiBib2FyZCAlZCBlcnJvcjogZXJyX2NvZGUgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFkdl9kdmNfdmFycC0+ZXJyX2NvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVycl9jb2RlICE9IDApIHsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgICAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOwotICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2F2ZSB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24gc28gdGhhdCBpdCBjYW4gYmUgZGlzcGxheWVkCi0gICAgICAgICAgICAgKiBmcm9tIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0KLSAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICplcDsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2V0IHRoZSBhZGFwdGVyJ3MgdGFyZ2V0IGlkIGJpdCBpbiB0aGUgJ2luaXRfdGlkbWFzaycgZmllbGQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9hcmRwLT5pbml0X3RpZG1hc2sgfD0KLSAgICAgICAgICAgICAgICAgICAgQURWX1RJRF9UT19USURNQVNLKGFzY19kdmNfdmFycC0+Y2ZnLT5jaGlwX3Njc2lfaWQpOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTYXZlIEVFUFJPTSBzZXR0aW5ncyBmb3IgdGhlIGJvYXJkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGVwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hc2NfZWVwOwotCi0gICAgICAgICAgICAgICAgZXAtPmluaXRfc2R0ciA9IGFzY19kdmNfdmFycC0+Y2ZnLT5zZHRyX2VuYWJsZTsKLSAgICAgICAgICAgICAgICBlcC0+ZGlzY19lbmFibGUgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+ZGlzY19lbmFibGU7Ci0gICAgICAgICAgICAgICAgZXAtPnVzZV9jbWRfcW5nID0gYXNjX2R2Y192YXJwLT5jZmctPmNtZF9xbmdfZW5hYmxlZDsKLSAgICAgICAgICAgICAgICBBU0NfRUVQX1NFVF9ETUFfU1BEKGVwLCBhc2NfZHZjX3ZhcnAtPmNmZy0+aXNhX2RtYV9zcGVlZCk7Ci0gICAgICAgICAgICAgICAgZXAtPnN0YXJ0X21vdG9yID0gYXNjX2R2Y192YXJwLT5zdGFydF9tb3RvcjsKLSAgICAgICAgICAgICAgICBlcC0+Y250bCA9IGFzY19kdmNfdmFycC0+ZHZjX2NudGw7Ci0gICAgICAgICAgICAgICAgZXAtPm5vX3NjYW0gPSBhc2NfZHZjX3ZhcnAtPm5vX3NjYW07Ci0gICAgICAgICAgICAgICAgZXAtPm1heF90b3RhbF9xbmcgPSBhc2NfZHZjX3ZhcnAtPm1heF90b3RhbF9xbmc7Ci0gICAgICAgICAgICAgICAgQVNDX0VFUF9TRVRfQ0hJUF9JRChlcCwgYXNjX2R2Y192YXJwLT5jZmctPmNoaXBfc2NzaV9pZCk7Ci0gICAgICAgICAgICAgICAgLyogJ21heF90YWdfcW5nJyBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgZm9yIGV2ZXJ5IGRldmljZS4gKi8KLSAgICAgICAgICAgICAgICBlcC0+bWF4X3RhZ19xbmcgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+bWF4X3RhZ19xbmdbMF07Ci0gICAgICAgICAgICAgICAgZXAtPmFkYXB0ZXJfaW5mb1swXSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bMF07Ci0gICAgICAgICAgICAgICAgZXAtPmFkYXB0ZXJfaW5mb1sxXSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bMV07Ci0gICAgICAgICAgICAgICAgZXAtPmFkYXB0ZXJfaW5mb1syXSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bMl07Ci0gICAgICAgICAgICAgICAgZXAtPmFkYXB0ZXJfaW5mb1szXSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bM107Ci0gICAgICAgICAgICAgICAgZXAtPmFkYXB0ZXJfaW5mb1s0XSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bNF07Ci0gICAgICAgICAgICAgICAgZXAtPmFkYXB0ZXJfaW5mb1s1XSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bNV07Ci0KLSAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiBNb2RpZnkgYm9hcmQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFTQ19EQkcoMiwgImFkdmFuc3lzX2RldGVjdDogQXNjSW5pdFNldENvbmZpZygpXG4iKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJldCA9IEFzY0luaXRTZXRDb25maWcoYXNjX2R2Y192YXJwKSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDogICAgLyogTm8gZXJyb3IuICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fSU9fUE9SVF9ST1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCi0iQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IEkvTyBwb3J0IGFkZHJlc3MgbW9kaWZpZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9BVVRPX0NPTkZJRzoKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKLSJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogSS9PIHBvcnQgaW5jcmVtZW50IHN3aXRjaCBlbmFibGVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fRUVQUk9NX0NIS1NVTToKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKLSJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogRUVQUk9NIGNoZWNrc3VtIGVycm9yXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVNDX1dBUk5fSVJRX01PRElGSUVEOgotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAotIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiBJUlEgbW9kaWZpZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUOgotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAotIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiB0YWcgcXVldWluZyB3L28gZGlzY29ubmVjdHNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigKLSJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogdW5rbm93biB3YXJuaW5nOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhc2NfZHZjX3ZhcnAtPmVycl9jb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKLSJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZCBlcnJvcjogaW5pdF9zdGF0ZSAweCV4LCBlcnJfY29kZSAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLSAgICAgICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0gICAgICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOwotICAgICAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQtLTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSAnU2NzaV9Ib3N0JyBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLyogQXNjSW5pdFNldENvbmZpZygpIHdpbGwgc2V0IHRoZSBJUlEgZm9yIG5vbi1QQ0kgYm9hcmRzLiAqLwotICAgICAgICAgICAgICAgIGlmICgoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19QQ0kpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2hwLT5pcnEgPSBhc2NfZHZjX3ZhcnAtPmlycV9ubzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFEVkVFUF8zNTUwX0NPTkZJRyAgICAgICplcF8zNTUwOwotICAgICAgICAgICAgICAgIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAgICplcF8zOEMwODAwOwotICAgICAgICAgICAgICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAgICplcF8zOEMxNjAwOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTYXZlIFdpZGUgRUVQIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcF8zNTUwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzU1MF9lZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+YWRhcHRlcl9zY3NpX2lkID0gYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPm1heF9ob3N0X3FuZyA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOwotICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5tYXhfZHZjX3FuZyA9IGFkdl9kdmNfdmFycC0+bWF4X2R2Y19xbmc7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPnRlcm1pbmF0aW9uID0gYWR2X2R2Y192YXJwLT5jZmctPnRlcm1pbmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5kaXNjX2VuYWJsZSA9IGFkdl9kdmNfdmFycC0+Y2ZnLT5kaXNjX2VuYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+Ymlvc19jdHJsID0gYWR2X2R2Y192YXJwLT5iaW9zX2N0cmw7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPndkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+d2R0cl9hYmxlOwotICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zZHRyX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+dWx0cmFfYWJsZSA9IGFkdl9kdmNfdmFycC0+dWx0cmFfYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOwotICAgICAgICAgICAgICAgICAgICBlcF8zNTUwLT5zdGFydF9tb3RvciA9IGFkdl9kdmNfdmFycC0+c3RhcnRfbW90b3I7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM1NTAtPnNjc2lfcmVzZXRfZGVsYXkgPSBhZHZfZHZjX3ZhcnAtPnNjc2lfcmVzZXRfd2FpdDsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+c2VyaWFsX251bWJlcl93b3JkMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+c2VyaWFsX251bWJlcl93b3JkMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMjsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzU1MC0+c2VyaWFsX251bWJlcl93b3JkMyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzhDMDgwMF9lZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+YWRhcHRlcl9zY3NpX2lkID0gYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPm1heF9ob3N0X3FuZyA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5tYXhfZHZjX3FuZyA9IGFkdl9kdmNfdmFycC0+bWF4X2R2Y19xbmc7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnRlcm1pbmF0aW9uX2x2ZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+dGVybWluYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPmRpc2NfZW5hYmxlID0gYWR2X2R2Y192YXJwLT5jZmctPmRpc2NfZW5hYmxlOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5iaW9zX2N0cmwgPSBhZHZfZHZjX3ZhcnAtPmJpb3NfY3RybDsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+d2R0cl9hYmxlID0gYWR2X2R2Y192YXJwLT53ZHRyX2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnRhZ3FuZ19hYmxlID0gYWR2X2R2Y192YXJwLT50YWdxbmdfYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDEgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQxOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT5zZHRyX3NwZWVkMiA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDI7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnNkdHJfc3BlZWQzID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMzsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDQgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQ0OwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMwODAwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzA4MDAtPnN0YXJ0X21vdG9yID0gYWR2X2R2Y192YXJwLT5zdGFydF9tb3RvcjsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2NzaV9yZXNldF9kZWxheSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPnNjc2lfcmVzZXRfd2FpdDsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMjsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zOEMxNjAwX2VlcDsKLQotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5hZGFwdGVyX3Njc2lfaWQgPSBhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZDsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+bWF4X2hvc3RfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+dGVybWluYXRpb25fbHZkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT50ZXJtaW5hdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+ZGlzY19lbmFibGUgPSBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGlzY19lbmFibGU7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPmJpb3NfY3RybCA9IGFkdl9kdmNfdmFycC0+Ymlvc19jdHJsOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT53ZHRyX2FibGUgPSBhZHZfZHZjX3ZhcnAtPndkdHJfYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZHRyX3NwZWVkMSA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDE7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnNkdHJfc3BlZWQyID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMjsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+c2R0cl9zcGVlZDMgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQzOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZHRyX3NwZWVkNCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7Ci0gICAgICAgICAgICAgICAgICAgIGVwXzM4QzE2MDAtPnRhZ3FuZ19hYmxlID0gYWR2X2R2Y192YXJwLT50YWdxbmdfYWJsZTsKLSAgICAgICAgICAgICAgICAgICAgZXBfMzhDMTYwMC0+c3RhcnRfbW90b3IgPSBhZHZfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zY3NpX3Jlc2V0X2RlbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+c2NzaV9yZXNldF93YWl0OwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwxOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZXJpYWxfbnVtYmVyX3dvcmQyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOwotICAgICAgICAgICAgICAgICAgICBlcF8zOEMxNjAwLT5zZXJpYWxfbnVtYmVyX3dvcmQzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2V0IHRoZSBhZGFwdGVyJ3MgdGFyZ2V0IGlkIGJpdCBpbiB0aGUgJ2luaXRfdGlkbWFzaycgZmllbGQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9hcmRwLT5pbml0X3RpZG1hc2sgfD0KLSAgICAgICAgICAgICAgICAgICAgQURWX1RJRF9UT19USURNQVNLKGFkdl9kdmNfdmFycC0+Y2hpcF9zY3NpX2lkKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRmluaXNoIGluaXRpYWxpemluZyB0aGUgJ1Njc2lfSG9zdCcgc3RydWN0dXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNocC0+aXJxID0gYWR2X2R2Y192YXJwLT5pcnFfbm87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDaGFubmVscyBhcmUgbnVtYmVyZWQgYmVnaW5uaW5nIHdpdGggMC4gRm9yIEFkdmFuU3lzIG9uZSBob3N0Ci0gICAgICAgICAgICAgKiBzdHJ1Y3R1cmUgc3VwcG9ydHMgb25lIGNoYW5uZWwuIE11bHRpLWNoYW5uZWwgYm9hcmRzIGhhdmUgYQotICAgICAgICAgICAgICogc2VwYXJhdGUgaG9zdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2hhbm5lbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2hwLT5tYXhfY2hhbm5lbCA9IDA7Ci0gICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0gICAgICAgICAgICAgICAgc2hwLT5tYXhfaWQgPSBBU0NfTUFYX1RJRCArIDE7Ci0gICAgICAgICAgICAgICAgc2hwLT5tYXhfbHVuID0gQVNDX01BWF9MVU4gKyAxOwotCi0gICAgICAgICAgICAgICAgc2hwLT5pb19wb3J0ID0gYXNjX2R2Y192YXJwLT5pb3BfYmFzZTsKLSAgICAgICAgICAgICAgICBib2FyZHAtPmFzY19uX2lvX3BvcnQgPSBBU0NfSU9BRFJfR0FQOwotICAgICAgICAgICAgICAgIHNocC0+dGhpc19pZCA9IGFzY19kdmNfdmFycC0+Y2ZnLT5jaGlwX3Njc2lfaWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBTZXQgbWF4aW11bSBudW1iZXIgb2YgcXVldWVzIHRoZSBhZGFwdGVyIGNhbiBoYW5kbGUuICovCi0gICAgICAgICAgICAgICAgc2hwLT5jYW5fcXVldWUgPSBhc2NfZHZjX3ZhcnAtPm1heF90b3RhbF9xbmc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNocC0+bWF4X2lkID0gQURWX01BWF9USUQgKyAxOwotICAgICAgICAgICAgICAgIHNocC0+bWF4X2x1biA9IEFEVl9NQVhfTFVOICsgMTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2F2ZSB0aGUgSS9PIFBvcnQgYWRkcmVzcyBhbmQgbGVuZ3RoIGV2ZW4gdGhvdWdoCi0gICAgICAgICAgICAgICAgICogSS9PIHBvcnRzIGFyZSBub3QgdXNlZCB0byBhY2Nlc3MgV2lkZSBib2FyZHMuCi0gICAgICAgICAgICAgICAgICogSW5zdGVhZCB0aGUgV2lkZSBib2FyZHMgYXJlIGFjY2Vzc2VkIHdpdGgKLSAgICAgICAgICAgICAgICAgKiBQQ0kgTWVtb3J5IE1hcHBlZCBJL08uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2hwLT5pb19wb3J0ID0gaW9wOwotICAgICAgICAgICAgICAgIGJvYXJkcC0+YXNjX25faW9fcG9ydCA9IGlvbGVuOwotCi0gICAgICAgICAgICAgICAgc2hwLT50aGlzX2lkID0gYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBTZXQgbWF4aW11bSBudW1iZXIgb2YgcXVldWVzIHRoZSBhZGFwdGVyIGNhbiBoYW5kbGUuICovCi0gICAgICAgICAgICAgICAgc2hwLT5jYW5fcXVldWUgPSBhZHZfZHZjX3ZhcnAtPm1heF9ob3N0X3FuZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICduX2lvX3BvcnQnIGN1cnJlbnRseSBpcyBvbmUgYnl0ZS4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBTZXQgYSB2YWx1ZSB0byAnbl9pb19wb3J0JywgYnV0IG5ldmVyIHJlZmVyZW5jZWQgaXQgYmVjYXVzZQotICAgICAgICAgICAgICogaXQgbWF5IGJlIHRydW5jYXRlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2hwLT5uX2lvX3BvcnQgPSBib2FyZHAtPmFzY19uX2lvX3BvcnQgPD0gMjU1ID8KLSAgICAgICAgICAgICAgICBib2FyZHAtPmFzY19uX2lvX3BvcnQgOiAyNTU7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBGb2xsb3dpbmcgdjEuMy44OSwgJ2NtZF9wZXJfbHVuJyBpcyBubyBsb25nZXIgbmVlZGVkCi0gICAgICAgICAgICAgKiBhbmQgc2hvdWxkIGJlIHNldCB0byB6ZXJvLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEJ1dCBiZWNhdXNlIG9mIGEgYnVnIGludHJvZHVjZWQgaW4gdjEuMy44OSBpZiB0aGUgZHJpdmVyIGlzCi0gICAgICAgICAgICAgKiBjb21waWxlZCBhcyBhIG1vZHVsZSBhbmQgJ2NtZF9wZXJfbHVuJyBpcyB6ZXJvLCB0aGUgTWlkLUxldmVsCi0gICAgICAgICAgICAgKiBTQ1NJIGZ1bmN0aW9uICdhbGxvY2F0ZV9kZXZpY2UnIHdpbGwgcGFuaWMuIFRvIGFsbG93IHRoZSBkcml2ZXIKLSAgICAgICAgICAgICAqIHRvIHdvcmsgYXMgYSBtb2R1bGUgaW4gdGhlc2Uga2VybmVscyBzZXQgJ2NtZF9wZXJfbHVuJyB0byAxLgotCSAgICAgKgotCSAgICAgKiBOb3RlOiBUaGlzIGlzIHdyb25nLiAgY21kX3Blcl9sdW4gc2hvdWxkIGJlIHNldCB0byB0aGUgZGVwdGgKLQkgICAgICogeW91IHdhbnQgb24gdW50YWdnZWQgZGV2aWNlcyBhbHdheXMuCi0jaWZkZWYgTU9EVUxFCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHNocC0+Y21kX3Blcl9sdW4gPSAxOwotLyogI2Vsc2UKLSAgICAgICAgICAgIHNocC0+Y21kX3Blcl9sdW4gPSAwOwotI2VuZGlmICovCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIHRoZQotICAgICAgICAgICAgICogYWRhcHRlciBjYW4gaGFuZGxlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBBbGxvdyB0d28gY29tbWFuZHMgd2l0aCAnc2dfdGFibGVzaXplJyBzY2F0dGVyLWdhdGhlcgotICAgICAgICAgICAgICAgICAqIGVsZW1lbnRzIHRvIGJlIGV4ZWN1dGVkIHNpbXVsdGFuZW91c2x5LiBUaGlzIHZhbHVlIGlzCi0gICAgICAgICAgICAgICAgICogdGhlIHRoZW9yZXRpY2FsIGhhcmR3YXJlIGxpbWl0LiBJdCBtYXkgYmUgZGVjcmVhc2VkCi0gICAgICAgICAgICAgICAgICogYmVsb3cuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2hwLT5zZ190YWJsZXNpemUgPQotICAgICAgICAgICAgICAgICAgICAoKChhc2NfZHZjX3ZhcnAtPm1heF90b3RhbF9xbmcgLSAyKSAvIDIpICoKLSAgICAgICAgICAgICAgICAgICAgQVNDX1NHX0xJU1RfUEVSX1EpICsgMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hwLT5zZ190YWJsZXNpemUgPSBBRFZfTUFYX1NHX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgdmFsdWUgb2YgJ3NnX3RhYmxlc2l6ZScgY2FuIG5vdCBleGNlZWQgdGhlIFNDU0kKLSAgICAgICAgICAgICAqIG1pZC1sZXZlbCBkcml2ZXIgZGVmaW5pdGlvbiBvZiBTR19BTEwuIFNHX0FMTCBhbHNvCi0gICAgICAgICAgICAgKiBtdXN0IG5vdCBiZSBleGNlZWRlZCwgYmVjYXVzZSBpdCBpcyB1c2VkIHRvIGRlZmluZSB0aGUKLSAgICAgICAgICAgICAqIHNpemUgb2YgdGhlIHNjYXR0ZXItZ2F0aGVyIHRhYmxlIGluICdzdHJ1Y3QgYXNjX3NnX2hlYWQnLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoc2hwLT5zZ190YWJsZXNpemUgPiBTR19BTEwpIHsKLSAgICAgICAgICAgICAgICBzaHAtPnNnX3RhYmxlc2l6ZSA9IFNHX0FMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogc2dfdGFibGVzaXplOiAlZFxuIiwKLSAgICAgICAgICAgICAgICBzaHAtPnNnX3RhYmxlc2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEJJT1Mgc3RhcnQgYWRkcmVzcy4gKi8KLSAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKLSAgICAgICAgICAgICAgICBzaHAtPmJhc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgKCh1bG9uZykgQXNjR2V0Q2hpcEJpb3NBZGRyZXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmNfdmFycC0+aW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Y192YXJwLT5idXNfdHlwZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEZpbGwtaW4gQklPUyBib2FyZCB2YXJpYWJsZXMuIFRoZSBXaWRlIEJJT1Mgc2F2ZXMKLSAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGlvbiBpbiBMUkFNIHRoYXQgaXMgdXNlZCBieSB0aGUgZHJpdmVyLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLCBCSU9TX1NJR05BVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5iaW9zX3NpZ25hdHVyZSk7Ci0gICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsIEJJT1NfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5iaW9zX3ZlcnNpb24pOwotICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLCBCSU9TX0NPREVTRUcsCi0gICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+Ymlvc19jb2Rlc2VnKTsKLSAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oYWR2X2R2Y192YXJwLT5pb3BfYmFzZSwgQklPU19DT0RFTEVOLAotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3NfY29kZWxlbik7Ci0KLSAgICAgICAgICAgICAgICBBU0NfREJHMigxLAotICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXNfZGV0ZWN0OiBiaW9zX3NpZ25hdHVyZSAweCV4LCBiaW9zX3ZlcnNpb24gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5iaW9zX3NpZ25hdHVyZSwgYm9hcmRwLT5iaW9zX3ZlcnNpb24pOwotCi0gICAgICAgICAgICAgICAgQVNDX0RCRzIoMSwKLSAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogYmlvc19jb2Rlc2VnIDB4JXgsIGJpb3NfY29kZWxlbiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmJpb3NfY29kZXNlZywgYm9hcmRwLT5iaW9zX2NvZGVsZW4pOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB0aGUgQklPUyBzYXZlZCBhIHZhbGlkIHNpZ25hdHVyZSwgdGhlbiBmaWxsIGluCi0gICAgICAgICAgICAgICAgICogdGhlIEJJT1MgY29kZSBzZWdtZW50IGJhc2UgYWRkcmVzcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoYm9hcmRwLT5iaW9zX3NpZ25hdHVyZSA9PSAweDU1QUEpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogQ29udmVydCB4ODYgcmVhbG1vZGUgY29kZSBzZWdtZW50IHRvIGEgbGluZWFyCi0gICAgICAgICAgICAgICAgICAgICAqIGFkZHJlc3MgYnkgc2hpZnRpbmcgbGVmdCA0LgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc2hwLT5iYXNlID0gKCh1bG9uZykgYm9hcmRwLT5iaW9zX2NvZGVzZWcgPDwgNCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2hwLT5iYXNlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBSZWdpc3RlciBCb2FyZCBSZXNvdXJjZXMgLSBJL08gUG9ydCwgRE1BLCBJUlEKLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmVnaXN0ZXIgSS9PIHBvcnQgcmFuZ2UuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogRm9yIFdpZGUgYm9hcmRzIHRoZSBJL08gcG9ydHMgYXJlIG5vdCB1c2VkIHRvIGFjY2VzcwotICAgICAgICAgICAgICogdGhlIGJvYXJkLCBidXQgcmVxdWVzdCB0aGUgcmVnaW9uIGFueXdheS4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAnc2hwLT5uX2lvX3BvcnQnIGlzIG5vdCByZWZlcmVuY2VkLCBiZWNhdXNlIGl0IG1heSBiZSB0cnVuY2F0ZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEFTQ19EQkcyKDIsCi0gICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogcmVxdWVzdF9yZWdpb24gcG9ydCAweCVseCwgbGVuIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgKHVsb25nKSBzaHAtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdF9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzIikgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCi0iYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9yZWdpb24oKSBmYWlsZWQsIHBvcnQgMHglbHgsIGxlbiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCAodWxvbmcpIHNocC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotICAgICAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotICAgICAgICAgICAgICAgIHNjc2lfdW5yZWdpc3RlcihzaHApOwotICAgICAgICAgICAgICAgIGFzY19ib2FyZF9jb3VudC0tOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBSZWdpc3RlciBETUEgQ2hhbm5lbCBmb3IgTmFycm93IGJvYXJkcy4gKi8KLSAgICAgICAgICAgIHNocC0+ZG1hX2NoYW5uZWwgPSBOT19JU0FfRE1BOyAvKiBEZWZhdWx0IHRvIG5vIElTQSBETUEuICovCi0jaWZkZWYgQ09ORklHX0lTQQotICAgICAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIERNQSBjaGFubmVsIGZvciBJU0EgYnVzLiAqLwotICAgICAgICAgICAgICAgIGlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX0lTQSkgewotICAgICAgICAgICAgICAgICAgICBzaHAtPmRtYV9jaGFubmVsID0gYXNjX2R2Y192YXJwLT5jZmctPmlzYV9kbWFfY2hhbm5lbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfZG1hKHNocC0+ZG1hX2NoYW5uZWwsICJhZHZhbnN5cyIpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQzKAotImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQ6IHJlcXVlc3RfZG1hKCkgJWQgZmFpbGVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIHNocC0+ZG1hX2NoYW5uZWwsIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX3JlZ2lvbihzaHAtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLSAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc2NfYm9hcmRfY291bnQtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFzY0VuYWJsZUlzYURtYShzaHAtPmRtYV9jaGFubmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jZW5kaWYgLyogQ09ORklHX0lTQSAqLwotCi0gICAgICAgICAgICAvKiBSZWdpc3RlciBJUlEgTnVtYmVyLiAqLwotICAgICAgICAgICAgQVNDX0RCRzEoMiwgImFkdmFuc3lzX2RldGVjdDogcmVxdWVzdF9pcnEoKSAlZFxuIiwgc2hwLT5pcnEpOwotICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBJZiByZXF1ZXN0X2lycSgpIGZhaWxzIHdpdGggdGhlIElSUUZfRElTQUJMRUQgZmxhZyBzZXQsCi0gICAgICAgICAgICAqIHRoZW4gdHJ5IGFnYWluIHdpdGhvdXQgdGhlIElSUUZfRElTQUJMRUQgZmxhZyBzZXQuIFRoaXMKLSAgICAgICAgICAgICogYWxsb3dzIElSUSBzaGFyaW5nIHRvIHdvcmsgZXZlbiB3aXRoIG90aGVyIGRyaXZlcnMgdGhhdAotICAgICAgICAgICAgKiBkbyBub3Qgc2V0IHRoZSBJUlFGX0RJU0FCTEVEIGZsYWcuCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAqIElmIElSUUZfRElTQUJMRUQgaXMgbm90IHNldCwgdGhlbiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkCi0gICAgICAgICAgICAqIGJlZm9yZSB0aGUgZHJpdmVyIGludGVycnVwdCBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCgocmV0ID0gcmVxdWVzdF9pcnEoc2hwLT5pcnEsIGFkdmFuc3lzX2ludGVycnVwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFGX0RJU0FCTEVEIHwgKHNoYXJlX2lycSA9PSBUUlVFID8gSVJRRl9TSEFSRUQgOiAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR2YW5zeXMiLCBib2FyZHApKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICgocmV0ID0gcmVxdWVzdF9pcnEoc2hwLT5pcnEsIGFkdmFuc3lzX2ludGVycnVwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hhcmVfaXJxID09IFRSVUUgPyBJUlFGX1NIQVJFRCA6IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5cyIsIGJvYXJkcCkpICE9IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gLUVCVVNZKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDIoCi0iYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9pcnEoKTogSVJRIDB4JXggYWxyZWFkeSBpbiB1c2UuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5pcnEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IC1FSU5WQUwpIHsKLSAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMigKLSJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkOiByZXF1ZXN0X2lycSgpOiBJUlEgMHgleCBub3QgdmFsaWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgc2hwLT5pcnEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDMoCi0iYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZDogcmVxdWVzdF9pcnEoKTogSVJRIDB4JXggZmFpbGVkIHdpdGggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBzaHAtPmlycSwgcmV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOwotICAgICAgICAgICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOwotICAgICAgICAgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9kbWEoc2hwLT5kbWFfY2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0gICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7Ci0gICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJbml0aWFsaXplIGJvYXJkIFJJU0MgY2hpcCBhbmQgZW5hYmxlIGludGVycnVwdHMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKLSAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhZHZhbnN5c19kZXRlY3Q6IEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOwotICAgICAgICAgICAgICAgIHdhcm5fY29kZSA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmNfdmFycCk7Ci0gICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlOwotCi0gICAgICAgICAgICAgICAgaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgewotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQ0KAotImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGluaXRfc3RhdGUgMHgleCwgd2FybiAweCV4LCBlcnJvciAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlLCBlcnJfY29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBRFZfQ0FSUl9UICAgICAgKmNhcnJwOwotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICByZXFfY250ID0gMDsKLSAgICAgICAgICAgICAgICBhZHZfcmVxX3QgICAgICAgKnJlcXAgPSBOVUxMOwotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZ19jbnQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgY2FycmllciBzdHJ1Y3R1cmVzLiBUaGUgdG90YWwgc2l6ZQotICAgICAgICAgICAgICAgICAqIGlzIGFib3V0IDQgS0IsIHNvIGFsbG9jYXRlIGFsbCBhdCBvbmNlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGNhcnJwID0KLSAgICAgICAgICAgICAgICAgICAgKEFEVl9DQVJSX1QgKikga21hbGxvYyhBRFZfQ0FSUklFUl9CVUZTSVpFLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBjYXJycCAweCVseFxuIiwgKHVsb25nKSBjYXJycCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FycnAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBnb3RvIGttYWxsb2NfZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB1cCB0byAnbWF4X2hvc3RfcW5nJyByZXF1ZXN0IHN0cnVjdHVyZXMgZm9yCi0gICAgICAgICAgICAgICAgICogdGhlIFdpZGUgYm9hcmQuIFRoZSB0b3RhbCBzaXplIGlzIGFib3V0IDE2IEtCLCBzbwotICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlIGFsbCBhdCBvbmNlLiBJZiB0aGUgYWxsb2NhdGlvbiBmYWlscyBkZWNyZW1lbnQKLSAgICAgICAgICAgICAgICAgKiBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGZvciAocmVxX2NudCA9IGFkdl9kdmNfdmFycC0+bWF4X2hvc3RfcW5nOwotICAgICAgICAgICAgICAgICAgICByZXFfY250ID4gMDsgcmVxX2NudC0tKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVxcCA9IChhZHZfcmVxX3QgKikKLSAgICAgICAgICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKGFkdl9yZXFfdCkgKiByZXFfY250LCBHRlBfQVRPTUlDKTsKLQotICAgICAgICAgICAgICAgICAgICBBU0NfREJHMygxLAotICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogcmVxcCAweCVseCwgcmVxX2NudCAlZCwgYnl0ZXMgJWx1XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nKSByZXFwLCByZXFfY250LAotICAgICAgICAgICAgICAgICAgICAgICAgKHVsb25nKSBzaXplb2YoYWR2X3JlcV90KSAqIHJlcV9jbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXFwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXFwID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnb3RvIGttYWxsb2NfZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB1cCB0byBBRFZfVE9UX1NHX0JMT0NLIHJlcXVlc3Qgc3RydWN0dXJlcyBmb3IKLSAgICAgICAgICAgICAgICAgKiB0aGUgV2lkZSBib2FyZC4gRWFjaCBzdHJ1Y3R1cmUgaXMgYWJvdXQgMTM2IGJ5dGVzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZm9yIChzZ19jbnQgPSAwOyBzZ19jbnQgPCBBRFZfVE9UX1NHX0JMT0NLOyBzZ19jbnQrKykgewotCi0gICAgICAgICAgICAgICAgICAgIHNncCA9IChhZHZfc2dibGtfdCAqKQotICAgICAgICAgICAgICAgICAgICAgICAga21hbGxvYyhzaXplb2YoYWR2X3NnYmxrX3QpLCBHRlBfQVRPTUlDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2dwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2dwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKLSAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFTQ19EQkczKDEsCi0gICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IHNnX2NudCAlZCAqICV1ID0gJXUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNnX2NudCwgc2l6ZW9mKGFkdl9zZ2Jsa190KSwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSAoc2l6ZW9mKGFkdl9zZ2Jsa190KSAqIHNnX2NudCkpOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiBubyByZXF1ZXN0IHN0cnVjdHVyZXMgb3Igc2NhdHRlci1nYXRoZXIgc3RydWN0dXJlcyBjb3VsZAotICAgICAgICAgICAgICAgICAqIGJlIGFsbG9jYXRlZCwgdGhlbiByZXR1cm4gYW4gZXJyb3IuIE90aGVyd2lzZSBjb250aW51ZSB3aXRoCi0gICAgICAgICAgICAgICAgICogaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgICovCi0gICAga21hbGxvY19lcnJvcjoKLSAgICAgICAgICAgICAgICBpZiAoY2FycnAgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUklOVDEoCi0iYWR2YW5zeXNfZGV0ZWN0OiBib2FyZCAlZCBlcnJvcjogZmFpbGVkIHRvIGttYWxsb2MoKSBjYXJyaWVyIGJ1ZmZlci5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXFwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAga2ZyZWUoY2FycnApOwotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAotImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3JlcV90IGJ1ZmZlci5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChib2FyZHAtPmFkdl9zZ2Jsa3AgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBrZnJlZShjYXJycCk7Ci0gICAgICAgICAgICAgICAgICAgIGtmcmVlKHJlcXApOwotICAgICAgICAgICAgICAgICAgICBBU0NfUFJJTlQxKAotImFkdmFuc3lzX2RldGVjdDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3NnYmxrX3QgYnVmZmVycy5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBBRFZfRVJST1I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIGNhcnJpZXIgYnVmZmVyIHBvaW50ZXIuICovCi0gICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19jYXJycCA9IGNhcnJwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFNhdmUgb3JpZ2luYWwgcG9pbnRlciBmb3Iga2ZyZWUoKSBpbiBjYXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUgYW5kIGNhbiBiZSB1bmxvYWRlZC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gcmVxcDsKLQotICAgICAgICAgICAgICAgICAgICBhZHZfZHZjX3ZhcnAtPmNhcnJpZXJfYnVmID0gY2FycnA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUG9pbnQgJ2Fkdl9yZXFwJyB0byB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmVzIGFuZAotICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIHRoZW0gdG9nZXRoZXIuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICByZXFfY250LS07Ci0gICAgICAgICAgICAgICAgICAgIHJlcXBbcmVxX2NudF0ubmV4dF9yZXFwID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgZm9yICg7IHJlcV9jbnQgPiAwOyByZXFfY250LS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXBbcmVxX2NudCAtIDFdLm5leHRfcmVxcCA9ICZyZXFwW3JlcV9jbnRdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3JlcXAgPSAmcmVxcFswXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRBc2MzNTUwRHJpdmVyKClcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQWR2SW5pdEFzYzM1NTBEcml2ZXIoYWR2X2R2Y192YXJwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU0NfREJHKDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdmFuc3lzX2RldGVjdDogQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoKVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuX2NvZGUgPSBBZHZJbml0QXNjMzhDMDgwMERyaXZlcihhZHZfZHZjX3ZhcnApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RCRygyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHZhbnN5c19kZXRlY3Q6IEFkdkluaXRBc2MzOEMxNjAwRHJpdmVyKClcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9jb2RlID0gQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoYWR2X2R2Y192YXJwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGFkdl9kdmNfdmFycC0+ZXJyX2NvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1BSSU5UMygKLSJhZHZhbnN5c19kZXRlY3Q6IGJvYXJkICVkIGVycm9yOiB3YXJuIDB4JXgsIGVycm9yIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRwLT5pZCwgd2Fybl9jb2RlLCBlcnJfY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnJfY29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOwotICAgICAgICAgICAgICAgIGlmIChBU0NfV0lERV9CT0FSRChib2FyZHApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOwotICAgICAgICAgICAgICAgICAgICBrZnJlZShib2FyZHAtPm9yaWdfY2FycnApOwotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPm9yaWdfY2FycnAgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRwLT5vcmlnX3JlcXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+b3JpZ19yZXFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gYm9hcmRwLT5hZHZfcmVxcCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzZ3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IHNncC0+bmV4dF9zZ2Jsa3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShzZ3ApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzaHAtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9kbWEoc2hwLT5kbWFfY2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICAgICAgICAgICAgICAga2ZyZWUoYm9hcmRwLT5wcnRidWYpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0gICAgICAgICAgICAgICAgZnJlZV9pcnEoc2hwLT5pcnEsIGJvYXJkcCk7Ci0gICAgICAgICAgICAgICAgc2NzaV91bnJlZ2lzdGVyKHNocCk7Ci0gICAgICAgICAgICAgICAgYXNjX2JvYXJkX2NvdW50LS07Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBU0NfREJHX1BSVF9TQ1NJX0hPU1QoMiwgc2hwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFTQ19EQkcxKDEsICJhZHZhbnN5c19kZXRlY3Q6IGRvbmU6IGFzY19ib2FyZF9jb3VudCAlZFxuIiwgYXNjX2JvYXJkX2NvdW50KTsKLSAgICByZXR1cm4gYXNjX2JvYXJkX2NvdW50OwotfQotCi0vKgotICogYWR2YW5zeXNfcmVsZWFzZSgpCi0gKgotICogUmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHNpbmdsZSBBZHZhblN5cyBhZGFwdGVyLgotICovCi1zdGF0aWMgaW50Ci1hZHZhbnN5c19yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNocCkKLXsKLSAgICBhc2NfYm9hcmRfdCAgICAqYm9hcmRwOwotCi0gICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVsZWFzZTogYmVnaW5cbiIpOwotICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKLSAgICBmcmVlX2lycShzaHAtPmlycSwgYm9hcmRwKTsKLSAgICBpZiAoc2hwLT5kbWFfY2hhbm5lbCAhPSBOT19JU0FfRE1BKSB7Ci0gICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX3JlbGVhc2U6IGZyZWVfZG1hKClcbiIpOwotICAgICAgICBmcmVlX2RtYShzaHAtPmRtYV9jaGFubmVsKTsKLSAgICB9Ci0gICAgcmVsZWFzZV9yZWdpb24oc2hwLT5pb19wb3J0LCBib2FyZHAtPmFzY19uX2lvX3BvcnQpOwotICAgIGlmIChBU0NfV0lERV9CT0FSRChib2FyZHApKSB7Ci0gICAgICAgIGFkdl9zZ2Jsa190ICAgICpzZ3AgPSBOVUxMOwotCi0gICAgICAgIGlvdW5tYXAoYm9hcmRwLT5pb3JlbWFwX2FkZHIpOwotICAgICAgICBrZnJlZShib2FyZHAtPm9yaWdfY2FycnApOwotICAgICAgICBib2FyZHAtPm9yaWdfY2FycnAgPSBOVUxMOwotICAgICAgICBpZiAoYm9hcmRwLT5vcmlnX3JlcXApIHsKLSAgICAgICAgICAgIGtmcmVlKGJvYXJkcC0+b3JpZ19yZXFwKTsKLSAgICAgICAgICAgIGJvYXJkcC0+b3JpZ19yZXFwID0gYm9hcmRwLT5hZHZfcmVxcCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChzZ3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvYXJkcC0+YWR2X3NnYmxrcCA9IHNncC0+bmV4dF9zZ2Jsa3A7Ci0gICAgICAgICAgICBrZnJlZShzZ3ApOwotICAgICAgICB9Ci0gICAgfQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICAgQVNDX0FTU0VSVChib2FyZHAtPnBydGJ1ZiAhPSBOVUxMKTsKLSAgICBrZnJlZShib2FyZHAtPnBydGJ1Zik7Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KLSAgICBzY3NpX3VucmVnaXN0ZXIoc2hwKTsKLSAgICBBU0NfREJHKDEsICJhZHZhbnN5c19yZWxlYXNlOiBlbmRcbiIpOwotICAgIHJldHVybiAwOwotfQotCi0vKgogICogYWR2YW5zeXNfaW5mbygpCiAgKgogICogUmV0dXJuIHN1aXRhYmxlIGZvciBwcmludGluZyBvbiB0aGUgY29uc29sZSB3aXRoIHRoZSBhcmd1bWVudApAQCAtNTQ2Niw5MSArNDI0OCw4NyBAQAogICogTm90ZTogVGhlIGluZm9ybWF0aW9uIGxpbmUgc2hvdWxkIG5vdCBleGNlZWQgQVNDX0lORk9fU0laRSBieXRlcywKICAqIG90aGVyd2lzZSB0aGUgc3RhdGljICdpbmZvJyBhcnJheSB3aWxsIGJlIG92ZXJydW4uCiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWFkdmFuc3lzX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hwKQorc3RhdGljIGNvbnN0IGNoYXIgKmFkdmFuc3lzX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0gICAgc3RhdGljIGNoYXIgICAgIGluZm9bQVNDX0lORk9fU0laRV07Ci0gICAgYXNjX2JvYXJkX3QgICAgICpib2FyZHA7Ci0gICAgQVNDX0RWQ19WQVIgICAgICphc2NfZHZjX3ZhcnA7Ci0gICAgQURWX0RWQ19WQVIgICAgICphZHZfZHZjX3ZhcnA7Ci0gICAgY2hhciAgICAgICAgICAgICpidXNuYW1lOwotICAgIGludCAgICAgICAgICAgICBpb2xlbjsKLSAgICBjaGFyICAgICAgICAgICAgKndpZGVuYW1lID0gTlVMTDsKKwlzdGF0aWMgY2hhciBpbmZvW0FTQ19JTkZPX1NJWkVdOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJQVNDX0RWQ19WQVIgKmFzY19kdmNfdmFycDsKKwlBRFZfRFZDX1ZBUiAqYWR2X2R2Y192YXJwOworCWNoYXIgKmJ1c25hbWU7CisJaW50IGlvbGVuOworCWNoYXIgKndpZGVuYW1lID0gTlVMTDsKIAotICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKLSAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0gICAgICAgIGFzY19kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7Ci0gICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2luZm86IGJlZ2luXG4iKTsKLSAgICAgICAgaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSB7Ci0gICAgICAgICAgICBpZiAoKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBUE5QKSA9PSBBU0NfSVNfSVNBUE5QKSB7Ci0gICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJJU0EgUG5QIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJJU0EiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogRG9uJ3QgcmVmZXJlbmNlICdzaHAtPm5faW9fcG9ydCc7IEl0IG1heSBiZSB0cnVuY2F0ZWQuICovCi0gICAgICAgICAgICBzcHJpbnRmKGluZm8sCi0iQWR2YW5TeXMgU0NTSSAlczogJXM6IElPIDB4JWxYLTB4JWxYLCBJUlEgMHglWCwgRE1BIDB4JVgiLAotICAgICAgICAgICAgICAgIEFTQ19WRVJTSU9OLCBidXNuYW1lLAotICAgICAgICAgICAgICAgICh1bG9uZykgc2hwLT5pb19wb3J0LAotICAgICAgICAgICAgICAgICh1bG9uZykgc2hwLT5pb19wb3J0ICsgYm9hcmRwLT5hc2Nfbl9pb19wb3J0IC0gMSwKLSAgICAgICAgICAgICAgICBzaHAtPmlycSwgc2hwLT5kbWFfY2hhbm5lbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19WTCkgewotICAgICAgICAgICAgICAgIGJ1c25hbWUgPSAiVkwiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX0VJU0EpIHsKLSAgICAgICAgICAgICAgICBidXNuYW1lID0gIkVJU0EiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgewotICAgICAgICAgICAgICAgIGlmICgoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19QQ0lfVUxUUkEpCi0gICAgICAgICAgICAgICAgICAgID09IEFTQ19JU19QQ0lfVUxUUkEpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVzbmFtZSA9ICJQQ0kgVWx0cmEiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1c25hbWUgPSAiUENJIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1c25hbWUgPSAiPyI7Ci0gICAgICAgICAgICAgICAgQVNDX1BSSU5UMiggImFkdmFuc3lzX2luZm86IGJvYXJkICVkOiB1bmtub3duIGJ1cyB0eXBlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhc2NfZHZjX3ZhcnAtPmJ1c190eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIERvbid0IHJlZmVyZW5jZSAnc2hwLT5uX2lvX3BvcnQnOyBJdCBtYXkgYmUgdHJ1bmNhdGVkLiAqLwotICAgICAgICAgICAgc3ByaW50ZihpbmZvLAotICAgICAgICAgICAgICAgICJBZHZhblN5cyBTQ1NJICVzOiAlczogSU8gMHglbFgtMHglbFgsIElSUSAweCVYIiwKLSAgICAgICAgICAgICAgICBBU0NfVkVSU0lPTiwgYnVzbmFtZSwKLSAgICAgICAgICAgICAgICAodWxvbmcpIHNocC0+aW9fcG9ydCwKLSAgICAgICAgICAgICAgICAodWxvbmcpIHNocC0+aW9fcG9ydCArIGJvYXJkcC0+YXNjX25faW9fcG9ydCAtIDEsCi0gICAgICAgICAgICAgICAgc2hwLT5pcnEpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogV2lkZSBBZGFwdGVyIEluZm9ybWF0aW9uCi0gICAgICAgICAqCi0gICAgICAgICAqIE1lbW9yeS1tYXBwZWQgSS9PIGlzIHVzZWQgaW5zdGVhZCBvZiBJL08gc3BhY2UgdG8gYWNjZXNzCi0gICAgICAgICAqIHRoZSBhZGFwdGVyLCBidXQgZGlzcGxheSB0aGUgSS9PIFBvcnQgcmFuZ2UuIFRoZSBNZW1vcnkKLSAgICAgICAgICogSS9PIGFkZHJlc3MgaXMgZGlzcGxheWVkIHRocm91Z2ggdGhlIGRyaXZlciAvcHJvYyBmaWxlLgotICAgICAgICAgKi8KLSAgICAgICAgYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKLSAgICAgICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlvbGVuID0gQURWXzM1NTBfSU9MRU47Ci0gICAgICAgICAgICB3aWRlbmFtZSA9ICJVbHRyYS1XaWRlIjsKLSAgICAgICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpb2xlbiA9IEFEVl8zOEMwODAwX0lPTEVOOwotICAgICAgICAgICAgd2lkZW5hbWUgPSAiVWx0cmEyLVdpZGUiOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW9sZW4gPSBBRFZfMzhDMTYwMF9JT0xFTjsKLSAgICAgICAgICAgIHdpZGVuYW1lID0gIlVsdHJhMy1XaWRlIjsKLSAgICAgICAgfQotICAgICAgICBzcHJpbnRmKGluZm8sICJBZHZhblN5cyBTQ1NJICVzOiBQQ0kgJXM6IFBDSU1FTSAweCVsWC0weCVsWCwgSVJRIDB4JVgiLAotICAgICAgICAgICAgQVNDX1ZFUlNJT04sCi0gICAgICAgICAgICB3aWRlbmFtZSwKLSAgICAgICAgICAgICh1bG9uZykgYWR2X2R2Y192YXJwLT5pb3BfYmFzZSwKLSAgICAgICAgICAgICh1bG9uZykgYWR2X2R2Y192YXJwLT5pb3BfYmFzZSArIGlvbGVuIC0gMSwKLSAgICAgICAgICAgIHNocC0+aXJxKTsKLSAgICB9Ci0gICAgQVNDX0FTU0VSVChzdHJsZW4oaW5mbykgPCBBU0NfSU5GT19TSVpFKTsKLSAgICBBU0NfREJHKDEsICJhZHZhbnN5c19pbmZvOiBlbmRcbiIpOwotICAgIHJldHVybiBpbmZvOworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2hvc3QpOworCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKwkJQVNDX0RCRygxLCAiYWR2YW5zeXNfaW5mbzogYmVnaW5cbiIpOworCQlpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKwkJCWlmICgoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0FQTlApID09CisJCQkgICAgQVNDX0lTX0lTQVBOUCkgeworCQkJCWJ1c25hbWUgPSAiSVNBIFBuUCI7CisJCQl9IGVsc2UgeworCQkJCWJ1c25hbWUgPSAiSVNBIjsKKwkJCX0KKwkJCS8qIERvbid0IHJlZmVyZW5jZSAnc2hvc3QtPm5faW9fcG9ydCc7IEl0IG1heSBiZSB0cnVuY2F0ZWQuICovCisJCQlzcHJpbnRmKGluZm8sCisJCQkJIkFkdmFuU3lzIFNDU0kgJXM6ICVzOiBJTyAweCVsWC0weCVsWCwgSVJRIDB4JVgsIERNQSAweCVYIiwKKwkJCQlBU0NfVkVSU0lPTiwgYnVzbmFtZSwKKwkJCQkodWxvbmcpc2hvc3QtPmlvX3BvcnQsCisJCQkJKHVsb25nKXNob3N0LT5pb19wb3J0ICsgYm9hcmRwLT5hc2Nfbl9pb19wb3J0IC0KKwkJCQkxLCBzaG9zdC0+aXJxLCBzaG9zdC0+ZG1hX2NoYW5uZWwpOworCQl9IGVsc2UgeworCQkJaWYgKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfVkwpIHsKKwkJCQlidXNuYW1lID0gIlZMIjsKKwkJCX0gZWxzZSBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19FSVNBKSB7CisJCQkJYnVzbmFtZSA9ICJFSVNBIjsKKwkJCX0gZWxzZSBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19QQ0kpIHsKKwkJCQlpZiAoKGFzY19kdmNfdmFycC0+YnVzX3R5cGUgJiBBU0NfSVNfUENJX1VMVFJBKQorCQkJCSAgICA9PSBBU0NfSVNfUENJX1VMVFJBKSB7CisJCQkJCWJ1c25hbWUgPSAiUENJIFVsdHJhIjsKKwkJCQl9IGVsc2UgeworCQkJCQlidXNuYW1lID0gIlBDSSI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlidXNuYW1lID0gIj8iOworCQkJCUFTQ19QUklOVDIKKwkJCQkgICAgKCJhZHZhbnN5c19pbmZvOiBib2FyZCAlZDogdW5rbm93biBidXMgdHlwZSAlZFxuIiwKKwkJCQkgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+YnVzX3R5cGUpOworCQkJfQorCQkJLyogRG9uJ3QgcmVmZXJlbmNlICdzaG9zdC0+bl9pb19wb3J0JzsgSXQgbWF5IGJlIHRydW5jYXRlZC4gKi8KKwkJCXNwcmludGYoaW5mbywKKwkJCQkiQWR2YW5TeXMgU0NTSSAlczogJXM6IElPIDB4JWxYLTB4JWxYLCBJUlEgMHglWCIsCisJCQkJQVNDX1ZFUlNJT04sIGJ1c25hbWUsCisJCQkJKHVsb25nKXNob3N0LT5pb19wb3J0LAorCQkJCSh1bG9uZylzaG9zdC0+aW9fcG9ydCArIGJvYXJkcC0+YXNjX25faW9fcG9ydCAtCisJCQkJMSwgc2hvc3QtPmlycSk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBXaWRlIEFkYXB0ZXIgSW5mb3JtYXRpb24KKwkJICoKKwkJICogTWVtb3J5LW1hcHBlZCBJL08gaXMgdXNlZCBpbnN0ZWFkIG9mIEkvTyBzcGFjZSB0byBhY2Nlc3MKKwkJICogdGhlIGFkYXB0ZXIsIGJ1dCBkaXNwbGF5IHRoZSBJL08gUG9ydCByYW5nZS4gVGhlIE1lbW9yeQorCQkgKiBJL08gYWRkcmVzcyBpcyBkaXNwbGF5ZWQgdGhyb3VnaCB0aGUgZHJpdmVyIC9wcm9jIGZpbGUuCisJCSAqLworCQlhZHZfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworCQlpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkgeworCQkJaW9sZW4gPSBBRFZfMzU1MF9JT0xFTjsKKwkJCXdpZGVuYW1lID0gIlVsdHJhLVdpZGUiOworCQl9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJCWlvbGVuID0gQURWXzM4QzA4MDBfSU9MRU47CisJCQl3aWRlbmFtZSA9ICJVbHRyYTItV2lkZSI7CisJCX0gZWxzZSB7CisJCQlpb2xlbiA9IEFEVl8zOEMxNjAwX0lPTEVOOworCQkJd2lkZW5hbWUgPSAiVWx0cmEzLVdpZGUiOworCQl9CisJCXNwcmludGYoaW5mbywKKwkJCSJBZHZhblN5cyBTQ1NJICVzOiBQQ0kgJXM6IFBDSU1FTSAweCVsWC0weCVsWCwgSVJRIDB4JVgiLAorCQkJQVNDX1ZFUlNJT04sIHdpZGVuYW1lLCAodWxvbmcpYWR2X2R2Y192YXJwLT5pb3BfYmFzZSwKKwkJCSh1bG9uZylhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlICsgaW9sZW4gLSAxLCBzaG9zdC0+aXJxKTsKKwl9CisJQVNDX0FTU0VSVChzdHJsZW4oaW5mbykgPCBBU0NfSU5GT19TSVpFKTsKKwlBU0NfREJHKDEsICJhZHZhbnN5c19pbmZvOiBlbmRcbiIpOworCXJldHVybiBpbmZvOwogfQogCiAvKgpAQCAtNTU2MCw4MiArNDMzOCw4MiBAQAogICogaW4gdGhlICdzY3AnIHJlc3VsdCBmaWVsZC4KICAqLwogc3RhdGljIGludAotYWR2YW5zeXNfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCithZHZhbnN5c19xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2NwLCB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7Ci0gICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOwotICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKLSAgICB1bG9uZyAgICAgICAgICAgICAgIGZsYWdzOwotICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpkb25lX3NjcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOworCXVsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKmRvbmVfc2NwOwogCi0gICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7Ci0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOwotICAgIEFTQ19TVEFUUyhzaHAsIHF1ZXVlY29tbWFuZCk7CisJc2hvc3QgPSBzY3AtPmRldmljZS0+aG9zdDsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlBU0NfU1RBVFMoc2hvc3QsIHF1ZXVlY29tbWFuZCk7CiAKLSAgICAvKiBob3N0X2xvY2sgdGFrZW4gYnkgbWlkLWxldmVsIHByaW9yIHRvIGNhbGwgYnV0IG5lZWQgdG8gcHJvdGVjdCAqLwotICAgIC8qIGFnYWluc3Qgb3duIElTUiAqLwotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKwkvKiBob3N0X2xvY2sgdGFrZW4gYnkgbWlkLWxldmVsIHByaW9yIHRvIGNhbGwgYnV0IG5lZWQgdG8gcHJvdGVjdCAqLworCS8qIGFnYWluc3Qgb3duIElTUiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKIAotICAgIC8qCi0gICAgICogQmxvY2sgbmV3IGNvbW1hbmRzIHdoaWxlIGhhbmRsaW5nIGEgcmVzZXQgb3IgYWJvcnQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBpZiAoYm9hcmRwLT5mbGFncyAmIEFTQ19IT1NUX0lOX1JFU0VUKSB7Ci0gICAgICAgIEFTQ19EQkcxKDEsCi0gICAgICAgICAgICAiYWR2YW5zeXNfcXVldWVjb21tYW5kOiBzY3AgMHglbHggYmxvY2tlZCBmb3IgcmVzZXQgcmVxdWVzdFxuIiwKLSAgICAgICAgICAgICh1bG9uZykgc2NwKTsKLSAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX1JFU0VUKTsKKwkvKgorCSAqIEJsb2NrIG5ldyBjb21tYW5kcyB3aGlsZSBoYW5kbGluZyBhIHJlc2V0IG9yIGFib3J0IHJlcXVlc3QuCisJICovCisJaWYgKGJvYXJkcC0+ZmxhZ3MgJiBBU0NfSE9TVF9JTl9SRVNFVCkgeworCQlBU0NfREJHMSgxLAorCQkJICJhZHZhbnN5c19xdWV1ZWNvbW1hbmQ6IHNjcCAweCVseCBibG9ja2VkIGZvciByZXNldCByZXF1ZXN0XG4iLAorCQkJICh1bG9uZylzY3ApOworCQlzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFkZCBibG9ja2VkIHJlcXVlc3RzIHRvIHRoZSBib2FyZCdzICdkb25lJyBxdWV1ZS4gVGhlIHF1ZXVlZAotICAgICAgICAgKiByZXF1ZXN0cyB3aWxsIGJlIGNvbXBsZXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBhYm9ydCBvciByZXNldAotICAgICAgICAgKiBoYW5kbGluZy4KLSAgICAgICAgICovCi0gICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworCQkvKgorCQkgKiBBZGQgYmxvY2tlZCByZXF1ZXN0cyB0byB0aGUgYm9hcmQncyAnZG9uZScgcXVldWUuIFRoZSBxdWV1ZWQKKwkJICogcmVxdWVzdHMgd2lsbCBiZSBjb21wbGV0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgYWJvcnQgb3IgcmVzZXQKKwkJICogaGFuZGxpbmcuCisJCSAqLworCQlhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBleGVjdXRlIGFueSB3YWl0aW5nIGNvbW1hbmRzIGZvciB0aGUgYm9hcmQuCisJICovCisJaWYgKCFBU0NfUVVFVUVfRU1QVFkoJmJvYXJkcC0+d2FpdGluZykpIHsKKwkJQVNDX0RCRygxLAorCQkJImFkdmFuc3lzX3F1ZXVlY29tbWFuZDogYmVmb3JlIGFzY19leGVjdXRlX3F1ZXVlKCkgd2FpdGluZ1xuIik7CisJCWFzY19leGVjdXRlX3F1ZXVlKCZib2FyZHAtPndhaXRpbmcpOworCX0KKworCS8qCisJICogU2F2ZSB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBMaW51eCBtaWQtbGV2ZWwgJ2RvbmUnIGZ1bmN0aW9uCisJICogYW5kIGF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC4KKwkgKgorCSAqIElmIEFTQ19OT0VSUk9SIGlzIHJldHVybmVkIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorCSAqIGJvYXJkJ3MgJ2FjdGl2ZScgcXVldWUgYW5kIHdpbGwgYmUgY29tcGxldGVkIGJ5IHRoZSBpbnRlcnJ1cHQKKwkgKiBoYW5kbGVyLgorCSAqCisJICogSWYgQVNDX0JVU1kgaXMgcmV0dXJuZWQgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZSBib2FyZCdzIHBlcgorCSAqIHRhcmdldCB3YWl0aW5nIGxpc3QuIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIHJlcXVlc3QgaGFzCisJICogYmVlbiB0cmllZC4gQWRkIGl0IHRvIHRoZSBiYWNrIG9mIHRoZSB3YWl0aW5nIGxpc3QuIEl0IHdpbGwgYmUKKwkgKiByZXRyaWVkIGxhdGVyLgorCSAqCisJICogSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoZSByZXF1ZXN0IHdpbGwgaGF2ZSBiZWVuIHBsYWNlZCBvbiB0aGUKKwkgKiBib2FyZCdzICdkb25lJyBxdWV1ZSBhbmQgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIHJldHVybmluZy4KKwkgKi8KKwlzY3AtPnNjc2lfZG9uZSA9IGRvbmU7CisJc3dpdGNoIChhc2NfZXhlY3V0ZV9zY3NpX2NtbmQoc2NwKSkgeworCWNhc2UgQVNDX05PRVJST1I6CisJCWJyZWFrOworCWNhc2UgQVNDX0JVU1k6CisJCWFzY19lbnF1ZXVlKCZib2FyZHAtPndhaXRpbmcsIHNjcCwgQVNDX0JBQ0spOworCQlicmVhazsKKwljYXNlIEFTQ19FUlJPUjoKKwlkZWZhdWx0OgorCQlkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+ZG9uZSwgTlVMTCwgQVNDX1RJRF9BTEwpOworCQkvKiBJbnRlcnJ1cHRzIGNvdWxkIGJlIGVuYWJsZWQgaGVyZS4gKi8KKwkJYXNjX3Njc2lfZG9uZV9saXN0KGRvbmVfc2NwKTsKKwkJYnJlYWs7CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKLSAgICAvKgotICAgICAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhbnkgd2FpdGluZyBjb21tYW5kcyBmb3IgdGhlIGJvYXJkLgotICAgICAqLwotICAgIGlmICghQVNDX1FVRVVFX0VNUFRZKCZib2FyZHAtPndhaXRpbmcpKSB7Ci0gICAgICAgIEFTQ19EQkcoMSwKLSAgICAgICAgICAgICJhZHZhbnN5c19xdWV1ZWNvbW1hbmQ6IGJlZm9yZSBhc2NfZXhlY3V0ZV9xdWV1ZSgpIHdhaXRpbmdcbiIpOwotICAgICAgICBhc2NfZXhlY3V0ZV9xdWV1ZSgmYm9hcmRwLT53YWl0aW5nKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTGludXggbWlkLWxldmVsICdkb25lJyBmdW5jdGlvbgotICAgICAqIGFuZCBhdHRlbXB0IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0gICAgICoKLSAgICAgKiBJZiBBU0NfTk9FUlJPUiBpcyByZXR1cm5lZCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUKLSAgICAgKiBib2FyZCdzICdhY3RpdmUnIHF1ZXVlIGFuZCB3aWxsIGJlIGNvbXBsZXRlZCBieSB0aGUgaW50ZXJydXB0Ci0gICAgICogaGFuZGxlci4KLSAgICAgKgotICAgICAqIElmIEFTQ19CVVNZIGlzIHJldHVybmVkIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUgYm9hcmQncyBwZXIKLSAgICAgKiB0YXJnZXQgd2FpdGluZyBsaXN0LiBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSByZXF1ZXN0IGhhcwotICAgICAqIGJlZW4gdHJpZWQuIEFkZCBpdCB0byB0aGUgYmFjayBvZiB0aGUgd2FpdGluZyBsaXN0LiBJdCB3aWxsIGJlCi0gICAgICogcmV0cmllZCBsYXRlci4KLSAgICAgKgotICAgICAqIElmIGFuIGVycm9yIG9jY3VycmVkLCB0aGUgcmVxdWVzdCB3aWxsIGhhdmUgYmVlbiBwbGFjZWQgb24gdGhlCi0gICAgICogYm9hcmQncyAnZG9uZScgcXVldWUgYW5kIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSByZXR1cm5pbmcuCi0gICAgICovCi0gICAgc2NwLT5zY3NpX2RvbmUgPSBkb25lOwotICAgIHN3aXRjaCAoYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKHNjcCkpIHsKLSAgICBjYXNlIEFTQ19OT0VSUk9SOgotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFTQ19CVVNZOgotICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT53YWl0aW5nLCBzY3AsIEFTQ19CQUNLKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBU0NfRVJST1I6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgZG9uZV9zY3AgPSBhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmRvbmUsIE5VTEwsIEFTQ19USURfQUxMKTsKLSAgICAgICAgLyogSW50ZXJydXB0cyBjb3VsZCBiZSBlbmFibGVkIGhlcmUuICovCi0gICAgICAgIGFzY19zY3NpX2RvbmVfbGlzdChkb25lX3NjcCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKLQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNTY0NywxNzggKzQ0MjUsMTg3IEBACiAgKiBzbGVlcGluZyBpcyBhbGxvd2VkIGFuZCBubyBsb2NraW5nIG90aGVyIHRoYW4gZm9yIGhvc3Qgc3RydWN0dXJlcyBpcwogICogcmVxdWlyZWQuIFJldHVybnMgU1VDQ0VTUyBvciBGQUlMRUQuCiAgKi8KLXN0YXRpYyBpbnQKLWFkdmFuc3lzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3N0YXRpYyBpbnQgYWR2YW5zeXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NwKQogewotICAgIHN0cnVjdCBTY3NpX0hvc3QgICAgICpzaHA7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAgKmJvYXJkcDsKLSAgICBBU0NfRFZDX1ZBUiAgICAgICAgICAqYXNjX2R2Y192YXJwOwotICAgIEFEVl9EVkNfVkFSICAgICAgICAgICphZHZfZHZjX3ZhcnA7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgc3RydWN0IHNjc2lfY21uZCAgICAgICAgICAgICpkb25lX3NjcCA9IE5VTEwsICpsYXN0X3NjcCA9IE5VTEw7Ci0gICAgc3RydWN0IHNjc2lfY21uZCAgICAgICAgICAgICp0c2NwLCAqbmV3X2xhc3Rfc2NwOwotICAgIGludCAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBpbnQgICAgICAgICAgICAgICAgICByZXQgPSBTVUNDRVNTOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCWFzY19ib2FyZF90ICpib2FyZHA7CisJQVNDX0RWQ19WQVIgKmFzY19kdmNfdmFycDsKKwlBRFZfRFZDX1ZBUiAqYWR2X2R2Y192YXJwOworCXVsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX2NtbmQgKmRvbmVfc2NwID0gTlVMTCwgKmxhc3Rfc2NwID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICp0c2NwLCAqbmV3X2xhc3Rfc2NwOworCWludCBzdGF0dXM7CisJaW50IHJldCA9IFNVQ0NFU1M7CiAKLSAgICBBU0NfREJHMSgxLCAiYWR2YW5zeXNfcmVzZXQ6IDB4JWx4XG4iLCAodWxvbmcpIHNjcCk7CisJQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Jlc2V0OiAweCVseFxuIiwgKHVsb25nKXNjcCk7CiAKICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgIGlmIChzY3AtPmRldmljZS0+aG9zdCAhPSBOVUxMKSB7Ci0gICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgcmVzZXQpOwotICAgIH0KKwlpZiAoc2NwLT5kZXZpY2UtPmhvc3QgIT0gTlVMTCkgeworCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIHJlc2V0KTsKKwl9CiAjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KIAotICAgIGlmICgoc2hwID0gc2NwLT5kZXZpY2UtPmhvc3QpID09IE5VTEwpIHsKLSAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuIEZBSUxFRDsKLSAgICB9CisJaWYgKChzaG9zdCA9IHNjcC0+ZGV2aWNlLT5ob3N0KSA9PSBOVUxMKSB7CisJCXNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisJCXJldHVybiBGQUlMRUQ7CisJfQogCi0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2hvc3QpOwogCi0gICAgQVNDX1BSSU5UMSgiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCBzdGFydGVkLi4uXG4iLAotICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAvKgotICAgICAqIENoZWNrIGZvciByZS1lbnRyYW5jeS4KLSAgICAgKi8KLSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7Ci0gICAgaWYgKGJvYXJkcC0+ZmxhZ3MgJiBBU0NfSE9TVF9JTl9SRVNFVCkgeworCUFTQ19QUklOVDEoImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgc3RhcnRlZC4uLlxuIiwKKwkJICAgYm9hcmRwLT5pZCk7CisJLyoKKwkgKiBDaGVjayBmb3IgcmUtZW50cmFuY3kuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOworCWlmIChib2FyZHAtPmZsYWdzICYgQVNDX0hPU1RfSU5fUkVTRVQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCWJvYXJkcC0+ZmxhZ3MgfD0gQVNDX0hPU1RfSU5fUkVTRVQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIHJldHVybiBGQUlMRUQ7Ci0gICAgfQotICAgIGJvYXJkcC0+ZmxhZ3MgfD0gQVNDX0hPU1RfSU5fUkVTRVQ7Ci0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CiAKLSAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE5hcnJvdyBCb2FyZAotICAgICAgICAgKi8KLSAgICAgICAgYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCS8qCisJCSAqIE5hcnJvdyBCb2FyZAorCQkgKi8KKwkJYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKIAotICAgICAgICAvKgotICAgICAgICAgKiBSZXNldCB0aGUgY2hpcCBhbmQgU0NTSSBidXMuCi0gICAgICAgICAqLwotICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19yZXNldDogYmVmb3JlIEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOwotICAgICAgICBzdGF0dXMgPSBBc2NJbml0QXNjMTAwMERyaXZlcihhc2NfZHZjX3ZhcnApOworCQkvKgorCQkgKiBSZXNldCB0aGUgY2hpcCBhbmQgU0NTSSBidXMuCisJCSAqLworCQlBU0NfREJHKDEsICJhZHZhbnN5c19yZXNldDogYmVmb3JlIEFzY0luaXRBc2MxMDAwRHJpdmVyKClcbiIpOworCQlzdGF0dXMgPSBBc2NJbml0QXNjMTAwMERyaXZlcihhc2NfZHZjX3ZhcnApOwogCi0gICAgICAgIC8qIFJlZmVyIHRvIEFTQ19JRVJSXyogZGVmaW50aW9ucyBmb3IgbWVhbmluZyBvZiAnZXJyX2NvZGUnLiAqLwotICAgICAgICBpZiAoYXNjX2R2Y192YXJwLT5lcnJfY29kZSkgewotICAgICAgICAgICAgQVNDX1BSSU5UMigKLSAgICAgICAgICAgICAgICAiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKTsKLSAgICAgICAgICAgIHJldCA9IEZBSUxFRDsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIEFTQ19QUklOVDIoCi0gICAgICAgICAgICAgICAgImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgd2FybmluZzogMHgleFxuIiwKLSAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBzdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNDX1BSSU5UMSgKLSAgICAgICAgICAgICAgICAiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCBzdWNjZXNzZnVsLlxuIiwKLSAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgfQorCQkvKiBSZWZlciB0byBBU0NfSUVSUl8qIGRlZmludGlvbnMgZm9yIG1lYW5pbmcgb2YgJ2Vycl9jb2RlJy4gKi8KKwkJaWYgKGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpIHsKKwkJCUFTQ19QUklOVDIKKwkJCSAgICAoImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgZXJyb3I6IDB4JXhcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOworCQkJcmV0ID0gRkFJTEVEOworCQl9IGVsc2UgaWYgKHN0YXR1cykgeworCQkJQVNDX1BSSU5UMgorCQkJICAgICgiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCB3YXJuaW5nOiAweCV4XG4iLAorCQkJICAgICBib2FyZHAtPmlkLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJQVNDX1BSSU5UMQorCQkJICAgICgiYWR2YW5zeXNfcmVzZXQ6IGJvYXJkICVkOiBTQ1NJIGJ1cyByZXNldCBzdWNjZXNzZnVsLlxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCk7CisJCX0KIAotICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19yZXNldDogYWZ0ZXIgQXNjSW5pdEFzYzEwMDBEcml2ZXIoKVxuIik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOworCQlBU0NfREJHKDEsICJhZHZhbnN5c19yZXNldDogYWZ0ZXIgQXNjSW5pdEFzYzEwMDBEcml2ZXIoKVxuIik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdpZGUgQm9hcmQKLSAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhlIHN1Z2dlc3QgcmVzZXQgYnVzIGZsYWdzIGFyZSBzZXQsIHRoZW4gcmVzZXQgdGhlIGJ1cy4KLSAgICAgICAgICogT3RoZXJ3aXNlIG9ubHkgcmVzZXQgdGhlIGRldmljZS4KLSAgICAgICAgICovCi0gICAgICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2lkZSBCb2FyZAorCQkgKgorCQkgKiBJZiB0aGUgc3VnZ2VzdCByZXNldCBidXMgZmxhZ3MgYXJlIHNldCwgdGhlbiByZXNldCB0aGUgYnVzLgorCQkgKiBPdGhlcndpc2Ugb25seSByZXNldCB0aGUgZGV2aWNlLgorCQkgKi8KKwkJYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKIAotICAgICAgICAvKgotICAgICAgICAgKiBSZXNldCB0aGUgdGFyZ2V0J3MgU0NTSSBidXMuCi0gICAgICAgICAqLwotICAgICAgICBBU0NfREJHKDEsICJhZHZhbnN5c19yZXNldDogYmVmb3JlIEFkdlJlc2V0Q2hpcEFuZFNCKClcbiIpOwotICAgICAgICBzd2l0Y2ggKEFkdlJlc2V0Q2hpcEFuZFNCKGFkdl9kdmNfdmFycCkpIHsKLSAgICAgICAgY2FzZSBBU0NfVFJVRToKLSAgICAgICAgICAgIEFTQ19QUklOVDEoImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgc3VjY2Vzc2Z1bC5cbiIsCi0gICAgICAgICAgICAgICAgYm9hcmRwLT5pZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU0NfRkFMU0U6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU0NfUFJJTlQxKCJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IGVycm9yLlxuIiwKLSAgICAgICAgICAgICAgICBib2FyZHAtPmlkKTsKLSAgICAgICAgICAgIHJldCA9IEZBSUxFRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAodm9pZCkgQWR2SVNSKGFkdl9kdmNfdmFycCk7Ci0gICAgfQotICAgIC8qIEJvYXJkIGxvY2sgaXMgaGVsZC4gKi8KKwkJLyoKKwkJICogUmVzZXQgdGhlIHRhcmdldCdzIFNDU0kgYnVzLgorCQkgKi8KKwkJQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVzZXQ6IGJlZm9yZSBBZHZSZXNldENoaXBBbmRTQigpXG4iKTsKKwkJc3dpdGNoIChBZHZSZXNldENoaXBBbmRTQihhZHZfZHZjX3ZhcnApKSB7CisJCWNhc2UgQVNDX1RSVUU6CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJhZHZhbnN5c19yZXNldDogYm9hcmQgJWQ6IFNDU0kgYnVzIHJlc2V0IHN1Y2Nlc3NmdWwuXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19GQUxTRToKKwkJZGVmYXVsdDoKKwkJCUFTQ19QUklOVDEKKwkJCSAgICAoImFkdmFuc3lzX3Jlc2V0OiBib2FyZCAlZDogU0NTSSBidXMgcmVzZXQgZXJyb3IuXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCXJldCA9IEZBSUxFRDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKwkJKHZvaWQpQWR2SVNSKGFkdl9kdmNfdmFycCk7CisJfQorCS8qIEJvYXJkIGxvY2sgaXMgaGVsZC4gKi8KIAotICAgIC8qCi0gICAgICogRGVxdWV1ZSBhbGwgYm9hcmQgJ2RvbmUnIHJlcXVlc3RzLiBBIHBvaW50ZXIgdG8gdGhlIGxhc3QgcmVxdWVzdAotICAgICAqIGlzIHJldHVybmVkIGluICdsYXN0X3NjcCcuCi0gICAgICovCi0gICAgZG9uZV9zY3AgPSBhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmRvbmUsICZsYXN0X3NjcCwgQVNDX1RJRF9BTEwpOworCS8qCisJICogRGVxdWV1ZSBhbGwgYm9hcmQgJ2RvbmUnIHJlcXVlc3RzLiBBIHBvaW50ZXIgdG8gdGhlIGxhc3QgcmVxdWVzdAorCSAqIGlzIHJldHVybmVkIGluICdsYXN0X3NjcCcuCisJICovCisJZG9uZV9zY3AgPSBhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmRvbmUsICZsYXN0X3NjcCwgQVNDX1RJRF9BTEwpOwogCi0gICAgLyoKLSAgICAgKiBEZXF1ZXVlIGFsbCBib2FyZCAnYWN0aXZlJyByZXF1ZXN0cyBmb3IgYWxsIGRldmljZXMgYW5kIHNldAotICAgICAqIHRoZSByZXF1ZXN0IHN0YXR1cyB0byBESURfUkVTRVQuIEEgcG9pbnRlciB0byB0aGUgbGFzdCByZXF1ZXN0Ci0gICAgICogaXMgcmV0dXJuZWQgaW4gJ2xhc3Rfc2NwJy4KLSAgICAgKi8KLSAgICBpZiAoZG9uZV9zY3AgPT0gTlVMTCkgewotICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+YWN0aXZlLCAmbGFzdF9zY3AsIEFTQ19USURfQUxMKTsKLSAgICAgICAgZm9yICh0c2NwID0gZG9uZV9zY3A7IHRzY3A7IHRzY3AgPSBSRVFQTkVYVCh0c2NwKSkgewotICAgICAgICAgICAgdHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9SRVNFVCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBBcHBlbmQgdG8gJ2RvbmVfc2NwJyBhdCB0aGUgZW5kIHdpdGggJ2xhc3Rfc2NwJy4gKi8KLSAgICAgICAgQVNDX0FTU0VSVChsYXN0X3NjcCAhPSBOVUxMKTsKLSAgICAgICAgbGFzdF9zY3AtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWFzY19kZXF1ZXVlX2xpc3QoCi0JCQkmYm9hcmRwLT5hY3RpdmUsICZuZXdfbGFzdF9zY3AsIEFTQ19USURfQUxMKTsKLSAgICAgICAgaWYgKG5ld19sYXN0X3NjcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBU0NfQVNTRVJUKFJFUVBORVhUKGxhc3Rfc2NwKSAhPSBOVUxMKTsKLSAgICAgICAgICAgIGZvciAodHNjcCA9IFJFUVBORVhUKGxhc3Rfc2NwKTsgdHNjcDsgdHNjcCA9IFJFUVBORVhUKHRzY3ApKSB7Ci0gICAgICAgICAgICAgICAgdHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9SRVNFVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsYXN0X3NjcCA9IG5ld19sYXN0X3NjcDsKLSAgICAgICAgfQotICAgIH0KKwkvKgorCSAqIERlcXVldWUgYWxsIGJvYXJkICdhY3RpdmUnIHJlcXVlc3RzIGZvciBhbGwgZGV2aWNlcyBhbmQgc2V0CisJICogdGhlIHJlcXVlc3Qgc3RhdHVzIHRvIERJRF9SRVNFVC4gQSBwb2ludGVyIHRvIHRoZSBsYXN0IHJlcXVlc3QKKwkgKiBpcyByZXR1cm5lZCBpbiAnbGFzdF9zY3AnLgorCSAqLworCWlmIChkb25lX3NjcCA9PSBOVUxMKSB7CisJCWRvbmVfc2NwID0KKwkJICAgIGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+YWN0aXZlLCAmbGFzdF9zY3AsIEFTQ19USURfQUxMKTsKKwkJZm9yICh0c2NwID0gZG9uZV9zY3A7IHRzY3A7IHRzY3AgPSBSRVFQTkVYVCh0c2NwKSkgeworCQkJdHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9SRVNFVCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBBcHBlbmQgdG8gJ2RvbmVfc2NwJyBhdCB0aGUgZW5kIHdpdGggJ2xhc3Rfc2NwJy4gKi8KKwkJQVNDX0FTU0VSVChsYXN0X3NjcCAhPSBOVUxMKTsKKwkJbGFzdF9zY3AtPmhvc3Rfc2NyaWJibGUgPQorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmFjdGl2ZSwKKwkJCQkJCSAgICAgICZuZXdfbGFzdF9zY3AsCisJCQkJCQkgICAgICBBU0NfVElEX0FMTCk7CisJCWlmIChuZXdfbGFzdF9zY3AgIT0gTlVMTCkgeworCQkJQVNDX0FTU0VSVChSRVFQTkVYVChsYXN0X3NjcCkgIT0gTlVMTCk7CisJCQlmb3IgKHRzY3AgPSBSRVFQTkVYVChsYXN0X3NjcCk7IHRzY3A7CisJCQkgICAgIHRzY3AgPSBSRVFQTkVYVCh0c2NwKSkgeworCQkJCXRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworCQkJfQorCQkJbGFzdF9zY3AgPSBuZXdfbGFzdF9zY3A7CisJCX0KKwl9CiAKLSAgICAvKgotICAgICAqIERlcXVldWUgYWxsICd3YWl0aW5nJyByZXF1ZXN0cyBhbmQgc2V0IHRoZSByZXF1ZXN0IHN0YXR1cwotICAgICAqIHRvIERJRF9SRVNFVC4KLSAgICAgKi8KLSAgICBpZiAoZG9uZV9zY3AgPT0gTlVMTCkgewotICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+d2FpdGluZywgJmxhc3Rfc2NwLCBBU0NfVElEX0FMTCk7Ci0gICAgICAgIGZvciAodHNjcCA9IGRvbmVfc2NwOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKLSAgICAgICAgICAgIHRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogQXBwZW5kIHRvICdkb25lX3NjcCcgYXQgdGhlIGVuZCB3aXRoICdsYXN0X3NjcCcuICovCi0gICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7Ci0gICAgICAgIGxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KAotCQkJJmJvYXJkcC0+d2FpdGluZywgJm5ld19sYXN0X3NjcCwgQVNDX1RJRF9BTEwpOwotICAgICAgICBpZiAobmV3X2xhc3Rfc2NwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOwotICAgICAgICAgICAgZm9yICh0c2NwID0gUkVRUE5FWFQobGFzdF9zY3ApOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKLSAgICAgICAgICAgICAgICB0c2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX1JFU0VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3Rfc2NwID0gbmV3X2xhc3Rfc2NwOwotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogRGVxdWV1ZSBhbGwgJ3dhaXRpbmcnIHJlcXVlc3RzIGFuZCBzZXQgdGhlIHJlcXVlc3Qgc3RhdHVzCisJICogdG8gRElEX1JFU0VULgorCSAqLworCWlmIChkb25lX3NjcCA9PSBOVUxMKSB7CisJCWRvbmVfc2NwID0KKwkJICAgIGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+d2FpdGluZywgJmxhc3Rfc2NwLCBBU0NfVElEX0FMTCk7CisJCWZvciAodHNjcCA9IGRvbmVfc2NwOyB0c2NwOyB0c2NwID0gUkVRUE5FWFQodHNjcCkpIHsKKwkJCXRzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfUkVTRVQpOworCQl9CisJfSBlbHNlIHsKKwkJLyogQXBwZW5kIHRvICdkb25lX3NjcCcgYXQgdGhlIGVuZCB3aXRoICdsYXN0X3NjcCcuICovCisJCUFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7CisJCWxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0KKwkJICAgICh1bnNpZ25lZCBjaGFyICopYXNjX2RlcXVldWVfbGlzdCgmYm9hcmRwLT53YWl0aW5nLAorCQkJCQkJICAgICAgJm5ld19sYXN0X3NjcCwKKwkJCQkJCSAgICAgIEFTQ19USURfQUxMKTsKKwkJaWYgKG5ld19sYXN0X3NjcCAhPSBOVUxMKSB7CisJCQlBU0NfQVNTRVJUKFJFUVBORVhUKGxhc3Rfc2NwKSAhPSBOVUxMKTsKKwkJCWZvciAodHNjcCA9IFJFUVBORVhUKGxhc3Rfc2NwKTsgdHNjcDsKKwkJCSAgICAgdHNjcCA9IFJFUVBORVhUKHRzY3ApKSB7CisJCQkJdHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9SRVNFVCk7CisJCQl9CisJCQlsYXN0X3NjcCA9IG5ld19sYXN0X3NjcDsKKwkJfQorCX0KIAotICAgIC8qIFNhdmUgdGhlIHRpbWUgb2YgdGhlIG1vc3QgcmVjZW50bHkgY29tcGxldGVkIHJlc2V0LiAqLwotICAgIGJvYXJkcC0+bGFzdF9yZXNldCA9IGppZmZpZXM7CisJLyogU2F2ZSB0aGUgdGltZSBvZiB0aGUgbW9zdCByZWNlbnRseSBjb21wbGV0ZWQgcmVzZXQuICovCisJYm9hcmRwLT5sYXN0X3Jlc2V0ID0gamlmZmllczsKIAotICAgIC8qIENsZWFyIHJlc2V0IGZsYWcuICovCi0gICAgYm9hcmRwLT5mbGFncyAmPSB+QVNDX0hPU1RfSU5fUkVTRVQ7Ci0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisJLyogQ2xlYXIgcmVzZXQgZmxhZy4gKi8KKwlib2FyZHAtPmZsYWdzICY9IH5BU0NfSE9TVF9JTl9SRVNFVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKIAotICAgIC8qCi0gICAgICogQ29tcGxldGUgYWxsIHRoZSAnZG9uZV9zY3AnIHJlcXVlc3RzLgotICAgICAqLwotICAgIGlmIChkb25lX3NjcCAhPSBOVUxMKSB7Ci0gICAgICAgIGFzY19zY3NpX2RvbmVfbGlzdChkb25lX3NjcCk7Ci0gICAgfQorCS8qCisJICogQ29tcGxldGUgYWxsIHRoZSAnZG9uZV9zY3AnIHJlcXVlc3RzLgorCSAqLworCWlmIChkb25lX3NjcCAhPSBOVUxMKSB7CisJCWFzY19zY3NpX2RvbmVfbGlzdChkb25lX3NjcCk7CisJfQogCi0gICAgQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Jlc2V0OiByZXQgJWRcbiIsIHJldCk7CisJQVNDX0RCRzEoMSwgImFkdmFuc3lzX3Jlc2V0OiByZXQgJWRcbiIsIHJldCk7CiAKLSAgICByZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC01ODM0LDcxICs0NjIxLDcwIEBACiAgKi8KIHN0YXRpYyBpbnQKIGFkdmFuc3lzX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCi0JCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKKwkJICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQogewotICAgIGFzY19ib2FyZF90ICAgICAqYm9hcmRwOworCWFzY19ib2FyZF90ICpib2FyZHA7CiAKLSAgICBBU0NfREJHKDEsICJhZHZhbnN5c19iaW9zcGFyYW06IGJlZ2luXG4iKTsKLSAgICBBU0NfU1RBVFMoc2Rldi0+aG9zdCwgYmlvc3BhcmFtKTsKLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNkZXYtPmhvc3QpOwotICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKLSAgICAgICAgaWYgKChib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXIuZHZjX2NudGwgJgotICAgICAgICAgICAgIEFTQ19DTlRMX0JJT1NfR1RfMUdCKSAmJiBjYXBhY2l0eSA+IDB4MjAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgaXBbMF0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgaXBbMV0gPSA2MzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpcFswXSA9IDY0OwotICAgICAgICAgICAgICAgIGlwWzFdID0gMzI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3Zhci5iaW9zX2N0cmwgJgotICAgICAgICAgICAgIEJJT1NfQ1RSTF9FWFRFTkRFRF9YTEFUKSAmJiBjYXBhY2l0eSA+IDB4MjAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgaXBbMF0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgaXBbMV0gPSA2MzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpcFswXSA9IDY0OwotICAgICAgICAgICAgICAgIGlwWzFdID0gMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaXBbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIChpcFswXSAqIGlwWzFdKTsKLSAgICBBU0NfREJHKDEsICJhZHZhbnN5c19iaW9zcGFyYW06IGVuZFxuIik7Ci0gICAgcmV0dXJuIDA7CisJQVNDX0RCRygxLCAiYWR2YW5zeXNfYmlvc3BhcmFtOiBiZWdpblxuIik7CisJQVNDX1NUQVRTKHNkZXYtPmhvc3QsIGJpb3NwYXJhbSk7CisJYm9hcmRwID0gQVNDX0JPQVJEUChzZGV2LT5ob3N0KTsKKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCWlmICgoYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyLmR2Y19jbnRsICYKKwkJICAgICBBU0NfQ05UTF9CSU9TX0dUXzFHQikgJiYgY2FwYWNpdHkgPiAweDIwMDAwMCkgeworCQkJaXBbMF0gPSAyNTU7CisJCQlpcFsxXSA9IDYzOworCQl9IGVsc2UgeworCQkJaXBbMF0gPSA2NDsKKwkJCWlwWzFdID0gMzI7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3Zhci5iaW9zX2N0cmwgJgorCQkgICAgIEJJT1NfQ1RSTF9FWFRFTkRFRF9YTEFUKSAmJiBjYXBhY2l0eSA+IDB4MjAwMDAwKSB7CisJCQlpcFswXSA9IDI1NTsKKwkJCWlwWzFdID0gNjM7CisJCX0gZWxzZSB7CisJCQlpcFswXSA9IDY0OworCQkJaXBbMV0gPSAzMjsKKwkJfQorCX0KKwlpcFsyXSA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gKGlwWzBdICogaXBbMV0pOworCUFTQ19EQkcoMSwgImFkdmFuc3lzX2Jpb3NwYXJhbTogZW5kXG4iKTsKKwlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIC0tLSBMb2FkYWJsZSBEcml2ZXIgU3VwcG9ydAotICovCitzdGF0aWMgaW50IF9faW5pdCBhZHZhbnN5c19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCk7CitzdGF0aWMgaW50IGFkdmFuc3lzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwKTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewotICAgIC5wcm9jX25hbWUgICAgICAgICAgICAgICAgICA9ICJhZHZhbnN5cyIsCisJLnByb2NfbmFtZSA9ICJhZHZhbnN5cyIsCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLSAgICAucHJvY19pbmZvICAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19wcm9jX2luZm8sCisJLnByb2NfaW5mbyA9IGFkdmFuc3lzX3Byb2NfaW5mbywKICNlbmRpZgotICAgIC5uYW1lICAgICAgICAgICAgICAgICAgICAgICA9ICJhZHZhbnN5cyIsCi0gICAgLmRldGVjdCAgICAgICAgICAgICAgICAgICAgID0gYWR2YW5zeXNfZGV0ZWN0LCAKLSAgICAucmVsZWFzZSAgICAgICAgICAgICAgICAgICAgPSBhZHZhbnN5c19yZWxlYXNlLAotICAgIC5pbmZvICAgICAgICAgICAgICAgICAgICAgICA9IGFkdmFuc3lzX2luZm8sCi0gICAgLnF1ZXVlY29tbWFuZCAgICAgICAgICAgICAgID0gYWR2YW5zeXNfcXVldWVjb21tYW5kLAotICAgIC5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGFkdmFuc3lzX3Jlc2V0LAotICAgIC5iaW9zX3BhcmFtICAgICAgICAgICAgICAgICA9IGFkdmFuc3lzX2Jpb3NwYXJhbSwKLSAgICAuc2xhdmVfY29uZmlndXJlCQk9IGFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZSwKLSAgICAvKgotICAgICAqIEJlY2F1c2UgdGhlIGRyaXZlciBtYXkgY29udHJvbCBhbiBJU0EgYWRhcHRlciAndW5jaGVja2VkX2lzYV9kbWEnCi0gICAgICogbXVzdCBiZSBzZXQuIFRoZSBmbGFnIHdpbGwgYmUgY2xlYXJlZCBpbiBhZHZhbnN5c19kZXRlY3QgZm9yIG5vbi1JU0EKLSAgICAgKiBhZGFwdGVycy4gUmVmZXIgdG8gdGhlIGNvbW1lbnQgaW4gc2NzaV9tb2R1bGUuYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICAudW5jaGVja2VkX2lzYV9kbWEgICAgICAgICAgPSAxLAotICAgIC8qCi0gICAgICogQWxsIGFkYXB0ZXJzIGNvbnRyb2xsZWQgYnkgdGhpcyBkcml2ZXIgYXJlIGNhcGFibGUgb2YgbGFyZ2UKLSAgICAgKiBzY2F0dGVyLWdhdGhlciBsaXN0cy4gQWNjb3JkaW5nIHRvIHRoZSBtaWQtbGV2ZWwgU0NTSSBkb2N1bWVudGF0aW9uCi0gICAgICogdGhpcyBvYnZpYXRlcyBhbnkgcGVyZm9ybWFuY2UgZ2FpbiBwcm92aWRlZCBieSBzZXR0aW5nCi0gICAgICogJ3VzZV9jbHVzdGVyaW5nJy4gQnV0IGVtcGlyaWNhbGx5IHdoaWxlIENQVSB1dGlsaXphdGlvbiBpcyBpbmNyZWFzZWQKLSAgICAgKiBieSBlbmFibGluZyBjbHVzdGVyaW5nLCBJL08gdGhyb3VnaHB1dCBpbmNyZWFzZXMgYXMgd2VsbC4KLSAgICAgKi8KLSAgICAudXNlX2NsdXN0ZXJpbmcgICAgICAgICAgICAgPSBFTkFCTEVfQ0xVU1RFUklORywKKwkubmFtZSA9ICJhZHZhbnN5cyIsCisJLmRldGVjdCA9IGFkdmFuc3lzX2RldGVjdCwKKwkucmVsZWFzZSA9IGFkdmFuc3lzX3JlbGVhc2UsCisJLmluZm8gPSBhZHZhbnN5c19pbmZvLAorCS5xdWV1ZWNvbW1hbmQgPSBhZHZhbnN5c19xdWV1ZWNvbW1hbmQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0gYWR2YW5zeXNfcmVzZXQsCisJLmJpb3NfcGFyYW0gPSBhZHZhbnN5c19iaW9zcGFyYW0sCisJLnNsYXZlX2NvbmZpZ3VyZSA9IGFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZSwKKwkvKgorCSAqIEJlY2F1c2UgdGhlIGRyaXZlciBtYXkgY29udHJvbCBhbiBJU0EgYWRhcHRlciAndW5jaGVja2VkX2lzYV9kbWEnCisJICogbXVzdCBiZSBzZXQuIFRoZSBmbGFnIHdpbGwgYmUgY2xlYXJlZCBpbiBhZHZhbnN5c19kZXRlY3QgZm9yIG5vbi1JU0EKKwkgKiBhZGFwdGVycy4gUmVmZXIgdG8gdGhlIGNvbW1lbnQgaW4gc2NzaV9tb2R1bGUuYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwkudW5jaGVja2VkX2lzYV9kbWEgPSAxLAorCS8qCisJICogQWxsIGFkYXB0ZXJzIGNvbnRyb2xsZWQgYnkgdGhpcyBkcml2ZXIgYXJlIGNhcGFibGUgb2YgbGFyZ2UKKwkgKiBzY2F0dGVyLWdhdGhlciBsaXN0cy4gQWNjb3JkaW5nIHRvIHRoZSBtaWQtbGV2ZWwgU0NTSSBkb2N1bWVudGF0aW9uCisJICogdGhpcyBvYnZpYXRlcyBhbnkgcGVyZm9ybWFuY2UgZ2FpbiBwcm92aWRlZCBieSBzZXR0aW5nCisJICogJ3VzZV9jbHVzdGVyaW5nJy4gQnV0IGVtcGlyaWNhbGx5IHdoaWxlIENQVSB1dGlsaXphdGlvbiBpcyBpbmNyZWFzZWQKKwkgKiBieSBlbmFibGluZyBjbHVzdGVyaW5nLCBJL08gdGhyb3VnaHB1dCBpbmNyZWFzZXMgYXMgd2VsbC4KKwkgKi8KKwkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKIH07Ci0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKIAorI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCiAKIC8qCiAgKiAtLS0gTWlzY2VsbGFuZW91cyBEcml2ZXIgRnVuY3Rpb25zCkBAIC01OTEzLDEzMCArNDY5OSwxMzggQEAKICAqIHRvIHRoZSBBZHZhblN5cyBkcml2ZXIgd2hpY2ggaXMgZm9yIGEgZGV2aWNlIHNoYXJpbmcgYW4gaW50ZXJydXB0IHdpdGgKICAqIGFuIEFkdmFuU3lzIGFkYXB0ZXIuCiAgKi8KLVNUQVRJQyBpcnFyZXR1cm5fdAotYWR2YW5zeXNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZHZhbnN5c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotICAgIHVsb25nICAgICAgICAgICBmbGFnczsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBhc2NfYm9hcmRfdCAgICAgKmJvYXJkcDsKLSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICpkb25lX3NjcCA9IE5VTEwsICpsYXN0X3NjcCA9IE5VTEw7Ci0gICAgc3RydWN0IHNjc2lfY21uZCAgICAgICAqbmV3X2xhc3Rfc2NwOwotICAgIHN0cnVjdCBTY3NpX0hvc3QgKnNocDsKKwl1bG9uZyBmbGFnczsKKwlpbnQgaTsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOworCXN0cnVjdCBzY3NpX2NtbmQgKmRvbmVfc2NwID0gTlVMTCwgKmxhc3Rfc2NwID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpuZXdfbGFzdF9zY3A7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CiAKLSAgICBBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGJlZ2luXG4iKTsKKwlBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGJlZ2luXG4iKTsKIAotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIGludGVycnVwdHMgb24gYWxsIGJvYXJkcy4KLSAgICAgKiBBc2NJU1IoKSB3aWxsIGNhbGwgYXNjX2lzcl9jYWxsYmFjaygpLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBhc2NfYm9hcmRfY291bnQ7IGkrKykgewotCXNocCA9IGFzY19ob3N0W2ldOwotICAgICAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7Ci0gICAgICAgIEFTQ19EQkcyKDIsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGkgJWQsIGJvYXJkcCAweCVseFxuIiwKLSAgICAgICAgICAgIGksICh1bG9uZykgYm9hcmRwKTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmJvYXJkcC0+bG9jaywgZmxhZ3MpOwotICAgICAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTmFycm93IEJvYXJkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBc2NJc0ludFBlbmRpbmcoc2hwLT5pb19wb3J0KSkgewotICAgICAgICAgICAgICAgIEFTQ19TVEFUUyhzaHAsIGludGVycnVwdCk7Ci0gICAgICAgICAgICAgICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWZvcmUgQXNjSVNSKClcbiIpOwotICAgICAgICAgICAgICAgIEFzY0lTUigmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBXaWRlIEJvYXJkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2ludGVycnVwdDogYmVmb3JlIEFkdklTUigpXG4iKTsKLSAgICAgICAgICAgIGlmIChBZHZJU1IoJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcikpIHsKLSAgICAgICAgICAgICAgICBBU0NfU1RBVFMoc2hwLCBpbnRlcnJ1cHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJLyoKKwkgKiBDaGVjayBmb3IgaW50ZXJydXB0cyBvbiBhbGwgYm9hcmRzLgorCSAqIEFzY0lTUigpIHdpbGwgY2FsbCBhc2NfaXNyX2NhbGxiYWNrKCkuCisJICovCisJZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7CisJCXNob3N0ID0gYXNjX2hvc3RbaV07CisJCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2hvc3QpOworCQlBU0NfREJHMigyLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBpICVkLCBib2FyZHAgMHglbHhcbiIsCisJCQkgaSwgKHVsb25nKWJvYXJkcCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZib2FyZHAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCQkJLyoKKwkJCSAqIE5hcnJvdyBCb2FyZAorCQkJICovCisJCQlpZiAoQXNjSXNJbnRQZW5kaW5nKHNob3N0LT5pb19wb3J0KSkgeworCQkJCUFTQ19TVEFUUyhzaG9zdCwgaW50ZXJydXB0KTsKKwkJCQlBU0NfREJHKDEsCisJCQkJCSJhZHZhbnN5c19pbnRlcnJ1cHQ6IGJlZm9yZSBBc2NJU1IoKVxuIik7CisJCQkJQXNjSVNSKCZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdpZGUgQm9hcmQKKwkJCSAqLworCQkJQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWZvcmUgQWR2SVNSKClcbiIpOworCQkJaWYgKEFkdklTUigmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyKSkgeworCQkJCUFTQ19TVEFUUyhzaG9zdCwgaW50ZXJydXB0KTsKKwkJCX0KKwkJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHdhaXRpbmcgcmVxdWVzdHMgYW5kIGNyZWF0ZSBhIGxpc3Qgb2YgY29tcGxldGVkIHJlcXVlc3RzLgotICAgICAgICAgKgotICAgICAgICAgKiBJZiBhIHJlc2V0IHJlcXVlc3QgaXMgYmVpbmcgcGVyZm9ybWVkIGZvciB0aGUgYm9hcmQsIHRoZSByZXNldAotICAgICAgICAgKiBoYW5kbGVyIHdpbGwgY29tcGxldGUgcGVuZGluZyByZXF1ZXN0cyBhZnRlciBpdCBoYXMgY29tcGxldGVkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChib2FyZHAtPmZsYWdzICYgQVNDX0hPU1RfSU5fUkVTRVQpID09IDApIHsKLSAgICAgICAgICAgIEFTQ19EQkcyKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGRvbmVfc2NwIDB4JWx4LCBsYXN0X3NjcCAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAodWxvbmcpIGRvbmVfc2NwLCAodWxvbmcpIGxhc3Rfc2NwKTsKKwkJLyoKKwkJICogU3RhcnQgd2FpdGluZyByZXF1ZXN0cyBhbmQgY3JlYXRlIGEgbGlzdCBvZiBjb21wbGV0ZWQgcmVxdWVzdHMuCisJCSAqCisJCSAqIElmIGEgcmVzZXQgcmVxdWVzdCBpcyBiZWluZyBwZXJmb3JtZWQgZm9yIHRoZSBib2FyZCwgdGhlIHJlc2V0CisJCSAqIGhhbmRsZXIgd2lsbCBjb21wbGV0ZSBwZW5kaW5nIHJlcXVlc3RzIGFmdGVyIGl0IGhhcyBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoKGJvYXJkcC0+ZmxhZ3MgJiBBU0NfSE9TVF9JTl9SRVNFVCkgPT0gMCkgeworCQkJQVNDX0RCRzIoMSwKKwkJCQkgImFkdmFuc3lzX2ludGVycnVwdDogZG9uZV9zY3AgMHglbHgsIGxhc3Rfc2NwIDB4JWx4XG4iLAorCQkJCSAodWxvbmcpZG9uZV9zY3AsICh1bG9uZylsYXN0X3NjcCk7CiAKLSAgICAgICAgICAgIC8qIFN0YXJ0IGFueSB3YWl0aW5nIGNvbW1hbmRzIGZvciB0aGUgYm9hcmQuICovCi0gICAgICAgICAgICBpZiAoIUFTQ19RVUVVRV9FTVBUWSgmYm9hcmRwLT53YWl0aW5nKSkgewotICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdmFuc3lzX2ludGVycnVwdDogYmVmb3JlIGFzY19leGVjdXRlX3F1ZXVlKClcbiIpOwotICAgICAgICAgICAgICAgIGFzY19leGVjdXRlX3F1ZXVlKCZib2FyZHAtPndhaXRpbmcpOwotICAgICAgICAgICAgfQorCQkJLyogU3RhcnQgYW55IHdhaXRpbmcgY29tbWFuZHMgZm9yIHRoZSBib2FyZC4gKi8KKwkJCWlmICghQVNDX1FVRVVFX0VNUFRZKCZib2FyZHAtPndhaXRpbmcpKSB7CisJCQkJQVNDX0RCRygxLAorCQkJCQkiYWR2YW5zeXNfaW50ZXJydXB0OiBiZWZvcmUgYXNjX2V4ZWN1dGVfcXVldWUoKVxuIik7CisJCQkJYXNjX2V4ZWN1dGVfcXVldWUoJmJvYXJkcC0+d2FpdGluZyk7CisJCQl9CiAKLSAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiByZXF1ZXN0cyB0aGF0IG11c3QgYmUgY29tcGxldGVkLgotICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICogJ2RvbmVfc2NwJyB3aWxsIGFsd2F5cyBiZSBOVUxMIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24KLSAgICAgICAgICAgICAgKiBvZiB0aGlzIGxvb3AuICdsYXN0X3NjcCcgaXMgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMKLSAgICAgICAgICAgICAgKiAnZG9uZV9zY3AnLgotICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGRvbmVfc2NwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBkb25lX3NjcCA9IGFzY19kZXF1ZXVlX2xpc3QoJmJvYXJkcC0+ZG9uZSwgJmxhc3Rfc2NwLAotICAgICAgICAgICAgICAgICAgICBBU0NfVElEX0FMTCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQobGFzdF9zY3AgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgbGFzdF9zY3AtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWFzY19kZXF1ZXVlX2xpc3QoCi0JCQkmYm9hcmRwLT5kb25lLCAmbmV3X2xhc3Rfc2NwLCBBU0NfVElEX0FMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld19sYXN0X3NjcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBsYXN0X3NjcCA9IG5ld19sYXN0X3NjcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7Ci0gICAgfQorCQkJLyoKKwkJCSAqIEFkZCB0byB0aGUgbGlzdCBvZiByZXF1ZXN0cyB0aGF0IG11c3QgYmUgY29tcGxldGVkLgorCQkJICoKKwkJCSAqICdkb25lX3NjcCcgd2lsbCBhbHdheXMgYmUgTlVMTCBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uCisJCQkgKiBvZiB0aGlzIGxvb3AuICdsYXN0X3NjcCcgaXMgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMKKwkJCSAqICdkb25lX3NjcCcuCisJCQkgKi8KKwkJCWlmIChkb25lX3NjcCA9PSBOVUxMKSB7CisJCQkJZG9uZV9zY3AgPQorCQkJCSAgICBhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPmRvbmUsICZsYXN0X3NjcCwKKwkJCQkJCSAgICAgQVNDX1RJRF9BTEwpOworCQkJfSBlbHNlIHsKKwkJCQlBU0NfQVNTRVJUKGxhc3Rfc2NwICE9IE5VTEwpOworCQkJCWxhc3Rfc2NwLT5ob3N0X3NjcmliYmxlID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKilhc2NfZGVxdWV1ZV9saXN0KCZib2FyZHAtPgorCQkJCQkJCQkgICAgICBkb25lLAorCQkJCQkJCQkgICAgICAmbmV3X2xhc3Rfc2NwLAorCQkJCQkJCQkgICAgICBBU0NfVElEX0FMTCk7CisJCQkJaWYgKG5ld19sYXN0X3NjcCAhPSBOVUxMKSB7CisJCQkJCUFTQ19BU1NFUlQoUkVRUE5FWFQobGFzdF9zY3ApICE9IE5VTEwpOworCQkJCQlsYXN0X3NjcCA9IG5ld19sYXN0X3NjcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm9hcmRwLT5sb2NrLCBmbGFncyk7CisJfQogCi0gICAgLyoKLSAgICAgKiBJZiBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCBvbiBlbnRyeSwgdGhlbiB0aGV5Ci0gICAgICogYXJlIG5vdyBlbmFibGVkIGhlcmUuCi0gICAgICoKLSAgICAgKiBDb21wbGV0ZSBhbGwgcmVxdWVzdHMgb24gdGhlIGRvbmUgbGlzdC4KLSAgICAgKi8KKwkvKgorCSAqIElmIGludGVycnVwdHMgd2VyZSBlbmFibGVkIG9uIGVudHJ5LCB0aGVuIHRoZXkKKwkgKiBhcmUgbm93IGVuYWJsZWQgaGVyZS4KKwkgKgorCSAqIENvbXBsZXRlIGFsbCByZXF1ZXN0cyBvbiB0aGUgZG9uZSBsaXN0LgorCSAqLwogCi0gICAgYXNjX3Njc2lfZG9uZV9saXN0KGRvbmVfc2NwKTsKKwlhc2Nfc2NzaV9kb25lX2xpc3QoZG9uZV9zY3ApOwogCi0gICAgQVNDX0RCRygxLCAiYWR2YW5zeXNfaW50ZXJydXB0OiBlbmRcbiIpOwotICAgIHJldHVybiBJUlFfSEFORExFRDsKKwlBU0NfREJHKDEsICJhZHZhbnN5c19pbnRlcnJ1cHQ6IGVuZFxuIik7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKgogICogU2V0IHRoZSBudW1iZXIgb2YgY29tbWFuZHMgdG8gcXVldWUgcGVyIGRldmljZSBmb3IgdGhlCiAgKiBzcGVjaWZpZWQgaG9zdCBhZGFwdGVyLgogICovCi1TVEFUSUMgaW50Ci1hZHZhbnN5c19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSkKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOwogCi0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChkZXZpY2UtPmhvc3QpOwotICAgIGJvYXJkcC0+ZmxhZ3MgfD0gQVNDX1NFTEVDVF9RVUVVRV9ERVBUSFM7Ci0gICAgLyoKLSAgICAgKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlIGFuZCBzZXQgaXRzIGluaXRpYWwvbWF4aW11bQotICAgICAqIHF1ZXVlIGRlcHRoLiAgT25seSBzYXZlIHRoZSBwb2ludGVyIGZvciBhIGx1bjAgZGV2IHRob3VnaC4KLSAgICAgKi8KLSAgICBpZihkZXZpY2UtPmx1biA9PSAwKQotICAgICAgICBib2FyZHAtPmRldmljZVtkZXZpY2UtPmlkXSA9IGRldmljZTsKLSAgICBpZihkZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKLSAgICAgICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotCSAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIE1TR19PUkRFUkVEX1RBRywKLSAgICAgICAgICAgICAgICBib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXIubWF4X2R2Y19xbmdbZGV2aWNlLT5pZF0pOwotICAgICAgICB9IGVsc2UgewotCSAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIE1TR19PUkRFUkVEX1RBRywKLSAgICAgICAgICAgICAgICBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIubWF4X2R2Y19xbmcpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIDAsIGRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4pOwotICAgIH0KLSAgICBBU0NfREJHNCgxLCAiYWR2YW5zeXNfc2xhdmVfY29uZmlndXJlOiBkZXZpY2UgMHglbHgsIGJvYXJkcCAweCVseCwgaWQgJWQsIGRlcHRoICVkXG4iLAotICAgICAgICAgICAgKHVsb25nKSBkZXZpY2UsICh1bG9uZykgYm9hcmRwLCBkZXZpY2UtPmlkLCBkZXZpY2UtPnF1ZXVlX2RlcHRoKTsKLSAgICByZXR1cm4gMDsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKGRldmljZS0+aG9zdCk7CisJYm9hcmRwLT5mbGFncyB8PSBBU0NfU0VMRUNUX1FVRVVFX0RFUFRIUzsKKwkvKgorCSAqIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYW5kIHNldCBpdHMgaW5pdGlhbC9tYXhpbXVtCisJICogcXVldWUgZGVwdGguICBPbmx5IHNhdmUgdGhlIHBvaW50ZXIgZm9yIGEgbHVuMCBkZXYgdGhvdWdoLgorCSAqLworCWlmIChkZXZpY2UtPmx1biA9PSAwKQorCQlib2FyZHAtPmRldmljZVtkZXZpY2UtPmlkXSA9IGRldmljZTsKKwlpZiAoZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgTVNHX09SREVSRURfVEFHLAorCQkJCQkJYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyLgorCQkJCQkJbWF4X2R2Y19xbmdbZGV2aWNlLT5pZF0pOworCQl9IGVsc2UgeworCQkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLCBNU0dfT1JERVJFRF9UQUcsCisJCQkJCQlib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuCisJCQkJCQltYXhfZHZjX3FuZyk7CisJCX0KKwl9IGVsc2UgeworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChkZXZpY2UsIDAsIGRldmljZS0+aG9zdC0+Y21kX3Blcl9sdW4pOworCX0KKwlBU0NfREJHNCgxLAorCQkgImFkdmFuc3lzX3NsYXZlX2NvbmZpZ3VyZTogZGV2aWNlIDB4JWx4LCBib2FyZHAgMHglbHgsIGlkICVkLCBkZXB0aCAlZFxuIiwKKwkJICh1bG9uZylkZXZpY2UsICh1bG9uZylib2FyZHAsIGRldmljZS0+aWQsIGRldmljZS0+cXVldWVfZGVwdGgpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNjA0NSw0MyArNDgzOSw0NCBAQAogICoKICAqIEludGVycnVwdHMgY2FuIGJlIGVuYWJsZWQgb24gZW50cnkuCiAgKi8KLVNUQVRJQyB2b2lkCi1hc2Nfc2NzaV9kb25lX2xpc3Qoc3RydWN0IHNjc2lfY21uZCAqc2NwKQorc3RhdGljIHZvaWQgYXNjX3Njc2lfZG9uZV9saXN0KHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKIHsKLSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICAgICp0c2NwOworCXN0cnVjdCBzY3NpX2NtbmQgKnRzY3A7CiAKLSAgICBBU0NfREJHKDIsICJhc2Nfc2NzaV9kb25lX2xpc3Q6IGJlZ2luXG4iKTsKLSAgICB3aGlsZSAoc2NwICE9IE5VTEwpIHsKLQlhc2NfYm9hcmRfdCAqYm9hcmRwOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlBU0NfREJHKDIsICJhc2Nfc2NzaV9kb25lX2xpc3Q6IGJlZ2luXG4iKTsKKwl3aGlsZSAoc2NwICE9IE5VTEwpIHsKKwkJYXNjX2JvYXJkX3QgKmJvYXJkcDsKKwkJc3RydWN0IGRldmljZSAqZGV2OwogCi0gICAgICAgIEFTQ19EQkcxKDMsICJhc2Nfc2NzaV9kb25lX2xpc3Q6IHNjcCAweCVseFxuIiwgKHVsb25nKSBzY3ApOwotICAgICAgICB0c2NwID0gUkVRUE5FWFQoc2NwKTsKLSAgICAgICAgc2NwLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJQVNDX0RCRzEoMywgImFzY19zY3NpX2RvbmVfbGlzdDogc2NwIDB4JWx4XG4iLCAodWxvbmcpc2NwKTsKKwkJdHNjcCA9IFJFUVBORVhUKHNjcCk7CisJCXNjcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CiAKLQlib2FyZHAgPSBBU0NfQk9BUkRQKHNjcC0+ZGV2aWNlLT5ob3N0KTsKKwkJYm9hcmRwID0gQVNDX0JPQVJEUChzY3AtPmRldmljZS0+aG9zdCk7CiAKLQlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKQotCSAgICBkZXYgPSBib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmcuZGV2OwotCWVsc2UKLQkgICAgZGV2ID0gYm9hcmRwLT5kdmNfY2ZnLmFkdl9kdmNfY2ZnLmRldjsKKwkJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkKKwkJCWRldiA9IGJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZy5kZXY7CisJCWVsc2UKKwkJCWRldiA9IGJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZy5kZXY7CiAKLQlpZiAoc2NwLT51c2Vfc2cpCi0JICAgIGRtYV91bm1hcF9zZyhkZXYsIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyLAotCQkJIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQllbHNlIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikKLQkgICAgZG1hX3VubWFwX3NpbmdsZShkZXYsIHNjcC0+U0NwLmRtYV9oYW5kbGUsCi0JCQkgICAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJaWYgKHNjcC0+dXNlX3NnKQorCQkJZG1hX3VubWFwX3NnKGRldiwKKwkJCQkgICAgIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSAgICAgc2NwLT51c2Vfc2csIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQllbHNlIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBzY3AtPlNDcC5kbWFfaGFuZGxlLAorCQkJCQkgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCSBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKIAotICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGRvbmUpOwotICAgICAgICBBU0NfQVNTRVJUKHNjcC0+c2NzaV9kb25lICE9IE5VTEwpOworCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGRvbmUpOworCQlBU0NfQVNTRVJUKHNjcC0+c2NzaV9kb25lICE9IE5VTEwpOwogCi0gICAgICAgIHNjcC0+c2NzaV9kb25lKHNjcCk7CisJCXNjcC0+c2NzaV9kb25lKHNjcCk7CiAKLSAgICAgICAgc2NwID0gdHNjcDsKLSAgICB9Ci0gICAgQVNDX0RCRygyLCAiYXNjX3Njc2lfZG9uZV9saXN0OiBkb25lXG4iKTsKLSAgICByZXR1cm47CisJCXNjcCA9IHRzY3A7CisJfQorCUFTQ19EQkcoMiwgImFzY19zY3NpX2RvbmVfbGlzdDogZG9uZVxuIik7CisJcmV0dXJuOwogfQogCiAvKgpAQCAtNjEzMCwxNjggKzQ5MjUsMTcwIEBACiAgKiBJZiBBU0NfQlVTWSBpcyByZXR1cm5lZCB0aGUgcmVxdWVzdCB3aWxsIGJlIGVucXVldWVkIGJ5IHRoZQogICogY2FsbGVyIG9uIHRoZSB0YXJnZXQncyB3YWl0aW5nIHF1ZXVlIGFuZCByZS10cmllZCBsYXRlci4KICAqLwotU1RBVElDIGludAotYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3N0YXRpYyBpbnQgYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKLSAgICBBU0NfRFZDX1ZBUiAgICAgICAgKmFzY19kdmNfdmFycDsKLSAgICBBRFZfRFZDX1ZBUiAgICAgICAgKmFkdl9kdmNfdmFycDsKLSAgICBBRFZfU0NTSV9SRVFfUSAgICAgKmFkdl9zY3NpcXA7Ci0gICAgc3RydWN0IHNjc2lfZGV2aWNlICpkZXZpY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgIHJldDsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOworCUFTQ19EVkNfVkFSICphc2NfZHZjX3ZhcnA7CisJQURWX0RWQ19WQVIgKmFkdl9kdmNfdmFycDsKKwlBRFZfU0NTSV9SRVFfUSAqYWR2X3Njc2lxcDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZTsKKwlpbnQgcmV0OwogCi0gICAgQVNDX0RCRzIoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogc2NwIDB4JWx4LCBkb25lIDB4JWx4XG4iLAotICAgICAgICAodWxvbmcpIHNjcCwgKHVsb25nKSBzY3AtPnNjc2lfZG9uZSk7CisJQVNDX0RCRzIoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogc2NwIDB4JWx4LCBkb25lIDB4JWx4XG4iLAorCQkgKHVsb25nKXNjcCwgKHVsb25nKXNjcC0+c2NzaV9kb25lKTsKIAotICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2NwLT5kZXZpY2UtPmhvc3QpOwotICAgIGRldmljZSA9IGJvYXJkcC0+ZGV2aWNlW3NjcC0+ZGV2aWNlLT5pZF07CisJYm9hcmRwID0gQVNDX0JPQVJEUChzY3AtPmRldmljZS0+aG9zdCk7CisJZGV2aWNlID0gYm9hcmRwLT5kZXZpY2Vbc2NwLT5kZXZpY2UtPmlkXTsKIAotICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQnVpbGQgYW5kIGV4ZWN1dGUgTmFycm93IEJvYXJkIHJlcXVlc3QuCi0gICAgICAgICAqLworCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJLyoKKwkJICogQnVpbGQgYW5kIGV4ZWN1dGUgTmFycm93IEJvYXJkIHJlcXVlc3QuCisJCSAqLwogCi0gICAgICAgIGFzY19kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7CisJCWFzY19kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQnVpbGQgQXNjIExpYnJhcnkgcmVxdWVzdCBzdHJ1Y3R1cmUgdXNpbmcgdGhlCi0gICAgICAgICAqIGdsb2JhbCBzdHJ1Y3R1cmVzICdhc2Nfc2NzaV9yZXEnIGFuZCAnYXNjX3NnX2hlYWQnLgotICAgICAgICAgKgotICAgICAgICAgKiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAgICAgKiBxdWV1ZWQgb24gdGhlIGJvYXJkIGRvbmUgcXVldWUuIEl0IHdpbGwgYmUgY29tcGxldGVkCi0gICAgICAgICAqIGJ5IHRoZSBjYWxsZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFzY19idWlsZF9yZXEoKSBjYW4gbm90IHJldHVybiBBU0NfQlVTWS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChhc2NfYnVpbGRfcmVxKGJvYXJkcCwgc2NwKSA9PSBBU0NfRVJST1IpIHsKLSAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYnVpbGRfZXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIEFTQ19FUlJPUjsKLSAgICAgICAgfQorCQkvKgorCQkgKiBCdWlsZCBBc2MgTGlicmFyeSByZXF1ZXN0IHN0cnVjdHVyZSB1c2luZyB0aGUKKwkJICogZ2xvYmFsIHN0cnVjdHVyZXMgJ2FzY19zY3NpX3JlcScgYW5kICdhc2Nfc2dfaGVhZCcuCisJCSAqCisJCSAqIElmIGFuIGVycm9yIGlzIHJldHVybmVkLCB0aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisJCSAqIHF1ZXVlZCBvbiB0aGUgYm9hcmQgZG9uZSBxdWV1ZS4gSXQgd2lsbCBiZSBjb21wbGV0ZWQKKwkJICogYnkgdGhlIGNhbGxlci4KKwkJICoKKwkJICogYXNjX2J1aWxkX3JlcSgpIGNhbiBub3QgcmV0dXJuIEFTQ19CVVNZLgorCQkgKi8KKwkJaWYgKGFzY19idWlsZF9yZXEoYm9hcmRwLCBzY3ApID09IEFTQ19FUlJPUikgeworCQkJQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBidWlsZF9lcnJvcik7CisJCQlyZXR1cm4gQVNDX0VSUk9SOworCQl9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogRXhlY3V0ZSB0aGUgY29tbWFuZC4gSWYgdGhlcmUgaXMgbm8gZXJyb3IsIGFkZCB0aGUgY29tbWFuZAotICAgICAgICAgKiB0byB0aGUgYWN0aXZlIHF1ZXVlLgotICAgICAgICAgKi8KLSAgICAgICAgc3dpdGNoIChyZXQgPSBBc2NFeGVTY3NpUXVldWUoYXNjX2R2Y192YXJwLCAmYXNjX3Njc2lfcSkpIHsKLSAgICAgICAgY2FzZSBBU0NfTk9FUlJPUjoKLSAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX25vZXJyb3IpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEluY3JlbWVudCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgcGVyIGRldmljZSBzdWNjZXNzZnVsCi0gICAgICAgICAgICAgKiByZXF1ZXN0IGNvdW50ZXIuIFdyYXBwaW5nIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib2FyZHAtPnJlcWNudFtzY3AtPmRldmljZS0+aWRdKys7Ci0gICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCwgQVNDX0JBQ0spOwotICAgICAgICAgICAgQVNDX0RCRygxLAotICAgICAgICAgICAgICAgICJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IEFzY0V4ZVNjc2lRdWV1ZSgpLCBBU0NfTk9FUlJPUlxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU0NfQlVTWToKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWxsZXIgd2lsbCBlbnF1ZXVlIHJlcXVlc3Qgb24gdGhlIHRhcmdldCdzIHdhaXRpbmcgcXVldWUKLSAgICAgICAgICAgICAqIGFuZCByZXRyeSBsYXRlci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfYnVzeSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU0NfRVJST1I6Ci0gICAgICAgICAgICBBU0NfUFJJTlQyKAotImFzY19leGVjdXRlX3Njc2lfY21uZDogYm9hcmQgJWQ6IEFzY0V4ZVNjc2lRdWV1ZSgpIEFTQ19FUlJPUiwgZXJyX2NvZGUgMHgleFxuIiwKLSAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKTsKLSAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX2Vycm9yKTsKLSAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7Ci0gICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNDX1BSSU5UMigKLSJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGJvYXJkICVkOiBBc2NFeGVTY3NpUXVldWUoKSB1bmtub3duLCBlcnJfY29kZSAweCV4XG4iLAotICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+ZXJyX2NvZGUpOwotICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfdW5rbm93bik7Ci0gICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOwotICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEJ1aWxkIGFuZCBleGVjdXRlIFdpZGUgQm9hcmQgcmVxdWVzdC4KLSAgICAgICAgICovCi0gICAgICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisJCS8qCisJCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIElmIHRoZXJlIGlzIG5vIGVycm9yLCBhZGQgdGhlIGNvbW1hbmQKKwkJICogdG8gdGhlIGFjdGl2ZSBxdWV1ZS4KKwkJICovCisJCXN3aXRjaCAocmV0ID0gQXNjRXhlU2NzaVF1ZXVlKGFzY19kdmNfdmFycCwgJmFzY19zY3NpX3EpKSB7CisJCWNhc2UgQVNDX05PRVJST1I6CisJCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9ub2Vycm9yKTsKKwkJCS8qCisJCQkgKiBJbmNyZW1lbnQgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHBlciBkZXZpY2Ugc3VjY2Vzc2Z1bAorCQkJICogcmVxdWVzdCBjb3VudGVyLiBXcmFwcGluZyBkb2Vzbid0IG1hdHRlci4KKwkJCSAqLworCQkJYm9hcmRwLT5yZXFjbnRbc2NwLT5kZXZpY2UtPmlkXSsrOworCQkJYXNjX2VucXVldWUoJmJvYXJkcC0+YWN0aXZlLCBzY3AsIEFTQ19CQUNLKTsKKwkJCUFTQ19EQkcoMSwKKwkJCQkiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBBc2NFeGVTY3NpUXVldWUoKSwgQVNDX05PRVJST1JcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQVNDX0JVU1k6CisJCQkvKgorCQkJICogQ2FsbGVyIHdpbGwgZW5xdWV1ZSByZXF1ZXN0IG9uIHRoZSB0YXJnZXQncyB3YWl0aW5nIHF1ZXVlCisJCQkgKiBhbmQgcmV0cnkgbGF0ZXIuCisJCQkgKi8KKwkJCUFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX2J1c3kpOworCQkJYnJlYWs7CisJCWNhc2UgQVNDX0VSUk9SOgorCQkJQVNDX1BSSU5UMgorCQkJICAgICgiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBib2FyZCAlZDogQXNjRXhlU2NzaVF1ZXVlKCkgQVNDX0VSUk9SLCBlcnJfY29kZSAweCV4XG4iLAorCQkJICAgICBib2FyZHAtPmlkLCBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKwkJCUFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX2Vycm9yKTsKKwkJCXNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisJCQlhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNDX1BSSU5UMgorCQkJICAgICgiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBib2FyZCAlZDogQXNjRXhlU2NzaVF1ZXVlKCkgdW5rbm93biwgZXJyX2NvZGUgMHgleFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCwgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7CisJCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV91bmtub3duKTsKKwkJCXNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisJCQlhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQnVpbGQgYW5kIGV4ZWN1dGUgV2lkZSBCb2FyZCByZXF1ZXN0LgorCQkgKi8KKwkJYWR2X2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3ZhcjsKIAotICAgICAgICAvKgotICAgICAgICAgKiBCdWlsZCBhbmQgZ2V0IGEgcG9pbnRlciB0byBhbiBBZHYgTGlicmFyeSByZXF1ZXN0IHN0cnVjdHVyZS4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bGx5IGJ1aWx0IHRoZW4gc2VuZCBpdCBiZWxvdywKLSAgICAgICAgICogb3RoZXJ3aXNlIHJldHVybiB3aXRoIGFuIGVycm9yLgotICAgICAgICAgKi8KLSAgICAgICAgc3dpdGNoIChhZHZfYnVpbGRfcmVxKGJvYXJkcCwgc2NwLCAmYWR2X3Njc2lxcCkpIHsKLSAgICAgICAgY2FzZSBBU0NfTk9FUlJPUjoKLSAgICAgICAgICAgIEFTQ19EQkcoMywgImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfTk9FUlJPUlxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU0NfQlVTWToKLSAgICAgICAgICAgIEFTQ19EQkcoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfQlVTWVxuIik7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSWYgYnVzeSBpcyByZXR1cm5lZCB0aGUgcmVxdWVzdCBoYXMgbm90IGJlZW4gZW5xdWV1ZWQuCi0gICAgICAgICAgICAgKiBJdCB3aWxsIGJlIGVucXVldWVkIGJ5IHRoZSBjYWxsZXIgb24gdGhlIHRhcmdldCdzIHdhaXRpbmcKLSAgICAgICAgICAgICAqIHF1ZXVlIGFuZCByZXRyaWVkIGxhdGVyLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRoZSBhc2Nfc3RhdHMgZmllbGRzICdhZHZfYnVpbGRfbm9yZXEnIGFuZCAnYWR2X2J1aWxkX25vc2cnCi0gICAgICAgICAgICAgKiBjb3VudCB3aWRlIGJvYXJkIGJ1c3kgY29uZGl0aW9ucy4gVGhleSBhcmUgdXBkYXRlZCBpbgotICAgICAgICAgICAgICogYWR2X2J1aWxkX3JlcSBhbmQgYWR2X2dldF9zZ2xpc3QsIHJlc3BlY3RpdmVseS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0dXJuIEFTQ19CVVNZOwotICAgICAgICBjYXNlIEFTQ19FUlJPUjoKLSAgICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAgKiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAgICAgICAgICAqIHF1ZXVlZCBvbiB0aGUgYm9hcmQgZG9uZSBxdWV1ZS4gSXQgd2lsbCBiZSBjb21wbGV0ZWQKLSAgICAgICAgICAgICAgKiBieSB0aGUgY2FsbGVyLgotICAgICAgICAgICAgICAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNDX0RCRygxLCAiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBhZHZfYnVpbGRfcmVxIEFTQ19FUlJPUlxuIik7Ci0gICAgICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGJ1aWxkX2Vycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBBU0NfRVJST1I7Ci0gICAgICAgIH0KKwkJLyoKKwkJICogQnVpbGQgYW5kIGdldCBhIHBvaW50ZXIgdG8gYW4gQWR2IExpYnJhcnkgcmVxdWVzdCBzdHJ1Y3R1cmUuCisJCSAqCisJCSAqIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBidWlsdCB0aGVuIHNlbmQgaXQgYmVsb3csCisJCSAqIG90aGVyd2lzZSByZXR1cm4gd2l0aCBhbiBlcnJvci4KKwkJICovCisJCXN3aXRjaCAoYWR2X2J1aWxkX3JlcShib2FyZHAsIHNjcCwgJmFkdl9zY3NpcXApKSB7CisJCWNhc2UgQVNDX05PRVJST1I6CisJCQlBU0NfREJHKDMsCisJCQkJImFzY19leGVjdXRlX3Njc2lfY21uZDogYWR2X2J1aWxkX3JlcSBBU0NfTk9FUlJPUlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBBU0NfQlVTWToKKwkJCUFTQ19EQkcoMSwKKwkJCQkiYXNjX2V4ZWN1dGVfc2NzaV9jbW5kOiBhZHZfYnVpbGRfcmVxIEFTQ19CVVNZXG4iKTsKKwkJCS8qCisJCQkgKiBJZiBidXN5IGlzIHJldHVybmVkIHRoZSByZXF1ZXN0IGhhcyBub3QgYmVlbiBlbnF1ZXVlZC4KKwkJCSAqIEl0IHdpbGwgYmUgZW5xdWV1ZWQgYnkgdGhlIGNhbGxlciBvbiB0aGUgdGFyZ2V0J3Mgd2FpdGluZworCQkJICogcXVldWUgYW5kIHJldHJpZWQgbGF0ZXIuCisJCQkgKgorCQkJICogVGhlIGFzY19zdGF0cyBmaWVsZHMgJ2Fkdl9idWlsZF9ub3JlcScgYW5kICdhZHZfYnVpbGRfbm9zZycKKwkJCSAqIGNvdW50IHdpZGUgYm9hcmQgYnVzeSBjb25kaXRpb25zLiBUaGV5IGFyZSB1cGRhdGVkIGluCisJCQkgKiBhZHZfYnVpbGRfcmVxIGFuZCBhZHZfZ2V0X3NnbGlzdCwgcmVzcGVjdGl2ZWx5LgorCQkJICovCisJCQlyZXR1cm4gQVNDX0JVU1k7CisJCWNhc2UgQVNDX0VSUk9SOgorCQkJLyogCisJCQkgKiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCwgdGhlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorCQkJICogcXVldWVkIG9uIHRoZSBib2FyZCBkb25lIHF1ZXVlLiBJdCB3aWxsIGJlIGNvbXBsZXRlZAorCQkJICogYnkgdGhlIGNhbGxlci4KKwkJCSAqLworCQlkZWZhdWx0OgorCQkJQVNDX0RCRygxLAorCQkJCSJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGFkdl9idWlsZF9yZXEgQVNDX0VSUk9SXG4iKTsKKwkJCUFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYnVpbGRfZXJyb3IpOworCQkJcmV0dXJuIEFTQ19FUlJPUjsKKwkJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIElmIHRoZXJlIGlzIG5vIGVycm9yLCBhZGQgdGhlIGNvbW1hbmQKLSAgICAgICAgICogdG8gdGhlIGFjdGl2ZSBxdWV1ZS4KLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaCAocmV0ID0gQWR2RXhlU2NzaVF1ZXVlKGFkdl9kdmNfdmFycCwgYWR2X3Njc2lxcCkpIHsKLSAgICAgICAgY2FzZSBBU0NfTk9FUlJPUjoKLSAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX25vZXJyb3IpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEluY3JlbWVudCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgcGVyIGRldmljZSBzdWNjZXNzZnVsCi0gICAgICAgICAgICAgKiByZXF1ZXN0IGNvdW50ZXIuIFdyYXBwaW5nIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib2FyZHAtPnJlcWNudFtzY3AtPmRldmljZS0+aWRdKys7Ci0gICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCwgQVNDX0JBQ0spOwotICAgICAgICAgICAgQVNDX0RCRygxLAotICAgICAgICAgICAgICAgICJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IEFkdkV4ZVNjc2lRdWV1ZSgpLCBBU0NfTk9FUlJPUlxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU0NfQlVTWToKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWxsZXIgd2lsbCBlbnF1ZXVlIHJlcXVlc3Qgb24gdGhlIHRhcmdldCdzIHdhaXRpbmcgcXVldWUKLSAgICAgICAgICAgICAqIGFuZCByZXRyeSBsYXRlci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfYnVzeSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU0NfRVJST1I6Ci0gICAgICAgICAgICBBU0NfUFJJTlQyKAotImFzY19leGVjdXRlX3Njc2lfY21uZDogYm9hcmQgJWQ6IEFkdkV4ZVNjc2lRdWV1ZSgpIEFTQ19FUlJPUiwgZXJyX2NvZGUgMHgleFxuIiwKLSAgICAgICAgICAgICAgICBib2FyZHAtPmlkLCBhZHZfZHZjX3ZhcnAtPmVycl9jb2RlKTsKLSAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgZXhlX2Vycm9yKTsKLSAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7Ci0gICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNDX1BSSU5UMigKLSJhc2NfZXhlY3V0ZV9zY3NpX2NtbmQ6IGJvYXJkICVkOiBBZHZFeGVTY3NpUXVldWUoKSB1bmtub3duLCBlcnJfY29kZSAweCV4XG4iLAotICAgICAgICAgICAgICAgIGJvYXJkcC0+aWQsIGFkdl9kdmNfdmFycC0+ZXJyX2NvZGUpOwotICAgICAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfdW5rbm93bik7Ci0gICAgICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOwotICAgICAgICAgICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKwkJLyoKKwkJICogRXhlY3V0ZSB0aGUgY29tbWFuZC4gSWYgdGhlcmUgaXMgbm8gZXJyb3IsIGFkZCB0aGUgY29tbWFuZAorCQkgKiB0byB0aGUgYWN0aXZlIHF1ZXVlLgorCQkgKi8KKwkJc3dpdGNoIChyZXQgPSBBZHZFeGVTY3NpUXVldWUoYWR2X2R2Y192YXJwLCBhZHZfc2NzaXFwKSkgeworCQljYXNlIEFTQ19OT0VSUk9SOgorCQkJQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfbm9lcnJvcik7CisJCQkvKgorCQkJICogSW5jcmVtZW50IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBwZXIgZGV2aWNlIHN1Y2Nlc3NmdWwKKwkJCSAqIHJlcXVlc3QgY291bnRlci4gV3JhcHBpbmcgZG9lc24ndCBtYXR0ZXIuCisJCQkgKi8KKwkJCWJvYXJkcC0+cmVxY250W3NjcC0+ZGV2aWNlLT5pZF0rKzsKKwkJCWFzY19lbnF1ZXVlKCZib2FyZHAtPmFjdGl2ZSwgc2NwLCBBU0NfQkFDSyk7CisJCQlBU0NfREJHKDEsCisJCQkJImFzY19leGVjdXRlX3Njc2lfY21uZDogQWR2RXhlU2NzaVF1ZXVlKCksIEFTQ19OT0VSUk9SXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19CVVNZOgorCQkJLyoKKwkJCSAqIENhbGxlciB3aWxsIGVucXVldWUgcmVxdWVzdCBvbiB0aGUgdGFyZ2V0J3Mgd2FpdGluZyBxdWV1ZQorCQkJICogYW5kIHJldHJ5IGxhdGVyLgorCQkJICovCisJCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9idXN5KTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19FUlJPUjoKKwkJCUFTQ19QUklOVDIKKwkJCSAgICAoImFzY19leGVjdXRlX3Njc2lfY21uZDogYm9hcmQgJWQ6IEFkdkV4ZVNjc2lRdWV1ZSgpIEFTQ19FUlJPUiwgZXJyX2NvZGUgMHgleFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCwgYWR2X2R2Y192YXJwLT5lcnJfY29kZSk7CisJCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGV4ZV9lcnJvcik7CisJCQlzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworCQkJYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTQ19QUklOVDIKKwkJCSAgICAoImFzY19leGVjdXRlX3Njc2lfY21uZDogYm9hcmQgJWQ6IEFkdkV4ZVNjc2lRdWV1ZSgpIHVua25vd24sIGVycl9jb2RlIDB4JXhcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIGFkdl9kdmNfdmFycC0+ZXJyX2NvZGUpOworCQkJQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBleGVfdW5rbm93bik7CisJCQlzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworCQkJYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisJCQlicmVhazsKKwkJfQorCX0KIAotICAgIEFTQ19EQkcoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogZW5kXG4iKTsKLSAgICByZXR1cm4gcmV0OworCUFTQ19EQkcoMSwgImFzY19leGVjdXRlX3Njc2lfY21uZDogZW5kXG4iKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNjMwMywxMzEgKzUxMDAsMTQwIEBACiAgKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gcXVldWUgdGhlIHJlcXVlc3Qgb24gdGhlIGJvYXJkIGRvbmUKICAqIHF1ZXVlIGFuZCByZXR1cm4gQVNDX0VSUk9SLgogICovCi1TVEFUSUMgaW50Ci1hc2NfYnVpbGRfcmVxKGFzY19ib2FyZF90ICpib2FyZHAsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCkKK3N0YXRpYyBpbnQgYXNjX2J1aWxkX3JlcShhc2NfYm9hcmRfdCAqYm9hcmRwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3ApCiB7Ci0gICAgc3RydWN0IGRldmljZSAqZGV2ID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmcuZGV2OwogCi0gICAgLyoKLSAgICAgKiBNdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIGlzIHJlcXVpcmVkIHRvICdhc2Nfc2NzaV9xJyBhbmQKLSAgICAgKiAnYXNjX3NnX2hlYWQnIHVudGlsIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgbWVtc2V0KCZhc2Nfc2NzaV9xLCAwLCBzaXplb2YoQVNDX1NDU0lfUSkpOworCS8qCisJICogTXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyBpcyByZXF1aXJlZCB0byAnYXNjX3Njc2lfcScgYW5kCisJICogJ2FzY19zZ19oZWFkJyB1bnRpbCBhZnRlciB0aGUgcmVxdWVzdCBpcyBzdGFydGVkLgorCSAqLworCW1lbXNldCgmYXNjX3Njc2lfcSwgMCwgc2l6ZW9mKEFTQ19TQ1NJX1EpKTsKIAotICAgIC8qCi0gICAgICogUG9pbnQgdGhlIEFTQ19TQ1NJX1EgdG8gdGhlICdzdHJ1Y3Qgc2NzaV9jbW5kJy4KLSAgICAgKi8KLSAgICBhc2Nfc2NzaV9xLnEyLnNyYl9wdHIgPSBBU0NfVkFERFJfVE9fVTMyKHNjcCk7CisJLyoKKwkgKiBQb2ludCB0aGUgQVNDX1NDU0lfUSB0byB0aGUgJ3N0cnVjdCBzY3NpX2NtbmQnLgorCSAqLworCWFzY19zY3NpX3EucTIuc3JiX3B0ciA9IEFTQ19WQUREUl9UT19VMzIoc2NwKTsKIAotICAgIC8qCi0gICAgICogQnVpbGQgdGhlIEFTQ19TQ1NJX1EgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEZvciBuYXJyb3cgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDEyIGJ5dGVzCi0gICAgICogaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIGlmIChzY3AtPmNtZF9sZW4gPiBBU0NfTUFYX0NEQl9MRU4pIHsKLSAgICAgICAgQVNDX1BSSU5UMygKLSJhc2NfYnVpbGRfcmVxOiBib2FyZCAlZDogY21kX2xlbiAlZCA+IEFTQ19NQVhfQ0RCX0xFTiAgJWRcbiIsCi0gICAgICAgICAgICBib2FyZHAtPmlkLCBzY3AtPmNtZF9sZW4sIEFTQ19NQVhfQ0RCX0xFTik7Ci0gICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7Ci0gICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOwotICAgICAgICByZXR1cm4gQVNDX0VSUk9SOwotICAgIH0KLSAgICBhc2Nfc2NzaV9xLmNkYnB0ciA9ICZzY3AtPmNtbmRbMF07Ci0gICAgYXNjX3Njc2lfcS5xMi5jZGJfbGVuID0gc2NwLT5jbWRfbGVuOwotICAgIGFzY19zY3NpX3EucTEudGFyZ2V0X2lkID0gQVNDX1RJRF9UT19UQVJHRVRfSUQoc2NwLT5kZXZpY2UtPmlkKTsKLSAgICBhc2Nfc2NzaV9xLnExLnRhcmdldF9sdW4gPSBzY3AtPmRldmljZS0+bHVuOwotICAgIGFzY19zY3NpX3EucTIudGFyZ2V0X2l4ID0gQVNDX1RJRExVTl9UT19JWChzY3AtPmRldmljZS0+aWQsIHNjcC0+ZGV2aWNlLT5sdW4pOwotICAgIGFzY19zY3NpX3EucTEuc2Vuc2VfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKCZzY3AtPnNlbnNlX2J1ZmZlclswXSkpOwotICAgIGFzY19zY3NpX3EucTEuc2Vuc2VfbGVuID0gc2l6ZW9mKHNjcC0+c2Vuc2VfYnVmZmVyKTsKKwkvKgorCSAqIEJ1aWxkIHRoZSBBU0NfU0NTSV9RIHJlcXVlc3QuCisJICoKKwkgKiBGb3IgbmFycm93IGJvYXJkcyBhIENEQiBsZW5ndGggbWF4aW11bSBvZiAxMiBieXRlcworCSAqIGlzIHN1cHBvcnRlZC4KKwkgKi8KKwlpZiAoc2NwLT5jbWRfbGVuID4gQVNDX01BWF9DREJfTEVOKSB7CisJCUFTQ19QUklOVDMKKwkJICAgICgiYXNjX2J1aWxkX3JlcTogYm9hcmQgJWQ6IGNtZF9sZW4gJWQgPiBBU0NfTUFYX0NEQl9MRU4gICVkXG4iLAorCQkgICAgIGJvYXJkcC0+aWQsIHNjcC0+Y21kX2xlbiwgQVNDX01BWF9DREJfTEVOKTsKKwkJc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKKwkJYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisJCXJldHVybiBBU0NfRVJST1I7CisJfQorCWFzY19zY3NpX3EuY2RicHRyID0gJnNjcC0+Y21uZFswXTsKKwlhc2Nfc2NzaV9xLnEyLmNkYl9sZW4gPSBzY3AtPmNtZF9sZW47CisJYXNjX3Njc2lfcS5xMS50YXJnZXRfaWQgPSBBU0NfVElEX1RPX1RBUkdFVF9JRChzY3AtPmRldmljZS0+aWQpOworCWFzY19zY3NpX3EucTEudGFyZ2V0X2x1biA9IHNjcC0+ZGV2aWNlLT5sdW47CisJYXNjX3Njc2lfcS5xMi50YXJnZXRfaXggPQorCSAgICBBU0NfVElETFVOX1RPX0lYKHNjcC0+ZGV2aWNlLT5pZCwgc2NwLT5kZXZpY2UtPmx1bik7CisJYXNjX3Njc2lfcS5xMS5zZW5zZV9hZGRyID0KKwkgICAgY3B1X3RvX2xlMzIodmlydF90b19idXMoJnNjcC0+c2Vuc2VfYnVmZmVyWzBdKSk7CisJYXNjX3Njc2lfcS5xMS5zZW5zZV9sZW4gPSBzaXplb2Yoc2NwLT5zZW5zZV9idWZmZXIpOwogCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGUgY3VycmVudCB0YXJnZXQsCi0gICAgICogdGhlbiBldmVyeSAyNTV0aCByZXF1ZXN0IHNlbmQgYW4gT1JERVJFRCByZXF1ZXN0LiBUaGlzIGhldXJpc3RpYwotICAgICAqIHRyaWVzIHRvIHJldGFpbiB0aGUgYmVuZWZpdCBvZiByZXF1ZXN0IHNvcnRpbmcgd2hpbGUgcHJldmVudGluZwotICAgICAqIHJlcXVlc3Qgc3RhcnZhdGlvbi4gMjU1IGlzIHRoZSBtYXggbnVtYmVyIG9mIHRhZ3Mgb3IgcGVuZGluZyBjb21tYW5kcwotICAgICAqIGEgZGV2aWNlIG1heSBoYXZlIG91dHN0YW5kaW5nLgotICAgICAqCi0gICAgICogVGhlIHJlcXVlc3QgY291bnQgaXMgaW5jcmVtZW50ZWQgYmVsb3cgZm9yIGV2ZXJ5IHN1Y2Nlc3NmdWxseQotICAgICAqIHN0YXJ0ZWQgcmVxdWVzdC4KLSAgICAgKgotICAgICAqLwotICAgIGlmICgoYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyLmN1cl9kdmNfcW5nW3NjcC0+ZGV2aWNlLT5pZF0gPiAwKSAmJgotICAgICAgICAoYm9hcmRwLT5yZXFjbnRbc2NwLT5kZXZpY2UtPmlkXSAlIDI1NSkgPT0gMCkgewotICAgICAgICBhc2Nfc2NzaV9xLnEyLnRhZ19jb2RlID0gTVNHX09SREVSRURfVEFHOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFzY19zY3NpX3EucTIudGFnX2NvZGUgPSBNU0dfU0lNUExFX1RBRzsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzIGZvciB0aGUgY3VycmVudCB0YXJnZXQsCisJICogdGhlbiBldmVyeSAyNTV0aCByZXF1ZXN0IHNlbmQgYW4gT1JERVJFRCByZXF1ZXN0LiBUaGlzIGhldXJpc3RpYworCSAqIHRyaWVzIHRvIHJldGFpbiB0aGUgYmVuZWZpdCBvZiByZXF1ZXN0IHNvcnRpbmcgd2hpbGUgcHJldmVudGluZworCSAqIHJlcXVlc3Qgc3RhcnZhdGlvbi4gMjU1IGlzIHRoZSBtYXggbnVtYmVyIG9mIHRhZ3Mgb3IgcGVuZGluZyBjb21tYW5kcworCSAqIGEgZGV2aWNlIG1heSBoYXZlIG91dHN0YW5kaW5nLgorCSAqCisJICogVGhlIHJlcXVlc3QgY291bnQgaXMgaW5jcmVtZW50ZWQgYmVsb3cgZm9yIGV2ZXJ5IHN1Y2Nlc3NmdWxseQorCSAqIHN0YXJ0ZWQgcmVxdWVzdC4KKwkgKgorCSAqLworCWlmICgoYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyLmN1cl9kdmNfcW5nW3NjcC0+ZGV2aWNlLT5pZF0gPiAwKSAmJgorCSAgICAoYm9hcmRwLT5yZXFjbnRbc2NwLT5kZXZpY2UtPmlkXSAlIDI1NSkgPT0gMCkgeworCQlhc2Nfc2NzaV9xLnEyLnRhZ19jb2RlID0gTVNHX09SREVSRURfVEFHOworCX0gZWxzZSB7CisJCWFzY19zY3NpX3EucTIudGFnX2NvZGUgPSBNU0dfU0lNUExFX1RBRzsKKwl9CiAKLSAgICAvKgotICAgICAqIEJ1aWxkIEFTQ19TQ1NJX1EgZm9yIGEgY29udGlndW91cyBidWZmZXIgb3IgYSBzY2F0dGVyLWdhdGhlcgotICAgICAqIGJ1ZmZlciBjb21tYW5kLgotICAgICAqLwotICAgIGlmIChzY3AtPnVzZV9zZyA9PSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENEQiByZXF1ZXN0IG9mIHNpbmdsZSBjb250aWd1b3VzIGJ1ZmZlci4KLSAgICAgICAgICovCi0gICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgY29udF9jbnQpOwotCXNjcC0+U0NwLmRtYV9oYW5kbGUgPSBzY3AtPnJlcXVlc3RfYnVmZmxlbiA/Ci0JICAgIGRtYV9tYXBfc2luZ2xlKGRldiwgc2NwLT5yZXF1ZXN0X2J1ZmZlciwKLQkJCSAgIHNjcC0+cmVxdWVzdF9idWZmbGVuLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKSA6IDA7Ci0JYXNjX3Njc2lfcS5xMS5kYXRhX2FkZHIgPSBjcHVfdG9fbGUzMihzY3AtPlNDcC5kbWFfaGFuZGxlKTsKLSAgICAgICAgYXNjX3Njc2lfcS5xMS5kYXRhX2NudCA9IGNwdV90b19sZTMyKHNjcC0+cmVxdWVzdF9idWZmbGVuKTsKLSAgICAgICAgQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgY29udF94ZmVyLAotICAgICAgICAgICAgICAgICAgICAgIEFTQ19DRUlMSU5HKHNjcC0+cmVxdWVzdF9idWZmbGVuLCA1MTIpKTsKLSAgICAgICAgYXNjX3Njc2lfcS5xMS5zZ19xdWV1ZV9jbnQgPSAwOwotICAgICAgICBhc2Nfc2NzaV9xLnNnX2hlYWQgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENEQiBzY2F0dGVyLWdhdGhlciByZXF1ZXN0IGxpc3QuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzZ2NudDsKLQlpbnQJCQl1c2Vfc2c7Ci0gICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAgICAgICpzbHA7CisJLyoKKwkgKiBCdWlsZCBBU0NfU0NTSV9RIGZvciBhIGNvbnRpZ3VvdXMgYnVmZmVyIG9yIGEgc2NhdHRlci1nYXRoZXIKKwkgKiBidWZmZXIgY29tbWFuZC4KKwkgKi8KKwlpZiAoc2NwLT51c2Vfc2cgPT0gMCkgeworCQkvKgorCQkgKiBDREIgcmVxdWVzdCBvZiBzaW5nbGUgY29udGlndW91cyBidWZmZXIuCisJCSAqLworCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfY250KTsKKwkJc2NwLT5TQ3AuZG1hX2hhbmRsZSA9IHNjcC0+cmVxdWVzdF9idWZmbGVuID8KKwkJICAgIGRtYV9tYXBfc2luZ2xlKGRldiwgc2NwLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICBzY3AtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkgICBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKSA6IDA7CisJCWFzY19zY3NpX3EucTEuZGF0YV9hZGRyID0gY3B1X3RvX2xlMzIoc2NwLT5TQ3AuZG1hX2hhbmRsZSk7CisJCWFzY19zY3NpX3EucTEuZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisJCUFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfeGZlciwKKwkJCSAgICAgIEFTQ19DRUlMSU5HKHNjcC0+cmVxdWVzdF9idWZmbGVuLCA1MTIpKTsKKwkJYXNjX3Njc2lfcS5xMS5zZ19xdWV1ZV9jbnQgPSAwOworCQlhc2Nfc2NzaV9xLnNnX2hlYWQgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIENEQiBzY2F0dGVyLWdhdGhlciByZXF1ZXN0IGxpc3QuCisJCSAqLworCQlpbnQgc2djbnQ7CisJCWludCB1c2Vfc2c7CisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2xwOwogCi0Jc2xwID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7Ci0JdXNlX3NnID0gZG1hX21hcF9zZyhkZXYsIHNscCwgc2NwLT51c2Vfc2csIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlzbHAgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJdXNlX3NnID0KKwkJICAgIGRtYV9tYXBfc2coZGV2LCBzbHAsIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKIAotCWlmICh1c2Vfc2cgPiBzY3AtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplKSB7Ci0gICAgICAgICAgICBBU0NfUFJJTlQzKAotImFzY19idWlsZF9yZXE6IGJvYXJkICVkOiB1c2Vfc2cgJWQgPiBzZ190YWJsZXNpemUgJWRcbiIsCi0JCWJvYXJkcC0+aWQsIHVzZV9zZywgc2NwLT5kZXZpY2UtPmhvc3QtPnNnX3RhYmxlc2l6ZSk7Ci0JICAgIGRtYV91bm1hcF9zZyhkZXYsIHNscCwgc2NwLT51c2Vfc2csIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOwotICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0VSUk9SKTsKLSAgICAgICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOwotICAgICAgICAgICAgcmV0dXJuIEFTQ19FUlJPUjsKLSAgICAgICAgfQorCQlpZiAodXNlX3NnID4gc2NwLT5kZXZpY2UtPmhvc3QtPnNnX3RhYmxlc2l6ZSkgeworCQkJQVNDX1BSSU5UMworCQkJICAgICgiYXNjX2J1aWxkX3JlcTogYm9hcmQgJWQ6IHVzZV9zZyAlZCA+IHNnX3RhYmxlc2l6ZSAlZFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCwgdXNlX3NnLAorCQkJICAgICBzY3AtPmRldmljZS0+aG9zdC0+c2dfdGFibGVzaXplKTsKKwkJCWRtYV91bm1hcF9zZyhkZXYsIHNscCwgc2NwLT51c2Vfc2csCisJCQkJICAgICBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJCXNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7CisJCQlhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKwkJCXJldHVybiBBU0NfRVJST1I7CisJCX0KIAotICAgICAgICBBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2NudCk7CisJCUFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgc2dfY250KTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBVc2UgZ2xvYmFsIEFTQ19TR19IRUFEIHN0cnVjdHVyZSBhbmQgc2V0IHRoZSBBU0NfU0NTSV9RCi0gICAgICAgICAqIHN0cnVjdHVyZSB0byBwb2ludCB0byBpdC4KLSAgICAgICAgICovCi0gICAgICAgIG1lbXNldCgmYXNjX3NnX2hlYWQsIDAsIHNpemVvZihBU0NfU0dfSEVBRCkpOworCQkvKgorCQkgKiBVc2UgZ2xvYmFsIEFTQ19TR19IRUFEIHN0cnVjdHVyZSBhbmQgc2V0IHRoZSBBU0NfU0NTSV9RCisJCSAqIHN0cnVjdHVyZSB0byBwb2ludCB0byBpdC4KKwkJICovCisJCW1lbXNldCgmYXNjX3NnX2hlYWQsIDAsIHNpemVvZihBU0NfU0dfSEVBRCkpOwogCi0gICAgICAgIGFzY19zY3NpX3EucTEuY250bCB8PSBRQ19TR19IRUFEOwotICAgICAgICBhc2Nfc2NzaV9xLnNnX2hlYWQgPSAmYXNjX3NnX2hlYWQ7Ci0gICAgICAgIGFzY19zY3NpX3EucTEuZGF0YV9jbnQgPSAwOwotICAgICAgICBhc2Nfc2NzaV9xLnExLmRhdGFfYWRkciA9IDA7Ci0gICAgICAgIC8qIFRoaXMgaXMgYSBieXRlIHZhbHVlLCBvdGhlcndpc2UgaXQgd291bGQgbmVlZCB0byBiZSBzd2FwcGVkLiAqLwotCWFzY19zZ19oZWFkLmVudHJ5X2NudCA9IGFzY19zY3NpX3EucTEuc2dfcXVldWVfY250ID0gdXNlX3NnOwotICAgICAgICBBU0NfU1RBVFNfQUREKHNjcC0+ZGV2aWNlLT5ob3N0LCBzZ19lbGVtLCBhc2Nfc2dfaGVhZC5lbnRyeV9jbnQpOworCQlhc2Nfc2NzaV9xLnExLmNudGwgfD0gUUNfU0dfSEVBRDsKKwkJYXNjX3Njc2lfcS5zZ19oZWFkID0gJmFzY19zZ19oZWFkOworCQlhc2Nfc2NzaV9xLnExLmRhdGFfY250ID0gMDsKKwkJYXNjX3Njc2lfcS5xMS5kYXRhX2FkZHIgPSAwOworCQkvKiBUaGlzIGlzIGEgYnl0ZSB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHdvdWxkIG5lZWQgdG8gYmUgc3dhcHBlZC4gKi8KKwkJYXNjX3NnX2hlYWQuZW50cnlfY250ID0gYXNjX3Njc2lfcS5xMS5zZ19xdWV1ZV9jbnQgPSB1c2Vfc2c7CisJCUFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2VsZW0sCisJCQkgICAgICBhc2Nfc2dfaGVhZC5lbnRyeV9jbnQpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgc2NhdHRlci1nYXRoZXIgbGlzdCBpbnRvIEFTQ19TR19IRUFEIGxpc3QuCi0gICAgICAgICAqLwotCWZvciAoc2djbnQgPSAwOyBzZ2NudCA8IHVzZV9zZzsgc2djbnQrKywgc2xwKyspIHsKLQkgICAgYXNjX3NnX2hlYWQuc2dfbGlzdFtzZ2NudF0uYWRkciA9IGNwdV90b19sZTMyKHNnX2RtYV9hZGRyZXNzKHNscCkpOwotCSAgICBhc2Nfc2dfaGVhZC5zZ19saXN0W3NnY250XS5ieXRlcyA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2xwKSk7Ci0JICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX3hmZXIsIEFTQ19DRUlMSU5HKHNnX2RtYV9sZW4oc2xwKSwgNTEyKSk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8qCisJCSAqIENvbnZlcnQgc2NhdHRlci1nYXRoZXIgbGlzdCBpbnRvIEFTQ19TR19IRUFEIGxpc3QuCisJCSAqLworCQlmb3IgKHNnY250ID0gMDsgc2djbnQgPCB1c2Vfc2c7IHNnY250KyssIHNscCsrKSB7CisJCQlhc2Nfc2dfaGVhZC5zZ19saXN0W3NnY250XS5hZGRyID0KKwkJCSAgICBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzbHApKTsKKwkJCWFzY19zZ19oZWFkLnNnX2xpc3Rbc2djbnRdLmJ5dGVzID0KKwkJCSAgICBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNscCkpOworCQkJQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfeGZlciwKKwkJCQkgICAgICBBU0NfQ0VJTElORyhzZ19kbWFfbGVuKHNscCksIDUxMikpOworCQl9CisJfQogCi0gICAgQVNDX0RCR19QUlRfQVNDX1NDU0lfUSgyLCAmYXNjX3Njc2lfcSk7Ci0gICAgQVNDX0RCR19QUlRfQ0RCKDEsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKwlBU0NfREJHX1BSVF9BU0NfU0NTSV9RKDIsICZhc2Nfc2NzaV9xKTsKKwlBU0NfREJHX1BSVF9DREIoMSwgc2NwLT5jbW5kLCBzY3AtPmNtZF9sZW4pOwogCi0gICAgcmV0dXJuIEFTQ19OT0VSUk9SOworCXJldHVybiBBU0NfTk9FUlJPUjsKIH0KIAogLyoKQEAgLTY0NDAsMTYyICs1MjQ2LDE2OCBAQAogICogbWljcm9jb2RlIGZvciBETUEgYWRkcmVzc2VzIG9yIG1hdGggb3BlcmF0aW9ucyBhcmUgYnl0ZSBzd2FwcGVkCiAgKiB0byBsaXR0bGUtZW5kaWFuIG9yZGVyLgogICovCi1TVEFUSUMgaW50CitzdGF0aWMgaW50CiBhZHZfYnVpbGRfcmVxKGFzY19ib2FyZF90ICpib2FyZHAsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKLSAgICBBRFZfU0NTSV9SRVFfUSAqKmFkdl9zY3NpcXBwKQorCSAgICAgIEFEVl9TQ1NJX1JFUV9RICoqYWR2X3Njc2lxcHApCiB7Ci0gICAgYWR2X3JlcV90ICAgICAgICAgICAqcmVxcDsKLSAgICBBRFZfU0NTSV9SRVFfUSAgICAgICpzY3NpcXA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIGludCAgICAgICAgICAgICAgICAgcmV0OwotICAgIHN0cnVjdCBkZXZpY2UJKmRldiA9IGJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZy5kZXY7CisJYWR2X3JlcV90ICpyZXFwOworCUFEVl9TQ1NJX1JFUV9RICpzY3NpcXA7CisJaW50IGk7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBib2FyZHAtPmR2Y19jZmcuYWR2X2R2Y19jZmcuZGV2OwogCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSBhbiBhZHZfcmVxX3Qgc3RydWN0dXJlIGZyb20gdGhlIGJvYXJkIHRvIGV4ZWN1dGUKLSAgICAgKiB0aGUgY29tbWFuZC4KLSAgICAgKi8KLSAgICBpZiAoYm9hcmRwLT5hZHZfcmVxcCA9PSBOVUxMKSB7Ci0gICAgICAgIEFTQ19EQkcoMSwgImFkdl9idWlsZF9yZXE6IG5vIGZyZWUgYWR2X3JlcV90XG4iKTsKLSAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBhZHZfYnVpbGRfbm9yZXEpOwotICAgICAgICByZXR1cm4gQVNDX0JVU1k7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7Ci0gICAgICAgIGJvYXJkcC0+YWR2X3JlcXAgPSByZXFwLT5uZXh0X3JlcXA7Ci0gICAgICAgIHJlcXAtPm5leHRfcmVxcCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHZXQgMzItYnl0ZSBhbGlnbmVkIEFEVl9TQ1NJX1JFUV9RIGFuZCBBRFZfU0dfQkxPQ0sgcG9pbnRlcnMuCi0gICAgICovCi0gICAgc2NzaXFwID0gKEFEVl9TQ1NJX1JFUV9RICopIEFEVl8zMkJBTElHTigmcmVxcC0+c2NzaV9yZXFfcSk7Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICBzY3NpcXAtPmNudGwgPSBzY3NpcXAtPnNjc2lfY250bCA9IHNjc2lxcC0+ZG9uZV9zdGF0dXMgPSAwOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIEFEVl9TQ1NJX1JFUV9RICdzcmJfcHRyJyB0byBwb2ludCB0byB0aGUgYWR2X3JlcV90IHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICBzY3NpcXAtPnNyYl9wdHIgPSBBU0NfVkFERFJfVE9fVTMyKHJlcXApOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGFkdl9yZXFfdCAnY21uZHAnIHRvIHBvaW50IHRvIHRoZSBzdHJ1Y3Qgc2NzaV9jbW5kIHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICByZXFwLT5jbW5kcCA9IHNjcDsKLQotICAgIC8qCi0gICAgICogQnVpbGQgdGhlIEFEVl9TQ1NJX1JFUV9RIHJlcXVlc3QuCi0gICAgICovCi0KLSAgICAvKgotICAgICAqIFNldCBDREIgbGVuZ3RoIGFuZCBjb3B5IGl0IHRvIHRoZSByZXF1ZXN0IHN0cnVjdHVyZS4KLSAgICAgKiBGb3Igd2lkZSAgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDE2IGJ5dGVzCi0gICAgICogaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIGlmIChzY3AtPmNtZF9sZW4gPiBBRFZfTUFYX0NEQl9MRU4pIHsKLSAgICAgICAgQVNDX1BSSU5UMygKLSJhZHZfYnVpbGRfcmVxOiBib2FyZCAlZDogY21kX2xlbiAlZCA+IEFEVl9NQVhfQ0RCX0xFTiAgJWRcbiIsCi0gICAgICAgICAgICBib2FyZHAtPmlkLCBzY3AtPmNtZF9sZW4sIEFEVl9NQVhfQ0RCX0xFTik7Ci0gICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7Ci0gICAgICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOwotICAgICAgICByZXR1cm4gQVNDX0VSUk9SOwotICAgIH0KLSAgICBzY3NpcXAtPmNkYl9sZW4gPSBzY3AtPmNtZF9sZW47Ci0gICAgLyogQ29weSBmaXJzdCAxMiBDREIgYnl0ZXMgdG8gY2RiW10uICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNjcC0+Y21kX2xlbiAmJiBpIDwgMTI7IGkrKykgewotICAgICAgICBzY3NpcXAtPmNkYltpXSA9IHNjcC0+Y21uZFtpXTsKLSAgICB9Ci0gICAgLyogQ29weSBsYXN0IDQgQ0RCIGJ5dGVzLCBpZiBwcmVzZW50LCB0byBjZGIxNltdLiAqLwotICAgIGZvciAoOyBpIDwgc2NwLT5jbWRfbGVuOyBpKyspIHsKLSAgICAgICAgc2NzaXFwLT5jZGIxNltpIC0gMTJdID0gc2NwLT5jbW5kW2ldOwotICAgIH0KLQotICAgIHNjc2lxcC0+dGFyZ2V0X2lkID0gc2NwLT5kZXZpY2UtPmlkOwotICAgIHNjc2lxcC0+dGFyZ2V0X2x1biA9IHNjcC0+ZGV2aWNlLT5sdW47Ci0KLSAgICBzY3NpcXAtPnNlbnNlX2FkZHIgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmc2NwLT5zZW5zZV9idWZmZXJbMF0pKTsKLSAgICBzY3NpcXAtPnNlbnNlX2xlbiA9IHNpemVvZihzY3AtPnNlbnNlX2J1ZmZlcik7Ci0KLSAgICAvKgotICAgICAqIEJ1aWxkIEFEVl9TQ1NJX1JFUV9RIGZvciBhIGNvbnRpZ3VvdXMgYnVmZmVyIG9yIGEgc2NhdHRlci1nYXRoZXIKLSAgICAgKiBidWZmZXIgY29tbWFuZC4KLSAgICAgKi8KLQotICAgIHNjc2lxcC0+ZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7Ci0gICAgc2NzaXFwLT52ZGF0YV9hZGRyID0gc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKLSAgICBzY3NpcXAtPmRhdGFfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKHNjcC0+cmVxdWVzdF9idWZmZXIpKTsKLQotICAgIGlmIChzY3AtPnVzZV9zZyA9PSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENEQiByZXF1ZXN0IG9mIHNpbmdsZSBjb250aWd1b3VzIGJ1ZmZlci4KLSAgICAgICAgICovCi0gICAgICAgIHJlcXAtPnNnYmxrcCA9IE5VTEw7Ci0Jc2NzaXFwLT5kYXRhX2NudCA9IGNwdV90b19sZTMyKHNjcC0+cmVxdWVzdF9idWZmbGVuKTsKLQlpZiAoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKLQkgICAgc2NzaXFwLT52ZGF0YV9hZGRyID0gc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKLQkgICAgc2NwLT5TQ3AuZG1hX2hhbmRsZSA9Ci0JICAgICAgICBkbWFfbWFwX3NpbmdsZShkZXYsIHNjcC0+cmVxdWVzdF9idWZmZXIsCi0JCQkgICAgICAgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCS8qCisJICogQWxsb2NhdGUgYW4gYWR2X3JlcV90IHN0cnVjdHVyZSBmcm9tIHRoZSBib2FyZCB0byBleGVjdXRlCisJICogdGhlIGNvbW1hbmQuCisJICovCisJaWYgKGJvYXJkcC0+YWR2X3JlcXAgPT0gTlVMTCkgeworCQlBU0NfREJHKDEsICJhZHZfYnVpbGRfcmVxOiBubyBmcmVlIGFkdl9yZXFfdFxuIik7CisJCUFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYWR2X2J1aWxkX25vcmVxKTsKKwkJcmV0dXJuIEFTQ19CVVNZOwogCX0gZWxzZSB7Ci0JICAgIHNjc2lxcC0+dmRhdGFfYWRkciA9IE5VTEw7Ci0JICAgIHNjcC0+U0NwLmRtYV9oYW5kbGUgPSAwOworCQlyZXFwID0gYm9hcmRwLT5hZHZfcmVxcDsKKwkJYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXAtPm5leHRfcmVxcDsKKwkJcmVxcC0+bmV4dF9yZXFwID0gTlVMTDsKIAl9Ci0Jc2NzaXFwLT5kYXRhX2FkZHIgPSBjcHVfdG9fbGUzMihzY3AtPlNDcC5kbWFfaGFuZGxlKTsKLSAgICAgICAgc2NzaXFwLT5zZ19saXN0X3B0ciA9IE5VTEw7Ci0gICAgICAgIHNjc2lxcC0+c2dfcmVhbF9hZGRyID0gMDsKLSAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBjb250X2NudCk7Ci0gICAgICAgIEFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIGNvbnRfeGZlciwKLSAgICAgICAgICAgICAgICAgICAgICBBU0NfQ0VJTElORyhzY3AtPnJlcXVlc3RfYnVmZmxlbiwgNTEyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ0RCIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3QgbGlzdC4KLSAgICAgICAgICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzbHA7Ci0JaW50IHVzZV9zZzsKIAotCXNscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOwotCXVzZV9zZyA9IGRtYV9tYXBfc2coZGV2LCBzbHAsIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkvKgorCSAqIEdldCAzMi1ieXRlIGFsaWduZWQgQURWX1NDU0lfUkVRX1EgYW5kIEFEVl9TR19CTE9DSyBwb2ludGVycy4KKwkgKi8KKwlzY3NpcXAgPSAoQURWX1NDU0lfUkVRX1EgKilBRFZfMzJCQUxJR04oJnJlcXAtPnNjc2lfcmVxX3EpOwogCi0JaWYgKHVzZV9zZyA+IEFEVl9NQVhfU0dfTElTVCkgewotICAgICAgICAgICAgQVNDX1BSSU5UMygKLSJhZHZfYnVpbGRfcmVxOiBib2FyZCAlZDogdXNlX3NnICVkID4gQURWX01BWF9TR19MSVNUICVkXG4iLAotCQlib2FyZHAtPmlkLCB1c2Vfc2csIHNjcC0+ZGV2aWNlLT5ob3N0LT5zZ190YWJsZXNpemUpOwotCSAgICBkbWFfdW5tYXBfc2coZGV2LCBzbHAsIHNjcC0+dXNlX3NnLCBzY3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLSAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUik7Ci0gICAgICAgICAgICBhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZS4KKwkgKi8KKwlzY3NpcXAtPmNudGwgPSBzY3NpcXAtPnNjc2lfY250bCA9IHNjc2lxcC0+ZG9uZV9zdGF0dXMgPSAwOwogCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRnJlZSB0aGUgJ2Fkdl9yZXFfdCcgc3RydWN0dXJlIGJ5IGFkZGluZyBpdCBiYWNrIHRvIHRoZQotICAgICAgICAgICAgICogYm9hcmQgZnJlZSBsaXN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXFwLT5uZXh0X3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwOwotICAgICAgICAgICAgYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CisJLyoKKwkgKiBTZXQgdGhlIEFEVl9TQ1NJX1JFUV9RICdzcmJfcHRyJyB0byBwb2ludCB0byB0aGUgYWR2X3JlcV90IHN0cnVjdHVyZS4KKwkgKi8KKwlzY3NpcXAtPnNyYl9wdHIgPSBBU0NfVkFERFJfVE9fVTMyKHJlcXApOwogCi0gICAgICAgICAgICByZXR1cm4gQVNDX0VSUk9SOwotICAgICAgICB9CisJLyoKKwkgKiBTZXQgdGhlIGFkdl9yZXFfdCAnY21uZHAnIHRvIHBvaW50IHRvIHRoZSBzdHJ1Y3Qgc2NzaV9jbW5kIHN0cnVjdHVyZS4KKwkgKi8KKwlyZXFwLT5jbW5kcCA9IHNjcDsKIAotCWlmICgocmV0ID0gYWR2X2dldF9zZ2xpc3QoYm9hcmRwLCByZXFwLCBzY3AsIHVzZV9zZykpICE9IEFEVl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRnJlZSB0aGUgYWR2X3JlcV90IHN0cnVjdHVyZSBieSBhZGRpbmcgaXQgYmFjayB0byB0aGUKLSAgICAgICAgICAgICAqIGJvYXJkIGZyZWUgbGlzdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcmVxcC0+bmV4dF9yZXFwID0gYm9hcmRwLT5hZHZfcmVxcDsKLSAgICAgICAgICAgIGJvYXJkcC0+YWR2X3JlcXAgPSByZXFwOworCS8qCisJICogQnVpbGQgdGhlIEFEVl9TQ1NJX1JFUV9RIHJlcXVlc3QuCisJICovCiAKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KKwkvKgorCSAqIFNldCBDREIgbGVuZ3RoIGFuZCBjb3B5IGl0IHRvIHRoZSByZXF1ZXN0IHN0cnVjdHVyZS4KKwkgKiBGb3Igd2lkZSAgYm9hcmRzIGEgQ0RCIGxlbmd0aCBtYXhpbXVtIG9mIDE2IGJ5dGVzCisJICogaXMgc3VwcG9ydGVkLgorCSAqLworCWlmIChzY3AtPmNtZF9sZW4gPiBBRFZfTUFYX0NEQl9MRU4pIHsKKwkJQVNDX1BSSU5UMworCQkgICAgKCJhZHZfYnVpbGRfcmVxOiBib2FyZCAlZDogY21kX2xlbiAlZCA+IEFEVl9NQVhfQ0RCX0xFTiAgJWRcbiIsCisJCSAgICAgYm9hcmRwLT5pZCwgc2NwLT5jbWRfbGVuLCBBRFZfTUFYX0NEQl9MRU4pOworCQlzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworCQlhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKKwkJcmV0dXJuIEFTQ19FUlJPUjsKKwl9CisJc2NzaXFwLT5jZGJfbGVuID0gc2NwLT5jbWRfbGVuOworCS8qIENvcHkgZmlyc3QgMTIgQ0RCIGJ5dGVzIHRvIGNkYltdLiAqLworCWZvciAoaSA9IDA7IGkgPCBzY3AtPmNtZF9sZW4gJiYgaSA8IDEyOyBpKyspIHsKKwkJc2NzaXFwLT5jZGJbaV0gPSBzY3AtPmNtbmRbaV07CisJfQorCS8qIENvcHkgbGFzdCA0IENEQiBieXRlcywgaWYgcHJlc2VudCwgdG8gY2RiMTZbXS4gKi8KKwlmb3IgKDsgaSA8IHNjcC0+Y21kX2xlbjsgaSsrKSB7CisJCXNjc2lxcC0+Y2RiMTZbaSAtIDEyXSA9IHNjcC0+Y21uZFtpXTsKKwl9CiAKLSAgICAgICAgQVNDX1NUQVRTKHNjcC0+ZGV2aWNlLT5ob3N0LCBzZ19jbnQpOwotCUFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2VsZW0sIHVzZV9zZyk7Ci0gICAgfQorCXNjc2lxcC0+dGFyZ2V0X2lkID0gc2NwLT5kZXZpY2UtPmlkOworCXNjc2lxcC0+dGFyZ2V0X2x1biA9IHNjcC0+ZGV2aWNlLT5sdW47CiAKLSAgICBBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUSgyLCBzY3NpcXApOwotICAgIEFTQ19EQkdfUFJUX0NEQigxLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CisJc2NzaXFwLT5zZW5zZV9hZGRyID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJnNjcC0+c2Vuc2VfYnVmZmVyWzBdKSk7CisJc2NzaXFwLT5zZW5zZV9sZW4gPSBzaXplb2Yoc2NwLT5zZW5zZV9idWZmZXIpOwogCi0gICAgKmFkdl9zY3NpcXBwID0gc2NzaXFwOworCS8qCisJICogQnVpbGQgQURWX1NDU0lfUkVRX1EgZm9yIGEgY29udGlndW91cyBidWZmZXIgb3IgYSBzY2F0dGVyLWdhdGhlcgorCSAqIGJ1ZmZlciBjb21tYW5kLgorCSAqLwogCi0gICAgcmV0dXJuIEFTQ19OT0VSUk9SOworCXNjc2lxcC0+ZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisJc2NzaXFwLT52ZGF0YV9hZGRyID0gc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKwlzY3NpcXAtPmRhdGFfYWRkciA9IGNwdV90b19sZTMyKHZpcnRfdG9fYnVzKHNjcC0+cmVxdWVzdF9idWZmZXIpKTsKKworCWlmIChzY3AtPnVzZV9zZyA9PSAwKSB7CisJCS8qCisJCSAqIENEQiByZXF1ZXN0IG9mIHNpbmdsZSBjb250aWd1b3VzIGJ1ZmZlci4KKwkJICovCisJCXJlcXAtPnNnYmxrcCA9IE5VTEw7CisJCXNjc2lxcC0+ZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihzY3AtPnJlcXVlc3RfYnVmZmxlbik7CisJCWlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJc2NzaXFwLT52ZGF0YV9hZGRyID0gc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKKwkJCXNjcC0+U0NwLmRtYV9oYW5kbGUgPQorCQkJICAgIGRtYV9tYXBfc2luZ2xlKGRldiwgc2NwLT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJICAgc2NwLT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCSAgIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJc2NzaXFwLT52ZGF0YV9hZGRyID0gTlVMTDsKKwkJCXNjcC0+U0NwLmRtYV9oYW5kbGUgPSAwOworCQl9CisJCXNjc2lxcC0+ZGF0YV9hZGRyID0gY3B1X3RvX2xlMzIoc2NwLT5TQ3AuZG1hX2hhbmRsZSk7CisJCXNjc2lxcC0+c2dfbGlzdF9wdHIgPSBOVUxMOworCQlzY3NpcXAtPnNnX3JlYWxfYWRkciA9IDA7CisJCUFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgY29udF9jbnQpOworCQlBU0NfU1RBVFNfQUREKHNjcC0+ZGV2aWNlLT5ob3N0LCBjb250X3hmZXIsCisJCQkgICAgICBBU0NfQ0VJTElORyhzY3AtPnJlcXVlc3RfYnVmZmxlbiwgNTEyKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ0RCIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3QgbGlzdC4KKwkJICovCisJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2xwOworCQlpbnQgdXNlX3NnOworCisJCXNscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3AtPnJlcXVlc3RfYnVmZmVyOworCQl1c2Vfc2cgPQorCQkgICAgZG1hX21hcF9zZyhkZXYsIHNscCwgc2NwLT51c2Vfc2csIHNjcC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJCWlmICh1c2Vfc2cgPiBBRFZfTUFYX1NHX0xJU1QpIHsKKwkJCUFTQ19QUklOVDMKKwkJCSAgICAoImFkdl9idWlsZF9yZXE6IGJvYXJkICVkOiB1c2Vfc2cgJWQgPiBBRFZfTUFYX1NHX0xJU1QgJWRcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIHVzZV9zZywKKwkJCSAgICAgc2NwLT5kZXZpY2UtPmhvc3QtPnNnX3RhYmxlc2l6ZSk7CisJCQlkbWFfdW5tYXBfc2coZGV2LCBzbHAsIHNjcC0+dXNlX3NnLAorCQkJCSAgICAgc2NwLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpOworCQkJYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisKKwkJCS8qCisJCQkgKiBGcmVlIHRoZSAnYWR2X3JlcV90JyBzdHJ1Y3R1cmUgYnkgYWRkaW5nIGl0IGJhY2sgdG8gdGhlCisJCQkgKiBib2FyZCBmcmVlIGxpc3QuCisJCQkgKi8KKwkJCXJlcXAtPm5leHRfcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7CisJCQlib2FyZHAtPmFkdl9yZXFwID0gcmVxcDsKKworCQkJcmV0dXJuIEFTQ19FUlJPUjsKKwkJfQorCisJCWlmICgocmV0ID0KKwkJICAgICBhZHZfZ2V0X3NnbGlzdChib2FyZHAsIHJlcXAsIHNjcCwKKwkJCQkgICAgdXNlX3NnKSkgIT0gQURWX1NVQ0NFU1MpIHsKKwkJCS8qCisJCQkgKiBGcmVlIHRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGJ5IGFkZGluZyBpdCBiYWNrIHRvIHRoZQorCQkJICogYm9hcmQgZnJlZSBsaXN0LgorCQkJICovCisJCQlyZXFwLT5uZXh0X3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwOworCQkJYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CisKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2NudCk7CisJCUFTQ19TVEFUU19BREQoc2NwLT5kZXZpY2UtPmhvc3QsIHNnX2VsZW0sIHVzZV9zZyk7CisJfQorCisJQVNDX0RCR19QUlRfQURWX1NDU0lfUkVRX1EoMiwgc2NzaXFwKTsKKwlBU0NfREJHX1BSVF9DREIoMSwgc2NwLT5jbW5kLCBzY3AtPmNtZF9sZW4pOworCisJKmFkdl9zY3NpcXBwID0gc2NzaXFwOworCisJcmV0dXJuIEFTQ19OT0VSUk9SOwogfQogCiAvKgpAQCAtNjYxMCwxMDggKzU0MjIsMTA5IEBACiAgKiAgICAgIEFEVl9TVUNDRVNTKDEpIC0gU0cgTGlzdCBzdWNjZXNzZnVsbHkgY3JlYXRlZAogICogICAgICBBRFZfRVJST1IoLTEpIC0gU0cgTGlzdCBjcmVhdGlvbiBmYWlsZWQKICAqLwotU1RBVElDIGludAotYWR2X2dldF9zZ2xpc3QoYXNjX2JvYXJkX3QgKmJvYXJkcCwgYWR2X3JlcV90ICpyZXFwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsIGludCB1c2Vfc2cpCitzdGF0aWMgaW50CithZHZfZ2V0X3NnbGlzdChhc2NfYm9hcmRfdCAqYm9hcmRwLCBhZHZfcmVxX3QgKnJlcXAsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKKwkgICAgICAgaW50IHVzZV9zZykKIHsKLSAgICBhZHZfc2dibGtfdCAgICAgICAgICpzZ2Jsa3A7Ci0gICAgQURWX1NDU0lfUkVRX1EgICAgICAqc2NzaXFwOwotICAgIHN0cnVjdCBzY2F0dGVybGlzdCAgKnNscDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHNnX2VsZW1fY250OwotICAgIEFEVl9TR19CTE9DSyAgICAgICAgKnNnX2Jsb2NrLCAqcHJldl9zZ19ibG9jazsKLSAgICBBRFZfUEFERFIgICAgICAgICAgIHNnX2Jsb2NrX3BhZGRyOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKKwlhZHZfc2dibGtfdCAqc2dibGtwOworCUFEVl9TQ1NJX1JFUV9RICpzY3NpcXA7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbHA7CisJaW50IHNnX2VsZW1fY250OworCUFEVl9TR19CTE9DSyAqc2dfYmxvY2ssICpwcmV2X3NnX2Jsb2NrOworCUFEVl9QQUREUiBzZ19ibG9ja19wYWRkcjsKKwlpbnQgaTsKIAotICAgIHNjc2lxcCA9IChBRFZfU0NTSV9SRVFfUSAqKSBBRFZfMzJCQUxJR04oJnJlcXAtPnNjc2lfcmVxX3EpOwotICAgIHNscCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc2NwLT5yZXF1ZXN0X2J1ZmZlcjsKLSAgICBzZ19lbGVtX2NudCA9IHVzZV9zZzsKLSAgICBwcmV2X3NnX2Jsb2NrID0gTlVMTDsKLSAgICByZXFwLT5zZ2Jsa3AgPSBOVUxMOworCXNjc2lxcCA9IChBRFZfU0NTSV9SRVFfUSAqKUFEVl8zMkJBTElHTigmcmVxcC0+c2NzaV9yZXFfcSk7CisJc2xwID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjcC0+cmVxdWVzdF9idWZmZXI7CisJc2dfZWxlbV9jbnQgPSB1c2Vfc2c7CisJcHJldl9zZ19ibG9jayA9IE5VTEw7CisJcmVxcC0+c2dibGtwID0gTlVMTDsKIAotICAgIGRvCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBBbGxvY2F0ZSBhICdhZHZfc2dibGtfdCcgc3RydWN0dXJlIGZyb20gdGhlIGJvYXJkIGZyZWUKLSAgICAgICAgICogbGlzdC4gT25lICdhZHZfc2dibGtfdCcgc3RydWN0dXJlIGhvbGRzIE5PX09GX1NHX1BFUl9CTE9DSwotICAgICAgICAgKiAoMTUpIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChzZ2Jsa3AgPSBib2FyZHAtPmFkdl9zZ2Jsa3ApID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFTQ19EQkcoMSwgImFkdl9nZXRfc2dsaXN0OiBubyBmcmVlIGFkdl9zZ2Jsa190XG4iKTsKLSAgICAgICAgICAgIEFTQ19TVEFUUyhzY3AtPmRldmljZS0+aG9zdCwgYWR2X2J1aWxkX25vc2cpOworCWRvIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSAnYWR2X3NnYmxrX3QnIHN0cnVjdHVyZSBmcm9tIHRoZSBib2FyZCBmcmVlCisJCSAqIGxpc3QuIE9uZSAnYWR2X3NnYmxrX3QnIHN0cnVjdHVyZSBob2xkcyBOT19PRl9TR19QRVJfQkxPQ0sKKwkJICogKDE1KSBzY2F0dGVyLWdhdGhlciBlbGVtZW50cy4KKwkJICovCisJCWlmICgoc2dibGtwID0gYm9hcmRwLT5hZHZfc2dibGtwKSA9PSBOVUxMKSB7CisJCQlBU0NfREJHKDEsICJhZHZfZ2V0X3NnbGlzdDogbm8gZnJlZSBhZHZfc2dibGtfdFxuIik7CisJCQlBU0NfU1RBVFMoc2NwLT5kZXZpY2UtPmhvc3QsIGFkdl9idWlsZF9ub3NnKTsKIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFsbG9jYXRpb24gZmFpbGVkLiBGcmVlICdhZHZfc2dibGtfdCcgc3RydWN0dXJlcyBhbHJlYWR5Ci0gICAgICAgICAgICAgKiBhbGxvY2F0ZWQgZm9yIHRoZSByZXF1ZXN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoKHNnYmxrcCA9IHJlcXAtPnNnYmxrcCkgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBSZW1vdmUgJ3NnYmxrcCcgZnJvbSB0aGUgcmVxdWVzdCBsaXN0LiAqLwotICAgICAgICAgICAgICAgIHJlcXAtPnNnYmxrcCA9IHNnYmxrcC0+bmV4dF9zZ2Jsa3A7CisJCQkvKgorCQkJICogQWxsb2NhdGlvbiBmYWlsZWQuIEZyZWUgJ2Fkdl9zZ2Jsa190JyBzdHJ1Y3R1cmVzIGFscmVhZHkKKwkJCSAqIGFsbG9jYXRlZCBmb3IgdGhlIHJlcXVlc3QuCisJCQkgKi8KKwkJCXdoaWxlICgoc2dibGtwID0gcmVxcC0+c2dibGtwKSAhPSBOVUxMKSB7CisJCQkJLyogUmVtb3ZlICdzZ2Jsa3AnIGZyb20gdGhlIHJlcXVlc3QgbGlzdC4gKi8KKwkJCQlyZXFwLT5zZ2Jsa3AgPSBzZ2Jsa3AtPm5leHRfc2dibGtwOwogCi0gICAgICAgICAgICAgICAgLyogQWRkICdzZ2Jsa3AnIHRvIHRoZSBib2FyZCBmcmVlIGxpc3QuICovCi0gICAgICAgICAgICAgICAgc2dibGtwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKLSAgICAgICAgICAgICAgICBib2FyZHAtPmFkdl9zZ2Jsa3AgPSBzZ2Jsa3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQVNDX0JVU1k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBDb21wbGV0ZSAnYWR2X3NnYmxrX3QnIGJvYXJkIGFsbG9jYXRpb24uICovCi0gICAgICAgICAgICBib2FyZHAtPmFkdl9zZ2Jsa3AgPSBzZ2Jsa3AtPm5leHRfc2dibGtwOwotICAgICAgICAgICAgc2dibGtwLT5uZXh0X3NnYmxrcCA9IE5VTEw7CisJCQkJLyogQWRkICdzZ2Jsa3AnIHRvIHRoZSBib2FyZCBmcmVlIGxpc3QuICovCisJCQkJc2dibGtwLT5uZXh0X3NnYmxrcCA9IGJvYXJkcC0+YWR2X3NnYmxrcDsKKwkJCQlib2FyZHAtPmFkdl9zZ2Jsa3AgPSBzZ2Jsa3A7CisJCQl9CisJCQlyZXR1cm4gQVNDX0JVU1k7CisJCX0gZWxzZSB7CisJCQkvKiBDb21wbGV0ZSAnYWR2X3NnYmxrX3QnIGJvYXJkIGFsbG9jYXRpb24uICovCisJCQlib2FyZHAtPmFkdl9zZ2Jsa3AgPSBzZ2Jsa3AtPm5leHRfc2dibGtwOworCQkJc2dibGtwLT5uZXh0X3NnYmxrcCA9IE5VTEw7CiAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBHZXQgOCBieXRlIGFsaWduZWQgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIGZvcgotICAgICAgICAgICAgICogdGhlIGFsbG9jYXRlZCBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzZ19ibG9jayA9IChBRFZfU0dfQkxPQ0sgKikgQURWXzhCQUxJR04oJnNnYmxrcC0+c2dfYmxvY2spOwotICAgICAgICAgICAgc2dfYmxvY2tfcGFkZHIgPSB2aXJ0X3RvX2J1cyhzZ19ibG9jayk7CisJCQkvKgorCQkJICogR2V0IDggYnl0ZSBhbGlnbmVkIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBmb3IKKwkJCSAqIHRoZSBhbGxvY2F0ZWQgQURWX1NHX0JMT0NLIHN0cnVjdHVyZS4KKwkJCSAqLworCQkJc2dfYmxvY2sgPQorCQkJICAgIChBRFZfU0dfQkxPQ0sgKilBRFZfOEJBTElHTigmc2dibGtwLT5zZ19ibG9jayk7CisJCQlzZ19ibG9ja19wYWRkciA9IHZpcnRfdG9fYnVzKHNnX2Jsb2NrKTsKIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0ICdhZHZfc2dibGtfdCcgZm9yIHRoZSByZXF1ZXN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocmVxcC0+c2dibGtwID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUmVxdWVzdCdzIGZpcnN0IHNjYXR0ZXItZ2F0aGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgIHJlcXAtPnNnYmxrcCA9IHNnYmxrcDsKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCAnYWR2X3NnYmxrX3QnIGZvciB0aGUgcmVxdWVzdC4KKwkJCSAqLworCQkJaWYgKHJlcXAtPnNnYmxrcCA9PSBOVUxMKSB7CisJCQkJLyogUmVxdWVzdCdzIGZpcnN0IHNjYXR0ZXItZ2F0aGVyIGJsb2NrLiAqLworCQkJCXJlcXAtPnNnYmxrcCA9IHNnYmxrcDsKIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2V0IEFEVl9TQ1NJX1JFUV9UIEFEVl9TR19CTE9DSyB2aXJ0dWFsIGFuZCBwaHlzaWNhbAotICAgICAgICAgICAgICAgICAqIGFkZHJlc3MgcG9pbnRlcnMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2NzaXFwLT5zZ19saXN0X3B0ciA9IHNnX2Jsb2NrOwotICAgICAgICAgICAgICAgIHNjc2lxcC0+c2dfcmVhbF9hZGRyID0gY3B1X3RvX2xlMzIoc2dfYmxvY2tfcGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUmVxdWVzdCdzIHNlY29uZCBvciBsYXRlciBzY2F0dGVyLWdhdGhlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICBzZ2Jsa3AtPm5leHRfc2dibGtwID0gcmVxcC0+c2dibGtwOwotICAgICAgICAgICAgICAgIHJlcXAtPnNnYmxrcCA9IHNnYmxrcDsKKwkJCQkvKgorCQkJCSAqIFNldCBBRFZfU0NTSV9SRVFfVCBBRFZfU0dfQkxPQ0sgdmlydHVhbCBhbmQgcGh5c2ljYWwKKwkJCQkgKiBhZGRyZXNzIHBvaW50ZXJzLgorCQkJCSAqLworCQkJCXNjc2lxcC0+c2dfbGlzdF9wdHIgPSBzZ19ibG9jazsKKwkJCQlzY3NpcXAtPnNnX3JlYWxfYWRkciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNnX2Jsb2NrX3BhZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogUmVxdWVzdCdzIHNlY29uZCBvciBsYXRlciBzY2F0dGVyLWdhdGhlciBibG9jay4gKi8KKwkJCQlzZ2Jsa3AtPm5leHRfc2dibGtwID0gcmVxcC0+c2dibGtwOworCQkJCXJlcXAtPnNnYmxrcCA9IHNnYmxrcDsKIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogUG9pbnQgdGhlIHByZXZpb3VzIEFEVl9TR19CTE9DSyBzdHJ1Y3R1cmUgdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgbmV3bHkgYWxsb2NhdGVkIEFEVl9TR19CTE9DSyBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQVNDX0FTU0VSVChwcmV2X3NnX2Jsb2NrICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIHByZXZfc2dfYmxvY2stPnNnX3B0ciA9IGNwdV90b19sZTMyKHNnX2Jsb2NrX3BhZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQkJCS8qCisJCQkJICogUG9pbnQgdGhlIHByZXZpb3VzIEFEVl9TR19CTE9DSyBzdHJ1Y3R1cmUgdG8KKwkJCQkgKiB0aGUgbmV3bHkgYWxsb2NhdGVkIEFEVl9TR19CTE9DSyBzdHJ1Y3R1cmUuCisJCQkJICovCisJCQkJQVNDX0FTU0VSVChwcmV2X3NnX2Jsb2NrICE9IE5VTEwpOworCQkJCXByZXZfc2dfYmxvY2stPnNnX3B0ciA9CisJCQkJICAgIGNwdV90b19sZTMyKHNnX2Jsb2NrX3BhZGRyKTsKKwkJCX0KKwkJfQogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBOT19PRl9TR19QRVJfQkxPQ0s7IGkrKykKLSAgICAgICAgewotCSAgICBzZ19ibG9jay0+c2dfbGlzdFtpXS5zZ19hZGRyID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2xwKSk7Ci0JICAgIHNnX2Jsb2NrLT5zZ19saXN0W2ldLnNnX2NvdW50ID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzbHApKTsKLQkgICAgQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfeGZlciwgQVNDX0NFSUxJTkcoc2dfZG1hX2xlbihzbHApLCA1MTIpKTsKKwkJZm9yIChpID0gMDsgaSA8IE5PX09GX1NHX1BFUl9CTE9DSzsgaSsrKSB7CisJCQlzZ19ibG9jay0+c2dfbGlzdFtpXS5zZ19hZGRyID0KKwkJCSAgICBjcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcyhzbHApKTsKKwkJCXNnX2Jsb2NrLT5zZ19saXN0W2ldLnNnX2NvdW50ID0KKwkJCSAgICBjcHVfdG9fbGUzMihzZ19kbWFfbGVuKHNscCkpOworCQkJQVNDX1NUQVRTX0FERChzY3AtPmRldmljZS0+aG9zdCwgc2dfeGZlciwKKwkJCQkgICAgICBBU0NfQ0VJTElORyhzZ19kbWFfbGVuKHNscCksIDUxMikpOwogCi0gICAgICAgICAgICBpZiAoLS1zZ19lbGVtX2NudCA9PSAwKQotICAgICAgICAgICAgeyAgIC8qIExhc3QgQURWX1NHX0JMT0NLIGFuZCBzY2F0dGVyLWdhdGhlciBlbnRyeS4gKi8KLSAgICAgICAgICAgICAgICBzZ19ibG9jay0+c2dfY250ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgc2dfYmxvY2stPnNnX3B0ciA9IDBMOyAgICAvKiBMYXN0IEFEVl9TR19CTE9DSyBpbiBsaXN0LiAqLwotICAgICAgICAgICAgICAgIHJldHVybiBBRFZfU1VDQ0VTUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNscCsrOwotICAgICAgICB9Ci0gICAgICAgIHNnX2Jsb2NrLT5zZ19jbnQgPSBOT19PRl9TR19QRVJfQkxPQ0s7Ci0gICAgICAgIHByZXZfc2dfYmxvY2sgPSBzZ19ibG9jazsKLSAgICB9Ci0gICAgd2hpbGUgKDEpOwotICAgIC8qIE5PVFJFQUNIRUQgKi8KKwkJCWlmICgtLXNnX2VsZW1fY250ID09IDApIHsJLyogTGFzdCBBRFZfU0dfQkxPQ0sgYW5kIHNjYXR0ZXItZ2F0aGVyIGVudHJ5LiAqLworCQkJCXNnX2Jsb2NrLT5zZ19jbnQgPSBpICsgMTsKKwkJCQlzZ19ibG9jay0+c2dfcHRyID0gMEw7CS8qIExhc3QgQURWX1NHX0JMT0NLIGluIGxpc3QuICovCisJCQkJcmV0dXJuIEFEVl9TVUNDRVNTOworCQkJfQorCQkJc2xwKys7CisJCX0KKwkJc2dfYmxvY2stPnNnX2NudCA9IE5PX09GX1NHX1BFUl9CTE9DSzsKKwkJcHJldl9zZ19ibG9jayA9IHNnX2Jsb2NrOworCX0KKwl3aGlsZSAoMSk7CisJLyogTk9UUkVBQ0hFRCAqLwogfQogCiAvKgpAQCAtNjcxOSwxNjUgKzU1MzIsMTcxIEBACiAgKgogICogSW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgTmFycm93IFNDU0kgQXNjIExpYnJhcnkuCiAgKi8KLVNUQVRJQyB2b2lkCi1hc2NfaXNyX2NhbGxiYWNrKEFTQ19EVkNfVkFSICphc2NfZHZjX3ZhcnAsIEFTQ19RRE9ORV9JTkZPICpxZG9uZXApCitzdGF0aWMgdm9pZCBhc2NfaXNyX2NhbGxiYWNrKEFTQ19EVkNfVkFSICphc2NfZHZjX3ZhcnAsIEFTQ19RRE9ORV9JTkZPICpxZG9uZXApCiB7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOwotICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpzY3A7Ci0gICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlpbnQgaTsKIAotICAgIEFTQ19EQkcyKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBhc2NfZHZjX3ZhcnAgMHglbHgsIHFkb25lcCAweCVseFxuIiwKLSAgICAgICAgKHVsb25nKSBhc2NfZHZjX3ZhcnAsICh1bG9uZykgcWRvbmVwKTsKLSAgICBBU0NfREJHX1BSVF9BU0NfUURPTkVfSU5GTygyLCBxZG9uZXApOworCUFTQ19EQkcyKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBhc2NfZHZjX3ZhcnAgMHglbHgsIHFkb25lcCAweCVseFxuIiwKKwkJICh1bG9uZylhc2NfZHZjX3ZhcnAsICh1bG9uZylxZG9uZXApOworCUFTQ19EQkdfUFJUX0FTQ19RRE9ORV9JTkZPKDIsIHFkb25lcCk7CiAKLSAgICAvKgotICAgICAqIEdldCB0aGUgc3RydWN0IHNjc2lfY21uZCBzdHJ1Y3R1cmUgYW5kIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgICAqIGNvbW1hbmQgdGhhdCBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICovCi0gICAgc2NwID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgQVNDX1UzMl9UT19WQUREUihxZG9uZXAtPmQyLnNyYl9wdHIpOwotICAgIEFTQ19EQkcxKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBzY3AgMHglbHhcbiIsICh1bG9uZykgc2NwKTsKKwkvKgorCSAqIEdldCB0aGUgc3RydWN0IHNjc2lfY21uZCBzdHJ1Y3R1cmUgYW5kIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgZm9yIHRoZQorCSAqIGNvbW1hbmQgdGhhdCBoYXMgYmVlbiBjb21wbGV0ZWQuCisJICovCisJc2NwID0gKHN0cnVjdCBzY3NpX2NtbmQgKilBU0NfVTMyX1RPX1ZBRERSKHFkb25lcC0+ZDIuc3JiX3B0cik7CisJQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IHNjcCAweCVseFxuIiwgKHVsb25nKXNjcCk7CiAKLSAgICBpZiAoc2NwID09IE5VTEwpIHsKLSAgICAgICAgQVNDX1BSSU5UKCJhc2NfaXNyX2NhbGxiYWNrOiBzY3AgaXMgTlVMTFxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKKwlpZiAoc2NwID09IE5VTEwpIHsKKwkJQVNDX1BSSU5UKCJhc2NfaXNyX2NhbGxiYWNrOiBzY3AgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisJQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKIAotICAgIC8qCi0gICAgICogSWYgdGhlIHJlcXVlc3QncyBob3N0IHBvaW50ZXIgaXMgbm90IHZhbGlkLCBkaXNwbGF5IGEKLSAgICAgKiBtZXNzYWdlIGFuZCByZXR1cm4uCi0gICAgICovCi0gICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChhc2NfaG9zdFtpXSA9PSBzaHApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpID09IGFzY19ib2FyZF9jb3VudCkgewotICAgICAgICBBU0NfUFJJTlQyKAotICAgICAgICAgICAgImFzY19pc3JfY2FsbGJhY2s6IHNjcCAweCVseCBoYXMgYmFkIGhvc3QgcG9pbnRlciwgaG9zdCAweCVseFxuIiwKLSAgICAgICAgICAgICh1bG9uZykgc2NwLCAodWxvbmcpIHNocCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdCdzIGhvc3QgcG9pbnRlciBpcyBub3QgdmFsaWQsIGRpc3BsYXkgYQorCSAqIG1lc3NhZ2UgYW5kIHJldHVybi4KKwkgKi8KKwlzaG9zdCA9IHNjcC0+ZGV2aWNlLT5ob3N0OworCWZvciAoaSA9IDA7IGkgPCBhc2NfYm9hcmRfY291bnQ7IGkrKykgeworCQlpZiAoYXNjX2hvc3RbaV0gPT0gc2hvc3QpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IGFzY19ib2FyZF9jb3VudCkgeworCQlBU0NfUFJJTlQyCisJCSAgICAoImFzY19pc3JfY2FsbGJhY2s6IHNjcCAweCVseCBoYXMgYmFkIGhvc3QgcG9pbnRlciwgaG9zdCAweCVseFxuIiwKKwkJICAgICAodWxvbmcpc2NwLCAodWxvbmcpc2hvc3QpOworCQlyZXR1cm47CisJfQogCi0gICAgQVNDX1NUQVRTKHNocCwgY2FsbGJhY2spOwotICAgIEFTQ19EQkcxKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBzaHAgMHglbHhcbiIsICh1bG9uZykgc2hwKTsKKwlBU0NfU1RBVFMoc2hvc3QsIGNhbGxiYWNrKTsKKwlBU0NfREJHMSgxLCAiYXNjX2lzcl9jYWxsYmFjazogc2hvc3QgMHglbHhcbiIsICh1bG9uZylzaG9zdCk7CiAKLSAgICAvKgotICAgICAqIElmIHRoZSByZXF1ZXN0IGlzbid0IGZvdW5kIG9uIHRoZSBhY3RpdmUgcXVldWUsIGl0IG1heQotICAgICAqIGhhdmUgYmVlbiByZW1vdmVkIHRvIGhhbmRsZSBhIHJlc2V0IHJlcXVlc3QuCi0gICAgICogRGlzcGxheSBhIG1lc3NhZ2UgYW5kIHJldHVybi4KLSAgICAgKi8KLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7Ci0gICAgQVNDX0FTU0VSVChhc2NfZHZjX3ZhcnAgPT0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhcik7Ci0gICAgaWYgKGFzY19ybXF1ZXVlKCZib2FyZHAtPmFjdGl2ZSwgc2NwKSA9PSBBU0NfRkFMU0UpIHsKLSAgICAgICAgQVNDX1BSSU5UMigKLSAgICAgICAgICAgICJhc2NfaXNyX2NhbGxiYWNrOiBib2FyZCAlZDogc2NwIDB4JWx4IG5vdCBvbiBhY3RpdmUgcXVldWVcbiIsCi0gICAgICAgICAgICBib2FyZHAtPmlkLCAodWxvbmcpIHNjcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdCBpc24ndCBmb3VuZCBvbiB0aGUgYWN0aXZlIHF1ZXVlLCBpdCBtYXkKKwkgKiBoYXZlIGJlZW4gcmVtb3ZlZCB0byBoYW5kbGUgYSByZXNldCByZXF1ZXN0LgorCSAqIERpc3BsYXkgYSBtZXNzYWdlIGFuZCByZXR1cm4uCisJICovCisJYm9hcmRwID0gQVNDX0JPQVJEUChzaG9zdCk7CisJQVNDX0FTU0VSVChhc2NfZHZjX3ZhcnAgPT0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3Zhcik7CisJaWYgKGFzY19ybXF1ZXVlKCZib2FyZHAtPmFjdGl2ZSwgc2NwKSA9PSBBU0NfRkFMU0UpIHsKKwkJQVNDX1BSSU5UMgorCQkgICAgKCJhc2NfaXNyX2NhbGxiYWNrOiBib2FyZCAlZDogc2NwIDB4JWx4IG5vdCBvbiBhY3RpdmUgcXVldWVcbiIsCisJCSAgICAgYm9hcmRwLT5pZCwgKHVsb25nKXNjcCk7CisJCXJldHVybjsKKwl9CiAKLSAgICAvKgotICAgICAqICdxZG9uZXAnIGNvbnRhaW5zIHRoZSBjb21tYW5kJ3MgZW5kaW5nIHN0YXR1cy4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKHFkb25lcC0+ZDMuZG9uZV9zdGF0KSB7Ci0gICAgY2FzZSBRRF9OT19FUlJPUjoKLSAgICAgICAgQVNDX0RCRygyLCAiYXNjX2lzcl9jYWxsYmFjazogUURfTk9fRVJST1JcbiIpOwotICAgICAgICBzY3AtPnJlc3VsdCA9IDA7CisJLyoKKwkgKiAncWRvbmVwJyBjb250YWlucyB0aGUgY29tbWFuZCdzIGVuZGluZyBzdGF0dXMuCisJICovCisJc3dpdGNoIChxZG9uZXAtPmQzLmRvbmVfc3RhdCkgeworCWNhc2UgUURfTk9fRVJST1I6CisJCUFTQ19EQkcoMiwgImFzY19pc3JfY2FsbGJhY2s6IFFEX05PX0VSUk9SXG4iKTsKKwkJc2NwLT5yZXN1bHQgPSAwOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIElmIGFuIElOUVVJUlkgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGVuIGNhbGwKLSAgICAgICAgICogdGhlIEFzY0lucXVpcnlIYW5kbGluZygpIGZ1bmN0aW9uIHRvIHNldC11cCB0aGUgZGV2aWNlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNjcC0+Y21uZFswXSA9PSBJTlFVSVJZICYmIHNjcC0+ZGV2aWNlLT5sdW4gPT0gMCAmJgotICAgICAgICAgICAgKHNjcC0+cmVxdWVzdF9idWZmbGVuIC0gcWRvbmVwLT5yZW1haW5fYnl0ZXMpID49IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzY0lucXVpcnlIYW5kbGluZyhhc2NfZHZjX3ZhcnAsIHNjcC0+ZGV2aWNlLT5pZCAmIDB4NywKLSAgICAgICAgICAgICAgICAoQVNDX1NDU0lfSU5RVUlSWSAqKSBzY3AtPnJlcXVlc3RfYnVmZmVyKTsKLSAgICAgICAgfQorCQkvKgorCQkgKiBJZiBhbiBJTlFVSVJZIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgdGhlbiBjYWxsCisJCSAqIHRoZSBBc2NJbnF1aXJ5SGFuZGxpbmcoKSBmdW5jdGlvbiB0byBzZXQtdXAgdGhlIGRldmljZS4KKwkJICovCisJCWlmIChzY3AtPmNtbmRbMF0gPT0gSU5RVUlSWSAmJiBzY3AtPmRldmljZS0+bHVuID09IDAgJiYKKwkJICAgIChzY3AtPnJlcXVlc3RfYnVmZmxlbiAtIHFkb25lcC0+cmVtYWluX2J5dGVzKSA+PSA4KSB7CisJCQlBc2NJbnF1aXJ5SGFuZGxpbmcoYXNjX2R2Y192YXJwLCBzY3AtPmRldmljZS0+aWQgJiAweDcsCisJCQkJCSAgIChBU0NfU0NTSV9JTlFVSVJZICopc2NwLT4KKwkJCQkJICAgcmVxdWVzdF9idWZmZXIpOworCQl9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2sgZm9yIGFuIHVuZGVycnVuIGNvbmRpdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhlcmUgd2FzIG5vIGVycm9yIGFuZCBhbiB1bmRlcnJ1biBjb25kaXRpb24sIHRoZW4KLSAgICAgICAgICogdGhlbiByZXR1cm4gdGhlIG51bWJlciBvZiB1bmRlcnJ1biBieXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbiAhPSAwICYmIHFkb25lcC0+cmVtYWluX2J5dGVzICE9IDAgJiYKLSAgICAgICAgICAgIHFkb25lcC0+cmVtYWluX2J5dGVzIDw9IHNjcC0+cmVxdWVzdF9idWZmbGVuKSB7Ci0gICAgICAgICAgICBBU0NfREJHMSgxLCAiYXNjX2lzcl9jYWxsYmFjazogdW5kZXJydW4gY29uZGl0aW9uICV1IGJ5dGVzXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkKSBxZG9uZXAtPnJlbWFpbl9ieXRlcyk7Ci0gICAgICAgICAgICBzY3AtPnJlc2lkID0gcWRvbmVwLT5yZW1haW5fYnl0ZXM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisJCS8qCisJCSAqIENoZWNrIGZvciBhbiB1bmRlcnJ1biBjb25kaXRpb24uCisJCSAqCisJCSAqIElmIHRoZXJlIHdhcyBubyBlcnJvciBhbmQgYW4gdW5kZXJydW4gY29uZGl0aW9uLCB0aGVuCisJCSAqIHRoZW4gcmV0dXJuIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gYnl0ZXMuCisJCSAqLworCQlpZiAoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCAmJiBxZG9uZXAtPnJlbWFpbl9ieXRlcyAhPSAwICYmCisJCSAgICBxZG9uZXAtPnJlbWFpbl9ieXRlcyA8PSBzY3AtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJQVNDX0RCRzEoMSwKKwkJCQkgImFzY19pc3JfY2FsbGJhY2s6IHVuZGVycnVuIGNvbmRpdGlvbiAldSBieXRlc1xuIiwKKwkJCQkgKHVuc2lnbmVkKXFkb25lcC0+cmVtYWluX2J5dGVzKTsKKwkJCXNjcC0+cmVzaWQgPSBxZG9uZXAtPnJlbWFpbl9ieXRlczsKKwkJfQorCQlicmVhazsKIAotICAgIGNhc2UgUURfV0lUSF9FUlJPUjoKLSAgICAgICAgQVNDX0RCRygyLCAiYXNjX2lzcl9jYWxsYmFjazogUURfV0lUSF9FUlJPUlxuIik7Ci0gICAgICAgIHN3aXRjaCAocWRvbmVwLT5kMy5ob3N0X3N0YXQpIHsKLSAgICAgICAgY2FzZSBRSFNUQV9OT19FUlJPUjoKLSAgICAgICAgICAgIGlmIChxZG9uZXAtPmQzLnNjc2lfc3RhdCA9PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pIHsKLSAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhc2NfaXNyX2NhbGxiYWNrOiBTQU1fU1RBVF9DSEVDS19DT05ESVRJT05cbiIpOwotICAgICAgICAgICAgICAgIEFTQ19EQkdfUFJUX1NFTlNFKDIsIHNjcC0+c2Vuc2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NwLT5zZW5zZV9idWZmZXIpKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE5vdGU6IFRoZSAnc3RhdHVzX2J5dGUoKScgbWFjcm8gdXNlZCBieSB0YXJnZXQgZHJpdmVycwotICAgICAgICAgICAgICAgICAqIGRlZmluZWQgaW4gc2NzaS5oIHNoaWZ0cyB0aGUgc3RhdHVzIGJ5dGUgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgKiBob3N0IGRyaXZlcnMgcmlnaHQgYnkgMSBiaXQuIFRoaXMgaXMgd2h5IHRhcmdldCBkcml2ZXJzCi0gICAgICAgICAgICAgICAgICogYWxzbyB1c2UgcmlnaHQgc2hpZnRlZCBzdGF0dXMgYnl0ZSBkZWZpbml0aW9ucy4gRm9yCi0gICAgICAgICAgICAgICAgICogaW5zdGFuY2UgdGFyZ2V0IGRyaXZlcnMgdXNlIENIRUNLX0NPTkRJVElPTiwgZGVmaW5lZCB0bwotICAgICAgICAgICAgICAgICAqIDB4MSwgaW5zdGVhZCBvZiB0aGUgU0NTSSBkZWZpbmVkIGNoZWNrIGNvbmRpdGlvbiB2YWx1ZQotICAgICAgICAgICAgICAgICAqIG9mIDB4Mi4gSG9zdCBkcml2ZXJzIGFyZSBzdXBwb3NlZCB0byByZXR1cm4gdGhlIHN0YXR1cwotICAgICAgICAgICAgICAgICAqIGJ5dGUgYXMgaXQgaXMgZGVmaW5lZCBieSBTQ1NJLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gRFJJVkVSX0JZVEUoRFJJVkVSX1NFTlNFKSB8Ci0gICAgICAgICAgICAgICAgICAgIFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBTVEFUVVNfQllURShxZG9uZXAtPmQzLnNjc2lfc3RhdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKwljYXNlIFFEX1dJVEhfRVJST1I6CisJCUFTQ19EQkcoMiwgImFzY19pc3JfY2FsbGJhY2s6IFFEX1dJVEhfRVJST1JcbiIpOworCQlzd2l0Y2ggKHFkb25lcC0+ZDMuaG9zdF9zdGF0KSB7CisJCWNhc2UgUUhTVEFfTk9fRVJST1I6CisJCQlpZiAocWRvbmVwLT5kMy5zY3NpX3N0YXQgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQkJQVNDX0RCRygyLAorCQkJCQkiYXNjX2lzcl9jYWxsYmFjazogU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OXG4iKTsKKwkJCQlBU0NfREJHX1BSVF9TRU5TRSgyLCBzY3AtPnNlbnNlX2J1ZmZlciwKKwkJCQkJCSAgc2l6ZW9mKHNjcC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJLyoKKwkJCQkgKiBOb3RlOiBUaGUgJ3N0YXR1c19ieXRlKCknIG1hY3JvIHVzZWQgYnkgdGFyZ2V0IGRyaXZlcnMKKwkJCQkgKiBkZWZpbmVkIGluIHNjc2kuaCBzaGlmdHMgdGhlIHN0YXR1cyBieXRlIHJldHVybmVkIGJ5CisJCQkJICogaG9zdCBkcml2ZXJzIHJpZ2h0IGJ5IDEgYml0LiBUaGlzIGlzIHdoeSB0YXJnZXQgZHJpdmVycworCQkJCSAqIGFsc28gdXNlIHJpZ2h0IHNoaWZ0ZWQgc3RhdHVzIGJ5dGUgZGVmaW5pdGlvbnMuIEZvcgorCQkJCSAqIGluc3RhbmNlIHRhcmdldCBkcml2ZXJzIHVzZSBDSEVDS19DT05ESVRJT04sIGRlZmluZWQgdG8KKwkJCQkgKiAweDEsIGluc3RlYWQgb2YgdGhlIFNDU0kgZGVmaW5lZCBjaGVjayBjb25kaXRpb24gdmFsdWUKKwkJCQkgKiBvZiAweDIuIEhvc3QgZHJpdmVycyBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBzdGF0dXMKKwkJCQkgKiBieXRlIGFzIGl0IGlzIGRlZmluZWQgYnkgU0NTSS4KKwkJCQkgKi8KKwkJCQlzY3AtPnJlc3VsdCA9IERSSVZFUl9CWVRFKERSSVZFUl9TRU5TRSkgfAorCQkJCSAgICBTVEFUVVNfQllURShxZG9uZXAtPmQzLnNjc2lfc3RhdCk7CisJCQl9IGVsc2UgeworCQkJCXNjcC0+cmVzdWx0ID0gU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIFFIU1RBIGVycm9yIG9jY3VycmVkICovCi0gICAgICAgICAgICBBU0NfREJHMSgxLCAiYXNjX2lzcl9jYWxsYmFjazogaG9zdF9zdGF0IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgcWRvbmVwLT5kMy5ob3N0X3N0YXQpOwotICAgICAgICAgICAgc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0JBRF9UQVJHRVQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBRSFNUQSBlcnJvciBvY2N1cnJlZCAqLworCQkJQVNDX0RCRzEoMSwgImFzY19pc3JfY2FsbGJhY2s6IGhvc3Rfc3RhdCAweCV4XG4iLAorCQkJCSBxZG9uZXAtPmQzLmhvc3Rfc3RhdCk7CisJCQlzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfQkFEX1RBUkdFVCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKIAotICAgIGNhc2UgUURfQUJPUlRFRF9CWV9IT1NUOgotICAgICAgICBBU0NfREJHKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBRRF9BQk9SVEVEX0JZX0hPU1RcbiIpOwotICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfQUJPUlQpIHwgTVNHX0JZVEUocWRvbmVwLT5kMy5zY3NpX21zZykgfAotICAgICAgICAgICAgICAgIFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKLSAgICAgICAgYnJlYWs7CisJY2FzZSBRRF9BQk9SVEVEX0JZX0hPU1Q6CisJCUFTQ19EQkcoMSwgImFzY19pc3JfY2FsbGJhY2s6IFFEX0FCT1JURURfQllfSE9TVFxuIik7CisJCXNjcC0+cmVzdWx0ID0KKwkJICAgIEhPU1RfQllURShESURfQUJPUlQpIHwgTVNHX0JZVEUocWRvbmVwLT5kMy4KKwkJCQkJCSAgICBzY3NpX21zZykgfAorCQkgICAgU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworCQlicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTQ19EQkcxKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXQgMHgleFxuIiwgcWRvbmVwLT5kMy5kb25lX3N0YXQpOwotICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfRVJST1IpIHwgTVNHX0JZVEUocWRvbmVwLT5kMy5zY3NpX21zZykgfAotICAgICAgICAgICAgICAgIFNUQVRVU19CWVRFKHFkb25lcC0+ZDMuc2NzaV9zdGF0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCWRlZmF1bHQ6CisJCUFTQ19EQkcxKDEsICJhc2NfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXQgMHgleFxuIiwKKwkJCSBxZG9uZXAtPmQzLmRvbmVfc3RhdCk7CisJCXNjcC0+cmVzdWx0ID0KKwkJICAgIEhPU1RfQllURShESURfRVJST1IpIHwgTVNHX0JZVEUocWRvbmVwLT5kMy4KKwkJCQkJCSAgICBzY3NpX21zZykgfAorCQkgICAgU1RBVFVTX0JZVEUocWRvbmVwLT5kMy5zY3NpX3N0YXQpOworCQlicmVhazsKKwl9CiAKLSAgICAvKgotICAgICAqIElmIHRoZSAnaW5pdF90aWRtYXNrJyBiaXQgaXNuJ3QgYWxyZWFkeSBzZXQgZm9yIHRoZSB0YXJnZXQgYW5kIHRoZQotICAgICAqIGN1cnJlbnQgcmVxdWVzdCBmaW5pc2hlZCBub3JtYWxseSwgdGhlbiBzZXQgdGhlIGJpdCBmb3IgdGhlIHRhcmdldAotICAgICAqIHRvIGluZGljYXRlIHRoYXQgYSBkZXZpY2UgaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBpZiAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHNjcC0+ZGV2aWNlLT5pZCkpID09IDAgJiYKLSAgICAgICAgcWRvbmVwLT5kMy5kb25lX3N0YXQgPT0gUURfTk9fRVJST1IgJiYKLSAgICAgICAgcWRvbmVwLT5kMy5ob3N0X3N0YXQgPT0gUUhTVEFfTk9fRVJST1IpIHsKLSAgICAgICAgYm9hcmRwLT5pbml0X3RpZG1hc2sgfD0gQURWX1RJRF9UT19USURNQVNLKHNjcC0+ZGV2aWNlLT5pZCk7Ci0gICAgfQorCS8qCisJICogSWYgdGhlICdpbml0X3RpZG1hc2snIGJpdCBpc24ndCBhbHJlYWR5IHNldCBmb3IgdGhlIHRhcmdldCBhbmQgdGhlCisJICogY3VycmVudCByZXF1ZXN0IGZpbmlzaGVkIG5vcm1hbGx5LCB0aGVuIHNldCB0aGUgYml0IGZvciB0aGUgdGFyZ2V0CisJICogdG8gaW5kaWNhdGUgdGhhdCBhIGRldmljZSBpcyBwcmVzZW50LgorCSAqLworCWlmICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soc2NwLT5kZXZpY2UtPmlkKSkgPT0gMCAmJgorCSAgICBxZG9uZXAtPmQzLmRvbmVfc3RhdCA9PSBRRF9OT19FUlJPUiAmJgorCSAgICBxZG9uZXAtPmQzLmhvc3Rfc3RhdCA9PSBRSFNUQV9OT19FUlJPUikgeworCQlib2FyZHAtPmluaXRfdGlkbWFzayB8PSBBRFZfVElEX1RPX1RJRE1BU0soc2NwLT5kZXZpY2UtPmlkKTsKKwl9CiAKLSAgICAvKgotICAgICAqIEJlY2F1c2UgaW50ZXJydXB0cyBtYXkgYmUgZW5hYmxlZCBieSB0aGUgJ3N0cnVjdCBzY3NpX2NtbmQnIGRvbmUKLSAgICAgKiBmdW5jdGlvbiwgYWRkIHRoZSBjb21tYW5kIHRvIHRoZSBlbmQgb2YgdGhlIGJvYXJkJ3MgZG9uZSBxdWV1ZS4KLSAgICAgKiBUaGUgZG9uZSBmdW5jdGlvbiBmb3IgdGhlIGNvbW1hbmQgd2lsbCBiZSBjYWxsZWQgZnJvbQotICAgICAqIGFkdmFuc3lzX2ludGVycnVwdCgpLgotICAgICAqLwotICAgIGFzY19lbnF1ZXVlKCZib2FyZHAtPmRvbmUsIHNjcCwgQVNDX0JBQ0spOworCS8qCisJICogQmVjYXVzZSBpbnRlcnJ1cHRzIG1heSBiZSBlbmFibGVkIGJ5IHRoZSAnc3RydWN0IHNjc2lfY21uZCcgZG9uZQorCSAqIGZ1bmN0aW9uLCBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgYm9hcmQncyBkb25lIHF1ZXVlLgorCSAqIFRoZSBkb25lIGZ1bmN0aW9uIGZvciB0aGUgY29tbWFuZCB3aWxsIGJlIGNhbGxlZCBmcm9tCisJICogYWR2YW5zeXNfaW50ZXJydXB0KCkuCisJICovCisJYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CiAKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiAvKgpAQCAtNjg4NSwyMzggKzU3MDQsMjQwIEBACiAgKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBXaWRlIFNDU0kgQWR2IExpYnJhcnkuCiAgKi8KLVNUQVRJQyB2b2lkCi1hZHZfaXNyX2NhbGxiYWNrKEFEVl9EVkNfVkFSICphZHZfZHZjX3ZhcnAsIEFEVl9TQ1NJX1JFUV9RICpzY3NpcXApCitzdGF0aWMgdm9pZCBhZHZfaXNyX2NhbGxiYWNrKEFEVl9EVkNfVkFSICphZHZfZHZjX3ZhcnAsIEFEVl9TQ1NJX1JFUV9RICpzY3NpcXApCiB7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOwotICAgIGFkdl9yZXFfdCAgICAgICAgICAgKnJlcXA7Ci0gICAgYWR2X3NnYmxrX3QgICAgICAgICAqc2dibGtwOwotICAgIHN0cnVjdCBzY3NpX2NtbmQgICAgICAgICAgICpzY3A7Ci0gICAgc3RydWN0IFNjc2lfSG9zdCAgICAqc2hwOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBBRFZfRENOVCAgICAgICAgICAgIHJlc2lkX2NudDsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOworCWFkdl9yZXFfdCAqcmVxcDsKKwlhZHZfc2dibGtfdCAqc2dibGtwOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlpbnQgaTsKKwlBRFZfRENOVCByZXNpZF9jbnQ7CiAKKwlBU0NfREJHMigxLCAiYWR2X2lzcl9jYWxsYmFjazogYWR2X2R2Y192YXJwIDB4JWx4LCBzY3NpcXAgMHglbHhcbiIsCisJCSAodWxvbmcpYWR2X2R2Y192YXJwLCAodWxvbmcpc2NzaXFwKTsKKwlBU0NfREJHX1BSVF9BRFZfU0NTSV9SRVFfUSgyLCBzY3NpcXApOwogCi0gICAgQVNDX0RCRzIoMSwgImFkdl9pc3JfY2FsbGJhY2s6IGFkdl9kdmNfdmFycCAweCVseCwgc2NzaXFwIDB4JWx4XG4iLAotICAgICAgICAodWxvbmcpIGFkdl9kdmNfdmFycCwgKHVsb25nKSBzY3NpcXApOwotICAgIEFTQ19EQkdfUFJUX0FEVl9TQ1NJX1JFUV9RKDIsIHNjc2lxcCk7CisJLyoKKwkgKiBHZXQgdGhlIGFkdl9yZXFfdCBzdHJ1Y3R1cmUgZm9yIHRoZSBjb21tYW5kIHRoYXQgaGFzIGJlZW4KKwkgKiBjb21wbGV0ZWQuIFRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGFjdHVhbGx5IGNvbnRhaW5zIHRoZQorCSAqIGNvbXBsZXRlZCBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCisJICovCisJcmVxcCA9IChhZHZfcmVxX3QgKilBRFZfVTMyX1RPX1ZBRERSKHNjc2lxcC0+c3JiX3B0cik7CisJQVNDX0RCRzEoMSwgImFkdl9pc3JfY2FsbGJhY2s6IHJlcXAgMHglbHhcbiIsICh1bG9uZylyZXFwKTsKKwlpZiAocmVxcCA9PSBOVUxMKSB7CisJCUFTQ19QUklOVCgiYWR2X2lzcl9jYWxsYmFjazogcmVxcCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuOworCX0KIAotICAgIC8qCi0gICAgICogR2V0IHRoZSBhZHZfcmVxX3Qgc3RydWN0dXJlIGZvciB0aGUgY29tbWFuZCB0aGF0IGhhcyBiZWVuCi0gICAgICogY29tcGxldGVkLiBUaGUgYWR2X3JlcV90IHN0cnVjdHVyZSBhY3R1YWxseSBjb250YWlucyB0aGUKLSAgICAgKiBjb21wbGV0ZWQgQURWX1NDU0lfUkVRX1Egc3RydWN0dXJlLgotICAgICAqLwotICAgIHJlcXAgPSAoYWR2X3JlcV90ICopIEFEVl9VMzJfVE9fVkFERFIoc2NzaXFwLT5zcmJfcHRyKTsKLSAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogcmVxcCAweCVseFxuIiwgKHVsb25nKSByZXFwKTsKLSAgICBpZiAocmVxcCA9PSBOVUxMKSB7Ci0gICAgICAgIEFTQ19QUklOVCgiYWR2X2lzcl9jYWxsYmFjazogcmVxcCBpcyBOVUxMXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwkvKgorCSAqIEdldCB0aGUgc3RydWN0IHNjc2lfY21uZCBzdHJ1Y3R1cmUgYW5kIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgZm9yIHRoZQorCSAqIGNvbW1hbmQgdGhhdCBoYXMgYmVlbiBjb21wbGV0ZWQuCisJICoKKwkgKiBOb3RlOiBUaGUgYWR2X3JlcV90IHJlcXVlc3Qgc3RydWN0dXJlIGFuZCBhZHZfc2dibGtfdCBzdHJ1Y3R1cmUsCisJICogaWYgYW55LCBhcmUgZHJvcHBlZCwgYmVjYXVzZSBhIGJvYXJkIHN0cnVjdHVyZSBwb2ludGVyIGNhbiBub3QgYmUKKwkgKiBkZXRlcm1pbmVkLgorCSAqLworCXNjcCA9IHJlcXAtPmNtbmRwOworCUFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBzY3AgMHglbHhcbiIsICh1bG9uZylzY3ApOworCWlmIChzY3AgPT0gTlVMTCkgeworCQlBU0NfUFJJTlQKKwkJICAgICgiYWR2X2lzcl9jYWxsYmFjazogc2NwIGlzIE5VTEw7IGFkdl9yZXFfdCBkcm9wcGVkLlxuIik7CisJCXJldHVybjsKKwl9CisJQVNDX0RCR19QUlRfQ0RCKDIsIHNjcC0+Y21uZCwgc2NwLT5jbWRfbGVuKTsKIAotICAgIC8qCi0gICAgICogR2V0IHRoZSBzdHJ1Y3Qgc2NzaV9jbW5kIHN0cnVjdHVyZSBhbmQgU2NzaV9Ib3N0IHN0cnVjdHVyZSBmb3IgdGhlCi0gICAgICogY29tbWFuZCB0aGF0IGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoZSBhZHZfcmVxX3QgcmVxdWVzdCBzdHJ1Y3R1cmUgYW5kIGFkdl9zZ2Jsa190IHN0cnVjdHVyZSwKLSAgICAgKiBpZiBhbnksIGFyZSBkcm9wcGVkLCBiZWNhdXNlIGEgYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgY2FuIG5vdCBiZQotICAgICAqIGRldGVybWluZWQuCi0gICAgICovCi0gICAgc2NwID0gcmVxcC0+Y21uZHA7Ci0gICAgQVNDX0RCRzEoMSwgImFkdl9pc3JfY2FsbGJhY2s6IHNjcCAweCVseFxuIiwgKHVsb25nKSBzY3ApOwotICAgIGlmIChzY3AgPT0gTlVMTCkgewotICAgICAgICBBU0NfUFJJTlQoImFkdl9pc3JfY2FsbGJhY2s6IHNjcCBpcyBOVUxMOyBhZHZfcmVxX3QgZHJvcHBlZC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTQ19EQkdfUFJUX0NEQigyLCBzY3AtPmNtbmQsIHNjcC0+Y21kX2xlbik7CisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdCdzIGhvc3QgcG9pbnRlciBpcyBub3QgdmFsaWQsIGRpc3BsYXkgYSBtZXNzYWdlCisJICogYW5kIHJldHVybi4KKwkgKi8KKwlzaG9zdCA9IHNjcC0+ZGV2aWNlLT5ob3N0OworCWZvciAoaSA9IDA7IGkgPCBhc2NfYm9hcmRfY291bnQ7IGkrKykgeworCQlpZiAoYXNjX2hvc3RbaV0gPT0gc2hvc3QpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogTm90ZTogSWYgdGhlIGhvc3Qgc3RydWN0dXJlIGlzIG5vdCBmb3VuZCwgdGhlIGFkdl9yZXFfdCByZXF1ZXN0CisJICogc3RydWN0dXJlIGFuZCBhZHZfc2dibGtfdCBzdHJ1Y3R1cmUsIGlmIGFueSwgaXMgZHJvcHBlZC4KKwkgKi8KKwlpZiAoaSA9PSBhc2NfYm9hcmRfY291bnQpIHsKKwkJQVNDX1BSSU5UMgorCQkgICAgKCJhZHZfaXNyX2NhbGxiYWNrOiBzY3AgMHglbHggaGFzIGJhZCBob3N0IHBvaW50ZXIsIGhvc3QgMHglbHhcbiIsCisJCSAgICAgKHVsb25nKXNjcCwgKHVsb25nKXNob3N0KTsKKwkJcmV0dXJuOworCX0KIAotICAgIC8qCi0gICAgICogSWYgdGhlIHJlcXVlc3QncyBob3N0IHBvaW50ZXIgaXMgbm90IHZhbGlkLCBkaXNwbGF5IGEgbWVzc2FnZQotICAgICAqIGFuZCByZXR1cm4uCi0gICAgICovCi0gICAgc2hwID0gc2NwLT5kZXZpY2UtPmhvc3Q7Ci0gICAgZm9yIChpID0gMDsgaSA8IGFzY19ib2FyZF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChhc2NfaG9zdFtpXSA9PSBzaHApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogTm90ZTogSWYgdGhlIGhvc3Qgc3RydWN0dXJlIGlzIG5vdCBmb3VuZCwgdGhlIGFkdl9yZXFfdCByZXF1ZXN0Ci0gICAgICogc3RydWN0dXJlIGFuZCBhZHZfc2dibGtfdCBzdHJ1Y3R1cmUsIGlmIGFueSwgaXMgZHJvcHBlZC4KLSAgICAgKi8KLSAgICBpZiAoaSA9PSBhc2NfYm9hcmRfY291bnQpIHsKLSAgICAgICAgQVNDX1BSSU5UMigKLSAgICAgICAgICAgICJhZHZfaXNyX2NhbGxiYWNrOiBzY3AgMHglbHggaGFzIGJhZCBob3N0IHBvaW50ZXIsIGhvc3QgMHglbHhcbiIsCi0gICAgICAgICAgICAodWxvbmcpIHNjcCwgKHVsb25nKSBzaHApOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCUFTQ19TVEFUUyhzaG9zdCwgY2FsbGJhY2spOworCUFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBzaG9zdCAweCVseFxuIiwgKHVsb25nKXNob3N0KTsKIAotICAgIEFTQ19TVEFUUyhzaHAsIGNhbGxiYWNrKTsKLSAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogc2hwIDB4JWx4XG4iLCAodWxvbmcpIHNocCk7CisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdCBpc24ndCBmb3VuZCBvbiB0aGUgYWN0aXZlIHF1ZXVlLCBpdCBtYXkgaGF2ZSBiZWVuCisJICogcmVtb3ZlZCB0byBoYW5kbGUgYSByZXNldCByZXF1ZXN0LiBEaXNwbGF5IGEgbWVzc2FnZSBhbmQgcmV0dXJuLgorCSAqCisJICogTm90ZTogQmVjYXVzZSB0aGUgc3RydWN0dXJlIG1heSBzdGlsbCBiZSBpbiB1c2UgZG9uJ3QgYXR0ZW1wdAorCSAqIHRvIGZyZWUgdGhlIGFkdl9yZXFfdCBhbmQgYWR2X3NnYmxrX3QsIGlmIGFueSwgc3RydWN0dXJlcy4KKwkgKi8KKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlBU0NfQVNTRVJUKGFkdl9kdmNfdmFycCA9PSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyKTsKKwlpZiAoYXNjX3JtcXVldWUoJmJvYXJkcC0+YWN0aXZlLCBzY3ApID09IEFTQ19GQUxTRSkgeworCQlBU0NfUFJJTlQyCisJCSAgICAoImFkdl9pc3JfY2FsbGJhY2s6IGJvYXJkICVkOiBzY3AgMHglbHggbm90IG9uIGFjdGl2ZSBxdWV1ZVxuIiwKKwkJICAgICBib2FyZHAtPmlkLCAodWxvbmcpc2NwKTsKKwkJcmV0dXJuOworCX0KIAotICAgIC8qCi0gICAgICogSWYgdGhlIHJlcXVlc3QgaXNuJ3QgZm91bmQgb24gdGhlIGFjdGl2ZSBxdWV1ZSwgaXQgbWF5IGhhdmUgYmVlbgotICAgICAqIHJlbW92ZWQgdG8gaGFuZGxlIGEgcmVzZXQgcmVxdWVzdC4gRGlzcGxheSBhIG1lc3NhZ2UgYW5kIHJldHVybi4KLSAgICAgKgotICAgICAqIE5vdGU6IEJlY2F1c2UgdGhlIHN0cnVjdHVyZSBtYXkgc3RpbGwgYmUgaW4gdXNlIGRvbid0IGF0dGVtcHQKLSAgICAgKiB0byBmcmVlIHRoZSBhZHZfcmVxX3QgYW5kIGFkdl9zZ2Jsa190LCBpZiBhbnksIHN0cnVjdHVyZXMuCi0gICAgICovCi0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOwotICAgIEFTQ19BU1NFUlQoYWR2X2R2Y192YXJwID09ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIpOwotICAgIGlmIChhc2Nfcm1xdWV1ZSgmYm9hcmRwLT5hY3RpdmUsIHNjcCkgPT0gQVNDX0ZBTFNFKSB7Ci0gICAgICAgIEFTQ19QUklOVDIoCi0gICAgICAgICAgICAiYWR2X2lzcl9jYWxsYmFjazogYm9hcmQgJWQ6IHNjcCAweCVseCBub3Qgb24gYWN0aXZlIHF1ZXVlXG4iLAotICAgICAgICAgICAgYm9hcmRwLT5pZCwgKHVsb25nKSBzY3ApOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCS8qCisJICogJ2RvbmVfc3RhdHVzJyBjb250YWlucyB0aGUgY29tbWFuZCdzIGVuZGluZyBzdGF0dXMuCisJICovCisJc3dpdGNoIChzY3NpcXAtPmRvbmVfc3RhdHVzKSB7CisJY2FzZSBRRF9OT19FUlJPUjoKKwkJQVNDX0RCRygyLCAiYWR2X2lzcl9jYWxsYmFjazogUURfTk9fRVJST1JcbiIpOworCQlzY3AtPnJlc3VsdCA9IDA7CiAKLSAgICAvKgotICAgICAqICdkb25lX3N0YXR1cycgY29udGFpbnMgdGhlIGNvbW1hbmQncyBlbmRpbmcgc3RhdHVzLgotICAgICAqLwotICAgIHN3aXRjaCAoc2NzaXFwLT5kb25lX3N0YXR1cykgewotICAgIGNhc2UgUURfTk9fRVJST1I6Ci0gICAgICAgIEFTQ19EQkcoMiwgImFkdl9pc3JfY2FsbGJhY2s6IFFEX05PX0VSUk9SXG4iKTsKLSAgICAgICAgc2NwLT5yZXN1bHQgPSAwOworCQkvKgorCQkgKiBDaGVjayBmb3IgYW4gdW5kZXJydW4gY29uZGl0aW9uLgorCQkgKgorCQkgKiBJZiB0aGVyZSB3YXMgbm8gZXJyb3IgYW5kIGFuIHVuZGVycnVuIGNvbmRpdGlvbiwgdGhlbgorCQkgKiB0aGVuIHJldHVybiB0aGUgbnVtYmVyIG9mIHVuZGVycnVuIGJ5dGVzLgorCQkgKi8KKwkJcmVzaWRfY250ID0gbGUzMl90b19jcHUoc2NzaXFwLT5kYXRhX2NudCk7CisJCWlmIChzY3AtPnJlcXVlc3RfYnVmZmxlbiAhPSAwICYmIHJlc2lkX2NudCAhPSAwICYmCisJCSAgICByZXNpZF9jbnQgPD0gc2NwLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJCUFTQ19EQkcxKDEsCisJCQkJICJhZHZfaXNyX2NhbGxiYWNrOiB1bmRlcnJ1biBjb25kaXRpb24gJWx1IGJ5dGVzXG4iLAorCQkJCSAodWxvbmcpcmVzaWRfY250KTsKKwkJCXNjcC0+cmVzaWQgPSByZXNpZF9jbnQ7CisJCX0KKwkJYnJlYWs7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2sgZm9yIGFuIHVuZGVycnVuIGNvbmRpdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhlcmUgd2FzIG5vIGVycm9yIGFuZCBhbiB1bmRlcnJ1biBjb25kaXRpb24sIHRoZW4KLSAgICAgICAgICogdGhlbiByZXR1cm4gdGhlIG51bWJlciBvZiB1bmRlcnJ1biBieXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHJlc2lkX2NudCA9IGxlMzJfdG9fY3B1KHNjc2lxcC0+ZGF0YV9jbnQpOwotICAgICAgICBpZiAoc2NwLT5yZXF1ZXN0X2J1ZmZsZW4gIT0gMCAmJiByZXNpZF9jbnQgIT0gMCAmJgotICAgICAgICAgICAgcmVzaWRfY250IDw9IHNjcC0+cmVxdWVzdF9idWZmbGVuKSB7Ci0gICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogdW5kZXJydW4gY29uZGl0aW9uICVsdSBieXRlc1xuIiwKLSAgICAgICAgICAgICAgICAodWxvbmcpIHJlc2lkX2NudCk7Ci0gICAgICAgICAgICBzY3AtPnJlc2lkID0gcmVzaWRfY250OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCWNhc2UgUURfV0lUSF9FUlJPUjoKKwkJQVNDX0RCRygyLCAiYWR2X2lzcl9jYWxsYmFjazogUURfV0lUSF9FUlJPUlxuIik7CisJCXN3aXRjaCAoc2NzaXFwLT5ob3N0X3N0YXR1cykgeworCQljYXNlIFFIU1RBX05PX0VSUk9SOgorCQkJaWYgKHNjc2lxcC0+c2NzaV9zdGF0dXMgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKSB7CisJCQkJQVNDX0RCRygyLAorCQkJCQkiYWR2X2lzcl9jYWxsYmFjazogU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OXG4iKTsKKwkJCQlBU0NfREJHX1BSVF9TRU5TRSgyLCBzY3AtPnNlbnNlX2J1ZmZlciwKKwkJCQkJCSAgc2l6ZW9mKHNjcC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJLyoKKwkJCQkgKiBOb3RlOiBUaGUgJ3N0YXR1c19ieXRlKCknIG1hY3JvIHVzZWQgYnkgdGFyZ2V0IGRyaXZlcnMKKwkJCQkgKiBkZWZpbmVkIGluIHNjc2kuaCBzaGlmdHMgdGhlIHN0YXR1cyBieXRlIHJldHVybmVkIGJ5CisJCQkJICogaG9zdCBkcml2ZXJzIHJpZ2h0IGJ5IDEgYml0LiBUaGlzIGlzIHdoeSB0YXJnZXQgZHJpdmVycworCQkJCSAqIGFsc28gdXNlIHJpZ2h0IHNoaWZ0ZWQgc3RhdHVzIGJ5dGUgZGVmaW5pdGlvbnMuIEZvcgorCQkJCSAqIGluc3RhbmNlIHRhcmdldCBkcml2ZXJzIHVzZSBDSEVDS19DT05ESVRJT04sIGRlZmluZWQgdG8KKwkJCQkgKiAweDEsIGluc3RlYWQgb2YgdGhlIFNDU0kgZGVmaW5lZCBjaGVjayBjb25kaXRpb24gdmFsdWUKKwkJCQkgKiBvZiAweDIuIEhvc3QgZHJpdmVycyBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBzdGF0dXMKKwkJCQkgKiBieXRlIGFzIGl0IGlzIGRlZmluZWQgYnkgU0NTSS4KKwkJCQkgKi8KKwkJCQlzY3AtPnJlc3VsdCA9IERSSVZFUl9CWVRFKERSSVZFUl9TRU5TRSkgfAorCQkJCSAgICBTVEFUVVNfQllURShzY3NpcXAtPnNjc2lfc3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NwLT5yZXN1bHQgPSBTVEFUVVNfQllURShzY3NpcXAtPnNjc2lfc3RhdHVzKTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgY2FzZSBRRF9XSVRIX0VSUk9SOgotICAgICAgICBBU0NfREJHKDIsICJhZHZfaXNyX2NhbGxiYWNrOiBRRF9XSVRIX0VSUk9SXG4iKTsKLSAgICAgICAgc3dpdGNoIChzY3NpcXAtPmhvc3Rfc3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgUUhTVEFfTk9fRVJST1I6Ci0gICAgICAgICAgICBpZiAoc2NzaXFwLT5zY3NpX3N0YXR1cyA9PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04pIHsKLSAgICAgICAgICAgICAgICBBU0NfREJHKDIsICJhZHZfaXNyX2NhbGxiYWNrOiBTQU1fU1RBVF9DSEVDS19DT05ESVRJT05cbiIpOwotICAgICAgICAgICAgICAgIEFTQ19EQkdfUFJUX1NFTlNFKDIsIHNjcC0+c2Vuc2VfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NwLT5zZW5zZV9idWZmZXIpKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIE5vdGU6IFRoZSAnc3RhdHVzX2J5dGUoKScgbWFjcm8gdXNlZCBieSB0YXJnZXQgZHJpdmVycwotICAgICAgICAgICAgICAgICAqIGRlZmluZWQgaW4gc2NzaS5oIHNoaWZ0cyB0aGUgc3RhdHVzIGJ5dGUgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgKiBob3N0IGRyaXZlcnMgcmlnaHQgYnkgMSBiaXQuIFRoaXMgaXMgd2h5IHRhcmdldCBkcml2ZXJzCi0gICAgICAgICAgICAgICAgICogYWxzbyB1c2UgcmlnaHQgc2hpZnRlZCBzdGF0dXMgYnl0ZSBkZWZpbml0aW9ucy4gRm9yCi0gICAgICAgICAgICAgICAgICogaW5zdGFuY2UgdGFyZ2V0IGRyaXZlcnMgdXNlIENIRUNLX0NPTkRJVElPTiwgZGVmaW5lZCB0bwotICAgICAgICAgICAgICAgICAqIDB4MSwgaW5zdGVhZCBvZiB0aGUgU0NTSSBkZWZpbmVkIGNoZWNrIGNvbmRpdGlvbiB2YWx1ZQotICAgICAgICAgICAgICAgICAqIG9mIDB4Mi4gSG9zdCBkcml2ZXJzIGFyZSBzdXBwb3NlZCB0byByZXR1cm4gdGhlIHN0YXR1cwotICAgICAgICAgICAgICAgICAqIGJ5dGUgYXMgaXQgaXMgZGVmaW5lZCBieSBTQ1NJLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gRFJJVkVSX0JZVEUoRFJJVkVSX1NFTlNFKSB8Ci0gICAgICAgICAgICAgICAgICAgIFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzY3AtPnJlc3VsdCA9IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBTb21lIG90aGVyIFFIU1RBIGVycm9yIG9jY3VycmVkLiAqLworCQkJQVNDX0RCRzEoMSwgImFkdl9pc3JfY2FsbGJhY2s6IGhvc3Rfc3RhdHVzIDB4JXhcbiIsCisJCQkJIHNjc2lxcC0+aG9zdF9zdGF0dXMpOworCQkJc2NwLT5yZXN1bHQgPSBIT1NUX0JZVEUoRElEX0JBRF9UQVJHRVQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIFNvbWUgb3RoZXIgUUhTVEEgZXJyb3Igb2NjdXJyZWQuICovCi0gICAgICAgICAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogaG9zdF9zdGF0dXMgMHgleFxuIiwKLSAgICAgICAgICAgICAgICBzY3NpcXAtPmhvc3Rfc3RhdHVzKTsKLSAgICAgICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9CQURfVEFSR0VUKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCWNhc2UgUURfQUJPUlRFRF9CWV9IT1NUOgorCQlBU0NfREJHKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBRRF9BQk9SVEVEX0JZX0hPU1RcbiIpOworCQlzY3AtPnJlc3VsdCA9CisJCSAgICBIT1NUX0JZVEUoRElEX0FCT1JUKSB8IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOworCQlicmVhazsKIAotICAgIGNhc2UgUURfQUJPUlRFRF9CWV9IT1NUOgotICAgICAgICBBU0NfREJHKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBRRF9BQk9SVEVEX0JZX0hPU1RcbiIpOwotICAgICAgICBzY3AtPnJlc3VsdCA9IEhPU1RfQllURShESURfQUJPUlQpIHwgU1RBVFVTX0JZVEUoc2NzaXFwLT5zY3NpX3N0YXR1cyk7Ci0gICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJCUFTQ19EQkcxKDEsICJhZHZfaXNyX2NhbGxiYWNrOiBkb25lX3N0YXR1cyAweCV4XG4iLAorCQkJIHNjc2lxcC0+ZG9uZV9zdGF0dXMpOworCQlzY3AtPnJlc3VsdCA9CisJCSAgICBIT1NUX0JZVEUoRElEX0VSUk9SKSB8IFNUQVRVU19CWVRFKHNjc2lxcC0+c2NzaV9zdGF0dXMpOworCQlicmVhazsKKwl9CiAKLSAgICBkZWZhdWx0OgotICAgICAgICBBU0NfREJHMSgxLCAiYWR2X2lzcl9jYWxsYmFjazogZG9uZV9zdGF0dXMgMHgleFxuIiwgc2NzaXFwLT5kb25lX3N0YXR1cyk7Ci0gICAgICAgIHNjcC0+cmVzdWx0ID0gSE9TVF9CWVRFKERJRF9FUlJPUikgfCBTVEFUVVNfQllURShzY3NpcXAtPnNjc2lfc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorCS8qCisJICogSWYgdGhlICdpbml0X3RpZG1hc2snIGJpdCBpc24ndCBhbHJlYWR5IHNldCBmb3IgdGhlIHRhcmdldCBhbmQgdGhlCisJICogY3VycmVudCByZXF1ZXN0IGZpbmlzaGVkIG5vcm1hbGx5LCB0aGVuIHNldCB0aGUgYml0IGZvciB0aGUgdGFyZ2V0CisJICogdG8gaW5kaWNhdGUgdGhhdCBhIGRldmljZSBpcyBwcmVzZW50LgorCSAqLworCWlmICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soc2NwLT5kZXZpY2UtPmlkKSkgPT0gMCAmJgorCSAgICBzY3NpcXAtPmRvbmVfc3RhdHVzID09IFFEX05PX0VSUk9SICYmCisJICAgIHNjc2lxcC0+aG9zdF9zdGF0dXMgPT0gUUhTVEFfTk9fRVJST1IpIHsKKwkJYm9hcmRwLT5pbml0X3RpZG1hc2sgfD0gQURWX1RJRF9UT19USURNQVNLKHNjcC0+ZGV2aWNlLT5pZCk7CisJfQogCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgJ2luaXRfdGlkbWFzaycgYml0IGlzbid0IGFscmVhZHkgc2V0IGZvciB0aGUgdGFyZ2V0IGFuZCB0aGUKLSAgICAgKiBjdXJyZW50IHJlcXVlc3QgZmluaXNoZWQgbm9ybWFsbHksIHRoZW4gc2V0IHRoZSBiaXQgZm9yIHRoZSB0YXJnZXQKLSAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IGEgZGV2aWNlIGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgaWYgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhzY3AtPmRldmljZS0+aWQpKSA9PSAwICYmCi0gICAgICAgIHNjc2lxcC0+ZG9uZV9zdGF0dXMgPT0gUURfTk9fRVJST1IgJiYKLSAgICAgICAgc2NzaXFwLT5ob3N0X3N0YXR1cyA9PSBRSFNUQV9OT19FUlJPUikgewotICAgICAgICBib2FyZHAtPmluaXRfdGlkbWFzayB8PSBBRFZfVElEX1RPX1RJRE1BU0soc2NwLT5kZXZpY2UtPmlkKTsKLSAgICB9CisJLyoKKwkgKiBCZWNhdXNlIGludGVycnVwdHMgbWF5IGJlIGVuYWJsZWQgYnkgdGhlICdzdHJ1Y3Qgc2NzaV9jbW5kJyBkb25lCisJICogZnVuY3Rpb24sIGFkZCB0aGUgY29tbWFuZCB0byB0aGUgZW5kIG9mIHRoZSBib2FyZCdzIGRvbmUgcXVldWUuCisJICogVGhlIGRvbmUgZnVuY3Rpb24gZm9yIHRoZSBjb21tYW5kIHdpbGwgYmUgY2FsbGVkIGZyb20KKwkgKiBhZHZhbnN5c19pbnRlcnJ1cHQoKS4KKwkgKi8KKwlhc2NfZW5xdWV1ZSgmYm9hcmRwLT5kb25lLCBzY3AsIEFTQ19CQUNLKTsKIAotICAgIC8qCi0gICAgICogQmVjYXVzZSBpbnRlcnJ1cHRzIG1heSBiZSBlbmFibGVkIGJ5IHRoZSAnc3RydWN0IHNjc2lfY21uZCcgZG9uZQotICAgICAqIGZ1bmN0aW9uLCBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGVuZCBvZiB0aGUgYm9hcmQncyBkb25lIHF1ZXVlLgotICAgICAqIFRoZSBkb25lIGZ1bmN0aW9uIGZvciB0aGUgY29tbWFuZCB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gICAgICogYWR2YW5zeXNfaW50ZXJydXB0KCkuCi0gICAgICovCi0gICAgYXNjX2VucXVldWUoJmJvYXJkcC0+ZG9uZSwgc2NwLCBBU0NfQkFDSyk7CisJLyoKKwkgKiBGcmVlIGFsbCAnYWR2X3NnYmxrX3QnIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGZvciB0aGUgcmVxdWVzdC4KKwkgKi8KKwl3aGlsZSAoKHNnYmxrcCA9IHJlcXAtPnNnYmxrcCkgIT0gTlVMTCkgeworCQkvKiBSZW1vdmUgJ3NnYmxrcCcgZnJvbSB0aGUgcmVxdWVzdCBsaXN0LiAqLworCQlyZXFwLT5zZ2Jsa3AgPSBzZ2Jsa3AtPm5leHRfc2dibGtwOwogCi0gICAgLyoKLSAgICAgKiBGcmVlIGFsbCAnYWR2X3NnYmxrX3QnIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGZvciB0aGUgcmVxdWVzdC4KLSAgICAgKi8KLSAgICB3aGlsZSAoKHNnYmxrcCA9IHJlcXAtPnNnYmxrcCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIFJlbW92ZSAnc2dibGtwJyBmcm9tIHRoZSByZXF1ZXN0IGxpc3QuICovCi0gICAgICAgIHJlcXAtPnNnYmxrcCA9IHNnYmxrcC0+bmV4dF9zZ2Jsa3A7CisJCS8qIEFkZCAnc2dibGtwJyB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LiAqLworCQlzZ2Jsa3AtPm5leHRfc2dibGtwID0gYm9hcmRwLT5hZHZfc2dibGtwOworCQlib2FyZHAtPmFkdl9zZ2Jsa3AgPSBzZ2Jsa3A7CisJfQogCi0gICAgICAgIC8qIEFkZCAnc2dibGtwJyB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LiAqLwotICAgICAgICBzZ2Jsa3AtPm5leHRfc2dibGtwID0gYm9hcmRwLT5hZHZfc2dibGtwOwotICAgICAgICBib2FyZHAtPmFkdl9zZ2Jsa3AgPSBzZ2Jsa3A7Ci0gICAgfQorCS8qCisJICogRnJlZSB0aGUgYWR2X3JlcV90IHN0cnVjdHVyZSB1c2VkIHdpdGggdGhlIGNvbW1hbmQgYnkgYWRkaW5nCisJICogaXQgYmFjayB0byB0aGUgYm9hcmQgZnJlZSBsaXN0LgorCSAqLworCXJlcXAtPm5leHRfcmVxcCA9IGJvYXJkcC0+YWR2X3JlcXA7CisJYm9hcmRwLT5hZHZfcmVxcCA9IHJlcXA7CiAKLSAgICAvKgotICAgICAqIEZyZWUgdGhlIGFkdl9yZXFfdCBzdHJ1Y3R1cmUgdXNlZCB3aXRoIHRoZSBjb21tYW5kIGJ5IGFkZGluZwotICAgICAqIGl0IGJhY2sgdG8gdGhlIGJvYXJkIGZyZWUgbGlzdC4KLSAgICAgKi8KLSAgICByZXFwLT5uZXh0X3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwOwotICAgIGJvYXJkcC0+YWR2X3JlcXAgPSByZXFwOworCUFTQ19EQkcoMSwgImFkdl9pc3JfY2FsbGJhY2s6IGRvbmVcbiIpOwogCi0gICAgQVNDX0RCRygxLCAiYWR2X2lzcl9jYWxsYmFjazogZG9uZVxuIik7Ci0KLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiAvKgogICogYWR2X2FzeW5jX2NhbGxiYWNrKCkgLSBBZHYgTGlicmFyeSBhc3luY2hyb25vdXMgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24uCiAgKi8KLVNUQVRJQyB2b2lkCi1hZHZfYXN5bmNfY2FsbGJhY2soQURWX0RWQ19WQVIgKmFkdl9kdmNfdmFycCwgdWNoYXIgY29kZSkKK3N0YXRpYyB2b2lkIGFkdl9hc3luY19jYWxsYmFjayhBRFZfRFZDX1ZBUiAqYWR2X2R2Y192YXJwLCB1Y2hhciBjb2RlKQogewotICAgIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUOgotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgZmlybXdhcmUgZGV0ZWN0ZWQgYSBTQ1NJIEJ1cyByZXNldC4KLSAgICAgICAgICovCi0gICAgICAgIEFTQ19EQkcoMCwgImFkdl9hc3luY19jYWxsYmFjazogQURWX0FTWU5DX1NDU0lfQlVTX1JFU0VUX0RFVFxuIik7Ci0gICAgICAgIGJyZWFrOworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQURWX0FTWU5DX1NDU0lfQlVTX1JFU0VUX0RFVDoKKwkJLyoKKwkJICogVGhlIGZpcm13YXJlIGRldGVjdGVkIGEgU0NTSSBCdXMgcmVzZXQuCisJCSAqLworCQlBU0NfREJHKDAsCisJCQkiYWR2X2FzeW5jX2NhbGxiYWNrOiBBRFZfQVNZTkNfU0NTSV9CVVNfUkVTRVRfREVUXG4iKTsKKwkJYnJlYWs7CiAKLSAgICBjYXNlIEFEVl9BU1lOQ19SRE1BX0ZBSUxVUkU6Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEhhbmRsZSBSRE1BIGZhaWx1cmUgYnkgcmVzZXR0aW5nIHRoZSBTQ1NJIEJ1cyBhbmQKLSAgICAgICAgICogcG9zc2libHkgdGhlIGNoaXAgaWYgaXQgaXMgdW5yZXNwb25zaXZlLiBMb2cgdGhlIGVycm9yCi0gICAgICAgICAqIHdpdGggYSB1bmlxdWUgY29kZS4KLSAgICAgICAgICovCi0gICAgICAgIEFTQ19EQkcoMCwgImFkdl9hc3luY19jYWxsYmFjazogQURWX0FTWU5DX1JETUFfRkFJTFVSRVxuIik7Ci0gICAgICAgIEFkdlJlc2V0Q2hpcEFuZFNCKGFkdl9kdmNfdmFycCk7Ci0gICAgICAgIGJyZWFrOworCWNhc2UgQURWX0FTWU5DX1JETUFfRkFJTFVSRToKKwkJLyoKKwkJICogSGFuZGxlIFJETUEgZmFpbHVyZSBieSByZXNldHRpbmcgdGhlIFNDU0kgQnVzIGFuZAorCQkgKiBwb3NzaWJseSB0aGUgY2hpcCBpZiBpdCBpcyB1bnJlc3BvbnNpdmUuIExvZyB0aGUgZXJyb3IKKwkJICogd2l0aCBhIHVuaXF1ZSBjb2RlLgorCQkgKi8KKwkJQVNDX0RCRygwLCAiYWR2X2FzeW5jX2NhbGxiYWNrOiBBRFZfQVNZTkNfUkRNQV9GQUlMVVJFXG4iKTsKKwkJQWR2UmVzZXRDaGlwQW5kU0IoYWR2X2R2Y192YXJwKTsKKwkJYnJlYWs7CiAKLSAgICBjYXNlIEFEVl9IT1NUX1NDU0lfQlVTX1JFU0VUOgotICAgICAgICAvKgotICAgICAgICAgKiBIb3N0IGdlbmVyYXRlZCBTQ1NJIGJ1cyByZXNldCBvY2N1cnJlZC4KLSAgICAgICAgICovCi0gICAgICAgIEFTQ19EQkcoMCwgImFkdl9hc3luY19jYWxsYmFjazogQURWX0hPU1RfU0NTSV9CVVNfUkVTRVRcbiIpOwotICAgICAgICBicmVhazsKKwljYXNlIEFEVl9IT1NUX1NDU0lfQlVTX1JFU0VUOgorCQkvKgorCQkgKiBIb3N0IGdlbmVyYXRlZCBTQ1NJIGJ1cyByZXNldCBvY2N1cnJlZC4KKwkJICovCisJCUFTQ19EQkcoMCwgImFkdl9hc3luY19jYWxsYmFjazogQURWX0hPU1RfU0NTSV9CVVNfUkVTRVRcbiIpOworCQlicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTQ19EQkcxKDAsICJEdmNBc3luY0NhbGxCYWNrOiB1bmtub3duIGNvZGUgMHgleFxuIiwgY29kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwlkZWZhdWx0OgorCQlBU0NfREJHMSgwLCAiRHZjQXN5bmNDYWxsQmFjazogdW5rbm93biBjb2RlIDB4JXhcbiIsIGNvZGUpOworCQlicmVhazsKKwl9CiB9CiAKIC8qCkBAIC03MTI3LDUwICs1OTQ4LDUwIEBACiAgKgogICogJ1JFUVBORVhUKHJlcXApJyByZXR1cm5zIHJlcXAncyBuZXh0IHBvaW50ZXIuCiAgKi8KLVNUQVRJQyB2b2lkCi1hc2NfZW5xdWV1ZShhc2NfcXVldWVfdCAqYXNjcSwgUkVRUCByZXFwLCBpbnQgZmxhZykKK3N0YXRpYyB2b2lkIGFzY19lbnF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBSRVFQIHJlcXAsIGludCBmbGFnKQogewotICAgIGludCAgICAgICAgdGlkOworCWludCB0aWQ7CiAKLSAgICBBU0NfREJHMygzLCAiYXNjX2VucXVldWU6IGFzY3EgMHglbHgsIHJlcXAgMHglbHgsIGZsYWcgJWRcbiIsCi0gICAgICAgICh1bG9uZykgYXNjcSwgKHVsb25nKSByZXFwLCBmbGFnKTsKLSAgICBBU0NfQVNTRVJUKHJlcXAgIT0gTlVMTCk7Ci0gICAgQVNDX0FTU0VSVChmbGFnID09IEFTQ19GUk9OVCB8fCBmbGFnID09IEFTQ19CQUNLKTsKLSAgICB0aWQgPSBSRVFQVElEKHJlcXApOwotICAgIEFTQ19BU1NFUlQodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKTsKLSAgICBpZiAoZmxhZyA9PSBBU0NfRlJPTlQpIHsKLSAgICAgICAgcmVxcC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopYXNjcS0+cV9maXJzdFt0aWRdOwotICAgICAgICBhc2NxLT5xX2ZpcnN0W3RpZF0gPSByZXFwOwotICAgICAgICAvKiBJZiB0aGUgcXVldWUgd2FzIGVtcHR5LCBzZXQgdGhlIGxhc3QgcG9pbnRlci4gKi8KLSAgICAgICAgaWYgKGFzY3EtPnFfbGFzdFt0aWRdID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFzY3EtPnFfbGFzdFt0aWRdID0gcmVxcDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8qIEFTQ19CQUNLICovCi0gICAgICAgIGlmIChhc2NxLT5xX2xhc3RbdGlkXSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXS0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopcmVxcDsKLSAgICAgICAgfQotICAgICAgICBhc2NxLT5xX2xhc3RbdGlkXSA9IHJlcXA7Ci0gICAgICAgIHJlcXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotICAgICAgICAvKiBJZiB0aGUgcXVldWUgd2FzIGVtcHR5LCBzZXQgdGhlIGZpcnN0IHBvaW50ZXIuICovCi0gICAgICAgIGlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgewotICAgICAgICAgICAgYXNjcS0+cV9maXJzdFt0aWRdID0gcmVxcDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBUaGUgcXVldWUgaGFzIGF0IGxlYXN0IG9uZSBlbnRyeSwgc2V0IGl0cyBiaXQuICovCi0gICAgYXNjcS0+cV90aWRtYXNrIHw9IEFEVl9USURfVE9fVElETUFTSyh0aWQpOworCUFTQ19EQkczKDMsICJhc2NfZW5xdWV1ZTogYXNjcSAweCVseCwgcmVxcCAweCVseCwgZmxhZyAlZFxuIiwKKwkJICh1bG9uZylhc2NxLCAodWxvbmcpcmVxcCwgZmxhZyk7CisJQVNDX0FTU0VSVChyZXFwICE9IE5VTEwpOworCUFTQ19BU1NFUlQoZmxhZyA9PSBBU0NfRlJPTlQgfHwgZmxhZyA9PSBBU0NfQkFDSyk7CisJdGlkID0gUkVRUFRJRChyZXFwKTsKKwlBU0NfQVNTRVJUKHRpZCA+PSAwICYmIHRpZCA8PSBBRFZfTUFYX1RJRCk7CisJaWYgKGZsYWcgPT0gQVNDX0ZST05UKSB7CisJCXJlcXAtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWFzY3EtPnFfZmlyc3RbdGlkXTsKKwkJYXNjcS0+cV9maXJzdFt0aWRdID0gcmVxcDsKKwkJLyogSWYgdGhlIHF1ZXVlIHdhcyBlbXB0eSwgc2V0IHRoZSBsYXN0IHBvaW50ZXIuICovCisJCWlmIChhc2NxLT5xX2xhc3RbdGlkXSA9PSBOVUxMKSB7CisJCQlhc2NxLT5xX2xhc3RbdGlkXSA9IHJlcXA7CisJCX0KKwl9IGVsc2UgewkJLyogQVNDX0JBQ0sgKi8KKwkJaWYgKGFzY3EtPnFfbGFzdFt0aWRdICE9IE5VTEwpIHsKKwkJCWFzY3EtPnFfbGFzdFt0aWRdLT5ob3N0X3NjcmliYmxlID0KKwkJCSAgICAodW5zaWduZWQgY2hhciAqKXJlcXA7CisJCX0KKwkJYXNjcS0+cV9sYXN0W3RpZF0gPSByZXFwOworCQlyZXFwLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJLyogSWYgdGhlIHF1ZXVlIHdhcyBlbXB0eSwgc2V0IHRoZSBmaXJzdCBwb2ludGVyLiAqLworCQlpZiAoYXNjcS0+cV9maXJzdFt0aWRdID09IE5VTEwpIHsKKwkJCWFzY3EtPnFfZmlyc3RbdGlkXSA9IHJlcXA7CisJCX0KKwl9CisJLyogVGhlIHF1ZXVlIGhhcyBhdCBsZWFzdCBvbmUgZW50cnksIHNldCBpdHMgYml0LiAqLworCWFzY3EtPnFfdGlkbWFzayB8PSBBRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgIC8qIE1haW50YWluIHJlcXVlc3QgcXVldWUgc3RhdGlzdGljcy4gKi8KLSAgICBhc2NxLT5xX3RvdF9jbnRbdGlkXSsrOwotICAgIGFzY3EtPnFfY3VyX2NudFt0aWRdKys7Ci0gICAgaWYgKGFzY3EtPnFfY3VyX2NudFt0aWRdID4gYXNjcS0+cV9tYXhfY250W3RpZF0pIHsKLSAgICAgICAgYXNjcS0+cV9tYXhfY250W3RpZF0gPSBhc2NxLT5xX2N1cl9jbnRbdGlkXTsKLSAgICAgICAgQVNDX0RCRzIoMiwgImFzY19lbnF1ZXVlOiBuZXcgcV9tYXhfY250WyVkXSAlZFxuIiwKLSAgICAgICAgICAgIHRpZCwgYXNjcS0+cV9tYXhfY250W3RpZF0pOwotICAgIH0KLSAgICBSRVFQVElNRShyZXFwKSA9IFJFUVRJTUVTVEFNUCgpOworCS8qIE1haW50YWluIHJlcXVlc3QgcXVldWUgc3RhdGlzdGljcy4gKi8KKwlhc2NxLT5xX3RvdF9jbnRbdGlkXSsrOworCWFzY3EtPnFfY3VyX2NudFt0aWRdKys7CisJaWYgKGFzY3EtPnFfY3VyX2NudFt0aWRdID4gYXNjcS0+cV9tYXhfY250W3RpZF0pIHsKKwkJYXNjcS0+cV9tYXhfY250W3RpZF0gPSBhc2NxLT5xX2N1cl9jbnRbdGlkXTsKKwkJQVNDX0RCRzIoMiwgImFzY19lbnF1ZXVlOiBuZXcgcV9tYXhfY250WyVkXSAlZFxuIiwKKwkJCSB0aWQsIGFzY3EtPnFfbWF4X2NudFt0aWRdKTsKKwl9CisJUkVRUFRJTUUocmVxcCkgPSBSRVFUSU1FU1RBTVAoKTsKICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwotICAgIEFTQ19EQkcxKDMsICJhc2NfZW5xdWV1ZTogcmVxcCAweCVseFxuIiwgKHVsb25nKSByZXFwKTsKLSAgICByZXR1cm47CisJQVNDX0RCRzEoMywgImFzY19lbnF1ZXVlOiByZXFwIDB4JWx4XG4iLCAodWxvbmcpcmVxcCk7CisJcmV0dXJuOwogfQogCiAvKgpAQCAtNzE4MCwzMSArNjAwMSwzMCBAQAogICoKICAqICdSRVFQTkVYVChyZXFwKScgcmV0dXJucyByZXFwJ3MgbmV4dCBwb2ludGVyLgogICovCi1TVEFUSUMgUkVRUAotYXNjX2RlcXVldWUoYXNjX3F1ZXVlX3QgKmFzY3EsIGludCB0aWQpCitzdGF0aWMgUkVRUCBhc2NfZGVxdWV1ZShhc2NfcXVldWVfdCAqYXNjcSwgaW50IHRpZCkKIHsKLSAgICBSRVFQICAgIHJlcXA7CisJUkVRUCByZXFwOwogCi0gICAgQVNDX0RCRzIoMywgImFzY19kZXF1ZXVlOiBhc2NxIDB4JWx4LCB0aWQgJWRcbiIsICh1bG9uZykgYXNjcSwgdGlkKTsKLSAgICBBU0NfQVNTRVJUKHRpZCA+PSAwICYmIHRpZCA8PSBBRFZfTUFYX1RJRCk7Ci0gICAgaWYgKChyZXFwID0gYXNjcS0+cV9maXJzdFt0aWRdKSAhPSBOVUxMKSB7Ci0gICAgICAgIEFTQ19BU1NFUlQoYXNjcS0+cV90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHRpZCkpOwotICAgICAgICBhc2NxLT5xX2ZpcnN0W3RpZF0gPSBSRVFQTkVYVChyZXFwKTsKLSAgICAgICAgLyogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCBjbGVhciBpdHMgYml0IGFuZCB0aGUgbGFzdCBwb2ludGVyLiAqLwotICAgICAgICBpZiAoYXNjcS0+cV9maXJzdFt0aWRdID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFzY3EtPnFfdGlkbWFzayAmPSB+QURWX1RJRF9UT19USURNQVNLKHRpZCk7Ci0gICAgICAgICAgICBBU0NfQVNTRVJUKGFzY3EtPnFfbGFzdFt0aWRdID09IHJlcXApOwotICAgICAgICAgICAgYXNjcS0+cV9sYXN0W3RpZF0gPSBOVUxMOwotICAgICAgICB9CisJQVNDX0RCRzIoMywgImFzY19kZXF1ZXVlOiBhc2NxIDB4JWx4LCB0aWQgJWRcbiIsICh1bG9uZylhc2NxLCB0aWQpOworCUFTQ19BU1NFUlQodGlkID49IDAgJiYgdGlkIDw9IEFEVl9NQVhfVElEKTsKKwlpZiAoKHJlcXAgPSBhc2NxLT5xX2ZpcnN0W3RpZF0pICE9IE5VTEwpIHsKKwkJQVNDX0FTU0VSVChhc2NxLT5xX3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0sodGlkKSk7CisJCWFzY3EtPnFfZmlyc3RbdGlkXSA9IFJFUVBORVhUKHJlcXApOworCQkvKiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIGNsZWFyIGl0cyBiaXQgYW5kIHRoZSBsYXN0IHBvaW50ZXIuICovCisJCWlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgeworCQkJYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKwkJCUFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gPT0gcmVxcCk7CisJCQlhc2NxLT5xX2xhc3RbdGlkXSA9IE5VTEw7CisJCX0KICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgICAgICAvKiBNYWludGFpbiByZXF1ZXN0IHF1ZXVlIHN0YXRpc3RpY3MuICovCi0gICAgICAgIGFzY3EtPnFfY3VyX2NudFt0aWRdLS07Ci0gICAgICAgIEFTQ19BU1NFUlQoYXNjcS0+cV9jdXJfY250W3RpZF0gPj0gMCk7Ci0gICAgICAgIFJFUVRJTUVTVEFUKCJhc2NfZGVxdWV1ZSIsIGFzY3EsIHJlcXAsIHRpZCk7CisJCS8qIE1haW50YWluIHJlcXVlc3QgcXVldWUgc3RhdGlzdGljcy4gKi8KKwkJYXNjcS0+cV9jdXJfY250W3RpZF0tLTsKKwkJQVNDX0FTU0VSVChhc2NxLT5xX2N1cl9jbnRbdGlkXSA+PSAwKTsKKwkJUkVRVElNRVNUQVQoImFzY19kZXF1ZXVlIiwgYXNjcSwgcmVxcCwgdGlkKTsKICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwotICAgIH0KLSAgICBBU0NfREJHMSgzLCAiYXNjX2RlcXVldWU6IHJlcXAgMHglbHhcbiIsICh1bG9uZykgcmVxcCk7Ci0gICAgcmV0dXJuIHJlcXA7CisJfQorCUFTQ19EQkcxKDMsICJhc2NfZGVxdWV1ZTogcmVxcCAweCVseFxuIiwgKHVsb25nKXJlcXApOworCXJldHVybiByZXFwOwogfQogCiAvKgpAQCAtNzIyNyw3NCArNjA0Nyw3NiBAQAogICogVW5mb3J0dW5hdGVseSBjb2xsZWN0aW5nIHF1ZXVpbmcgdGltZSBzdGF0aXN0aWNzIGFkZHMgb3ZlcmhlYWQgdG8KICAqIHRoZSBmdW5jdGlvbiB0aGF0IGlzbid0IGluaGVyZW50IHRvIHRoZSBmdW5jdGlvbidzIGFsZ29yaXRobS4KICAqLwotU1RBVElDIFJFUVAKLWFzY19kZXF1ZXVlX2xpc3QoYXNjX3F1ZXVlX3QgKmFzY3EsIFJFUVAgKmxhc3RwcCwgaW50IHRpZCkKK3N0YXRpYyBSRVFQIGFzY19kZXF1ZXVlX2xpc3QoYXNjX3F1ZXVlX3QgKmFzY3EsIFJFUVAgKmxhc3RwcCwgaW50IHRpZCkKIHsKLSAgICBSRVFQICAgIGZpcnN0cCwgbGFzdHA7Ci0gICAgaW50ICAgICBpOworCVJFUVAgZmlyc3RwLCBsYXN0cDsKKwlpbnQgaTsKIAotICAgIEFTQ19EQkcyKDMsICJhc2NfZGVxdWV1ZV9saXN0OiBhc2NxIDB4JWx4LCB0aWQgJWRcbiIsICh1bG9uZykgYXNjcSwgdGlkKTsKLSAgICBBU0NfQVNTRVJUKCh0aWQgPT0gQVNDX1RJRF9BTEwpIHx8ICh0aWQgPj0gMCAmJiB0aWQgPD0gQURWX01BWF9USUQpKTsKKwlBU0NfREJHMigzLCAiYXNjX2RlcXVldWVfbGlzdDogYXNjcSAweCVseCwgdGlkICVkXG4iLCAodWxvbmcpYXNjcSwgdGlkKTsKKwlBU0NfQVNTRVJUKCh0aWQgPT0gQVNDX1RJRF9BTEwpIHx8ICh0aWQgPj0gMCAmJiB0aWQgPD0gQURWX01BWF9USUQpKTsKIAotICAgIC8qCi0gICAgICogSWYgJ3RpZCcgaXMgbm90IEFTQ19USURfQUxMLCByZXR1cm4gcmVxdWVzdHMgb25seSBmb3IKLSAgICAgKiB0aGUgc3BlY2lmaWVkICd0aWQnLiBJZiAndGlkJyBpcyBBU0NfVElEX0FMTCwgcmV0dXJuIGFsbAotICAgICAqIHJlcXVlc3RzIGZvciBhbGwgdGlkcy4KLSAgICAgKi8KLSAgICBpZiAodGlkICE9IEFTQ19USURfQUxMKSB7Ci0gICAgICAgIC8qIFJldHVybiBhbGwgcmVxdWVzdHMgZm9yIHRoZSBzcGVjaWZpZWQgJ3RpZCcuICovCi0gICAgICAgIGlmICgoYXNjcS0+cV90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHRpZCkpID09IDApIHsKLSAgICAgICAgICAgIC8qIExpc3QgaXMgZW1wdHk7IFNldCBmaXJzdCBhbmQgbGFzdCByZXR1cm4gcG9pbnRlcnMgdG8gTlVMTC4gKi8KLSAgICAgICAgICAgIGZpcnN0cCA9IGxhc3RwID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0cCA9IGFzY3EtPnFfZmlyc3RbdGlkXTsKLSAgICAgICAgICAgIGxhc3RwID0gYXNjcS0+cV9sYXN0W3RpZF07Ci0gICAgICAgICAgICBhc2NxLT5xX2ZpcnN0W3RpZF0gPSBhc2NxLT5xX2xhc3RbdGlkXSA9IE5VTEw7Ci0gICAgICAgICAgICBhc2NxLT5xX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyh0aWQpOworCS8qCisJICogSWYgJ3RpZCcgaXMgbm90IEFTQ19USURfQUxMLCByZXR1cm4gcmVxdWVzdHMgb25seSBmb3IKKwkgKiB0aGUgc3BlY2lmaWVkICd0aWQnLiBJZiAndGlkJyBpcyBBU0NfVElEX0FMTCwgcmV0dXJuIGFsbAorCSAqIHJlcXVlc3RzIGZvciBhbGwgdGlkcy4KKwkgKi8KKwlpZiAodGlkICE9IEFTQ19USURfQUxMKSB7CisJCS8qIFJldHVybiBhbGwgcmVxdWVzdHMgZm9yIHRoZSBzcGVjaWZpZWQgJ3RpZCcuICovCisJCWlmICgoYXNjcS0+cV90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHRpZCkpID09IDApIHsKKwkJCS8qIExpc3QgaXMgZW1wdHk7IFNldCBmaXJzdCBhbmQgbGFzdCByZXR1cm4gcG9pbnRlcnMgdG8gTlVMTC4gKi8KKwkJCWZpcnN0cCA9IGxhc3RwID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWZpcnN0cCA9IGFzY3EtPnFfZmlyc3RbdGlkXTsKKwkJCWxhc3RwID0gYXNjcS0+cV9sYXN0W3RpZF07CisJCQlhc2NxLT5xX2ZpcnN0W3RpZF0gPSBhc2NxLT5xX2xhc3RbdGlkXSA9IE5VTEw7CisJCQlhc2NxLT5xX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyh0aWQpOwogI2lmZGVmIEFEVkFOU1lTX1NUQVRTCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkVRUCByZXFwOwotICAgICAgICAgICAgICAgIGFzY3EtPnFfY3VyX2NudFt0aWRdID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKHJlcXAgPSBmaXJzdHA7IHJlcXA7IHJlcXAgPSBSRVFQTkVYVChyZXFwKSkgewotICAgICAgICAgICAgICAgICAgICBSRVFUSU1FU1RBVCgiYXNjX2RlcXVldWVfbGlzdCIsIGFzY3EsIHJlcXAsIHRpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCQkJeworCQkJCVJFUVAgcmVxcDsKKwkJCQlhc2NxLT5xX2N1cl9jbnRbdGlkXSA9IDA7CisJCQkJZm9yIChyZXFwID0gZmlyc3RwOyByZXFwOyByZXFwID0gUkVRUE5FWFQocmVxcCkpIHsKKwkJCQkJUkVRVElNRVNUQVQoImFzY19kZXF1ZXVlX2xpc3QiLCBhc2NxLAorCQkJCQkJICAgIHJlcXAsIHRpZCk7CisJCQkJfQorCQkJfQogI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBSZXR1cm4gYWxsIHJlcXVlc3RzIGZvciBhbGwgdGlkcy4gKi8KLSAgICAgICAgZmlyc3RwID0gbGFzdHAgPSBOVUxMOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhc2NxLT5xX3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RwID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RwID0gYXNjcS0+cV9maXJzdFtpXTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdHAgPSBhc2NxLT5xX2xhc3RbaV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQVNDX0FTU0VSVChsYXN0cCAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdHAtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWFzY3EtPnFfZmlyc3RbaV07Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RwID0gYXNjcS0+cV9sYXN0W2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc2NxLT5xX2ZpcnN0W2ldID0gYXNjcS0+cV9sYXN0W2ldID0gTlVMTDsKLSAgICAgICAgICAgICAgICBhc2NxLT5xX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyhpKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJldHVybiBhbGwgcmVxdWVzdHMgZm9yIGFsbCB0aWRzLiAqLworCQlmaXJzdHAgPSBsYXN0cCA9IE5VTEw7CisJCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQkJaWYgKGFzY3EtPnFfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgeworCQkJCWlmIChmaXJzdHAgPT0gTlVMTCkgeworCQkJCQlmaXJzdHAgPSBhc2NxLT5xX2ZpcnN0W2ldOworCQkJCQlsYXN0cCA9IGFzY3EtPnFfbGFzdFtpXTsKKwkJCQl9IGVsc2UgeworCQkJCQlBU0NfQVNTRVJUKGxhc3RwICE9IE5VTEwpOworCQkJCQlsYXN0cC0+aG9zdF9zY3JpYmJsZSA9CisJCQkJCSAgICAodW5zaWduZWQgY2hhciAqKWFzY3EtPnFfZmlyc3RbaV07CisJCQkJCWxhc3RwID0gYXNjcS0+cV9sYXN0W2ldOworCQkJCX0KKwkJCQlhc2NxLT5xX2ZpcnN0W2ldID0gYXNjcS0+cV9sYXN0W2ldID0gTlVMTDsKKwkJCQlhc2NxLT5xX3RpZG1hc2sgJj0gfkFEVl9USURfVE9fVElETUFTSyhpKTsKICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgICAgICAgICAgICAgIGFzY3EtPnFfY3VyX2NudFtpXSA9IDA7CisJCQkJYXNjcS0+cV9jdXJfY250W2ldID0gMDsKICNlbmRpZiAvKiBBRFZBTlNZU19TVEFUUyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQl9CisJCX0KICNpZmRlZiBBRFZBTlNZU19TVEFUUwotICAgICAgICB7Ci0gICAgICAgICAgICBSRVFQIHJlcXA7Ci0gICAgICAgICAgICBmb3IgKHJlcXAgPSBmaXJzdHA7IHJlcXA7IHJlcXAgPSBSRVFQTkVYVChyZXFwKSkgewotICAgICAgICAgICAgICAgIFJFUVRJTUVTVEFUKCJhc2NfZGVxdWV1ZV9saXN0IiwgYXNjcSwgcmVxcCwgcmVxcC0+ZGV2aWNlLT5pZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJeworCQkJUkVRUCByZXFwOworCQkJZm9yIChyZXFwID0gZmlyc3RwOyByZXFwOyByZXFwID0gUkVRUE5FWFQocmVxcCkpIHsKKwkJCQlSRVFUSU1FU1RBVCgiYXNjX2RlcXVldWVfbGlzdCIsIGFzY3EsIHJlcXAsCisJCQkJCSAgICByZXFwLT5kZXZpY2UtPmlkKTsKKwkJCX0KKwkJfQogI2VuZGlmIC8qIEFEVkFOU1lTX1NUQVRTICovCi0gICAgfQotICAgIGlmIChsYXN0cHApIHsKLSAgICAgICAgKmxhc3RwcCA9IGxhc3RwOwotICAgIH0KLSAgICBBU0NfREJHMSgzLCAiYXNjX2RlcXVldWVfbGlzdDogZmlyc3RwIDB4JWx4XG4iLCAodWxvbmcpIGZpcnN0cCk7Ci0gICAgcmV0dXJuIGZpcnN0cDsKKwl9CisJaWYgKGxhc3RwcCkgeworCQkqbGFzdHBwID0gbGFzdHA7CisJfQorCUFTQ19EQkcxKDMsICJhc2NfZGVxdWV1ZV9saXN0OiBmaXJzdHAgMHglbHhcbiIsICh1bG9uZylmaXJzdHApOworCXJldHVybiBmaXJzdHA7CiB9CiAKIC8qCkBAIC03MzA3LDY3ICs2MTI5LDY3IEBACiAgKiBSZXR1cm4gQVNDX1RSVUUgaWYgdGhlIGNvbW1hbmQgd2FzIGZvdW5kIGFuZCByZW1vdmVkLAogICogb3RoZXJ3aXNlIHJldHVybiBBU0NfRkFMU0UuCiAgKi8KLVNUQVRJQyBpbnQKLWFzY19ybXF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBSRVFQIHJlcXApCitzdGF0aWMgaW50IGFzY19ybXF1ZXVlKGFzY19xdWV1ZV90ICphc2NxLCBSRVFQIHJlcXApCiB7Ci0gICAgUkVRUCAgICAgICAgY3VycnAsIHByZXZwOwotICAgIGludCAgICAgICAgIHRpZDsKLSAgICBpbnQgICAgICAgICByZXQgPSBBU0NfRkFMU0U7CisJUkVRUCBjdXJycCwgcHJldnA7CisJaW50IHRpZDsKKwlpbnQgcmV0ID0gQVNDX0ZBTFNFOwogCi0gICAgQVNDX0RCRzIoMywgImFzY19ybXF1ZXVlOiBhc2NxIDB4JWx4LCByZXFwIDB4JWx4XG4iLAotICAgICAgICAodWxvbmcpIGFzY3EsICh1bG9uZykgcmVxcCk7Ci0gICAgQVNDX0FTU0VSVChyZXFwICE9IE5VTEwpOworCUFTQ19EQkcyKDMsICJhc2Nfcm1xdWV1ZTogYXNjcSAweCVseCwgcmVxcCAweCVseFxuIiwKKwkJICh1bG9uZylhc2NxLCAodWxvbmcpcmVxcCk7CisJQVNDX0FTU0VSVChyZXFwICE9IE5VTEwpOwogCi0gICAgdGlkID0gUkVRUFRJRChyZXFwKTsKLSAgICBBU0NfQVNTRVJUKHRpZCA+PSAwICYmIHRpZCA8PSBBRFZfTUFYX1RJRCk7CisJdGlkID0gUkVRUFRJRChyZXFwKTsKKwlBU0NfQVNTRVJUKHRpZCA+PSAwICYmIHRpZCA8PSBBRFZfTUFYX1RJRCk7CiAKLSAgICAvKgotICAgICAqIEhhbmRsZSB0aGUgY29tbW9uIGNhc2Ugb2YgJ3JlcXAnIGJlaW5nIHRoZSBmaXJzdAotICAgICAqIGVudHJ5IG9uIHRoZSBxdWV1ZS4KLSAgICAgKi8KLSAgICBpZiAocmVxcCA9PSBhc2NxLT5xX2ZpcnN0W3RpZF0pIHsKLSAgICAgICAgcmV0ID0gQVNDX1RSVUU7Ci0gICAgICAgIGFzY3EtPnFfZmlyc3RbdGlkXSA9IFJFUVBORVhUKHJlcXApOwotICAgICAgICAvKiBJZiB0aGUgcXVldWUgaXMgbm93IGVtcHR5LCBjbGVhciBpdHMgYml0IGFuZCB0aGUgbGFzdCBwb2ludGVyLiAqLwotICAgICAgICBpZiAoYXNjcS0+cV9maXJzdFt0aWRdID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFzY3EtPnFfdGlkbWFzayAmPSB+QURWX1RJRF9UT19USURNQVNLKHRpZCk7Ci0gICAgICAgICAgICBBU0NfQVNTRVJUKGFzY3EtPnFfbGFzdFt0aWRdID09IHJlcXApOwotICAgICAgICAgICAgYXNjcS0+cV9sYXN0W3RpZF0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gIT0gTlVMTCkgewotICAgICAgICBBU0NfQVNTRVJUKGFzY3EtPnFfbGFzdFt0aWRdICE9IE5VTEwpOwotICAgICAgICAvKgotICAgICAgICAgKiBCZWNhdXNlIHRoZSBjYXNlIG9mICdyZXFwJyBiZWluZyB0aGUgZmlyc3QgZW50cnkgaGFzIGJlZW4KLSAgICAgICAgICogaGFuZGxlZCBhYm92ZSBhbmQgaXQgaXMga25vd24gdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgaWYKLSAgICAgICAgICogJ3JlcXAnIGlzIGZvdW5kIG9uIHRoZSBxdWV1ZSBpdCBpcyBndWFyYW50ZWVkIHRoZSBxdWV1ZSB3aWxsCi0gICAgICAgICAqIG5vdCBiZWNvbWUgZW1wdHkgYW5kIHRoYXQgJ3FfZmlyc3RbdGlkXScgd2lsbCBub3QgYmUgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogU2V0ICdwcmV2cCcgdG8gdGhlIGZpcnN0IGVudHJ5LCAnY3VycnAnIHRvIHRoZSBzZWNvbmQgZW50cnksCi0gICAgICAgICAqIGFuZCBzZWFyY2ggZm9yICdyZXFwJy4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAocHJldnAgPSBhc2NxLT5xX2ZpcnN0W3RpZF0sIGN1cnJwID0gUkVRUE5FWFQocHJldnApOwotICAgICAgICAgICAgIGN1cnJwOyBwcmV2cCA9IGN1cnJwLCBjdXJycCA9IFJFUVBORVhUKGN1cnJwKSkgewotICAgICAgICAgICAgaWYgKGN1cnJwID09IHJlcXApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBU0NfVFJVRTsKLSAgICAgICAgICAgICAgICBwcmV2cC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopUkVRUE5FWFQoY3VycnApOwotICAgICAgICAgICAgICAgIHJlcXAtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChhc2NxLT5xX2xhc3RbdGlkXSA9PSByZXFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzY3EtPnFfbGFzdFt0aWRdID0gcHJldnA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogSGFuZGxlIHRoZSBjb21tb24gY2FzZSBvZiAncmVxcCcgYmVpbmcgdGhlIGZpcnN0CisJICogZW50cnkgb24gdGhlIHF1ZXVlLgorCSAqLworCWlmIChyZXFwID09IGFzY3EtPnFfZmlyc3RbdGlkXSkgeworCQlyZXQgPSBBU0NfVFJVRTsKKwkJYXNjcS0+cV9maXJzdFt0aWRdID0gUkVRUE5FWFQocmVxcCk7CisJCS8qIElmIHRoZSBxdWV1ZSBpcyBub3cgZW1wdHksIGNsZWFyIGl0cyBiaXQgYW5kIHRoZSBsYXN0IHBvaW50ZXIuICovCisJCWlmIChhc2NxLT5xX2ZpcnN0W3RpZF0gPT0gTlVMTCkgeworCQkJYXNjcS0+cV90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKwkJCUFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gPT0gcmVxcCk7CisJCQlhc2NxLT5xX2xhc3RbdGlkXSA9IE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKGFzY3EtPnFfZmlyc3RbdGlkXSAhPSBOVUxMKSB7CisJCUFTQ19BU1NFUlQoYXNjcS0+cV9sYXN0W3RpZF0gIT0gTlVMTCk7CisJCS8qCisJCSAqIEJlY2F1c2UgdGhlIGNhc2Ugb2YgJ3JlcXAnIGJlaW5nIHRoZSBmaXJzdCBlbnRyeSBoYXMgYmVlbgorCQkgKiBoYW5kbGVkIGFib3ZlIGFuZCBpdCBpcyBrbm93biB0aGUgcXVldWUgaXMgbm90IGVtcHR5LCBpZgorCQkgKiAncmVxcCcgaXMgZm91bmQgb24gdGhlIHF1ZXVlIGl0IGlzIGd1YXJhbnRlZWQgdGhlIHF1ZXVlIHdpbGwKKwkJICogbm90IGJlY29tZSBlbXB0eSBhbmQgdGhhdCAncV9maXJzdFt0aWRdJyB3aWxsIG5vdCBiZSBjaGFuZ2VkLgorCQkgKgorCQkgKiBTZXQgJ3ByZXZwJyB0byB0aGUgZmlyc3QgZW50cnksICdjdXJycCcgdG8gdGhlIHNlY29uZCBlbnRyeSwKKwkJICogYW5kIHNlYXJjaCBmb3IgJ3JlcXAnLgorCQkgKi8KKwkJZm9yIChwcmV2cCA9IGFzY3EtPnFfZmlyc3RbdGlkXSwgY3VycnAgPSBSRVFQTkVYVChwcmV2cCk7CisJCSAgICAgY3VycnA7IHByZXZwID0gY3VycnAsIGN1cnJwID0gUkVRUE5FWFQoY3VycnApKSB7CisJCQlpZiAoY3VycnAgPT0gcmVxcCkgeworCQkJCXJldCA9IEFTQ19UUlVFOworCQkJCXByZXZwLT5ob3N0X3NjcmliYmxlID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKilSRVFQTkVYVChjdXJycCk7CisJCQkJcmVxcC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CisJCQkJaWYgKGFzY3EtPnFfbGFzdFt0aWRdID09IHJlcXApIHsKKwkJCQkJYXNjcS0+cV9sYXN0W3RpZF0gPSBwcmV2cDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CiAjaWZkZWYgQURWQU5TWVNfU1RBVFMKLSAgICAvKiBNYWludGFpbiByZXF1ZXN0IHF1ZXVlIHN0YXRpc3RpY3MuICovCi0gICAgaWYgKHJldCA9PSBBU0NfVFJVRSkgewotICAgICAgICBhc2NxLT5xX2N1cl9jbnRbdGlkXS0tOwotICAgICAgICBSRVFUSU1FU1RBVCgiYXNjX3JtcXVldWUiLCBhc2NxLCByZXFwLCB0aWQpOwotICAgIH0KLSAgICBBU0NfQVNTRVJUKGFzY3EtPnFfY3VyX2NudFt0aWRdID49IDApOworCS8qIE1haW50YWluIHJlcXVlc3QgcXVldWUgc3RhdGlzdGljcy4gKi8KKwlpZiAocmV0ID09IEFTQ19UUlVFKSB7CisJCWFzY3EtPnFfY3VyX2NudFt0aWRdLS07CisJCVJFUVRJTUVTVEFUKCJhc2Nfcm1xdWV1ZSIsIGFzY3EsIHJlcXAsIHRpZCk7CisJfQorCUFTQ19BU1NFUlQoYXNjcS0+cV9jdXJfY250W3RpZF0gPj0gMCk7CiAjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KLSAgICBBU0NfREJHMigzLCAiYXNjX3JtcXVldWU6IHJlcXAgMHglbHgsIHJldCAlZFxuIiwgKHVsb25nKSByZXFwLCByZXQpOwotICAgIHJldHVybiByZXQ7CisJQVNDX0RCRzIoMywgImFzY19ybXF1ZXVlOiByZXFwIDB4JWx4LCByZXQgJWRcbiIsICh1bG9uZylyZXFwLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC03Mzc1LDM3ICs2MTk3LDM4IEBACiAgKgogICogQ2FsbHMgYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKCkgdG8gZXhlY3V0ZSBhIFJFUVAvc3RydWN0IHNjc2lfY21uZC4KICAqLwotU1RBVElDIHZvaWQKLWFzY19leGVjdXRlX3F1ZXVlKGFzY19xdWV1ZV90ICphc2NxKQorc3RhdGljIHZvaWQgYXNjX2V4ZWN1dGVfcXVldWUoYXNjX3F1ZXVlX3QgKmFzY3EpCiB7Ci0gICAgQURWX1NDU0lfQklUX0lEX1RZUEUgICAgc2Nhbl90aWRtYXNrOwotICAgIFJFUVAgICAgICAgICAgICAgICAgICAgIHJlcXA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgaTsKKwlBRFZfU0NTSV9CSVRfSURfVFlQRSBzY2FuX3RpZG1hc2s7CisJUkVRUCByZXFwOworCWludCBpOwogCi0gICAgQVNDX0RCRzEoMSwgImFzY19leGVjdXRlX3F1ZXVlOiBhc2NxIDB4JWx4XG4iLCAodWxvbmcpIGFzY3EpOwotICAgIC8qCi0gICAgICogRXhlY3V0ZSBxdWV1ZWQgY29tbWFuZHMgZm9yIGRldmljZXMgYXR0YWNoZWQgdG8KLSAgICAgKiB0aGUgY3VycmVudCBib2FyZCBpbiByb3VuZC1yb2JpbiBmYXNoaW9uLgotICAgICAqLwotICAgIHNjYW5fdGlkbWFzayA9IGFzY3EtPnFfdGlkbWFzazsKLSAgICBkbyB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgewotICAgICAgICAgICAgaWYgKHNjYW5fdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgewotICAgICAgICAgICAgICAgIGlmICgocmVxcCA9IGFzY19kZXF1ZXVlKGFzY3EsIGkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5fdGlkbWFzayAmPSB+QURWX1RJRF9UT19USURNQVNLKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNjX2V4ZWN1dGVfc2NzaV9jbW5kKChzdHJ1Y3Qgc2NzaV9jbW5kICopIHJlcXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVNDX0JVU1kpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Nhbl90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0soaSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSByZXF1ZXN0IHJldHVybmVkIEFTQ19CVVNZLiBFbnF1ZXVlIGF0IHRoZSBmcm9udCBvZgotICAgICAgICAgICAgICAgICAgICAgKiB0YXJnZXQncyB3YWl0aW5nIGxpc3QgdG8gbWFpbnRhaW4gY29ycmVjdCBvcmRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGFzY19lbnF1ZXVlKGFzY3EsIHJlcXAsIEFTQ19GUk9OVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoc2Nhbl90aWRtYXNrKTsKLSAgICByZXR1cm47CisJQVNDX0RCRzEoMSwgImFzY19leGVjdXRlX3F1ZXVlOiBhc2NxIDB4JWx4XG4iLCAodWxvbmcpYXNjcSk7CisJLyoKKwkgKiBFeGVjdXRlIHF1ZXVlZCBjb21tYW5kcyBmb3IgZGV2aWNlcyBhdHRhY2hlZCB0bworCSAqIHRoZSBjdXJyZW50IGJvYXJkIGluIHJvdW5kLXJvYmluIGZhc2hpb24uCisJICovCisJc2Nhbl90aWRtYXNrID0gYXNjcS0+cV90aWRtYXNrOworCWRvIHsKKwkJZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisJCQlpZiAoc2Nhbl90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSB7CisJCQkJaWYgKChyZXFwID0gYXNjX2RlcXVldWUoYXNjcSwgaSkpID09IE5VTEwpIHsKKwkJCQkJc2Nhbl90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0soaSk7CisJCQkJfSBlbHNlCisJCQkJICAgIGlmIChhc2NfZXhlY3V0ZV9zY3NpX2NtbmQKKwkJCQkJKChzdHJ1Y3Qgc2NzaV9jbW5kICopcmVxcCkKKwkJCQkJPT0gQVNDX0JVU1kpIHsKKwkJCQkJc2Nhbl90aWRtYXNrICY9IH5BRFZfVElEX1RPX1RJRE1BU0soaSk7CisJCQkJCS8qCisJCQkJCSAqIFRoZSByZXF1ZXN0IHJldHVybmVkIEFTQ19CVVNZLiBFbnF1ZXVlIGF0IHRoZSBmcm9udCBvZgorCQkJCQkgKiB0YXJnZXQncyB3YWl0aW5nIGxpc3QgdG8gbWFpbnRhaW4gY29ycmVjdCBvcmRlcmluZy4KKwkJCQkJICovCisJCQkJCWFzY19lbnF1ZXVlKGFzY3EsIHJlcXAsIEFTQ19GUk9OVCk7CisJCQkJfQorCQkJfQorCQl9CisJfSB3aGlsZSAoc2Nhbl90aWRtYXNrKTsKKwlyZXR1cm47CiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtNzQyMCwxMDIgKzYyNDMsMTAyIEBACiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgogICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCiAgKi8KLVNUQVRJQyBpbnQKLWFzY19wcnRfYm9hcmRfZGV2aWNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCitzdGF0aWMgaW50IGFzY19wcnRfYm9hcmRfZGV2aWNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqY3AsIGludCBjcGxlbikKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKLSAgICBpbnQgICAgICAgICAgICAgICAgbGVmdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgdG90bGVuOwotICAgIGludCAgICAgICAgICAgICAgICBsZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgaTsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOworCWludCBsZWZ0bGVuOworCWludCB0b3RsZW47CisJaW50IGxlbjsKKwlpbnQgY2hpcF9zY3NpX2lkOworCWludCBpOwogCi0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOwotICAgIGxlZnRsZW4gPSBjcGxlbjsKLSAgICB0b3RsZW4gPSBsZW4gPSAwOworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2hvc3QpOworCWxlZnRsZW4gPSBjcGxlbjsKKwl0b3RsZW4gPSBsZW4gPSAwOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIlxuRGV2aWNlIEluZm9ybWF0aW9uIGZvciBBZHZhblN5cyBTQ1NJIEhvc3QgJWQ6XG4iLCBzaHAtPmhvc3Rfbm8pOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCSAgICJcbkRldmljZSBJbmZvcm1hdGlvbiBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwKKwkJCSAgIHNob3N0LT5ob3N0X25vKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKLSAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmNoaXBfc2NzaV9pZDsKLSAgICB9IGVsc2UgewotICAgICAgICBjaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuY2hpcF9zY3NpX2lkOwotICAgIH0KKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCWNoaXBfc2NzaV9pZCA9IGJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZy5jaGlwX3Njc2lfaWQ7CisJfSBlbHNlIHsKKwkJY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyLmNoaXBfc2NzaV9pZDsKKwl9CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJUYXJnZXQgSURzIERldGVjdGVkOiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgewotICAgICAgICBpZiAoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpIHsKLSAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWCwiLCBpKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAoJVg9SG9zdCBBZGFwdGVyKVxuIiwgY2hpcF9zY3NpX2lkKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJUYXJnZXQgSURzIERldGVjdGVkOiIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQlpZiAoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWCwiLCBpKTsKKwkJCUFTQ19QUlRfTkVYVCgpOworCQl9CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAoJVg9SG9zdCBBZGFwdGVyKVxuIiwgY2hpcF9zY3NpX2lkKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIHJldHVybiB0b3RsZW47CisJcmV0dXJuIHRvdGxlbjsKIH0KIAogLyoKICAqIERpc3BsYXkgV2lkZSBCb2FyZCBCSU9TIEluZm9ybWF0aW9uLgogICovCi1TVEFUSUMgaW50Ci1hc2NfcHJ0X2Fkdl9iaW9zKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3N0YXRpYyBpbnQgYXNjX3BydF9hZHZfYmlvcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqY3AsIGludCBjcGxlbikKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgKmJvYXJkcDsKLSAgICBpbnQgICAgICAgICAgICAgICAgbGVmdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgdG90bGVuOwotICAgIGludCAgICAgICAgICAgICAgICBsZW47Ci0gICAgdXNob3J0ICAgICAgICAgICAgIG1ham9yLCBtaW5vciwgbGV0dGVyOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJaW50IGxlZnRsZW47CisJaW50IHRvdGxlbjsKKwlpbnQgbGVuOworCXVzaG9ydCBtYWpvciwgbWlub3IsIGxldHRlcjsKIAotICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKLSAgICBsZWZ0bGVuID0gY3BsZW47Ci0gICAgdG90bGVuID0gbGVuID0gMDsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlsZWZ0bGVuID0gY3BsZW47CisJdG90bGVuID0gbGVuID0gMDsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuUk9NIEJJT1MgVmVyc2lvbjogIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG5ST00gQklPUyBWZXJzaW9uOiAiKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIC8qCi0gICAgICogSWYgdGhlIEJJT1Mgc2F2ZWQgYSB2YWxpZCBzaWduYXR1cmUsIHRoZW4gZmlsbCBpbgotICAgICAqIHRoZSBCSU9TIGNvZGUgc2VnbWVudCBiYXNlIGFkZHJlc3MuCi0gICAgICovCi0gICAgaWYgKGJvYXJkcC0+Ymlvc19zaWduYXR1cmUgIT0gMHg1NUFBKSB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIkRpc2FibGVkIG9yIFByZS0zLjFcbiIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIkJJT1MgZWl0aGVyIGRpc2FibGVkIG9yIFByZS0zLjEuIElmIGl0IGlzIHByZS0zLjEsIHRoZW4gYSBuZXdlciB2ZXJzaW9uXG4iKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSJjYW4gYmUgZm91bmQgYXQgdGhlIENvbm5lY3RDb20gRlRQIHNpdGU6IGZ0cDovL2Z0cC5jb25uZWN0Y29tLm5ldC9wdWJcbiIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtYWpvciA9IChib2FyZHAtPmJpb3NfdmVyc2lvbiA+PiAxMikgJiAweEY7Ci0gICAgICAgIG1pbm9yID0gKGJvYXJkcC0+Ymlvc192ZXJzaW9uID4+IDgpICYgMHhGOwotICAgICAgICBsZXR0ZXIgPSAoYm9hcmRwLT5iaW9zX3ZlcnNpb24gJiAweEZGKTsKKwkvKgorCSAqIElmIHRoZSBCSU9TIHNhdmVkIGEgdmFsaWQgc2lnbmF0dXJlLCB0aGVuIGZpbGwgaW4KKwkgKiB0aGUgQklPUyBjb2RlIHNlZ21lbnQgYmFzZSBhZGRyZXNzLgorCSAqLworCWlmIChib2FyZHAtPmJpb3Nfc2lnbmF0dXJlICE9IDB4NTVBQSkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJEaXNhYmxlZCBvciBQcmUtMy4xXG4iKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkgICAiQklPUyBlaXRoZXIgZGlzYWJsZWQgb3IgUHJlLTMuMS4gSWYgaXQgaXMgcHJlLTMuMSwgdGhlbiBhIG5ld2VyIHZlcnNpb25cbiIpOworCQlBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCSAgICJjYW4gYmUgZm91bmQgYXQgdGhlIENvbm5lY3RDb20gRlRQIHNpdGU6IGZ0cDovL2Z0cC5jb25uZWN0Y29tLm5ldC9wdWJcbiIpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9IGVsc2UgeworCQltYWpvciA9IChib2FyZHAtPmJpb3NfdmVyc2lvbiA+PiAxMikgJiAweEY7CisJCW1pbm9yID0gKGJvYXJkcC0+Ymlvc192ZXJzaW9uID4+IDgpICYgMHhGOworCQlsZXR0ZXIgPSAoYm9hcmRwLT5iaW9zX3ZlcnNpb24gJiAweEZGKTsKIAotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIlZC4lZCVjXG4iLAotICAgICAgICAgICAgbWFqb3IsIG1pbm9yLCBsZXR0ZXIgPj0gMjYgPyAnPycgOiBsZXR0ZXIgKyAnQScpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiJWQuJWQlY1xuIiwKKwkJCQkgICBtYWpvciwgbWlub3IsCisJCQkJICAgbGV0dGVyID49IDI2ID8gJz8nIDogbGV0dGVyICsgJ0EnKTsKKwkJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQ3VycmVudCBhdmFpbGFibGUgUk9NIEJJT1MgcmVsZWFzZSBpcyAzLjFJIGZvciBVVwotICAgICAgICAgKiBhbmQgMy4ySSBmb3IgVTJXLiBUaGlzIGNvZGUgZG9lc24ndCBkaWZmZXJlbnRpYXRlCi0gICAgICAgICAqIFVXIGFuZCBVMlcgYm9hcmRzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1ham9yIDwgMyB8fCAobWFqb3IgPD0gMyAmJiBtaW5vciA8IDEpIHx8Ci0gICAgICAgICAgICAobWFqb3IgPD0gMyAmJiBtaW5vciA8PSAxICYmIGxldHRlciA8ICgnSSctICdBJykpKSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iTmV3ZXIgdmVyc2lvbiBvZiBST00gQklPUyBpcyBhdmFpbGFibGUgYXQgdGhlIENvbm5lY3RDb20gRlRQIHNpdGU6XG4iKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotImZ0cDovL2Z0cC5jb25uZWN0Y29tLm5ldC9wdWJcbiIpOwotICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgICAgIH0KLSAgICB9CisJCS8qCisJCSAqIEN1cnJlbnQgYXZhaWxhYmxlIFJPTSBCSU9TIHJlbGVhc2UgaXMgMy4xSSBmb3IgVVcKKwkJICogYW5kIDMuMkkgZm9yIFUyVy4gVGhpcyBjb2RlIGRvZXNuJ3QgZGlmZmVyZW50aWF0ZQorCQkgKiBVVyBhbmQgVTJXIGJvYXJkcy4KKwkJICovCisJCWlmIChtYWpvciA8IDMgfHwgKG1ham9yIDw9IDMgJiYgbWlub3IgPCAxKSB8fAorCQkgICAgKG1ham9yIDw9IDMgJiYgbWlub3IgPD0gMSAmJiBsZXR0ZXIgPCAoJ0knIC0gJ0EnKSkpIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkJICAgIk5ld2VyIHZlcnNpb24gb2YgUk9NIEJJT1MgaXMgYXZhaWxhYmxlIGF0IHRoZSBDb25uZWN0Q29tIEZUUCBzaXRlOlxuIik7CisJCQlBU0NfUFJUX05FWFQoKTsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkJICAgImZ0cDovL2Z0cC5jb25uZWN0Y29tLm5ldC9wdWJcbiIpOworCQkJQVNDX1BSVF9ORVhUKCk7CisJCX0KKwl9CiAKLSAgICByZXR1cm4gdG90bGVuOworCXJldHVybiB0b3RsZW47CiB9CiAKIC8qCkBAIC03NTQxLDgwICs2MzY0LDc5IEBACiAgKgogICogUmV0dXJucyBBU0NfVFJVRSBpZiBzZXJpYWwgbnVtYmVyIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBBU0NfRkFMU0UuCiAgKi8KLVNUQVRJQyBpbnQKLWFzY19nZXRfZWVwcm9tX3N0cmluZyh1c2hvcnQgKnNlcmlhbG51bSwgdWNoYXIgKmNwKQorc3RhdGljIGludCBhc2NfZ2V0X2VlcHJvbV9zdHJpbmcodXNob3J0ICpzZXJpYWxudW0sIHVjaGFyICpjcCkKIHsKLSAgICB1c2hvcnQgICAgICB3LCBudW07CisJdXNob3J0IHcsIG51bTsKIAotICAgIGlmICgoc2VyaWFsbnVtWzFdICYgMHhGRTAwKSAhPSAoKHVzaG9ydCkgMHhBQSA8PCA4KSkgewotICAgICAgICByZXR1cm4gQVNDX0ZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEZpcnN0IHdvcmQgLSA2IGRpZ2l0cy4KLSAgICAgICAgICovCi0gICAgICAgIHcgPSBzZXJpYWxudW1bMF07CisJaWYgKChzZXJpYWxudW1bMV0gJiAweEZFMDApICE9ICgodXNob3J0KTB4QUEgPDwgOCkpIHsKKwkJcmV0dXJuIEFTQ19GQUxTRTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGaXJzdCB3b3JkIC0gNiBkaWdpdHMuCisJCSAqLworCQl3ID0gc2VyaWFsbnVtWzBdOwogCi0gICAgICAgIC8qIFByb2R1Y3QgdHlwZSAtIDFzdCBkaWdpdC4gKi8KLSAgICAgICAgaWYgKCgqY3AgPSAnQScgKyAoKHcgJiAweEUwMDApID4+IDEzKSkgPT0gJ0gnKSB7Ci0gICAgICAgICAgICAvKiBQcm9kdWN0IHR5cGUgaXMgUD1Qcm90b3R5cGUgKi8KLSAgICAgICAgICAgICpjcCArPSAweDg7Ci0gICAgICAgIH0KLSAgICAgICAgY3ArKzsKKwkJLyogUHJvZHVjdCB0eXBlIC0gMXN0IGRpZ2l0LiAqLworCQlpZiAoKCpjcCA9ICdBJyArICgodyAmIDB4RTAwMCkgPj4gMTMpKSA9PSAnSCcpIHsKKwkJCS8qIFByb2R1Y3QgdHlwZSBpcyBQPVByb3RvdHlwZSAqLworCQkJKmNwICs9IDB4ODsKKwkJfQorCQljcCsrOwogCi0gICAgICAgIC8qIE1hbnVmYWN0dXJpbmcgbG9jYXRpb24gLSAybmQgZGlnaXQuICovCi0gICAgICAgICpjcCsrID0gJ0EnICsgKCh3ICYgMHgxQzAwKSA+PiAxMCk7CisJCS8qIE1hbnVmYWN0dXJpbmcgbG9jYXRpb24gLSAybmQgZGlnaXQuICovCisJCSpjcCsrID0gJ0EnICsgKCh3ICYgMHgxQzAwKSA+PiAxMCk7CiAKLSAgICAgICAgLyogUHJvZHVjdCBJRCAtIDNyZCwgNHRoIGRpZ2l0cy4gKi8KLSAgICAgICAgbnVtID0gdyAmIDB4M0ZGOwotICAgICAgICAqY3ArKyA9ICcwJyArIChudW0gLyAxMDApOwotICAgICAgICBudW0gJT0gMTAwOwotICAgICAgICAqY3ArKyA9ICcwJyArIChudW0gLyAxMCk7CisJCS8qIFByb2R1Y3QgSUQgLSAzcmQsIDR0aCBkaWdpdHMuICovCisJCW51bSA9IHcgJiAweDNGRjsKKwkJKmNwKysgPSAnMCcgKyAobnVtIC8gMTAwKTsKKwkJbnVtICU9IDEwMDsKKwkJKmNwKysgPSAnMCcgKyAobnVtIC8gMTApOwogCi0gICAgICAgIC8qIFByb2R1Y3QgcmV2aXNpb24gLSA1dGggZGlnaXQuICovCi0gICAgICAgICpjcCsrID0gJ0EnICsgKG51bSAlIDEwKTsKKwkJLyogUHJvZHVjdCByZXZpc2lvbiAtIDV0aCBkaWdpdC4gKi8KKwkJKmNwKysgPSAnQScgKyAobnVtICUgMTApOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNlY29uZCB3b3JkCi0gICAgICAgICAqLwotICAgICAgICB3ID0gc2VyaWFsbnVtWzFdOworCQkvKgorCQkgKiBTZWNvbmQgd29yZAorCQkgKi8KKwkJdyA9IHNlcmlhbG51bVsxXTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBZZWFyIC0gNnRoIGRpZ2l0LgotICAgICAgICAgKgotICAgICAgICAgKiBJZiBiaXQgMTUgb2YgdGhpcmQgd29yZCBpcyBzZXQsIHRoZW4gdGhlCi0gICAgICAgICAqIGxhc3QgZGlnaXQgb2YgdGhlIHllYXIgaXMgZ3JlYXRlciB0aGFuIDcuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc2VyaWFsbnVtWzJdICYgMHg4MDAwKSB7Ci0gICAgICAgICAgICAqY3ArKyA9ICc4JyArICgodyAmIDB4MUMwKSA+PiA2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpjcCsrID0gJzAnICsgKCh3ICYgMHgxQzApID4+IDYpOwotICAgICAgICB9CisJCS8qCisJCSAqIFllYXIgLSA2dGggZGlnaXQuCisJCSAqCisJCSAqIElmIGJpdCAxNSBvZiB0aGlyZCB3b3JkIGlzIHNldCwgdGhlbiB0aGUKKwkJICogbGFzdCBkaWdpdCBvZiB0aGUgeWVhciBpcyBncmVhdGVyIHRoYW4gNy4KKwkJICovCisJCWlmIChzZXJpYWxudW1bMl0gJiAweDgwMDApIHsKKwkJCSpjcCsrID0gJzgnICsgKCh3ICYgMHgxQzApID4+IDYpOworCQl9IGVsc2UgeworCQkJKmNwKysgPSAnMCcgKyAoKHcgJiAweDFDMCkgPj4gNik7CisJCX0KIAotICAgICAgICAvKiBXZWVrIG9mIHllYXIgLSA3dGgsIDh0aCBkaWdpdHMuICovCi0gICAgICAgIG51bSA9IHcgJiAweDAwM0Y7Ci0gICAgICAgICpjcCsrID0gJzAnICsgbnVtIC8gMTA7Ci0gICAgICAgIG51bSAlPSAxMDsKLSAgICAgICAgKmNwKysgPSAnMCcgKyBudW07CisJCS8qIFdlZWsgb2YgeWVhciAtIDd0aCwgOHRoIGRpZ2l0cy4gKi8KKwkJbnVtID0gdyAmIDB4MDAzRjsKKwkJKmNwKysgPSAnMCcgKyBudW0gLyAxMDsKKwkJbnVtICU9IDEwOworCQkqY3ArKyA9ICcwJyArIG51bTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBUaGlyZCB3b3JkCi0gICAgICAgICAqLwotICAgICAgICB3ID0gc2VyaWFsbnVtWzJdICYgMHg3RkZGOworCQkvKgorCQkgKiBUaGlyZCB3b3JkCisJCSAqLworCQl3ID0gc2VyaWFsbnVtWzJdICYgMHg3RkZGOwogCi0gICAgICAgIC8qIFNlcmlhbCBudW1iZXIgLSA5dGggZGlnaXQuICovCi0gICAgICAgICpjcCsrID0gJ0EnICsgKHcgLyAxMDAwKTsKKwkJLyogU2VyaWFsIG51bWJlciAtIDl0aCBkaWdpdC4gKi8KKwkJKmNwKysgPSAnQScgKyAodyAvIDEwMDApOwogCi0gICAgICAgIC8qIDEwdGgsIDExdGgsIDEydGggZGlnaXRzLiAqLwotICAgICAgICBudW0gPSB3ICUgMTAwMDsKLSAgICAgICAgKmNwKysgPSAnMCcgKyBudW0gLyAxMDA7Ci0gICAgICAgIG51bSAlPSAxMDA7Ci0gICAgICAgICpjcCsrID0gJzAnICsgbnVtIC8gMTA7Ci0gICAgICAgIG51bSAlPSAxMDsKLSAgICAgICAgKmNwKysgPSAnMCcgKyBudW07CisJCS8qIDEwdGgsIDExdGgsIDEydGggZGlnaXRzLiAqLworCQludW0gPSB3ICUgMTAwMDsKKwkJKmNwKysgPSAnMCcgKyBudW0gLyAxMDA7CisJCW51bSAlPSAxMDA7CisJCSpjcCsrID0gJzAnICsgbnVtIC8gMTA7CisJCW51bSAlPSAxMDsKKwkJKmNwKysgPSAnMCcgKyBudW07CiAKLSAgICAgICAgKmNwID0gJ1wwJzsgICAgIC8qIE51bGwgVGVybWluYXRlIHRoZSBzdHJpbmcuICovCi0gICAgICAgIHJldHVybiBBU0NfVFJVRTsKLSAgICB9CisJCSpjcCA9ICdcMCc7CS8qIE51bGwgVGVybWluYXRlIHRoZSBzdHJpbmcuICovCisJCXJldHVybiBBU0NfVFJVRTsKKwl9CiB9CiAKIC8qCkBAIC03NjI4LDEyMiArNjQ1MCwxMjcgQEAKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gJ2NwJy4gTm8gbW9yZSB0aGFuCiAgKiAnY3BsZW4nIGNoYXJhY3RlcnMgd2lsbCBiZSBjb3BpZWQgdG8gJ2NwJy4KICAqLwotU1RBVElDIGludAotYXNjX3BydF9hc2NfYm9hcmRfZWVwcm9tKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3N0YXRpYyBpbnQgYXNjX3BydF9hc2NfYm9hcmRfZWVwcm9tKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpjcCwgaW50IGNwbGVuKQogewotICAgIGFzY19ib2FyZF90ICAgICAgICAqYm9hcmRwOwotICAgIEFTQ19EVkNfVkFSICAgICAgICAqYXNjX2R2Y192YXJwOwotICAgIGludCAgICAgICAgICAgICAgICBsZWZ0bGVuOwotICAgIGludCAgICAgICAgICAgICAgICB0b3RsZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgIGxlbjsKLSAgICBBU0NFRVBfQ09ORklHICAgICAgKmVwOwotICAgIGludCAgICAgICAgICAgICAgICBpOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJQVNDX0RWQ19WQVIgKmFzY19kdmNfdmFycDsKKwlpbnQgbGVmdGxlbjsKKwlpbnQgdG90bGVuOworCWludCBsZW47CisJQVNDRUVQX0NPTkZJRyAqZXA7CisJaW50IGk7CiAjaWZkZWYgQ09ORklHX0lTQQotICAgIGludCAgICAgICAgICAgICAgICBpc2FfZG1hX3NwZWVkW10gPSB7IDEwLCA4LCA3LCA2LCA1LCA0LCAzLCAyIH07CisJaW50IGlzYV9kbWFfc3BlZWRbXSA9IHsgMTAsIDgsIDcsIDYsIDUsIDQsIDMsIDIgfTsKICNlbmRpZiAvKiBDT05GSUdfSVNBICovCi0gICAgdWNoYXIgICAgICAgICAgICAgIHNlcmlhbHN0clsxM107CisJdWNoYXIgc2VyaWFsc3RyWzEzXTsKIAotICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKLSAgICBhc2NfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFzY19kdmNfdmFyOwotICAgIGVwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hc2NfZWVwOworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2hvc3QpOworCWFzY19kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7CisJZXAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFzY19lZXA7CiAKLSAgICBsZWZ0bGVuID0gY3BsZW47Ci0gICAgdG90bGVuID0gbGVuID0gMDsKKwlsZWZ0bGVuID0gY3BsZW47CisJdG90bGVuID0gbGVuID0gMDsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSJcbkVFUFJPTSBTZXR0aW5ncyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiXG5FRVBST00gU2V0dGluZ3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCisJCQkgICBzaG9zdC0+aG9zdF9ubyk7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBpZiAoYXNjX2dldF9lZXByb21fc3RyaW5nKCh1c2hvcnQgKikgJmVwLT5hZGFwdGVyX2luZm9bMF0sIHNlcmlhbHN0cikgPT0KLSAgICAgICAgQVNDX1RSVUUpIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFNlcmlhbCBOdW1iZXI6ICVzXG4iLCBzZXJpYWxzdHIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZXAtPmFkYXB0ZXJfaW5mb1s1XSA9PSAweEJCKSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0gICAgICAgICAgICAgICAgIiBEZWZhdWx0IFNldHRpbmdzIFVzZWQgZm9yIEVFUFJPTS1sZXNzIEFkYXB0ZXIuXG4iKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotICAgICAgICAgICAgICAgICIgU2VyaWFsIE51bWJlciBTaWduYXR1cmUgTm90IFByZXNlbnQuXG4iKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9Ci0gICAgfQorCWlmIChhc2NfZ2V0X2VlcHJvbV9zdHJpbmcoKHVzaG9ydCAqKSZlcC0+YWRhcHRlcl9pbmZvWzBdLCBzZXJpYWxzdHIpCisJICAgID09IEFTQ19UUlVFKSB7CisJCWxlbiA9CisJCSAgICBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQkJIHNlcmlhbHN0cik7CisJCUFTQ19QUlRfTkVYVCgpOworCX0gZWxzZSB7CisJCWlmIChlcC0+YWRhcHRlcl9pbmZvWzVdID09IDB4QkIpIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkJICAgIiBEZWZhdWx0IFNldHRpbmdzIFVzZWQgZm9yIEVFUFJPTS1sZXNzIEFkYXB0ZXIuXG4iKTsKKwkJCUFTQ19QUlRfTkVYVCgpOworCQl9IGVsc2UgeworCQkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCQkgICAiIFNlcmlhbCBOdW1iZXIgU2lnbmF0dXJlIE5vdCBQcmVzZW50LlxuIik7CisJCQlBU0NfUFJUX05FWFQoKTsKKwkJfQorCX0KIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgSG9zdCBTQ1NJIElEOiAldSwgSG9zdCBRdWV1ZSBTaXplOiAldSwgRGV2aWNlIFF1ZXVlIFNpemU6ICV1XG4iLAotICAgICAgICBBU0NfRUVQX0dFVF9DSElQX0lEKGVwKSwgZXAtPm1heF90b3RhbF9xbmcsIGVwLT5tYXhfdGFnX3FuZyk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBIb3N0IFNDU0kgSUQ6ICV1LCBIb3N0IFF1ZXVlIFNpemU6ICV1LCBEZXZpY2UgUXVldWUgU2l6ZTogJXVcbiIsCisJCQkgICBBU0NfRUVQX0dFVF9DSElQX0lEKGVwKSwgZXAtPm1heF90b3RhbF9xbmcsCisJCQkgICBlcC0+bWF4X3RhZ19xbmcpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBjbnRsIDB4JXgsIG5vX3NjYW0gMHgleFxuIiwKLSAgICAgICAgZXAtPmNudGwsIGVwLT5ub19zY2FtKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiIGNudGwgMHgleCwgbm9fc2NhbSAweCV4XG4iLCBlcC0+Y250bCwgZXAtPm5vX3NjYW0pOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBUYXJnZXQgSUQ6ICAgICAgICAgICAiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVkIiwgaSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBUYXJnZXQgSUQ6ICAgICAgICAgICAiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVkIiwgaSk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBEaXNjb25uZWN0czogICAgICAgICAiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKLSAgICAgICAgICAgIChlcC0+ZGlzY19lbmFibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIERpc2Nvbm5lY3RzOiAgICAgICAgICIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorCQkJCSAgIChlcC0+CisJCQkJICAgIGRpc2NfZW5hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6CisJCQkJICAgJ04nKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIENvbW1hbmQgUXVldWluZzogICAgICIpOwotICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgewotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAotICAgICAgICAgICAgKGVwLT51c2VfY21kX3FuZyAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQ29tbWFuZCBRdWV1aW5nOiAgICAgIik7CisJQVNDX1BSVF9ORVhUKCk7CisJZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisJCQkJICAgKGVwLT4KKwkJCQkgICAgdXNlX2NtZF9xbmcgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDoKKwkJCQkgICAnTicpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgU3RhcnQgTW90b3I6ICAgICAgICAgIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCi0gICAgICAgICAgICAoZXAtPnN0YXJ0X21vdG9yICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBTdGFydCBNb3RvcjogICAgICAgICAiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKwkJCQkgICAoZXAtPgorCQkJCSAgICBzdGFydF9tb3RvciAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOgorCQkJCSAgICdOJyk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBTeW5jaHJvbm91cyBUcmFuc2ZlcjoiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKLSAgICAgICAgICAgIChlcC0+aW5pdF9zZHRyICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBTeW5jaHJvbm91cyBUcmFuc2ZlcjoiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKwkJCQkgICAoZXAtPgorCQkJCSAgICBpbml0X3NkdHIgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDoKKwkJCQkgICAnTicpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAogI2lmZGVmIENPTkZJR19JU0EKLSAgICBpZiAoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBIb3N0IElTQSBETUEgc3BlZWQ6ICAgJWQgTUIvU1xuIiwKLSAgICAgICAgICAgIGlzYV9kbWFfc3BlZWRbQVNDX0VFUF9HRVRfRE1BX1NQRChlcCldKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQorCWlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX0lTQSkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJICAgIiBIb3N0IElTQSBETUEgc3BlZWQ6ICAgJWQgTUIvU1xuIiwKKwkJCQkgICBpc2FfZG1hX3NwZWVkW0FTQ19FRVBfR0VUX0RNQV9TUEQoZXApXSk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KICNlbmRpZiAvKiBDT05GSUdfSVNBICovCiAKLSAgICAgcmV0dXJuIHRvdGxlbjsKKwlyZXR1cm4gdG90bGVuOwogfQogCiAvKgpAQCAtNzc1NywzMDAgKzY1ODQsMjgyIEBACiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgogICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCiAgKi8KLVNUQVRJQyBpbnQKLWFzY19wcnRfYWR2X2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCitzdGF0aWMgaW50IGFzY19wcnRfYWR2X2JvYXJkX2VlcHJvbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqY3AsIGludCBjcGxlbikKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgICAgICAgICAgKmJvYXJkcDsKLSAgICBBRFZfRFZDX1ZBUiAgICAgICAgICAgICAgICAgKmFkdl9kdmNfdmFycDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgdG90bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBsZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICp0ZXJtc3RyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxzdHJbMTNdOwotICAgIEFEVkVFUF8zNTUwX0NPTkZJRyAgICAgICAgICAqZXBfMzU1MCA9IE5VTEw7Ci0gICAgQURWRUVQXzM4QzA4MDBfQ09ORklHICAgICAgICplcF8zOEMwODAwID0gTlVMTDsKLSAgICBBRFZFRVBfMzhDMTYwMF9DT05GSUcgICAgICAgKmVwXzM4QzE2MDAgPSBOVUxMOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICAgICB3b3JkOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICAgICAqd29yZHA7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgICAgICAgIHNkdHJfc3BlZWQgPSAwOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJQURWX0RWQ19WQVIgKmFkdl9kdmNfdmFycDsKKwlpbnQgbGVmdGxlbjsKKwlpbnQgdG90bGVuOworCWludCBsZW47CisJaW50IGk7CisJY2hhciAqdGVybXN0cjsKKwl1Y2hhciBzZXJpYWxzdHJbMTNdOworCUFEVkVFUF8zNTUwX0NPTkZJRyAqZXBfMzU1MCA9IE5VTEw7CisJQURWRUVQXzM4QzA4MDBfQ09ORklHICplcF8zOEMwODAwID0gTlVMTDsKKwlBRFZFRVBfMzhDMTYwMF9DT05GSUcgKmVwXzM4QzE2MDAgPSBOVUxMOworCXVzaG9ydCB3b3JkOworCXVzaG9ydCAqd29yZHA7CisJdXNob3J0IHNkdHJfc3BlZWQgPSAwOwogCi0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChzaHApOwotICAgIGFkdl9kdmNfdmFycCA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7Ci0gICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgewotICAgICAgICBlcF8zNTUwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzU1MF9lZXA7Ci0gICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQotICAgIHsKLSAgICAgICAgZXBfMzhDMDgwMCA9ICZib2FyZHAtPmVlcF9jb25maWcuYWR2XzM4QzA4MDBfZWVwOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgZXBfMzhDMTYwMCA9ICZib2FyZHAtPmVlcF9jb25maWcuYWR2XzM4QzE2MDBfZWVwOwotICAgIH0KKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlhZHZfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCWVwXzM1NTAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zNTUwX2VlcDsKKwl9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJZXBfMzhDMDgwMCA9ICZib2FyZHAtPmVlcF9jb25maWcuYWR2XzM4QzA4MDBfZWVwOworCX0gZWxzZSB7CisJCWVwXzM4QzE2MDAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zOEMxNjAwX2VlcDsKKwl9CiAKLSAgICBsZWZ0bGVuID0gY3BsZW47Ci0gICAgdG90bGVuID0gbGVuID0gMDsKKwlsZWZ0bGVuID0gY3BsZW47CisJdG90bGVuID0gbGVuID0gMDsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSJcbkVFUFJPTSBTZXR0aW5ncyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwgc2hwLT5ob3N0X25vKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiXG5FRVBST00gU2V0dGluZ3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCisJCQkgICBzaG9zdC0+aG9zdF9ubyk7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKLSAgICB7Ci0gICAgICAgIHdvcmRwID0gJmVwXzM1NTAtPnNlcmlhbF9udW1iZXJfd29yZDE7Ci0gICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQotICAgIHsKLSAgICAgICAgd29yZHAgPSAmZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIHdvcmRwID0gJmVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDE7Ci0gICAgfQorCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCXdvcmRwID0gJmVwXzM1NTAtPnNlcmlhbF9udW1iZXJfd29yZDE7CisJfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKSB7CisJCXdvcmRwID0gJmVwXzM4QzA4MDAtPnNlcmlhbF9udW1iZXJfd29yZDE7CisJfSBlbHNlIHsKKwkJd29yZHAgPSAmZXBfMzhDMTYwMC0+c2VyaWFsX251bWJlcl93b3JkMTsKKwl9CiAKLSAgICBpZiAoYXNjX2dldF9lZXByb21fc3RyaW5nKHdvcmRwLCBzZXJpYWxzdHIpID09IEFTQ19UUlVFKSB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBTZXJpYWwgTnVtYmVyOiAlc1xuIiwgc2VyaWFsc3RyKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotICAgICAgICAgICAgIiBTZXJpYWwgTnVtYmVyIFNpZ25hdHVyZSBOb3QgUHJlc2VudC5cbiIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9CisJaWYgKGFzY19nZXRfZWVwcm9tX3N0cmluZyh3b3JkcCwgc2VyaWFsc3RyKSA9PSBBU0NfVFJVRSkgeworCQlsZW4gPQorCQkgICAgYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFNlcmlhbCBOdW1iZXI6ICVzXG4iLAorCQkJCSBzZXJpYWxzdHIpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9IGVsc2UgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJICAgIiBTZXJpYWwgTnVtYmVyIFNpZ25hdHVyZSBOb3QgUHJlc2VudC5cbiIpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CiAKLSAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKLSAgICB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgSG9zdCBTQ1NJIElEOiAldSwgSG9zdCBRdWV1ZSBTaXplOiAldSwgRGV2aWNlIFF1ZXVlIFNpemU6ICV1XG4iLAotICAgICAgICAgICAgZXBfMzU1MC0+YWRhcHRlcl9zY3NpX2lkLCBlcF8zNTUwLT5tYXhfaG9zdF9xbmcsCi0gICAgICAgICAgICBlcF8zNTUwLT5tYXhfZHZjX3FuZyk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKLSAgICB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgSG9zdCBTQ1NJIElEOiAldSwgSG9zdCBRdWV1ZSBTaXplOiAldSwgRGV2aWNlIFF1ZXVlIFNpemU6ICV1XG4iLAotICAgICAgICAgICAgZXBfMzhDMDgwMC0+YWRhcHRlcl9zY3NpX2lkLCBlcF8zOEMwODAwLT5tYXhfaG9zdF9xbmcsCi0gICAgICAgICAgICBlcF8zOEMwODAwLT5tYXhfZHZjX3FuZyk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBIb3N0IFNDU0kgSUQ6ICV1LCBIb3N0IFF1ZXVlIFNpemU6ICV1LCBEZXZpY2UgUXVldWUgU2l6ZTogJXVcbiIsCi0gICAgICAgICAgICBlcF8zOEMxNjAwLT5hZGFwdGVyX3Njc2lfaWQsIGVwXzM4QzE2MDAtPm1heF9ob3N0X3FuZywKLSAgICAgICAgICAgIGVwXzM4QzE2MDAtPm1heF9kdmNfcW5nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQotICAgIHsKLSAgICAgICAgd29yZCA9IGVwXzM1NTAtPnRlcm1pbmF0aW9uOwotICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKLSAgICB7Ci0gICAgICAgIHdvcmQgPSBlcF8zOEMwODAwLT50ZXJtaW5hdGlvbl9sdmQ7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICB3b3JkID0gZXBfMzhDMTYwMC0+dGVybWluYXRpb25fbHZkOwotICAgIH0KLSAgICBzd2l0Y2ggKHdvcmQpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgdGVybXN0ciA9ICJMb3cgT2ZmL0hpZ2ggT2ZmIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB0ZXJtc3RyID0gIkxvdyBPZmYvSGlnaCBPbiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdGVybXN0ciA9ICJMb3cgT24vSGlnaCBPbiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgdGVybXN0ciA9ICJBdXRvbWF0aWMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkgICAiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKwkJCQkgICBlcF8zNTUwLT5hZGFwdGVyX3Njc2lfaWQsCisJCQkJICAgZXBfMzU1MC0+bWF4X2hvc3RfcW5nLCBlcF8zNTUwLT5tYXhfZHZjX3FuZyk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJICAgIiBIb3N0IFNDU0kgSUQ6ICV1LCBIb3N0IFF1ZXVlIFNpemU6ICV1LCBEZXZpY2UgUXVldWUgU2l6ZTogJXVcbiIsCisJCQkJICAgZXBfMzhDMDgwMC0+YWRhcHRlcl9zY3NpX2lkLAorCQkJCSAgIGVwXzM4QzA4MDAtPm1heF9ob3N0X3FuZywKKwkJCQkgICBlcF8zOEMwODAwLT5tYXhfZHZjX3FuZyk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0gZWxzZSB7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkgICAiIEhvc3QgU0NTSSBJRDogJXUsIEhvc3QgUXVldWUgU2l6ZTogJXUsIERldmljZSBRdWV1ZSBTaXplOiAldVxuIiwKKwkJCQkgICBlcF8zOEMxNjAwLT5hZGFwdGVyX3Njc2lfaWQsCisJCQkJICAgZXBfMzhDMTYwMC0+bWF4X2hvc3RfcW5nLAorCQkJCSAgIGVwXzM4QzE2MDAtPm1heF9kdmNfcW5nKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQorCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCXdvcmQgPSBlcF8zNTUwLT50ZXJtaW5hdGlvbjsKKwl9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJd29yZCA9IGVwXzM4QzA4MDAtPnRlcm1pbmF0aW9uX2x2ZDsKKwl9IGVsc2UgeworCQl3b3JkID0gZXBfMzhDMTYwMC0+dGVybWluYXRpb25fbHZkOworCX0KKwlzd2l0Y2ggKHdvcmQpIHsKKwljYXNlIDE6CisJCXRlcm1zdHIgPSAiTG93IE9mZi9IaWdoIE9mZiI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdGVybXN0ciA9ICJMb3cgT2ZmL0hpZ2ggT24iOworCQlicmVhazsKKwljYXNlIDM6CisJCXRlcm1zdHIgPSAiTG93IE9uL0hpZ2ggT24iOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkJdGVybXN0ciA9ICJBdXRvbWF0aWMiOworCQlicmVhazsKKwl9CiAKLSAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKLSAgICB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgdGVybWluYXRpb246ICV1ICglcyksIGJpb3NfY3RybDogMHgleFxuIiwKLSAgICAgICAgICAgIGVwXzM1NTAtPnRlcm1pbmF0aW9uLCB0ZXJtc3RyLCBlcF8zNTUwLT5iaW9zX2N0cmwpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCi0gICAgewotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIHRlcm1pbmF0aW9uOiAldSAoJXMpLCBiaW9zX2N0cmw6IDB4JXhcbiIsCi0gICAgICAgICAgICBlcF8zOEMwODAwLT50ZXJtaW5hdGlvbl9sdmQsIHRlcm1zdHIsIGVwXzM4QzA4MDAtPmJpb3NfY3RybCk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiB0ZXJtaW5hdGlvbjogJXUgKCVzKSwgYmlvc19jdHJsOiAweCV4XG4iLAotICAgICAgICAgICAgZXBfMzhDMTYwMC0+dGVybWluYXRpb25fbHZkLCB0ZXJtc3RyLCBlcF8zOEMxNjAwLT5iaW9zX2N0cmwpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9CisJaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCSAgICIgdGVybWluYXRpb246ICV1ICglcyksIGJpb3NfY3RybDogMHgleFxuIiwKKwkJCQkgICBlcF8zNTUwLT50ZXJtaW5hdGlvbiwgdGVybXN0ciwKKwkJCQkgICBlcF8zNTUwLT5iaW9zX2N0cmwpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCSAgICIgdGVybWluYXRpb246ICV1ICglcyksIGJpb3NfY3RybDogMHgleFxuIiwKKwkJCQkgICBlcF8zOEMwODAwLT50ZXJtaW5hdGlvbl9sdmQsIHRlcm1zdHIsCisJCQkJICAgZXBfMzhDMDgwMC0+Ymlvc19jdHJsKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfSBlbHNlIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCSAgICIgdGVybWluYXRpb246ICV1ICglcyksIGJpb3NfY3RybDogMHgleFxuIiwKKwkJCQkgICBlcF8zOEMxNjAwLT50ZXJtaW5hdGlvbl9sdmQsIHRlcm1zdHIsCisJCQkJICAgZXBfMzhDMTYwMC0+Ymlvc19jdHJsKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBUYXJnZXQgSUQ6ICAgICAgICAgICAiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYIiwgaSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBUYXJnZXQgSUQ6ICAgICAgICAgICAiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYIiwgaSk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgewotICAgICAgICB3b3JkID0gZXBfMzU1MC0+ZGlzY19lbmFibGU7Ci0gICAgfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQotICAgIHsKLSAgICAgICAgd29yZCA9IGVwXzM4QzA4MDAtPmRpc2NfZW5hYmxlOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgd29yZCA9IGVwXzM4QzE2MDAtPmRpc2NfZW5hYmxlOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIERpc2Nvbm5lY3RzOiAgICAgICAgICIpOwotICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgewotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAotICAgICAgICAgICAgKHdvcmQgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApIHsKKwkJd29yZCA9IGVwXzM1NTAtPmRpc2NfZW5hYmxlOworCX0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQl3b3JkID0gZXBfMzhDMDgwMC0+ZGlzY19lbmFibGU7CisJfSBlbHNlIHsKKwkJd29yZCA9IGVwXzM4QzE2MDAtPmRpc2NfZW5hYmxlOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgRGlzY29ubmVjdHM6ICAgICAgICAgIik7CisJQVNDX1BSVF9ORVhUKCk7CisJZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisJCQkJICAgKHdvcmQgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkKLSAgICB7Ci0gICAgICAgIHdvcmQgPSBlcF8zNTUwLT50YWdxbmdfYWJsZTsKLSAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCi0gICAgewotICAgICAgICB3b3JkID0gZXBfMzhDMDgwMC0+dGFncW5nX2FibGU7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICB3b3JkID0gZXBfMzhDMTYwMC0+dGFncW5nX2FibGU7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgQ29tbWFuZCBRdWV1aW5nOiAgICAgIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCi0gICAgICAgICAgICAod29yZCAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkgeworCQl3b3JkID0gZXBfMzU1MC0+dGFncW5nX2FibGU7CisJfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKSB7CisJCXdvcmQgPSBlcF8zOEMwODAwLT50YWdxbmdfYWJsZTsKKwl9IGVsc2UgeworCQl3b3JkID0gZXBfMzhDMTYwMC0+dGFncW5nX2FibGU7CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBDb21tYW5kIFF1ZXVpbmc6ICAgICAiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKKwkJCQkgICAod29yZCAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQotICAgIHsKLSAgICAgICAgd29yZCA9IGVwXzM1NTAtPnN0YXJ0X21vdG9yOwotICAgIH0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKLSAgICB7Ci0gICAgICAgIHdvcmQgPSBlcF8zOEMwODAwLT5zdGFydF9tb3RvcjsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIHdvcmQgPSBlcF8zOEMxNjAwLT5zdGFydF9tb3RvcjsKLSAgICB9Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBTdGFydCBNb3RvcjogICAgICAgICAiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKLSAgICAgICAgICAgICh3b3JkICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCXdvcmQgPSBlcF8zNTUwLT5zdGFydF9tb3RvcjsKKwl9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJd29yZCA9IGVwXzM4QzA4MDAtPnN0YXJ0X21vdG9yOworCX0gZWxzZSB7CisJCXdvcmQgPSBlcF8zOEMxNjAwLT5zdGFydF9tb3RvcjsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFN0YXJ0IE1vdG9yOiAgICAgICAgICIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorCQkJCSAgICh3b3JkICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgewotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIFN5bmNocm9ub3VzIFRyYW5zZmVyOiIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAotICAgICAgICAgICAgICAgIChlcF8zNTUwLT5zZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KKwlpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgU3luY2hyb25vdXMgVHJhbnNmZXI6Iik7CisJCUFTQ19QUlRfTkVYVCgpOworCQlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisJCQkJCSAgIChlcF8zNTUwLT4KKwkJCQkJICAgIHNkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPworCQkJCQkgICAnWScgOiAnTicpOworCQkJQVNDX1BSVF9ORVhUKCk7CisJCX0KKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQogCi0gICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgewotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIFVsdHJhIFRyYW5zZmVyOiAgICAgICIpOwotICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCi0gICAgICAgICAgICAgICAgKGVwXzM1NTAtPnVsdHJhX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KKwlpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgVWx0cmEgVHJhbnNmZXI6ICAgICAgIik7CisJCUFTQ19QUlRfTkVYVCgpOworCQlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlYyIsCisJCQkJCSAgIChlcF8zNTUwLT4KKwkJCQkJICAgIHVsdHJhX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpCisJCQkJCSAgID8gJ1knIDogJ04nKTsKKwkJCUFTQ19QUlRfTkVYVCgpOworCQl9CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KIAotICAgIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQotICAgIHsKLSAgICAgICAgd29yZCA9IGVwXzM1NTAtPndkdHJfYWJsZTsKLSAgICB9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCi0gICAgewotICAgICAgICB3b3JkID0gZXBfMzhDMDgwMC0+d2R0cl9hYmxlOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgd29yZCA9IGVwXzM4QzE2MDAtPndkdHJfYWJsZTsKLSAgICB9Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBXaWRlIFRyYW5zZmVyOiAgICAgICAiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVjIiwKLSAgICAgICAgICAgICh3b3JkICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCXdvcmQgPSBlcF8zNTUwLT53ZHRyX2FibGU7CisJfSBlbHNlIGlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKSB7CisJCXdvcmQgPSBlcF8zOEMwODAwLT53ZHRyX2FibGU7CisJfSBlbHNlIHsKKwkJd29yZCA9IGVwXzM4QzE2MDAtPndkdHJfYWJsZTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFdpZGUgVHJhbnNmZXI6ICAgICAgICIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJWMiLAorCQkJCSAgICh3b3JkICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6ICdOJyk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDAgfHwKLSAgICAgICAgYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkKLSAgICB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgU3luY2hyb25vdXMgVHJhbnNmZXIgU3BlZWQgKE1oeik6XG4gICIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyICpzcGVlZF9zdHI7CisJaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDAgfHwKKwkgICAgYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJICAgIiBTeW5jaHJvbm91cyBUcmFuc2ZlciBTcGVlZCAoTWh6KTpcbiAgIik7CisJCUFTQ19QUlRfTkVYVCgpOworCQlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJCWNoYXIgKnNwZWVkX3N0cjsKIAotICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZHRyX3NwZWVkID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKHNkdHJfc3BlZWQgJiBBRFZfTUFYX1RJRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6ICBzcGVlZF9zdHIgPSAiT2ZmIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiAgc3BlZWRfc3RyID0gIiAgNSI7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjogIHNwZWVkX3N0ciA9ICIgMTAiOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6ICBzcGVlZF9zdHIgPSAiIDIwIjsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiAgc3BlZWRfc3RyID0gIiA0MCI7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTogIHNwZWVkX3N0ciA9ICIgODAiOyBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBzcGVlZF9zdHIgPSAiVW5rIjsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIlWDolcyAiLCBpLCBzcGVlZF9zdHIpOwotICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgICAgICAgICBpZiAoaSA9PSA3KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuICAiKTsKLSAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNkdHJfc3BlZWQgPj49IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCXNkdHJfc3BlZWQgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQxOworCQkJfSBlbHNlIGlmIChpID09IDQpIHsKKwkJCQlzZHRyX3NwZWVkID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkMjsKKwkJCX0gZWxzZSBpZiAoaSA9PSA4KSB7CisJCQkJc2R0cl9zcGVlZCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7CisJCQl9IGVsc2UgaWYgKGkgPT0gMTIpIHsKKwkJCQlzZHRyX3NwZWVkID0gYWR2X2R2Y192YXJwLT5zZHRyX3NwZWVkNDsKKwkJCX0KKwkJCXN3aXRjaCAoc2R0cl9zcGVlZCAmIEFEVl9NQVhfVElEKSB7CisJCQljYXNlIDA6CisJCQkJc3BlZWRfc3RyID0gIk9mZiI7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJc3BlZWRfc3RyID0gIiAgNSI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJc3BlZWRfc3RyID0gIiAxMCI7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJc3BlZWRfc3RyID0gIiAyMCI7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJc3BlZWRfc3RyID0gIiA0MCI7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJc3BlZWRfc3RyID0gIiA4MCI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNwZWVkX3N0ciA9ICJVbmsiOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiJVg6JXMgIiwgaSwgc3BlZWRfc3RyKTsKKwkJCUFTQ19QUlRfTkVYVCgpOworCQkJaWYgKGkgPT0gNykgeworCQkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuICAiKTsKKwkJCQlBU0NfUFJUX05FWFQoKTsKKwkJCX0KKwkJCXNkdHJfc3BlZWQgPj49IDQ7CisJCX0KKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQogCi0gICAgcmV0dXJuIHRvdGxlbjsKKwlyZXR1cm4gdG90bGVuOwogfQogCiAvKgpAQCAtODA2Miw2MCArNjg3MSw2MCBAQAogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KICAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgogICovCi1TVEFUSUMgaW50Ci1hc2NfcHJ0X2RyaXZlcl9jb25mKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3N0YXRpYyBpbnQgYXNjX3BydF9kcml2ZXJfY29uZihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqY3AsIGludCBjcGxlbikKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgICAgICpib2FyZHA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgY2hpcF9zY3NpX2lkOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJaW50IGxlZnRsZW47CisJaW50IHRvdGxlbjsKKwlpbnQgbGVuOworCWludCBjaGlwX3Njc2lfaWQ7CiAKLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7CisJYm9hcmRwID0gQVNDX0JPQVJEUChzaG9zdCk7CiAKLSAgICBsZWZ0bGVuID0gY3BsZW47Ci0gICAgdG90bGVuID0gbGVuID0gMDsKKwlsZWZ0bGVuID0gY3BsZW47CisJdG90bGVuID0gbGVuID0gMDsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSJcbkxpbnV4IERyaXZlciBDb25maWd1cmF0aW9uIGFuZCBJbmZvcm1hdGlvbiBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwKLSAgICAgICAgc2hwLT5ob3N0X25vKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiXG5MaW51eCBEcml2ZXIgQ29uZmlndXJhdGlvbiBhbmQgSW5mb3JtYXRpb24gZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCisJCQkgICBzaG9zdC0+aG9zdF9ubyk7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIGhvc3RfYnVzeSAldSwgbGFzdF9yZXNldCAldSwgbWF4X2lkICV1LCBtYXhfbHVuICV1LCBtYXhfY2hhbm5lbCAldVxuIiwKLSAgICAgICAgc2hwLT5ob3N0X2J1c3ksIHNocC0+bGFzdF9yZXNldCwgc2hwLT5tYXhfaWQsIHNocC0+bWF4X2x1biwKLSAgICAgICAgc2hwLT5tYXhfY2hhbm5lbCk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBob3N0X2J1c3kgJXUsIGxhc3RfcmVzZXQgJXUsIG1heF9pZCAldSwgbWF4X2x1biAldSwgbWF4X2NoYW5uZWwgJXVcbiIsCisJCQkgICBzaG9zdC0+aG9zdF9idXN5LCBzaG9zdC0+bGFzdF9yZXNldCwgc2hvc3QtPm1heF9pZCwKKwkJCSAgIHNob3N0LT5tYXhfbHVuLCBzaG9zdC0+bWF4X2NoYW5uZWwpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiB1bmlxdWVfaWQgJWQsIGNhbl9xdWV1ZSAlZCwgdGhpc19pZCAlZCwgc2dfdGFibGVzaXplICV1LCBjbWRfcGVyX2x1biAldVxuIiwKLSAgICAgICAgc2hwLT51bmlxdWVfaWQsIHNocC0+Y2FuX3F1ZXVlLCBzaHAtPnRoaXNfaWQsIHNocC0+c2dfdGFibGVzaXplLAotICAgICAgICBzaHAtPmNtZF9wZXJfbHVuKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiIHVuaXF1ZV9pZCAlZCwgY2FuX3F1ZXVlICVkLCB0aGlzX2lkICVkLCBzZ190YWJsZXNpemUgJXUsIGNtZF9wZXJfbHVuICV1XG4iLAorCQkJICAgc2hvc3QtPnVuaXF1ZV9pZCwgc2hvc3QtPmNhbl9xdWV1ZSwgc2hvc3QtPnRoaXNfaWQsCisJCQkgICBzaG9zdC0+c2dfdGFibGVzaXplLCBzaG9zdC0+Y21kX3Blcl9sdW4pOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiB1bmNoZWNrZWRfaXNhX2RtYSAlZCwgdXNlX2NsdXN0ZXJpbmcgJWRcbiIsCi0gICAgICAgIHNocC0+dW5jaGVja2VkX2lzYV9kbWEsIHNocC0+dXNlX2NsdXN0ZXJpbmcpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCSAgICIgdW5jaGVja2VkX2lzYV9kbWEgJWQsIHVzZV9jbHVzdGVyaW5nICVkXG4iLAorCQkJICAgc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hLCBzaG9zdC0+dXNlX2NsdXN0ZXJpbmcpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBmbGFncyAweCV4LCBsYXN0X3Jlc2V0IDB4JXgsIGppZmZpZXMgMHgleCwgYXNjX25faW9fcG9ydCAweCV4XG4iLAotICAgICAgICBib2FyZHAtPmZsYWdzLCBib2FyZHAtPmxhc3RfcmVzZXQsIGppZmZpZXMsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBmbGFncyAweCV4LCBsYXN0X3Jlc2V0IDB4JXgsIGppZmZpZXMgMHgleCwgYXNjX25faW9fcG9ydCAweCV4XG4iLAorCQkJICAgYm9hcmRwLT5mbGFncywgYm9hcmRwLT5sYXN0X3Jlc2V0LCBqaWZmaWVzLAorCQkJICAgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgICAvKiAnc2hwLT5uX2lvX3BvcnQnIG1heSBiZSB0cnVuY2F0ZWQgYmVjYXVzZSBpdCBpcyBvbmx5IG9uZSBieXRlLiAqLwotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgaW9fcG9ydCAweCV4LCBuX2lvX3BvcnQgMHgleFxuIiwKLSAgICAgICAgc2hwLT5pb19wb3J0LCBzaHAtPm5faW9fcG9ydCk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJLyogJ3Nob3N0LT5uX2lvX3BvcnQnIG1heSBiZSB0cnVuY2F0ZWQgYmVjYXVzZSBpdCBpcyBvbmx5IG9uZSBieXRlLiAqLworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCSAgICIgaW9fcG9ydCAweCV4LCBuX2lvX3BvcnQgMHgleFxuIiwKKwkJCSAgIHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKLSAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfY2ZnLmFzY19kdmNfY2ZnLmNoaXBfc2NzaV9pZDsKLSAgICB9IGVsc2UgewotICAgICAgICBjaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXIuY2hpcF9zY3NpX2lkOwotICAgIH0KKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCWNoaXBfc2NzaV9pZCA9IGJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZy5jaGlwX3Njc2lfaWQ7CisJfSBlbHNlIHsKKwkJY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyLmNoaXBfc2NzaV9pZDsKKwl9CiAKLSAgICByZXR1cm4gdG90bGVuOworCXJldHVybiB0b3RsZW47CiB9CiAKIC8qCkBAIC04MTI5LDE3OCArNjkzOCwxODEgQEAKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gJ2NwJy4gTm8gbW9yZSB0aGFuCiAgKiAnY3BsZW4nIGNoYXJhY3RlcnMgd2lsbCBiZSBjb3BpZWQgdG8gJ2NwJy4KICAqLwotU1RBVElDIGludAotYXNjX3BydF9hc2NfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHAsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCitzdGF0aWMgaW50IGFzY19wcnRfYXNjX2JvYXJkX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCiB7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAgICAqYm9hcmRwOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgY2hpcF9zY3NpX2lkOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVmdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIHRvdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBBU0NfRFZDX1ZBUiAgICAgICAgICAgICp2OwotICAgIEFTQ19EVkNfQ0ZHICAgICAgICAgICAgKmM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAwOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJaW50IGNoaXBfc2NzaV9pZDsKKwlpbnQgbGVmdGxlbjsKKwlpbnQgdG90bGVuOworCWludCBsZW47CisJQVNDX0RWQ19WQVIgKnY7CisJQVNDX0RWQ19DRkcgKmM7CisJaW50IGk7CisJaW50IHJlbmVnb3RpYXRlID0gMDsKIAotICAgIGJvYXJkcCA9IEFTQ19CT0FSRFAoc2hwKTsKLSAgICB2ID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKLSAgICBjID0gJmJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZzsKLSAgICBjaGlwX3Njc2lfaWQgPSBjLT5jaGlwX3Njc2lfaWQ7CisJYm9hcmRwID0gQVNDX0JPQVJEUChzaG9zdCk7CisJdiA9ICZib2FyZHAtPmR2Y192YXIuYXNjX2R2Y192YXI7CisJYyA9ICZib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmc7CisJY2hpcF9zY3NpX2lkID0gYy0+Y2hpcF9zY3NpX2lkOwogCi0gICAgbGVmdGxlbiA9IGNwbGVuOwotICAgIHRvdGxlbiA9IGxlbiA9IDA7CisJbGVmdGxlbiA9IGNwbGVuOworCXRvdGxlbiA9IGxlbiA9IDA7CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iXG5Bc2MgTGlicmFyeSBDb25maWd1cmF0aW9uIGFuZCBTdGF0aXN0aWNzIGZvciBBZHZhblN5cyBTQ1NJIEhvc3QgJWQ6XG4iLAotICAgIHNocC0+aG9zdF9ubyk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIlxuQXNjIExpYnJhcnkgQ29uZmlndXJhdGlvbiBhbmQgU3RhdGlzdGljcyBmb3IgQWR2YW5TeXMgU0NTSSBIb3N0ICVkOlxuIiwKKwkJCSAgIHNob3N0LT5ob3N0X25vKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgY2hpcF92ZXJzaW9uICV1LCBsaWJfdmVyc2lvbiAweCV4LCBsaWJfc2VyaWFsX25vICV1LCBtY29kZV9kYXRlIDB4JXhcbiIsCi0gICAgICAgIGMtPmNoaXBfdmVyc2lvbiwgYy0+bGliX3ZlcnNpb24sIGMtPmxpYl9zZXJpYWxfbm8sIGMtPm1jb2RlX2RhdGUpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCSAgICIgY2hpcF92ZXJzaW9uICV1LCBsaWJfdmVyc2lvbiAweCV4LCBsaWJfc2VyaWFsX25vICV1LCBtY29kZV9kYXRlIDB4JXhcbiIsCisJCQkgICBjLT5jaGlwX3ZlcnNpb24sIGMtPmxpYl92ZXJzaW9uLCBjLT5saWJfc2VyaWFsX25vLAorCQkJICAgYy0+bWNvZGVfZGF0ZSk7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIG1jb2RlX3ZlcnNpb24gMHgleCwgZXJyX2NvZGUgJXVcbiIsCi0gICAgICAgICBjLT5tY29kZV92ZXJzaW9uLCB2LT5lcnJfY29kZSk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBtY29kZV92ZXJzaW9uIDB4JXgsIGVycl9jb2RlICV1XG4iLAorCQkJICAgYy0+bWNvZGVfdmVyc2lvbiwgdi0+ZXJyX2NvZGUpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgLyogQ3VycmVudCBudW1iZXIgb2YgY29tbWFuZHMgd2FpdGluZyBmb3IgdGhlIGhvc3QuICovCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBUb3RhbCBDb21tYW5kIFBlbmRpbmc6ICVkXG4iLCB2LT5jdXJfdG90YWxfcW5nKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwkvKiBDdXJyZW50IG51bWJlciBvZiBjb21tYW5kcyB3YWl0aW5nIGZvciB0aGUgaG9zdC4gKi8KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiIFRvdGFsIENvbW1hbmQgUGVuZGluZzogJWRcbiIsIHYtPmN1cl90b3RhbF9xbmcpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBDb21tYW5kIFF1ZXVpbmc6Iik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8Ci0gICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKLSAgICAgICAgICAgIGksICh2LT51c2VfdGFnZ2VkX3FuZyAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOiAnTicpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQ29tbWFuZCBRdWV1aW5nOiIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworCQlpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorCQkgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisJCQkJICAgaSwKKwkJCQkgICAodi0+CisJCQkJICAgIHVzZV90YWdnZWRfcW5nICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/CisJCQkJICAgJ1knIDogJ04nKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICAvKiBDdXJyZW50IG51bWJlciBvZiBjb21tYW5kcyB3YWl0aW5nIGZvciBhIGRldmljZS4gKi8KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIENvbW1hbmQgUXVldWUgUGVuZGluZzoiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKLSAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKLSAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JXUiLCBpLCB2LT5jdXJfZHZjX3FuZ1tpXSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCS8qIEN1cnJlbnQgbnVtYmVyIG9mIGNvbW1hbmRzIHdhaXRpbmcgZm9yIGEgZGV2aWNlLiAqLworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBDb21tYW5kIFF1ZXVlIFBlbmRpbmc6Iik7CisJQVNDX1BSVF9ORVhUKCk7CisJZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisJCWlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisJCSAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworCQkJY29udGludWU7CisJCX0KKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiV1IiwgaSwgdi0+Y3VyX2R2Y19xbmdbaV0pOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIC8qIEN1cnJlbnQgbGltaXQgb24gbnVtYmVyIG9mIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHNlbnQgdG8gYSBkZXZpY2UuICovCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBDb21tYW5kIFF1ZXVlIExpbWl0OiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgewotICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAotICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDoldSIsIGksIHYtPm1heF9kdmNfcW5nW2ldKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJLyogQ3VycmVudCBsaW1pdCBvbiBudW1iZXIgb2YgY29tbWFuZHMgdGhhdCBjYW4gYmUgc2VudCB0byBhIGRldmljZS4gKi8KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQ29tbWFuZCBRdWV1ZSBMaW1pdDoiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKwkJaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKwkJICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JXUiLCBpLCB2LT5tYXhfZHZjX3FuZ1tpXSk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgLyogSW5kaWNhdGUgd2hldGhlciB0aGUgZGV2aWNlIGhhcyByZXR1cm5lZCBxdWV1ZSBmdWxsIHN0YXR1cy4gKi8KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIENvbW1hbmQgUXVldWUgRnVsbDoiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKLSAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKLSAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm9hcmRwLT5xdWV1ZV9mdWxsICYgQURWX1RJRF9UT19USURNQVNLKGkpKSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6WS0lZCIsCi0gICAgICAgICAgICAgICAgaSwgYm9hcmRwLT5xdWV1ZV9mdWxsX2NudFtpXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6TiIsIGkpOwotICAgICAgICB9Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCS8qIEluZGljYXRlIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgcmV0dXJuZWQgcXVldWUgZnVsbCBzdGF0dXMuICovCisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIENvbW1hbmQgUXVldWUgRnVsbDoiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFTQ19NQVhfVElEOyBpKyspIHsKKwkJaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKwkJICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYm9hcmRwLT5xdWV1ZV9mdWxsICYgQURWX1RJRF9UT19USURNQVNLKGkpKSB7CisJCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6WS0lZCIsCisJCQkJCSAgIGksIGJvYXJkcC0+cXVldWVfZnVsbF9jbnRbaV0pOworCQl9IGVsc2UgeworCQkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOk4iLCBpKTsKKwkJfQorCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgU3luY2hyb25vdXMgVHJhbnNmZXI6Iik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8Ci0gICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKLSAgICAgICAgICAgIGksICh2LT5zZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFN5bmNocm9ub3VzIFRyYW5zZmVyOiIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworCQlpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorCQkgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisJCQkJICAgaSwKKwkJCQkgICAodi0+CisJCQkJICAgIHNkdHJfZG9uZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPyAnWScgOgorCQkJCSAgICdOJyk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIHVjaGFyIHN5bl9wZXJpb2RfaXg7CisJZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisJCXVjaGFyIHN5bl9wZXJpb2RfaXg7CiAKLSAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKLSAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHx8Ci0gICAgICAgICAgICAoKHYtPmluaXRfc2R0ciAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisJCWlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisJCSAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSB8fAorCQkgICAgKCh2LT5pbml0X3NkdHIgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisJCQljb250aW51ZTsKKwkJfQogCi0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAgJVg6IiwgaSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgICVYOiIsIGkpOworCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICBpZiAoKGJvYXJkcC0+c2R0cl9kYXRhW2ldICYgQVNDX1NZTl9NQVhfT0ZGU0VUKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQXN5bmNocm9ub3VzIik7Ci0gICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5bl9wZXJpb2RfaXggPQotICAgICAgICAgICAgICAgIChib2FyZHAtPnNkdHJfZGF0YVtpXSA+PiA0KSAmICh2LT5tYXhfc2R0cl9pbmRleCAtIDEpOworCQlpZiAoKGJvYXJkcC0+c2R0cl9kYXRhW2ldICYgQVNDX1NZTl9NQVhfT0ZGU0VUKSA9PSAwKSB7CisJCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQXN5bmNocm9ub3VzIik7CisJCQlBU0NfUFJUX05FWFQoKTsKKwkJfSBlbHNlIHsKKwkJCXN5bl9wZXJpb2RfaXggPQorCQkJICAgIChib2FyZHAtPnNkdHJfZGF0YVtpXSA+PiA0KSAmICh2LT5tYXhfc2R0cl9pbmRleCAtCisJCQkJCQkJICAgMSk7CiAKLSAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSAgICAgICAgICAgICAgICAiIFRyYW5zZmVyIFBlcmlvZCBGYWN0b3I6ICVkICglZC4lZCBNaHopLCIsCi0gICAgICAgICAgICAgICAgdi0+c2R0cl9wZXJpb2RfdGJsW3N5bl9wZXJpb2RfaXhdLAotICAgICAgICAgICAgICAgIDI1MCAvIHYtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSwKLSAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKDI1MCwgdi0+c2R0cl9wZXJpb2RfdGJsW3N5bl9wZXJpb2RfaXhdKSk7Ci0gICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkJICAgIiBUcmFuc2ZlciBQZXJpb2QgRmFjdG9yOiAlZCAoJWQuJWQgTWh6KSwiLAorCQkJCQkgICB2LT5zZHRyX3BlcmlvZF90Ymxbc3luX3BlcmlvZF9peF0sCisJCQkJCSAgIDI1MCAvCisJCQkJCSAgIHYtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSwKKwkJCQkJICAgQVNDX1RFTlRIUygyNTAsCisJCQkJCQkgICAgICB2LT4KKwkJCQkJCSAgICAgIHNkdHJfcGVyaW9kX3RibAorCQkJCQkJICAgICAgW3N5bl9wZXJpb2RfaXhdKSk7CisJCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFJFUS9BQ0sgT2Zmc2V0OiAlZCIsCi0gICAgICAgICAgICAgICAgYm9hcmRwLT5zZHRyX2RhdGFbaV0gJiBBU0NfU1lOX01BWF9PRkZTRVQpOwotICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgICAgIH0KKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBSRVEvQUNLIE9mZnNldDogJWQiLAorCQkJCQkgICBib2FyZHAtPgorCQkJCQkgICBzZHRyX2RhdGFbaV0gJiBBU0NfU1lOX01BWF9PRkZTRVQpOworCQkJQVNDX1BSVF9ORVhUKCk7CisJCX0KIAotICAgICAgICBpZiAoKHYtPnNkdHJfZG9uZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkgewotICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiKlxuIik7Ci0gICAgICAgICAgICByZW5lZ290aWF0ZSA9IDE7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KKwkJaWYgKCh2LT5zZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIipcbiIpOworCQkJcmVuZWdvdGlhdGUgPSAxOworCQl9IGVsc2UgeworCQkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwkJfQorCQlBU0NfUFJUX05FWFQoKTsKKwl9CiAKLSAgICBpZiAocmVuZWdvdGlhdGUpCi0gICAgewotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0gICAgICAgICAgICAiICogPSBSZS1uZWdvdGlhdGlvbiBwZW5kaW5nIGJlZm9yZSBuZXh0IGNvbW1hbmQuXG4iKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQorCWlmIChyZW5lZ290aWF0ZSkgeworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJICAgIiAqID0gUmUtbmVnb3RpYXRpb24gcGVuZGluZyBiZWZvcmUgbmV4dCBjb21tYW5kLlxuIik7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KIAotICAgIHJldHVybiB0b3RsZW47CisJcmV0dXJuIHRvdGxlbjsKIH0KIAogLyoKQEAgLTgzMTQsMjM3ICs3MTI2LDI0MiBAQAogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQgaW50byAnY3AnLiBObyBtb3JlIHRoYW4KICAqICdjcGxlbicgY2hhcmFjdGVycyB3aWxsIGJlIGNvcGllZCB0byAnY3AnLgogICovCi1TVEFUSUMgaW50Ci1hc2NfcHJ0X2Fkdl9ib2FyZF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocCwgY2hhciAqY3AsIGludCBjcGxlbikKK3N0YXRpYyBpbnQgYXNjX3BydF9hZHZfYm9hcmRfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgY2hhciAqY3AsIGludCBjcGxlbikKIHsKLSAgICBhc2NfYm9hcmRfdCAgICAgICAgICAgICpib2FyZHA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBBRFZfRFZDX1ZBUiAgICAgICAgICAgICp2OwotICAgIEFEVl9EVkNfQ0ZHICAgICAgICAgICAgKmM7Ci0gICAgQWR2UG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgIGNoaXBfc2NzaV9pZDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgIGxyYW13b3JkOwotICAgIHVjaGFyICAgICAgICAgICAgICAgICAgbHJhbWJ5dGU7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgICB0YWdxbmdfYWJsZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgIHNkdHJfYWJsZSwgd2R0cl9hYmxlOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgd2R0cl9kb25lLCBzZHRyX2RvbmU7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgICBwZXJpb2QgPSAwOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVuZWdvdGlhdGUgPSAwOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJaW50IGxlZnRsZW47CisJaW50IHRvdGxlbjsKKwlpbnQgbGVuOworCWludCBpOworCUFEVl9EVkNfVkFSICp2OworCUFEVl9EVkNfQ0ZHICpjOworCUFkdlBvcnRBZGRyIGlvcF9iYXNlOworCXVzaG9ydCBjaGlwX3Njc2lfaWQ7CisJdXNob3J0IGxyYW13b3JkOworCXVjaGFyIGxyYW1ieXRlOworCXVzaG9ydCB0YWdxbmdfYWJsZTsKKwl1c2hvcnQgc2R0cl9hYmxlLCB3ZHRyX2FibGU7CisJdXNob3J0IHdkdHJfZG9uZSwgc2R0cl9kb25lOworCXVzaG9ydCBwZXJpb2QgPSAwOworCWludCByZW5lZ290aWF0ZSA9IDA7CiAKLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7Ci0gICAgdiA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7Ci0gICAgYyA9ICZib2FyZHAtPmR2Y19jZmcuYWR2X2R2Y19jZmc7Ci0gICAgaW9wX2Jhc2UgPSB2LT5pb3BfYmFzZTsKLSAgICBjaGlwX3Njc2lfaWQgPSB2LT5jaGlwX3Njc2lfaWQ7CisJYm9hcmRwID0gQVNDX0JPQVJEUChzaG9zdCk7CisJdiA9ICZib2FyZHAtPmR2Y192YXIuYWR2X2R2Y192YXI7CisJYyA9ICZib2FyZHAtPmR2Y19jZmcuYWR2X2R2Y19jZmc7CisJaW9wX2Jhc2UgPSB2LT5pb3BfYmFzZTsKKwljaGlwX3Njc2lfaWQgPSB2LT5jaGlwX3Njc2lfaWQ7CiAKLSAgICBsZWZ0bGVuID0gY3BsZW47Ci0gICAgdG90bGVuID0gbGVuID0gMDsKKwlsZWZ0bGVuID0gY3BsZW47CisJdG90bGVuID0gbGVuID0gMDsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSJcbkFkdiBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gYW5kIFN0YXRpc3RpY3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCi0gICAgc2hwLT5ob3N0X25vKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiXG5BZHYgTGlicmFyeSBDb25maWd1cmF0aW9uIGFuZCBTdGF0aXN0aWNzIGZvciBBZHZhblN5cyBTQ1NJIEhvc3QgJWQ6XG4iLAorCQkJICAgc2hvc3QtPmhvc3Rfbm8pOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBpb3BfYmFzZSAweCVseCwgY2FibGVfZGV0ZWN0OiAlWCwgZXJyX2NvZGUgJXVcbiIsCi0gICAgICAgICB2LT5pb3BfYmFzZSwKLSAgICAgICAgIEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKSAmIENBQkxFX0RFVEVDVCwKLSAgICAgICAgIHYtPmVycl9jb2RlKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkgICAiIGlvcF9iYXNlIDB4JWx4LCBjYWJsZV9kZXRlY3Q6ICVYLCBlcnJfY29kZSAldVxuIiwKKwkJCSAgIHYtPmlvcF9iYXNlLAorCQkJICAgQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwKKwkJCQkJICAgICAgIElPUFdfU0NTSV9DRkcxKSAmIENBQkxFX0RFVEVDVCwKKwkJCSAgIHYtPmVycl9jb2RlKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgY2hpcF92ZXJzaW9uICV1LCBsaWJfdmVyc2lvbiAweCV4LCBtY29kZV9kYXRlIDB4JXgsIG1jb2RlX3ZlcnNpb24gMHgleFxuIiwKLSAgICAgICAgYy0+Y2hpcF92ZXJzaW9uLCBjLT5saWJfdmVyc2lvbiwgYy0+bWNvZGVfZGF0ZSwgYy0+bWNvZGVfdmVyc2lvbik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBjaGlwX3ZlcnNpb24gJXUsIGxpYl92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleCwgbWNvZGVfdmVyc2lvbiAweCV4XG4iLAorCQkJICAgYy0+Y2hpcF92ZXJzaW9uLCBjLT5saWJfdmVyc2lvbiwgYy0+bWNvZGVfZGF0ZSwKKwkJCSAgIGMtPm1jb2RlX3ZlcnNpb24pOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIFF1ZXVpbmcgRW5hYmxlZDoiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKLSAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQorCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFF1ZXVpbmcgRW5hYmxlZDoiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKwkJICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisJCQljb250aW51ZTsKKwkJfQogCi0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCi0gICAgICAgICAgICBpLCAodGFncW5nX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisJCQkJICAgaSwKKwkJCQkgICAodGFncW5nX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDoKKwkJCQkgICAnTicpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgUXVldWUgTGltaXQ6Iik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8Ci0gICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgUXVldWUgTGltaXQ6Iik7CisJQVNDX1BSVF9ORVhUKCk7CisJZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisJCWlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisJCSAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgeworCQkJY29udGludWU7CisJCX0KIAotICAgICAgICBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIGksIGxyYW1ieXRlKTsKKwkJQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyBpLAorCQkJCWxyYW1ieXRlKTsKIAotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JWQiLCBpLCBscmFtYnl0ZSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgJVg6JWQiLCBpLCBscmFtYnl0ZSk7CisJCUFTQ19QUlRfTkVYVCgpOworCX0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOworCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBDb21tYW5kIFBlbmRpbmc6Iik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8Ci0gICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgQ29tbWFuZCBQZW5kaW5nOiIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQlpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorCQkgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CiAKLSAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX1FVRVVFRF9DTUQgKyBpLCBscmFtYnl0ZSk7CisJCUFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9RVUVVRURfQ01EICsgaSwKKwkJCQlscmFtYnl0ZSk7CiAKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVkIiwgaSwgbHJhbWJ5dGUpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVkIiwgaSwgbHJhbWJ5dGUpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiXG4iKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIFdpZGUgRW5hYmxlZDoiKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKLSAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKLSAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQorCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKwlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgV2lkZSBFbmFibGVkOiIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQlpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorCQkgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CiAKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKLSAgICAgICAgICAgIGksICh3ZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisJCQkJICAgaSwKKwkJCQkgICAod2R0cl9hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6CisJCQkJICAgJ04nKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0RPTkUsIHdkdHJfZG9uZSk7Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBUcmFuc2ZlciBCaXQgV2lkdGg6Iik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8Ci0gICAgICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0RPTkUsIHdkdHJfZG9uZSk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFRyYW5zZmVyIEJpdCBXaWR0aDoiKTsKKwlBU0NfUFJUX05FWFQoKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFEVl9NQVhfVElEOyBpKyspIHsKKwkJaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKKwkJICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisJCQljb250aW51ZTsKKwkJfQogCi0gICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFVklDRV9IU0hLX0NGR19UQUJMRSArICgyICogaSksCi0gICAgICAgICAgICBscmFtd29yZCk7CisJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwKKwkJCQlBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFICsgKDIgKiBpKSwKKwkJCQlscmFtd29yZCk7CiAKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVkIiwKLSAgICAgICAgICAgIGksIChscmFtd29yZCAmIDB4ODAwMCkgPyAxNiA6IDgpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVkIiwKKwkJCQkgICBpLCAobHJhbXdvcmQgJiAweDgwMDApID8gMTYgOiA4KTsKKwkJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICAgICAgaWYgKCh3ZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpICYmCi0gICAgICAgICAgICAod2R0cl9kb25lICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIqIik7Ci0gICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgICAgIHJlbmVnb3RpYXRlID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCQlpZiAoKHdkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgJiYKKwkJICAgICh3ZHRyX2RvbmUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIioiKTsKKwkJCUFTQ19QUlRfTkVYVCgpOworCQkJcmVuZWdvdGlhdGUgPSAxOworCQl9CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7Ci0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiBTeW5jaHJvbm91cyBFbmFibGVkOiIpOwotICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIGZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgewotICAgICAgICBpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAotICAgICAgICAgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBTeW5jaHJvbm91cyBFbmFibGVkOiIpOworCUFTQ19QUlRfTkVYVCgpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgeworCQlpZiAoKGNoaXBfc2NzaV9pZCA9PSBpKSB8fAorCQkgICAgKChib2FyZHAtPmluaXRfdGlkbWFzayAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKKwkJCWNvbnRpbnVlOworCQl9CiAKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiICVYOiVjIiwKLSAgICAgICAgICAgIGksIChzZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID8gJ1knIDogJ04nKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgfQotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAlWDolYyIsCisJCQkJICAgaSwKKwkJCQkgICAoc2R0cl9hYmxlICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA/ICdZJyA6CisJCQkJICAgJ04nKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQorCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsIHNkdHJfZG9uZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBRFZfTUFYX1RJRDsgaSsrKSB7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9ET05FLCBzZHRyX2RvbmUpOworCWZvciAoaSA9IDA7IGkgPD0gQURWX01BWF9USUQ7IGkrKykgewogCi0gICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFVklDRV9IU0hLX0NGR19UQUJMRSArICgyICogaSksCi0gICAgICAgICAgICBscmFtd29yZCk7Ci0gICAgICAgIGxyYW13b3JkICY9IH4weDgwMDA7CisJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwKKwkJCQlBU0NfTUNfREVWSUNFX0hTSEtfQ0ZHX1RBQkxFICsgKDIgKiBpKSwKKwkJCQlscmFtd29yZCk7CisJCWxyYW13b3JkICY9IH4weDgwMDA7CiAKLSAgICAgICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gaSkgfHwKLSAgICAgICAgICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApIHx8Ci0gICAgICAgICAgICAoKHNkdHJfYWJsZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisJCWlmICgoY2hpcF9zY3NpX2lkID09IGkpIHx8CisJCSAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSB8fAorCQkgICAgKChzZHRyX2FibGUgJiBBRFZfVElEX1RPX1RJRE1BU0soaSkpID09IDApKSB7CisJCQljb250aW51ZTsKKwkJfQogCi0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiAgJVg6IiwgaSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOworCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgICVYOiIsIGkpOworCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICBpZiAoKGxyYW13b3JkICYgMHgxRikgPT0gMCkgLyogQ2hlY2sgZm9yIFJFUS9BQ0sgT2Zmc2V0IDAuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBBc3luY2hyb25vdXMiKTsKLSAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIFRyYW5zZmVyIFBlcmlvZCBGYWN0b3I6ICIpOwotICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisJCWlmICgobHJhbXdvcmQgJiAweDFGKSA9PSAwKSB7CS8qIENoZWNrIGZvciBSRVEvQUNLIE9mZnNldCAwLiAqLworCQkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIEFzeW5jaHJvbm91cyIpOworCQkJQVNDX1BSVF9ORVhUKCk7CisJCX0gZWxzZSB7CisJCQlsZW4gPQorCQkJICAgIGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkJICIgVHJhbnNmZXIgUGVyaW9kIEZhY3RvcjogIik7CisJCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICAgICAgaWYgKChscmFtd29yZCAmIDB4MUYwMCkgPT0gMHgxMTAwKSAvKiA4MCBNaHogKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICI5ICg4MC4wIE1oeiksIik7Ci0gICAgICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChscmFtd29yZCAmIDB4MUYwMCkgPT0gMHgxMDAwKSAvKiA0MCBNaHogKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIxMCAoNDAuMCBNaHopLCIpOwotICAgICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICAgICAgfSBlbHNlIC8qIDIwIE1oeiBvciBiZWxvdy4gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZXJpb2QgPSAoKChscmFtd29yZCA+PiA4KSAqIDI1KSArIDUwKS80OworCQkJaWYgKChscmFtd29yZCAmIDB4MUYwMCkgPT0gMHgxMTAwKSB7CS8qIDgwIE1oeiAqLworCQkJCWxlbiA9CisJCQkJICAgIGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIjkgKDgwLjAgTWh6KSwiKTsKKwkJCQlBU0NfUFJUX05FWFQoKTsKKwkJCX0gZWxzZSBpZiAoKGxyYW13b3JkICYgMHgxRjAwKSA9PSAweDEwMDApIHsJLyogNDAgTWh6ICovCisJCQkJbGVuID0KKwkJCQkgICAgYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiMTAgKDQwLjAgTWh6KSwiKTsKKwkJCQlBU0NfUFJUX05FWFQoKTsKKwkJCX0gZWxzZSB7CS8qIDIwIE1oeiBvciBiZWxvdy4gKi8KIAotICAgICAgICAgICAgICAgIGlmIChwZXJpb2QgPT0gMCkgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiVkICg/IE1oeiksICIpOwotICAgICAgICAgICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlZCAoJWQuJWQgTWh6KSwiLAotICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kLCAyNTAvcGVyaW9kLCBBU0NfVEVOVEhTKDI1MCwgcGVyaW9kKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKwkJCQlwZXJpb2QgPSAoKChscmFtd29yZCA+PiA4KSAqIDI1KSArIDUwKSAvIDQ7CiAKLSAgICAgICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBSRVEvQUNLIE9mZnNldDogJWQiLAotICAgICAgICAgICAgICAgIGxyYW13b3JkICYgMHgxRik7Ci0gICAgICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICAgICAgfQorCQkJCWlmIChwZXJpb2QgPT0gMCkgewkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworCQkJCQlsZW4gPQorCQkJCQkgICAgYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCQkJCSAiJWQgKD8gTWh6KSwgIik7CisJCQkJCUFTQ19QUlRfTkVYVCgpOworCQkJCX0gZWxzZSB7CisJCQkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCQkJCQkgICAiJWQgKCVkLiVkIE1oeiksIiwKKwkJCQkJCQkgICBwZXJpb2QsIDI1MCAvIHBlcmlvZCwKKwkJCQkJCQkgICBBU0NfVEVOVEhTKDI1MCwKKwkJCQkJCQkJICAgICAgcGVyaW9kKSk7CisJCQkJCUFTQ19QUlRfTkVYVCgpOworCQkJCX0KKwkJCX0KIAotICAgICAgICBpZiAoKHNkdHJfZG9uZSAmIEFEVl9USURfVE9fVElETUFTSyhpKSkgPT0gMCkgewotICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiKlxuIik7Ci0gICAgICAgICAgICByZW5lZ290aWF0ZSA9IDE7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBSRVEvQUNLIE9mZnNldDogJWQiLAorCQkJCQkgICBscmFtd29yZCAmIDB4MUYpOworCQkJQVNDX1BSVF9ORVhUKCk7CisJCX0KIAotICAgIGlmIChyZW5lZ290aWF0ZSkKLSAgICB7Ci0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSAgICAgICAgICAgICIgKiA9IFJlLW5lZ290aWF0aW9uIHBlbmRpbmcgYmVmb3JlIG5leHQgY29tbWFuZC5cbiIpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9CisJCWlmICgoc2R0cl9kb25lICYgQURWX1RJRF9UT19USURNQVNLKGkpKSA9PSAwKSB7CisJCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIqXG4iKTsKKwkJCXJlbmVnb3RpYXRlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIlxuIik7CisJCX0KKwkJQVNDX1BSVF9ORVhUKCk7CisJfQogCi0gICAgcmV0dXJuIHRvdGxlbjsKKwlpZiAocmVuZWdvdGlhdGUpIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJCSAgICIgKiA9IFJlLW5lZ290aWF0aW9uIHBlbmRpbmcgYmVmb3JlIG5leHQgY29tbWFuZC5cbiIpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CisKKwlyZXR1cm4gdG90bGVuOwogfQogCiAvKgpAQCAtODU1MywzMCArNzM3MCwzMCBAQAogICogQ29weSBwcm9jIGluZm9ybWF0aW9uIHRvIGEgcmVhZCBidWZmZXIgdGFraW5nIGludG8gYWNjb3VudCB0aGUgY3VycmVudAogICogcmVhZCBvZmZzZXQgaW4gdGhlIGZpbGUgYW5kIHRoZSByZW1haW5pbmcgc3BhY2UgaW4gdGhlIHJlYWQgYnVmZmVyLgogICovCi1TVEFUSUMgaW50CitzdGF0aWMgaW50CiBhc2NfcHJvY19jb3B5KG9mZl90IGFkdm9mZnNldCwgb2ZmX3Qgb2Zmc2V0LCBjaGFyICpjdXJidWYsIGludCBsZWZ0bGVuLAotICAgICAgICAgICAgICBjaGFyICpjcCwgaW50IGNwbGVuKQorCSAgICAgIGNoYXIgKmNwLCBpbnQgY3BsZW4pCiB7Ci0gICAgaW50IGNudCA9IDA7CisJaW50IGNudCA9IDA7CiAKLSAgICBBU0NfREJHMygyLCAiYXNjX3Byb2NfY29weTogb2Zmc2V0ICVkLCBhZHZvZmZzZXQgJWQsIGNwbGVuICVkXG4iLAotICAgICAgICAgICAgKHVuc2lnbmVkKSBvZmZzZXQsICh1bnNpZ25lZCkgYWR2b2Zmc2V0LCBjcGxlbik7Ci0gICAgaWYgKG9mZnNldCA8PSBhZHZvZmZzZXQpIHsKLSAgICAgICAgLyogUmVhZCBvZmZzZXQgYmVsb3cgY3VycmVudCBvZmZzZXQsIGNvcHkgZXZlcnl0aGluZy4gKi8KLSAgICAgICAgY250ID0gbWluKGNwbGVuLCBsZWZ0bGVuKTsKLSAgICAgICAgQVNDX0RCRzMoMiwgImFzY19wcm9jX2NvcHk6IGN1cmJ1ZiAweCVseCwgY3AgMHglbHgsIGNudCAlZFxuIiwKLSAgICAgICAgICAgICAgICAodWxvbmcpIGN1cmJ1ZiwgKHVsb25nKSBjcCwgY250KTsKLSAgICAgICAgbWVtY3B5KGN1cmJ1ZiwgY3AsIGNudCk7Ci0gICAgfSBlbHNlIGlmIChvZmZzZXQgPCBhZHZvZmZzZXQgKyBjcGxlbikgewotICAgICAgICAvKiBSZWFkIG9mZnNldCB3aXRoaW4gY3VycmVudCByYW5nZSwgcGFydGlhbCBjb3B5LiAqLwotICAgICAgICBjbnQgPSAoYWR2b2Zmc2V0ICsgY3BsZW4pIC0gb2Zmc2V0OwotICAgICAgICBjcCA9IChjcCArIGNwbGVuKSAtIGNudDsKLSAgICAgICAgY250ID0gbWluKGNudCwgbGVmdGxlbik7Ci0gICAgICAgIEFTQ19EQkczKDIsICJhc2NfcHJvY19jb3B5OiBjdXJidWYgMHglbHgsIGNwIDB4JWx4LCBjbnQgJWRcbiIsCi0gICAgICAgICAgICAgICAgKHVsb25nKSBjdXJidWYsICh1bG9uZykgY3AsIGNudCk7Ci0gICAgICAgIG1lbWNweShjdXJidWYsIGNwLCBjbnQpOwotICAgIH0KLSAgICByZXR1cm4gY250OworCUFTQ19EQkczKDIsICJhc2NfcHJvY19jb3B5OiBvZmZzZXQgJWQsIGFkdm9mZnNldCAlZCwgY3BsZW4gJWRcbiIsCisJCSAodW5zaWduZWQpb2Zmc2V0LCAodW5zaWduZWQpYWR2b2Zmc2V0LCBjcGxlbik7CisJaWYgKG9mZnNldCA8PSBhZHZvZmZzZXQpIHsKKwkJLyogUmVhZCBvZmZzZXQgYmVsb3cgY3VycmVudCBvZmZzZXQsIGNvcHkgZXZlcnl0aGluZy4gKi8KKwkJY250ID0gbWluKGNwbGVuLCBsZWZ0bGVuKTsKKwkJQVNDX0RCRzMoMiwgImFzY19wcm9jX2NvcHk6IGN1cmJ1ZiAweCVseCwgY3AgMHglbHgsIGNudCAlZFxuIiwKKwkJCSAodWxvbmcpY3VyYnVmLCAodWxvbmcpY3AsIGNudCk7CisJCW1lbWNweShjdXJidWYsIGNwLCBjbnQpOworCX0gZWxzZSBpZiAob2Zmc2V0IDwgYWR2b2Zmc2V0ICsgY3BsZW4pIHsKKwkJLyogUmVhZCBvZmZzZXQgd2l0aGluIGN1cnJlbnQgcmFuZ2UsIHBhcnRpYWwgY29weS4gKi8KKwkJY250ID0gKGFkdm9mZnNldCArIGNwbGVuKSAtIG9mZnNldDsKKwkJY3AgPSAoY3AgKyBjcGxlbikgLSBjbnQ7CisJCWNudCA9IG1pbihjbnQsIGxlZnRsZW4pOworCQlBU0NfREJHMygyLCAiYXNjX3Byb2NfY29weTogY3VyYnVmIDB4JWx4LCBjcCAweCVseCwgY250ICVkXG4iLAorCQkJICh1bG9uZyljdXJidWYsICh1bG9uZyljcCwgY250KTsKKwkJbWVtY3B5KGN1cmJ1ZiwgY3AsIGNudCk7CisJfQorCXJldHVybiBjbnQ7CiB9CiAKIC8qCkBAIC04NTkwLDI5ICs3NDA3LDI3IEBACiAgKiBOb3RlOiBJZiBhbnkgc2luZ2xlIGxpbmUgaXMgZ3JlYXRlciB0aGFuIEFTQ19QUlRMSU5FX1NJWkUgYnl0ZXMgdGhlIHN0YWNrCiAgKiB3aWxsIGJlIGNvcnJ1cHRlZC4gJ3NbXScgaXMgZGVmaW5lZCB0byBiZSBBU0NfUFJUTElORV9TSVpFIGJ5dGVzLgogICovCi1TVEFUSUMgaW50Ci1hc2NfcHJ0X2xpbmUoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyBpbnQgYXNjX3BydF9saW5lKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgdmFfbGlzdCAgICAgICAgYXJnczsKLSAgICBpbnQgICAgICAgICAgICByZXQ7Ci0gICAgY2hhciAgICAgICAgICAgc1tBU0NfUFJUTElORV9TSVpFXTsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldDsKKwljaGFyIHNbQVNDX1BSVExJTkVfU0laRV07CiAKLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgIHJldCA9IHZzcHJpbnRmKHMsIGZtdCwgYXJncyk7Ci0gICAgQVNDX0FTU0VSVChyZXQgPCBBU0NfUFJUTElORV9TSVpFKTsKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgKHZvaWQpIHByaW50ayhzKTsKLSAgICAgICAgcmV0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBtaW4oYnVmbGVuLCByZXQpOwotICAgICAgICBtZW1jcHkoYnVmLCBzLCByZXQpOwotICAgIH0KLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgcmV0dXJuIHJldDsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXJldCA9IHZzcHJpbnRmKHMsIGZtdCwgYXJncyk7CisJQVNDX0FTU0VSVChyZXQgPCBBU0NfUFJUTElORV9TSVpFKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJKHZvaWQpcHJpbnRrKHMpOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IG1pbihidWZsZW4sIHJldCk7CisJCW1lbWNweShidWYsIHMsIHJldCk7CisJfQorCXZhX2VuZChhcmdzKTsKKwlyZXR1cm4gcmV0OwogfQogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLQogLyoKICAqIC0tLSBGdW5jdGlvbnMgUmVxdWlyZWQgYnkgdGhlIEFzYyBMaWJyYXJ5CiAgKi8KQEAgLTg2MjMsMzEgKzc0MzgsMjggQEAKICAqIGZyb20gYSB0aW1lciBpbnRlcnJ1cHQsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUKICAqIGNhbGxlZCB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgogICovCi1TVEFUSUMgdm9pZAotRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRENOVCBuKQorc3RhdGljIHZvaWQgRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRENOVCBuKQogewotICAgIEFTQ19EQkcxKDQsICJEdmNTbGVlcE1pbGxpU2Vjb25kOiAlbHVcbiIsICh1bG9uZykgbik7Ci0gICAgbWRlbGF5KG4pOworCUFTQ19EQkcxKDQsICJEdmNTbGVlcE1pbGxpU2Vjb25kOiAlbHVcbiIsICh1bG9uZyluKTsKKwltZGVsYXkobik7CiB9CiAKIC8qCiAgKiBDdXJyZW50bHkgYW5kIGlubGluZSBub29wIGJ1dCBsZWF2ZSBhcyBhIHBsYWNlaG9sZGVyLgogICogTGVhdmUgRHZjRW50ZXJDcml0aWNhbCgpIGFzIGEgbm9vcCBwbGFjZWhvbGRlci4KICAqLwotU1RBVElDIGlubGluZSB1bG9uZwotRHZjRW50ZXJDcml0aWNhbCh2b2lkKQorc3RhdGljIGlubGluZSB1bG9uZyBEdmNFbnRlckNyaXRpY2FsKHZvaWQpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBDcml0aWNhbCBzZWN0aW9ucyBhcmUgYWxsIHByb3RlY3RlZCBieSB0aGUgYm9hcmQgc3BpbmxvY2suCiAgKiBMZWF2ZSBEdmNMZWF2ZUNyaXRpY2FsKCkgYXMgYSBub29wIHBsYWNlaG9sZGVyLgogICovCi1TVEFUSUMgaW5saW5lIHZvaWQKLUR2Y0xlYXZlQ3JpdGljYWwodWxvbmcgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgRHZjTGVhdmVDcml0aWNhbCh1bG9uZyBmbGFncykKIHsKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCiAvKgpAQCAtODY2MCwyMCArNzQ3MiwyMCBAQAogICogRGVzY3JpcHRpb246CiAgKiAgICAgT3V0cHV0IGFuIEFTQ19TQ1NJX1Egc3RydWN0dXJlIHRvIHRoZSBjaGlwCiAgKi8KLVNUQVRJQyB2b2lkCitzdGF0aWMgdm9pZAogRHZjUHV0U2NzaVEoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBzX2FkZHIsIHVjaGFyICpvdXRidWYsIGludCB3b3JkcykKIHsKLSAgICBpbnQgICAgaTsKKwlpbnQgaTsKIAotICAgIEFTQ19EQkdfUFJUX0hFWCgyLCAiRHZjUHV0U2NzaVEiLCBvdXRidWYsIDIgKiB3b3Jkcyk7Ci0gICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyICogd29yZHM7IGkgKz0gMikgewotICAgICAgICBpZiAoaSA9PSA0IHx8IGkgPT0gMjApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG91dHB3KGlvcF9iYXNlICsgSU9QX1JBTV9EQVRBLAotICAgICAgICAgICAgKCh1c2hvcnQpIG91dGJ1ZltpICsgMV0gPDwgOCkgfCBvdXRidWZbaV0pOwotICAgIH0KKwlBU0NfREJHX1BSVF9IRVgoMiwgIkR2Y1B1dFNjc2lRIiwgb3V0YnVmLCAyICogd29yZHMpOworCUFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKwkJaWYgKGkgPT0gNCB8fCBpID09IDIwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwKKwkJICAgICAgKCh1c2hvcnQpb3V0YnVmW2kgKyAxXSA8PCA4KSB8IG91dGJ1ZltpXSk7CisJfQogfQogCiAvKgpAQCAtODY4Niw1MiArNzQ5OCw0NiBAQAogICogRGVzY3JpcHRpb246CiAgKiAgICAgSW5wdXQgYW4gQVNDX1FET05FX0lORk8gc3RydWN0dXJlIGZyb20gdGhlIGNoaXAKICAqLwotU1RBVElDIHZvaWQKK3N0YXRpYyB2b2lkCiBEdmNHZXRRaW5mbyhQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IHNfYWRkciwgdWNoYXIgKmluYnVmLCBpbnQgd29yZHMpCiB7Ci0gICAgaW50ICAgIGk7Ci0gICAgdXNob3J0IHdvcmQ7CisJaW50IGk7CisJdXNob3J0IHdvcmQ7CiAKLSAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHNfYWRkcik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDIgKiB3b3JkczsgaSArPSAyKSB7Ci0gICAgICAgIGlmIChpID09IDEwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB3b3JkID0gaW5wdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSk7Ci0gICAgICAgIGluYnVmW2ldID0gd29yZCAmIDB4ZmY7Ci0gICAgICAgIGluYnVmW2kgKyAxXSA9ICh3b3JkID4+IDgpICYgMHhmZjsKLSAgICB9Ci0gICAgQVNDX0RCR19QUlRfSEVYKDIsICJEdmNHZXRRaW5mbyIsIGluYnVmLCAyICogd29yZHMpOworCUFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKwkJaWYgKGkgPT0gMTApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdvcmQgPSBpbnB3KGlvcF9iYXNlICsgSU9QX1JBTV9EQVRBKTsKKwkJaW5idWZbaV0gPSB3b3JkICYgMHhmZjsKKwkJaW5idWZbaSArIDFdID0gKHdvcmQgPj4gOCkgJiAweGZmOworCX0KKwlBU0NfREJHX1BSVF9IRVgoMiwgIkR2Y0dldFFpbmZvIiwgaW5idWYsIDIgKiB3b3Jkcyk7CiB9CiAKIC8qCiAgKiBSZWFkIGEgUENJIGNvbmZpZ3VyYXRpb24gYnl0ZS4KICAqLwotU1RBVElDIHVjaGFyIF9faW5pdAotRHZjUmVhZFBDSUNvbmZpZ0J5dGUoCi0gICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAotICAgICAgICB1c2hvcnQgb2Zmc2V0KQorc3RhdGljIHVjaGFyIF9faW5pdCBEdmNSZWFkUENJQ29uZmlnQnl0ZShBU0NfRFZDX1ZBUiAqYXNjX2R2YywgdXNob3J0IG9mZnNldCkKIHsKICNpZmRlZiBDT05GSUdfUENJCi0gICAgdWNoYXIgYnl0ZV9kYXRhOwotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKHRvX3BjaV9kZXYoYXNjX2R2Yy0+Y2ZnLT5kZXYpLCBvZmZzZXQsICZieXRlX2RhdGEpOwotICAgIHJldHVybiBieXRlX2RhdGE7CisJdWNoYXIgYnl0ZV9kYXRhOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHRvX3BjaV9kZXYoYXNjX2R2Yy0+Y2ZnLT5kZXYpLCBvZmZzZXQsICZieXRlX2RhdGEpOworCXJldHVybiBieXRlX2RhdGE7CiAjZWxzZSAvKiAhZGVmaW5lZChDT05GSUdfUENJKSAqLwotICAgIHJldHVybiAwOworCXJldHVybiAwOwogI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19QQ0kpICovCiB9CiAKIC8qCiAgKiBXcml0ZSBhIFBDSSBjb25maWd1cmF0aW9uIGJ5dGUuCiAgKi8KLVNUQVRJQyB2b2lkIF9faW5pdAotRHZjV3JpdGVQQ0lDb25maWdCeXRlKAotICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKLSAgICAgICAgdXNob3J0IG9mZnNldCwKLSAgICAgICAgdWNoYXIgIGJ5dGVfZGF0YSkKK3N0YXRpYyB2b2lkIF9faW5pdAorRHZjV3JpdGVQQ0lDb25maWdCeXRlKEFTQ19EVkNfVkFSICphc2NfZHZjLCB1c2hvcnQgb2Zmc2V0LCB1Y2hhciBieXRlX2RhdGEpCiB7CiAjaWZkZWYgQ09ORklHX1BDSQotICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCBieXRlX2RhdGEpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCBieXRlX2RhdGEpOwogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIH0KIApAQCAtODczOSw1MSArNzU0NSw0MyBAQAogICogUmV0dXJuIHRoZSBCSU9TIGFkZHJlc3Mgb2YgdGhlIGFkYXB0ZXIgYXQgdGhlIHNwZWNpZmllZAogICogSS9PIHBvcnQgYW5kIHdpdGggdGhlIHNwZWNpZmllZCBidXMgdHlwZS4KICAqLwotU1RBVElDIHVzaG9ydCBfX2luaXQKLUFzY0dldENoaXBCaW9zQWRkcmVzcygKLSAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgIHVzaG9ydCBidXNfdHlwZSkKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY0dldENoaXBCaW9zQWRkcmVzcyhQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IGJ1c190eXBlKQogewotICAgIHVzaG9ydCAgY2ZnX2xzdzsKLSAgICB1c2hvcnQgIGJpb3NfYWRkcjsKKwl1c2hvcnQgY2ZnX2xzdzsKKwl1c2hvcnQgYmlvc19hZGRyOwogCi0gICAgLyoKLSAgICAgKiBUaGUgUENJIEJJT1MgaXMgcmUtbG9jYXRlZCBieSB0aGUgbW90aGVyYm9hcmQgQklPUy4gQmVjYXVzZQotICAgICAqIG9mIHRoaXMgdGhlIGRyaXZlciBjYW4gbm90IGRldGVybWluZSB3aGVyZSBhIFBDSSBCSU9TIGlzCi0gICAgICogbG9hZGVkIGFuZCBleGVjdXRlcy4KLSAgICAgKi8KLSAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfUENJKQotICAgIHsKLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLQorCS8qCisJICogVGhlIFBDSSBCSU9TIGlzIHJlLWxvY2F0ZWQgYnkgdGhlIG1vdGhlcmJvYXJkIEJJT1MuIEJlY2F1c2UKKwkgKiBvZiB0aGlzIHRoZSBkcml2ZXIgY2FuIG5vdCBkZXRlcm1pbmUgd2hlcmUgYSBQQ0kgQklPUyBpcworCSAqIGxvYWRlZCBhbmQgZXhlY3V0ZXMuCisJICovCisJaWYgKGJ1c190eXBlICYgQVNDX0lTX1BDSSkgeworCQlyZXR1cm4gKDApOworCX0KICNpZmRlZiBDT05GSUdfSVNBCi0gICAgaWYoKGJ1c190eXBlICYgQVNDX0lTX0VJU0EpICE9IDApCi0gICAgewotICAgICAgICBjZmdfbHN3ID0gQXNjR2V0RWlzYUNoaXBDZmcoaW9wX2Jhc2UpOwotICAgICAgICBjZmdfbHN3ICY9IDB4MDAwRjsKLSAgICAgICAgYmlvc19hZGRyID0gKHVzaG9ydCkoQVNDX0JJT1NfTUlOX0FERFIgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNmZ19sc3cgKiBBU0NfQklPU19CQU5LX1NJWkUpKTsKLSAgICAgICAgcmV0dXJuKGJpb3NfYWRkcik7Ci0gICAgfS8qIGlmICovCisJaWYgKChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSAhPSAwKSB7CisJCWNmZ19sc3cgPSBBc2NHZXRFaXNhQ2hpcENmZyhpb3BfYmFzZSk7CisJCWNmZ19sc3cgJj0gMHgwMDBGOworCQliaW9zX2FkZHIgPSAodXNob3J0KShBU0NfQklPU19NSU5fQUREUiArCisJCQkJICAgICAoY2ZnX2xzdyAqIEFTQ19CSU9TX0JBTktfU0laRSkpOworCQlyZXR1cm4gKGJpb3NfYWRkcik7CisJfQkJCS8qIGlmICovCiAjZW5kaWYgLyogQ09ORklHX0lTQSAqLwogCi0gICAgY2ZnX2xzdyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOworCWNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKIAotICAgIC8qCi0gICAgKiAgSVNBIFBuUCB1c2VzIHRoZSB0b3AgYml0IGFzIHRoZSAzMksgQklPUyBmbGFnCi0gICAgKi8KLSAgICBpZiAoYnVzX3R5cGUgPT0gQVNDX0lTX0lTQVBOUCkKLSAgICB7Ci0gICAgICAgIGNmZ19sc3cgJj0gMHg3RkZGOwotICAgIH0vKiBpZiAqLwotCi0gICAgYmlvc19hZGRyID0gKHVzaG9ydCkoKChjZmdfbHN3ID4+IDEyKSAqIEFTQ19CSU9TX0JBTktfU0laRSkgKwotICAgICAgICAgICAgQVNDX0JJT1NfTUlOX0FERFIpOwotICAgIHJldHVybihiaW9zX2FkZHIpOworCS8qCisJICogIElTQSBQblAgdXNlcyB0aGUgdG9wIGJpdCBhcyB0aGUgMzJLIEJJT1MgZmxhZworCSAqLworCWlmIChidXNfdHlwZSA9PSBBU0NfSVNfSVNBUE5QKSB7CisJCWNmZ19sc3cgJj0gMHg3RkZGOworCX0KKwkvKiBpZiAqLworCWJpb3NfYWRkciA9ICh1c2hvcnQpKCgoY2ZnX2xzdyA+PiAxMikgKiBBU0NfQklPU19CQU5LX1NJWkUpICsKKwkJCSAgICAgQVNDX0JJT1NfTUlOX0FERFIpOworCXJldHVybiAoYmlvc19hZGRyKTsKIH0KIAotCiAvKgogICogLS0tIEZ1bmN0aW9ucyBSZXF1aXJlZCBieSB0aGUgQWR2IExpYnJhcnkKICAqLwpAQCAtODgwMSw0OSArNzU5OSw0NCBAQAogICovCiBBRFZfUEFERFIKIER2Y0dldFBoeUFkZHIoQURWX0RWQ19WQVIgKmFzY19kdmMsIEFEVl9TQ1NJX1JFUV9RICpzY3NpcSwKLSAgICAgICAgdWNoYXIgKnZhZGRyLCBBRFZfU0RDTlQgKmxlbnAsIGludCBmbGFnKQorCSAgICAgIHVjaGFyICp2YWRkciwgQURWX1NEQ05UICpsZW5wLCBpbnQgZmxhZykKIHsKLSAgICBBRFZfUEFERFIgICAgICAgICAgIHBhZGRyOworCUFEVl9QQUREUiBwYWRkcjsKIAotICAgIHBhZGRyID0gdmlydF90b19idXModmFkZHIpOworCXBhZGRyID0gdmlydF90b19idXModmFkZHIpOwogCi0gICAgQVNDX0RCRzQoNCwKLSAgICAgICAgIkR2Y0dldFBoeUFkZHI6IHZhZGRyIDB4JWx4LCBsZW5wIDB4JWx4ICpsZW5wICVsdSwgcGFkZHIgMHglbHhcbiIsCi0gICAgICAgICh1bG9uZykgdmFkZHIsICh1bG9uZykgbGVucCwgKHVsb25nKSAqKCh1bG9uZyAqKSBsZW5wKSwgKHVsb25nKSBwYWRkcik7CisJQVNDX0RCRzQoNCwKKwkJICJEdmNHZXRQaHlBZGRyOiB2YWRkciAweCVseCwgbGVucCAweCVseCAqbGVucCAlbHUsIHBhZGRyIDB4JWx4XG4iLAorCQkgKHVsb25nKXZhZGRyLCAodWxvbmcpbGVucCwgKHVsb25nKSooKHVsb25nICopbGVucCksCisJCSAodWxvbmcpcGFkZHIpOwogCi0gICAgcmV0dXJuIHBhZGRyOworCXJldHVybiBwYWRkcjsKIH0KIAogLyoKICAqIFJlYWQgYSBQQ0kgY29uZmlndXJhdGlvbiBieXRlLgogICovCi1TVEFUSUMgdWNoYXIgX19pbml0Ci1EdmNBZHZSZWFkUENJQ29uZmlnQnl0ZSgKLSAgICAgICAgQURWX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgIHVzaG9ydCBvZmZzZXQpCitzdGF0aWMgdWNoYXIgX19pbml0IER2Y0FkdlJlYWRQQ0lDb25maWdCeXRlKEFEVl9EVkNfVkFSICphc2NfZHZjLCB1c2hvcnQgb2Zmc2V0KQogewogI2lmZGVmIENPTkZJR19QQ0kKLSAgICB1Y2hhciBieXRlX2RhdGE7Ci0gICAgcGNpX3JlYWRfY29uZmlnX2J5dGUodG9fcGNpX2Rldihhc2NfZHZjLT5jZmctPmRldiksIG9mZnNldCwgJmJ5dGVfZGF0YSk7Ci0gICAgcmV0dXJuIGJ5dGVfZGF0YTsKKwl1Y2hhciBieXRlX2RhdGE7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUodG9fcGNpX2Rldihhc2NfZHZjLT5jZmctPmRldiksIG9mZnNldCwgJmJ5dGVfZGF0YSk7CisJcmV0dXJuIGJ5dGVfZGF0YTsKICNlbHNlIC8qIENPTkZJR19QQ0kgKi8KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiB9CiAKIC8qCiAgKiBXcml0ZSBhIFBDSSBjb25maWd1cmF0aW9uIGJ5dGUuCiAgKi8KLVNUQVRJQyB2b2lkIF9faW5pdAotRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKAotICAgICAgICBBRFZfRFZDX1ZBUiAqYXNjX2R2YywKLSAgICAgICAgdXNob3J0IG9mZnNldCwKLSAgICAgICAgdWNoYXIgIGJ5dGVfZGF0YSkKK3N0YXRpYyB2b2lkIF9faW5pdAorRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKEFEVl9EVkNfVkFSICphc2NfZHZjLCB1c2hvcnQgb2Zmc2V0LCB1Y2hhciBieXRlX2RhdGEpCiB7CiAjaWZkZWYgQ09ORklHX1BDSQotICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCBieXRlX2RhdGEpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZSh0b19wY2lfZGV2KGFzY19kdmMtPmNmZy0+ZGV2KSwgb2Zmc2V0LCBieXRlX2RhdGEpOwogI2Vsc2UgLyogQ09ORklHX1BDSSAqLwotICAgIHJldHVybjsKKwlyZXR1cm47CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogfQogCkBAIC04ODYyLDk3ICs3NjU1LDk4IEBACiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvICdjcCcuIE5vIG1vcmUgdGhhbgogICogJ2NwbGVuJyBjaGFyYWN0ZXJzIHdpbGwgYmUgY29waWVkIHRvICdjcCcuCiAgKi8KLVNUQVRJQyBpbnQKLWFzY19wcnRfYm9hcmRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBjaGFyICpjcCwgaW50IGNwbGVuKQorc3RhdGljIGludCBhc2NfcHJ0X2JvYXJkX3N0YXRzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpjcCwgaW50IGNwbGVuKQogewotICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVmdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIHRvdGxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBzdHJ1Y3QgYXNjX3N0YXRzICAgICAgICpzOwotICAgIGFzY19ib2FyZF90ICAgICAgICAgICAgKmJvYXJkcDsKKwlpbnQgbGVmdGxlbjsKKwlpbnQgdG90bGVuOworCWludCBsZW47CisJc3RydWN0IGFzY19zdGF0cyAqczsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOwogCi0gICAgbGVmdGxlbiA9IGNwbGVuOwotICAgIHRvdGxlbiA9IGxlbiA9IDA7CisJbGVmdGxlbiA9IGNwbGVuOworCXRvdGxlbiA9IGxlbiA9IDA7CiAKLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7Ci0gICAgcyA9ICZib2FyZHAtPmFzY19zdGF0czsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlzID0gJmJvYXJkcC0+YXNjX3N0YXRzOwogCi0gICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIlxuTGludXggRHJpdmVyIFN0YXRpc3RpY3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsIHNocC0+aG9zdF9ubyk7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIlxuTGludXggRHJpdmVyIFN0YXRpc3RpY3MgZm9yIEFkdmFuU3lzIFNDU0kgSG9zdCAlZDpcbiIsCisJCQkgICBzaG9zdC0+aG9zdF9ubyk7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIHF1ZXVlY29tbWFuZCAlbHUsIHJlc2V0ICVsdSwgYmlvc3BhcmFtICVsdSwgaW50ZXJydXB0ICVsdVxuIiwKLSAgICAgICAgcy0+cXVldWVjb21tYW5kLCBzLT5yZXNldCwgcy0+Ymlvc3BhcmFtLCBzLT5pbnRlcnJ1cHQpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCSAgICIgcXVldWVjb21tYW5kICVsdSwgcmVzZXQgJWx1LCBiaW9zcGFyYW0gJWx1LCBpbnRlcnJ1cHQgJWx1XG4iLAorCQkJICAgcy0+cXVldWVjb21tYW5kLCBzLT5yZXNldCwgcy0+Ymlvc3BhcmFtLAorCQkJICAgcy0+aW50ZXJydXB0KTsKKwlBU0NfUFJUX05FWFQoKTsKIAotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgY2FsbGJhY2sgJWx1LCBkb25lICVsdSwgYnVpbGRfZXJyb3IgJWx1LCBidWlsZF9ub3JlcSAlbHUsIGJ1aWxkX25vc2cgJWx1XG4iLAotICAgICAgICBzLT5jYWxsYmFjaywgcy0+ZG9uZSwgcy0+YnVpbGRfZXJyb3IsIHMtPmFkdl9idWlsZF9ub3JlcSwKLSAgICAgICAgcy0+YWR2X2J1aWxkX25vc2cpOwotICAgIEFTQ19QUlRfTkVYVCgpOworCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKKwkJCSAgICIgY2FsbGJhY2sgJWx1LCBkb25lICVsdSwgYnVpbGRfZXJyb3IgJWx1LCBidWlsZF9ub3JlcSAlbHUsIGJ1aWxkX25vc2cgJWx1XG4iLAorCQkJICAgcy0+Y2FsbGJhY2ssIHMtPmRvbmUsIHMtPmJ1aWxkX2Vycm9yLAorCQkJICAgcy0+YWR2X2J1aWxkX25vcmVxLCBzLT5hZHZfYnVpbGRfbm9zZyk7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iIGV4ZV9ub2Vycm9yICVsdSwgZXhlX2J1c3kgJWx1LCBleGVfZXJyb3IgJWx1LCBleGVfdW5rbm93biAlbHVcbiIsCi0gICAgICAgIHMtPmV4ZV9ub2Vycm9yLCBzLT5leGVfYnVzeSwgcy0+ZXhlX2Vycm9yLCBzLT5leGVfdW5rbm93bik7Ci0gICAgQVNDX1BSVF9ORVhUKCk7CisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBleGVfbm9lcnJvciAlbHUsIGV4ZV9idXN5ICVsdSwgZXhlX2Vycm9yICVsdSwgZXhlX3Vua25vd24gJWx1XG4iLAorCQkJICAgcy0+ZXhlX25vZXJyb3IsIHMtPmV4ZV9idXN5LCBzLT5leGVfZXJyb3IsCisJCQkgICBzLT5leGVfdW5rbm93bik7CisJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICAvKgotICAgICAqIERpc3BsYXkgZGF0YSB0cmFuc2ZlciBzdGF0aXN0aWNzLgotICAgICAqLwotICAgIGlmIChzLT5jb250X2NudCA+IDApIHsKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIGNvbnRfY250ICVsdSwgIiwgcy0+Y29udF9jbnQpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkvKgorCSAqIERpc3BsYXkgZGF0YSB0cmFuc2ZlciBzdGF0aXN0aWNzLgorCSAqLworCWlmIChzLT5jb250X2NudCA+IDApIHsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIGNvbnRfY250ICVsdSwgIiwgcy0+Y29udF9jbnQpOworCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJjb250X3hmZXIgJWx1LiUwMWx1IGtiICIsCi0gICAgICAgICAgICAgICAgICAgIHMtPmNvbnRfeGZlci8yLAotICAgICAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKHMtPmNvbnRfeGZlciwgMikpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiY29udF94ZmVyICVsdS4lMDFsdSBrYiAiLAorCQkJCSAgIHMtPmNvbnRfeGZlciAvIDIsCisJCQkJICAgQVNDX1RFTlRIUyhzLT5jb250X3hmZXIsIDIpKTsKKwkJQVNDX1BSVF9ORVhUKCk7CiAKLSAgICAgICAgLyogQ29udGlndW91cyB0cmFuc2ZlciBhdmVyYWdlIHNpemUgKi8KLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiYXZnX3hmZXIgJWx1LiUwMWx1IGtiXG4iLAotICAgICAgICAgICAgICAgICAgICAocy0+Y29udF94ZmVyLzIpL3MtPmNvbnRfY250LAotICAgICAgICAgICAgICAgICAgICBBU0NfVEVOVEhTKChzLT5jb250X3hmZXIvMiksIHMtPmNvbnRfY250KSk7Ci0gICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgIH0KKwkJLyogQ29udGlndW91cyB0cmFuc2ZlciBhdmVyYWdlIHNpemUgKi8KKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiYXZnX3hmZXIgJWx1LiUwMWx1IGtiXG4iLAorCQkJCSAgIChzLT5jb250X3hmZXIgLyAyKSAvIHMtPmNvbnRfY250LAorCQkJCSAgIEFTQ19URU5USFMoKHMtPmNvbnRfeGZlciAvIDIpLCBzLT5jb250X2NudCkpOworCQlBU0NfUFJUX05FWFQoKTsKKwl9CiAKLSAgICBpZiAocy0+c2dfY250ID4gMCkgeworCWlmIChzLT5zZ19jbnQgPiAwKSB7CiAKLSAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIHNnX2NudCAlbHUsIHNnX2VsZW0gJWx1LCAiLAotICAgICAgICAgICAgICAgICAgICBzLT5zZ19jbnQsIHMtPnNnX2VsZW0pOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIHNnX2NudCAlbHUsIHNnX2VsZW0gJWx1LCAiLAorCQkJCSAgIHMtPnNnX2NudCwgcy0+c2dfZWxlbSk7CisJCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgInNnX3hmZXIgJWx1LiUwMWx1IGtiXG4iLAotICAgICAgICAgICAgICAgICAgICBzLT5zZ194ZmVyLzIsCi0gICAgICAgICAgICAgICAgICAgIEFTQ19URU5USFMocy0+c2dfeGZlciwgMikpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAic2dfeGZlciAlbHUuJTAxbHUga2JcbiIsCisJCQkJICAgcy0+c2dfeGZlciAvIDIsIEFTQ19URU5USFMocy0+c2dfeGZlciwgMikpOworCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICAvKiBTY2F0dGVyIGdhdGhlciB0cmFuc2ZlciBzdGF0aXN0aWNzICovCi0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgIiBhdmdfbnVtX2VsZW0gJWx1LiUwMWx1LCAiLAotICAgICAgICAgICAgICAgICAgICBzLT5zZ19lbGVtL3MtPnNnX2NudCwKLSAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUyhzLT5zZ19lbGVtLCBzLT5zZ19jbnQpKTsKLSAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisJCS8qIFNjYXR0ZXIgZ2F0aGVyIHRyYW5zZmVyIHN0YXRpc3RpY3MgKi8KKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIGF2Z19udW1fZWxlbSAlbHUuJTAxbHUsICIsCisJCQkJICAgcy0+c2dfZWxlbSAvIHMtPnNnX2NudCwKKwkJCQkgICBBU0NfVEVOVEhTKHMtPnNnX2VsZW0sIHMtPnNnX2NudCkpOworCQlBU0NfUFJUX05FWFQoKTsKIAotICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICJhdmdfZWxlbV9zaXplICVsdS4lMDFsdSBrYiwgIiwKLSAgICAgICAgICAgICAgICAgICAgKHMtPnNnX3hmZXIvMikvcy0+c2dfZWxlbSwKLSAgICAgICAgICAgICAgICAgICAgQVNDX1RFTlRIUygocy0+c2dfeGZlci8yKSwgcy0+c2dfZWxlbSkpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKKwkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiYXZnX2VsZW1fc2l6ZSAlbHUuJTAxbHUga2IsICIsCisJCQkJICAgKHMtPnNnX3hmZXIgLyAyKSAvIHMtPnNnX2VsZW0sCisJCQkJICAgQVNDX1RFTlRIUygocy0+c2dfeGZlciAvIDIpLCBzLT5zZ19lbGVtKSk7CisJCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgImF2Z194ZmVyX3NpemUgJWx1LiUwMWx1IGtiXG4iLAotICAgICAgICAgICAgICAgICAgICAocy0+c2dfeGZlci8yKS9zLT5zZ19jbnQsCi0gICAgICAgICAgICAgICAgICAgIEFTQ19URU5USFMoKHMtPnNnX3hmZXIvMiksIHMtPnNnX2NudCkpOwotICAgICAgICBBU0NfUFJUX05FWFQoKTsKLSAgICB9CisJCWxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwgImF2Z194ZmVyX3NpemUgJWx1LiUwMWx1IGtiXG4iLAorCQkJCSAgIChzLT5zZ194ZmVyIC8gMikgLyBzLT5zZ19jbnQsCisJCQkJICAgQVNDX1RFTlRIUygocy0+c2dfeGZlciAvIDIpLCBzLT5zZ19jbnQpKTsKKwkJQVNDX1BSVF9ORVhUKCk7CisJfQogCi0gICAgLyoKLSAgICAgKiBEaXNwbGF5IHJlcXVlc3QgcXVldWluZyBzdGF0aXN0aWNzLgotICAgICAqLwotICAgIGxlbiA9IGFzY19wcnRfbGluZShjcCwgbGVmdGxlbiwKLSIgQWN0aXZlIGFuZCBXYWl0aW5nIFJlcXVlc3QgUXVldWVzIChUaW1lIFVuaXQ6ICVkIEhaKTpcbiIsIEhaKTsKLSAgICBBU0NfUFJUX05FWFQoKTsKKwkvKgorCSAqIERpc3BsYXkgcmVxdWVzdCBxdWV1aW5nIHN0YXRpc3RpY3MuCisJICovCisJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAorCQkJICAgIiBBY3RpdmUgYW5kIFdhaXRpbmcgUmVxdWVzdCBRdWV1ZXMgKFRpbWUgVW5pdDogJWQgSFopOlxuIiwKKwkJCSAgIEhaKTsKKwlBU0NfUFJUX05FWFQoKTsKIAotCi0gICAgIHJldHVybiB0b3RsZW47CisJcmV0dXJuIHRvdGxlbjsKIH0KIAogLyoKQEAgLTg5NjcsNzAgKzc3NjEsODkgQEAKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gJ2NwJy4gTm8gbW9yZSB0aGFuCiAgKiAnY3BsZW4nIGNoYXJhY3RlcnMgd2lsbCBiZSBjb3BpZWQgdG8gJ2NwJy4KICAqLwotU1RBVElDIGludAotYXNjX3BydF90YXJnZXRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwLCBpbnQgdGd0X2lkLCBjaGFyICpjcCwgaW50IGNwbGVuKQorc3RhdGljIGludAorYXNjX3BydF90YXJnZXRfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGludCB0Z3RfaWQsIGNoYXIgKmNwLCBpbnQgY3BsZW4pCiB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBsZWZ0bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgdG90bGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIHN0cnVjdCBhc2Nfc3RhdHMgICAgICAgKnM7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgICBjaGlwX3Njc2lfaWQ7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAgICAqYm9hcmRwOwotICAgIGFzY19xdWV1ZV90ICAgICAgICAgICAgKmFjdGl2ZTsKLSAgICBhc2NfcXVldWVfdCAgICAgICAgICAgICp3YWl0aW5nOworCWludCBsZWZ0bGVuOworCWludCB0b3RsZW47CisJaW50IGxlbjsKKwlzdHJ1Y3QgYXNjX3N0YXRzICpzOworCXVzaG9ydCBjaGlwX3Njc2lfaWQ7CisJYXNjX2JvYXJkX3QgKmJvYXJkcDsKKwlhc2NfcXVldWVfdCAqYWN0aXZlOworCWFzY19xdWV1ZV90ICp3YWl0aW5nOwogCi0gICAgbGVmdGxlbiA9IGNwbGVuOwotICAgIHRvdGxlbiA9IGxlbiA9IDA7CisJbGVmdGxlbiA9IGNwbGVuOworCXRvdGxlbiA9IGxlbiA9IDA7CiAKLSAgICBib2FyZHAgPSBBU0NfQk9BUkRQKHNocCk7Ci0gICAgcyA9ICZib2FyZHAtPmFzY19zdGF0czsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlzID0gJmJvYXJkcC0+YXNjX3N0YXRzOwogCi0gICAgYWN0aXZlID0gJkFTQ19CT0FSRFAoc2hwKS0+YWN0aXZlOwotICAgIHdhaXRpbmcgPSAmQVNDX0JPQVJEUChzaHApLT53YWl0aW5nOworCWFjdGl2ZSA9ICZBU0NfQk9BUkRQKHNob3N0KS0+YWN0aXZlOworCXdhaXRpbmcgPSAmQVNDX0JPQVJEUChzaG9zdCktPndhaXRpbmc7CiAKLSAgICBpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7Ci0gICAgICAgIGNoaXBfc2NzaV9pZCA9IGJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZy5jaGlwX3Njc2lfaWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hpcF9zY3NpX2lkID0gYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyLmNoaXBfc2NzaV9pZDsKLSAgICB9CisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCQljaGlwX3Njc2lfaWQgPSBib2FyZHAtPmR2Y19jZmcuYXNjX2R2Y19jZmcuY2hpcF9zY3NpX2lkOworCX0gZWxzZSB7CisJCWNoaXBfc2NzaV9pZCA9IGJvYXJkcC0+ZHZjX3Zhci5hZHZfZHZjX3Zhci5jaGlwX3Njc2lfaWQ7CisJfQogCi0gICAgaWYgKChjaGlwX3Njc2lfaWQgPT0gdGd0X2lkKSB8fAotICAgICAgICAoKGJvYXJkcC0+aW5pdF90aWRtYXNrICYgQURWX1RJRF9UT19USURNQVNLKHRndF9pZCkpID09IDApKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlpZiAoKGNoaXBfc2NzaV9pZCA9PSB0Z3RfaWQpIHx8CisJICAgICgoYm9hcmRwLT5pbml0X3RpZG1hc2sgJiBBRFZfVElEX1RPX1RJRE1BU0sodGd0X2lkKSkgPT0gMCkpIHsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgZG8gewotICAgICAgICBpZiAoYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSA+IDAgfHwgd2FpdGluZy0+cV90b3RfY250W3RndF9pZF0gPiAwKSB7Ci0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sICIgdGFyZ2V0ICVkXG4iLCB0Z3RfaWQpOwotICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisJZG8geworCQlpZiAoYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSA+IDAKKwkJICAgIHx8IHdhaXRpbmctPnFfdG90X2NudFt0Z3RfaWRdID4gMCkgeworCQkJbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLCAiIHRhcmdldCAlZFxuIiwgdGd0X2lkKTsKKwkJCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgICAgICAgICBsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCi0iICAgYWN0aXZlOiBjbnQgW2N1ciAlZCwgbWF4ICVkLCB0b3QgJXVdLCB0aW1lIFttaW4gJWQsIG1heCAlZCwgYXZnICVsdS4lMDFsdV1cbiIsCi0gICAgICAgICAgICAgICAgYWN0aXZlLT5xX2N1cl9jbnRbdGd0X2lkXSwgYWN0aXZlLT5xX21heF9jbnRbdGd0X2lkXSwKLSAgICAgICAgICAgICAgICBhY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdLAotICAgICAgICAgICAgICAgIGFjdGl2ZS0+cV9taW5fdGltW3RndF9pZF0sIGFjdGl2ZS0+cV9tYXhfdGltW3RndF9pZF0sCi0gICAgICAgICAgICAgICAgKGFjdGl2ZS0+cV90b3RfY250W3RndF9pZF0gPT0gMCkgPyAwIDoKLSAgICAgICAgICAgICAgICAoYWN0aXZlLT5xX3RvdF90aW1bdGd0X2lkXS9hY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdKSwKLSAgICAgICAgICAgICAgICAoYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSA9PSAwKSA/IDAgOgotICAgICAgICAgICAgICAgIEFTQ19URU5USFMoYWN0aXZlLT5xX3RvdF90aW1bdGd0X2lkXSwKLSAgICAgICAgICAgICAgICBhY3RpdmUtPnFfdG90X2NudFt0Z3RfaWRdKSk7Ci0gICAgICAgICAgICAgQVNDX1BSVF9ORVhUKCk7CisJCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJCSAgICIgICBhY3RpdmU6IGNudCBbY3VyICVkLCBtYXggJWQsIHRvdCAldV0sIHRpbWUgW21pbiAlZCwgbWF4ICVkLCBhdmcgJWx1LiUwMWx1XVxuIiwKKwkJCQkJICAgYWN0aXZlLT5xX2N1cl9jbnRbdGd0X2lkXSwKKwkJCQkJICAgYWN0aXZlLT5xX21heF9jbnRbdGd0X2lkXSwKKwkJCQkJICAgYWN0aXZlLT5xX3RvdF9jbnRbdGd0X2lkXSwKKwkJCQkJICAgYWN0aXZlLT5xX21pbl90aW1bdGd0X2lkXSwKKwkJCQkJICAgYWN0aXZlLT5xX21heF90aW1bdGd0X2lkXSwKKwkJCQkJICAgKGFjdGl2ZS0+cV90b3RfY250W3RndF9pZF0gPT0KKwkJCQkJICAgIDApID8gMCA6IChhY3RpdmUtPgorCQkJCQkJICAgICAgcV90b3RfdGltW3RndF9pZF0gLworCQkJCQkJICAgICAgYWN0aXZlLT4KKwkJCQkJCSAgICAgIHFfdG90X2NudFt0Z3RfaWRdKSwKKwkJCQkJICAgKGFjdGl2ZS0+cV90b3RfY250W3RndF9pZF0gPT0KKwkJCQkJICAgIDApID8gMCA6IEFTQ19URU5USFMoYWN0aXZlLT4KKwkJCQkJCQkJcV90b3RfdGltCisJCQkJCQkJCVt0Z3RfaWRdLAorCQkJCQkJCQlhY3RpdmUtPgorCQkJCQkJCQlxX3RvdF9jbnQKKwkJCQkJCQkJW3RndF9pZF0pKTsKKwkJCUFTQ19QUlRfTkVYVCgpOwogCi0gICAgICAgICAgICAgbGVuID0gYXNjX3BydF9saW5lKGNwLCBsZWZ0bGVuLAotIiAgIHdhaXRpbmc6IGNudCBbY3VyICVkLCBtYXggJWQsIHRvdCAldV0sIHRpbWUgW21pbiAldSwgbWF4ICV1LCBhdmcgJWx1LiUwMWx1XVxuIiwKLSAgICAgICAgICAgICAgICB3YWl0aW5nLT5xX2N1cl9jbnRbdGd0X2lkXSwgd2FpdGluZy0+cV9tYXhfY250W3RndF9pZF0sCi0gICAgICAgICAgICAgICAgd2FpdGluZy0+cV90b3RfY250W3RndF9pZF0sCi0gICAgICAgICAgICAgICAgd2FpdGluZy0+cV9taW5fdGltW3RndF9pZF0sIHdhaXRpbmctPnFfbWF4X3RpbVt0Z3RfaWRdLAotICAgICAgICAgICAgICAgICh3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSA9PSAwKSA/IDAgOgotICAgICAgICAgICAgICAgICh3YWl0aW5nLT5xX3RvdF90aW1bdGd0X2lkXS93YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSksCi0gICAgICAgICAgICAgICAgKHdhaXRpbmctPnFfdG90X2NudFt0Z3RfaWRdID09IDApID8gMCA6Ci0gICAgICAgICAgICAgICAgQVNDX1RFTlRIUyh3YWl0aW5nLT5xX3RvdF90aW1bdGd0X2lkXSwKLSAgICAgICAgICAgICAgICB3YWl0aW5nLT5xX3RvdF9jbnRbdGd0X2lkXSkpOwotICAgICAgICAgICAgIEFTQ19QUlRfTkVYVCgpOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoMCk7CisJCQlsZW4gPSBhc2NfcHJ0X2xpbmUoY3AsIGxlZnRsZW4sCisJCQkJCSAgICIgICB3YWl0aW5nOiBjbnQgW2N1ciAlZCwgbWF4ICVkLCB0b3QgJXVdLCB0aW1lIFttaW4gJXUsIG1heCAldSwgYXZnICVsdS4lMDFsdV1cbiIsCisJCQkJCSAgIHdhaXRpbmctPnFfY3VyX2NudFt0Z3RfaWRdLAorCQkJCQkgICB3YWl0aW5nLT5xX21heF9jbnRbdGd0X2lkXSwKKwkJCQkJICAgd2FpdGluZy0+cV90b3RfY250W3RndF9pZF0sCisJCQkJCSAgIHdhaXRpbmctPnFfbWluX3RpbVt0Z3RfaWRdLAorCQkJCQkgICB3YWl0aW5nLT5xX21heF90aW1bdGd0X2lkXSwKKwkJCQkJICAgKHdhaXRpbmctPnFfdG90X2NudFt0Z3RfaWRdID09CisJCQkJCSAgICAwKSA/IDAgOiAod2FpdGluZy0+CisJCQkJCQkgICAgICBxX3RvdF90aW1bdGd0X2lkXSAvCisJCQkJCQkgICAgICB3YWl0aW5nLT4KKwkJCQkJCSAgICAgIHFfdG90X2NudFt0Z3RfaWRdKSwKKwkJCQkJICAgKHdhaXRpbmctPnFfdG90X2NudFt0Z3RfaWRdID09CisJCQkJCSAgICAwKSA/IDAgOiBBU0NfVEVOVEhTKHdhaXRpbmctPgorCQkJCQkJCQlxX3RvdF90aW0KKwkJCQkJCQkJW3RndF9pZF0sCisJCQkJCQkJCXdhaXRpbmctPgorCQkJCQkJCQlxX3RvdF9jbnQKKwkJCQkJCQkJW3RndF9pZF0pKTsKKwkJCUFTQ19QUlRfTkVYVCgpOworCQl9CisJfSB3aGlsZSAoMCk7CiAKLSAgICAgcmV0dXJuIHRvdGxlbjsKKwlyZXR1cm4gdG90bGVuOwogfQogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAjZW5kaWYgLyogQURWQU5TWVNfU1RBVFMgKi8KQEAgLTkwMzksMjA3ICs3ODUyLDE4MSBAQAogLyoKICAqIGFzY19wcnRfc2NzaV9ob3N0KCkKICAqLwotU1RBVElDIHZvaWQKLWFzY19wcnRfc2NzaV9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnMpCitzdGF0aWMgdm9pZCBhc2NfcHJ0X3Njc2lfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzKQogewotICAgIGFzY19ib2FyZF90ICAgICAgICAgKmJvYXJkcDsKKwlhc2NfYm9hcmRfdCAqYm9hcmRwOwogCi0gICAgYm9hcmRwID0gQVNDX0JPQVJEUChzKTsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKHMpOwogCi0gICAgcHJpbnRrKCJTY3NpX0hvc3QgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBzKTsKLSAgICBwcmludGsoCi0iIGhvc3RfYnVzeSAldSwgaG9zdF9ubyAlZCwgbGFzdF9yZXNldCAlZCxcbiIsCi0gICAgICAgIHMtPmhvc3RfYnVzeSwgcy0+aG9zdF9ubywKLSAgICAgICAgKHVuc2lnbmVkKSBzLT5sYXN0X3Jlc2V0KTsKKwlwcmludGsoIlNjc2lfSG9zdCBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpcyk7CisJcHJpbnRrKCIgaG9zdF9idXN5ICV1LCBob3N0X25vICVkLCBsYXN0X3Jlc2V0ICVkLFxuIiwKKwkgICAgICAgcy0+aG9zdF9idXN5LCBzLT5ob3N0X25vLCAodW5zaWduZWQpcy0+bGFzdF9yZXNldCk7CiAKLSAgICBwcmludGsoCi0iIGJhc2UgMHglbHgsIGlvX3BvcnQgMHglbHgsIG5faW9fcG9ydCAldSwgaXJxIDB4JXgsXG4iLAotICAgICAgICAodWxvbmcpIHMtPmJhc2UsICh1bG9uZykgcy0+aW9fcG9ydCwgcy0+bl9pb19wb3J0LCBzLT5pcnEpOworCXByaW50aygiIGJhc2UgMHglbHgsIGlvX3BvcnQgMHglbHgsIG5faW9fcG9ydCAldSwgaXJxIDB4JXgsXG4iLAorCSAgICAgICAodWxvbmcpcy0+YmFzZSwgKHVsb25nKXMtPmlvX3BvcnQsIHMtPm5faW9fcG9ydCwgcy0+aXJxKTsKIAotICAgIHByaW50aygKLSIgZG1hX2NoYW5uZWwgJWQsIHRoaXNfaWQgJWQsIGNhbl9xdWV1ZSAlZCxcbiIsCi0gICAgICAgIHMtPmRtYV9jaGFubmVsLCBzLT50aGlzX2lkLCBzLT5jYW5fcXVldWUpOworCXByaW50aygiIGRtYV9jaGFubmVsICVkLCB0aGlzX2lkICVkLCBjYW5fcXVldWUgJWQsXG4iLAorCSAgICAgICBzLT5kbWFfY2hhbm5lbCwgcy0+dGhpc19pZCwgcy0+Y2FuX3F1ZXVlKTsKIAotICAgIHByaW50aygKLSIgY21kX3Blcl9sdW4gJWQsIHNnX3RhYmxlc2l6ZSAlZCwgdW5jaGVja2VkX2lzYV9kbWEgJWRcbiIsCi0gICAgICAgIHMtPmNtZF9wZXJfbHVuLCBzLT5zZ190YWJsZXNpemUsIHMtPnVuY2hlY2tlZF9pc2FfZG1hKTsKKwlwcmludGsoIiBjbWRfcGVyX2x1biAlZCwgc2dfdGFibGVzaXplICVkLCB1bmNoZWNrZWRfaXNhX2RtYSAlZFxuIiwKKwkgICAgICAgcy0+Y21kX3Blcl9sdW4sIHMtPnNnX3RhYmxlc2l6ZSwgcy0+dW5jaGVja2VkX2lzYV9kbWEpOwogCi0gICAgaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgewotICAgICAgICBhc2NfcHJ0X2FzY19kdmNfdmFyKCZBU0NfQk9BUkRQKHMpLT5kdmNfdmFyLmFzY19kdmNfdmFyKTsKLSAgICAgICAgYXNjX3BydF9hc2NfZHZjX2NmZygmQVNDX0JPQVJEUChzKS0+ZHZjX2NmZy5hc2NfZHZjX2NmZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXNjX3BydF9hZHZfZHZjX3ZhcigmQVNDX0JPQVJEUChzKS0+ZHZjX3Zhci5hZHZfZHZjX3Zhcik7Ci0gICAgICAgIGFzY19wcnRfYWR2X2R2Y19jZmcoJkFTQ19CT0FSRFAocyktPmR2Y19jZmcuYWR2X2R2Y19jZmcpOwotICAgIH0KKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCWFzY19wcnRfYXNjX2R2Y192YXIoJkFTQ19CT0FSRFAocyktPmR2Y192YXIuYXNjX2R2Y192YXIpOworCQlhc2NfcHJ0X2FzY19kdmNfY2ZnKCZBU0NfQk9BUkRQKHMpLT5kdmNfY2ZnLmFzY19kdmNfY2ZnKTsKKwl9IGVsc2UgeworCQlhc2NfcHJ0X2Fkdl9kdmNfdmFyKCZBU0NfQk9BUkRQKHMpLT5kdmNfdmFyLmFkdl9kdmNfdmFyKTsKKwkJYXNjX3BydF9hZHZfZHZjX2NmZygmQVNDX0JPQVJEUChzKS0+ZHZjX2NmZy5hZHZfZHZjX2NmZyk7CisJfQogfQogCiAvKgogICogYXNjX3BydF9zY3NpX2NtbmQoKQogICovCi1TVEFUSUMgdm9pZAotYXNjX3BydF9zY3NpX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqcykKK3N0YXRpYyB2b2lkIGFzY19wcnRfc2NzaV9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKnMpCiB7Ci0gICAgcHJpbnRrKCJzdHJ1Y3Qgc2NzaV9jbW5kIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcyk7CisJcHJpbnRrKCJzdHJ1Y3Qgc2NzaV9jbW5kIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZylzKTsKIAotICAgIHByaW50aygKLSIgaG9zdCAweCVseCwgZGV2aWNlIDB4JWx4LCB0YXJnZXQgJXUsIGx1biAldSwgY2hhbm5lbCAldSxcbiIsCi0gICAgICAgICh1bG9uZykgcy0+ZGV2aWNlLT5ob3N0LCAodWxvbmcpIHMtPmRldmljZSwgcy0+ZGV2aWNlLT5pZCwgcy0+ZGV2aWNlLT5sdW4sCi0gICAgICAgIHMtPmRldmljZS0+Y2hhbm5lbCk7CisJcHJpbnRrKCIgaG9zdCAweCVseCwgZGV2aWNlIDB4JWx4LCB0YXJnZXQgJXUsIGx1biAldSwgY2hhbm5lbCAldSxcbiIsCisJICAgICAgICh1bG9uZylzLT5kZXZpY2UtPmhvc3QsICh1bG9uZylzLT5kZXZpY2UsIHMtPmRldmljZS0+aWQsCisJICAgICAgIHMtPmRldmljZS0+bHVuLCBzLT5kZXZpY2UtPmNoYW5uZWwpOwogCi0gICAgYXNjX3BydF9oZXgoIiBDREIiLCBzLT5jbW5kLCBzLT5jbWRfbGVuKTsKKwlhc2NfcHJ0X2hleCgiIENEQiIsIHMtPmNtbmQsIHMtPmNtZF9sZW4pOwogCi0gICAgcHJpbnRrICgKLSJzY19kYXRhX2RpcmVjdGlvbiAldSwgcmVzaWQgJWRcbiIsCi0gICAgICAgIHMtPnNjX2RhdGFfZGlyZWN0aW9uLCBzLT5yZXNpZCk7CisJcHJpbnRrKCJzY19kYXRhX2RpcmVjdGlvbiAldSwgcmVzaWQgJWRcbiIsCisJICAgICAgIHMtPnNjX2RhdGFfZGlyZWN0aW9uLCBzLT5yZXNpZCk7CiAKLSAgICBwcmludGsoCi0iIHVzZV9zZyAldSwgc2dsaXN0X2xlbiAldVxuIiwKLSAgICAgICAgcy0+dXNlX3NnLCBzLT5zZ2xpc3RfbGVuKTsKKwlwcmludGsoIiB1c2Vfc2cgJXUsIHNnbGlzdF9sZW4gJXVcbiIsIHMtPnVzZV9zZywgcy0+c2dsaXN0X2xlbik7CiAKLSAgICBwcmludGsoCi0iIHNlcmlhbF9udW1iZXIgMHgleCwgcmV0cmllcyAlZCwgYWxsb3dlZCAlZFxuIiwKLSAgICAgICAgKHVuc2lnbmVkKSBzLT5zZXJpYWxfbnVtYmVyLCBzLT5yZXRyaWVzLCBzLT5hbGxvd2VkKTsKKwlwcmludGsoIiBzZXJpYWxfbnVtYmVyIDB4JXgsIHJldHJpZXMgJWQsIGFsbG93ZWQgJWRcbiIsCisJICAgICAgICh1bnNpZ25lZClzLT5zZXJpYWxfbnVtYmVyLCBzLT5yZXRyaWVzLCBzLT5hbGxvd2VkKTsKIAotICAgIHByaW50aygKLSIgdGltZW91dF9wZXJfY29tbWFuZCAlZFxuIiwKLSAgICAgICAgcy0+dGltZW91dF9wZXJfY29tbWFuZCk7CisJcHJpbnRrKCIgdGltZW91dF9wZXJfY29tbWFuZCAlZFxuIiwgcy0+dGltZW91dF9wZXJfY29tbWFuZCk7CiAKLSAgICBwcmludGsoCi0iIHNjc2lfZG9uZSAweCVseCwgZG9uZSAweCVseCwgaG9zdF9zY3JpYmJsZSAweCVseCwgcmVzdWx0IDB4JXhcbiIsCi0gICAgICAgICh1bG9uZykgcy0+c2NzaV9kb25lLCAodWxvbmcpIHMtPmRvbmUsCi0gICAgICAgICh1bG9uZykgcy0+aG9zdF9zY3JpYmJsZSwgcy0+cmVzdWx0KTsKKwlwcmludGsKKwkgICAgKCIgc2NzaV9kb25lIDB4JWx4LCBkb25lIDB4JWx4LCBob3N0X3NjcmliYmxlIDB4JWx4LCByZXN1bHQgMHgleFxuIiwKKwkgICAgICh1bG9uZylzLT5zY3NpX2RvbmUsICh1bG9uZylzLT5kb25lLCAodWxvbmcpcy0+aG9zdF9zY3JpYmJsZSwKKwkgICAgIHMtPnJlc3VsdCk7CiAKLSAgICBwcmludGsoCi0iIHRhZyAldSwgcGlkICV1XG4iLAotICAgICAgICAodW5zaWduZWQpIHMtPnRhZywgKHVuc2lnbmVkKSBzLT5waWQpOworCXByaW50aygiIHRhZyAldSwgcGlkICV1XG4iLCAodW5zaWduZWQpcy0+dGFnLCAodW5zaWduZWQpcy0+cGlkKTsKIH0KIAogLyoKICAqIGFzY19wcnRfYXNjX2R2Y192YXIoKQogICovCi1TVEFUSUMgdm9pZAotYXNjX3BydF9hc2NfZHZjX3ZhcihBU0NfRFZDX1ZBUiAqaCkKK3N0YXRpYyB2b2lkIGFzY19wcnRfYXNjX2R2Y192YXIoQVNDX0RWQ19WQVIgKmgpCiB7Ci0gICAgcHJpbnRrKCJBU0NfRFZDX1ZBUiBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIGgpOworCXByaW50aygiQVNDX0RWQ19WQVIgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKWgpOwogCi0gICAgcHJpbnRrKAotIiBpb3BfYmFzZSAweCV4LCBlcnJfY29kZSAweCV4LCBkdmNfY250bCAweCV4LCBidWdfZml4X2NudGwgJWQsXG4iLAotICAgICAgICBoLT5pb3BfYmFzZSwgaC0+ZXJyX2NvZGUsIGgtPmR2Y19jbnRsLCBoLT5idWdfZml4X2NudGwpOworCXByaW50aworCSAgICAoIiBpb3BfYmFzZSAweCV4LCBlcnJfY29kZSAweCV4LCBkdmNfY250bCAweCV4LCBidWdfZml4X2NudGwgJWQsXG4iLAorCSAgICAgaC0+aW9wX2Jhc2UsIGgtPmVycl9jb2RlLCBoLT5kdmNfY250bCwgaC0+YnVnX2ZpeF9jbnRsKTsKIAotICAgIHByaW50aygKLSIgYnVzX3R5cGUgJWQsIGlzcl9jYWxsYmFjayAweCVseCwgZXhlX2NhbGxiYWNrIDB4JWx4LCBpbml0X3NkdHIgMHgleCxcbiIsCi0gICAgICAgIGgtPmJ1c190eXBlLCAodWxvbmcpIGgtPmlzcl9jYWxsYmFjaywgKHVsb25nKSBoLT5leGVfY2FsbGJhY2ssCi0gICAgICAgICh1bnNpZ25lZCkgaC0+aW5pdF9zZHRyKTsKKwlwcmludGsKKwkgICAgKCIgYnVzX3R5cGUgJWQsIGlzcl9jYWxsYmFjayAweCVseCwgZXhlX2NhbGxiYWNrIDB4JWx4LCBpbml0X3NkdHIgMHgleCxcbiIsCisJICAgICBoLT5idXNfdHlwZSwgKHVsb25nKWgtPmlzcl9jYWxsYmFjaywgKHVsb25nKWgtPmV4ZV9jYWxsYmFjaywKKwkgICAgICh1bnNpZ25lZCloLT5pbml0X3NkdHIpOwogCi0gICAgcHJpbnRrKAotIiBzZHRyX2RvbmUgMHgleCwgdXNlX3RhZ2dlZF9xbmcgMHgleCwgdW5pdF9ub3RfcmVhZHkgMHgleCwgY2hpcF9ubyAweCV4LFxuIiwKLSAgICAgICAgKHVuc2lnbmVkKSBoLT5zZHRyX2RvbmUsICh1bnNpZ25lZCkgaC0+dXNlX3RhZ2dlZF9xbmcsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+dW5pdF9ub3RfcmVhZHksICh1bnNpZ25lZCkgaC0+Y2hpcF9ubyk7CisJcHJpbnRrCisJICAgICgiIHNkdHJfZG9uZSAweCV4LCB1c2VfdGFnZ2VkX3FuZyAweCV4LCB1bml0X25vdF9yZWFkeSAweCV4LCBjaGlwX25vIDB4JXgsXG4iLAorCSAgICAgKHVuc2lnbmVkKWgtPnNkdHJfZG9uZSwgKHVuc2lnbmVkKWgtPnVzZV90YWdnZWRfcW5nLAorCSAgICAgKHVuc2lnbmVkKWgtPnVuaXRfbm90X3JlYWR5LCAodW5zaWduZWQpaC0+Y2hpcF9ubyk7CiAKLSAgICBwcmludGsoCi0iIHF1ZXVlX2Z1bGxfb3JfYnVzeSAweCV4LCBzdGFydF9tb3RvciAweCV4LCBzY3NpX3Jlc2V0X3dhaXQgJXUsXG4iLAotICAgICAgICAodW5zaWduZWQpIGgtPnF1ZXVlX2Z1bGxfb3JfYnVzeSwgKHVuc2lnbmVkKSBoLT5zdGFydF9tb3RvciwKLSAgICAgICAgKHVuc2lnbmVkKSBoLT5zY3NpX3Jlc2V0X3dhaXQpOworCXByaW50aworCSAgICAoIiBxdWV1ZV9mdWxsX29yX2J1c3kgMHgleCwgc3RhcnRfbW90b3IgMHgleCwgc2NzaV9yZXNldF93YWl0ICV1LFxuIiwKKwkgICAgICh1bnNpZ25lZCloLT5xdWV1ZV9mdWxsX29yX2J1c3ksICh1bnNpZ25lZCloLT5zdGFydF9tb3RvciwKKwkgICAgICh1bnNpZ25lZCloLT5zY3NpX3Jlc2V0X3dhaXQpOwogCi0gICAgcHJpbnRrKAotIiBpc19pbl9pbnQgJXUsIG1heF90b3RhbF9xbmcgJXUsIGN1cl90b3RhbF9xbmcgJXUsIGluX2NyaXRpY2FsX2NudCAldSxcbiIsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+aXNfaW5faW50LCAodW5zaWduZWQpIGgtPm1heF90b3RhbF9xbmcsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+Y3VyX3RvdGFsX3FuZywgKHVuc2lnbmVkKSBoLT5pbl9jcml0aWNhbF9jbnQpOworCXByaW50aworCSAgICAoIiBpc19pbl9pbnQgJXUsIG1heF90b3RhbF9xbmcgJXUsIGN1cl90b3RhbF9xbmcgJXUsIGluX2NyaXRpY2FsX2NudCAldSxcbiIsCisJICAgICAodW5zaWduZWQpaC0+aXNfaW5faW50LCAodW5zaWduZWQpaC0+bWF4X3RvdGFsX3FuZywKKwkgICAgICh1bnNpZ25lZCloLT5jdXJfdG90YWxfcW5nLCAodW5zaWduZWQpaC0+aW5fY3JpdGljYWxfY250KTsKIAotICAgIHByaW50aygKLSIgbGFzdF9xX3Nob3J0YWdlICV1LCBpbml0X3N0YXRlIDB4JXgsIG5vX3NjYW0gMHgleCwgcGNpX2ZpeF9hc3luX3hmZXIgMHgleCxcbiIsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+bGFzdF9xX3Nob3J0YWdlLCAodW5zaWduZWQpIGgtPmluaXRfc3RhdGUsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+bm9fc2NhbSwgKHVuc2lnbmVkKSBoLT5wY2lfZml4X2FzeW5feGZlcik7CisJcHJpbnRrCisJICAgICgiIGxhc3RfcV9zaG9ydGFnZSAldSwgaW5pdF9zdGF0ZSAweCV4LCBub19zY2FtIDB4JXgsIHBjaV9maXhfYXN5bl94ZmVyIDB4JXgsXG4iLAorCSAgICAgKHVuc2lnbmVkKWgtPmxhc3RfcV9zaG9ydGFnZSwgKHVuc2lnbmVkKWgtPmluaXRfc3RhdGUsCisJICAgICAodW5zaWduZWQpaC0+bm9fc2NhbSwgKHVuc2lnbmVkKWgtPnBjaV9maXhfYXN5bl94ZmVyKTsKIAotICAgIHByaW50aygKLSIgY2ZnIDB4JWx4LCBpcnFfbm8gMHgleFxuIiwKLSAgICAgICAgKHVsb25nKSBoLT5jZmcsICh1bnNpZ25lZCkgaC0+aXJxX25vKTsKKwlwcmludGsoIiBjZmcgMHglbHgsIGlycV9ubyAweCV4XG4iLCAodWxvbmcpaC0+Y2ZnLCAodW5zaWduZWQpaC0+aXJxX25vKTsKIH0KIAogLyoKICAqIGFzY19wcnRfYXNjX2R2Y19jZmcoKQogICovCi1TVEFUSUMgdm9pZAotYXNjX3BydF9hc2NfZHZjX2NmZyhBU0NfRFZDX0NGRyAqaCkKK3N0YXRpYyB2b2lkIGFzY19wcnRfYXNjX2R2Y19jZmcoQVNDX0RWQ19DRkcgKmgpCiB7Ci0gICAgcHJpbnRrKCJBU0NfRFZDX0NGRyBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIGgpOworCXByaW50aygiQVNDX0RWQ19DRkcgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKWgpOwogCi0gICAgcHJpbnRrKAotIiBjYW5fdGFnZ2VkX3FuZyAweCV4LCBjbWRfcW5nX2VuYWJsZWQgMHgleCxcbiIsCi0gICAgICAgICAgICBoLT5jYW5fdGFnZ2VkX3FuZywgaC0+Y21kX3FuZ19lbmFibGVkKTsKLSAgICBwcmludGsoCi0iIGRpc2NfZW5hYmxlIDB4JXgsIHNkdHJfZW5hYmxlIDB4JXgsXG4iLAotICAgICAgICAgICAgaC0+ZGlzY19lbmFibGUsIGgtPnNkdHJfZW5hYmxlKTsKKwlwcmludGsoIiBjYW5fdGFnZ2VkX3FuZyAweCV4LCBjbWRfcW5nX2VuYWJsZWQgMHgleCxcbiIsCisJICAgICAgIGgtPmNhbl90YWdnZWRfcW5nLCBoLT5jbWRfcW5nX2VuYWJsZWQpOworCXByaW50aygiIGRpc2NfZW5hYmxlIDB4JXgsIHNkdHJfZW5hYmxlIDB4JXgsXG4iLAorCSAgICAgICBoLT5kaXNjX2VuYWJsZSwgaC0+c2R0cl9lbmFibGUpOwogCi0gICAgcHJpbnRrKAotIiBjaGlwX3Njc2lfaWQgJWQsIGlzYV9kbWFfc3BlZWQgJWQsIGlzYV9kbWFfY2hhbm5lbCAlZCwgY2hpcF92ZXJzaW9uICVkLFxuIiwKLSAgICAgICAgICAgICBoLT5jaGlwX3Njc2lfaWQsIGgtPmlzYV9kbWFfc3BlZWQsIGgtPmlzYV9kbWFfY2hhbm5lbCwKLSAgICAgICAgICAgICBoLT5jaGlwX3ZlcnNpb24pOworCXByaW50aworCSAgICAoIiBjaGlwX3Njc2lfaWQgJWQsIGlzYV9kbWFfc3BlZWQgJWQsIGlzYV9kbWFfY2hhbm5lbCAlZCwgY2hpcF92ZXJzaW9uICVkLFxuIiwKKwkgICAgIGgtPmNoaXBfc2NzaV9pZCwgaC0+aXNhX2RtYV9zcGVlZCwgaC0+aXNhX2RtYV9jaGFubmVsLAorCSAgICAgaC0+Y2hpcF92ZXJzaW9uKTsKIAotICAgIHByaW50aygKLSIgcGNpX2RldmljZV9pZCAlZCwgbGliX3NlcmlhbF9ubyAldSwgbGliX3ZlcnNpb24gJXUsIG1jb2RlX2RhdGUgMHgleCxcbiIsCi0JICAgdG9fcGNpX2RldihoLT5kZXYpLT5kZXZpY2UsIGgtPmxpYl9zZXJpYWxfbm8sIGgtPmxpYl92ZXJzaW9uLAotCSAgIGgtPm1jb2RlX2RhdGUpOworCXByaW50aworCSAgICAoIiBwY2lfZGV2aWNlX2lkICVkLCBsaWJfc2VyaWFsX25vICV1LCBsaWJfdmVyc2lvbiAldSwgbWNvZGVfZGF0ZSAweCV4LFxuIiwKKwkgICAgIHRvX3BjaV9kZXYoaC0+ZGV2KS0+ZGV2aWNlLCBoLT5saWJfc2VyaWFsX25vLCBoLT5saWJfdmVyc2lvbiwKKwkgICAgIGgtPm1jb2RlX2RhdGUpOwogCi0gICAgcHJpbnRrKAotIiBtY29kZV92ZXJzaW9uICVkLCBvdmVycnVuX2J1ZiAweCVseFxuIiwKLSAgICAgICAgICAgIGgtPm1jb2RlX3ZlcnNpb24sICh1bG9uZykgaC0+b3ZlcnJ1bl9idWYpOworCXByaW50aygiIG1jb2RlX3ZlcnNpb24gJWQsIG92ZXJydW5fYnVmIDB4JWx4XG4iLAorCSAgICAgICBoLT5tY29kZV92ZXJzaW9uLCAodWxvbmcpaC0+b3ZlcnJ1bl9idWYpOwogfQogCiAvKgogICogYXNjX3BydF9hc2Nfc2NzaV9xKCkKICAqLwotU1RBVElDIHZvaWQKLWFzY19wcnRfYXNjX3Njc2lfcShBU0NfU0NTSV9RICpxKQorc3RhdGljIHZvaWQgYXNjX3BydF9hc2Nfc2NzaV9xKEFTQ19TQ1NJX1EgKnEpCiB7Ci0gICAgQVNDX1NHX0hFQUQgICAgKnNncDsKLSAgICBpbnQgaTsKKwlBU0NfU0dfSEVBRCAqc2dwOworCWludCBpOwogCi0gICAgcHJpbnRrKCJBU0NfU0NTSV9RIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgcSk7CisJcHJpbnRrKCJBU0NfU0NTSV9RIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZylxKTsKIAotICAgIHByaW50aygKLSIgdGFyZ2V0X2l4IDB4JXgsIHRhcmdldF9sdW4gJXUsIHNyYl9wdHIgMHglbHgsIHRhZ19jb2RlIDB4JXgsXG4iLAotICAgICAgICAgICAgcS0+cTIudGFyZ2V0X2l4LCBxLT5xMS50YXJnZXRfbHVuLAotICAgICAgICAgICAgKHVsb25nKSBxLT5xMi5zcmJfcHRyLCBxLT5xMi50YWdfY29kZSk7CisJcHJpbnRrCisJICAgICgiIHRhcmdldF9peCAweCV4LCB0YXJnZXRfbHVuICV1LCBzcmJfcHRyIDB4JWx4LCB0YWdfY29kZSAweCV4LFxuIiwKKwkgICAgIHEtPnEyLnRhcmdldF9peCwgcS0+cTEudGFyZ2V0X2x1biwgKHVsb25nKXEtPnEyLnNyYl9wdHIsCisJICAgICBxLT5xMi50YWdfY29kZSk7CiAKLSAgICBwcmludGsoCi0iIGRhdGFfYWRkciAweCVseCwgZGF0YV9jbnQgJWx1LCBzZW5zZV9hZGRyIDB4JWx4LCBzZW5zZV9sZW4gJXUsXG4iLAotICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2FkZHIpLAotICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2NudCksCi0gICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPnExLnNlbnNlX2FkZHIpLCBxLT5xMS5zZW5zZV9sZW4pOworCXByaW50aworCSAgICAoIiBkYXRhX2FkZHIgMHglbHgsIGRhdGFfY250ICVsdSwgc2Vuc2VfYWRkciAweCVseCwgc2Vuc2VfbGVuICV1LFxuIiwKKwkgICAgICh1bG9uZylsZTMyX3RvX2NwdShxLT5xMS5kYXRhX2FkZHIpLAorCSAgICAgKHVsb25nKWxlMzJfdG9fY3B1KHEtPnExLmRhdGFfY250KSwKKwkgICAgICh1bG9uZylsZTMyX3RvX2NwdShxLT5xMS5zZW5zZV9hZGRyKSwgcS0+cTEuc2Vuc2VfbGVuKTsKIAotICAgIHByaW50aygKLSIgY2RicHRyIDB4JWx4LCBjZGJfbGVuICV1LCBzZ19oZWFkIDB4JWx4LCBzZ19xdWV1ZV9jbnQgJXVcbiIsCi0gICAgICAgICAgICAodWxvbmcpIHEtPmNkYnB0ciwgcS0+cTIuY2RiX2xlbiwKLSAgICAgICAgICAgICh1bG9uZykgcS0+c2dfaGVhZCwgcS0+cTEuc2dfcXVldWVfY250KTsKKwlwcmludGsoIiBjZGJwdHIgMHglbHgsIGNkYl9sZW4gJXUsIHNnX2hlYWQgMHglbHgsIHNnX3F1ZXVlX2NudCAldVxuIiwKKwkgICAgICAgKHVsb25nKXEtPmNkYnB0ciwgcS0+cTIuY2RiX2xlbiwKKwkgICAgICAgKHVsb25nKXEtPnNnX2hlYWQsIHEtPnExLnNnX3F1ZXVlX2NudCk7CiAKLSAgICBpZiAocS0+c2dfaGVhZCkgewotICAgICAgICBzZ3AgPSBxLT5zZ19oZWFkOwotICAgICAgICBwcmludGsoIkFTQ19TR19IRUFEIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgc2dwKTsKLSAgICAgICAgcHJpbnRrKCIgZW50cnlfY250ICV1LCBxdWV1ZV9jbnQgJXVcbiIsIHNncC0+ZW50cnlfY250LCBzZ3AtPnF1ZXVlX2NudCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZ3AtPmVudHJ5X2NudDsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludGsoIiBbJXVdOiBhZGRyIDB4JWx4LCBieXRlcyAlbHVcbiIsCi0gICAgICAgICAgICAgICAgaSwgKHVsb25nKSBsZTMyX3RvX2NwdShzZ3AtPnNnX2xpc3RbaV0uYWRkciksCi0gICAgICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShzZ3AtPnNnX2xpc3RbaV0uYnl0ZXMpKTsKLSAgICAgICAgfQorCWlmIChxLT5zZ19oZWFkKSB7CisJCXNncCA9IHEtPnNnX2hlYWQ7CisJCXByaW50aygiQVNDX1NHX0hFQUQgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKXNncCk7CisJCXByaW50aygiIGVudHJ5X2NudCAldSwgcXVldWVfY250ICV1XG4iLCBzZ3AtPmVudHJ5X2NudCwKKwkJICAgICAgIHNncC0+cXVldWVfY250KTsKKwkJZm9yIChpID0gMDsgaSA8IHNncC0+ZW50cnlfY250OyBpKyspIHsKKwkJCXByaW50aygiIFsldV06IGFkZHIgMHglbHgsIGJ5dGVzICVsdVxuIiwKKwkJCSAgICAgICBpLCAodWxvbmcpbGUzMl90b19jcHUoc2dwLT5zZ19saXN0W2ldLmFkZHIpLAorCQkJICAgICAgICh1bG9uZylsZTMyX3RvX2NwdShzZ3AtPnNnX2xpc3RbaV0uYnl0ZXMpKTsKKwkJfQogCi0gICAgfQorCX0KIH0KIAogLyoKICAqIGFzY19wcnRfYXNjX3Fkb25lX2luZm8oKQogICovCi1TVEFUSUMgdm9pZAotYXNjX3BydF9hc2NfcWRvbmVfaW5mbyhBU0NfUURPTkVfSU5GTyAqcSkKK3N0YXRpYyB2b2lkIGFzY19wcnRfYXNjX3Fkb25lX2luZm8oQVNDX1FET05FX0lORk8gKnEpCiB7Ci0gICAgcHJpbnRrKCJBU0NfUURPTkVfSU5GTyBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpIHEpOwotICAgIHByaW50aygKLSIgc3JiX3B0ciAweCVseCwgdGFyZ2V0X2l4ICV1LCBjZGJfbGVuICV1LCB0YWdfY29kZSAldSxcbiIsCi0gICAgICAgICAgICAodWxvbmcpIHEtPmQyLnNyYl9wdHIsIHEtPmQyLnRhcmdldF9peCwgcS0+ZDIuY2RiX2xlbiwKLSAgICAgICAgICAgIHEtPmQyLnRhZ19jb2RlKTsKLSAgICBwcmludGsoCi0iIGRvbmVfc3RhdCAweCV4LCBob3N0X3N0YXQgMHgleCwgc2NzaV9zdGF0IDB4JXgsIHNjc2lfbXNnIDB4JXhcbiIsCi0gICAgICAgICAgICBxLT5kMy5kb25lX3N0YXQsIHEtPmQzLmhvc3Rfc3RhdCwgcS0+ZDMuc2NzaV9zdGF0LCBxLT5kMy5zY3NpX21zZyk7CisJcHJpbnRrKCJBU0NfUURPTkVfSU5GTyBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpcSk7CisJcHJpbnRrKCIgc3JiX3B0ciAweCVseCwgdGFyZ2V0X2l4ICV1LCBjZGJfbGVuICV1LCB0YWdfY29kZSAldSxcbiIsCisJICAgICAgICh1bG9uZylxLT5kMi5zcmJfcHRyLCBxLT5kMi50YXJnZXRfaXgsIHEtPmQyLmNkYl9sZW4sCisJICAgICAgIHEtPmQyLnRhZ19jb2RlKTsKKwlwcmludGsKKwkgICAgKCIgZG9uZV9zdGF0IDB4JXgsIGhvc3Rfc3RhdCAweCV4LCBzY3NpX3N0YXQgMHgleCwgc2NzaV9tc2cgMHgleFxuIiwKKwkgICAgIHEtPmQzLmRvbmVfc3RhdCwgcS0+ZDMuaG9zdF9zdGF0LCBxLT5kMy5zY3NpX3N0YXQsIHEtPmQzLnNjc2lfbXNnKTsKIH0KIAogLyoKQEAgLTkyNDcsNDEgKzgwMzQsMzMgQEAKICAqCiAgKiBEaXNwbGF5IGFuIEFEVl9EVkNfVkFSIHN0cnVjdHVyZS4KICAqLwotU1RBVElDIHZvaWQKLWFzY19wcnRfYWR2X2R2Y192YXIoQURWX0RWQ19WQVIgKmgpCitzdGF0aWMgdm9pZCBhc2NfcHJ0X2Fkdl9kdmNfdmFyKEFEVl9EVkNfVkFSICpoKQogewotICAgIHByaW50aygiIEFEVl9EVkNfVkFSIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZykgaCk7CisJcHJpbnRrKCIgQURWX0RWQ19WQVIgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKWgpOwogCi0gICAgcHJpbnRrKAotIiAgaW9wX2Jhc2UgMHglbHgsIGVycl9jb2RlIDB4JXgsIHVsdHJhX2FibGUgMHgleFxuIiwKLSAgICAgICAgKHVsb25nKSBoLT5pb3BfYmFzZSwgaC0+ZXJyX2NvZGUsICh1bnNpZ25lZCkgaC0+dWx0cmFfYWJsZSk7CisJcHJpbnRrKCIgIGlvcF9iYXNlIDB4JWx4LCBlcnJfY29kZSAweCV4LCB1bHRyYV9hYmxlIDB4JXhcbiIsCisJICAgICAgICh1bG9uZyloLT5pb3BfYmFzZSwgaC0+ZXJyX2NvZGUsICh1bnNpZ25lZCloLT51bHRyYV9hYmxlKTsKIAotICAgIHByaW50aygKLSIgIGlzcl9jYWxsYmFjayAweCVseCwgc2R0cl9hYmxlIDB4JXgsIHdkdHJfYWJsZSAweCV4XG4iLAotICAgICAgICAodWxvbmcpIGgtPmlzcl9jYWxsYmFjaywgKHVuc2lnbmVkKSBoLT5zZHRyX2FibGUsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+d2R0cl9hYmxlKTsKKwlwcmludGsoIiAgaXNyX2NhbGxiYWNrIDB4JWx4LCBzZHRyX2FibGUgMHgleCwgd2R0cl9hYmxlIDB4JXhcbiIsCisJICAgICAgICh1bG9uZyloLT5pc3JfY2FsbGJhY2ssICh1bnNpZ25lZCloLT5zZHRyX2FibGUsCisJICAgICAgICh1bnNpZ25lZCloLT53ZHRyX2FibGUpOwogCi0gICAgcHJpbnRrKAotIiAgc3RhcnRfbW90b3IgMHgleCwgc2NzaV9yZXNldF93YWl0IDB4JXgsIGlycV9ubyAweCV4LFxuIiwKLSAgICAgICAgKHVuc2lnbmVkKSBoLT5zdGFydF9tb3RvciwKLSAgICAgICAgKHVuc2lnbmVkKSBoLT5zY3NpX3Jlc2V0X3dhaXQsICh1bnNpZ25lZCkgaC0+aXJxX25vKTsKKwlwcmludGsoIiAgc3RhcnRfbW90b3IgMHgleCwgc2NzaV9yZXNldF93YWl0IDB4JXgsIGlycV9ubyAweCV4LFxuIiwKKwkgICAgICAgKHVuc2lnbmVkKWgtPnN0YXJ0X21vdG9yLAorCSAgICAgICAodW5zaWduZWQpaC0+c2NzaV9yZXNldF93YWl0LCAodW5zaWduZWQpaC0+aXJxX25vKTsKIAotICAgIHByaW50aygKLSIgIG1heF9ob3N0X3FuZyAldSwgbWF4X2R2Y19xbmcgJXUsIGNhcnJfZnJlZWxpc3QgMHglbHhuXG4iLAotICAgICAgICAodW5zaWduZWQpIGgtPm1heF9ob3N0X3FuZywgKHVuc2lnbmVkKSBoLT5tYXhfZHZjX3FuZywKLSAgICAgICAgKHVsb25nKSBoLT5jYXJyX2ZyZWVsaXN0KTsKKwlwcmludGsoIiAgbWF4X2hvc3RfcW5nICV1LCBtYXhfZHZjX3FuZyAldSwgY2Fycl9mcmVlbGlzdCAweCVseG5cbiIsCisJICAgICAgICh1bnNpZ25lZCloLT5tYXhfaG9zdF9xbmcsICh1bnNpZ25lZCloLT5tYXhfZHZjX3FuZywKKwkgICAgICAgKHVsb25nKWgtPmNhcnJfZnJlZWxpc3QpOwogCi0gICAgcHJpbnRrKAotIiAgaWNxX3NwIDB4JWx4LCBpcnFfc3AgMHglbHhcbiIsCi0gICAgICAgICh1bG9uZykgaC0+aWNxX3NwLCAodWxvbmcpIGgtPmlycV9zcCk7CisJcHJpbnRrKCIgIGljcV9zcCAweCVseCwgaXJxX3NwIDB4JWx4XG4iLAorCSAgICAgICAodWxvbmcpaC0+aWNxX3NwLCAodWxvbmcpaC0+aXJxX3NwKTsKIAotICAgIHByaW50aygKLSIgIG5vX3NjYW0gMHgleCwgdGFncW5nX2FibGUgMHgleFxuIiwKLSAgICAgICAgKHVuc2lnbmVkKSBoLT5ub19zY2FtLCAodW5zaWduZWQpIGgtPnRhZ3FuZ19hYmxlKTsKKwlwcmludGsoIiAgbm9fc2NhbSAweCV4LCB0YWdxbmdfYWJsZSAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQpaC0+bm9fc2NhbSwgKHVuc2lnbmVkKWgtPnRhZ3FuZ19hYmxlKTsKIAotICAgIHByaW50aygKLSIgIGNoaXBfc2NzaV9pZCAweCV4LCBjZmcgMHglbHhcbiIsCi0gICAgICAgICh1bnNpZ25lZCkgaC0+Y2hpcF9zY3NpX2lkLCAodWxvbmcpIGgtPmNmZyk7CisJcHJpbnRrKCIgIGNoaXBfc2NzaV9pZCAweCV4LCBjZmcgMHglbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCloLT5jaGlwX3Njc2lfaWQsICh1bG9uZyloLT5jZmcpOwogfQogCiAvKgpAQCAtOTI4OSwyNiArODA2OCwyMSBAQAogICoKICAqIERpc3BsYXkgYW4gQURWX0RWQ19DRkcgc3RydWN0dXJlLgogICovCi1TVEFUSUMgdm9pZAotYXNjX3BydF9hZHZfZHZjX2NmZyhBRFZfRFZDX0NGRyAqaCkKK3N0YXRpYyB2b2lkIGFzY19wcnRfYWR2X2R2Y19jZmcoQURWX0RWQ19DRkcgKmgpCiB7Ci0gICAgcHJpbnRrKCIgQURWX0RWQ19DRkcgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBoKTsKKwlwcmludGsoIiBBRFZfRFZDX0NGRyBhdCBhZGRyIDB4JWx4XG4iLCAodWxvbmcpaCk7CiAKLSAgICBwcmludGsoCi0iICBkaXNjX2VuYWJsZSAweCV4LCB0ZXJtaW5hdGlvbiAweCV4XG4iLAotICAgICAgICBoLT5kaXNjX2VuYWJsZSwgaC0+dGVybWluYXRpb24pOworCXByaW50aygiICBkaXNjX2VuYWJsZSAweCV4LCB0ZXJtaW5hdGlvbiAweCV4XG4iLAorCSAgICAgICBoLT5kaXNjX2VuYWJsZSwgaC0+dGVybWluYXRpb24pOwogCi0gICAgcHJpbnRrKAotIiAgY2hpcF92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleFxuIiwKLSAgICAgICAgaC0+Y2hpcF92ZXJzaW9uLCBoLT5tY29kZV9kYXRlKTsKKwlwcmludGsoIiAgY2hpcF92ZXJzaW9uIDB4JXgsIG1jb2RlX2RhdGUgMHgleFxuIiwKKwkgICAgICAgaC0+Y2hpcF92ZXJzaW9uLCBoLT5tY29kZV9kYXRlKTsKIAotICAgIHByaW50aygKLSIgIG1jb2RlX3ZlcnNpb24gMHgleCwgcGNpX2RldmljZV9pZCAweCV4LCBsaWJfdmVyc2lvbiAldVxuIiwKLSAgICAgICBoLT5tY29kZV92ZXJzaW9uLCB0b19wY2lfZGV2KGgtPmRldiktPmRldmljZSwgaC0+bGliX3ZlcnNpb24pOworCXByaW50aygiICBtY29kZV92ZXJzaW9uIDB4JXgsIHBjaV9kZXZpY2VfaWQgMHgleCwgbGliX3ZlcnNpb24gJXVcbiIsCisJICAgICAgIGgtPm1jb2RlX3ZlcnNpb24sIHRvX3BjaV9kZXYoaC0+ZGV2KS0+ZGV2aWNlLCBoLT5saWJfdmVyc2lvbik7CiAKLSAgICBwcmludGsoCi0iICBjb250cm9sX2ZsYWcgMHgleCwgcGNpX3Nsb3RfaW5mbyAweCV4XG4iLAotICAgICAgIGgtPmNvbnRyb2xfZmxhZywgaC0+cGNpX3Nsb3RfaW5mbyk7CisJcHJpbnRrKCIgIGNvbnRyb2xfZmxhZyAweCV4LCBwY2lfc2xvdF9pbmZvIDB4JXhcbiIsCisJICAgICAgIGgtPmNvbnRyb2xfZmxhZywgaC0+cGNpX3Nsb3RfaW5mbyk7CiB9CiAKIC8qCkBAIC05MzE2LDYwICs4MDkwLDU0IEBACiAgKgogICogRGlzcGxheSBhbiBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCiAgKi8KLVNUQVRJQyB2b2lkCi1hc2NfcHJ0X2Fkdl9zY3NpX3JlcV9xKEFEVl9TQ1NJX1JFUV9RICpxKQorc3RhdGljIHZvaWQgYXNjX3BydF9hZHZfc2NzaV9yZXFfcShBRFZfU0NTSV9SRVFfUSAqcSkKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHNnX2Jsa19jbnQ7Ci0gICAgc3RydWN0IGFzY19zZ19ibG9jayAqc2dfcHRyOworCWludCBzZ19ibGtfY250OworCXN0cnVjdCBhc2Nfc2dfYmxvY2sgKnNnX3B0cjsKIAotICAgIHByaW50aygiQURWX1NDU0lfUkVRX1EgYXQgYWRkciAweCVseFxuIiwgKHVsb25nKSBxKTsKKwlwcmludGsoIkFEVl9TQ1NJX1JFUV9RIGF0IGFkZHIgMHglbHhcbiIsICh1bG9uZylxKTsKIAotICAgIHByaW50aygKLSIgIHRhcmdldF9pZCAldSwgdGFyZ2V0X2x1biAldSwgc3JiX3B0ciAweCVseCwgYV9mbGFnIDB4JXhcbiIsCi0gICAgICAgICAgICBxLT50YXJnZXRfaWQsIHEtPnRhcmdldF9sdW4sICh1bG9uZykgcS0+c3JiX3B0ciwgcS0+YV9mbGFnKTsKKwlwcmludGsoIiAgdGFyZ2V0X2lkICV1LCB0YXJnZXRfbHVuICV1LCBzcmJfcHRyIDB4JWx4LCBhX2ZsYWcgMHgleFxuIiwKKwkgICAgICAgcS0+dGFyZ2V0X2lkLCBxLT50YXJnZXRfbHVuLCAodWxvbmcpcS0+c3JiX3B0ciwgcS0+YV9mbGFnKTsKIAotICAgIHByaW50aygiICBjbnRsIDB4JXgsIGRhdGFfYWRkciAweCVseCwgdmRhdGFfYWRkciAweCVseFxuIiwKLSAgICAgICAgICAgIHEtPmNudGwsICh1bG9uZykgbGUzMl90b19jcHUocS0+ZGF0YV9hZGRyKSwgKHVsb25nKSBxLT52ZGF0YV9hZGRyKTsKKwlwcmludGsoIiAgY250bCAweCV4LCBkYXRhX2FkZHIgMHglbHgsIHZkYXRhX2FkZHIgMHglbHhcbiIsCisJICAgICAgIHEtPmNudGwsICh1bG9uZylsZTMyX3RvX2NwdShxLT5kYXRhX2FkZHIpLCAodWxvbmcpcS0+dmRhdGFfYWRkcik7CiAKLSAgICBwcmludGsoCi0iICBkYXRhX2NudCAlbHUsIHNlbnNlX2FkZHIgMHglbHgsIHNlbnNlX2xlbiAldSxcbiIsCi0gICAgICAgICAgICAodWxvbmcpIGxlMzJfdG9fY3B1KHEtPmRhdGFfY250KSwKLSAgICAgICAgICAgICh1bG9uZykgbGUzMl90b19jcHUocS0+c2Vuc2VfYWRkciksIHEtPnNlbnNlX2xlbik7CisJcHJpbnRrKCIgIGRhdGFfY250ICVsdSwgc2Vuc2VfYWRkciAweCVseCwgc2Vuc2VfbGVuICV1LFxuIiwKKwkgICAgICAgKHVsb25nKWxlMzJfdG9fY3B1KHEtPmRhdGFfY250KSwKKwkgICAgICAgKHVsb25nKWxlMzJfdG9fY3B1KHEtPnNlbnNlX2FkZHIpLCBxLT5zZW5zZV9sZW4pOwogCi0gICAgcHJpbnRrKAotIiAgY2RiX2xlbiAldSwgZG9uZV9zdGF0dXMgMHgleCwgaG9zdF9zdGF0dXMgMHgleCwgc2NzaV9zdGF0dXMgMHgleFxuIiwKLSAgICAgICAgICAgIHEtPmNkYl9sZW4sIHEtPmRvbmVfc3RhdHVzLCBxLT5ob3N0X3N0YXR1cywgcS0+c2NzaV9zdGF0dXMpOworCXByaW50aworCSAgICAoIiAgY2RiX2xlbiAldSwgZG9uZV9zdGF0dXMgMHgleCwgaG9zdF9zdGF0dXMgMHgleCwgc2NzaV9zdGF0dXMgMHgleFxuIiwKKwkgICAgIHEtPmNkYl9sZW4sIHEtPmRvbmVfc3RhdHVzLCBxLT5ob3N0X3N0YXR1cywgcS0+c2NzaV9zdGF0dXMpOwogCi0gICAgcHJpbnRrKAotIiAgc2dfd29ya2luZ19peCAweCV4LCB0YXJnZXRfY21kICV1XG4iLAotICAgICAgICAgICAgcS0+c2dfd29ya2luZ19peCwgcS0+dGFyZ2V0X2NtZCk7CisJcHJpbnRrKCIgIHNnX3dvcmtpbmdfaXggMHgleCwgdGFyZ2V0X2NtZCAldVxuIiwKKwkgICAgICAgcS0+c2dfd29ya2luZ19peCwgcS0+dGFyZ2V0X2NtZCk7CiAKLSAgICBwcmludGsoCi0iICBzY3NpcV9ycHRyIDB4JWx4LCBzZ19yZWFsX2FkZHIgMHglbHgsIHNnX2xpc3RfcHRyIDB4JWx4XG4iLAotICAgICAgICAgICAgKHVsb25nKSBsZTMyX3RvX2NwdShxLT5zY3NpcV9ycHRyKSwKLSAgICAgICAgICAgICh1bG9uZykgbGUzMl90b19jcHUocS0+c2dfcmVhbF9hZGRyKSwgKHVsb25nKSBxLT5zZ19saXN0X3B0cik7CisJcHJpbnRrKCIgIHNjc2lxX3JwdHIgMHglbHgsIHNnX3JlYWxfYWRkciAweCVseCwgc2dfbGlzdF9wdHIgMHglbHhcbiIsCisJICAgICAgICh1bG9uZylsZTMyX3RvX2NwdShxLT5zY3NpcV9ycHRyKSwKKwkgICAgICAgKHVsb25nKWxlMzJfdG9fY3B1KHEtPnNnX3JlYWxfYWRkciksICh1bG9uZylxLT5zZ19saXN0X3B0cik7CiAKLSAgICAvKiBEaXNwbGF5IHRoZSByZXF1ZXN0J3MgQURWX1NHX0JMT0NLIHN0cnVjdHVyZXMuICovCi0gICAgaWYgKHEtPnNnX2xpc3RfcHRyICE9IE5VTEwpCi0gICAgewotICAgICAgICBzZ19ibGtfY250ID0gMDsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAnc2dfcHRyJyBpcyBhIHBoeXNpY2FsIGFkZHJlc3MuIENvbnZlcnQgaXQgdG8gYSB2aXJ0dWFsCi0gICAgICAgICAgICAgKiBhZGRyZXNzIGJ5IGluZGV4aW5nICdzZ19ibGtfY250JyBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3MKLSAgICAgICAgICAgICAqIGFycmF5ICdzZ19saXN0X3B0cicuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogWFhYIC0gQXNzdW1lcyBhbGwgU0cgcGh5c2ljYWwgYmxvY2tzIGFyZSB2aXJ0dWFsbHkgY29udGlndW91cy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2dfcHRyID0gJigoKEFEVl9TR19CTE9DSyAqKSAocS0+c2dfbGlzdF9wdHIpKVtzZ19ibGtfY250XSk7Ci0gICAgICAgICAgICBhc2NfcHJ0X2Fkdl9zZ2Jsb2NrKHNnX2Jsa19jbnQsIHNnX3B0cik7Ci0gICAgICAgICAgICBpZiAoc2dfcHRyLT5zZ19wdHIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNnX2Jsa19jbnQrKzsKLSAgICAgICAgfQotICAgIH0KKwkvKiBEaXNwbGF5IHRoZSByZXF1ZXN0J3MgQURWX1NHX0JMT0NLIHN0cnVjdHVyZXMuICovCisJaWYgKHEtPnNnX2xpc3RfcHRyICE9IE5VTEwpIHsKKwkJc2dfYmxrX2NudCA9IDA7CisJCXdoaWxlICgxKSB7CisJCQkvKgorCQkJICogJ3NnX3B0cicgaXMgYSBwaHlzaWNhbCBhZGRyZXNzLiBDb252ZXJ0IGl0IHRvIGEgdmlydHVhbAorCQkJICogYWRkcmVzcyBieSBpbmRleGluZyAnc2dfYmxrX2NudCcgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzCisJCQkgKiBhcnJheSAnc2dfbGlzdF9wdHInLgorCQkJICoKKwkJCSAqIFhYWCAtIEFzc3VtZXMgYWxsIFNHIHBoeXNpY2FsIGJsb2NrcyBhcmUgdmlydHVhbGx5IGNvbnRpZ3VvdXMuCisJCQkgKi8KKwkJCXNnX3B0ciA9CisJCQkgICAgJigoKEFEVl9TR19CTE9DSyAqKShxLT5zZ19saXN0X3B0cikpW3NnX2Jsa19jbnRdKTsKKwkJCWFzY19wcnRfYWR2X3NnYmxvY2soc2dfYmxrX2NudCwgc2dfcHRyKTsKKwkJCWlmIChzZ19wdHItPnNnX3B0ciA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZ19ibGtfY250Kys7CisJCX0KKwl9CiB9CiAKIC8qCkBAIC05Mzc3LDI0ICs4MTQ1LDIzIEBACiAgKgogICogRGlzcGxheSBhbiBBRFZfU0dfQkxPQ0sgc3RydWN0dXJlLgogICovCi1TVEFUSUMgdm9pZAotYXNjX3BydF9hZHZfc2dibG9jayhpbnQgc2dibG9ja25vLCBBRFZfU0dfQkxPQ0sgKmIpCitzdGF0aWMgdm9pZCBhc2NfcHJ0X2Fkdl9zZ2Jsb2NrKGludCBzZ2Jsb2Nrbm8sIEFEVl9TR19CTE9DSyAqYikKIHsKLSAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgIHByaW50aygiIEFTQ19TR19CTE9DSyBhdCBhZGRyIDB4JWx4IChzZ2Jsb2Nrbm8gJWQpXG4iLAotICAgICAgICAodWxvbmcpIGIsIHNnYmxvY2tubyk7Ci0gICAgcHJpbnRrKCIgIHNnX2NudCAldSwgc2dfcHRyIDB4JWx4XG4iLAotICAgICAgICBiLT5zZ19jbnQsICh1bG9uZykgbGUzMl90b19jcHUoYi0+c2dfcHRyKSk7Ci0gICAgQVNDX0FTU0VSVChiLT5zZ19jbnQgPD0gTk9fT0ZfU0dfUEVSX0JMT0NLKTsKLSAgICBpZiAoYi0+c2dfcHRyICE9IDApCi0gICAgewotICAgICAgICBBU0NfQVNTRVJUKGItPnNnX2NudCA9PSBOT19PRl9TR19QRVJfQkxPQ0spOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYi0+c2dfY250OyBpKyspIHsKLSAgICAgICAgcHJpbnRrKCIgIFsldV06IHNnX2FkZHIgMHglbHgsIHNnX2NvdW50IDB4JWx4XG4iLAotICAgICAgICAgICAgaSwgKHVsb25nKSBiLT5zZ19saXN0W2ldLnNnX2FkZHIsICh1bG9uZykgYi0+c2dfbGlzdFtpXS5zZ19jb3VudCk7Ci0gICAgfQorCXByaW50aygiIEFTQ19TR19CTE9DSyBhdCBhZGRyIDB4JWx4IChzZ2Jsb2Nrbm8gJWQpXG4iLAorCSAgICAgICAodWxvbmcpYiwgc2dibG9ja25vKTsKKwlwcmludGsoIiAgc2dfY250ICV1LCBzZ19wdHIgMHglbHhcbiIsCisJICAgICAgIGItPnNnX2NudCwgKHVsb25nKWxlMzJfdG9fY3B1KGItPnNnX3B0cikpOworCUFTQ19BU1NFUlQoYi0+c2dfY250IDw9IE5PX09GX1NHX1BFUl9CTE9DSyk7CisJaWYgKGItPnNnX3B0ciAhPSAwKSB7CisJCUFTQ19BU1NFUlQoYi0+c2dfY250ID09IE5PX09GX1NHX1BFUl9CTE9DSyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBiLT5zZ19jbnQ7IGkrKykgeworCQlwcmludGsoIiAgWyV1XTogc2dfYWRkciAweCVseCwgc2dfY291bnQgMHglbHhcbiIsCisJCSAgICAgICBpLCAodWxvbmcpYi0+c2dfbGlzdFtpXS5zZ19hZGRyLAorCQkgICAgICAgKHVsb25nKWItPnNnX2xpc3RbaV0uc2dfY291bnQpOworCX0KIH0KIAogLyoKQEAgLTk0MDMsNTUgKzgxNzAsNTUgQEAKICAqIFByaW50IGhleGFkZWNpbWFsIG91dHB1dCBpbiA0IGJ5dGUgZ3JvdXBpbmdzIDMyIGJ5dGVzCiAgKiBvciA4IGRvdWJsZS13b3JkcyBwZXIgbGluZS4KICAqLwotU1RBVElDIHZvaWQKLWFzY19wcnRfaGV4KGNoYXIgKmYsIHVjaGFyICpzLCBpbnQgbCkKK3N0YXRpYyB2b2lkIGFzY19wcnRfaGV4KGNoYXIgKmYsIHVjaGFyICpzLCBpbnQgbCkKIHsKLSAgICBpbnQgICAgICAgICAgICBpOwotICAgIGludCAgICAgICAgICAgIGo7Ci0gICAgaW50ICAgICAgICAgICAgazsKLSAgICBpbnQgICAgICAgICAgICBtOworCWludCBpOworCWludCBqOworCWludCBrOworCWludCBtOwogCi0gICAgcHJpbnRrKCIlczogKCVkIGJ5dGVzKVxuIiwgZiwgbCk7CisJcHJpbnRrKCIlczogKCVkIGJ5dGVzKVxuIiwgZiwgbCk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSAzMikgeworCWZvciAoaSA9IDA7IGkgPCBsOyBpICs9IDMyKSB7CiAKLSAgICAgICAgLyogRGlzcGxheSBhIG1heGltdW0gb2YgOCBkb3VibGUtd29yZHMgcGVyIGxpbmUuICovCi0gICAgICAgIGlmICgoayA9IChsIC0gaSkgLyA0KSA+PSA4KSB7Ci0gICAgICAgICAgICBrID0gODsKLSAgICAgICAgICAgIG0gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbSA9IChsIC0gaSkgJSA0OwotICAgICAgICB9CisJCS8qIERpc3BsYXkgYSBtYXhpbXVtIG9mIDggZG91YmxlLXdvcmRzIHBlciBsaW5lLiAqLworCQlpZiAoKGsgPSAobCAtIGkpIC8gNCkgPj0gOCkgeworCQkJayA9IDg7CisJCQltID0gMDsKKwkJfSBlbHNlIHsKKwkJCW0gPSAobCAtIGkpICUgNDsKKwkJfQogCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBrOyBqKyspIHsKLSAgICAgICAgICAgIHByaW50aygiICUyLjJYJTIuMlglMi4yWCUyLjJYIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KV0sICh1bnNpZ25lZCkgc1tpKyhqKjQpKzFdLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgc1tpKyhqKjQpKzJdLCAodW5zaWduZWQpIHNbaSsoaio0KSszXSk7Ci0gICAgICAgIH0KKwkJZm9yIChqID0gMDsgaiA8IGs7IGorKykgeworCQkJcHJpbnRrKCIgJTIuMlglMi4yWCUyLjJYJTIuMlgiLAorCQkJICAgICAgICh1bnNpZ25lZClzW2kgKyAoaiAqIDQpXSwKKwkJCSAgICAgICAodW5zaWduZWQpc1tpICsgKGogKiA0KSArIDFdLAorCQkJICAgICAgICh1bnNpZ25lZClzW2kgKyAoaiAqIDQpICsgMl0sCisJCQkgICAgICAgKHVuc2lnbmVkKXNbaSArIChqICogNCkgKyAzXSk7CisJCX0KIAotICAgICAgICBzd2l0Y2ggKG0pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHByaW50aygiICUyLjJYIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHByaW50aygiICUyLjJYJTIuMlgiLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgc1tpKyhqKjQpXSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KSsxXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcHJpbnRrKCIgJTIuMlglMi4yWCUyLjJYIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KSsxXSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KSsyXSwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQpIHNbaSsoaio0KSszXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCQlzd2l0Y2ggKG0pIHsKKwkJY2FzZSAwOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXByaW50aygiICUyLjJYIiwgKHVuc2lnbmVkKXNbaSArIChqICogNCldKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcmludGsoIiAlMi4yWCUyLjJYIiwKKwkJCSAgICAgICAodW5zaWduZWQpc1tpICsgKGogKiA0KV0sCisJCQkgICAgICAgKHVuc2lnbmVkKXNbaSArIChqICogNCkgKyAxXSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcHJpbnRrKCIgJTIuMlglMi4yWCUyLjJYIiwKKwkJCSAgICAgICAodW5zaWduZWQpc1tpICsgKGogKiA0KSArIDFdLAorCQkJICAgICAgICh1bnNpZ25lZClzW2kgKyAoaiAqIDQpICsgMl0sCisJCQkgICAgICAgKHVuc2lnbmVkKXNbaSArIChqICogNCkgKyAzXSk7CisJCQlicmVhazsKKwkJfQogCi0gICAgICAgIHByaW50aygiXG4iKTsKLSAgICB9CisJCXByaW50aygiXG4iKTsKKwl9CiB9CiAjZW5kaWYgLyogQURWQU5TWVNfREVCVUcgKi8KIApAQCAtOTQ1OSwzMzgwICs4MjI2LDM0MDAgQEAKICAqIC0tLSBBc2MgTGlicmFyeSBGdW5jdGlvbnMKICAqLwogCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQXNjR2V0RWlzYUNoaXBDZmcoCi0gICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSkKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY0dldEVpc2FDaGlwQ2ZnKFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIFBvcnRBZGRyICAgICAgICAgICAgZWlzYV9jZmdfaW9wOworCVBvcnRBZGRyIGVpc2FfY2ZnX2lvcDsKIAotICAgIGVpc2FfY2ZnX2lvcCA9IChQb3J0QWRkcikgQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwKLSAgICAgIChQb3J0QWRkcikgKEFTQ19FSVNBX0NGR19JT1BfTUFTSyk7Ci0gICAgcmV0dXJuIChpbnB3KGVpc2FfY2ZnX2lvcCkpOworCWVpc2FfY2ZnX2lvcCA9IChQb3J0QWRkcikgQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwKKwkgICAgKFBvcnRBZGRyKSAoQVNDX0VJU0FfQ0ZHX0lPUF9NQVNLKTsKKwlyZXR1cm4gKGlucHcoZWlzYV9jZmdfaW9wKSk7CiB9CiAKLVNUQVRJQyB1Y2hhciBfX2luaXQKLUFzY1NldENoaXBTY3NpSUQoCi0gICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICB1Y2hhciBuZXdfaG9zdF9pZAotKQorc3RhdGljIHVjaGFyIF9faW5pdCBBc2NTZXRDaGlwU2NzaUlEKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBuZXdfaG9zdF9pZCkKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19sc3c7CisJdXNob3J0IGNmZ19sc3c7CiAKLSAgICBpZiAoQXNjR2V0Q2hpcFNjc2lJRChpb3BfYmFzZSkgPT0gbmV3X2hvc3RfaWQpIHsKLSAgICAgICAgcmV0dXJuIChuZXdfaG9zdF9pZCk7Ci0gICAgfQotICAgIGNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKLSAgICBjZmdfbHN3ICY9IDB4RjhGRjsKLSAgICBjZmdfbHN3IHw9ICh1c2hvcnQpICgobmV3X2hvc3RfaWQgJiBBU0NfTUFYX1RJRCkgPDwgOCk7Ci0gICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7Ci0gICAgcmV0dXJuIChBc2NHZXRDaGlwU2NzaUlEKGlvcF9iYXNlKSk7CisJaWYgKEFzY0dldENoaXBTY3NpSUQoaW9wX2Jhc2UpID09IG5ld19ob3N0X2lkKSB7CisJCXJldHVybiAobmV3X2hvc3RfaWQpOworCX0KKwljZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7CisJY2ZnX2xzdyAmPSAweEY4RkY7CisJY2ZnX2xzdyB8PSAodXNob3J0KSgobmV3X2hvc3RfaWQgJiBBU0NfTUFYX1RJRCkgPDwgOCk7CisJQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7CisJcmV0dXJuIChBc2NHZXRDaGlwU2NzaUlEKGlvcF9iYXNlKSk7CiB9CiAKLVNUQVRJQyB1Y2hhciBfX2luaXQKLUFzY0dldENoaXBTY3NpQ3RybCgKLQkJUG9ydEFkZHIgaW9wX2Jhc2UpCitzdGF0aWMgdWNoYXIgX19pbml0IEFzY0dldENoaXBTY3NpQ3RybChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNjOworCXVjaGFyIHNjOwogCi0gICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMSk7Ci0gICAgc2MgPSBpbnAoaW9wX2Jhc2UgKyBJT1BfUkVHX1NDKTsKLSAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAwKTsKLSAgICByZXR1cm4gKHNjKTsKKwlBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKwlzYyA9IGlucChpb3BfYmFzZSArIElPUF9SRUdfU0MpOworCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworCXJldHVybiAoc2MpOwogfQogCi1TVEFUSUMgdWNoYXIgX19pbml0Ci1Bc2NHZXRDaGlwVmVyc2lvbigKLSAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGJ1c190eXBlCi0pCitzdGF0aWMgdWNoYXIgX19pbml0IEFzY0dldENoaXBWZXJzaW9uKFBvcnRBZGRyIGlvcF9iYXNlLCB1c2hvcnQgYnVzX3R5cGUpCiB7Ci0gICAgaWYgKChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSAhPSAwKSB7Ci0gICAgICAgIFBvcnRBZGRyICAgICAgICAgICAgZWlzYV9pb3A7Ci0gICAgICAgIHVjaGFyICAgICAgICAgICAgICAgcmV2aXNpb247Ci0gICAgICAgIGVpc2FfaW9wID0gKFBvcnRBZGRyKSBBU0NfR0VUX0VJU0FfU0xPVChpb3BfYmFzZSkgfAotICAgICAgICAgIChQb3J0QWRkcikgQVNDX0VJU0FfUkVWX0lPUF9NQVNLOwotICAgICAgICByZXZpc2lvbiA9IGlucChlaXNhX2lvcCk7Ci0gICAgICAgIHJldHVybiAoKHVjaGFyKSAoKEFTQ19DSElQX01JTl9WRVJfRUlTQSAtIDEpICsgcmV2aXNpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIChBc2NHZXRDaGlwVmVyTm8oaW9wX2Jhc2UpKTsKKwlpZiAoKGJ1c190eXBlICYgQVNDX0lTX0VJU0EpICE9IDApIHsKKwkJUG9ydEFkZHIgZWlzYV9pb3A7CisJCXVjaGFyIHJldmlzaW9uOworCQllaXNhX2lvcCA9IChQb3J0QWRkcikgQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwKKwkJICAgIChQb3J0QWRkcikgQVNDX0VJU0FfUkVWX0lPUF9NQVNLOworCQlyZXZpc2lvbiA9IGlucChlaXNhX2lvcCk7CisJCXJldHVybiAoKHVjaGFyKSgoQVNDX0NISVBfTUlOX1ZFUl9FSVNBIC0gMSkgKyByZXZpc2lvbikpOworCX0KKwlyZXR1cm4gKEFzY0dldENoaXBWZXJObyhpb3BfYmFzZSkpOwogfQogCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQXNjR2V0Q2hpcEJ1c1R5cGUoCi0gICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSkKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY0dldENoaXBCdXNUeXBlKFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgY2hpcF92ZXI7CisJdXNob3J0IGNoaXBfdmVyOwogCi0gICAgY2hpcF92ZXIgPSBBc2NHZXRDaGlwVmVyTm8oaW9wX2Jhc2UpOwotICAgIGlmICgKLSAgICAgICAgICAgKGNoaXBfdmVyID49IEFTQ19DSElQX01JTl9WRVJfVkwpCi0gICAgICAgICAgICYmIChjaGlwX3ZlciA8PSBBU0NfQ0hJUF9NQVhfVkVSX1ZMKQotKSB7Ci0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICgoaW9wX2Jhc2UgJiAweDBDMzApID09IDB4MEMzMCkKLSAgICAgICAgICAgICAgIHx8ICgoaW9wX2Jhc2UgJiAweDBDNTApID09IDB4MEM1MCkKLSkgewotICAgICAgICAgICAgcmV0dXJuIChBU0NfSVNfRUlTQSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBU0NfSVNfVkwpOwotICAgIH0KLSAgICBpZiAoKGNoaXBfdmVyID49IEFTQ19DSElQX01JTl9WRVJfSVNBKSAmJgotICAgICAgICAoY2hpcF92ZXIgPD0gQVNDX0NISVBfTUFYX1ZFUl9JU0EpKSB7Ci0gICAgICAgIGlmIChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX0lTQV9QTlApIHsKLSAgICAgICAgICAgIHJldHVybiAoQVNDX0lTX0lTQVBOUCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBU0NfSVNfSVNBKTsKLSAgICB9IGVsc2UgaWYgKChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX1BDSSkgJiYKLSAgICAgICAgICAgICAgIChjaGlwX3ZlciA8PSBBU0NfQ0hJUF9NQVhfVkVSX1BDSSkpIHsKLSAgICAgICAgcmV0dXJuIChBU0NfSVNfUENJKTsKLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKKwljaGlwX3ZlciA9IEFzY0dldENoaXBWZXJObyhpb3BfYmFzZSk7CisJaWYgKChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX1ZMKQorCSAgICAmJiAoY2hpcF92ZXIgPD0gQVNDX0NISVBfTUFYX1ZFUl9WTCkKKwkgICAgKSB7CisJCWlmICgoKGlvcF9iYXNlICYgMHgwQzMwKSA9PSAweDBDMzApCisJCSAgICB8fCAoKGlvcF9iYXNlICYgMHgwQzUwKSA9PSAweDBDNTApCisJCSAgICApIHsKKwkJCXJldHVybiAoQVNDX0lTX0VJU0EpOworCQl9CisJCXJldHVybiAoQVNDX0lTX1ZMKTsKKwl9CisJaWYgKChjaGlwX3ZlciA+PSBBU0NfQ0hJUF9NSU5fVkVSX0lTQSkgJiYKKwkgICAgKGNoaXBfdmVyIDw9IEFTQ19DSElQX01BWF9WRVJfSVNBKSkgeworCQlpZiAoY2hpcF92ZXIgPj0gQVNDX0NISVBfTUlOX1ZFUl9JU0FfUE5QKSB7CisJCQlyZXR1cm4gKEFTQ19JU19JU0FQTlApOworCQl9CisJCXJldHVybiAoQVNDX0lTX0lTQSk7CisJfSBlbHNlIGlmICgoY2hpcF92ZXIgPj0gQVNDX0NISVBfTUlOX1ZFUl9QQ0kpICYmCisJCSAgIChjaGlwX3ZlciA8PSBBU0NfQ0hJUF9NQVhfVkVSX1BDSSkpIHsKKwkJcmV0dXJuIChBU0NfSVNfUENJKTsKKwl9CisJcmV0dXJuICgwKTsKIH0KIAotU1RBVElDIEFTQ19EQ05UCi1Bc2NMb2FkTWljcm9Db2RlKAotICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgdWNoYXIgKm1jb2RlX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgdXNob3J0IG1jb2RlX3NpemUKLSkKK3N0YXRpYyBBU0NfRENOVAorQXNjTG9hZE1pY3JvQ29kZShQb3J0QWRkciBpb3BfYmFzZSwKKwkJIHVzaG9ydCBzX2FkZHIsIHVjaGFyICptY29kZV9idWYsIHVzaG9ydCBtY29kZV9zaXplKQogewotICAgIEFTQ19EQ05UICAgICAgICAgICAgY2hrc3VtOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgbWNvZGVfd29yZF9zaXplOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgbWNvZGVfY2hrc3VtOworCUFTQ19EQ05UIGNoa3N1bTsKKwl1c2hvcnQgbWNvZGVfd29yZF9zaXplOworCXVzaG9ydCBtY29kZV9jaGtzdW07CiAKLSAgICAvKiBXcml0ZSB0aGUgbWljcm9jb2RlIGJ1ZmZlciBzdGFydGluZyBhdCBMUkFNIGFkZHJlc3MgMC4gKi8KLSAgICBtY29kZV93b3JkX3NpemUgPSAodXNob3J0KSAobWNvZGVfc2l6ZSA+PiAxKTsKLSAgICBBc2NNZW1Xb3JkU2V0THJhbShpb3BfYmFzZSwgc19hZGRyLCAwLCBtY29kZV93b3JkX3NpemUpOwotICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLCBzX2FkZHIsIG1jb2RlX2J1ZiwgbWNvZGVfd29yZF9zaXplKTsKKwkvKiBXcml0ZSB0aGUgbWljcm9jb2RlIGJ1ZmZlciBzdGFydGluZyBhdCBMUkFNIGFkZHJlc3MgMC4gKi8KKwltY29kZV93b3JkX3NpemUgPSAodXNob3J0KShtY29kZV9zaXplID4+IDEpOworCUFzY01lbVdvcmRTZXRMcmFtKGlvcF9iYXNlLCBzX2FkZHIsIDAsIG1jb2RlX3dvcmRfc2l6ZSk7CisJQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsIHNfYWRkciwgbWNvZGVfYnVmLCBtY29kZV93b3JkX3NpemUpOwogCi0gICAgY2hrc3VtID0gQXNjTWVtU3VtTHJhbVdvcmQoaW9wX2Jhc2UsIHNfYWRkciwgbWNvZGVfd29yZF9zaXplKTsKLSAgICBBU0NfREJHMSgxLCAiQXNjTG9hZE1pY3JvQ29kZTogY2hrc3VtIDB4JWx4XG4iLCAodWxvbmcpIGNoa3N1bSk7Ci0gICAgbWNvZGVfY2hrc3VtID0gKHVzaG9ydCkgQXNjTWVtU3VtTHJhbVdvcmQoaW9wX2Jhc2UsCi0gICAgICAgICAgKHVzaG9ydCkgQVNDX0NPREVfU0VDX0JFRywKLSAgICAgICAgICAodXNob3J0KSAoKG1jb2RlX3NpemUgLSBzX2FkZHIgLSAodXNob3J0KSBBU0NfQ09ERV9TRUNfQkVHKSAvIDIpKTsKLSAgICBBU0NfREJHMSgxLCAiQXNjTG9hZE1pY3JvQ29kZTogbWNvZGVfY2hrc3VtIDB4JWx4XG4iLAotICAgICAgICAodWxvbmcpIG1jb2RlX2Noa3N1bSk7Ci0gICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9NQ09ERV9DSEtTVU1fVywgbWNvZGVfY2hrc3VtKTsKLSAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX01DT0RFX1NJWkVfVywgbWNvZGVfc2l6ZSk7Ci0gICAgcmV0dXJuIChjaGtzdW0pOworCWNoa3N1bSA9IEFzY01lbVN1bUxyYW1Xb3JkKGlvcF9iYXNlLCBzX2FkZHIsIG1jb2RlX3dvcmRfc2l6ZSk7CisJQVNDX0RCRzEoMSwgIkFzY0xvYWRNaWNyb0NvZGU6IGNoa3N1bSAweCVseFxuIiwgKHVsb25nKWNoa3N1bSk7CisJbWNvZGVfY2hrc3VtID0gKHVzaG9ydClBc2NNZW1TdW1McmFtV29yZChpb3BfYmFzZSwKKwkJCQkJCSAodXNob3J0KUFTQ19DT0RFX1NFQ19CRUcsCisJCQkJCQkgKHVzaG9ydCkoKG1jb2RlX3NpemUgLQorCQkJCQkJCSAgIHNfYWRkciAtICh1c2hvcnQpCisJCQkJCQkJICAgQVNDX0NPREVfU0VDX0JFRykgLworCQkJCQkJCSAgMikpOworCUFTQ19EQkcxKDEsICJBc2NMb2FkTWljcm9Db2RlOiBtY29kZV9jaGtzdW0gMHglbHhcbiIsCisJCSAodWxvbmcpbWNvZGVfY2hrc3VtKTsKKwlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX01DT0RFX0NIS1NVTV9XLCBtY29kZV9jaGtzdW0pOworCUFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfTUNPREVfU0laRV9XLCBtY29kZV9zaXplKTsKKwlyZXR1cm4gKGNoa3N1bSk7CiB9CiAKLVNUQVRJQyBpbnQKLUFzY0ZpbmRTaWduYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCi0pCitzdGF0aWMgaW50IEFzY0ZpbmRTaWduYXR1cmUoUG9ydEFkZHIgaW9wX2Jhc2UpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBzaWdfd29yZDsKKwl1c2hvcnQgc2lnX3dvcmQ7CiAKLSAgICBBU0NfREJHMigxLCAiQXNjRmluZFNpZ25hdHVyZTogQXNjR2V0Q2hpcFNpZ25hdHVyZUJ5dGUoMHgleCkgMHgleFxuIiwKLSAgICAgICAgaW9wX2Jhc2UsIEFzY0dldENoaXBTaWduYXR1cmVCeXRlKGlvcF9iYXNlKSk7Ci0gICAgaWYgKEFzY0dldENoaXBTaWduYXR1cmVCeXRlKGlvcF9iYXNlKSA9PSAodWNoYXIpIEFTQ18xMDAwX0lEMUIpIHsKLSAgICAgICAgQVNDX0RCRzIoMSwgIkFzY0ZpbmRTaWduYXR1cmU6IEFzY0dldENoaXBTaWduYXR1cmVXb3JkKDB4JXgpIDB4JXhcbiIsCi0gICAgICAgICAgICBpb3BfYmFzZSwgQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQoaW9wX2Jhc2UpKTsKLSAgICAgICAgc2lnX3dvcmQgPSBBc2NHZXRDaGlwU2lnbmF0dXJlV29yZChpb3BfYmFzZSk7Ci0gICAgICAgIGlmICgoc2lnX3dvcmQgPT0gKHVzaG9ydCkgQVNDXzEwMDBfSUQwVykgfHwKLSAgICAgICAgICAgIChzaWdfd29yZCA9PSAodXNob3J0KSBBU0NfMTAwMF9JRDBXX0ZJWCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKKwlBU0NfREJHMigxLCAiQXNjRmluZFNpZ25hdHVyZTogQXNjR2V0Q2hpcFNpZ25hdHVyZUJ5dGUoMHgleCkgMHgleFxuIiwKKwkJIGlvcF9iYXNlLCBBc2NHZXRDaGlwU2lnbmF0dXJlQnl0ZShpb3BfYmFzZSkpOworCWlmIChBc2NHZXRDaGlwU2lnbmF0dXJlQnl0ZShpb3BfYmFzZSkgPT0gKHVjaGFyKUFTQ18xMDAwX0lEMUIpIHsKKwkJQVNDX0RCRzIoMSwKKwkJCSAiQXNjRmluZFNpZ25hdHVyZTogQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQoMHgleCkgMHgleFxuIiwKKwkJCSBpb3BfYmFzZSwgQXNjR2V0Q2hpcFNpZ25hdHVyZVdvcmQoaW9wX2Jhc2UpKTsKKwkJc2lnX3dvcmQgPSBBc2NHZXRDaGlwU2lnbmF0dXJlV29yZChpb3BfYmFzZSk7CisJCWlmICgoc2lnX3dvcmQgPT0gKHVzaG9ydClBU0NfMTAwMF9JRDBXKSB8fAorCQkgICAgKHNpZ193b3JkID09ICh1c2hvcnQpQVNDXzEwMDBfSUQwV19GSVgpKSB7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7CiB9CiAKLVNUQVRJQyBQb3J0QWRkciBfYXNjX2RlZl9pb3BfYmFzZVtBU0NfSU9BRFJfVEFCTEVfTUFYX0lYXSBfX2luaXRkYXRhID0KLXsKLSAgICAweDEwMCwgQVNDX0lPQURSXzEsIDB4MTIwLCBBU0NfSU9BRFJfMiwgMHgxNDAsIEFTQ19JT0FEUl8zLCBBU0NfSU9BRFJfNCwKLSAgICBBU0NfSU9BRFJfNSwgQVNDX0lPQURSXzYsIEFTQ19JT0FEUl83LCBBU0NfSU9BRFJfOAorc3RhdGljIFBvcnRBZGRyIF9hc2NfZGVmX2lvcF9iYXNlW0FTQ19JT0FEUl9UQUJMRV9NQVhfSVhdIF9faW5pdGRhdGEgPSB7CisJMHgxMDAsIEFTQ19JT0FEUl8xLCAweDEyMCwgQVNDX0lPQURSXzIsIDB4MTQwLCBBU0NfSU9BRFJfMywgQVNDX0lPQURSXzQsCisJQVNDX0lPQURSXzUsIEFTQ19JT0FEUl82LCBBU0NfSU9BRFJfNywgQVNDX0lPQURSXzgKIH07CiAKICNpZmRlZiBDT05GSUdfSVNBCi1TVEFUSUMgdWNoYXIgX2lzYV9wbnBfaW5pdGVkIF9faW5pdGRhdGEgPSAwOworc3RhdGljIHVjaGFyIF9pc2FfcG5wX2luaXRlZCBfX2luaXRkYXRhID0gMDsKIAotU1RBVElDIFBvcnRBZGRyIF9faW5pdAotQXNjU2VhcmNoSU9Qb3J0QWRkcigKLSAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2JlZywKLSAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGJ1c190eXBlKQorc3RhdGljIFBvcnRBZGRyIF9faW5pdCBBc2NTZWFyY2hJT1BvcnRBZGRyKFBvcnRBZGRyIGlvcF9iZWcsIHVzaG9ydCBidXNfdHlwZSkKIHsKLSAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfVkwpIHsKLSAgICAgICAgd2hpbGUgKChpb3BfYmVnID0gQXNjU2VhcmNoSU9Qb3J0QWRkcjExKGlvcF9iZWcpKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpIDw9IEFTQ19DSElQX01BWF9WRVJfVkwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKLSAgICAgICAgaWYgKF9pc2FfcG5wX2luaXRlZCA9PSAwKSB7Ci0gICAgICAgICAgICBBc2NTZXRJU0FQTlBXYWl0Rm9yS2V5KCk7Ci0gICAgICAgICAgICBfaXNhX3BucF9pbml0ZWQrKzsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoKGlvcF9iZWcgPSBBc2NTZWFyY2hJT1BvcnRBZGRyMTEoaW9wX2JlZykpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpICYgQVNDX0NISVBfVkVSX0lTQV9CSVQpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSB7Ci0gICAgICAgIGlmICgoaW9wX2JlZyA9IEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKGlvcF9iZWcpKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlvcF9iZWcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisJaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisJCXdoaWxlICgoaW9wX2JlZyA9IEFzY1NlYXJjaElPUG9ydEFkZHIxMShpb3BfYmVnKSkgIT0gMCkgeworCQkJaWYgKEFzY0dldENoaXBWZXJzaW9uKGlvcF9iZWcsIGJ1c190eXBlKSA8PQorCQkJICAgIEFTQ19DSElQX01BWF9WRVJfVkwpIHsKKwkJCQlyZXR1cm4gKGlvcF9iZWcpOworCQkJfQorCQl9CisJCXJldHVybiAoMCk7CisJfQorCWlmIChidXNfdHlwZSAmIEFTQ19JU19JU0EpIHsKKwkJaWYgKF9pc2FfcG5wX2luaXRlZCA9PSAwKSB7CisJCQlBc2NTZXRJU0FQTlBXYWl0Rm9yS2V5KCk7CisJCQlfaXNhX3BucF9pbml0ZWQrKzsKKwkJfQorCQl3aGlsZSAoKGlvcF9iZWcgPSBBc2NTZWFyY2hJT1BvcnRBZGRyMTEoaW9wX2JlZykpICE9IDApIHsKKwkJCWlmICgoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2JlZywgYnVzX3R5cGUpICYKKwkJCSAgICAgQVNDX0NISVBfVkVSX0lTQV9CSVQpICE9IDApIHsKKwkJCQlyZXR1cm4gKGlvcF9iZWcpOworCQkJfQorCQl9CisJCXJldHVybiAoMCk7CisJfQorCWlmIChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSB7CisJCWlmICgoaW9wX2JlZyA9IEFzY1NlYXJjaElPUG9ydEFkZHJFSVNBKGlvcF9iZWcpKSAhPSAwKSB7CisJCQlyZXR1cm4gKGlvcF9iZWcpOworCQl9CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMCk7CiB9CiAKLVNUQVRJQyBQb3J0QWRkciBfX2luaXQKLUFzY1NlYXJjaElPUG9ydEFkZHIxMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBzX2FkZHIKLSkKK3N0YXRpYyBQb3J0QWRkciBfX2luaXQgQXNjU2VhcmNoSU9Qb3J0QWRkcjExKFBvcnRBZGRyIHNfYWRkcikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKwlpbnQgaTsKKwlQb3J0QWRkciBpb3BfYmFzZTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYOyBpKyspIHsKLSAgICAgICAgaWYgKF9hc2NfZGVmX2lvcF9iYXNlW2ldID4gc19hZGRyKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKDsgaSA8IEFTQ19JT0FEUl9UQUJMRV9NQVhfSVg7IGkrKykgewotICAgICAgICBpb3BfYmFzZSA9IF9hc2NfZGVmX2lvcF9iYXNlW2ldOwotCWlmICghcmVxdWVzdF9yZWdpb24oaW9wX2Jhc2UsIEFTQ19JT0FEUl9HQVAsICJhZHZhbnN5cyIpKXsKLSAgICAgICAgICAgIEFTQ19EQkcxKDEsCi0gICAgICAgICAgICAgICAiQXNjU2VhcmNoSU9Qb3J0QWRkcjExOiBjaGVja19yZWdpb24oKSBmYWlsZWQgSS9PIHBvcnQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGlvcF9iYXNlKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFTQ19EQkcxKDEsICJBc2NTZWFyY2hJT1BvcnRBZGRyMTE6IHByb2JpbmcgSS9PIHBvcnQgMHgleFxuIiwgaW9wX2Jhc2UpOwotCXJlbGVhc2VfcmVnaW9uKGlvcF9iYXNlLCBBU0NfSU9BRFJfR0FQKTsKLSAgICAgICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlvcF9iYXNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKDApOworCWZvciAoaSA9IDA7IGkgPCBBU0NfSU9BRFJfVEFCTEVfTUFYX0lYOyBpKyspIHsKKwkJaWYgKF9hc2NfZGVmX2lvcF9iYXNlW2ldID4gc19hZGRyKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlmb3IgKDsgaSA8IEFTQ19JT0FEUl9UQUJMRV9NQVhfSVg7IGkrKykgeworCQlpb3BfYmFzZSA9IF9hc2NfZGVmX2lvcF9iYXNlW2ldOworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvcF9iYXNlLCBBU0NfSU9BRFJfR0FQLCAiYWR2YW5zeXMiKSkgeworCQkJQVNDX0RCRzEoMSwKKwkJCQkgIkFzY1NlYXJjaElPUG9ydEFkZHIxMTogY2hlY2tfcmVnaW9uKCkgZmFpbGVkIEkvTyBwb3J0IDB4JXhcbiIsCisJCQkJIGlvcF9iYXNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCUFTQ19EQkcxKDEsICJBc2NTZWFyY2hJT1BvcnRBZGRyMTE6IHByb2JpbmcgSS9PIHBvcnQgMHgleFxuIiwKKwkJCSBpb3BfYmFzZSk7CisJCXJlbGVhc2VfcmVnaW9uKGlvcF9iYXNlLCBBU0NfSU9BRFJfR0FQKTsKKwkJaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7CisJCQlyZXR1cm4gKGlvcF9iYXNlKTsKKwkJfQorCX0KKwlyZXR1cm4gKDApOwogfQogCi1TVEFUSUMgdm9pZCBfX2luaXQKLUFzY1NldElTQVBOUFdhaXRGb3JLZXkodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBBc2NTZXRJU0FQTlBXYWl0Rm9yS2V5KHZvaWQpCiB7Ci0gICAgb3V0cChBU0NfSVNBX1BOUF9QT1JUX0FERFIsIDB4MDIpOwotICAgIG91dHAoQVNDX0lTQV9QTlBfUE9SVF9XUklURSwgMHgwMik7Ci0gICAgcmV0dXJuOworCW91dHAoQVNDX0lTQV9QTlBfUE9SVF9BRERSLCAweDAyKTsKKwlvdXRwKEFTQ19JU0FfUE5QX1BPUlRfV1JJVEUsIDB4MDIpOworCXJldHVybjsKIH0KICNlbmRpZiAvKiBDT05GSUdfSVNBICovCiAKLVNUQVRJQyB2b2lkIF9faW5pdAotQXNjVG9nZ2xlSVJRQWN0KAotICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCi0pCitzdGF0aWMgdm9pZCBfX2luaXQgQXNjVG9nZ2xlSVJRQWN0KFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19JUlFfQUNUKTsKLSAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKLSAgICByZXR1cm47CisJQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0lSUV9BQ1QpOworCUFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIDApOworCXJldHVybjsKIH0KIAotU1RBVElDIHVjaGFyIF9faW5pdAotQXNjR2V0Q2hpcElSUSgKLSAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgIHVzaG9ydCBidXNfdHlwZSkKK3N0YXRpYyB1Y2hhciBfX2luaXQgQXNjR2V0Q2hpcElSUShQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IGJ1c190eXBlKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnX2xzdzsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfaXJxOworCXVzaG9ydCBjZmdfbHN3OworCXVjaGFyIGNoaXBfaXJxOwogCi0gICAgaWYgKChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSAhPSAwKSB7Ci0gICAgICAgIGNmZ19sc3cgPSBBc2NHZXRFaXNhQ2hpcENmZyhpb3BfYmFzZSk7Ci0gICAgICAgIGNoaXBfaXJxID0gKHVjaGFyKSAoKChjZmdfbHN3ID4+IDgpICYgMHgwNykgKyAxMCk7Ci0gICAgICAgIGlmICgoY2hpcF9pcnEgPT0gMTMpIHx8IChjaGlwX2lycSA+IDE1KSkgewotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGNoaXBfaXJxKTsKLSAgICB9Ci0gICAgaWYgKChidXNfdHlwZSAmIEFTQ19JU19WTCkgIT0gMCkgewotICAgICAgICBjZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7Ci0gICAgICAgIGNoaXBfaXJxID0gKHVjaGFyKSAoKChjZmdfbHN3ID4+IDIpICYgMHgwNykpOwotICAgICAgICBpZiAoKGNoaXBfaXJxID09IDApIHx8Ci0gICAgICAgICAgICAoY2hpcF9pcnEgPT0gNCkgfHwKLSAgICAgICAgICAgIChjaGlwX2lycSA9PSA3KSkgewotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKCh1Y2hhcikgKGNoaXBfaXJxICsgKEFTQ19NSU5fSVJRX05PIC0gMSkpKTsKLSAgICB9Ci0gICAgY2ZnX2xzdyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOwotICAgIGNoaXBfaXJxID0gKHVjaGFyKSAoKChjZmdfbHN3ID4+IDIpICYgMHgwMykpOwotICAgIGlmIChjaGlwX2lycSA9PSAzKQotICAgICAgICBjaGlwX2lycSArPSAodWNoYXIpIDI7Ci0gICAgcmV0dXJuICgodWNoYXIpIChjaGlwX2lycSArIEFTQ19NSU5fSVJRX05PKSk7CisJaWYgKChidXNfdHlwZSAmIEFTQ19JU19FSVNBKSAhPSAwKSB7CisJCWNmZ19sc3cgPSBBc2NHZXRFaXNhQ2hpcENmZyhpb3BfYmFzZSk7CisJCWNoaXBfaXJxID0gKHVjaGFyKSgoKGNmZ19sc3cgPj4gOCkgJiAweDA3KSArIDEwKTsKKwkJaWYgKChjaGlwX2lycSA9PSAxMykgfHwgKGNoaXBfaXJxID4gMTUpKSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJCXJldHVybiAoY2hpcF9pcnEpOworCX0KKwlpZiAoKGJ1c190eXBlICYgQVNDX0lTX1ZMKSAhPSAwKSB7CisJCWNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKwkJY2hpcF9pcnEgPSAodWNoYXIpKCgoY2ZnX2xzdyA+PiAyKSAmIDB4MDcpKTsKKwkJaWYgKChjaGlwX2lycSA9PSAwKSB8fCAoY2hpcF9pcnEgPT0gNCkgfHwgKGNoaXBfaXJxID09IDcpKSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJCXJldHVybiAoKHVjaGFyKShjaGlwX2lycSArIChBU0NfTUlOX0lSUV9OTyAtIDEpKSk7CisJfQorCWNmZ19sc3cgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKwljaGlwX2lycSA9ICh1Y2hhcikoKChjZmdfbHN3ID4+IDIpICYgMHgwMykpOworCWlmIChjaGlwX2lycSA9PSAzKQorCQljaGlwX2lycSArPSAodWNoYXIpMjsKKwlyZXR1cm4gKCh1Y2hhcikoY2hpcF9pcnEgKyBBU0NfTUlOX0lSUV9OTykpOwogfQogCi1TVEFUSUMgdWNoYXIgX19pbml0Ci1Bc2NTZXRDaGlwSVJRKAotICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgdWNoYXIgaXJxX25vLAotICAgICAgICAgICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCitzdGF0aWMgdWNoYXIgX19pbml0CitBc2NTZXRDaGlwSVJRKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBpcnFfbm8sIHVzaG9ydCBidXNfdHlwZSkKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19sc3c7CisJdXNob3J0IGNmZ19sc3c7CiAKLSAgICBpZiAoKGJ1c190eXBlICYgQVNDX0lTX1ZMKSAhPSAwKSB7Ci0gICAgICAgIGlmIChpcnFfbm8gIT0gMCkgewotICAgICAgICAgICAgaWYgKChpcnFfbm8gPCBBU0NfTUlOX0lSUV9OTykgfHwgKGlycV9ubyA+IEFTQ19NQVhfSVJRX05PKSkgewotICAgICAgICAgICAgICAgIGlycV9ubyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlycV9ubyAtPSAodWNoYXIpICgoQVNDX01JTl9JUlFfTk8gLSAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2ZnX2xzdyA9ICh1c2hvcnQpIChBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4RkZFMyk7Ci0gICAgICAgIGNmZ19sc3cgfD0gKHVzaG9ydCkgMHgwMDEwOwotICAgICAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmdfbHN3KTsKLSAgICAgICAgQXNjVG9nZ2xlSVJRQWN0KGlvcF9iYXNlKTsKLSAgICAgICAgY2ZnX2xzdyA9ICh1c2hvcnQpIChBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKSAmIDB4RkZFMCk7Ci0gICAgICAgIGNmZ19sc3cgfD0gKHVzaG9ydCkgKChpcnFfbm8gJiAweDA3KSA8PCAyKTsKLSAgICAgICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnX2xzdyk7Ci0gICAgICAgIEFzY1RvZ2dsZUlSUUFjdChpb3BfYmFzZSk7Ci0gICAgICAgIHJldHVybiAoQXNjR2V0Q2hpcElSUShpb3BfYmFzZSwgYnVzX3R5cGUpKTsKLSAgICB9Ci0gICAgaWYgKChidXNfdHlwZSAmIChBU0NfSVNfSVNBKSkgIT0gMCkgewotICAgICAgICBpZiAoaXJxX25vID09IDE1KQotICAgICAgICAgICAgaXJxX25vIC09ICh1Y2hhcikgMjsKLSAgICAgICAgaXJxX25vIC09ICh1Y2hhcikgQVNDX01JTl9JUlFfTk87Ci0gICAgICAgIGNmZ19sc3cgPSAodXNob3J0KSAoQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSkgJiAweEZGRjMpOwotICAgICAgICBjZmdfbHN3IHw9ICh1c2hvcnQpICgoaXJxX25vICYgMHgwMykgPDwgMik7Ci0gICAgICAgIEFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOwotICAgICAgICByZXR1cm4gKEFzY0dldENoaXBJUlEoaW9wX2Jhc2UsIGJ1c190eXBlKSk7Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisJaWYgKChidXNfdHlwZSAmIEFTQ19JU19WTCkgIT0gMCkgeworCQlpZiAoaXJxX25vICE9IDApIHsKKwkJCWlmICgoaXJxX25vIDwgQVNDX01JTl9JUlFfTk8pCisJCQkgICAgfHwgKGlycV9ubyA+IEFTQ19NQVhfSVJRX05PKSkgeworCQkJCWlycV9ubyA9IDA7CisJCQl9IGVsc2UgeworCQkJCWlycV9ubyAtPSAodWNoYXIpKChBU0NfTUlOX0lSUV9OTyAtIDEpKTsKKwkJCX0KKwkJfQorCQljZmdfbHN3ID0gKHVzaG9ydCkoQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSkgJiAweEZGRTMpOworCQljZmdfbHN3IHw9ICh1c2hvcnQpMHgwMDEwOworCQlBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmdfbHN3KTsKKwkJQXNjVG9nZ2xlSVJRQWN0KGlvcF9iYXNlKTsKKwkJY2ZnX2xzdyA9ICh1c2hvcnQpKEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkUwKTsKKwkJY2ZnX2xzdyB8PSAodXNob3J0KSgoaXJxX25vICYgMHgwNykgPDwgMik7CisJCUFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworCQlBc2NUb2dnbGVJUlFBY3QoaW9wX2Jhc2UpOworCQlyZXR1cm4gKEFzY0dldENoaXBJUlEoaW9wX2Jhc2UsIGJ1c190eXBlKSk7CisJfQorCWlmICgoYnVzX3R5cGUgJiAoQVNDX0lTX0lTQSkpICE9IDApIHsKKwkJaWYgKGlycV9ubyA9PSAxNSkKKwkJCWlycV9ubyAtPSAodWNoYXIpMjsKKwkJaXJxX25vIC09ICh1Y2hhcilBU0NfTUlOX0lSUV9OTzsKKwkJY2ZnX2xzdyA9ICh1c2hvcnQpKEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkYzKTsKKwkJY2ZnX2xzdyB8PSAodXNob3J0KSgoaXJxX25vICYgMHgwMykgPDwgMik7CisJCUFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworCQlyZXR1cm4gKEFzY0dldENoaXBJUlEoaW9wX2Jhc2UsIGJ1c190eXBlKSk7CisJfQorCXJldHVybiAoMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSVNBCi1TVEFUSUMgdm9pZCBfX2luaXQKLUFzY0VuYWJsZUlzYURtYSgKLSAgICAgICAgICAgICAgICAgICB1Y2hhciBkbWFfY2hhbm5lbCkKK3N0YXRpYyB2b2lkIF9faW5pdCBBc2NFbmFibGVJc2FEbWEodWNoYXIgZG1hX2NoYW5uZWwpCiB7Ci0gICAgaWYgKGRtYV9jaGFubmVsIDwgNCkgewotICAgICAgICBvdXRwKDB4MDAwQiwgKHVzaG9ydCkgKDB4QzAgfCBkbWFfY2hhbm5lbCkpOwotICAgICAgICBvdXRwKDB4MDAwQSwgZG1hX2NoYW5uZWwpOwotICAgIH0gZWxzZSBpZiAoZG1hX2NoYW5uZWwgPCA4KSB7Ci0gICAgICAgIG91dHAoMHgwMEQ2LCAodXNob3J0KSAoMHhDMCB8IChkbWFfY2hhbm5lbCAtIDQpKSk7Ci0gICAgICAgIG91dHAoMHgwMEQ0LCAodXNob3J0KSAoZG1hX2NoYW5uZWwgLSA0KSk7Ci0gICAgfQotICAgIHJldHVybjsKKwlpZiAoZG1hX2NoYW5uZWwgPCA0KSB7CisJCW91dHAoMHgwMDBCLCAodXNob3J0KSgweEMwIHwgZG1hX2NoYW5uZWwpKTsKKwkJb3V0cCgweDAwMEEsIGRtYV9jaGFubmVsKTsKKwl9IGVsc2UgaWYgKGRtYV9jaGFubmVsIDwgOCkgeworCQlvdXRwKDB4MDBENiwgKHVzaG9ydCkoMHhDMCB8IChkbWFfY2hhbm5lbCAtIDQpKSk7CisJCW91dHAoMHgwMEQ0LCAodXNob3J0KShkbWFfY2hhbm5lbCAtIDQpKTsKKwl9CisJcmV0dXJuOwogfQogI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KIAotU1RBVElDIGludAotQXNjSXNyQ2hpcEhhbHRlZCgKLSAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKLSkKK3N0YXRpYyBpbnQgQXNjSXNyQ2hpcEhhbHRlZChBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBFWFRfTVNHICAgICAgICAgICAgIGV4dF9tc2c7Ci0gICAgRVhUX01TRyAgICAgICAgICAgICBvdXRfbXNnOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgaGFsdF9xX2FkZHI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBzZHRyX2FjY2VwdDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGludF9oYWx0X2NvZGU7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgc2NzaV9idXN5OwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHRhcmdldF9pZDsKLSAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGFnX2NvZGU7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBxX3N0YXR1czsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGhhbHRfcXA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzZHRyX2RhdGE7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB0YXJnZXRfaXg7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBxX2NudGwsIHRpZF9ubzsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGN1cl9kdmNfcW5nOwotICAgIHVjaGFyICAgICAgICAgICAgICAgYXN5bl9zZHRyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2NzaV9zdGF0dXM7Ci0gICAgYXNjX2JvYXJkX3QgICAgICAgICAqYm9hcmRwOworCUVYVF9NU0cgZXh0X21zZzsKKwlFWFRfTVNHIG91dF9tc2c7CisJdXNob3J0IGhhbHRfcV9hZGRyOworCWludCBzZHRyX2FjY2VwdDsKKwl1c2hvcnQgaW50X2hhbHRfY29kZTsKKwlBU0NfU0NTSV9CSVRfSURfVFlQRSBzY3NpX2J1c3k7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgdGFyZ2V0X2lkOworCVBvcnRBZGRyIGlvcF9iYXNlOworCXVjaGFyIHRhZ19jb2RlOworCXVjaGFyIHFfc3RhdHVzOworCXVjaGFyIGhhbHRfcXA7CisJdWNoYXIgc2R0cl9kYXRhOworCXVjaGFyIHRhcmdldF9peDsKKwl1Y2hhciBxX2NudGwsIHRpZF9ubzsKKwl1Y2hhciBjdXJfZHZjX3FuZzsKKwl1Y2hhciBhc3luX3NkdHI7CisJdWNoYXIgc2NzaV9zdGF0dXM7CisJYXNjX2JvYXJkX3QgKmJvYXJkcDsKIAotICAgIEFTQ19BU1NFUlQoYXNjX2R2Yy0+ZHJ2X3B0ciAhPSBOVUxMKTsKLSAgICBib2FyZHAgPSBhc2NfZHZjLT5kcnZfcHRyOworCUFTQ19BU1NFUlQoYXNjX2R2Yy0+ZHJ2X3B0ciAhPSBOVUxMKTsKKwlib2FyZHAgPSBhc2NfZHZjLT5kcnZfcHRyOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICBpbnRfaGFsdF9jb2RlID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1cpOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJaW50X2hhbHRfY29kZSA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XKTsKIAotICAgIGhhbHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfQ1VSQ0RCX0IpOwotICAgIGhhbHRfcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihoYWx0X3FwKTsKLSAgICB0YXJnZXRfaXggPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFSR0VUX0lYKSk7Ci0gICAgcV9jbnRsID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCkpOwotICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7Ci0gICAgdGFyZ2V0X2lkID0gKHVjaGFyKSBBU0NfVElEX1RPX1RBUkdFVF9JRCh0aWRfbm8pOwotICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgewotICAgICAgICBhc3luX3NkdHIgPSBBU1lOX1NEVFJfREFUQV9GSVhfUENJX1JFVl9BQjsKLSAgICB9IGVsc2UgewotICAgICAgICBhc3luX3NkdHIgPSAwOwotICAgIH0KLSAgICBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVgpIHsKLSAgICAgICAgaWYgKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICYgdGFyZ2V0X2lkKSB7Ci0gICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgMCwgdGlkX25vKTsKLSAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSAwOwotICAgICAgICB9Ci0gICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfSBlbHNlIGlmIChpbnRfaGFsdF9jb2RlID09IEFTQ19IQUxUX0VOQUJMRV9BU1lOX1VTRV9TWU5fRklYKSB7Ci0gICAgICAgIGlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgewotICAgICAgICAgICAgQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIGFzeW5fc2R0ciwgdGlkX25vKTsKLSAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSBhc3luX3NkdHI7Ci0gICAgICAgIH0KLSAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfRVhUTVNHX0lOKSB7CisJaGFsdF9xcCA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9DVVJDREJfQik7CisJaGFsdF9xX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKGhhbHRfcXApOworCXRhcmdldF9peCA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgICAgKHVzaG9ydCkoaGFsdF9xX2FkZHIgKworCQkJCQkgICAgICh1c2hvcnQpQVNDX1NDU0lRX0JfVEFSR0VUX0lYKSk7CisJcV9jbnRsID0KKwkgICAgQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorCQkJICAgICh1c2hvcnQpKGhhbHRfcV9hZGRyICsgKHVzaG9ydClBU0NfU0NTSVFfQl9DTlRMKSk7CisJdGlkX25vID0gQVNDX1RJWF9UT19USUQodGFyZ2V0X2l4KTsKKwl0YXJnZXRfaWQgPSAodWNoYXIpQVNDX1RJRF9UT19UQVJHRVRfSUQodGlkX25vKTsKKwlpZiAoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJiB0YXJnZXRfaWQpIHsKKwkJYXN5bl9zZHRyID0gQVNZTl9TRFRSX0RBVEFfRklYX1BDSV9SRVZfQUI7CisJfSBlbHNlIHsKKwkJYXN5bl9zZHRyID0gMDsKKwl9CisJaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfRElTQUJMRV9BU1lOX1VTRV9TWU5fRklYKSB7CisJCWlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRhcmdldF9pZCkgeworCQkJQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIDAsIHRpZF9ubyk7CisJCQlib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gMDsKKwkJfQorCQlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworCQlyZXR1cm4gKDApOworCX0gZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9FTkFCTEVfQVNZTl9VU0VfU1lOX0ZJWCkgeworCQlpZiAoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJiB0YXJnZXRfaWQpIHsKKwkJCUFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisJCQlib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gYXN5bl9zZHRyOworCQl9CisJCUFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIGlmIChpbnRfaGFsdF9jb2RlID09IEFTQ19IQUxUX0VYVE1TR19JTikgewogCi0gICAgICAgIEFzY01lbVdvcmRDb3B5UHRyRnJvbUxyYW0oaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dJTl9CRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZleHRfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFWFRfTVNHKSA+PiAxKTsKKwkJQXNjTWVtV29yZENvcHlQdHJGcm9tTHJhbShpb3BfYmFzZSwKKwkJCQkJICBBU0NWX01TR0lOX0JFRywKKwkJCQkJICAodWNoYXIgKikmZXh0X21zZywKKwkJCQkJICBzaXplb2YoRVhUX01TRykgPj4gMSk7CiAKLSAgICAgICAgaWYgKGV4dF9tc2cubXNnX3R5cGUgPT0gTVNfRVhURU5EICYmCi0gICAgICAgICAgICBleHRfbXNnLm1zZ19yZXEgPT0gTVNfU0RUUl9DT0RFICYmCi0gICAgICAgICAgICBleHRfbXNnLm1zZ19sZW4gPT0gTVNfU0RUUl9MRU4pIHsKLSAgICAgICAgICAgIHNkdHJfYWNjZXB0ID0gVFJVRTsKLSAgICAgICAgICAgIGlmICgoZXh0X21zZy5yZXFfYWNrX29mZnNldCA+IEFTQ19TWU5fTUFYX09GRlNFVCkpIHsKKwkJaWYgKGV4dF9tc2cubXNnX3R5cGUgPT0gTVNfRVhURU5EICYmCisJCSAgICBleHRfbXNnLm1zZ19yZXEgPT0gTVNfU0RUUl9DT0RFICYmCisJCSAgICBleHRfbXNnLm1zZ19sZW4gPT0gTVNfU0RUUl9MRU4pIHsKKwkJCXNkdHJfYWNjZXB0ID0gVFJVRTsKKwkJCWlmICgoZXh0X21zZy5yZXFfYWNrX29mZnNldCA+IEFTQ19TWU5fTUFYX09GRlNFVCkpIHsKIAotICAgICAgICAgICAgICAgIHNkdHJfYWNjZXB0ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZXh0X21zZy5yZXFfYWNrX29mZnNldCA9IEFTQ19TWU5fTUFYX09GRlNFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoZXh0X21zZy54ZmVyX3BlcmlvZCA8Ci0gICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFthc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleF0pIHx8Ci0gICAgICAgICAgICAgICAgKGV4dF9tc2cueGZlcl9wZXJpb2QgPgotICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXhdKSkgewotICAgICAgICAgICAgICAgIHNkdHJfYWNjZXB0ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgZXh0X21zZy54ZmVyX3BlcmlvZCA9Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFthc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2R0cl9hY2NlcHQpIHsKLSAgICAgICAgICAgICAgICBzZHRyX2RhdGEgPSBBc2NDYWxTRFRSRGF0YShhc2NfZHZjLCBleHRfbXNnLnhmZXJfcGVyaW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOwotICAgICAgICAgICAgICAgIGlmICgoc2R0cl9kYXRhID09IDB4RkYpKSB7CisJCQkJc2R0cl9hY2NlcHQgPSBGQUxTRTsKKwkJCQlleHRfbXNnLnJlcV9hY2tfb2Zmc2V0ID0gQVNDX1NZTl9NQVhfT0ZGU0VUOworCQkJfQorCQkJaWYgKChleHRfbXNnLnhmZXJfcGVyaW9kIDwKKwkJCSAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsW2FzY19kdmMtPgorCQkJCQkJICAgICAgaG9zdF9pbml0X3NkdHJfaW5kZXhdKQorCQkJICAgIHx8IChleHRfbXNnLnhmZXJfcGVyaW9kID4KKwkJCQlhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+CisJCQkJCQkJIG1heF9zZHRyX2luZGV4XSkpIHsKKwkJCQlzZHRyX2FjY2VwdCA9IEZBTFNFOworCQkJCWV4dF9tc2cueGZlcl9wZXJpb2QgPQorCQkJCSAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbYXNjX2R2Yy0+CisJCQkJCQkJICAgICBob3N0X2luaXRfc2R0cl9pbmRleF07CisJCQl9CisJCQlpZiAoc2R0cl9hY2NlcHQpIHsKKwkJCQlzZHRyX2RhdGEgPQorCQkJCSAgICBBc2NDYWxTRFRSRGF0YShhc2NfZHZjLCBleHRfbXNnLnhmZXJfcGVyaW9kLAorCQkJCQkJICAgZXh0X21zZy5yZXFfYWNrX29mZnNldCk7CisJCQkJaWYgKChzZHRyX2RhdGEgPT0gMHhGRikpIHsKIAotICAgICAgICAgICAgICAgICAgICBxX2NudGwgfD0gUUNfTVNHX09VVDsKLSAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+aW5pdF9zZHRyICY9IH50YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSAmPSB+dGFyZ2V0X2lkOwotICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgYXN5bl9zZHRyLCB0aWRfbm8pOwotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gYXN5bl9zZHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleHRfbXNnLnJlcV9hY2tfb2Zmc2V0ID09IDApIHsKKwkJCQkJcV9jbnRsIHw9IFFDX01TR19PVVQ7CisJCQkJCWFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGFyZ2V0X2lkOworCQkJCQlhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnRhcmdldF9pZDsKKwkJCQkJQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIGFzeW5fc2R0ciwKKwkJCQkJCSAgICAgICB0aWRfbm8pOworCQkJCQlib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gYXN5bl9zZHRyOworCQkJCX0KKwkJCX0KKwkJCWlmIChleHRfbXNnLnJlcV9hY2tfb2Zmc2V0ID09IDApIHsKIAotICAgICAgICAgICAgICAgIHFfY250bCAmPSB+UUNfTVNHX09VVDsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5pbml0X3NkdHIgJj0gfnRhcmdldF9pZDsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnRhcmdldF9pZDsKLSAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgYXN5bl9zZHRyLCB0aWRfbm8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoc2R0cl9hY2NlcHQgJiYgKHFfY250bCAmIFFDX01TR19PVVQpKSB7CisJCQkJcV9jbnRsICY9IH5RQ19NU0dfT1VUOworCQkJCWFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGFyZ2V0X2lkOworCQkJCWFzY19kdmMtPnNkdHJfZG9uZSAmPSB+dGFyZ2V0X2lkOworCQkJCUFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzZHRyX2FjY2VwdCAmJiAocV9jbnRsICYgUUNfTVNHX09VVCkpIHsKIAotICAgICAgICAgICAgICAgICAgICBxX2NudGwgJj0gflFDX01TR19PVVQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSB8PSB0YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciB8PSB0YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICY9IH50YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHNkdHJfZGF0YSA9IEFzY0NhbFNEVFJEYXRhKGFzY19kdmMsIGV4dF9tc2cueGZlcl9wZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgc2R0cl9kYXRhLCB0aWRfbm8pOwotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gc2R0cl9kYXRhOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQkJCXFfY250bCAmPSB+UUNfTVNHX09VVDsKKwkJCQkJYXNjX2R2Yy0+c2R0cl9kb25lIHw9IHRhcmdldF9pZDsKKwkJCQkJYXNjX2R2Yy0+aW5pdF9zZHRyIHw9IHRhcmdldF9pZDsKKwkJCQkJYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJj0KKwkJCQkJICAgIH50YXJnZXRfaWQ7CisJCQkJCXNkdHJfZGF0YSA9CisJCQkJCSAgICBBc2NDYWxTRFRSRGF0YShhc2NfZHZjLAorCQkJCQkJCSAgIGV4dF9tc2cueGZlcl9wZXJpb2QsCisJCQkJCQkJICAgZXh0X21zZy4KKwkJCQkJCQkgICByZXFfYWNrX29mZnNldCk7CisJCQkJCUFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBzZHRyX2RhdGEsCisJCQkJCQkgICAgICAgdGlkX25vKTsKKwkJCQkJYm9hcmRwLT5zZHRyX2RhdGFbdGlkX25vXSA9IHNkdHJfZGF0YTsKKwkJCQl9IGVsc2UgewogCi0gICAgICAgICAgICAgICAgICAgIHFfY250bCB8PSBRQ19NU0dfT1VUOwotICAgICAgICAgICAgICAgICAgICBBc2NNc2dPdXRTRFRSKGFzY19kdmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X21zZy54ZmVyX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfbXNnLnJlcV9hY2tfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJj0gfnRhcmdldF9pZDsKLSAgICAgICAgICAgICAgICAgICAgc2R0cl9kYXRhID0gQXNjQ2FsU0RUUkRhdGEoYXNjX2R2YywgZXh0X21zZy54ZmVyX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X21zZy5yZXFfYWNrX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBzZHRyX2RhdGEsIHRpZF9ubyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvYXJkcC0+c2R0cl9kYXRhW3RpZF9ub10gPSBzZHRyX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSB8PSB0YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciB8PSB0YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCQkJCQlxX2NudGwgfD0gUUNfTVNHX09VVDsKKwkJCQkJQXNjTXNnT3V0U0RUUihhc2NfZHZjLAorCQkJCQkJICAgICAgZXh0X21zZy54ZmVyX3BlcmlvZCwKKwkJCQkJCSAgICAgIGV4dF9tc2cucmVxX2Fja19vZmZzZXQpOworCQkJCQlhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmPQorCQkJCQkgICAgfnRhcmdldF9pZDsKKwkJCQkJc2R0cl9kYXRhID0KKwkJCQkJICAgIEFzY0NhbFNEVFJEYXRhKGFzY19kdmMsCisJCQkJCQkJICAgZXh0X21zZy54ZmVyX3BlcmlvZCwKKwkJCQkJCQkgICBleHRfbXNnLgorCQkJCQkJCSAgIHJlcV9hY2tfb2Zmc2V0KTsKKwkJCQkJQXNjU2V0Q2hpcFNEVFIoaW9wX2Jhc2UsIHNkdHJfZGF0YSwKKwkJCQkJCSAgICAgICB0aWRfbm8pOworCQkJCQlib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gc2R0cl9kYXRhOworCQkJCQlhc2NfZHZjLT5zZHRyX2RvbmUgfD0gdGFyZ2V0X2lkOworCQkJCQlhc2NfZHZjLT5pbml0X3NkdHIgfD0gdGFyZ2V0X2lkOworCQkJCX0KKwkJCX0KIAotICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9jbnRsKTsKLSAgICAgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9IGVsc2UgaWYgKGV4dF9tc2cubXNnX3R5cGUgPT0gTVNfRVhURU5EICYmCi0gICAgICAgICAgICAgICAgICAgZXh0X21zZy5tc2dfcmVxID09IE1TX1dEVFJfQ09ERSAmJgotICAgICAgICAgICAgICAgICAgIGV4dF9tc2cubXNnX2xlbiA9PSBNU19XRFRSX0xFTikgeworCQkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJICh1c2hvcnQpKGhhbHRfcV9hZGRyICsKKwkJCQkJCSAgKHVzaG9ydClBU0NfU0NTSVFfQl9DTlRMKSwKKwkJCQkJIHFfY250bCk7CisJCQlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworCQkJcmV0dXJuICgwKTsKKwkJfSBlbHNlIGlmIChleHRfbXNnLm1zZ190eXBlID09IE1TX0VYVEVORCAmJgorCQkJICAgZXh0X21zZy5tc2dfcmVxID09IE1TX1dEVFJfQ09ERSAmJgorCQkJICAgZXh0X21zZy5tc2dfbGVuID09IE1TX1dEVFJfTEVOKSB7CiAKLSAgICAgICAgICAgIGV4dF9tc2cud2R0cl93aWR0aCA9IDA7Ci0gICAgICAgICAgICBBc2NNZW1Xb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ1ZfTVNHT1VUX0JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAmZXh0X21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFWFRfTVNHKSA+PiAxKTsKLSAgICAgICAgICAgIHFfY250bCB8PSBRQ19NU0dfT1VUOwotICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9jbnRsKTsKLSAgICAgICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9IGVsc2UgeworCQkJZXh0X21zZy53ZHRyX3dpZHRoID0gMDsKKwkJCUFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorCQkJCQkJQVNDVl9NU0dPVVRfQkVHLAorCQkJCQkJKHVjaGFyICopJmV4dF9tc2csCisJCQkJCQlzaXplb2YoRVhUX01TRykgPj4gMSk7CisJCQlxX2NudGwgfD0gUUNfTVNHX09VVDsKKwkJCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJCSAodXNob3J0KShoYWx0X3FfYWRkciArCisJCQkJCQkgICh1c2hvcnQpQVNDX1NDU0lRX0JfQ05UTCksCisJCQkJCSBxX2NudGwpOworCQkJQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKwkJCXJldHVybiAoMCk7CisJCX0gZWxzZSB7CiAKLSAgICAgICAgICAgIGV4dF9tc2cubXNnX3R5cGUgPSBNRVNTQUdFX1JFSkVDVDsKLSAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDVl9NU0dPVVRfQkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZleHRfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOwotICAgICAgICAgICAgcV9jbnRsIHw9IFFDX01TR19PVVQ7Ci0gICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0NOVEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOwotICAgICAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfQ0hLX0NPTkRJVElPTikgeworCQkJZXh0X21zZy5tc2dfdHlwZSA9IE1FU1NBR0VfUkVKRUNUOworCQkJQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisJCQkJCQlBU0NWX01TR09VVF9CRUcsCisJCQkJCQkodWNoYXIgKikmZXh0X21zZywKKwkJCQkJCXNpemVvZihFWFRfTVNHKSA+PiAxKTsKKwkJCXFfY250bCB8PSBRQ19NU0dfT1VUOworCQkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJICh1c2hvcnQpKGhhbHRfcV9hZGRyICsKKwkJCQkJCSAgKHVzaG9ydClBU0NfU0NTSVFfQl9DTlRMKSwKKwkJCQkJIHFfY250bCk7CisJCQlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9DSEtfQ09ORElUSU9OKSB7CiAKLSAgICAgICAgcV9jbnRsIHw9IFFDX1JFUV9TRU5TRTsKKwkJcV9jbnRsIHw9IFFDX1JFUV9TRU5TRTsKIAotICAgICAgICBpZiAoKGFzY19kdmMtPmluaXRfc2R0ciAmIHRhcmdldF9pZCkgIT0gMCkgeworCQlpZiAoKGFzY19kdmMtPmluaXRfc2R0ciAmIHRhcmdldF9pZCkgIT0gMCkgewogCi0gICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnRhcmdldF9pZDsKKwkJCWFzY19kdmMtPnNkdHJfZG9uZSAmPSB+dGFyZ2V0X2lkOwogCi0gICAgICAgICAgICBzZHRyX2RhdGEgPSBBc2NHZXRNQ29kZUluaXRTRFRSQXRJRChpb3BfYmFzZSwgdGlkX25vKTsKLSAgICAgICAgICAgIHFfY250bCB8PSBRQ19NU0dfT1VUOwotICAgICAgICAgICAgQXNjTXNnT3V0U0RUUihhc2NfZHZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbKHNkdHJfZGF0YSA+PiA0KSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChhc2NfZHZjLT5tYXhfc2R0cl9pbmRleCAtIDEpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoc2R0cl9kYXRhICYgKHVjaGFyKSBBU0NfU1lOX01BWF9PRkZTRVQpKTsKLSAgICAgICAgfQorCQkJc2R0cl9kYXRhID0gQXNjR2V0TUNvZGVJbml0U0RUUkF0SUQoaW9wX2Jhc2UsIHRpZF9ubyk7CisJCQlxX2NudGwgfD0gUUNfTVNHX09VVDsKKwkJCUFzY01zZ091dFNEVFIoYXNjX2R2YywKKwkJCQkgICAgICBhc2NfZHZjLT4KKwkJCQkgICAgICBzZHRyX3BlcmlvZF90YmxbKHNkdHJfZGF0YSA+PiA0KSAmCisJCQkJCQkgICAgICAodWNoYXIpKGFzY19kdmMtPgorCQkJCQkJCSAgICAgIG1heF9zZHRyX2luZGV4IC0KKwkJCQkJCQkgICAgICAxKV0sCisJCQkJICAgICAgKHVjaGFyKShzZHRyX2RhdGEgJiAodWNoYXIpCisJCQkJCSAgICAgIEFTQ19TWU5fTUFYX09GRlNFVCkpOworCQl9CiAKLSAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBxX2NudGwpOworCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorCQkJCSAodXNob3J0KShoYWx0X3FfYWRkciArCisJCQkJCSAgKHVzaG9ydClBU0NfU0NTSVFfQl9DTlRMKSwgcV9jbnRsKTsKIAotICAgICAgICB0YWdfY29kZSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFHX0NPREUpKTsKLSAgICAgICAgdGFnX2NvZGUgJj0gMHhEQzsKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICYgdGFyZ2V0X2lkKQotICAgICAgICAgICAgICAgJiYgIShhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlcl9hbHdheXMgJiB0YXJnZXRfaWQpCi0pIHsKKwkJdGFnX2NvZGUgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJCSAgICh1c2hvcnQpKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkKKwkJCQkJCSAgICBBU0NfU0NTSVFfQl9UQUdfQ09ERSkpOworCQl0YWdfY29kZSAmPSAweERDOworCQlpZiAoKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICYgdGFyZ2V0X2lkKQorCQkgICAgJiYgIShhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlcl9hbHdheXMgJiB0YXJnZXRfaWQpCisJCSAgICApIHsKIAotICAgICAgICAgICAgdGFnX2NvZGUgfD0gKEFTQ19UQUdfRkxBR19ESVNBQkxFX0RJU0NPTk5FQ1QKLSAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTQ19UQUdfRkxBR19ESVNBQkxFX0FTWU5fVVNFX1NZTl9GSVgpOworCQkJdGFnX2NvZGUgfD0gKEFTQ19UQUdfRkxBR19ESVNBQkxFX0RJU0NPTk5FQ1QKKwkJCQkgICAgIHwgQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCk7CiAKLSAgICAgICAgfQotICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfVEFHX0NPREUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19jb2RlKTsKKwkJfQorCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorCQkJCSAodXNob3J0KShoYWx0X3FfYWRkciArCisJCQkJCSAgKHVzaG9ydClBU0NfU0NTSVFfQl9UQUdfQ09ERSksCisJCQkJIHRhZ19jb2RlKTsKIAotICAgICAgICBxX3N0YXR1cyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKLSAgICAgICAgcV9zdGF0dXMgfD0gKFFTX1JFQURZIHwgUVNfQlVTWSk7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChoYWx0X3FfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NUQVRVUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcV9zdGF0dXMpOworCQlxX3N0YXR1cyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJICAgKHVzaG9ydCkoaGFsdF9xX2FkZHIgKyAodXNob3J0KQorCQkJCQkJICAgIEFTQ19TQ1NJUV9CX1NUQVRVUykpOworCQlxX3N0YXR1cyB8PSAoUVNfUkVBRFkgfCBRU19CVVNZKTsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgKHVzaG9ydCkoaGFsdF9xX2FkZHIgKworCQkJCQkgICh1c2hvcnQpQVNDX1NDU0lRX0JfU1RBVFVTKSwKKwkJCQkgcV9zdGF0dXMpOwogCi0gICAgICAgIHNjc2lfYnVzeSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7Ci0gICAgICAgIHNjc2lfYnVzeSAmPSB+dGFyZ2V0X2lkOwotICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSBBU0NWX1NDU0lCVVNZX0IsIHNjc2lfYnVzeSk7CisJCXNjc2lfYnVzeSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydClBU0NWX1NDU0lCVVNZX0IpOworCQlzY3NpX2J1c3kgJj0gfnRhcmdldF9pZDsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydClBU0NWX1NDU0lCVVNZX0IsIHNjc2lfYnVzeSk7CiAKLSAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfU0RUUl9SRUpFQ1RFRCkgeworCQlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworCQlyZXR1cm4gKDApOworCX0gZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9TRFRSX1JFSkVDVEVEKSB7CiAKLSAgICAgICAgQXNjTWVtV29yZENvcHlQdHJGcm9tTHJhbShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NWX01TR09VVF9CRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZvdXRfbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFWFRfTVNHKSA+PiAxKTsKKwkJQXNjTWVtV29yZENvcHlQdHJGcm9tTHJhbShpb3BfYmFzZSwKKwkJCQkJICBBU0NWX01TR09VVF9CRUcsCisJCQkJCSAgKHVjaGFyICopJm91dF9tc2csCisJCQkJCSAgc2l6ZW9mKEVYVF9NU0cpID4+IDEpOwogCi0gICAgICAgIGlmICgob3V0X21zZy5tc2dfdHlwZSA9PSBNU19FWFRFTkQpICYmCi0gICAgICAgICAgICAob3V0X21zZy5tc2dfbGVuID09IE1TX1NEVFJfTEVOKSAmJgotICAgICAgICAgICAgKG91dF9tc2cubXNnX3JlcSA9PSBNU19TRFRSX0NPREUpKSB7CisJCWlmICgob3V0X21zZy5tc2dfdHlwZSA9PSBNU19FWFRFTkQpICYmCisJCSAgICAob3V0X21zZy5tc2dfbGVuID09IE1TX1NEVFJfTEVOKSAmJgorCQkgICAgKG91dF9tc2cubXNnX3JlcSA9PSBNU19TRFRSX0NPREUpKSB7CiAKLSAgICAgICAgICAgIGFzY19kdmMtPmluaXRfc2R0ciAmPSB+dGFyZ2V0X2lkOwotICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lICY9IH50YXJnZXRfaWQ7Ci0gICAgICAgICAgICBBc2NTZXRDaGlwU0RUUihpb3BfYmFzZSwgYXN5bl9zZHRyLCB0aWRfbm8pOwotICAgICAgICAgICAgYm9hcmRwLT5zZHRyX2RhdGFbdGlkX25vXSA9IGFzeW5fc2R0cjsKLSAgICAgICAgfQotICAgICAgICBxX2NudGwgJj0gflFDX01TR19PVVQ7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKGhhbHRfcV9hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfQ05UTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcV9jbnRsKTsKLSAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9IGVsc2UgaWYgKGludF9oYWx0X2NvZGUgPT0gQVNDX0hBTFRfU1NfUVVFVUVfRlVMTCkgeworCQkJYXNjX2R2Yy0+aW5pdF9zZHRyICY9IH50YXJnZXRfaWQ7CisJCQlhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnRhcmdldF9pZDsKKwkJCUFzY1NldENoaXBTRFRSKGlvcF9iYXNlLCBhc3luX3NkdHIsIHRpZF9ubyk7CisJCQlib2FyZHAtPnNkdHJfZGF0YVt0aWRfbm9dID0gYXN5bl9zZHRyOworCQl9CisJCXFfY250bCAmPSB+UUNfTVNHX09VVDsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgKHVzaG9ydCkoaGFsdF9xX2FkZHIgKworCQkJCQkgICh1c2hvcnQpQVNDX1NDU0lRX0JfQ05UTCksIHFfY250bCk7CisJCUFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIGlmIChpbnRfaGFsdF9jb2RlID09IEFTQ19IQUxUX1NTX1FVRVVFX0ZVTEwpIHsKIAotICAgICAgICBzY3NpX3N0YXR1cyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAodXNob3J0KSAoKHVzaG9ydCkgaGFsdF9xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfU0NTSV9TVEFUVVMpKTsKLSAgICAgICAgY3VyX2R2Y19xbmcgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoKHVzaG9ydCkgQVNDX1FBRFJfQkVHICsgKHVzaG9ydCkgdGFyZ2V0X2l4KSk7Ci0gICAgICAgIGlmICgoY3VyX2R2Y19xbmcgPiAwKSAmJgotICAgICAgICAgICAgKGFzY19kdmMtPmN1cl9kdmNfcW5nW3RpZF9ub10gPiAwKSkgeworCQlzY3NpX3N0YXR1cyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJICAgICAgKHVzaG9ydCkoKHVzaG9ydCloYWx0X3FfYWRkciArCisJCQkJCQkgICAgICAgKHVzaG9ydCkKKwkJCQkJCSAgICAgICBBU0NfU0NTSVFfU0NTSV9TVEFUVVMpKTsKKwkJY3VyX2R2Y19xbmcgPQorCQkgICAgQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorCQkJCSAgICAodXNob3J0KSgodXNob3J0KUFTQ19RQURSX0JFRyArCisJCQkJCSAgICAgKHVzaG9ydCl0YXJnZXRfaXgpKTsKKwkJaWYgKChjdXJfZHZjX3FuZyA+IDApICYmIChhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dID4gMCkpIHsKIAotICAgICAgICAgICAgc2NzaV9idXN5ID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7Ci0gICAgICAgICAgICBzY3NpX2J1c3kgfD0gdGFyZ2V0X2lkOwotICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgQVNDVl9TQ1NJQlVTWV9CLCBzY3NpX2J1c3kpOwotICAgICAgICAgICAgYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5IHw9IHRhcmdldF9pZDsKKwkJCXNjc2lfYnVzeSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJCSAgICAodXNob3J0KUFTQ1ZfU0NTSUJVU1lfQik7CisJCQlzY3NpX2J1c3kgfD0gdGFyZ2V0X2lkOworCQkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJICh1c2hvcnQpQVNDVl9TQ1NJQlVTWV9CLCBzY3NpX2J1c3kpOworCQkJYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5IHw9IHRhcmdldF9pZDsKIAotICAgICAgICAgICAgaWYgKHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VyX2R2Y19xbmcgPiBBU0NfTUlOX1RBR0dFRF9DTUQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyX2R2Y19xbmcgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSA9IGN1cl9kdmNfcW5nOworCQkJaWYgKHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKKwkJCQlpZiAoY3VyX2R2Y19xbmcgPiBBU0NfTUlOX1RBR0dFRF9DTUQpIHsKKwkJCQkJY3VyX2R2Y19xbmcgLT0gMTsKKwkJCQkJYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSA9CisJCQkJCSAgICBjdXJfZHZjX3FuZzsKIAotICAgICAgICAgICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoKHVzaG9ydCkgQVNDVl9NQVhfRFZDX1FOR19CRUcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgdGlkX25vKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2R2Y19xbmcpOworCQkJCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorCQkJCQkJCSAodXNob3J0KSgodXNob3J0KQorCQkJCQkJCQkgIEFTQ1ZfTUFYX0RWQ19RTkdfQkVHCisJCQkJCQkJCSAgKyAodXNob3J0KQorCQkJCQkJCQkgIHRpZF9ubyksCisJCQkJCQkJIGN1cl9kdmNfcW5nKTsKIAotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGRldmljZSBxdWV1ZSBkZXB0aCB0byB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAqIGFjdGl2ZSByZXF1ZXN0cyB3aGVuIHRoZSBRVUVVRSBGVUxMIGNvbmRpdGlvbgotICAgICAgICAgICAgICAgICAgICAgKiB3YXMgZW5jb3VudGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPnF1ZXVlX2Z1bGwgfD0gdGFyZ2V0X2lkOwotICAgICAgICAgICAgICAgICAgICBib2FyZHAtPnF1ZXVlX2Z1bGxfY250W3RpZF9ub10gPSBjdXJfZHZjX3FuZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9CisJCQkJCS8qCisJCQkJCSAqIFNldCB0aGUgZGV2aWNlIHF1ZXVlIGRlcHRoIHRvIHRoZSBudW1iZXIgb2YKKwkJCQkJICogYWN0aXZlIHJlcXVlc3RzIHdoZW4gdGhlIFFVRVVFIEZVTEwgY29uZGl0aW9uCisJCQkJCSAqIHdhcyBlbmNvdW50ZXJlZC4KKwkJCQkJICovCisJCQkJCWJvYXJkcC0+cXVldWVfZnVsbCB8PSB0YXJnZXRfaWQ7CisJCQkJCWJvYXJkcC0+cXVldWVfZnVsbF9jbnRbdGlkX25vXSA9CisJCQkJCSAgICBjdXJfZHZjX3FuZzsKKwkJCQl9CisJCQl9CisJCX0KKwkJQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKKwkJcmV0dXJuICgwKTsKKwl9CiAjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKLSAgICBlbHNlIGlmIChpbnRfaGFsdF9jb2RlID09IEFTQ19IQUxUX0hPU1RfQ09QWV9TR19MSVNUX1RPX1JJU0MpCi0gICAgewotICAgICAgICB1Y2hhciAgICAgICAgICAgICAgcV9ubzsKLSAgICAgICAgdXNob3J0ICAgICAgICAgICAgIHFfYWRkcjsKLSAgICAgICAgdWNoYXIgICAgICAgICAgICAgIHNnX3drX3Ffbm87Ci0gICAgICAgIHVjaGFyICAgICAgICAgICAgICBmaXJzdF9zZ193a19xX25vOwotICAgICAgICBBU0NfU0NTSV9RICAgICAgICAgKnNjc2lxOyAvKiBQdHIgdG8gZHJpdmVyIHJlcXVlc3QuICovCi0gICAgICAgIEFTQ19TR19IRUFEICAgICAgICAqc2dfaGVhZDsgLyogUHRyIHRvIGRyaXZlciBTRyByZXF1ZXN0LiAqLwotICAgICAgICBBU0NfU0dfTElTVF9RICAgICAgc2NzaV9zZ19xOyAvKiBTdHJ1Y3R1cmUgd3JpdHRlbiB0byBxdWV1ZS4gKi8KLSAgICAgICAgdXNob3J0ICAgICAgICAgICAgIHNnX2xpc3RfZHdvcmRzOwotICAgICAgICB1c2hvcnQgICAgICAgICAgICAgc2dfZW50cnlfY250OwotICAgICAgICB1Y2hhciAgICAgICAgICAgICAgbmV4dF9xcDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgIGk7CisJZWxzZSBpZiAoaW50X2hhbHRfY29kZSA9PSBBU0NfSEFMVF9IT1NUX0NPUFlfU0dfTElTVF9UT19SSVNDKSB7CisJCXVjaGFyIHFfbm87CisJCXVzaG9ydCBxX2FkZHI7CisJCXVjaGFyIHNnX3drX3Ffbm87CisJCXVjaGFyIGZpcnN0X3NnX3drX3Ffbm87CisJCUFTQ19TQ1NJX1EgKnNjc2lxOwkvKiBQdHIgdG8gZHJpdmVyIHJlcXVlc3QuICovCisJCUFTQ19TR19IRUFEICpzZ19oZWFkOwkvKiBQdHIgdG8gZHJpdmVyIFNHIHJlcXVlc3QuICovCisJCUFTQ19TR19MSVNUX1Egc2NzaV9zZ19xOwkvKiBTdHJ1Y3R1cmUgd3JpdHRlbiB0byBxdWV1ZS4gKi8KKwkJdXNob3J0IHNnX2xpc3RfZHdvcmRzOworCQl1c2hvcnQgc2dfZW50cnlfY250OworCQl1Y2hhciBuZXh0X3FwOworCQlpbnQgaTsKIAotICAgICAgICBxX25vID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSBBU0NWX1JFUV9TR19MSVNUX1FQKTsKLSAgICAgICAgaWYgKHFfbm8gPT0gQVNDX1FMSU5LX0VORCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9CisJCXFfbm8gPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpQVNDVl9SRVFfU0dfTElTVF9RUCk7CisJCWlmIChxX25vID09IEFTQ19RTElOS19FTkQpIHsKKwkJCXJldHVybiAoMCk7CisJCX0KIAotICAgICAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHFfbm8pOworCQlxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHFfbm8pOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgdGhlIHJlcXVlc3QncyBTUkIgcG9pbnRlciB0byBhIGhvc3QgQVNDX1NDU0lfUkVRCi0gICAgICAgICAqIHN0cnVjdHVyZSBwb2ludGVyIHVzaW5nIGEgbWFjcm8gcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4KLSAgICAgICAgICogVGhlIEFTQ19TQ1NJX1JFUSBwb2ludGVyIHByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUKLSAgICAgICAgICogaG9zdCBBU0NfU0dfSEVBRCBzdHJ1Y3R1cmUuCi0gICAgICAgICAqLwotICAgICAgICAvKiBSZWFkIHJlcXVlc3QncyBTUkIgcG9pbnRlci4gKi8KLSAgICAgICAgc2NzaXEgPSAoQVNDX1NDU0lfUSAqKQotICAgICAgICAgICBBU0NfU1JCMlNDU0lRKAotICAgICAgICAgICAgICAgQVNDX1UzMl9UT19WQUREUihBc2NSZWFkTHJhbURXb3JkKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9EX1NSQlBUUikpKSk7CisJCS8qCisJCSAqIENvbnZlcnQgdGhlIHJlcXVlc3QncyBTUkIgcG9pbnRlciB0byBhIGhvc3QgQVNDX1NDU0lfUkVRCisJCSAqIHN0cnVjdHVyZSBwb2ludGVyIHVzaW5nIGEgbWFjcm8gcHJvdmlkZWQgYnkgdGhlIGRyaXZlci4KKwkJICogVGhlIEFTQ19TQ1NJX1JFUSBwb2ludGVyIHByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUKKwkJICogaG9zdCBBU0NfU0dfSEVBRCBzdHJ1Y3R1cmUuCisJCSAqLworCQkvKiBSZWFkIHJlcXVlc3QncyBTUkIgcG9pbnRlci4gKi8KKwkJc2NzaXEgPSAoQVNDX1NDU0lfUSAqKQorCQkgICAgQVNDX1NSQjJTQ1NJUShBU0NfVTMyX1RPX1ZBRERSKEFzY1JlYWRMcmFtRFdvcmQoaW9wX2Jhc2UsCisJCQkJCQkJCSAgICAodXNob3J0KQorCQkJCQkJCQkgICAgKHFfYWRkciArCisJCQkJCQkJCSAgICAgQVNDX1NDU0lRX0RfU1JCUFRSKSkpKTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgcmVxdWVzdCdzIGZpcnN0IGFuZCB3b3JraW5nIFNHIHF1ZXVlLgotICAgICAgICAgKi8KLSAgICAgICAgc2dfd2tfcV9ubyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyBBU0NfU0NTSVFfQl9TR19XS19RUCkpOworCQkvKgorCQkgKiBHZXQgcmVxdWVzdCdzIGZpcnN0IGFuZCB3b3JraW5nIFNHIHF1ZXVlLgorCQkgKi8KKwkJc2dfd2tfcV9ubyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJICAgICAodXNob3J0KShxX2FkZHIgKworCQkJCQkJICAgICAgQVNDX1NDU0lRX0JfU0dfV0tfUVApKTsKIAotICAgICAgICBmaXJzdF9zZ193a19xX25vID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZJUlNUX1NHX1dLX1FQKSk7CisJCWZpcnN0X3NnX3drX3Ffbm8gPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJCQkgICAodXNob3J0KShxX2FkZHIgKworCQkJCQkJCSAgICBBU0NfU0NTSVFfQl9GSVJTVF9TR19XS19RUCkpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlc2V0IHJlcXVlc3QncyB3b3JraW5nIFNHIHF1ZXVlIGJhY2sgdG8gdGhlCi0gICAgICAgICAqIGZpcnN0IFNHIHF1ZXVlLgotICAgICAgICAgKi8KLSAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TR19XS19RUCksCi0gICAgICAgICAgICBmaXJzdF9zZ193a19xX25vKTsKKwkJLyoKKwkJICogUmVzZXQgcmVxdWVzdCdzIHdvcmtpbmcgU0cgcXVldWUgYmFjayB0byB0aGUKKwkJICogZmlyc3QgU0cgcXVldWUuCisJCSAqLworCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorCQkJCSAodXNob3J0KShxX2FkZHIgKworCQkJCQkgICh1c2hvcnQpQVNDX1NDU0lRX0JfU0dfV0tfUVApLAorCQkJCSBmaXJzdF9zZ193a19xX25vKTsKIAotICAgICAgICBzZ19oZWFkID0gc2NzaXEtPnNnX2hlYWQ7CisJCXNnX2hlYWQgPSBzY3NpcS0+c2dfaGVhZDsKIAotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgc2dfZW50cnlfY250IHRvIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCBvbiB0aGlzIGludGVycnVwdC4KLSAgICAgICAgICoKLSAgICAgICAgICogTm90ZTogVGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMgY29udGFpbiBBU0NfTUFYX1NHX0xJU1QgLSAxCi0gICAgICAgICAqIFNHIGVsZW1lbnRzLiBUaGUgZGF0YV9jbnQgYW5kIGRhdGFfYWRkciBmaWVsZHMgd2hpY2gKLSAgICAgICAgICogYWRkIDEgdG8gdGhlIFNHIGVsZW1lbnQgY2FwYWNpdHkgYXJlIG5vdCB1c2VkIHdoZW4KLSAgICAgICAgICogcmVzdGFydGluZyBTRyBoYW5kbGluZyBhZnRlciBhIGhhbHQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPiAoQVNDX01BWF9TR19MSVNUIC0gMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICBzZ19lbnRyeV9jbnQgPSBBU0NfTUFYX1NHX0xJU1QgLSAxOworCQkvKgorCQkgKiBTZXQgc2dfZW50cnlfY250IHRvIHRoZSBudW1iZXIgb2YgU0cgZWxlbWVudHMKKwkJICogdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCBvbiB0aGlzIGludGVycnVwdC4KKwkJICoKKwkJICogTm90ZTogVGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMgY29udGFpbiBBU0NfTUFYX1NHX0xJU1QgLSAxCisJCSAqIFNHIGVsZW1lbnRzLiBUaGUgZGF0YV9jbnQgYW5kIGRhdGFfYWRkciBmaWVsZHMgd2hpY2gKKwkJICogYWRkIDEgdG8gdGhlIFNHIGVsZW1lbnQgY2FwYWNpdHkgYXJlIG5vdCB1c2VkIHdoZW4KKwkJICogcmVzdGFydGluZyBTRyBoYW5kbGluZyBhZnRlciBhIGhhbHQuCisJCSAqLworCQlpZiAoc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPiAoQVNDX01BWF9TR19MSVNUIC0gMSkpIHsKKwkJCXNnX2VudHJ5X2NudCA9IEFTQ19NQVhfU0dfTElTVCAtIDE7CiAKLSAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAqIEtlZXAgdHJhY2sgb2YgcmVtYWluaW5nIG51bWJlciBvZiBTRyBlbGVtZW50cyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIGhhbmRsZWQgb24gdGhlIG5leHQgaW50ZXJydXB0LgotICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIHNjc2lxLT5yZW1haW5fc2dfZW50cnlfY250IC09IChBU0NfTUFYX1NHX0xJU1QgLSAxKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICBzZ19lbnRyeV9jbnQgPSBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudDsKLSAgICAgICAgICAgICBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCA9IDA7Ci0gICAgICAgIH0KKwkJCS8qCisJCQkgKiBLZWVwIHRyYWNrIG9mIHJlbWFpbmluZyBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdCB3aWxsCisJCQkgKiBuZWVkIHRvIGJlIGhhbmRsZWQgb24gdGhlIG5leHQgaW50ZXJydXB0LgorCQkJICovCisJCQlzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCAtPSAoQVNDX01BWF9TR19MSVNUIC0gMSk7CisJCX0gZWxzZSB7CisJCQlzZ19lbnRyeV9jbnQgPSBzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudDsKKwkJCXNjc2lxLT5yZW1haW5fc2dfZW50cnlfY250ID0gMDsKKwkJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvcHkgU0cgZWxlbWVudHMgaW50byB0aGUgbGlzdCBvZiBhbGxvY2F0ZWQgU0cgcXVldWVzLgotICAgICAgICAgKgotICAgICAgICAgKiBMYXN0IGluZGV4IGNvbXBsZXRlZCBpcyBzYXZlZCBpbiBzY3NpcS0+bmV4dF9zZ19pbmRleC4KLSAgICAgICAgICovCi0gICAgICAgIG5leHRfcXAgPSBmaXJzdF9zZ193a19xX25vOwotICAgICAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKG5leHRfcXApOwotICAgICAgICBzY3NpX3NnX3Euc2dfaGVhZF9xcCA9IHFfbm87Ci0gICAgICAgIHNjc2lfc2dfcS5jbnRsID0gUUNTR19TR19YRkVSX0xJU1Q7Ci0gICAgICAgIGZvciggaSA9IDA7IGkgPCBzZ19oZWFkLT5xdWV1ZV9jbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgIHNjc2lfc2dfcS5zZXFfbm8gPSBpICsgMTsKLSAgICAgICAgICAgICBpZiAoc2dfZW50cnlfY250ID4gQVNDX1NHX0xJU1RfUEVSX1EpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkcyA9ICh1Y2hhcikgKEFTQ19TR19MSVNUX1BFUl9RICogMik7Ci0gICAgICAgICAgICAgICAgIHNnX2VudHJ5X2NudCAtPSBBU0NfU0dfTElTVF9QRVJfUTsKLSAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICogQWZ0ZXIgdmVyeSBmaXJzdCBTRyBxdWV1ZSBSSVNDIEZXIHVzZXMgbmV4dAotICAgICAgICAgICAgICAgICAgKiBTRyBxdWV1ZSBmaXJzdCBlbGVtZW50IHRoZW4gY2hlY2tzIHNnX2xpc3RfY250Ci0gICAgICAgICAgICAgICAgICAqIGFnYWluc3QgemVybyBhbmQgdGhlbiBkZWNyZW1lbnRzLCBzbyBzZXQKLSAgICAgICAgICAgICAgICAgICogc2dfbGlzdF9jbnQgMSBsZXNzIHRoYW4gbnVtYmVyIG9mIFNHIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAqIGluIGVhY2ggU0cgcXVldWUuCi0gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPSBBU0NfU0dfTElTVF9QRVJfUSAtIDE7Ci0gICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19jdXJfbGlzdF9jbnQgPSBBU0NfU0dfTElTVF9QRVJfUSAtIDE7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgbGFzdCBTRyBxdWV1ZSBpbiB0aGUgbGlzdCBvZgotICAgICAgICAgICAgICAgICAgKiBhbGxvY2F0ZWQgU0cgcXVldWVzLiBJZiB0aGVyZSBhcmUgbW9yZQotICAgICAgICAgICAgICAgICAgKiBTRyBlbGVtZW50cyB0aGFuIHdpbGwgZml0IGluIHRoZSBhbGxvY2F0ZWQKLSAgICAgICAgICAgICAgICAgICogcXVldWVzLCB0aGVuIHNldCB0aGUgUUNTR19TR19YRkVSX01PUkUgZmxhZy4KLSAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIGlmIChzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCAhPSAwKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3EuY250bCB8PSBRQ1NHX1NHX1hGRVJfTU9SRTsKLSAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5jbnRsIHw9IFFDU0dfU0dfWEZFUl9FTkQ7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgLyogZXF1YWxzIHNnX2VudHJ5X2NudCAqIDIgKi8KLSAgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMgPSBzZ19lbnRyeV9jbnQgPDwgMTsKLSAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKLSAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IHNnX2VudHJ5X2NudCAtIDE7Ci0gICAgICAgICAgICAgICAgIHNnX2VudHJ5X2NudCA9IDA7Ci0gICAgICAgICAgICAgfQorCQkvKgorCQkgKiBDb3B5IFNHIGVsZW1lbnRzIGludG8gdGhlIGxpc3Qgb2YgYWxsb2NhdGVkIFNHIHF1ZXVlcy4KKwkJICoKKwkJICogTGFzdCBpbmRleCBjb21wbGV0ZWQgaXMgc2F2ZWQgaW4gc2NzaXEtPm5leHRfc2dfaW5kZXguCisJCSAqLworCQluZXh0X3FwID0gZmlyc3Rfc2dfd2tfcV9ubzsKKwkJcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihuZXh0X3FwKTsKKwkJc2NzaV9zZ19xLnNnX2hlYWRfcXAgPSBxX25vOworCQlzY3NpX3NnX3EuY250bCA9IFFDU0dfU0dfWEZFUl9MSVNUOworCQlmb3IgKGkgPSAwOyBpIDwgc2dfaGVhZC0+cXVldWVfY250OyBpKyspIHsKKwkJCXNjc2lfc2dfcS5zZXFfbm8gPSBpICsgMTsKKwkJCWlmIChzZ19lbnRyeV9jbnQgPiBBU0NfU0dfTElTVF9QRVJfUSkgeworCQkJCXNnX2xpc3RfZHdvcmRzID0gKHVjaGFyKShBU0NfU0dfTElTVF9QRVJfUSAqIDIpOworCQkJCXNnX2VudHJ5X2NudCAtPSBBU0NfU0dfTElTVF9QRVJfUTsKKwkJCQkvKgorCQkJCSAqIEFmdGVyIHZlcnkgZmlyc3QgU0cgcXVldWUgUklTQyBGVyB1c2VzIG5leHQKKwkJCQkgKiBTRyBxdWV1ZSBmaXJzdCBlbGVtZW50IHRoZW4gY2hlY2tzIHNnX2xpc3RfY250CisJCQkJICogYWdhaW5zdCB6ZXJvIGFuZCB0aGVuIGRlY3JlbWVudHMsIHNvIHNldAorCQkJCSAqIHNnX2xpc3RfY250IDEgbGVzcyB0aGFuIG51bWJlciBvZiBTRyBlbGVtZW50cworCQkJCSAqIGluIGVhY2ggU0cgcXVldWUuCisJCQkJICovCisJCQkJc2NzaV9zZ19xLnNnX2xpc3RfY250ID0gQVNDX1NHX0xJU1RfUEVSX1EgLSAxOworCQkJCXNjc2lfc2dfcS5zZ19jdXJfbGlzdF9jbnQgPQorCQkJCSAgICBBU0NfU0dfTElTVF9QRVJfUSAtIDE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgbGFzdCBTRyBxdWV1ZSBpbiB0aGUgbGlzdCBvZgorCQkJCSAqIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIElmIHRoZXJlIGFyZSBtb3JlCisJCQkJICogU0cgZWxlbWVudHMgdGhhbiB3aWxsIGZpdCBpbiB0aGUgYWxsb2NhdGVkCisJCQkJICogcXVldWVzLCB0aGVuIHNldCB0aGUgUUNTR19TR19YRkVSX01PUkUgZmxhZy4KKwkJCQkgKi8KKwkJCQlpZiAoc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgIT0gMCkgeworCQkJCQlzY3NpX3NnX3EuY250bCB8PSBRQ1NHX1NHX1hGRVJfTU9SRTsKKwkJCQl9IGVsc2UgeworCQkJCQlzY3NpX3NnX3EuY250bCB8PSBRQ1NHX1NHX1hGRVJfRU5EOworCQkJCX0KKwkJCQkvKiBlcXVhbHMgc2dfZW50cnlfY250ICogMiAqLworCQkJCXNnX2xpc3RfZHdvcmRzID0gc2dfZW50cnlfY250IDw8IDE7CisJCQkJc2NzaV9zZ19xLnNnX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKKwkJCQlzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gc2dfZW50cnlfY250IC0gMTsKKwkJCQlzZ19lbnRyeV9jbnQgPSAwOworCQkJfQogCi0gICAgICAgICAgICAgc2NzaV9zZ19xLnFfbm8gPSBuZXh0X3FwOwotICAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBxX2FkZHIgKyBBU0NfU0NTSVFfU0dIRF9DUFlfQkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJnNjc2lfc2dfcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFTQ19TR19MSVNUX1EpID4+IDEpOworCQkJc2NzaV9zZ19xLnFfbm8gPSBuZXh0X3FwOworCQkJQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisJCQkJCQlxX2FkZHIgKyBBU0NfU0NTSVFfU0dIRF9DUFlfQkVHLAorCQkJCQkJKHVjaGFyICopJnNjc2lfc2dfcSwKKwkJCQkJCXNpemVvZihBU0NfU0dfTElTVF9RKSA+PiAxKTsKIAotICAgICAgICAgICAgIEFzY01lbURXb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NHUV9MSVNUX0JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzZ19oZWFkLT5zZ19saXN0W3Njc2lxLT5uZXh0X3NnX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2dfbGlzdF9kd29yZHMpOworCQkJQXNjTWVtRFdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorCQkJCQkJIHFfYWRkciArIEFTQ19TR1FfTElTVF9CRUcsCisJCQkJCQkgKHVjaGFyICopJnNnX2hlYWQtPgorCQkJCQkJIHNnX2xpc3Rbc2NzaXEtPm5leHRfc2dfaW5kZXhdLAorCQkJCQkJIHNnX2xpc3RfZHdvcmRzKTsKIAotICAgICAgICAgICAgIHNjc2lxLT5uZXh0X3NnX2luZGV4ICs9IEFTQ19TR19MSVNUX1BFUl9ROworCQkJc2NzaXEtPm5leHRfc2dfaW5kZXggKz0gQVNDX1NHX0xJU1RfUEVSX1E7CiAKLSAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAqIElmIHRoZSBqdXN0IGNvbXBsZXRlZCBTRyBxdWV1ZSBjb250YWluZWQgdGhlCi0gICAgICAgICAgICAgICogbGFzdCBTRyBlbGVtZW50LCB0aGVuIG5vIG1vcmUgU0cgcXVldWVzIG5lZWQKLSAgICAgICAgICAgICAgKiB0byBiZSB3cml0dGVuLgotICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIGlmIChzY3NpX3NnX3EuY250bCAmIFFDU0dfU0dfWEZFUl9FTkQpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9CisJCQkvKgorCQkJICogSWYgdGhlIGp1c3QgY29tcGxldGVkIFNHIHF1ZXVlIGNvbnRhaW5lZCB0aGUKKwkJCSAqIGxhc3QgU0cgZWxlbWVudCwgdGhlbiBubyBtb3JlIFNHIHF1ZXVlcyBuZWVkCisJCQkgKiB0byBiZSB3cml0dGVuLgorCQkJICovCisJCQlpZiAoc2NzaV9zZ19xLmNudGwgJiBRQ1NHX1NHX1hGRVJfRU5EKSB7CisJCQkJYnJlYWs7CisJCQl9CiAKLSAgICAgICAgICAgICBuZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKCBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCB1c2hvcnQgKSggcV9hZGRyK0FTQ19TQ1NJUV9CX0ZXRCApICk7Ci0gICAgICAgICAgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUiggbmV4dF9xcCApOwotICAgICAgICB9CisJCQluZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorCQkJCQkJICAodXNob3J0KShxX2FkZHIgKworCQkJCQkJCSAgIEFTQ19TQ1NJUV9CX0ZXRCkpOworCQkJcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihuZXh0X3FwKTsKKwkJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENsZWFyIHRoZSBoYWx0IGNvbmRpdGlvbiBzbyB0aGUgUklTQyB3aWxsIGJlIHJlc3RhcnRlZAotICAgICAgICAgKiBhZnRlciB0aGUgcmV0dXJuLgotICAgICAgICAgKi8KLSAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgQVNDVl9IQUxUQ09ERV9XLCAwKTsKLSAgICAgICAgcmV0dXJuKDApOwotICAgIH0KKwkJLyoKKwkJICogQ2xlYXIgdGhlIGhhbHQgY29uZGl0aW9uIHNvIHRoZSBSSVNDIHdpbGwgYmUgcmVzdGFydGVkCisJCSAqIGFmdGVyIHRoZSByZXR1cm4uCisJCSAqLworCQlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBBU0NWX0hBTFRDT0RFX1csIDApOworCQlyZXR1cm4gKDApOworCX0KICNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLwotICAgIHJldHVybiAoMCk7CisJcmV0dXJuICgwKTsKIH0KIAotU1RBVElDIHVjaGFyCi1fQXNjQ29weUxyYW1TY3NpRG9uZVEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHFfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfUURPTkVfSU5GTyAqIHNjc2lxLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EQ05UIG1heF9kbWFfY291bnQKLSkKK3N0YXRpYyB1Y2hhcgorX0FzY0NvcHlMcmFtU2NzaURvbmVRKFBvcnRBZGRyIGlvcF9iYXNlLAorCQkgICAgICB1c2hvcnQgcV9hZGRyLAorCQkgICAgICBBU0NfUURPTkVfSU5GTyAqc2NzaXEsIEFTQ19EQ05UIG1heF9kbWFfY291bnQpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBfdmFsOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2dfcXVldWVfY250OworCXVzaG9ydCBfdmFsOworCXVjaGFyIHNnX3F1ZXVlX2NudDsKIAotICAgIER2Y0dldFFpbmZvKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgIHFfYWRkciArIEFTQ19TQ1NJUV9ET05FX0lORk9fQkVHLAotICAgICAgICAgICAgICAgICh1Y2hhciAqKSBzY3NpcSwKLSAgICAgICAgICAgICAgICAoc2l6ZW9mIChBU0NfU0NTSVFfMikgKyBzaXplb2YgKEFTQ19TQ1NJUV8zKSkgLyAyKTsKKwlEdmNHZXRRaW5mbyhpb3BfYmFzZSwKKwkJICAgIHFfYWRkciArIEFTQ19TQ1NJUV9ET05FX0lORk9fQkVHLAorCQkgICAgKHVjaGFyICopc2NzaXEsCisJCSAgICAoc2l6ZW9mKEFTQ19TQ1NJUV8yKSArIHNpemVvZihBU0NfU0NTSVFfMykpIC8gMik7CiAKLSAgICBfdmFsID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NUQVRVUykpOwotICAgIHNjc2lxLT5xX3N0YXR1cyA9ICh1Y2hhcikgX3ZhbDsKLSAgICBzY3NpcS0+cV9ubyA9ICh1Y2hhcikgKF92YWwgPj4gOCk7Ci0gICAgX3ZhbCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9DTlRMKSk7Ci0gICAgc2NzaXEtPmNudGwgPSAodWNoYXIpIF92YWw7Ci0gICAgc2dfcXVldWVfY250ID0gKHVjaGFyKSAoX3ZhbCA+PiA4KTsKLSAgICBfdmFsID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NFTlNFX0xFTikpOwotICAgIHNjc2lxLT5zZW5zZV9sZW4gPSAodWNoYXIpIF92YWw7Ci0gICAgc2NzaXEtPmV4dHJhX2J5dGVzID0gKHVjaGFyKSAoX3ZhbCA+PiA4KTsKKwlfdmFsID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAorCQkJICAgICAgICh1c2hvcnQpKHFfYWRkciArICh1c2hvcnQpQVNDX1NDU0lRX0JfU1RBVFVTKSk7CisJc2NzaXEtPnFfc3RhdHVzID0gKHVjaGFyKV92YWw7CisJc2NzaXEtPnFfbm8gPSAodWNoYXIpKF92YWwgPj4gOCk7CisJX3ZhbCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwKKwkJCSAgICAgICAodXNob3J0KShxX2FkZHIgKyAodXNob3J0KUFTQ19TQ1NJUV9CX0NOVEwpKTsKKwlzY3NpcS0+Y250bCA9ICh1Y2hhcilfdmFsOworCXNnX3F1ZXVlX2NudCA9ICh1Y2hhcikoX3ZhbCA+PiA4KTsKKwlfdmFsID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAorCQkJICAgICAgICh1c2hvcnQpKHFfYWRkciArCisJCQkJCSh1c2hvcnQpQVNDX1NDU0lRX0JfU0VOU0VfTEVOKSk7CisJc2NzaXEtPnNlbnNlX2xlbiA9ICh1Y2hhcilfdmFsOworCXNjc2lxLT5leHRyYV9ieXRlcyA9ICh1Y2hhcikoX3ZhbCA+PiA4KTsKIAotICAgIC8qCi0gICAgICogUmVhZCBoaWdoIHdvcmQgb2YgcmVtYWluIGJ5dGVzIGZyb20gYWx0ZXJuYXRlIGxvY2F0aW9uLgotICAgICAqLwotICAgIHNjc2lxLT5yZW1haW5fYnl0ZXMgPSAoKChBRFZfRENOVCkgQXNjUmVhZExyYW1Xb3JkKCBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAocV9hZGRyKyAodXNob3J0KSBBU0NfU0NTSVFfV19BTFRfREMxKSkpIDw8IDE2KTsKLSAgICAvKgotICAgICAqIFJlYWQgbG93IHdvcmQgb2YgcmVtYWluIGJ5dGVzIGZyb20gb3JpZ2luYWwgbG9jYXRpb24uCi0gICAgICovCi0gICAgc2NzaXEtPnJlbWFpbl9ieXRlcyArPSBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsCi0gICAgICAgICh1c2hvcnQpIChxX2FkZHIrICh1c2hvcnQpIEFTQ19TQ1NJUV9EV19SRU1BSU5fWEZFUl9DTlQpKTsKKwkvKgorCSAqIFJlYWQgaGlnaCB3b3JkIG9mIHJlbWFpbiBieXRlcyBmcm9tIGFsdGVybmF0ZSBsb2NhdGlvbi4KKwkgKi8KKwlzY3NpcS0+cmVtYWluX2J5dGVzID0gKCgoQURWX0RDTlQpQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLAorCQkJCQkJCSAgKHVzaG9ydCkocV9hZGRyICsKKwkJCQkJCQkJICAgKHVzaG9ydCkKKwkJCQkJCQkJICAgQVNDX1NDU0lRX1dfQUxUX0RDMSkpKQorCQkJICAgICAgIDw8IDE2KTsKKwkvKgorCSAqIFJlYWQgbG93IHdvcmQgb2YgcmVtYWluIGJ5dGVzIGZyb20gb3JpZ2luYWwgbG9jYXRpb24uCisJICovCisJc2NzaXEtPnJlbWFpbl9ieXRlcyArPSBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsCisJCQkJCSAgICAgICAodXNob3J0KShxX2FkZHIgKyAodXNob3J0KQorCQkJCQkJCUFTQ19TQ1NJUV9EV19SRU1BSU5fWEZFUl9DTlQpKTsKIAotICAgIHNjc2lxLT5yZW1haW5fYnl0ZXMgJj0gbWF4X2RtYV9jb3VudDsKLSAgICByZXR1cm4gKHNnX3F1ZXVlX2NudCk7CisJc2NzaXEtPnJlbWFpbl9ieXRlcyAmPSBtYXhfZG1hX2NvdW50OworCXJldHVybiAoc2dfcXVldWVfY250KTsKIH0KIAotU1RBVElDIGludAotQXNjSXNyUURvbmUoCi0gICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YwotKQorc3RhdGljIGludCBBc2NJc3JRRG9uZShBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIG5leHRfcXA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBuX3FfdXNlZDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNnX2xpc3RfcXA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzZ19xdWV1ZV9jbnQ7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBxX2NudDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGRvbmVfcV90YWlsOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHNjc2lfYnVzeTsKLSAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSB0YXJnZXRfaWQ7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHFfYWRkcjsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX3FfYWRkcjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGN1cl90YXJnZXRfcW5nOwotICAgIEFTQ19RRE9ORV9JTkZPICAgICAgc2NzaXFfYnVmOwotICAgIEFTQ19RRE9ORV9JTkZPICpzY3NpcTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGZhbHNlX292ZXJydW47Ci0gICAgQVNDX0lTUl9DQUxMQkFDSyAgICBhc2NfaXNyX2NhbGxiYWNrOworCXVjaGFyIG5leHRfcXA7CisJdWNoYXIgbl9xX3VzZWQ7CisJdWNoYXIgc2dfbGlzdF9xcDsKKwl1Y2hhciBzZ19xdWV1ZV9jbnQ7CisJdWNoYXIgcV9jbnQ7CisJdWNoYXIgZG9uZV9xX3RhaWw7CisJdWNoYXIgdGlkX25vOworCUFTQ19TQ1NJX0JJVF9JRF9UWVBFIHNjc2lfYnVzeTsKKwlBU0NfU0NTSV9CSVRfSURfVFlQRSB0YXJnZXRfaWQ7CisJUG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IHFfYWRkcjsKKwl1c2hvcnQgc2dfcV9hZGRyOworCXVjaGFyIGN1cl90YXJnZXRfcW5nOworCUFTQ19RRE9ORV9JTkZPIHNjc2lxX2J1ZjsKKwlBU0NfUURPTkVfSU5GTyAqc2NzaXE7CisJaW50IGZhbHNlX292ZXJydW47CisJQVNDX0lTUl9DQUxMQkFDSyBhc2NfaXNyX2NhbGxiYWNrOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICBhc2NfaXNyX2NhbGxiYWNrID0gYXNjX2R2Yy0+aXNyX2NhbGxiYWNrOwotICAgIG5fcV91c2VkID0gMTsKLSAgICBzY3NpcSA9IChBU0NfUURPTkVfSU5GTyAqKSAmIHNjc2lxX2J1ZjsKLSAgICBkb25lX3FfdGFpbCA9ICh1Y2hhcikgQXNjR2V0VmFyRG9uZVFUYWlsKGlvcF9iYXNlKTsKLSAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKGRvbmVfcV90YWlsKTsKLSAgICBuZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0ZXRCkpOwotICAgIGlmIChuZXh0X3FwICE9IEFTQ19RTElOS19FTkQpIHsKLSAgICAgICAgQXNjUHV0VmFyRG9uZVFUYWlsKGlvcF9iYXNlLCBuZXh0X3FwKTsKLSAgICAgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihuZXh0X3FwKTsKLSAgICAgICAgc2dfcXVldWVfY250ID0gX0FzY0NvcHlMcmFtU2NzaURvbmVRKGlvcF9iYXNlLCBxX2FkZHIsIHNjc2lxLAotICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2RtYV9jb3VudCk7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX1NUQVRVUyksCi0gICAgICAgICAgICAgKHVjaGFyKSAoc2NzaXEtPnFfc3RhdHVzICYgKHVjaGFyKSB+IChRU19SRUFEWSB8IFFTX0FCT1JURUQpKSk7Ci0gICAgICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHNjc2lxLT5kMi50YXJnZXRfaXgpOwotICAgICAgICB0YXJnZXRfaWQgPSBBU0NfVElYX1RPX1RBUkdFVF9JRChzY3NpcS0+ZDIudGFyZ2V0X2l4KTsKLSAgICAgICAgaWYgKChzY3NpcS0+Y250bCAmIFFDX1NHX0hFQUQpICE9IDApIHsKLSAgICAgICAgICAgIHNnX3FfYWRkciA9IHFfYWRkcjsKLSAgICAgICAgICAgIHNnX2xpc3RfcXAgPSBuZXh0X3FwOwotICAgICAgICAgICAgZm9yIChxX2NudCA9IDA7IHFfY250IDwgc2dfcXVldWVfY250OyBxX2NudCsrKSB7Ci0gICAgICAgICAgICAgICAgc2dfbGlzdF9xcCA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChzZ19xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9GV0QpKTsKLSAgICAgICAgICAgICAgICBzZ19xX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHNnX2xpc3RfcXApOwotICAgICAgICAgICAgICAgIGlmIChzZ19saXN0X3FwID09IEFTQ19RTElOS19FTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX1NHX1FfTElOS1MpOwotICAgICAgICAgICAgICAgICAgICBzY3NpcS0+ZDMuZG9uZV9zdGF0ID0gUURfV0lUSF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmhvc3Rfc3RhdCA9IFFIU1RBX0RfUURPTkVfU0dfTElTVF9DT1JSVVBURUQ7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gRkFUQUxfRVJSX1FET05FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChzZ19xX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNfRlJFRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuX3FfdXNlZCA9IHNnX3F1ZXVlX2NudCArIDE7Ci0gICAgICAgICAgICBBc2NQdXRWYXJEb25lUVRhaWwoaW9wX2Jhc2UsIHNnX2xpc3RfcXApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhc2NfZHZjLT5xdWV1ZV9mdWxsX29yX2J1c3kgJiB0YXJnZXRfaWQpIHsKLSAgICAgICAgICAgIGN1cl90YXJnZXRfcW5nID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgKHVzaG9ydCkgKCh1c2hvcnQpIEFTQ19RQURSX0JFRyArICh1c2hvcnQpIHNjc2lxLT5kMi50YXJnZXRfaXgpKTsKLSAgICAgICAgICAgIGlmIChjdXJfdGFyZ2V0X3FuZyA8IGFzY19kdmMtPm1heF9kdmNfcW5nW3RpZF9ub10pIHsKLSAgICAgICAgICAgICAgICBzY3NpX2J1c3kgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQik7Ci0gICAgICAgICAgICAgICAgc2NzaV9idXN5ICY9IH50YXJnZXRfaWQ7Ci0gICAgICAgICAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIEFTQ1ZfU0NTSUJVU1lfQiwgc2NzaV9idXN5KTsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5xdWV1ZV9mdWxsX29yX2J1c3kgJj0gfnRhcmdldF9pZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyA+PSBuX3FfdXNlZCkgewotICAgICAgICAgICAgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyAtPSBuX3FfdXNlZDsKLSAgICAgICAgICAgIGlmIChhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dICE9IDApIHsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfQ1VSX1FORyk7Ci0gICAgICAgICAgICBzY3NpcS0+ZDMuZG9uZV9zdGF0ID0gUURfV0lUSF9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gRkFUQUxfRVJSX1FET05FOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc2NzaXEtPmQyLnNyYl9wdHIgPT0gMFVMKSB8fAotICAgICAgICAgICAgKChzY3NpcS0+cV9zdGF0dXMgJiBRU19BQk9SVEVEKSAhPSAwKSkgewotICAgICAgICAgICAgcmV0dXJuICgweDExKTsKLSAgICAgICAgfSBlbHNlIGlmIChzY3NpcS0+cV9zdGF0dXMgPT0gUVNfRE9ORSkgewotICAgICAgICAgICAgZmFsc2Vfb3ZlcnJ1biA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHNjc2lxLT5leHRyYV9ieXRlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc2NzaXEtPnJlbWFpbl9ieXRlcyArPSAoQURWX0RDTlQpIHNjc2lxLT5leHRyYV9ieXRlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzY3NpcS0+ZDMuZG9uZV9zdGF0ID09IFFEX1dJVEhfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2NzaXEtPmQzLmhvc3Rfc3RhdCA9PSBRSFNUQV9NX0RBVEFfT1ZFUl9SVU4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzY3NpcS0+Y250bCAmIChRQ19EQVRBX0lOIHwgUUNfREFUQV9PVVQpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+ZDMuZG9uZV9zdGF0ID0gUURfTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+ZDMuaG9zdF9zdGF0ID0gUUhTVEFfTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFsc2Vfb3ZlcnJ1bikgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX05PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPmQzLmhvc3Rfc3RhdCA9IFFIU1RBX05PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY3NpcS0+ZDMuaG9zdF9zdGF0ID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBRSFNUQV9NX0hVTkdfUkVRX1NDU0lfQlVTX1JFU0VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzY1N0b3BDaGlwKGlvcF9iYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChDQ19TQ1NJX1JFU0VUIHwgQ0NfSEFMVCkpOwotICAgICAgICAgICAgICAgICAgICBEdmNEZWxheU5hbm9TZWNvbmQoYXNjX2R2YywgNjAwMDApOwotICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfSEFMVCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19DTFJfU0NTSV9SRVNFVF9JTlQpOwotICAgICAgICAgICAgICAgICAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc2NzaXEtPmNudGwgJiBRQ19OT19DQUxMQkFDSykgPT0gMCkgewotICAgICAgICAgICAgICAgICgqYXNjX2lzcl9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQ0RCX0JFRykpID09Ci0gICAgICAgICAgICAgICAgICAgICBTVEFSVF9TVE9QKSkgewotICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT51bml0X25vdF9yZWFkeSAmPSB+dGFyZ2V0X2lkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NzaXEtPmQzLmRvbmVfc3RhdCAhPSBRRF9OT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+c3RhcnRfbW90b3IgJj0gfnRhcmdldF9pZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfUV9TVEFUVVMpOwotICAgICAgICAgIEZBVEFMX0VSUl9RRE9ORToKLSAgICAgICAgICAgIGlmICgoc2NzaXEtPmNudGwgJiBRQ19OT19DQUxMQkFDSykgPT0gMCkgewotICAgICAgICAgICAgICAgICgqYXNjX2lzcl9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoMHg4MCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCWFzY19pc3JfY2FsbGJhY2sgPSBhc2NfZHZjLT5pc3JfY2FsbGJhY2s7CisJbl9xX3VzZWQgPSAxOworCXNjc2lxID0gKEFTQ19RRE9ORV9JTkZPICopJnNjc2lxX2J1ZjsKKwlkb25lX3FfdGFpbCA9ICh1Y2hhcilBc2NHZXRWYXJEb25lUVRhaWwoaW9wX2Jhc2UpOworCXFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIoZG9uZV9xX3RhaWwpOworCW5leHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJICAodXNob3J0KShxX2FkZHIgKyAodXNob3J0KUFTQ19TQ1NJUV9CX0ZXRCkpOworCWlmIChuZXh0X3FwICE9IEFTQ19RTElOS19FTkQpIHsKKwkJQXNjUHV0VmFyRG9uZVFUYWlsKGlvcF9iYXNlLCBuZXh0X3FwKTsKKwkJcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihuZXh0X3FwKTsKKwkJc2dfcXVldWVfY250ID0gX0FzY0NvcHlMcmFtU2NzaURvbmVRKGlvcF9iYXNlLCBxX2FkZHIsIHNjc2lxLAorCQkJCQkJICAgICBhc2NfZHZjLT5tYXhfZG1hX2NvdW50KTsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgKHVzaG9ydCkocV9hZGRyICsKKwkJCQkJICAodXNob3J0KUFTQ19TQ1NJUV9CX1NUQVRVUyksCisJCQkJICh1Y2hhcikoc2NzaXEtPgorCQkJCQkgcV9zdGF0dXMgJiAodWNoYXIpfihRU19SRUFEWSB8CisJCQkJCQkJICAgICBRU19BQk9SVEVEKSkpOworCQl0aWRfbm8gPSBBU0NfVElYX1RPX1RJRChzY3NpcS0+ZDIudGFyZ2V0X2l4KTsKKwkJdGFyZ2V0X2lkID0gQVNDX1RJWF9UT19UQVJHRVRfSUQoc2NzaXEtPmQyLnRhcmdldF9peCk7CisJCWlmICgoc2NzaXEtPmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7CisJCQlzZ19xX2FkZHIgPSBxX2FkZHI7CisJCQlzZ19saXN0X3FwID0gbmV4dF9xcDsKKwkJCWZvciAocV9jbnQgPSAwOyBxX2NudCA8IHNnX3F1ZXVlX2NudDsgcV9jbnQrKykgeworCQkJCXNnX2xpc3RfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJCQkJICAgICAodXNob3J0KShzZ19xX2FkZHIKKwkJCQkJCQkJICAgICAgKyAodXNob3J0KQorCQkJCQkJCQkgICAgICBBU0NfU0NTSVFfQl9GV0QpKTsKKwkJCQlzZ19xX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHNnX2xpc3RfcXApOworCQkJCWlmIChzZ19saXN0X3FwID09IEFTQ19RTElOS19FTkQpIHsKKwkJCQkJQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsCisJCQkJCQkJICAgQVNDUV9FUlJfU0dfUV9MSU5LUyk7CisJCQkJCXNjc2lxLT5kMy5kb25lX3N0YXQgPSBRRF9XSVRIX0VSUk9SOworCQkJCQlzY3NpcS0+ZDMuaG9zdF9zdGF0ID0KKwkJCQkJICAgIFFIU1RBX0RfUURPTkVfU0dfTElTVF9DT1JSVVBURUQ7CisJCQkJCWdvdG8gRkFUQUxfRVJSX1FET05FOworCQkJCX0KKwkJCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorCQkJCQkJICh1c2hvcnQpKHNnX3FfYWRkciArICh1c2hvcnQpCisJCQkJCQkJICBBU0NfU0NTSVFfQl9TVEFUVVMpLAorCQkJCQkJIFFTX0ZSRUUpOworCQkJfQorCQkJbl9xX3VzZWQgPSBzZ19xdWV1ZV9jbnQgKyAxOworCQkJQXNjUHV0VmFyRG9uZVFUYWlsKGlvcF9iYXNlLCBzZ19saXN0X3FwKTsKKwkJfQorCQlpZiAoYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICYgdGFyZ2V0X2lkKSB7CisJCQljdXJfdGFyZ2V0X3FuZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkJCQkgKHVzaG9ydCkoKHVzaG9ydCkKKwkJCQkJCQkJICBBU0NfUUFEUl9CRUcKKwkJCQkJCQkJICArICh1c2hvcnQpCisJCQkJCQkJCSAgc2NzaXEtPmQyLgorCQkJCQkJCQkgIHRhcmdldF9peCkpOworCQkJaWYgKGN1cl90YXJnZXRfcW5nIDwgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSkgeworCQkJCXNjc2lfYnVzeSA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkKKwkJCQkJCQkgICAgQVNDVl9TQ1NJQlVTWV9CKTsKKwkJCQlzY3NpX2J1c3kgJj0gfnRhcmdldF9pZDsKKwkJCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAorCQkJCQkJICh1c2hvcnQpQVNDVl9TQ1NJQlVTWV9CLAorCQkJCQkJIHNjc2lfYnVzeSk7CisJCQkJYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICY9IH50YXJnZXRfaWQ7CisJCQl9CisJCX0KKwkJaWYgKGFzY19kdmMtPmN1cl90b3RhbF9xbmcgPj0gbl9xX3VzZWQpIHsKKwkJCWFzY19kdmMtPmN1cl90b3RhbF9xbmcgLT0gbl9xX3VzZWQ7CisJCQlpZiAoYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSAhPSAwKSB7CisJCQkJYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXS0tOworCQkJfQorCQl9IGVsc2UgeworCQkJQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0NVUl9RTkcpOworCQkJc2NzaXEtPmQzLmRvbmVfc3RhdCA9IFFEX1dJVEhfRVJST1I7CisJCQlnb3RvIEZBVEFMX0VSUl9RRE9ORTsKKwkJfQorCQlpZiAoKHNjc2lxLT5kMi5zcmJfcHRyID09IDBVTCkgfHwKKwkJICAgICgoc2NzaXEtPnFfc3RhdHVzICYgUVNfQUJPUlRFRCkgIT0gMCkpIHsKKwkJCXJldHVybiAoMHgxMSk7CisJCX0gZWxzZSBpZiAoc2NzaXEtPnFfc3RhdHVzID09IFFTX0RPTkUpIHsKKwkJCWZhbHNlX292ZXJydW4gPSBGQUxTRTsKKwkJCWlmIChzY3NpcS0+ZXh0cmFfYnl0ZXMgIT0gMCkgeworCQkJCXNjc2lxLT5yZW1haW5fYnl0ZXMgKz0KKwkJCQkgICAgKEFEVl9EQ05UKXNjc2lxLT5leHRyYV9ieXRlczsKKwkJCX0KKwkJCWlmIChzY3NpcS0+ZDMuZG9uZV9zdGF0ID09IFFEX1dJVEhfRVJST1IpIHsKKwkJCQlpZiAoc2NzaXEtPmQzLmhvc3Rfc3RhdCA9PQorCQkJCSAgICBRSFNUQV9NX0RBVEFfT1ZFUl9SVU4pIHsKKwkJCQkJaWYgKChzY3NpcS0+CisJCQkJCSAgICAgY250bCAmIChRQ19EQVRBX0lOIHwgUUNfREFUQV9PVVQpKQorCQkJCQkgICAgPT0gMCkgeworCQkJCQkJc2NzaXEtPmQzLmRvbmVfc3RhdCA9CisJCQkJCQkgICAgUURfTk9fRVJST1I7CisJCQkJCQlzY3NpcS0+ZDMuaG9zdF9zdGF0ID0KKwkJCQkJCSAgICBRSFNUQV9OT19FUlJPUjsKKwkJCQkJfSBlbHNlIGlmIChmYWxzZV9vdmVycnVuKSB7CisJCQkJCQlzY3NpcS0+ZDMuZG9uZV9zdGF0ID0KKwkJCQkJCSAgICBRRF9OT19FUlJPUjsKKwkJCQkJCXNjc2lxLT5kMy5ob3N0X3N0YXQgPQorCQkJCQkJICAgIFFIU1RBX05PX0VSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChzY3NpcS0+ZDMuaG9zdF9zdGF0ID09CisJCQkJCSAgIFFIU1RBX01fSFVOR19SRVFfU0NTSV9CVVNfUkVTRVQpIHsKKwkJCQkJQXNjU3RvcENoaXAoaW9wX2Jhc2UpOworCQkJCQlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwKKwkJCQkJCQkgICh1Y2hhcikoQ0NfU0NTSV9SRVNFVAorCQkJCQkJCQkgIHwgQ0NfSEFMVCkpOworCQkJCQlEdmNEZWxheU5hbm9TZWNvbmQoYXNjX2R2YywgNjAwMDApOworCQkJCQlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfSEFMVCk7CisJCQkJCUFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsCisJCQkJCQkJIENJV19DTFJfU0NTSV9SRVNFVF9JTlQpOworCQkJCQlBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKKwkJCQkJQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIDApOworCQkJCX0KKwkJCX0KKwkJCWlmICgoc2NzaXEtPmNudGwgJiBRQ19OT19DQUxMQkFDSykgPT0gMCkgeworCQkJCSgqYXNjX2lzcl9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJCQkgICAgICh1c2hvcnQpKHFfYWRkciArICh1c2hvcnQpCisJCQkJCQkJICAgICAgQVNDX1NDU0lRX0NEQl9CRUcpKQorCQkJCSAgICAgPT0gU1RBUlRfU1RPUCkpIHsKKwkJCQkJYXNjX2R2Yy0+dW5pdF9ub3RfcmVhZHkgJj0gfnRhcmdldF9pZDsKKwkJCQkJaWYgKHNjc2lxLT5kMy5kb25lX3N0YXQgIT0gUURfTk9fRVJST1IpIHsKKwkJCQkJCWFzY19kdmMtPnN0YXJ0X21vdG9yICY9CisJCQkJCQkgICAgfnRhcmdldF9pZDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiAoMSk7CisJCX0gZWxzZSB7CisJCQlBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfUV9TVEFUVVMpOworIEZBVEFMX0VSUl9RRE9ORToKKwkJCWlmICgoc2NzaXEtPmNudGwgJiBRQ19OT19DQUxMQkFDSykgPT0gMCkgeworCQkJCSgqYXNjX2lzcl9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKKwkJCX0KKwkJCXJldHVybiAoMHg4MCk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKIH0KIAotU1RBVElDIGludAotQXNjSVNSKAotICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCi0pCitzdGF0aWMgaW50IEFzY0lTUihBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBBU0NfQ1NfVFlQRSAgICAgICAgIGNoaXBzdGF0OwotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBzYXZlZF9yYW1fYWRkcjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGN0cmxfcmVnOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2F2ZWRfY3RybF9yZWc7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpbnRfcGVuZGluZzsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGhvc3RfZmxhZzsKKwlBU0NfQ1NfVFlQRSBjaGlwc3RhdDsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwl1c2hvcnQgc2F2ZWRfcmFtX2FkZHI7CisJdWNoYXIgY3RybF9yZWc7CisJdWNoYXIgc2F2ZWRfY3RybF9yZWc7CisJaW50IGludF9wZW5kaW5nOworCWludCBzdGF0dXM7CisJdWNoYXIgaG9zdF9mbGFnOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICBpbnRfcGVuZGluZyA9IEZBTFNFOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJaW50X3BlbmRpbmcgPSBGQUxTRTsKIAotICAgIGlmIChBc2NJc0ludFBlbmRpbmcoaW9wX2Jhc2UpID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gaW50X3BlbmRpbmc7Ci0gICAgfQorCWlmIChBc2NJc0ludFBlbmRpbmcoaW9wX2Jhc2UpID09IDApIHsKKwkJcmV0dXJuIGludF9wZW5kaW5nOworCX0KIAotICAgIGlmICgoKGFzY19kdmMtPmluaXRfc3RhdGUgJiBBU0NfSU5JVF9TVEFURV9FTkRfTE9BRF9NQykgPT0gMCkKLSAgICAgICAgfHwgKGFzY19kdmMtPmlzcl9jYWxsYmFjayA9PSAwKQotKSB7Ci0gICAgICAgIHJldHVybiAoRVJSKTsKLSAgICB9Ci0gICAgaWYgKGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCAhPSAwKSB7Ci0gICAgICAgIEFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9JU1JfT05fQ1JJVElDQUwpOwotICAgICAgICByZXR1cm4gKEVSUik7Ci0gICAgfQotICAgIGlmIChhc2NfZHZjLT5pc19pbl9pbnQpIHsKLSAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0lTUl9SRV9FTlRSWSk7Ci0gICAgICAgIHJldHVybiAoRVJSKTsKLSAgICB9Ci0gICAgYXNjX2R2Yy0+aXNfaW5faW50ID0gVFJVRTsKLSAgICBjdHJsX3JlZyA9IEFzY0dldENoaXBDb250cm9sKGlvcF9iYXNlKTsKLSAgICBzYXZlZF9jdHJsX3JlZyA9IGN0cmxfcmVnICYgKH4oQ0NfU0NTSV9SRVNFVCB8IENDX0NISVBfUkVTRVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ19TSU5HTEVfU1RFUCB8IENDX0RJQUcgfCBDQ19URVNUKSk7Ci0gICAgY2hpcHN0YXQgPSBBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKTsKLSAgICBpZiAoY2hpcHN0YXQgJiBDU1dfU0NTSV9SRVNFVF9MQVRDSCkgewotICAgICAgICBpZiAoIShhc2NfZHZjLT5idXNfdHlwZSAmIChBU0NfSVNfVkwgfCBBU0NfSVNfRUlTQSkpKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDEwOwotICAgICAgICAgICAgaW50X3BlbmRpbmcgPSBUUlVFOwotICAgICAgICAgICAgYXNjX2R2Yy0+c2R0cl9kb25lID0gMDsKLSAgICAgICAgICAgIHNhdmVkX2N0cmxfcmVnICY9ICh1Y2hhcikgKH5DQ19IQUxUKTsKLSAgICAgICAgICAgIHdoaWxlICgoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfU0NTSV9SRVNFVF9BQ1RJVkUpICYmCi0gICAgICAgICAgICAgICAgICAgKGktLSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIChDQ19DSElQX1JFU0VUIHwgQ0NfSEFMVCkpOwotICAgICAgICAgICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIENDX0hBTFQpOwotICAgICAgICAgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0NMUl9TQ1NJX1JFU0VUX0lOVCk7Ci0gICAgICAgICAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKLSAgICAgICAgICAgIGNoaXBzdGF0ID0gQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc2F2ZWRfcmFtX2FkZHIgPSBBc2NHZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UpOwotICAgIGhvc3RfZmxhZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgQVNDVl9IT1NUX0ZMQUdfQikgJiAodWNoYXIpICh+QVNDX0hPU1RfRkxBR19JTl9JU1IpOwotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfSE9TVF9GTEFHX0IsCi0gICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChob3N0X2ZsYWcgfCAodWNoYXIpIEFTQ19IT1NUX0ZMQUdfSU5fSVNSKSk7Ci0gICAgaWYgKChjaGlwc3RhdCAmIENTV19JTlRfUEVORElORykKLSAgICAgICAgfHwgKGludF9wZW5kaW5nKQotKSB7Ci0gICAgICAgIEFzY0Fja0ludGVycnVwdChpb3BfYmFzZSk7Ci0gICAgICAgIGludF9wZW5kaW5nID0gVFJVRTsKLSAgICAgICAgaWYgKChjaGlwc3RhdCAmIENTV19IQUxURUQpICYmCi0gICAgICAgICAgICAoY3RybF9yZWcgJiBDQ19TSU5HTEVfU1RFUCkpIHsKLSAgICAgICAgICAgIGlmIChBc2NJc3JDaGlwSGFsdGVkKGFzY19kdmMpID09IEVSUikgewotICAgICAgICAgICAgICAgIGdvdG8gSVNSX1JFUE9SVF9RRE9ORV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2F2ZWRfY3RybF9yZWcgJj0gKHVjaGFyKSAofkNDX0hBTFQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIElTUl9SRVBPUlRfUURPTkVfRkFUQUxfRVJST1I6Ci0gICAgICAgICAgICBpZiAoKGFzY19kdmMtPmR2Y19jbnRsICYgQVNDX0NOVExfSU5UX01VTFRJX1EpICE9IDApIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKChzdGF0dXMgPSBBc2NJc3JRRG9uZShhc2NfZHZjKSkgJiAweDAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gQXNjSXNyUURvbmUoYXNjX2R2YykpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IDB4MTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdGF0dXMgJiAweDgwKSAhPSAwKQotICAgICAgICAgICAgICAgIGludF9wZW5kaW5nID0gRVJSOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfSE9TVF9GTEFHX0IsIGhvc3RfZmxhZyk7Ci0gICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzYXZlZF9yYW1fYWRkcik7Ci0gICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIHNhdmVkX2N0cmxfcmVnKTsKLSAgICBhc2NfZHZjLT5pc19pbl9pbnQgPSBGQUxTRTsKLSAgICByZXR1cm4gKGludF9wZW5kaW5nKTsKKwlpZiAoKChhc2NfZHZjLT5pbml0X3N0YXRlICYgQVNDX0lOSVRfU1RBVEVfRU5EX0xPQURfTUMpID09IDApCisJICAgIHx8IChhc2NfZHZjLT5pc3JfY2FsbGJhY2sgPT0gMCkKKwkgICAgKSB7CisJCXJldHVybiAoRVJSKTsKKwl9CisJaWYgKGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCAhPSAwKSB7CisJCUFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9JU1JfT05fQ1JJVElDQUwpOworCQlyZXR1cm4gKEVSUik7CisJfQorCWlmIChhc2NfZHZjLT5pc19pbl9pbnQpIHsKKwkJQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0lTUl9SRV9FTlRSWSk7CisJCXJldHVybiAoRVJSKTsKKwl9CisJYXNjX2R2Yy0+aXNfaW5faW50ID0gVFJVRTsKKwljdHJsX3JlZyA9IEFzY0dldENoaXBDb250cm9sKGlvcF9iYXNlKTsKKwlzYXZlZF9jdHJsX3JlZyA9IGN0cmxfcmVnICYgKH4oQ0NfU0NTSV9SRVNFVCB8IENDX0NISVBfUkVTRVQgfAorCQkJCSAgICAgICBDQ19TSU5HTEVfU1RFUCB8IENDX0RJQUcgfCBDQ19URVNUKSk7CisJY2hpcHN0YXQgPSBBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKTsKKwlpZiAoY2hpcHN0YXQgJiBDU1dfU0NTSV9SRVNFVF9MQVRDSCkgeworCQlpZiAoIShhc2NfZHZjLT5idXNfdHlwZSAmIChBU0NfSVNfVkwgfCBBU0NfSVNfRUlTQSkpKSB7CisJCQlpbnQgaSA9IDEwOworCQkJaW50X3BlbmRpbmcgPSBUUlVFOworCQkJYXNjX2R2Yy0+c2R0cl9kb25lID0gMDsKKwkJCXNhdmVkX2N0cmxfcmVnICY9ICh1Y2hhcikofkNDX0hBTFQpOworCQkJd2hpbGUgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmCisJCQkJQ1NXX1NDU0lfUkVTRVRfQUNUSVZFKSAmJiAoaS0tID4gMCkpIHsKKwkJCQlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7CisJCQl9CisJCQlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgKENDX0NISVBfUkVTRVQgfCBDQ19IQUxUKSk7CisJCQlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfSEFMVCk7CisJCQlBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfQ0xSX1NDU0lfUkVTRVRfSU5UKTsKKwkJCUFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIDApOworCQkJY2hpcHN0YXQgPSBBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKTsKKwkJfQorCX0KKwlzYXZlZF9yYW1fYWRkciA9IEFzY0dldENoaXBMcmFtQWRkcihpb3BfYmFzZSk7CisJaG9zdF9mbGFnID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorCQkJCSAgICBBU0NWX0hPU1RfRkxBR19CKSAmCisJICAgICh1Y2hhcikofkFTQ19IT1NUX0ZMQUdfSU5fSVNSKTsKKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLAorCQkJICh1Y2hhcikoaG9zdF9mbGFnIHwgKHVjaGFyKUFTQ19IT1NUX0ZMQUdfSU5fSVNSKSk7CisJaWYgKChjaGlwc3RhdCAmIENTV19JTlRfUEVORElORykKKwkgICAgfHwgKGludF9wZW5kaW5nKQorCSAgICApIHsKKwkJQXNjQWNrSW50ZXJydXB0KGlvcF9iYXNlKTsKKwkJaW50X3BlbmRpbmcgPSBUUlVFOworCQlpZiAoKGNoaXBzdGF0ICYgQ1NXX0hBTFRFRCkgJiYgKGN0cmxfcmVnICYgQ0NfU0lOR0xFX1NURVApKSB7CisJCQlpZiAoQXNjSXNyQ2hpcEhhbHRlZChhc2NfZHZjKSA9PSBFUlIpIHsKKwkJCQlnb3RvIElTUl9SRVBPUlRfUURPTkVfRkFUQUxfRVJST1I7CisJCQl9IGVsc2UgeworCQkJCXNhdmVkX2N0cmxfcmVnICY9ICh1Y2hhcikofkNDX0hBTFQpOworCQkJfQorCQl9IGVsc2UgeworIElTUl9SRVBPUlRfUURPTkVfRkFUQUxfRVJST1I6CisJCQlpZiAoKGFzY19kdmMtPmR2Y19jbnRsICYgQVNDX0NOVExfSU5UX01VTFRJX1EpICE9IDApIHsKKwkJCQl3aGlsZSAoKChzdGF0dXMgPQorCQkJCQkgQXNjSXNyUURvbmUoYXNjX2R2YykpICYgMHgwMSkgIT0gMCkgeworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZG8geworCQkJCQlpZiAoKHN0YXR1cyA9CisJCQkJCSAgICAgQXNjSXNyUURvbmUoYXNjX2R2YykpID09IDEpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSB3aGlsZSAoc3RhdHVzID09IDB4MTEpOworCQkJfQorCQkJaWYgKChzdGF0dXMgJiAweDgwKSAhPSAwKQorCQkJCWludF9wZW5kaW5nID0gRVJSOworCQl9CisJfQorCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfSE9TVF9GTEFHX0IsIGhvc3RfZmxhZyk7CisJQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzYXZlZF9yYW1fYWRkcik7CisJQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIHNhdmVkX2N0cmxfcmVnKTsKKwlhc2NfZHZjLT5pc19pbl9pbnQgPSBGQUxTRTsKKwlyZXR1cm4gKGludF9wZW5kaW5nKTsKIH0KIAogLyogTWljcm9jb2RlIGJ1ZmZlciBpcyBrZXB0IGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4gKi8KLVNUQVRJQyB1Y2hhciBfYXNjX21jb2RlX2J1ZltdID0KLXsKLSAgMHgwMSwgIDB4MDMsICAweDAxLCAgMHgxOSwgIDB4MEYsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHgwRiwgIDB4MEYsICAweDBGLCAgMHgwRiwgIDB4MEYsICAweDBGLCAgMHgwRiwgIDB4MEYsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4QzMsICAweDEyLCAgMHgwRCwgIDB4MDUsICAweDAxLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4RkYsICAweDAwLCAgMHgwMCwKLSAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4RkYsICAweDgwLCAgMHhGRiwgIDB4RkYsICAweDAxLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgyMywgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwNywgIDB4MDAsICAweEZGLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHhGRiwgIDB4RkYsICAweEZGLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4RTQsICAweDg4LCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwKLSAgMHg4MCwgIDB4NzMsICAweDQ4LCAgMHgwNCwgIDB4MzYsICAweDAwLCAgMHgwMCwgIDB4QTIsICAweEMyLCAgMHgwMCwgIDB4ODAsICAweDczLCAgMHgwMywgIDB4MjMsICAweDM2LCAgMHg0MCwKLSAgMHhCNiwgIDB4MDAsICAweDM2LCAgMHgwMCwgIDB4MDUsICAweEQ2LCAgMHgwQywgIDB4RDIsICAweDEyLCAgMHhEQSwgIDB4MDAsICAweEEyLCAgMHhDMiwgIDB4MDAsICAweDkyLCAgMHg4MCwKLSAgMHgxRSwgIDB4OTgsICAweDUwLCAgMHgwMCwgIDB4RjUsICAweDAwLCAgMHg0OCwgIDB4OTgsICAweERGLCAgMHgyMywgIDB4MzYsICAweDYwLCAgMHhCNiwgIDB4MDAsICAweDkyLCAgMHg4MCwKLSAgMHg0RiwgIDB4MDAsICAweEY1LCAgMHgwMCwgIDB4NDgsICAweDk4LCAgMHhFRiwgIDB4MjMsICAweDM2LCAgMHg2MCwgIDB4QjYsICAweDAwLCAgMHg5MiwgIDB4ODAsICAweDgwLCAgMHg2MiwKLSAgMHg5MiwgIDB4ODAsICAweDAwLCAgMHg0NiwgIDB4MTUsICAweEVFLCAgMHgxMywgIDB4RUEsICAweDAyLCAgMHgwMSwgIDB4MDksICAweEQ4LCAgMHhDRCwgIDB4MDQsICAweDRELCAgMHgwMCwKLSAgMHgwMCwgIDB4QTMsICAweEQ2LCAgMHgwMCwgIDB4QTYsICAweDk3LCAgMHg3RiwgIDB4MjMsICAweDA0LCAgMHg2MSwgIDB4ODQsICAweDAxLCAgMHhFNiwgIDB4ODQsICAweEQyLCAgMHhDMSwKLSAgMHg4MCwgIDB4NzMsICAweENELCAgMHgwNCwgIDB4NEQsICAweDAwLCAgMHgwMCwgIDB4QTMsICAweERBLCAgMHgwMSwgIDB4QTYsICAweDk3LCAgMHhDNiwgIDB4ODEsICAweEMyLCAgMHg4OCwKLSAgMHg4MCwgIDB4NzMsICAweDgwLCAgMHg3NywgIDB4MDAsICAweDAxLCAgMHgwMSwgIDB4QTEsICAweEZFLCAgMHgwMCwgIDB4NEYsICAweDAwLCAgMHg4NCwgIDB4OTcsICAweDA3LCAgMHhBNiwKLSAgMHgwOCwgIDB4MDEsICAweDAwLCAgMHgzMywgIDB4MDMsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAzLCAgMHgwMywgIDB4MDEsICAweERFLCAgMHhDMiwgIDB4ODgsICAweENFLCAgMHgwMCwKLSAgMHg2OSwgIDB4NjAsICAweENFLCAgMHgwMCwgIDB4MDIsICAweDAzLCAgMHg0QSwgIDB4NjAsICAweDAwLCAgMHhBMiwgIDB4NzgsICAweDAxLCAgMHg4MCwgIDB4NjMsICAweDA3LCAgMHhBNiwKLSAgMHgyNCwgIDB4MDEsICAweDc4LCAgMHg4MSwgIDB4MDMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweEUyLCAgMHgwMCwgIDB4MDcsICAweEE2LCAgMHgzNCwgIDB4MDEsICAweDAwLCAgMHgzMywKLSAgMHgwNCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDMsICAweDA3LCAgMHgwMiwgIDB4MDEsICAweDA0LCAgMHhDQSwgIDB4MEQsICAweDIzLCAgMHg2OCwgIDB4OTgsICAweDRELCAgMHgwNCwKLSAgMHgwNCwgIDB4ODUsICAweDA1LCAgMHhEOCwgIDB4MEQsICAweDIzLCAgMHg2OCwgIDB4OTgsICAweENELCAgMHgwNCwgIDB4MTUsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweEZCLCAgMHgyMywKLSAgMHgwMiwgIDB4NjEsICAweDgyLCAgMHgwMSwgIDB4ODAsICAweDYzLCAgMHgwMiwgIDB4MDMsICAweDA2LCAgMHhBMywgIDB4NjIsICAweDAxLCAgMHgwMCwgIDB4MzMsICAweDBBLCAgMHgwMCwKLSAgMHhDMiwgIDB4ODgsICAweDRFLCAgMHgwMCwgIDB4MDcsICAweEEzLCAgMHg2RSwgIDB4MDEsICAweDAwLCAgMHgzMywgIDB4MEIsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweENELCAgMHgwNCwKLSAgMHgzNiwgIDB4MkQsICAweDAwLCAgMHgzMywgIDB4MUEsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDUwLCAgMHgwNCwgIDB4ODgsICAweDgxLCAgMHgwNiwgIDB4QUIsICAweDgyLCAgMHgwMSwKLSAgMHg4OCwgIDB4ODEsICAweDRFLCAgMHgwMCwgIDB4MDcsICAweEEzLCAgMHg5MiwgIDB4MDEsICAweDUwLCAgMHgwMCwgIDB4MDAsICAweEEzLCAgMHgzQywgIDB4MDEsICAweDAwLCAgMHgwNSwKLSAgMHg3QywgIDB4ODEsICAweDQ2LCAgMHg5NywgIDB4MDIsICAweDAxLCAgMHgwNSwgIDB4QzYsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHgxNSwgIDB4MjMsICAweEExLCAgMHgwMSwKLSAgMHhCRSwgIDB4ODEsICAweEZELCAgMHgyMywgIDB4MDIsICAweDYxLCAgMHg4MiwgIDB4MDEsICAweDBBLCAgMHhEQSwgIDB4NEEsICAweDAwLCAgMHgwNiwgIDB4NjEsICAweDAwLCAgMHhBMCwKLSAgMHhCNCwgIDB4MDEsICAweDgwLCAgMHg2MywgIDB4Q0QsICAweDA0LCAgMHgzNiwgIDB4MkQsICAweDAwLCAgMHgzMywgIDB4MUIsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDA2LCAgMHgyMywKLSAgMHg2OCwgIDB4OTgsICAweENELCAgMHgwNCwgIDB4RTYsICAweDg0LCAgMHgwNiwgIDB4MDEsICAweDAwLCAgMHhBMiwgIDB4RDQsICAweDAxLCAgMHg1NywgIDB4NjAsICAweDAwLCAgMHhBMCwKLSAgMHhEQSwgIDB4MDEsICAweEU2LCAgMHg4NCwgIDB4ODAsICAweDIzLCAgMHhBMCwgIDB4MDEsICAweEU2LCAgMHg4NCwgIDB4ODAsICAweDczLCAgMHg0QiwgIDB4MDAsICAweDA2LCAgMHg2MSwKLSAgMHgwMCwgIDB4QTIsICAweDAwLCAgMHgwMiwgIDB4MDQsICAweDAxLCAgMHgwQywgIDB4REUsICAweDAyLCAgMHgwMSwgIDB4MDMsICAweENDLCAgMHg0RiwgIDB4MDAsICAweDg0LCAgMHg5NywKLSAgMHhGQywgIDB4ODEsICAweDA4LCAgMHgyMywgIDB4MDIsICAweDQxLCAgMHg4MiwgIDB4MDEsICAweDRGLCAgMHgwMCwgIDB4NjIsICAweDk3LCAgMHg0OCwgIDB4MDQsICAweDg0LCAgMHg4MCwKLSAgMHhGMCwgIDB4OTcsICAweDAwLCAgMHg0NiwgIDB4NTYsICAweDAwLCAgMHgwMywgIDB4QzAsICAweDAxLCAgMHgyMywgIDB4RTgsICAweDAwLCAgMHg4MSwgIDB4NzMsICAweDA2LCAgMHgyOSwKLSAgMHgwMywgIDB4NDIsICAweDA2LCAgMHhFMiwgIDB4MDMsICAweEVFLCAgMHg2QiwgIDB4RUIsICAweDExLCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwNCwgIDB4OTgsICAweEYwLCAgMHg4MCwKLSAgMHg4MCwgIDB4NzMsICAweDgwLCAgMHg3NywgIDB4MDcsICAweEE0LCAgMHgyQSwgIDB4MDIsICAweDdDLCAgMHg5NSwgIDB4MDYsICAweEE2LCAgMHgzNCwgIDB4MDIsICAweDAzLCAgMHhBNiwKLSAgMHg0QywgIDB4MDQsICAweDQ2LCAgMHg4MiwgIDB4MDQsICAweDAxLCAgMHgwMywgIDB4RDgsICAweEI0LCAgMHg5OCwgIDB4NkEsICAweDk2LCAgMHg0NiwgIDB4ODIsICAweEZFLCAgMHg5NSwKLSAgMHg4MCwgIDB4NjcsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHhCNiwgIDB4MkQsICAweDAyLCAgMHhBNiwgIDB4NkMsICAweDAyLCAgMHgwNywgIDB4QTYsICAweDVBLCAgMHgwMiwKLSAgMHgwNiwgIDB4QTYsICAweDVFLCAgMHgwMiwgIDB4MDMsICAweEE2LCAgMHg2MiwgIDB4MDIsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHg0OCwgIDB4ODIsICAweDYwLCAgMHg5NiwKLSAgMHg0OCwgIDB4ODIsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHgxNCwgIDB4MjMsICAweEExLCAgMHgwMSwgIDB4M0MsICAweDg0LCAgMHgwNCwgIDB4MDEsICAweDBDLCAgMHhEQywKLSAgMHhFMCwgIDB4MjMsICAweDI1LCAgMHg2MSwgIDB4RUYsICAweDAwLCAgMHgxNCwgIDB4MDEsICAweDRGLCAgMHgwNCwgIDB4QTgsICAweDAxLCAgMHg2RiwgIDB4MDAsICAweEE1LCAgMHgwMSwKLSAgMHgwMywgIDB4MjMsICAweEE0LCAgMHgwMSwgIDB4MDYsICAweDIzLCAgMHg5QywgIDB4MDEsICAweDI0LCAgMHgyQiwgIDB4MUMsICAweDAxLCAgMHgwMiwgIDB4QTYsICAweEFBLCAgMHgwMiwKLSAgMHgwNywgIDB4QTYsICAweDVBLCAgMHgwMiwgIDB4MDYsICAweEE2LCAgMHg1RSwgIDB4MDIsICAweDAzLCAgMHhBNiwgIDB4MjAsICAweDA0LCAgMHgwMSwgIDB4QTYsICAweEI0LCAgMHgwMiwKLSAgMHgwMCwgIDB4QTYsICAweEI0LCAgMHgwMiwgIDB4MDAsICAweDMzLCAgMHgxMiwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDAsICAweDBFLCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHg0MywKLSAgMHgwMCwgIDB4QTAsICAweDhDLCAgMHgwMiwgIDB4NEQsICAweDA0LCAgMHgwNCwgIDB4MDEsICAweDBCLCAgMHhEQywgIDB4RTcsICAweDIzLCAgMHgwNCwgIDB4NjEsICAweDg0LCAgMHgwMSwKLSAgMHgxMCwgIDB4MzEsICAweDEyLCAgMHgzNSwgIDB4MTQsICAweDAxLCAgMHhFQywgIDB4MDAsICAweDZDLCAgMHgzOCwgIDB4MDAsICAweDNGLCAgMHgwMCwgIDB4MDAsICAweEVBLCAgMHg4MiwKLSAgMHgxOCwgIDB4MjMsICAweDA0LCAgMHg2MSwgIDB4MTgsICAweEEwLCAgMHhFMiwgIDB4MDIsICAweDA0LCAgMHgwMSwgIDB4QTIsICAweEM4LCAgMHgwMCwgIDB4MzMsICAweDFGLCAgMHgwMCwKLSAgMHhDMiwgIDB4ODgsICAweDA4LCAgMHgzMSwgIDB4MEEsICAweDM1LCAgMHgwQywgIDB4MzksICAweDBFLCAgMHgzRCwgIDB4N0UsICAweDk4LCAgMHhCNiwgIDB4MkQsICAweDAxLCAgMHhBNiwKLSAgMHgxNCwgIDB4MDMsICAweDAwLCAgMHhBNiwgIDB4MTQsICAweDAzLCAgMHgwNywgIDB4QTYsICAweDBDLCAgMHgwMywgIDB4MDYsICAweEE2LCAgMHgxMCwgIDB4MDMsICAweDAzLCAgMHhBNiwKLSAgMHgyMCwgIDB4MDQsICAweDAyLCAgMHhBNiwgIDB4NkMsICAweDAyLCAgMHgwMCwgIDB4MzMsICAweDMzLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHg3QywgIDB4OTUsICAweEVFLCAgMHg4MiwKLSAgMHg2MCwgIDB4OTYsICAweEVFLCAgMHg4MiwgIDB4ODIsICAweDk4LCAgMHg4MCwgIDB4NDIsICAweDdFLCAgMHg5OCwgIDB4NjQsICAweEU0LCAgMHgwNCwgIDB4MDEsICAweDJELCAgMHhDOCwKLSAgMHgzMSwgIDB4MDUsICAweDA3LCAgMHgwMSwgIDB4MDAsICAweEEyLCAgMHg1NCwgIDB4MDMsICAweDAwLCAgMHg0MywgIDB4ODcsICAweDAxLCAgMHgwNSwgIDB4MDUsICAweDg2LCAgMHg5OCwKLSAgMHg3RSwgIDB4OTgsICAweDAwLCAgMHhBNiwgIDB4MTYsICAweDAzLCAgMHgwNywgIDB4QTYsICAweDRDLCAgMHgwMywgIDB4MDMsICAweEE2LCAgMHgzQywgIDB4MDQsICAweDA2LCAgMHhBNiwKLSAgMHg1MCwgIDB4MDMsICAweDAxLCAgMHhBNiwgIDB4MTYsICAweDAzLCAgMHgwMCwgIDB4MzMsICAweDI1LCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHg3QywgIDB4OTUsICAweDMyLCAgMHg4MywKLSAgMHg2MCwgIDB4OTYsICAweDMyLCAgMHg4MywgIDB4MDQsICAweDAxLCAgMHgxMCwgIDB4Q0UsICAweDA3LCAgMHhDOCwgIDB4MDUsICAweDA1LCAgMHhFQiwgIDB4MDQsICAweDAwLCAgMHgzMywKLSAgMHgwMCwgIDB4MjAsICAweEMwLCAgMHgyMCwgIDB4ODEsICAweDYyLCAgMHg3MiwgIDB4ODMsICAweDAwLCAgMHgwMSwgIDB4MDUsICAweDA1LCAgMHhGRiwgIDB4QTIsICAweDdBLCAgMHgwMywKLSAgMHhCMSwgIDB4MDEsICAweDA4LCAgMHgyMywgIDB4QjIsICAweDAxLCAgMHgyRSwgIDB4ODMsICAweDA1LCAgMHgwNSwgIDB4MTUsICAweDAxLCAgMHgwMCwgIDB4QTIsICAweDlBLCAgMHgwMywKLSAgMHhFQywgIDB4MDAsICAweDZFLCAgMHgwMCwgIDB4OTUsICAweDAxLCAgMHg2QywgIDB4MzgsICAweDAwLCAgMHgzRiwgIDB4MDAsICAweDAwLCAgMHgwMSwgIDB4QTYsICAweDk2LCAgMHgwMywKLSAgMHgwMCwgIDB4QTYsICAweDk2LCAgMHgwMywgIDB4MTAsICAweDg0LCAgMHg4MCwgIDB4NDIsICAweDdFLCAgMHg5OCwgIDB4MDEsICAweEE2LCAgMHhBNCwgIDB4MDMsICAweDAwLCAgMHhBNiwKLSAgMHhCQywgIDB4MDMsICAweDEwLCAgMHg4NCwgIDB4QTgsICAweDk4LCAgMHg4MCwgIDB4NDIsICAweDAxLCAgMHhBNiwgIDB4QTQsICAweDAzLCAgMHgwNywgIDB4QTYsICAweEIyLCAgMHgwMywKLSAgMHhENCwgIDB4ODMsICAweDdDLCAgMHg5NSwgIDB4QTgsICAweDgzLCAgMHgwMCwgIDB4MzMsICAweDJGLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHhBOCwgIDB4OTgsICAweDgwLCAgMHg0MiwKLSAgMHgwMCwgIDB4QTYsICAweEJDLCAgMHgwMywgIDB4MDcsICAweEE2LCAgMHhDQSwgIDB4MDMsICAweEQ0LCAgMHg4MywgIDB4N0MsICAweDk1LCAgMHhDMCwgIDB4ODMsICAweDAwLCAgMHgzMywKLSAgMHgyNiwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MzgsICAweDJCLCAgMHg4MCwgIDB4MzIsICAweDgwLCAgMHgzNiwgIDB4MDQsICAweDIzLCAgMHhBMCwgIDB4MDEsICAweDEyLCAgMHgyMywKLSAgMHhBMSwgIDB4MDEsICAweDEwLCAgMHg4NCwgIDB4MDcsICAweEYwLCAgMHgwNiwgIDB4QTQsICAweEY0LCAgMHgwMywgIDB4ODAsICAweDZCLCAgMHg4MCwgIDB4NjcsICAweDA1LCAgMHgyMywKLSAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4MDMsICAweEE2LCAgMHgwRSwgIDB4MDQsICAweDA3LCAgMHhBNiwgIDB4MDYsICAweDA0LCAgMHgwNiwgIDB4QTYsICAweDBBLCAgMHgwNCwKLSAgMHgwMCwgIDB4MzMsICAweDE3LCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHg3QywgIDB4OTUsICAweEY0LCAgMHg4MywgIDB4NjAsICAweDk2LCAgMHhGNCwgIDB4ODMsICAweDIwLCAgMHg4NCwKLSAgMHgwNywgIDB4RjAsICAweDA2LCAgMHhBNCwgIDB4MjAsICAweDA0LCAgMHg4MCwgIDB4NkIsICAweDgwLCAgMHg2NywgIDB4MDUsICAweDIzLCAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywKLSAgMHhCNiwgIDB4MkQsICAweDAzLCAgMHhBNiwgIDB4M0MsICAweDA0LCAgMHgwNywgIDB4QTYsICAweDM0LCAgMHgwNCwgIDB4MDYsICAweEE2LCAgMHgzOCwgIDB4MDQsICAweDAwLCAgMHgzMywKLSAgMHgzMCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4N0MsICAweDk1LCAgMHgyMCwgIDB4ODQsICAweDYwLCAgMHg5NiwgIDB4MjAsICAweDg0LCAgMHgxRCwgIDB4MDEsICAweDA2LCAgMHhDQywKLSAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg4NCwgIDB4QzAsICAweDIwLCAgMHgwMCwgIDB4MjMsICAweEVBLCAgMHgwMCwgIDB4ODEsICAweDYyLCAgMHhBMiwgIDB4MEQsICAweDgwLCAgMHg2MywKLSAgMHgwNywgIDB4QTYsICAweDVBLCAgMHgwNCwgIDB4MDAsICAweDMzLCAgMHgxOCwgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweEEzLCAgMHgwMSwKLSAgMHgwNywgIDB4QTQsICAweDY0LCAgMHgwNCwgIDB4MjMsICAweDAxLCAgMHgwMCwgIDB4QTIsICAweDg2LCAgMHgwNCwgIDB4MEEsICAweEEwLCAgMHg3NiwgIDB4MDQsICAweEUwLCAgMHgwMCwKLSAgMHgwMCwgIDB4MzMsICAweDFELCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwQiwgIDB4QTAsICAweDgyLCAgMHgwNCwgIDB4RTAsICAweDAwLCAgMHgwMCwgIDB4MzMsICAweDFFLCAgMHgwMCwKLSAgMHhDMiwgIDB4ODgsICAweDQyLCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgwMCwgIDB4MjMsICAweDIyLCAgMHhBMywgIDB4RTYsICAweDA0LCAgMHgwOCwgIDB4MjMsICAweDIyLCAgMHhBMywKLSAgMHhBMiwgIDB4MDQsICAweDI4LCAgMHgyMywgIDB4MjIsICAweEEzLCAgMHhBRSwgIDB4MDQsICAweDAyLCAgMHgyMywgIDB4MjIsICAweEEzLCAgMHhDNCwgIDB4MDQsICAweDQyLCAgMHgyMywKLSAgMHhGOCwgIDB4ODgsICAweDRBLCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTAsICAweEFFLCAgMHgwNCwgIDB4NDUsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDA0LCAgMHg5OCwKLSAgMHgwMCwgIDB4QTIsICAweEMwLCAgMHgwNCwgIDB4QjQsICAweDk4LCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg4MiwgIDB4QzAsICAweDIwLCAgMHg4MSwgIDB4NjIsICAweEU4LCAgMHg4MSwKLSAgMHg0NywgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4MDQsICAweDAxLCAgMHgwQiwgIDB4REUsICAweDA0LCAgMHg5OCwgIDB4QjQsICAweDk4LCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg4MSwKLSAgMHhDMCwgIDB4MjAsICAweDgxLCAgMHg2MiwgIDB4MTQsICAweDAxLCAgMHgwMCwgIDB4QTAsICAweDAwLCAgMHgwMiwgIDB4NDMsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDA0LCAgMHgyMywKLSAgMHhBMCwgIDB4MDEsICAweDQ0LCAgMHgyMywgIDB4QTEsICAweDAxLCAgMHg4MCwgIDB4NzMsICAweDRELCAgMHgwMCwgIDB4MDMsICAweEEzLCAgMHhGNCwgIDB4MDQsICAweDAwLCAgMHgzMywKLSAgMHgyNywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MDQsICAweDAxLCAgMHgwNCwgIDB4REMsICAweDAyLCAgMHgyMywgIDB4QTIsICAweDAxLCAgMHgwNCwgIDB4MjMsICAweEEwLCAgMHgwMSwKLSAgMHgwNCwgIDB4OTgsICAweDI2LCAgMHg5NSwgIDB4NEIsICAweDAwLCAgMHhGNiwgIDB4MDAsICAweDRGLCAgMHgwNCwgIDB4NEYsICAweDAwLCAgMHgwMCwgIDB4QTMsICAweDIyLCAgMHgwNSwKLSAgMHgwMCwgIDB4MDUsICAweDc2LCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTIsICAweDFDLCAgMHgwNSwgIDB4MEEsICAweDg1LCAgMHg0NiwgIDB4OTcsICAweENELCAgMHgwNCwKLSAgMHgyNCwgIDB4ODUsICAweDQ4LCAgMHgwNCwgIDB4ODQsICAweDgwLCAgMHgwMiwgIDB4MDEsICAweDAzLCAgMHhEQSwgIDB4ODAsICAweDIzLCAgMHg4MiwgIDB4MDEsICAweDM0LCAgMHg4NSwKLSAgMHgwMiwgIDB4MjMsICAweEEwLCAgMHgwMSwgIDB4NEEsICAweDAwLCAgMHgwNiwgIDB4NjEsICAweDAwLCAgMHhBMiwgIDB4NDAsICAweDA1LCAgMHgxRCwgIDB4MDEsICAweDA0LCAgMHhENiwKLSAgMHhGRiwgIDB4MjMsICAweDg2LCAgMHg0MSwgIDB4NEIsICAweDYwLCAgMHhDQiwgIDB4MDAsICAweEZGLCAgMHgyMywgIDB4ODAsICAweDAxLCAgMHg0OSwgIDB4MDAsICAweDgxLCAgMHgwMSwKLSAgMHgwNCwgIDB4MDEsICAweDAyLCAgMHhDOCwgIDB4MzAsICAweDAxLCAgMHg4MCwgIDB4MDEsICAweEY3LCAgMHgwNCwgIDB4MDMsICAweDAxLCAgMHg0OSwgIDB4MDQsICAweDgwLCAgMHgwMSwKLSAgMHhDOSwgIDB4MDAsICAweDAwLCAgMHgwNSwgIDB4MDAsICAweDAxLCAgMHhGRiwgIDB4QTAsICAweDYwLCAgMHgwNSwgIDB4NzcsICAweDA0LCAgMHgwMSwgIDB4MjMsICAweEVBLCAgMHgwMCwKLSAgMHg1RCwgIDB4MDAsICAweEZFLCAgMHhDNywgIDB4MDAsICAweDYyLCAgMHgwMCwgIDB4MjMsICAweEVBLCAgMHgwMCwgIDB4MDAsICAweDYzLCAgMHgwNywgIDB4QTQsICAweEY4LCAgMHgwNSwKLSAgMHgwMywgIDB4MDMsICAweDAyLCAgMHhBMCwgIDB4OEUsICAweDA1LCAgMHhGNCwgIDB4ODUsICAweDAwLCAgMHgzMywgIDB4MkQsICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDA0LCAgMHhBMCwKLSAgMHhCOCwgIDB4MDUsICAweDgwLCAgMHg2MywgIDB4MDAsICAweDIzLCAgMHhERiwgIDB4MDAsICAweDRBLCAgMHgwMCwgIDB4MDYsICAweDYxLCAgMHgwMCwgIDB4QTIsICAweEE0LCAgMHgwNSwKLSAgMHgxRCwgIDB4MDEsICAweDA2LCAgMHhENiwgIDB4MDIsICAweDIzLCAgMHgwMiwgIDB4NDEsICAweDgyLCAgMHgwMSwgIDB4NTAsICAweDAwLCAgMHg2MiwgIDB4OTcsICAweDA0LCAgMHg4NSwKLSAgMHgwNCwgIDB4MjMsICAweDAyLCAgMHg0MSwgIDB4ODIsICAweDAxLCAgMHgwNCwgIDB4ODUsICAweDA4LCAgMHhBMCwgIDB4QkUsICAweDA1LCAgMHhGNCwgIDB4ODUsICAweDAzLCAgMHhBMCwKLSAgMHhDNCwgIDB4MDUsICAweEY0LCAgMHg4NSwgIDB4MDEsICAweEEwLCAgMHhDRSwgIDB4MDUsICAweDg4LCAgMHgwMCwgIDB4ODAsICAweDYzLCAgMHhDQywgIDB4ODYsICAweDA3LCAgMHhBMCwKLSAgMHhFRSwgIDB4MDUsICAweDVGLCAgMHgwMCwgIDB4MDAsICAweDJCLCAgMHhERiwgIDB4MDgsICAweDAwLCAgMHhBMiwgIDB4RTYsICAweDA1LCAgMHg4MCwgIDB4NjcsICAweDgwLCAgMHg2MywKLSAgMHgwMSwgIDB4QTIsICAweDdBLCAgMHgwNiwgIDB4N0MsICAweDg1LCAgMHgwNiwgIDB4MjMsICAweDY4LCAgMHg5OCwgIDB4NDgsICAweDIzLCAgMHhGOCwgIDB4ODgsICAweDA3LCAgMHgyMywKLSAgMHg4MCwgIDB4MDAsICAweDA2LCAgMHg4NywgIDB4ODAsICAweDYzLCAgMHg3QywgIDB4ODUsICAweDAwLCAgMHgyMywgIDB4REYsICAweDAwLCAgMHgwMCwgIDB4NjMsICAweDRBLCAgMHgwMCwKLSAgMHgwNiwgIDB4NjEsICAweDAwLCAgMHhBMiwgIDB4MzYsICAweDA2LCAgMHgxRCwgIDB4MDEsICAweDE2LCAgMHhENCwgIDB4QzAsICAweDIzLCAgMHgwNywgIDB4NDEsICAweDgzLCAgMHgwMywKLSAgMHg4MCwgIDB4NjMsICAweDA2LCAgMHhBNiwgIDB4MUMsICAweDA2LCAgMHgwMCwgIDB4MzMsICAweDM3LCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgxRCwgIDB4MDEsICAweDAxLCAgMHhENiwKLSAgMHgyMCwgIDB4MjMsICAweDYzLCAgMHg2MCwgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDAyLCAgMHgyMywgIDB4REYsICAweDAwLCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwKLSAgMHhFRiwgIDB4MDQsICAweDZGLCAgMHgwMCwgIDB4MDAsICAweDYzLCAgMHg0QiwgIDB4MDAsICAweDA2LCAgMHg0MSwgIDB4Q0IsICAweDAwLCAgMHg1MiwgIDB4MDAsICAweDA2LCAgMHg2MSwKLSAgMHgwMCwgIDB4QTIsICAweDRFLCAgMHgwNiwgIDB4MUQsICAweDAxLCAgMHgwMywgIDB4Q0EsICAweEMwLCAgMHgyMywgIDB4MDcsICAweDQxLCAgMHgwMCwgIDB4NjMsICAweDFELCAgMHgwMSwKLSAgMHgwNCwgIDB4Q0MsICAweDAwLCAgMHgzMywgIDB4MDAsICAweDgzLCAgMHhDMCwgIDB4MjAsICAweDgxLCAgMHg2MiwgIDB4ODAsICAweDIzLCAgMHgwNywgIDB4NDEsICAweDAwLCAgMHg2MywKLSAgMHg4MCwgIDB4NjcsICAweDA4LCAgMHgyMywgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHg2MywgIDB4MDEsICAweDIzLCAgMHhERiwgIDB4MDAsICAweDA2LCAgMHhBNiwKLSAgMHg4NCwgIDB4MDYsICAweDA3LCAgMHhBNiwgIDB4N0MsICAweDA1LCAgMHg4MCwgIDB4NjcsICAweDgwLCAgMHg2MywgIDB4MDAsICAweDMzLCAgMHgwMCwgIDB4NDAsICAweEMwLCAgMHgyMCwKLSAgMHg4MSwgIDB4NjIsICAweDAwLCAgMHg2MywgIDB4MDAsICAweDAwLCAgMHhGRSwgIDB4OTUsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwNiwgIDB4QTYsICAweDk0LCAgMHgwNiwKLSAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4MDAsICAweDAwLCAgMHgwMSwgIDB4QTAsICAweDE0LCAgMHgwNywgIDB4MDAsICAweDJCLCAgMHg0MCwgIDB4MEUsICAweDgwLCAgMHg2MywKLSAgMHgwMSwgIDB4MDAsICAweDA2LCAgMHhBNiwgIDB4QUEsICAweDA2LCAgMHgwNywgIDB4QTYsICAweDdDLCAgMHgwNSwgIDB4NDAsICAweDBFLCAgMHg4MCwgIDB4NjMsICAweDAwLCAgMHg0MywKLSAgMHgwMCwgIDB4QTAsICAweEEyLCAgMHgwNiwgIDB4MDYsICAweEE2LCAgMHhCQywgIDB4MDYsICAweDA3LCAgMHhBNiwgIDB4N0MsICAweDA1LCAgMHg4MCwgIDB4NjcsICAweDQwLCAgMHgwRSwKLSAgMHg4MCwgIDB4NjMsICAweDA3LCAgMHhBNiwgIDB4N0MsICAweDA1LCAgMHgwMCwgIDB4MjMsICAweERGLCAgMHgwMCwgIDB4MDAsICAweDYzLCAgMHgwNywgIDB4QTYsICAweEQ2LCAgMHgwNiwKLSAgMHgwMCwgIDB4MzMsICAweDJBLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwMywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4ODksICAweDAwLCAgMHgwQSwgIDB4MkIsICAweDA3LCAgMHhBNiwKLSAgMHhFOCwgIDB4MDYsICAweDAwLCAgMHgzMywgIDB4MjksICAweDAwLCAgMHhDMiwgIDB4ODgsICAweDAwLCAgMHg0MywgIDB4MDAsICAweEEyLCAgMHhGNCwgIDB4MDYsICAweEMwLCAgMHgwRSwKLSAgMHg4MCwgIDB4NjMsICAweERFLCAgMHg4NiwgIDB4QzAsICAweDBFLCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg4MCwgIDB4QzAsICAweDIwLCAgMHg4MSwgIDB4NjIsICAweDA0LCAgMHgwMSwKLSAgMHgwMiwgIDB4REEsICAweDgwLCAgMHg2MywgIDB4N0MsICAweDg1LCAgMHg4MCwgIDB4N0IsICAweDgwLCAgMHg2MywgIDB4MDYsICAweEE2LCAgMHg4QywgIDB4MDYsICAweDAwLCAgMHgzMywKLSAgMHgyQywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4MEMsICAweEEyLCAgMHgyRSwgIDB4MDcsICAweEZFLCAgMHg5NSwgIDB4ODMsICAweDAzLCAgMHg4MCwgIDB4NjMsICAweDA2LCAgMHhBNiwKLSAgMHgyQywgIDB4MDcsICAweDA3LCAgMHhBNiwgIDB4N0MsICAweDA1LCAgMHgwMCwgIDB4MzMsICAweDNELCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHgwMCwgIDB4MDAsICAweDgwLCAgMHg2NywKLSAgMHg4MywgIDB4MDMsICAweDgwLCAgMHg2MywgIDB4MEMsICAweEEwLCAgMHg0NCwgIDB4MDcsICAweDA3LCAgMHhBNiwgIDB4N0MsICAweDA1LCAgMHhCRiwgIDB4MjMsICAweDA0LCAgMHg2MSwKLSAgMHg4NCwgIDB4MDEsICAweEU2LCAgMHg4NCwgIDB4MDAsICAweDYzLCAgMHhGMCwgIDB4MDQsICAweDAxLCAgMHgwMSwgIDB4RjEsICAweDAwLCAgMHgwMCwgIDB4MDEsICAweEYyLCAgMHgwMCwKLSAgMHgwMSwgIDB4MDUsICAweDgwLCAgMHgwMSwgIDB4NzIsICAweDA0LCAgMHg3MSwgIDB4MDAsICAweDgxLCAgMHgwMSwgIDB4NzAsICAweDA0LCAgMHg4MCwgIDB4MDUsICAweDgxLCAgMHgwNSwKLSAgMHgwMCwgIDB4NjMsICAweEYwLCAgMHgwNCwgIDB4RjIsICAweDAwLCAgMHg3MiwgIDB4MDQsICAweDAxLCAgMHgwMSwgIDB4RjEsICAweDAwLCAgMHg3MCwgIDB4MDAsICAweDgxLCAgMHgwMSwKLSAgMHg3MCwgIDB4MDQsICAweDcxLCAgMHgwMCwgIDB4ODEsICAweDAxLCAgMHg3MiwgIDB4MDAsICAweDgwLCAgMHgwMSwgIDB4NzEsICAweDA0LCAgMHg3MCwgIDB4MDAsICAweDgwLCAgMHgwMSwKLSAgMHg3MCwgIDB4MDQsICAweDAwLCAgMHg2MywgIDB4RjAsICAweDA0LCAgMHhGMiwgIDB4MDAsICAweDcyLCAgMHgwNCwgIDB4MDAsICAweDAxLCAgMHhGMSwgIDB4MDAsICAweDcwLCAgMHgwMCwKLSAgMHg4MCwgIDB4MDEsICAweDcwLCAgMHgwNCwgIDB4NzEsICAweDAwLCAgMHg4MCwgIDB4MDEsICAweDcyLCAgMHgwMCwgIDB4ODEsICAweDAxLCAgMHg3MSwgIDB4MDQsICAweDcwLCAgMHgwMCwKLSAgMHg4MSwgIDB4MDEsICAweDcwLCAgMHgwNCwgIDB4MDAsICAweDYzLCAgMHgwMCwgIDB4MjMsICAweEIzLCAgMHgwMSwgIDB4ODMsICAweDA1LCAgMHhBMywgIDB4MDEsICAweEEyLCAgMHgwMSwKLSAgMHhBMSwgIDB4MDEsICAweDAxLCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHgwMCwgIDB4MDEsICAweEM4LCAgMHgwMCwgIDB4MDMsICAweEExLCAgMHhDNCwgIDB4MDcsICAweDAwLCAgMHgzMywKLSAgMHgwNywgIDB4MDAsICAweEMyLCAgMHg4OCwgIDB4ODAsICAweDA1LCAgMHg4MSwgIDB4MDUsICAweDA0LCAgMHgwMSwgIDB4MTEsICAweEM4LCAgMHg0OCwgIDB4MDAsICAweEIwLCAgMHgwMSwKLSAgMHhCMSwgIDB4MDEsICAweDA4LCAgMHgyMywgIDB4QjIsICAweDAxLCAgMHgwNSwgIDB4MDEsICAweDQ4LCAgMHgwNCwgIDB4MDAsICAweDQzLCAgMHgwMCwgIDB4QTIsICAweEU0LCAgMHgwNywKLSAgMHgwMCwgIDB4MDUsICAweERBLCAgMHg4NywgIDB4MDAsICAweDAxLCAgMHhDOCwgIDB4MDAsICAweEZGLCAgMHgyMywgIDB4ODAsICAweDAxLCAgMHgwNSwgIDB4MDUsICAweDAwLCAgMHg2MywKLSAgMHhGNywgIDB4MDQsICAweDFBLCAgMHgwOSwgIDB4RjYsICAweDA4LCAgMHg2RSwgIDB4MDQsICAweDAwLCAgMHgwMiwgIDB4ODAsICAweDQzLCAgMHg3NiwgIDB4MDgsICAweDgwLCAgMHgwMiwKLSAgMHg3NywgIDB4MDQsICAweDAwLCAgMHg2MywgIDB4RjcsICAweDA0LCAgMHgxQSwgIDB4MDksICAweEY2LCAgMHgwOCwgIDB4NkUsICAweDA0LCAgMHgwMCwgIDB4MDIsICAweDAwLCAgMHhBMCwKLSAgMHgxNCwgIDB4MDgsICAweDE2LCAgMHg4OCwgIDB4MDAsICAweDQzLCAgMHg3NiwgIDB4MDgsICAweDgwLCAgMHgwMiwgIDB4NzcsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweEYzLCAgMHgwNCwKLSAgMHgwMCwgIDB4MjMsICAweEY0LCAgMHgwMCwgIDB4NzQsICAweDAwLCAgMHg4MCwgIDB4NDMsICAweEY0LCAgMHgwMCwgIDB4Q0YsICAweDQwLCAgMHgwMCwgIDB4QTIsICAweDQ0LCAgMHgwOCwKLSAgMHg3NCwgIDB4MDQsICAweDAyLCAgMHgwMSwgIDB4RjcsICAweEM5LCAgMHhGNiwgIDB4RDksICAweDAwLCAgMHgwMSwgIDB4MDEsICAweEExLCAgMHgyNCwgIDB4MDgsICAweDA0LCAgMHg5OCwKLSAgMHgyNiwgIDB4OTUsICAweDI0LCAgMHg4OCwgIDB4NzMsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweEYzLCAgMHgwNCwgIDB4NzUsICAweDA0LCAgMHg1QSwgIDB4ODgsICAweDAyLCAgMHgwMSwKLSAgMHgwNCwgIDB4RDgsICAweDQ2LCAgMHg5NywgIDB4MDQsICAweDk4LCAgMHgyNiwgIDB4OTUsICAweDRBLCAgMHg4OCwgIDB4NzUsICAweDAwLCAgMHgwMCwgIDB4QTMsICAweDY0LCAgMHgwOCwKLSAgMHgwMCwgIDB4MDUsICAweDRFLCAgMHg4OCwgIDB4NzMsICAweDA0LCAgMHgwMCwgIDB4NjMsICAweDgwLCAgMHg3QiwgIDB4ODAsICAweDYzLCAgMHgwNiwgIDB4QTYsICAweDc2LCAgMHgwOCwKLSAgMHgwMCwgIDB4MzMsICAweDNFLCAgMHgwMCwgIDB4QzIsICAweDg4LCAgMHg4MCwgIDB4NjcsICAweDgzLCAgMHgwMywgIDB4ODAsICAweDYzLCAgMHgwMCwgIDB4NjMsICAweDM4LCAgMHgyQiwKLSAgMHg5QywgIDB4ODgsICAweDM4LCAgMHgyQiwgIDB4OTIsICAweDg4LCAgMHgzMiwgIDB4MDksICAweDMxLCAgMHgwNSwgIDB4OTIsICAweDk4LCAgMHgwNSwgIDB4MDUsICAweEIyLCAgMHgwOSwKLSAgMHgwMCwgIDB4NjMsICAweDAwLCAgMHgzMiwgIDB4MDAsICAweDM2LCAgMHgwMCwgIDB4M0EsICAweDAwLCAgMHgzRSwgIDB4MDAsICAweDYzLCAgMHg4MCwgIDB4MzIsICAweDgwLCAgMHgzNiwKLSAgMHg4MCwgIDB4M0EsICAweDgwLCAgMHgzRSwgIDB4QjQsICAweDNELCAgMHgwMCwgIDB4NjMsICAweDM4LCAgMHgyQiwgIDB4NDAsICAweDMyLCAgMHg0MCwgIDB4MzYsICAweDQwLCAgMHgzQSwKLSAgMHg0MCwgIDB4M0UsICAweDAwLCAgMHg2MywgIDB4NUEsICAweDIwLCAgMHhDOSwgIDB4NDAsICAweDAwLCAgMHhBMCwgIDB4QjQsICAweDA4LCAgMHg1RCwgIDB4MDAsICAweEZFLCAgMHhDMywKLSAgMHgwMCwgIDB4NjMsICAweDgwLCAgMHg3MywgIDB4RTYsICAweDIwLCAgMHgwMiwgIDB4MjMsICAweEU4LCAgMHgwMCwgIDB4ODIsICAweDczLCAgMHhGRiwgIDB4RkQsICAweDgwLCAgMHg3MywKLSAgMHgxMywgIDB4MjMsICAweEY4LCAgMHg4OCwgIDB4NjYsICAweDIwLCAgMHhDMCwgIDB4MjAsICAweDA0LCAgMHgyMywgIDB4QTAsICAweDAxLCAgMHhBMSwgIDB4MjMsICAweEExLCAgMHgwMSwKLSAgMHg4MSwgIDB4NjIsICAweEUyLCAgMHg4OCwgIDB4ODAsICAweDczLCAgMHg4MCwgIDB4NzcsICAweDY4LCAgMHgwMCwgIDB4MDAsICAweEEyLCAgMHg4MCwgIDB4MDAsICAweDAzLCAgMHhDMiwKLSAgMHhGMSwgIDB4QzcsICAweDQxLCAgMHgyMywgIDB4RjgsICAweDg4LCAgMHgxMSwgIDB4MjMsICAweEExLCAgMHgwMSwgIDB4MDQsICAweDIzLCAgMHhBMCwgIDB4MDEsICAweEU2LCAgMHg4NCwKK3N0YXRpYyB1Y2hhciBfYXNjX21jb2RlX2J1ZltdID0geworCTB4MDEsIDB4MDMsIDB4MDEsIDB4MTksIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBGLCAweDBGLCAweDBGLCAweDBGLCAweDBGLCAweDBGLCAweDBGLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweDEyLCAweDBELCAweDA1LCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDg4LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHg4MCwgMHg3MywgMHg0OCwgMHgwNCwgMHgzNiwgMHgwMCwgMHgwMCwgMHhBMiwgMHhDMiwgMHgwMCwgMHg4MCwgMHg3MywKKwkweDAzLCAweDIzLCAweDM2LCAweDQwLAorCTB4QjYsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MDUsIDB4RDYsIDB4MEMsIDB4RDIsIDB4MTIsIDB4REEsIDB4MDAsIDB4QTIsCisJMHhDMiwgMHgwMCwgMHg5MiwgMHg4MCwKKwkweDFFLCAweDk4LCAweDUwLCAweDAwLCAweEY1LCAweDAwLCAweDQ4LCAweDk4LCAweERGLCAweDIzLCAweDM2LCAweDYwLAorCTB4QjYsIDB4MDAsIDB4OTIsIDB4ODAsCisJMHg0RiwgMHgwMCwgMHhGNSwgMHgwMCwgMHg0OCwgMHg5OCwgMHhFRiwgMHgyMywgMHgzNiwgMHg2MCwgMHhCNiwgMHgwMCwKKwkweDkyLCAweDgwLCAweDgwLCAweDYyLAorCTB4OTIsIDB4ODAsIDB4MDAsIDB4NDYsIDB4MTUsIDB4RUUsIDB4MTMsIDB4RUEsIDB4MDIsIDB4MDEsIDB4MDksIDB4RDgsCisJMHhDRCwgMHgwNCwgMHg0RCwgMHgwMCwKKwkweDAwLCAweEEzLCAweEQ2LCAweDAwLCAweEE2LCAweDk3LCAweDdGLCAweDIzLCAweDA0LCAweDYxLCAweDg0LCAweDAxLAorCTB4RTYsIDB4ODQsIDB4RDIsIDB4QzEsCisJMHg4MCwgMHg3MywgMHhDRCwgMHgwNCwgMHg0RCwgMHgwMCwgMHgwMCwgMHhBMywgMHhEQSwgMHgwMSwgMHhBNiwgMHg5NywKKwkweEM2LCAweDgxLCAweEMyLCAweDg4LAorCTB4ODAsIDB4NzMsIDB4ODAsIDB4NzcsIDB4MDAsIDB4MDEsIDB4MDEsIDB4QTEsIDB4RkUsIDB4MDAsIDB4NEYsIDB4MDAsCisJMHg4NCwgMHg5NywgMHgwNywgMHhBNiwKKwkweDA4LCAweDAxLCAweDAwLCAweDMzLCAweDAzLCAweDAwLCAweEMyLCAweDg4LCAweDAzLCAweDAzLCAweDAxLCAweERFLAorCTB4QzIsIDB4ODgsIDB4Q0UsIDB4MDAsCisJMHg2OSwgMHg2MCwgMHhDRSwgMHgwMCwgMHgwMiwgMHgwMywgMHg0QSwgMHg2MCwgMHgwMCwgMHhBMiwgMHg3OCwgMHgwMSwKKwkweDgwLCAweDYzLCAweDA3LCAweEE2LAorCTB4MjQsIDB4MDEsIDB4NzgsIDB4ODEsIDB4MDMsIDB4MDMsIDB4ODAsIDB4NjMsIDB4RTIsIDB4MDAsIDB4MDcsIDB4QTYsCisJMHgzNCwgMHgwMSwgMHgwMCwgMHgzMywKKwkweDA0LCAweDAwLCAweEMyLCAweDg4LCAweDAzLCAweDA3LCAweDAyLCAweDAxLCAweDA0LCAweENBLCAweDBELCAweDIzLAorCTB4NjgsIDB4OTgsIDB4NEQsIDB4MDQsCisJMHgwNCwgMHg4NSwgMHgwNSwgMHhEOCwgMHgwRCwgMHgyMywgMHg2OCwgMHg5OCwgMHhDRCwgMHgwNCwgMHgxNSwgMHgyMywKKwkweEY4LCAweDg4LCAweEZCLCAweDIzLAorCTB4MDIsIDB4NjEsIDB4ODIsIDB4MDEsIDB4ODAsIDB4NjMsIDB4MDIsIDB4MDMsIDB4MDYsIDB4QTMsIDB4NjIsIDB4MDEsCisJMHgwMCwgMHgzMywgMHgwQSwgMHgwMCwKKwkweEMyLCAweDg4LCAweDRFLCAweDAwLCAweDA3LCAweEEzLCAweDZFLCAweDAxLCAweDAwLCAweDMzLCAweDBCLCAweDAwLAorCTB4QzIsIDB4ODgsIDB4Q0QsIDB4MDQsCisJMHgzNiwgMHgyRCwgMHgwMCwgMHgzMywgMHgxQSwgMHgwMCwgMHhDMiwgMHg4OCwgMHg1MCwgMHgwNCwgMHg4OCwgMHg4MSwKKwkweDA2LCAweEFCLCAweDgyLCAweDAxLAorCTB4ODgsIDB4ODEsIDB4NEUsIDB4MDAsIDB4MDcsIDB4QTMsIDB4OTIsIDB4MDEsIDB4NTAsIDB4MDAsIDB4MDAsIDB4QTMsCisJMHgzQywgMHgwMSwgMHgwMCwgMHgwNSwKKwkweDdDLCAweDgxLCAweDQ2LCAweDk3LCAweDAyLCAweDAxLCAweDA1LCAweEM2LCAweDA0LCAweDIzLCAweEEwLCAweDAxLAorCTB4MTUsIDB4MjMsIDB4QTEsIDB4MDEsCisJMHhCRSwgMHg4MSwgMHhGRCwgMHgyMywgMHgwMiwgMHg2MSwgMHg4MiwgMHgwMSwgMHgwQSwgMHhEQSwgMHg0QSwgMHgwMCwKKwkweDA2LCAweDYxLCAweDAwLCAweEEwLAorCTB4QjQsIDB4MDEsIDB4ODAsIDB4NjMsIDB4Q0QsIDB4MDQsIDB4MzYsIDB4MkQsIDB4MDAsIDB4MzMsIDB4MUIsIDB4MDAsCisJMHhDMiwgMHg4OCwgMHgwNiwgMHgyMywKKwkweDY4LCAweDk4LCAweENELCAweDA0LCAweEU2LCAweDg0LCAweDA2LCAweDAxLCAweDAwLCAweEEyLCAweEQ0LCAweDAxLAorCTB4NTcsIDB4NjAsIDB4MDAsIDB4QTAsCisJMHhEQSwgMHgwMSwgMHhFNiwgMHg4NCwgMHg4MCwgMHgyMywgMHhBMCwgMHgwMSwgMHhFNiwgMHg4NCwgMHg4MCwgMHg3MywKKwkweDRCLCAweDAwLCAweDA2LCAweDYxLAorCTB4MDAsIDB4QTIsIDB4MDAsIDB4MDIsIDB4MDQsIDB4MDEsIDB4MEMsIDB4REUsIDB4MDIsIDB4MDEsIDB4MDMsIDB4Q0MsCisJMHg0RiwgMHgwMCwgMHg4NCwgMHg5NywKKwkweEZDLCAweDgxLCAweDA4LCAweDIzLCAweDAyLCAweDQxLCAweDgyLCAweDAxLCAweDRGLCAweDAwLCAweDYyLCAweDk3LAorCTB4NDgsIDB4MDQsIDB4ODQsIDB4ODAsCisJMHhGMCwgMHg5NywgMHgwMCwgMHg0NiwgMHg1NiwgMHgwMCwgMHgwMywgMHhDMCwgMHgwMSwgMHgyMywgMHhFOCwgMHgwMCwKKwkweDgxLCAweDczLCAweDA2LCAweDI5LAorCTB4MDMsIDB4NDIsIDB4MDYsIDB4RTIsIDB4MDMsIDB4RUUsIDB4NkIsIDB4RUIsIDB4MTEsIDB4MjMsIDB4RjgsIDB4ODgsCisJMHgwNCwgMHg5OCwgMHhGMCwgMHg4MCwKKwkweDgwLCAweDczLCAweDgwLCAweDc3LCAweDA3LCAweEE0LCAweDJBLCAweDAyLCAweDdDLCAweDk1LCAweDA2LCAweEE2LAorCTB4MzQsIDB4MDIsIDB4MDMsIDB4QTYsCisJMHg0QywgMHgwNCwgMHg0NiwgMHg4MiwgMHgwNCwgMHgwMSwgMHgwMywgMHhEOCwgMHhCNCwgMHg5OCwgMHg2QSwgMHg5NiwKKwkweDQ2LCAweDgyLCAweEZFLCAweDk1LAorCTB4ODAsIDB4NjcsIDB4ODMsIDB4MDMsIDB4ODAsIDB4NjMsIDB4QjYsIDB4MkQsIDB4MDIsIDB4QTYsIDB4NkMsIDB4MDIsCisJMHgwNywgMHhBNiwgMHg1QSwgMHgwMiwKKwkweDA2LCAweEE2LCAweDVFLCAweDAyLCAweDAzLCAweEE2LCAweDYyLCAweDAyLCAweEMyLCAweDg4LCAweDdDLCAweDk1LAorCTB4NDgsIDB4ODIsIDB4NjAsIDB4OTYsCisJMHg0OCwgMHg4MiwgMHgwNCwgMHgyMywgMHhBMCwgMHgwMSwgMHgxNCwgMHgyMywgMHhBMSwgMHgwMSwgMHgzQywgMHg4NCwKKwkweDA0LCAweDAxLCAweDBDLCAweERDLAorCTB4RTAsIDB4MjMsIDB4MjUsIDB4NjEsIDB4RUYsIDB4MDAsIDB4MTQsIDB4MDEsIDB4NEYsIDB4MDQsIDB4QTgsIDB4MDEsCisJMHg2RiwgMHgwMCwgMHhBNSwgMHgwMSwKKwkweDAzLCAweDIzLCAweEE0LCAweDAxLCAweDA2LCAweDIzLCAweDlDLCAweDAxLCAweDI0LCAweDJCLCAweDFDLCAweDAxLAorCTB4MDIsIDB4QTYsIDB4QUEsIDB4MDIsCisJMHgwNywgMHhBNiwgMHg1QSwgMHgwMiwgMHgwNiwgMHhBNiwgMHg1RSwgMHgwMiwgMHgwMywgMHhBNiwgMHgyMCwgMHgwNCwKKwkweDAxLCAweEE2LCAweEI0LCAweDAyLAorCTB4MDAsIDB4QTYsIDB4QjQsIDB4MDIsIDB4MDAsIDB4MzMsIDB4MTIsIDB4MDAsIDB4QzIsIDB4ODgsIDB4MDAsIDB4MEUsCisJMHg4MCwgMHg2MywgMHgwMCwgMHg0MywKKwkweDAwLCAweEEwLCAweDhDLCAweDAyLCAweDRELCAweDA0LCAweDA0LCAweDAxLCAweDBCLCAweERDLCAweEU3LCAweDIzLAorCTB4MDQsIDB4NjEsIDB4ODQsIDB4MDEsCisJMHgxMCwgMHgzMSwgMHgxMiwgMHgzNSwgMHgxNCwgMHgwMSwgMHhFQywgMHgwMCwgMHg2QywgMHgzOCwgMHgwMCwgMHgzRiwKKwkweDAwLCAweDAwLCAweEVBLCAweDgyLAorCTB4MTgsIDB4MjMsIDB4MDQsIDB4NjEsIDB4MTgsIDB4QTAsIDB4RTIsIDB4MDIsIDB4MDQsIDB4MDEsIDB4QTIsIDB4QzgsCisJMHgwMCwgMHgzMywgMHgxRiwgMHgwMCwKKwkweEMyLCAweDg4LCAweDA4LCAweDMxLCAweDBBLCAweDM1LCAweDBDLCAweDM5LCAweDBFLCAweDNELCAweDdFLCAweDk4LAorCTB4QjYsIDB4MkQsIDB4MDEsIDB4QTYsCisJMHgxNCwgMHgwMywgMHgwMCwgMHhBNiwgMHgxNCwgMHgwMywgMHgwNywgMHhBNiwgMHgwQywgMHgwMywgMHgwNiwgMHhBNiwKKwkweDEwLCAweDAzLCAweDAzLCAweEE2LAorCTB4MjAsIDB4MDQsIDB4MDIsIDB4QTYsIDB4NkMsIDB4MDIsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4QzIsIDB4ODgsCisJMHg3QywgMHg5NSwgMHhFRSwgMHg4MiwKKwkweDYwLCAweDk2LCAweEVFLCAweDgyLCAweDgyLCAweDk4LCAweDgwLCAweDQyLCAweDdFLCAweDk4LCAweDY0LCAweEU0LAorCTB4MDQsIDB4MDEsIDB4MkQsIDB4QzgsCisJMHgzMSwgMHgwNSwgMHgwNywgMHgwMSwgMHgwMCwgMHhBMiwgMHg1NCwgMHgwMywgMHgwMCwgMHg0MywgMHg4NywgMHgwMSwKKwkweDA1LCAweDA1LCAweDg2LCAweDk4LAorCTB4N0UsIDB4OTgsIDB4MDAsIDB4QTYsIDB4MTYsIDB4MDMsIDB4MDcsIDB4QTYsIDB4NEMsIDB4MDMsIDB4MDMsIDB4QTYsCisJMHgzQywgMHgwNCwgMHgwNiwgMHhBNiwKKwkweDUwLCAweDAzLCAweDAxLCAweEE2LCAweDE2LCAweDAzLCAweDAwLCAweDMzLCAweDI1LCAweDAwLCAweEMyLCAweDg4LAorCTB4N0MsIDB4OTUsIDB4MzIsIDB4ODMsCisJMHg2MCwgMHg5NiwgMHgzMiwgMHg4MywgMHgwNCwgMHgwMSwgMHgxMCwgMHhDRSwgMHgwNywgMHhDOCwgMHgwNSwgMHgwNSwKKwkweEVCLCAweDA0LCAweDAwLCAweDMzLAorCTB4MDAsIDB4MjAsIDB4QzAsIDB4MjAsIDB4ODEsIDB4NjIsIDB4NzIsIDB4ODMsIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDUsCisJMHhGRiwgMHhBMiwgMHg3QSwgMHgwMywKKwkweEIxLCAweDAxLCAweDA4LCAweDIzLCAweEIyLCAweDAxLCAweDJFLCAweDgzLCAweDA1LCAweDA1LCAweDE1LCAweDAxLAorCTB4MDAsIDB4QTIsIDB4OUEsIDB4MDMsCisJMHhFQywgMHgwMCwgMHg2RSwgMHgwMCwgMHg5NSwgMHgwMSwgMHg2QywgMHgzOCwgMHgwMCwgMHgzRiwgMHgwMCwgMHgwMCwKKwkweDAxLCAweEE2LCAweDk2LCAweDAzLAorCTB4MDAsIDB4QTYsIDB4OTYsIDB4MDMsIDB4MTAsIDB4ODQsIDB4ODAsIDB4NDIsIDB4N0UsIDB4OTgsIDB4MDEsIDB4QTYsCisJMHhBNCwgMHgwMywgMHgwMCwgMHhBNiwKKwkweEJDLCAweDAzLCAweDEwLCAweDg0LCAweEE4LCAweDk4LCAweDgwLCAweDQyLCAweDAxLCAweEE2LCAweEE0LCAweDAzLAorCTB4MDcsIDB4QTYsIDB4QjIsIDB4MDMsCisJMHhENCwgMHg4MywgMHg3QywgMHg5NSwgMHhBOCwgMHg4MywgMHgwMCwgMHgzMywgMHgyRiwgMHgwMCwgMHhDMiwgMHg4OCwKKwkweEE4LCAweDk4LCAweDgwLCAweDQyLAorCTB4MDAsIDB4QTYsIDB4QkMsIDB4MDMsIDB4MDcsIDB4QTYsIDB4Q0EsIDB4MDMsIDB4RDQsIDB4ODMsIDB4N0MsIDB4OTUsCisJMHhDMCwgMHg4MywgMHgwMCwgMHgzMywKKwkweDI2LCAweDAwLCAweEMyLCAweDg4LCAweDM4LCAweDJCLCAweDgwLCAweDMyLCAweDgwLCAweDM2LCAweDA0LCAweDIzLAorCTB4QTAsIDB4MDEsIDB4MTIsIDB4MjMsCisJMHhBMSwgMHgwMSwgMHgxMCwgMHg4NCwgMHgwNywgMHhGMCwgMHgwNiwgMHhBNCwgMHhGNCwgMHgwMywgMHg4MCwgMHg2QiwKKwkweDgwLCAweDY3LCAweDA1LCAweDIzLAorCTB4ODMsIDB4MDMsIDB4ODAsIDB4NjMsIDB4MDMsIDB4QTYsIDB4MEUsIDB4MDQsIDB4MDcsIDB4QTYsIDB4MDYsIDB4MDQsCisJMHgwNiwgMHhBNiwgMHgwQSwgMHgwNCwKKwkweDAwLCAweDMzLCAweDE3LCAweDAwLCAweEMyLCAweDg4LCAweDdDLCAweDk1LCAweEY0LCAweDgzLCAweDYwLCAweDk2LAorCTB4RjQsIDB4ODMsIDB4MjAsIDB4ODQsCisJMHgwNywgMHhGMCwgMHgwNiwgMHhBNCwgMHgyMCwgMHgwNCwgMHg4MCwgMHg2QiwgMHg4MCwgMHg2NywgMHgwNSwgMHgyMywKKwkweDgzLCAweDAzLCAweDgwLCAweDYzLAorCTB4QjYsIDB4MkQsIDB4MDMsIDB4QTYsIDB4M0MsIDB4MDQsIDB4MDcsIDB4QTYsIDB4MzQsIDB4MDQsIDB4MDYsIDB4QTYsCisJMHgzOCwgMHgwNCwgMHgwMCwgMHgzMywKKwkweDMwLCAweDAwLCAweEMyLCAweDg4LCAweDdDLCAweDk1LCAweDIwLCAweDg0LCAweDYwLCAweDk2LCAweDIwLCAweDg0LAorCTB4MUQsIDB4MDEsIDB4MDYsIDB4Q0MsCisJMHgwMCwgMHgzMywgMHgwMCwgMHg4NCwgMHhDMCwgMHgyMCwgMHgwMCwgMHgyMywgMHhFQSwgMHgwMCwgMHg4MSwgMHg2MiwKKwkweEEyLCAweDBELCAweDgwLCAweDYzLAorCTB4MDcsIDB4QTYsIDB4NUEsIDB4MDQsIDB4MDAsIDB4MzMsIDB4MTgsIDB4MDAsIDB4QzIsIDB4ODgsIDB4MDMsIDB4MDMsCisJMHg4MCwgMHg2MywgMHhBMywgMHgwMSwKKwkweDA3LCAweEE0LCAweDY0LCAweDA0LCAweDIzLCAweDAxLCAweDAwLCAweEEyLCAweDg2LCAweDA0LCAweDBBLCAweEEwLAorCTB4NzYsIDB4MDQsIDB4RTAsIDB4MDAsCisJMHgwMCwgMHgzMywgMHgxRCwgMHgwMCwgMHhDMiwgMHg4OCwgMHgwQiwgMHhBMCwgMHg4MiwgMHgwNCwgMHhFMCwgMHgwMCwKKwkweDAwLCAweDMzLCAweDFFLCAweDAwLAorCTB4QzIsIDB4ODgsIDB4NDIsIDB4MjMsIDB4RjgsIDB4ODgsIDB4MDAsIDB4MjMsIDB4MjIsIDB4QTMsIDB4RTYsIDB4MDQsCisJMHgwOCwgMHgyMywgMHgyMiwgMHhBMywKKwkweEEyLCAweDA0LCAweDI4LCAweDIzLCAweDIyLCAweEEzLCAweEFFLCAweDA0LCAweDAyLCAweDIzLCAweDIyLCAweEEzLAorCTB4QzQsIDB4MDQsIDB4NDIsIDB4MjMsCisJMHhGOCwgMHg4OCwgMHg0QSwgMHgwMCwgMHgwNiwgMHg2MSwgMHgwMCwgMHhBMCwgMHhBRSwgMHgwNCwgMHg0NSwgMHgyMywKKwkweEY4LCAweDg4LCAweDA0LCAweDk4LAorCTB4MDAsIDB4QTIsIDB4QzAsIDB4MDQsIDB4QjQsIDB4OTgsIDB4MDAsIDB4MzMsIDB4MDAsIDB4ODIsIDB4QzAsIDB4MjAsCisJMHg4MSwgMHg2MiwgMHhFOCwgMHg4MSwKKwkweDQ3LCAweDIzLCAweEY4LCAweDg4LCAweDA0LCAweDAxLCAweDBCLCAweERFLCAweDA0LCAweDk4LCAweEI0LCAweDk4LAorCTB4MDAsIDB4MzMsIDB4MDAsIDB4ODEsCisJMHhDMCwgMHgyMCwgMHg4MSwgMHg2MiwgMHgxNCwgMHgwMSwgMHgwMCwgMHhBMCwgMHgwMCwgMHgwMiwgMHg0MywgMHgyMywKKwkweEY4LCAweDg4LCAweDA0LCAweDIzLAorCTB4QTAsIDB4MDEsIDB4NDQsIDB4MjMsIDB4QTEsIDB4MDEsIDB4ODAsIDB4NzMsIDB4NEQsIDB4MDAsIDB4MDMsIDB4QTMsCisJMHhGNCwgMHgwNCwgMHgwMCwgMHgzMywKKwkweDI3LCAweDAwLCAweEMyLCAweDg4LCAweDA0LCAweDAxLCAweDA0LCAweERDLCAweDAyLCAweDIzLCAweEEyLCAweDAxLAorCTB4MDQsIDB4MjMsIDB4QTAsIDB4MDEsCisJMHgwNCwgMHg5OCwgMHgyNiwgMHg5NSwgMHg0QiwgMHgwMCwgMHhGNiwgMHgwMCwgMHg0RiwgMHgwNCwgMHg0RiwgMHgwMCwKKwkweDAwLCAweEEzLCAweDIyLCAweDA1LAorCTB4MDAsIDB4MDUsIDB4NzYsIDB4MDAsIDB4MDYsIDB4NjEsIDB4MDAsIDB4QTIsIDB4MUMsIDB4MDUsIDB4MEEsIDB4ODUsCisJMHg0NiwgMHg5NywgMHhDRCwgMHgwNCwKKwkweDI0LCAweDg1LCAweDQ4LCAweDA0LCAweDg0LCAweDgwLCAweDAyLCAweDAxLCAweDAzLCAweERBLCAweDgwLCAweDIzLAorCTB4ODIsIDB4MDEsIDB4MzQsIDB4ODUsCisJMHgwMiwgMHgyMywgMHhBMCwgMHgwMSwgMHg0QSwgMHgwMCwgMHgwNiwgMHg2MSwgMHgwMCwgMHhBMiwgMHg0MCwgMHgwNSwKKwkweDFELCAweDAxLCAweDA0LCAweEQ2LAorCTB4RkYsIDB4MjMsIDB4ODYsIDB4NDEsIDB4NEIsIDB4NjAsIDB4Q0IsIDB4MDAsIDB4RkYsIDB4MjMsIDB4ODAsIDB4MDEsCisJMHg0OSwgMHgwMCwgMHg4MSwgMHgwMSwKKwkweDA0LCAweDAxLCAweDAyLCAweEM4LCAweDMwLCAweDAxLCAweDgwLCAweDAxLCAweEY3LCAweDA0LCAweDAzLCAweDAxLAorCTB4NDksIDB4MDQsIDB4ODAsIDB4MDEsCisJMHhDOSwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMSwgMHhGRiwgMHhBMCwgMHg2MCwgMHgwNSwgMHg3NywgMHgwNCwKKwkweDAxLCAweDIzLCAweEVBLCAweDAwLAorCTB4NUQsIDB4MDAsIDB4RkUsIDB4QzcsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MjMsIDB4RUEsIDB4MDAsIDB4MDAsIDB4NjMsCisJMHgwNywgMHhBNCwgMHhGOCwgMHgwNSwKKwkweDAzLCAweDAzLCAweDAyLCAweEEwLCAweDhFLCAweDA1LCAweEY0LCAweDg1LCAweDAwLCAweDMzLCAweDJELCAweDAwLAorCTB4QzIsIDB4ODgsIDB4MDQsIDB4QTAsCisJMHhCOCwgMHgwNSwgMHg4MCwgMHg2MywgMHgwMCwgMHgyMywgMHhERiwgMHgwMCwgMHg0QSwgMHgwMCwgMHgwNiwgMHg2MSwKKwkweDAwLCAweEEyLCAweEE0LCAweDA1LAorCTB4MUQsIDB4MDEsIDB4MDYsIDB4RDYsIDB4MDIsIDB4MjMsIDB4MDIsIDB4NDEsIDB4ODIsIDB4MDEsIDB4NTAsIDB4MDAsCisJMHg2MiwgMHg5NywgMHgwNCwgMHg4NSwKKwkweDA0LCAweDIzLCAweDAyLCAweDQxLCAweDgyLCAweDAxLCAweDA0LCAweDg1LCAweDA4LCAweEEwLCAweEJFLCAweDA1LAorCTB4RjQsIDB4ODUsIDB4MDMsIDB4QTAsCisJMHhDNCwgMHgwNSwgMHhGNCwgMHg4NSwgMHgwMSwgMHhBMCwgMHhDRSwgMHgwNSwgMHg4OCwgMHgwMCwgMHg4MCwgMHg2MywKKwkweENDLCAweDg2LCAweDA3LCAweEEwLAorCTB4RUUsIDB4MDUsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4REYsIDB4MDgsIDB4MDAsIDB4QTIsIDB4RTYsIDB4MDUsCisJMHg4MCwgMHg2NywgMHg4MCwgMHg2MywKKwkweDAxLCAweEEyLCAweDdBLCAweDA2LCAweDdDLCAweDg1LCAweDA2LCAweDIzLCAweDY4LCAweDk4LCAweDQ4LCAweDIzLAorCTB4RjgsIDB4ODgsIDB4MDcsIDB4MjMsCisJMHg4MCwgMHgwMCwgMHgwNiwgMHg4NywgMHg4MCwgMHg2MywgMHg3QywgMHg4NSwgMHgwMCwgMHgyMywgMHhERiwgMHgwMCwKKwkweDAwLCAweDYzLCAweDRBLCAweDAwLAorCTB4MDYsIDB4NjEsIDB4MDAsIDB4QTIsIDB4MzYsIDB4MDYsIDB4MUQsIDB4MDEsIDB4MTYsIDB4RDQsIDB4QzAsIDB4MjMsCisJMHgwNywgMHg0MSwgMHg4MywgMHgwMywKKwkweDgwLCAweDYzLCAweDA2LCAweEE2LCAweDFDLCAweDA2LCAweDAwLCAweDMzLCAweDM3LCAweDAwLCAweEMyLCAweDg4LAorCTB4MUQsIDB4MDEsIDB4MDEsIDB4RDYsCisJMHgyMCwgMHgyMywgMHg2MywgMHg2MCwgMHg4MywgMHgwMywgMHg4MCwgMHg2MywgMHgwMiwgMHgyMywgMHhERiwgMHgwMCwKKwkweDA3LCAweEE2LCAweDdDLCAweDA1LAorCTB4RUYsIDB4MDQsIDB4NkYsIDB4MDAsIDB4MDAsIDB4NjMsIDB4NEIsIDB4MDAsIDB4MDYsIDB4NDEsIDB4Q0IsIDB4MDAsCisJMHg1MiwgMHgwMCwgMHgwNiwgMHg2MSwKKwkweDAwLCAweEEyLCAweDRFLCAweDA2LCAweDFELCAweDAxLCAweDAzLCAweENBLCAweEMwLCAweDIzLCAweDA3LCAweDQxLAorCTB4MDAsIDB4NjMsIDB4MUQsIDB4MDEsCisJMHgwNCwgMHhDQywgMHgwMCwgMHgzMywgMHgwMCwgMHg4MywgMHhDMCwgMHgyMCwgMHg4MSwgMHg2MiwgMHg4MCwgMHgyMywKKwkweDA3LCAweDQxLCAweDAwLCAweDYzLAorCTB4ODAsIDB4NjcsIDB4MDgsIDB4MjMsIDB4ODMsIDB4MDMsIDB4ODAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDEsIDB4MjMsCisJMHhERiwgMHgwMCwgMHgwNiwgMHhBNiwKKwkweDg0LCAweDA2LCAweDA3LCAweEE2LCAweDdDLCAweDA1LCAweDgwLCAweDY3LCAweDgwLCAweDYzLCAweDAwLCAweDMzLAorCTB4MDAsIDB4NDAsIDB4QzAsIDB4MjAsCisJMHg4MSwgMHg2MiwgMHgwMCwgMHg2MywgMHgwMCwgMHgwMCwgMHhGRSwgMHg5NSwgMHg4MywgMHgwMywgMHg4MCwgMHg2MywKKwkweDA2LCAweEE2LCAweDk0LCAweDA2LAorCTB4MDcsIDB4QTYsIDB4N0MsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDEsIDB4QTAsIDB4MTQsIDB4MDcsIDB4MDAsIDB4MkIsCisJMHg0MCwgMHgwRSwgMHg4MCwgMHg2MywKKwkweDAxLCAweDAwLCAweDA2LCAweEE2LCAweEFBLCAweDA2LCAweDA3LCAweEE2LCAweDdDLCAweDA1LCAweDQwLCAweDBFLAorCTB4ODAsIDB4NjMsIDB4MDAsIDB4NDMsCisJMHgwMCwgMHhBMCwgMHhBMiwgMHgwNiwgMHgwNiwgMHhBNiwgMHhCQywgMHgwNiwgMHgwNywgMHhBNiwgMHg3QywgMHgwNSwKKwkweDgwLCAweDY3LCAweDQwLCAweDBFLAorCTB4ODAsIDB4NjMsIDB4MDcsIDB4QTYsIDB4N0MsIDB4MDUsIDB4MDAsIDB4MjMsIDB4REYsIDB4MDAsIDB4MDAsIDB4NjMsCisJMHgwNywgMHhBNiwgMHhENiwgMHgwNiwKKwkweDAwLCAweDMzLCAweDJBLCAweDAwLCAweEMyLCAweDg4LCAweDAzLCAweDAzLCAweDgwLCAweDYzLCAweDg5LCAweDAwLAorCTB4MEEsIDB4MkIsIDB4MDcsIDB4QTYsCisJMHhFOCwgMHgwNiwgMHgwMCwgMHgzMywgMHgyOSwgMHgwMCwgMHhDMiwgMHg4OCwgMHgwMCwgMHg0MywgMHgwMCwgMHhBMiwKKwkweEY0LCAweDA2LCAweEMwLCAweDBFLAorCTB4ODAsIDB4NjMsIDB4REUsIDB4ODYsIDB4QzAsIDB4MEUsIDB4MDAsIDB4MzMsIDB4MDAsIDB4ODAsIDB4QzAsIDB4MjAsCisJMHg4MSwgMHg2MiwgMHgwNCwgMHgwMSwKKwkweDAyLCAweERBLCAweDgwLCAweDYzLCAweDdDLCAweDg1LCAweDgwLCAweDdCLCAweDgwLCAweDYzLCAweDA2LCAweEE2LAorCTB4OEMsIDB4MDYsIDB4MDAsIDB4MzMsCisJMHgyQywgMHgwMCwgMHhDMiwgMHg4OCwgMHgwQywgMHhBMiwgMHgyRSwgMHgwNywgMHhGRSwgMHg5NSwgMHg4MywgMHgwMywKKwkweDgwLCAweDYzLCAweDA2LCAweEE2LAorCTB4MkMsIDB4MDcsIDB4MDcsIDB4QTYsIDB4N0MsIDB4MDUsIDB4MDAsIDB4MzMsIDB4M0QsIDB4MDAsIDB4QzIsIDB4ODgsCisJMHgwMCwgMHgwMCwgMHg4MCwgMHg2NywKKwkweDgzLCAweDAzLCAweDgwLCAweDYzLCAweDBDLCAweEEwLCAweDQ0LCAweDA3LCAweDA3LCAweEE2LCAweDdDLCAweDA1LAorCTB4QkYsIDB4MjMsIDB4MDQsIDB4NjEsCisJMHg4NCwgMHgwMSwgMHhFNiwgMHg4NCwgMHgwMCwgMHg2MywgMHhGMCwgMHgwNCwgMHgwMSwgMHgwMSwgMHhGMSwgMHgwMCwKKwkweDAwLCAweDAxLCAweEYyLCAweDAwLAorCTB4MDEsIDB4MDUsIDB4ODAsIDB4MDEsIDB4NzIsIDB4MDQsIDB4NzEsIDB4MDAsIDB4ODEsIDB4MDEsIDB4NzAsIDB4MDQsCisJMHg4MCwgMHgwNSwgMHg4MSwgMHgwNSwKKwkweDAwLCAweDYzLCAweEYwLCAweDA0LCAweEYyLCAweDAwLCAweDcyLCAweDA0LCAweDAxLCAweDAxLCAweEYxLCAweDAwLAorCTB4NzAsIDB4MDAsIDB4ODEsIDB4MDEsCisJMHg3MCwgMHgwNCwgMHg3MSwgMHgwMCwgMHg4MSwgMHgwMSwgMHg3MiwgMHgwMCwgMHg4MCwgMHgwMSwgMHg3MSwgMHgwNCwKKwkweDcwLCAweDAwLCAweDgwLCAweDAxLAorCTB4NzAsIDB4MDQsIDB4MDAsIDB4NjMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4MDAsIDB4NzIsIDB4MDQsIDB4MDAsIDB4MDEsCisJMHhGMSwgMHgwMCwgMHg3MCwgMHgwMCwKKwkweDgwLCAweDAxLCAweDcwLCAweDA0LCAweDcxLCAweDAwLCAweDgwLCAweDAxLCAweDcyLCAweDAwLCAweDgxLCAweDAxLAorCTB4NzEsIDB4MDQsIDB4NzAsIDB4MDAsCisJMHg4MSwgMHgwMSwgMHg3MCwgMHgwNCwgMHgwMCwgMHg2MywgMHgwMCwgMHgyMywgMHhCMywgMHgwMSwgMHg4MywgMHgwNSwKKwkweEEzLCAweDAxLCAweEEyLCAweDAxLAorCTB4QTEsIDB4MDEsIDB4MDEsIDB4MjMsIDB4QTAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4QzgsIDB4MDAsIDB4MDMsIDB4QTEsCisJMHhDNCwgMHgwNywgMHgwMCwgMHgzMywKKwkweDA3LCAweDAwLCAweEMyLCAweDg4LCAweDgwLCAweDA1LCAweDgxLCAweDA1LCAweDA0LCAweDAxLCAweDExLCAweEM4LAorCTB4NDgsIDB4MDAsIDB4QjAsIDB4MDEsCisJMHhCMSwgMHgwMSwgMHgwOCwgMHgyMywgMHhCMiwgMHgwMSwgMHgwNSwgMHgwMSwgMHg0OCwgMHgwNCwgMHgwMCwgMHg0MywKKwkweDAwLCAweEEyLCAweEU0LCAweDA3LAorCTB4MDAsIDB4MDUsIDB4REEsIDB4ODcsIDB4MDAsIDB4MDEsIDB4QzgsIDB4MDAsIDB4RkYsIDB4MjMsIDB4ODAsIDB4MDEsCisJMHgwNSwgMHgwNSwgMHgwMCwgMHg2MywKKwkweEY3LCAweDA0LCAweDFBLCAweDA5LCAweEY2LCAweDA4LCAweDZFLCAweDA0LCAweDAwLCAweDAyLCAweDgwLCAweDQzLAorCTB4NzYsIDB4MDgsIDB4ODAsIDB4MDIsCisJMHg3NywgMHgwNCwgMHgwMCwgMHg2MywgMHhGNywgMHgwNCwgMHgxQSwgMHgwOSwgMHhGNiwgMHgwOCwgMHg2RSwgMHgwNCwKKwkweDAwLCAweDAyLCAweDAwLCAweEEwLAorCTB4MTQsIDB4MDgsIDB4MTYsIDB4ODgsIDB4MDAsIDB4NDMsIDB4NzYsIDB4MDgsIDB4ODAsIDB4MDIsIDB4NzcsIDB4MDQsCisJMHgwMCwgMHg2MywgMHhGMywgMHgwNCwKKwkweDAwLCAweDIzLCAweEY0LCAweDAwLCAweDc0LCAweDAwLCAweDgwLCAweDQzLCAweEY0LCAweDAwLCAweENGLCAweDQwLAorCTB4MDAsIDB4QTIsIDB4NDQsIDB4MDgsCisJMHg3NCwgMHgwNCwgMHgwMiwgMHgwMSwgMHhGNywgMHhDOSwgMHhGNiwgMHhEOSwgMHgwMCwgMHgwMSwgMHgwMSwgMHhBMSwKKwkweDI0LCAweDA4LCAweDA0LCAweDk4LAorCTB4MjYsIDB4OTUsIDB4MjQsIDB4ODgsIDB4NzMsIDB4MDQsIDB4MDAsIDB4NjMsIDB4RjMsIDB4MDQsIDB4NzUsIDB4MDQsCisJMHg1QSwgMHg4OCwgMHgwMiwgMHgwMSwKKwkweDA0LCAweEQ4LCAweDQ2LCAweDk3LCAweDA0LCAweDk4LCAweDI2LCAweDk1LCAweDRBLCAweDg4LCAweDc1LCAweDAwLAorCTB4MDAsIDB4QTMsIDB4NjQsIDB4MDgsCisJMHgwMCwgMHgwNSwgMHg0RSwgMHg4OCwgMHg3MywgMHgwNCwgMHgwMCwgMHg2MywgMHg4MCwgMHg3QiwgMHg4MCwgMHg2MywKKwkweDA2LCAweEE2LCAweDc2LCAweDA4LAorCTB4MDAsIDB4MzMsIDB4M0UsIDB4MDAsIDB4QzIsIDB4ODgsIDB4ODAsIDB4NjcsIDB4ODMsIDB4MDMsIDB4ODAsIDB4NjMsCisJMHgwMCwgMHg2MywgMHgzOCwgMHgyQiwKKwkweDlDLCAweDg4LCAweDM4LCAweDJCLCAweDkyLCAweDg4LCAweDMyLCAweDA5LCAweDMxLCAweDA1LCAweDkyLCAweDk4LAorCTB4MDUsIDB4MDUsIDB4QjIsIDB4MDksCisJMHgwMCwgMHg2MywgMHgwMCwgMHgzMiwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzQSwgMHgwMCwgMHgzRSwgMHgwMCwgMHg2MywKKwkweDgwLCAweDMyLCAweDgwLCAweDM2LAorCTB4ODAsIDB4M0EsIDB4ODAsIDB4M0UsIDB4QjQsIDB4M0QsIDB4MDAsIDB4NjMsIDB4MzgsIDB4MkIsIDB4NDAsIDB4MzIsCisJMHg0MCwgMHgzNiwgMHg0MCwgMHgzQSwKKwkweDQwLCAweDNFLCAweDAwLCAweDYzLCAweDVBLCAweDIwLCAweEM5LCAweDQwLCAweDAwLCAweEEwLCAweEI0LCAweDA4LAorCTB4NUQsIDB4MDAsIDB4RkUsIDB4QzMsCisJMHgwMCwgMHg2MywgMHg4MCwgMHg3MywgMHhFNiwgMHgyMCwgMHgwMiwgMHgyMywgMHhFOCwgMHgwMCwgMHg4MiwgMHg3MywKKwkweEZGLCAweEZELCAweDgwLCAweDczLAorCTB4MTMsIDB4MjMsIDB4RjgsIDB4ODgsIDB4NjYsIDB4MjAsIDB4QzAsIDB4MjAsIDB4MDQsIDB4MjMsIDB4QTAsIDB4MDEsCisJMHhBMSwgMHgyMywgMHhBMSwgMHgwMSwKKwkweDgxLCAweDYyLCAweEUyLCAweDg4LCAweDgwLCAweDczLCAweDgwLCAweDc3LCAweDY4LCAweDAwLCAweDAwLCAweEEyLAorCTB4ODAsIDB4MDAsIDB4MDMsIDB4QzIsCisJMHhGMSwgMHhDNywgMHg0MSwgMHgyMywgMHhGOCwgMHg4OCwgMHgxMSwgMHgyMywgMHhBMSwgMHgwMSwgMHgwNCwgMHgyMywKKwkweEEwLCAweDAxLCAweEU2LCAweDg0LAogfTsKIAotU1RBVElDIHVzaG9ydCBfYXNjX21jb2RlX3NpemUgPSBzaXplb2YoX2FzY19tY29kZV9idWYpOwotU1RBVElDIEFEVl9EQ05UIF9hc2NfbWNvZGVfY2hrc3VtID0gMHgwMTJDNDUzRlVMOworc3RhdGljIHVzaG9ydCBfYXNjX21jb2RlX3NpemUgPSBzaXplb2YoX2FzY19tY29kZV9idWYpOworc3RhdGljIEFEVl9EQ05UIF9hc2NfbWNvZGVfY2hrc3VtID0gMHgwMTJDNDUzRlVMOwogCiAjZGVmaW5lIEFTQ19TWU5fT0ZGU0VUX09ORV9ESVNBQkxFX0xJU1QgIDE2Ci1TVEFUSUMgdWNoYXIgX3N5bl9vZmZzZXRfb25lX2Rpc2FibGVfY21kW0FTQ19TWU5fT0ZGU0VUX09ORV9ESVNBQkxFX0xJU1RdID0KLXsKLSAgICBJTlFVSVJZLAotICAgIFJFUVVFU1RfU0VOU0UsCi0gICAgUkVBRF9DQVBBQ0lUWSwKLSAgICBSRUFEX1RPQywKLSAgICBNT0RFX1NFTEVDVCwKLSAgICBNT0RFX1NFTlNFLAotICAgIE1PREVfU0VMRUNUXzEwLAotICAgIE1PREVfU0VOU0VfMTAsCi0gICAgMHhGRiwKLSAgICAweEZGLAotICAgIDB4RkYsCi0gICAgMHhGRiwKLSAgICAweEZGLAotICAgIDB4RkYsCi0gICAgMHhGRiwKLSAgICAweEZGCitzdGF0aWMgdWNoYXIgX3N5bl9vZmZzZXRfb25lX2Rpc2FibGVfY21kW0FTQ19TWU5fT0ZGU0VUX09ORV9ESVNBQkxFX0xJU1RdID0geworCUlOUVVJUlksCisJUkVRVUVTVF9TRU5TRSwKKwlSRUFEX0NBUEFDSVRZLAorCVJFQURfVE9DLAorCU1PREVfU0VMRUNULAorCU1PREVfU0VOU0UsCisJTU9ERV9TRUxFQ1RfMTAsCisJTU9ERV9TRU5TRV8xMCwKKwkweEZGLAorCTB4RkYsCisJMHhGRiwKKwkweEZGLAorCTB4RkYsCisJMHhGRiwKKwkweEZGLAorCTB4RkYKIH07CiAKLVNUQVRJQyBpbnQKLUFzY0V4ZVNjc2lRdWV1ZSgKLSAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICBBU0NfU0NTSV9RICpzY3NpcQotKQorc3RhdGljIGludCBBc2NFeGVTY3NpUXVldWUoQVNDX0RWQ19WQVIgKmFzY19kdmMsIEFTQ19TQ1NJX1EgKnNjc2lxKQogewotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICBsYXN0X2ludF9sZXZlbDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG5fcV9yZXF1aXJlZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4OwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBBU0NfUEFERFIgICAgICAgICAgIGFkZHI7Ci0gICAgQVNDX0VYRV9DQUxMQkFDSyAgICBhc2NfZXhlX2NhbGxiYWNrOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgc2dfZW50cnlfY250ID0gMDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX2VudHJ5X2NudF9taW51c19vbmUgPSAwOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2l4OwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9kYXRhOwotICAgIHVjaGFyICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXM7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzY3NpX2NtZDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGRpc2FibGVfY21kOwotICAgIEFTQ19TR19IRUFEICAgICAgICAgKnNnX2hlYWQ7Ci0gICAgQVNDX0RDTlQgICAgICAgICAgICBkYXRhX2NudDsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwl1bG9uZyBsYXN0X2ludF9sZXZlbDsKKwlpbnQgc3RhOworCWludCBuX3FfcmVxdWlyZWQ7CisJaW50IGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4OworCWludCBpOworCUFTQ19QQUREUiBhZGRyOworCUFTQ19FWEVfQ0FMTEJBQ0sgYXNjX2V4ZV9jYWxsYmFjazsKKwl1c2hvcnQgc2dfZW50cnlfY250ID0gMDsKKwl1c2hvcnQgc2dfZW50cnlfY250X21pbnVzX29uZSA9IDA7CisJdWNoYXIgdGFyZ2V0X2l4OworCXVjaGFyIHRpZF9ubzsKKwl1Y2hhciBzZHRyX2RhdGE7CisJdWNoYXIgZXh0cmFfYnl0ZXM7CisJdWNoYXIgc2NzaV9jbWQ7CisJdWNoYXIgZGlzYWJsZV9jbWQ7CisJQVNDX1NHX0hFQUQgKnNnX2hlYWQ7CisJQVNDX0RDTlQgZGF0YV9jbnQ7CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwotICAgIHNnX2hlYWQgPSBzY3NpcS0+c2dfaGVhZDsKLSAgICBhc2NfZXhlX2NhbGxiYWNrID0gYXNjX2R2Yy0+ZXhlX2NhbGxiYWNrOwotICAgIGlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKQotICAgICAgICByZXR1cm4gKEVSUik7Ci0gICAgaWYgKHNjc2lxID09IChBU0NfU0NTSV9RICopIDBMKSB7Ci0gICAgICAgIEFzY1NldExpYkVycm9yQ29kZShhc2NfZHZjLCBBU0NRX0VSUl9TQ1NJUV9OVUxMX1BUUik7Ci0gICAgICAgIHJldHVybiAoRVJSKTsKLSAgICB9Ci0gICAgc2NzaXEtPnExLnFfbm8gPSAwOwotICAgIGlmICgoc2NzaXEtPnEyLnRhZ19jb2RlICYgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTKSA9PSAwKSB7Ci0gICAgICAgIHNjc2lxLT5xMS5leHRyYV9ieXRlcyA9IDA7Ci0gICAgfQotICAgIHN0YSA9IDA7Ci0gICAgdGFyZ2V0X2l4ID0gc2NzaXEtPnEyLnRhcmdldF9peDsKLSAgICB0aWRfbm8gPSBBU0NfVElYX1RPX1RJRCh0YXJnZXRfaXgpOwotICAgIG5fcV9yZXF1aXJlZCA9IDE7Ci0gICAgaWYgKHNjc2lxLT5jZGJwdHJbMF0gPT0gUkVRVUVTVF9TRU5TRSkgewotICAgICAgICBpZiAoKGFzY19kdmMtPmluaXRfc2R0ciAmIHNjc2lxLT5xMS50YXJnZXRfaWQpICE9IDApIHsKLSAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfZG9uZSAmPSB+c2NzaXEtPnExLnRhcmdldF9pZDsKLSAgICAgICAgICAgIHNkdHJfZGF0YSA9IEFzY0dldE1Db2RlSW5pdFNEVFJBdElEKGlvcF9iYXNlLCB0aWRfbm8pOwotICAgICAgICAgICAgQXNjTXNnT3V0U0RUUihhc2NfZHZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbKHNkdHJfZGF0YSA+PiA0KSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGFzY19kdmMtPm1heF9zZHRyX2luZGV4IC0gMSldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChzZHRyX2RhdGEgJiAodWNoYXIpIEFTQ19TWU5fTUFYX09GRlNFVCkpOwotICAgICAgICAgICAgc2NzaXEtPnExLmNudGwgfD0gKFFDX01TR19PVVQgfCBRQ19VUkdFTlQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGxhc3RfaW50X2xldmVsID0gRHZjRW50ZXJDcml0aWNhbCgpOwotICAgIGlmIChhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQgIT0gMCkgewotICAgICAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKLSAgICAgICAgQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0NSSVRJQ0FMX1JFX0VOVFJZKTsKLSAgICAgICAgcmV0dXJuIChFUlIpOwotICAgIH0KLSAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQrKzsKLSAgICBpZiAoKHNjc2lxLT5xMS5jbnRsICYgUUNfU0dfSEVBRCkgIT0gMCkgewotICAgICAgICBpZiAoKHNnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCkgPT0gMCkgewotICAgICAgICAgICAgYXNjX2R2Yy0+aW5fY3JpdGljYWxfY250LS07Ci0gICAgICAgICAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKLSAgICAgICAgICAgIHJldHVybiAoRVJSKTsKLSAgICAgICAgfQorCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJc2dfaGVhZCA9IHNjc2lxLT5zZ19oZWFkOworCWFzY19leGVfY2FsbGJhY2sgPSBhc2NfZHZjLT5leGVfY2FsbGJhY2s7CisJaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCisJCXJldHVybiAoRVJSKTsKKwlpZiAoc2NzaXEgPT0gKEFTQ19TQ1NJX1EgKikwTCkgeworCQlBc2NTZXRMaWJFcnJvckNvZGUoYXNjX2R2YywgQVNDUV9FUlJfU0NTSVFfTlVMTF9QVFIpOworCQlyZXR1cm4gKEVSUik7CisJfQorCXNjc2lxLT5xMS5xX25vID0gMDsKKwlpZiAoKHNjc2lxLT5xMi50YWdfY29kZSAmIEFTQ19UQUdfRkxBR19FWFRSQV9CWVRFUykgPT0gMCkgeworCQlzY3NpcS0+cTEuZXh0cmFfYnl0ZXMgPSAwOworCX0KKwlzdGEgPSAwOworCXRhcmdldF9peCA9IHNjc2lxLT5xMi50YXJnZXRfaXg7CisJdGlkX25vID0gQVNDX1RJWF9UT19USUQodGFyZ2V0X2l4KTsKKwluX3FfcmVxdWlyZWQgPSAxOworCWlmIChzY3NpcS0+Y2RicHRyWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJaWYgKChhc2NfZHZjLT5pbml0X3NkdHIgJiBzY3NpcS0+cTEudGFyZ2V0X2lkKSAhPSAwKSB7CisJCQlhc2NfZHZjLT5zZHRyX2RvbmUgJj0gfnNjc2lxLT5xMS50YXJnZXRfaWQ7CisJCQlzZHRyX2RhdGEgPSBBc2NHZXRNQ29kZUluaXRTRFRSQXRJRChpb3BfYmFzZSwgdGlkX25vKTsKKwkJCUFzY01zZ091dFNEVFIoYXNjX2R2YywKKwkJCQkgICAgICBhc2NfZHZjLT4KKwkJCQkgICAgICBzZHRyX3BlcmlvZF90YmxbKHNkdHJfZGF0YSA+PiA0KSAmCisJCQkJCQkgICAgICAodWNoYXIpKGFzY19kdmMtPgorCQkJCQkJCSAgICAgIG1heF9zZHRyX2luZGV4IC0KKwkJCQkJCQkgICAgICAxKV0sCisJCQkJICAgICAgKHVjaGFyKShzZHRyX2RhdGEgJiAodWNoYXIpCisJCQkJCSAgICAgIEFTQ19TWU5fTUFYX09GRlNFVCkpOworCQkJc2NzaXEtPnExLmNudGwgfD0gKFFDX01TR19PVVQgfCBRQ19VUkdFTlQpOworCQl9CisJfQorCWxhc3RfaW50X2xldmVsID0gRHZjRW50ZXJDcml0aWNhbCgpOworCWlmIChhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQgIT0gMCkgeworCQlEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKwkJQXNjU2V0TGliRXJyb3JDb2RlKGFzY19kdmMsIEFTQ1FfRVJSX0NSSVRJQ0FMX1JFX0VOVFJZKTsKKwkJcmV0dXJuIChFUlIpOworCX0KKwlhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQrKzsKKwlpZiAoKHNjc2lxLT5xMS5jbnRsICYgUUNfU0dfSEVBRCkgIT0gMCkgeworCQlpZiAoKHNnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCkgPT0gMCkgeworCQkJYXNjX2R2Yy0+aW5fY3JpdGljYWxfY250LS07CisJCQlEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKwkJCXJldHVybiAoRVJSKTsKKwkJfQogI2lmICFDQ19WRVJZX0xPTkdfU0dfTElTVAotICAgICAgICBpZiAoc2dfZW50cnlfY250ID4gQVNDX01BWF9TR19MSVNUKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQtLTsKLSAgICAgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOwotICAgICAgICAgICAgcmV0dXJuKEVSUik7Ci0gICAgICAgIH0KKwkJaWYgKHNnX2VudHJ5X2NudCA+IEFTQ19NQVhfU0dfTElTVCkgeworCQkJYXNjX2R2Yy0+aW5fY3JpdGljYWxfY250LS07CisJCQlEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKwkJCXJldHVybiAoRVJSKTsKKwkJfQogI2VuZGlmIC8qICFDQ19WRVJZX0xPTkdfU0dfTElTVCAqLwotICAgICAgICBpZiAoc2dfZW50cnlfY250ID09IDEpIHsKLSAgICAgICAgICAgIHNjc2lxLT5xMS5kYXRhX2FkZHIgPSAoQURWX1BBRERSKSBzZ19oZWFkLT5zZ19saXN0WzBdLmFkZHI7Ci0gICAgICAgICAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSAoQURWX0RDTlQpIHNnX2hlYWQtPnNnX2xpc3RbMF0uYnl0ZXM7Ci0gICAgICAgICAgICBzY3NpcS0+cTEuY250bCAmPSB+KFFDX1NHX0hFQUQgfCBRQ19TR19TV0FQX1FVRVVFKTsKLSAgICAgICAgfQotICAgICAgICBzZ19lbnRyeV9jbnRfbWludXNfb25lID0gc2dfZW50cnlfY250IC0gMTsKLSAgICB9Ci0gICAgc2NzaV9jbWQgPSBzY3NpcS0+Y2RicHRyWzBdOwotICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0gRkFMU0U7Ci0gICAgaWYgKChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHNjc2lxLT5xMS50YXJnZXRfaWQpICYmCi0gICAgICAgICEoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzICYgc2NzaXEtPnExLnRhcmdldF9pZCkpIHsKLSAgICAgICAgaWYgKHNjc2lxLT5xMS5jbnRsICYgUUNfU0dfSEVBRCkgewotICAgICAgICAgICAgZGF0YV9jbnQgPSAwOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNnX2VudHJ5X2NudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGF0YV9jbnQgKz0gKEFEVl9EQ05UKSBsZTMyX3RvX2NwdShzZ19oZWFkLT5zZ19saXN0W2ldLmJ5dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFfY250ID0gbGUzMl90b19jcHUoc2NzaXEtPnExLmRhdGFfY250KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGF0YV9jbnQgIT0gMFVMKSB7Ci0gICAgICAgICAgICBpZiAoZGF0YV9jbnQgPCA1MTJVTCkgewotICAgICAgICAgICAgICAgIGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFTQ19TWU5fT0ZGU0VUX09ORV9ESVNBQkxFX0xJU1Q7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX2NtZCA9IF9zeW5fb2Zmc2V0X29uZV9kaXNhYmxlX2NtZFtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVfY21kID09IDB4RkYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY3NpX2NtZCA9PSBkaXNhYmxlX2NtZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9zeW5fb2Zmc2V0X29uZV9maXggPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4KSB7Ci0gICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSAmPSB+TVNHX1NJTVBMRV9UQUc7Ci0gICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSAoQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1RBR19GTEFHX0RJU0FCTEVfRElTQ09OTkVDVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2NzaXEtPnEyLnRhZ19jb2RlICY9IDB4Mjc7Ci0gICAgfQotICAgIGlmICgoc2NzaXEtPnExLmNudGwgJiBRQ19TR19IRUFEKSAhPSAwKSB7Ci0gICAgICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwpIHsKLSAgICAgICAgICAgIGlmIChhc2NfZHZjLT5idWdfZml4X2NudGwgJiBBU0NfQlVHX0ZJWF9JRl9OT1RfRFdCKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChzY3NpX2NtZCA9PSBSRUFEXzYpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChzY3NpX2NtZCA9PSBSRUFEXzEwKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChBRFZfUEFERFIpIGxlMzJfdG9fY3B1KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnX2hlYWQtPnNnX2xpc3Rbc2dfZW50cnlfY250X21pbnVzX29uZV0uYWRkcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgKEFEVl9EQ05UKSBsZTMyX3RvX2NwdSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ19oZWFkLT5zZ19saXN0W3NnX2VudHJ5X2NudF9taW51c19vbmVdLmJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfYnl0ZXMgPSAodWNoYXIpICgodXNob3J0KSBhZGRyICYgMHgwMDAzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChleHRyYV9ieXRlcyAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChzY3NpcS0+cTIudGFnX2NvZGUgJiBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+cTEuZXh0cmFfYnl0ZXMgPSBleHRyYV9ieXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY250ID0gbGUzMl90b19jcHUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dfaGVhZC0+c2dfbGlzdFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS5ieXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2NudCAtPSAoQVNDX0RDTlQpIGV4dHJhX2J5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2dfaGVhZC0+c2dfbGlzdFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS5ieXRlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3RvX2xlMzIoZGF0YV9jbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNnX2hlYWQtPmVudHJ5X3RvX2NvcHkgPSBzZ19oZWFkLT5lbnRyeV9jbnQ7CisJCWlmIChzZ19lbnRyeV9jbnQgPT0gMSkgeworCQkJc2NzaXEtPnExLmRhdGFfYWRkciA9CisJCQkgICAgKEFEVl9QQUREUilzZ19oZWFkLT5zZ19saXN0WzBdLmFkZHI7CisJCQlzY3NpcS0+cTEuZGF0YV9jbnQgPQorCQkJICAgIChBRFZfRENOVClzZ19oZWFkLT5zZ19saXN0WzBdLmJ5dGVzOworCQkJc2NzaXEtPnExLmNudGwgJj0gfihRQ19TR19IRUFEIHwgUUNfU0dfU1dBUF9RVUVVRSk7CisJCX0KKwkJc2dfZW50cnlfY250X21pbnVzX29uZSA9IHNnX2VudHJ5X2NudCAtIDE7CisJfQorCXNjc2lfY21kID0gc2NzaXEtPmNkYnB0clswXTsKKwlkaXNhYmxlX3N5bl9vZmZzZXRfb25lX2ZpeCA9IEZBTFNFOworCWlmICgoYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgJiBzY3NpcS0+cTEudGFyZ2V0X2lkKSAmJgorCSAgICAhKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyAmIHNjc2lxLT5xMS50YXJnZXRfaWQpKSB7CisJCWlmIChzY3NpcS0+cTEuY250bCAmIFFDX1NHX0hFQUQpIHsKKwkJCWRhdGFfY250ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzZ19lbnRyeV9jbnQ7IGkrKykgeworCQkJCWRhdGFfY250ICs9CisJCQkJICAgIChBRFZfRENOVClsZTMyX3RvX2NwdShzZ19oZWFkLT5zZ19saXN0W2ldLgorCQkJCQkJCSAgYnl0ZXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGF0YV9jbnQgPSBsZTMyX3RvX2NwdShzY3NpcS0+cTEuZGF0YV9jbnQpOworCQl9CisJCWlmIChkYXRhX2NudCAhPSAwVUwpIHsKKwkJCWlmIChkYXRhX2NudCA8IDUxMlVMKSB7CisJCQkJZGlzYWJsZV9zeW5fb2Zmc2V0X29uZV9maXggPSBUUlVFOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgQVNDX1NZTl9PRkZTRVRfT05FX0RJU0FCTEVfTElTVDsKKwkJCQkgICAgIGkrKykgeworCQkJCQlkaXNhYmxlX2NtZCA9CisJCQkJCSAgICBfc3luX29mZnNldF9vbmVfZGlzYWJsZV9jbWRbaV07CisJCQkJCWlmIChkaXNhYmxlX2NtZCA9PSAweEZGKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoc2NzaV9jbWQgPT0gZGlzYWJsZV9jbWQpIHsKKwkJCQkJCWRpc2FibGVfc3luX29mZnNldF9vbmVfZml4ID0KKwkJCQkJCSAgICBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGRpc2FibGVfc3luX29mZnNldF9vbmVfZml4KSB7CisJCXNjc2lxLT5xMi50YWdfY29kZSAmPSB+TVNHX1NJTVBMRV9UQUc7CisJCXNjc2lxLT5xMi50YWdfY29kZSB8PSAoQVNDX1RBR19GTEFHX0RJU0FCTEVfQVNZTl9VU0VfU1lOX0ZJWCB8CisJCQkJICAgICAgIEFTQ19UQUdfRkxBR19ESVNBQkxFX0RJU0NPTk5FQ1QpOworCX0gZWxzZSB7CisJCXNjc2lxLT5xMi50YWdfY29kZSAmPSAweDI3OworCX0KKwlpZiAoKHNjc2lxLT5xMS5jbnRsICYgUUNfU0dfSEVBRCkgIT0gMCkgeworCQlpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsKSB7CisJCQlpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsICYgQVNDX0JVR19GSVhfSUZfTk9UX0RXQikgeworCQkJCWlmICgoc2NzaV9jbWQgPT0gUkVBRF82KSB8fAorCQkJCSAgICAoc2NzaV9jbWQgPT0gUkVBRF8xMCkpIHsKKwkJCQkJYWRkciA9CisJCQkJCSAgICAoQURWX1BBRERSKWxlMzJfdG9fY3B1KHNnX2hlYWQtPgorCQkJCQkJCQkgICBzZ19saXN0CisJCQkJCQkJCSAgIFtzZ19lbnRyeV9jbnRfbWludXNfb25lXS4KKwkJCQkJCQkJICAgYWRkcikgKworCQkJCQkgICAgKEFEVl9EQ05UKWxlMzJfdG9fY3B1KHNnX2hlYWQtPgorCQkJCQkJCQkgIHNnX2xpc3QKKwkJCQkJCQkJICBbc2dfZW50cnlfY250X21pbnVzX29uZV0uCisJCQkJCQkJCSAgYnl0ZXMpOworCQkJCQlleHRyYV9ieXRlcyA9CisJCQkJCSAgICAodWNoYXIpKCh1c2hvcnQpYWRkciAmIDB4MDAwMyk7CisJCQkJCWlmICgoZXh0cmFfYnl0ZXMgIT0gMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoKHNjc2lxLT5xMi4KKwkJCQkJICAgICAgdGFnX2NvZGUgJgorCQkJCQkgICAgICBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVMpCisJCQkJCSAgICAgPT0gMCkpIHsKKwkJCQkJCXNjc2lxLT5xMi50YWdfY29kZSB8PQorCQkJCQkJICAgIEFTQ19UQUdfRkxBR19FWFRSQV9CWVRFUzsKKwkJCQkJCXNjc2lxLT5xMS5leHRyYV9ieXRlcyA9CisJCQkJCQkgICAgZXh0cmFfYnl0ZXM7CisJCQkJCQlkYXRhX2NudCA9CisJCQkJCQkgICAgbGUzMl90b19jcHUoc2dfaGVhZC0+CisJCQkJCQkJCXNnX2xpc3QKKwkJCQkJCQkJW3NnX2VudHJ5X2NudF9taW51c19vbmVdLgorCQkJCQkJCQlieXRlcyk7CisJCQkJCQlkYXRhX2NudCAtPQorCQkJCQkJICAgIChBU0NfRENOVCkgZXh0cmFfYnl0ZXM7CisJCQkJCQlzZ19oZWFkLT4KKwkJCQkJCSAgICBzZ19saXN0CisJCQkJCQkgICAgW3NnX2VudHJ5X2NudF9taW51c19vbmVdLgorCQkJCQkJICAgIGJ5dGVzID0KKwkJCQkJCSAgICBjcHVfdG9fbGUzMihkYXRhX2NudCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJc2dfaGVhZC0+ZW50cnlfdG9fY29weSA9IHNnX2hlYWQtPmVudHJ5X2NudDsKICNpZiBDQ19WRVJZX0xPTkdfU0dfTElTVAotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIHNnX2VudHJ5X2NudCB0byB0aGUgbWF4aW11bSBwb3NzaWJsZS4gVGhlIHJlc3Qgb2YKLSAgICAgICAgICogdGhlIFNHIGVsZW1lbnRzIHdpbGwgYmUgY29waWVkIHdoZW4gdGhlIFJJU0MgY29tcGxldGVzIHRoZQotICAgICAgICAgKiBTRyBlbGVtZW50cyB0aGF0IGZpdCBhbmQgaGFsdHMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc2dfZW50cnlfY250ID4gQVNDX01BWF9TR19MSVNUKQotICAgICAgICB7Ci0gICAgICAgICAgICAgc2dfZW50cnlfY250ID0gQVNDX01BWF9TR19MSVNUOwotICAgICAgICB9CisJCS8qCisJCSAqIFNldCB0aGUgc2dfZW50cnlfY250IHRvIHRoZSBtYXhpbXVtIHBvc3NpYmxlLiBUaGUgcmVzdCBvZgorCQkgKiB0aGUgU0cgZWxlbWVudHMgd2lsbCBiZSBjb3BpZWQgd2hlbiB0aGUgUklTQyBjb21wbGV0ZXMgdGhlCisJCSAqIFNHIGVsZW1lbnRzIHRoYXQgZml0IGFuZCBoYWx0cy4KKwkJICovCisJCWlmIChzZ19lbnRyeV9jbnQgPiBBU0NfTUFYX1NHX0xJU1QpIHsKKwkJCXNnX2VudHJ5X2NudCA9IEFTQ19NQVhfU0dfTElTVDsKKwkJfQogI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCi0gICAgICAgIG5fcV9yZXF1aXJlZCA9IEFzY1NnTGlzdFRvUXVldWUoc2dfZW50cnlfY250KTsKLSAgICAgICAgaWYgKChBc2NHZXROdW1PZkZyZWVRdWV1ZShhc2NfZHZjLCB0YXJnZXRfaXgsIG5fcV9yZXF1aXJlZCkgPj0KLSAgICAgICAgICAgICh1aW50KSBuX3FfcmVxdWlyZWQpIHx8ICgoc2NzaXEtPnExLmNudGwgJiBRQ19VUkdFTlQpICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoKHN0YSA9IEFzY1NlbmRTY3NpUXVldWUoYXNjX2R2Yywgc2NzaXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9xX3JlcXVpcmVkKSkgPT0gMSkgewotICAgICAgICAgICAgICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOwotICAgICAgICAgICAgICAgIGlmIChhc2NfZXhlX2NhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgKCphc2NfZXhlX2NhbGxiYWNrKSAoYXNjX2R2Yywgc2NzaXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHN0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsKSB7Ci0gICAgICAgICAgICBpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsICYgQVNDX0JVR19GSVhfSUZfTk9UX0RXQikgewotICAgICAgICAgICAgICAgIGlmICgoc2NzaV9jbWQgPT0gUkVBRF82KSB8fAotICAgICAgICAgICAgICAgICAgICAoc2NzaV9jbWQgPT0gUkVBRF8xMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2FkZHIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2NudCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2J5dGVzID0gKHVjaGFyKSAoKHVzaG9ydCkgYWRkciAmIDB4MDAwMyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZXh0cmFfYnl0ZXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgoc2NzaXEtPnEyLnRhZ19jb2RlICYgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTKQotICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jbnQgPSBsZTMyX3RvX2NwdShzY3NpcS0+cTEuZGF0YV9jbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgodXNob3J0KSBkYXRhX2NudCAmIDB4MDFGRikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjc2lxLT5xMi50YWdfY29kZSB8PSBBU0NfVEFHX0ZMQUdfRVhUUkFfQllURVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jbnQgLT0gKEFTQ19EQ05UKSBleHRyYV9ieXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSBjcHVfdG9fbGUzMihkYXRhX2NudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPnExLmV4dHJhX2J5dGVzID0gZXh0cmFfYnl0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbl9xX3JlcXVpcmVkID0gMTsKLSAgICAgICAgaWYgKChBc2NHZXROdW1PZkZyZWVRdWV1ZShhc2NfZHZjLCB0YXJnZXRfaXgsIDEpID49IDEpIHx8Ci0gICAgICAgICAgICAoKHNjc2lxLT5xMS5jbnRsICYgUUNfVVJHRU5UKSAhPSAwKSkgewotICAgICAgICAgICAgaWYgKChzdGEgPSBBc2NTZW5kU2NzaVF1ZXVlKGFzY19kdmMsIHNjc2lxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fcV9yZXF1aXJlZCkpID09IDEpIHsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5pbl9jcml0aWNhbF9jbnQtLTsKLSAgICAgICAgICAgICAgICBpZiAoYXNjX2V4ZV9jYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICgqYXNjX2V4ZV9jYWxsYmFjaykgKGFzY19kdmMsIHNjc2lxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChzdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOwotICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOwotICAgIHJldHVybiAoc3RhKTsKKwkJbl9xX3JlcXVpcmVkID0gQXNjU2dMaXN0VG9RdWV1ZShzZ19lbnRyeV9jbnQpOworCQlpZiAoKEFzY0dldE51bU9mRnJlZVF1ZXVlKGFzY19kdmMsIHRhcmdldF9peCwgbl9xX3JlcXVpcmVkKSA+PQorCQkgICAgICh1aW50KSBuX3FfcmVxdWlyZWQpCisJCSAgICB8fCAoKHNjc2lxLT5xMS5jbnRsICYgUUNfVVJHRU5UKSAhPSAwKSkgeworCQkJaWYgKChzdGEgPQorCQkJICAgICBBc2NTZW5kU2NzaVF1ZXVlKGFzY19kdmMsIHNjc2lxLAorCQkJCQkgICAgICBuX3FfcmVxdWlyZWQpKSA9PSAxKSB7CisJCQkJYXNjX2R2Yy0+aW5fY3JpdGljYWxfY250LS07CisJCQkJaWYgKGFzY19leGVfY2FsbGJhY2sgIT0gMCkgeworCQkJCQkoKmFzY19leGVfY2FsbGJhY2spIChhc2NfZHZjLCBzY3NpcSk7CisJCQkJfQorCQkJCUR2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworCQkJCXJldHVybiAoc3RhKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChhc2NfZHZjLT5idWdfZml4X2NudGwpIHsKKwkJCWlmIChhc2NfZHZjLT5idWdfZml4X2NudGwgJiBBU0NfQlVHX0ZJWF9JRl9OT1RfRFdCKSB7CisJCQkJaWYgKChzY3NpX2NtZCA9PSBSRUFEXzYpIHx8CisJCQkJICAgIChzY3NpX2NtZCA9PSBSRUFEXzEwKSkgeworCQkJCQlhZGRyID0KKwkJCQkJICAgIGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2FkZHIpICsKKwkJCQkJICAgIGxlMzJfdG9fY3B1KHNjc2lxLT5xMS5kYXRhX2NudCk7CisJCQkJCWV4dHJhX2J5dGVzID0KKwkJCQkJICAgICh1Y2hhcikoKHVzaG9ydClhZGRyICYgMHgwMDAzKTsKKwkJCQkJaWYgKChleHRyYV9ieXRlcyAhPSAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgICgoc2NzaXEtPnEyLgorCQkJCQkgICAgICB0YWdfY29kZSAmCisJCQkJCSAgICAgIEFTQ19UQUdfRkxBR19FWFRSQV9CWVRFUykKKwkJCQkJICAgICA9PSAwKSkgeworCQkJCQkJZGF0YV9jbnQgPQorCQkJCQkJICAgIGxlMzJfdG9fY3B1KHNjc2lxLT5xMS4KKwkJCQkJCQkJZGF0YV9jbnQpOworCQkJCQkJaWYgKCgodXNob3J0KWRhdGFfY250ICYgMHgwMUZGKQorCQkJCQkJICAgID09IDApIHsKKwkJCQkJCQlzY3NpcS0+cTIudGFnX2NvZGUgfD0KKwkJCQkJCQkgICAgQVNDX1RBR19GTEFHX0VYVFJBX0JZVEVTOworCQkJCQkJCWRhdGFfY250IC09IChBU0NfRENOVCkKKwkJCQkJCQkgICAgZXh0cmFfYnl0ZXM7CisJCQkJCQkJc2NzaXEtPnExLmRhdGFfY250ID0KKwkJCQkJCQkgICAgY3B1X3RvX2xlMzIKKwkJCQkJCQkgICAgKGRhdGFfY250KTsKKwkJCQkJCQlzY3NpcS0+cTEuZXh0cmFfYnl0ZXMgPQorCQkJCQkJCSAgICBleHRyYV9ieXRlczsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQluX3FfcmVxdWlyZWQgPSAxOworCQlpZiAoKEFzY0dldE51bU9mRnJlZVF1ZXVlKGFzY19kdmMsIHRhcmdldF9peCwgMSkgPj0gMSkgfHwKKwkJICAgICgoc2NzaXEtPnExLmNudGwgJiBRQ19VUkdFTlQpICE9IDApKSB7CisJCQlpZiAoKHN0YSA9IEFzY1NlbmRTY3NpUXVldWUoYXNjX2R2Yywgc2NzaXEsCisJCQkJCQkgICAgbl9xX3JlcXVpcmVkKSkgPT0gMSkgeworCQkJCWFzY19kdmMtPmluX2NyaXRpY2FsX2NudC0tOworCQkJCWlmIChhc2NfZXhlX2NhbGxiYWNrICE9IDApIHsKKwkJCQkJKCphc2NfZXhlX2NhbGxiYWNrKSAoYXNjX2R2Yywgc2NzaXEpOworCQkJCX0KKwkJCQlEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKwkJCQlyZXR1cm4gKHN0YSk7CisJCQl9CisJCX0KKwl9CisJYXNjX2R2Yy0+aW5fY3JpdGljYWxfY250LS07CisJRHZjTGVhdmVDcml0aWNhbChsYXN0X2ludF9sZXZlbCk7CisJcmV0dXJuIChzdGEpOwogfQogCi1TVEFUSUMgaW50Ci1Bc2NTZW5kU2NzaVF1ZXVlKAotICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgQVNDX1NDU0lfUSAqc2NzaXEsCi0gICAgICAgICAgICAgICAgICAgIHVjaGFyIG5fcV9yZXF1aXJlZAotKQorc3RhdGljIGludAorQXNjU2VuZFNjc2lRdWV1ZShBU0NfRFZDX1ZBUiAqYXNjX2R2YywgQVNDX1NDU0lfUSAqc2NzaXEsIHVjaGFyIG5fcV9yZXF1aXJlZCkKIHsKLSAgICBQb3J0QWRkciAgICAgICAgICAgIGlvcF9iYXNlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgZnJlZV9xX2hlYWQ7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBuZXh0X3FwOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGFyZ2V0X2l4OwotICAgIGludCAgICAgICAgICAgICAgICAgc3RhOworCVBvcnRBZGRyIGlvcF9iYXNlOworCXVjaGFyIGZyZWVfcV9oZWFkOworCXVjaGFyIG5leHRfcXA7CisJdWNoYXIgdGlkX25vOworCXVjaGFyIHRhcmdldF9peDsKKwlpbnQgc3RhOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICB0YXJnZXRfaXggPSBzY3NpcS0+cTIudGFyZ2V0X2l4OwotICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHRhcmdldF9peCk7Ci0gICAgc3RhID0gMDsKLSAgICBmcmVlX3FfaGVhZCA9ICh1Y2hhcikgQXNjR2V0VmFyRnJlZVFIZWFkKGlvcF9iYXNlKTsKLSAgICBpZiAobl9xX3JlcXVpcmVkID4gMSkgewotICAgICAgICBpZiAoKG5leHRfcXAgPSBBc2NBbGxvY011bHRpcGxlRnJlZVF1ZXVlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9xX2hlYWQsICh1Y2hhcikgKG5fcV9yZXF1aXJlZCkpKQotICAgICAgICAgICAgIT0gKHVjaGFyKSBBU0NfUUxJTktfRU5EKSB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSAwOwotICAgICAgICAgICAgc2NzaXEtPnNnX2hlYWQtPnF1ZXVlX2NudCA9IG5fcV9yZXF1aXJlZCAtIDE7Ci0gICAgICAgICAgICBzY3NpcS0+cTEucV9ubyA9IGZyZWVfcV9oZWFkOwotICAgICAgICAgICAgaWYgKChzdGEgPSBBc2NQdXRSZWFkeVNnTGlzdFF1ZXVlKGFzY19kdmMsIHNjc2lxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcV9oZWFkKSkgPT0gMSkgewotICAgICAgICAgICAgICAgIEFzY1B1dFZhckZyZWVRSGVhZChpb3BfYmFzZSwgbmV4dF9xcCk7Ci0gICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyArPSAodWNoYXIpIChuX3FfcmVxdWlyZWQpOwotICAgICAgICAgICAgICAgIGFzY19kdmMtPmN1cl9kdmNfcW5nW3RpZF9ub10rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RhKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobl9xX3JlcXVpcmVkID09IDEpIHsKLSAgICAgICAgaWYgKChuZXh0X3FwID0gQXNjQWxsb2NGcmVlUXVldWUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcV9oZWFkKSkgIT0gQVNDX1FMSU5LX0VORCkgewotICAgICAgICAgICAgc2NzaXEtPnExLnFfbm8gPSBmcmVlX3FfaGVhZDsKLSAgICAgICAgICAgIGlmICgoc3RhID0gQXNjUHV0UmVhZHlRdWV1ZShhc2NfZHZjLCBzY3NpcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3FfaGVhZCkpID09IDEpIHsKLSAgICAgICAgICAgICAgICBBc2NQdXRWYXJGcmVlUUhlYWQoaW9wX2Jhc2UsIG5leHRfcXApOwotICAgICAgICAgICAgICAgIGFzY19kdmMtPmN1cl90b3RhbF9xbmcrKzsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5jdXJfZHZjX3FuZ1t0aWRfbm9dKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHN0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChzdGEpOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJdGFyZ2V0X2l4ID0gc2NzaXEtPnEyLnRhcmdldF9peDsKKwl0aWRfbm8gPSBBU0NfVElYX1RPX1RJRCh0YXJnZXRfaXgpOworCXN0YSA9IDA7CisJZnJlZV9xX2hlYWQgPSAodWNoYXIpQXNjR2V0VmFyRnJlZVFIZWFkKGlvcF9iYXNlKTsKKwlpZiAobl9xX3JlcXVpcmVkID4gMSkgeworCQlpZiAoKG5leHRfcXAgPSBBc2NBbGxvY011bHRpcGxlRnJlZVF1ZXVlKGlvcF9iYXNlLAorCQkJCQkJCSBmcmVlX3FfaGVhZCwgKHVjaGFyKQorCQkJCQkJCSAobl9xX3JlcXVpcmVkKSkpCisJCSAgICAhPSAodWNoYXIpQVNDX1FMSU5LX0VORCkgeworCQkJYXNjX2R2Yy0+bGFzdF9xX3Nob3J0YWdlID0gMDsKKwkJCXNjc2lxLT5zZ19oZWFkLT5xdWV1ZV9jbnQgPSBuX3FfcmVxdWlyZWQgLSAxOworCQkJc2NzaXEtPnExLnFfbm8gPSBmcmVlX3FfaGVhZDsKKwkJCWlmICgoc3RhID0gQXNjUHV0UmVhZHlTZ0xpc3RRdWV1ZShhc2NfZHZjLCBzY3NpcSwKKwkJCQkJCQkgIGZyZWVfcV9oZWFkKSkgPT0gMSkgeworCQkJCUFzY1B1dFZhckZyZWVRSGVhZChpb3BfYmFzZSwgbmV4dF9xcCk7CisJCQkJYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyArPSAodWNoYXIpKG5fcV9yZXF1aXJlZCk7CisJCQkJYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSsrOworCQkJfQorCQkJcmV0dXJuIChzdGEpOworCQl9CisJfSBlbHNlIGlmIChuX3FfcmVxdWlyZWQgPT0gMSkgeworCQlpZiAoKG5leHRfcXAgPSBBc2NBbGxvY0ZyZWVRdWV1ZShpb3BfYmFzZSwKKwkJCQkJCSBmcmVlX3FfaGVhZCkpICE9CisJCSAgICBBU0NfUUxJTktfRU5EKSB7CisJCQlzY3NpcS0+cTEucV9ubyA9IGZyZWVfcV9oZWFkOworCQkJaWYgKChzdGEgPSBBc2NQdXRSZWFkeVF1ZXVlKGFzY19kdmMsIHNjc2lxLAorCQkJCQkJICAgIGZyZWVfcV9oZWFkKSkgPT0gMSkgeworCQkJCUFzY1B1dFZhckZyZWVRSGVhZChpb3BfYmFzZSwgbmV4dF9xcCk7CisJCQkJYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZysrOworCQkJCWFzY19kdmMtPmN1cl9kdmNfcW5nW3RpZF9ub10rKzsKKwkJCX0KKwkJCXJldHVybiAoc3RhKTsKKwkJfQorCX0KKwlyZXR1cm4gKHN0YSk7CiB9CiAKLVNUQVRJQyBpbnQKLUFzY1NnTGlzdFRvUXVldWUoCi0gICAgICAgICAgICAgICAgICAgIGludCBzZ19saXN0Ci0pCitzdGF0aWMgaW50IEFzY1NnTGlzdFRvUXVldWUoaW50IHNnX2xpc3QpCiB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBuX3NnX2xpc3RfcXM7CisJaW50IG5fc2dfbGlzdF9xczsKIAotICAgIG5fc2dfbGlzdF9xcyA9ICgoc2dfbGlzdCAtIDEpIC8gQVNDX1NHX0xJU1RfUEVSX1EpOwotICAgIGlmICgoKHNnX2xpc3QgLSAxKSAlIEFTQ19TR19MSVNUX1BFUl9RKSAhPSAwKQotICAgICAgICBuX3NnX2xpc3RfcXMrKzsKLSAgICByZXR1cm4gKG5fc2dfbGlzdF9xcyArIDEpOworCW5fc2dfbGlzdF9xcyA9ICgoc2dfbGlzdCAtIDEpIC8gQVNDX1NHX0xJU1RfUEVSX1EpOworCWlmICgoKHNnX2xpc3QgLSAxKSAlIEFTQ19TR19MSVNUX1BFUl9RKSAhPSAwKQorCQluX3NnX2xpc3RfcXMrKzsKKwlyZXR1cm4gKG5fc2dfbGlzdF9xcyArIDEpOwogfQogCi0KLVNUQVRJQyB1aW50Ci1Bc2NHZXROdW1PZkZyZWVRdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAotICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgdGFyZ2V0X2l4LAotICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgbl9xcwotKQorc3RhdGljIHVpbnQKK0FzY0dldE51bU9mRnJlZVF1ZXVlKEFTQ19EVkNfVkFSICphc2NfZHZjLCB1Y2hhciB0YXJnZXRfaXgsIHVjaGFyIG5fcXMpCiB7Ci0gICAgdWludCAgICAgICAgICAgICAgICBjdXJfdXNlZF9xczsKLSAgICB1aW50ICAgICAgICAgICAgICAgIGN1cl9mcmVlX3FzOwotICAgIEFTQ19TQ1NJX0JJVF9JRF9UWVBFIHRhcmdldF9pZDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHRpZF9ubzsKKwl1aW50IGN1cl91c2VkX3FzOworCXVpbnQgY3VyX2ZyZWVfcXM7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgdGFyZ2V0X2lkOworCXVjaGFyIHRpZF9ubzsKIAotICAgIHRhcmdldF9pZCA9IEFTQ19USVhfVE9fVEFSR0VUX0lEKHRhcmdldF9peCk7Ci0gICAgdGlkX25vID0gQVNDX1RJWF9UT19USUQodGFyZ2V0X2l4KTsKLSAgICBpZiAoKGFzY19kdmMtPnVuaXRfbm90X3JlYWR5ICYgdGFyZ2V0X2lkKSB8fAotICAgICAgICAoYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ICYgdGFyZ2V0X2lkKSkgewotICAgICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgICBpZiAobl9xcyA9PSAxKSB7Ci0gICAgICAgIGN1cl91c2VkX3FzID0gKHVpbnQpIGFzY19kdmMtPmN1cl90b3RhbF9xbmcgKwotICAgICAgICAgICh1aW50KSBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgKwotICAgICAgICAgICh1aW50KSBBU0NfTUlOX0ZSRUVfUTsKLSAgICB9IGVsc2UgewotICAgICAgICBjdXJfdXNlZF9xcyA9ICh1aW50KSBhc2NfZHZjLT5jdXJfdG90YWxfcW5nICsKLSAgICAgICAgICAodWludCkgQVNDX01JTl9GUkVFX1E7Ci0gICAgfQotICAgIGlmICgodWludCkgKGN1cl91c2VkX3FzICsgbl9xcykgPD0gKHVpbnQpIGFzY19kdmMtPm1heF90b3RhbF9xbmcpIHsKLSAgICAgICAgY3VyX2ZyZWVfcXMgPSAodWludCkgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyAtIGN1cl91c2VkX3FzOwotICAgICAgICBpZiAoYXNjX2R2Yy0+Y3VyX2R2Y19xbmdbdGlkX25vXSA+PQotICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSkgewotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGN1cl9mcmVlX3FzKTsKLSAgICB9Ci0gICAgaWYgKG5fcXMgPiAxKSB7Ci0gICAgICAgIGlmICgobl9xcyA+IGFzY19kdmMtPmxhc3RfcV9zaG9ydGFnZSkgJiYgKG5fcXMgPD0gKGFzY19kdmMtPm1heF90b3RhbF9xbmcgLSBBU0NfTUlOX0ZSRUVfUSkpKSB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSBuX3FzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisJdGFyZ2V0X2lkID0gQVNDX1RJWF9UT19UQVJHRVRfSUQodGFyZ2V0X2l4KTsKKwl0aWRfbm8gPSBBU0NfVElYX1RPX1RJRCh0YXJnZXRfaXgpOworCWlmICgoYXNjX2R2Yy0+dW5pdF9ub3RfcmVhZHkgJiB0YXJnZXRfaWQpIHx8CisJICAgIChhc2NfZHZjLT5xdWV1ZV9mdWxsX29yX2J1c3kgJiB0YXJnZXRfaWQpKSB7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChuX3FzID09IDEpIHsKKwkJY3VyX3VzZWRfcXMgPSAodWludCkgYXNjX2R2Yy0+Y3VyX3RvdGFsX3FuZyArCisJCSAgICAodWludCkgYXNjX2R2Yy0+bGFzdF9xX3Nob3J0YWdlICsgKHVpbnQpIEFTQ19NSU5fRlJFRV9ROworCX0gZWxzZSB7CisJCWN1cl91c2VkX3FzID0gKHVpbnQpIGFzY19kdmMtPmN1cl90b3RhbF9xbmcgKworCQkgICAgKHVpbnQpIEFTQ19NSU5fRlJFRV9ROworCX0KKwlpZiAoKHVpbnQpIChjdXJfdXNlZF9xcyArIG5fcXMpIDw9ICh1aW50KSBhc2NfZHZjLT5tYXhfdG90YWxfcW5nKSB7CisJCWN1cl9mcmVlX3FzID0gKHVpbnQpIGFzY19kdmMtPm1heF90b3RhbF9xbmcgLSBjdXJfdXNlZF9xczsKKwkJaWYgKGFzY19kdmMtPmN1cl9kdmNfcW5nW3RpZF9ub10gPj0KKwkJICAgIGFzY19kdmMtPm1heF9kdmNfcW5nW3RpZF9ub10pIHsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcmV0dXJuIChjdXJfZnJlZV9xcyk7CisJfQorCWlmIChuX3FzID4gMSkgeworCQlpZiAoKG5fcXMgPiBhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UpCisJCSAgICAmJiAobl9xcyA8PSAoYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyAtIEFTQ19NSU5fRlJFRV9RKSkpIHsKKwkJCWFzY19kdmMtPmxhc3RfcV9zaG9ydGFnZSA9IG5fcXM7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKIH0KIAotU1RBVElDIGludAotQXNjUHV0UmVhZHlRdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICAgICAgIEFTQ19TQ1NJX1EgKnNjc2lxLAotICAgICAgICAgICAgICAgICAgICB1Y2hhciBxX25vCi0pCitzdGF0aWMgaW50IEFzY1B1dFJlYWR5UXVldWUoQVNDX0RWQ19WQVIgKmFzY19kdmMsIEFTQ19TQ1NJX1EgKnNjc2lxLCB1Y2hhciBxX25vKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgdGlkX25vOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc2R0cl9kYXRhOwotICAgIHVjaGFyICAgICAgICAgICAgICAgc3luX3BlcmlvZF9peDsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHN5bl9vZmZzZXQ7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKKwl1c2hvcnQgcV9hZGRyOworCXVjaGFyIHRpZF9ubzsKKwl1Y2hhciBzZHRyX2RhdGE7CisJdWNoYXIgc3luX3BlcmlvZF9peDsKKwl1Y2hhciBzeW5fb2Zmc2V0OworCVBvcnRBZGRyIGlvcF9iYXNlOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICBpZiAoKChhc2NfZHZjLT5pbml0X3NkdHIgJiBzY3NpcS0+cTEudGFyZ2V0X2lkKSAhPSAwKSAmJgotICAgICAgICAoKGFzY19kdmMtPnNkdHJfZG9uZSAmIHNjc2lxLT5xMS50YXJnZXRfaWQpID09IDApKSB7Ci0gICAgICAgIHRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHNjc2lxLT5xMi50YXJnZXRfaXgpOwotICAgICAgICBzZHRyX2RhdGEgPSBBc2NHZXRNQ29kZUluaXRTRFRSQXRJRChpb3BfYmFzZSwgdGlkX25vKTsKLSAgICAgICAgc3luX3BlcmlvZF9peCA9IChzZHRyX2RhdGEgPj4gNCkgJiAoYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggLSAxKTsKLSAgICAgICAgc3luX29mZnNldCA9IHNkdHJfZGF0YSAmIEFTQ19TWU5fTUFYX09GRlNFVDsKLSAgICAgICAgQXNjTXNnT3V0U0RUUihhc2NfZHZjLAotICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSwKLSAgICAgICAgICAgICAgICAgICAgICBzeW5fb2Zmc2V0KTsKLSAgICAgICAgc2NzaXEtPnExLmNudGwgfD0gUUNfTVNHX09VVDsKLSAgICB9Ci0gICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihxX25vKTsKLSAgICBpZiAoKHNjc2lxLT5xMS50YXJnZXRfaWQgJiBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZykgPT0gMCkgewotICAgICAgICBzY3NpcS0+cTIudGFnX2NvZGUgJj0gfk1TR19TSU1QTEVfVEFHIDsKLSAgICB9Ci0gICAgc2NzaXEtPnExLnN0YXR1cyA9IFFTX0ZSRUU7Ci0gICAgQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX0NEQl9CRUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopIHNjc2lxLT5jZGJwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2NzaXEtPnEyLmNkYl9sZW4gPj4gMSk7CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwlpZiAoKChhc2NfZHZjLT5pbml0X3NkdHIgJiBzY3NpcS0+cTEudGFyZ2V0X2lkKSAhPSAwKSAmJgorCSAgICAoKGFzY19kdmMtPnNkdHJfZG9uZSAmIHNjc2lxLT5xMS50YXJnZXRfaWQpID09IDApKSB7CisJCXRpZF9ubyA9IEFTQ19USVhfVE9fVElEKHNjc2lxLT5xMi50YXJnZXRfaXgpOworCQlzZHRyX2RhdGEgPSBBc2NHZXRNQ29kZUluaXRTRFRSQXRJRChpb3BfYmFzZSwgdGlkX25vKTsKKwkJc3luX3BlcmlvZF9peCA9CisJCSAgICAoc2R0cl9kYXRhID4+IDQpICYgKGFzY19kdmMtPm1heF9zZHRyX2luZGV4IC0gMSk7CisJCXN5bl9vZmZzZXQgPSBzZHRyX2RhdGEgJiBBU0NfU1lOX01BWF9PRkZTRVQ7CisJCUFzY01zZ091dFNEVFIoYXNjX2R2YywKKwkJCSAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFtzeW5fcGVyaW9kX2l4XSwKKwkJCSAgICAgIHN5bl9vZmZzZXQpOworCQlzY3NpcS0+cTEuY250bCB8PSBRQ19NU0dfT1VUOworCX0KKwlxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHFfbm8pOworCWlmICgoc2NzaXEtPnExLnRhcmdldF9pZCAmIGFzY19kdmMtPnVzZV90YWdnZWRfcW5nKSA9PSAwKSB7CisJCXNjc2lxLT5xMi50YWdfY29kZSAmPSB+TVNHX1NJTVBMRV9UQUc7CisJfQorCXNjc2lxLT5xMS5zdGF0dXMgPSBRU19GUkVFOworCUFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorCQkJCXFfYWRkciArIEFTQ19TQ1NJUV9DREJfQkVHLAorCQkJCSh1Y2hhciAqKXNjc2lxLT5jZGJwdHIsIHNjc2lxLT5xMi5jZGJfbGVuID4+IDEpOwogCi0gICAgRHZjUHV0U2NzaVEoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgcV9hZGRyICsgQVNDX1NDU0lRX0NQWV9CRUcsCi0gICAgICAgICAgICAgICAgKHVjaGFyICopICZzY3NpcS0+cTEuY250bCwKLSAgICAgICAgICAgICAgICAoKHNpemVvZihBU0NfU0NTSVFfMSkgKyBzaXplb2YoQVNDX1NDU0lRXzIpKSAvIDIpIC0gMSk7Ci0gICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9TVEFUVVMpLAotICAgICAgICAgICAgICh1c2hvcnQpICgoKHVzaG9ydCkgc2NzaXEtPnExLnFfbm8gPDwgOCkgfCAodXNob3J0KSBRU19SRUFEWSkpOwotICAgIHJldHVybiAoMSk7CisJRHZjUHV0U2NzaVEoaW9wX2Jhc2UsCisJCSAgICBxX2FkZHIgKyBBU0NfU0NTSVFfQ1BZX0JFRywKKwkJICAgICh1Y2hhciAqKSZzY3NpcS0+cTEuY250bCwKKwkJICAgICgoc2l6ZW9mKEFTQ19TQ1NJUV8xKSArIHNpemVvZihBU0NfU0NTSVFfMikpIC8gMikgLSAxKTsKKwlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLAorCQkJICh1c2hvcnQpKHFfYWRkciArICh1c2hvcnQpQVNDX1NDU0lRX0JfU1RBVFVTKSwKKwkJCSAodXNob3J0KSgoKHVzaG9ydClzY3NpcS0+cTEuCisJCQkJICAgcV9ubyA8PCA4KSB8ICh1c2hvcnQpUVNfUkVBRFkpKTsKKwlyZXR1cm4gKDEpOwogfQogCi1TVEFUSUMgaW50Ci1Bc2NQdXRSZWFkeVNnTGlzdFF1ZXVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1NDU0lfUSAqc2NzaXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIHFfbm8KLSkKK3N0YXRpYyBpbnQKK0FzY1B1dFJlYWR5U2dMaXN0UXVldWUoQVNDX0RWQ19WQVIgKmFzY19kdmMsIEFTQ19TQ1NJX1EgKnNjc2lxLCB1Y2hhciBxX25vKQogewotICAgIGludCAgICAgICAgICAgICAgICAgc3RhOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBBU0NfU0dfSEVBRCAqc2dfaGVhZDsKLSAgICBBU0NfU0dfTElTVF9RICAgICAgIHNjc2lfc2dfcTsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIHNhdmVkX2RhdGFfYWRkcjsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIHNhdmVkX2RhdGFfY250OwotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkczsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHNnX2luZGV4OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgc2dfZW50cnlfY250OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgcV9hZGRyOwotICAgIHVjaGFyICAgICAgICAgICAgICAgbmV4dF9xcDsKKwlpbnQgc3RhOworCWludCBpOworCUFTQ19TR19IRUFEICpzZ19oZWFkOworCUFTQ19TR19MSVNUX1Egc2NzaV9zZ19xOworCUFTQ19EQ05UIHNhdmVkX2RhdGFfYWRkcjsKKwlBU0NfRENOVCBzYXZlZF9kYXRhX2NudDsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwl1c2hvcnQgc2dfbGlzdF9kd29yZHM7CisJdXNob3J0IHNnX2luZGV4OworCXVzaG9ydCBzZ19lbnRyeV9jbnQ7CisJdXNob3J0IHFfYWRkcjsKKwl1Y2hhciBuZXh0X3FwOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICBzZ19oZWFkID0gc2NzaXEtPnNnX2hlYWQ7Ci0gICAgc2F2ZWRfZGF0YV9hZGRyID0gc2NzaXEtPnExLmRhdGFfYWRkcjsKLSAgICBzYXZlZF9kYXRhX2NudCA9IHNjc2lxLT5xMS5kYXRhX2NudDsKLSAgICBzY3NpcS0+cTEuZGF0YV9hZGRyID0gKEFTQ19QQUREUikgc2dfaGVhZC0+c2dfbGlzdFswXS5hZGRyOwotICAgIHNjc2lxLT5xMS5kYXRhX2NudCA9IChBU0NfRENOVCkgc2dfaGVhZC0+c2dfbGlzdFswXS5ieXRlczsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCXNnX2hlYWQgPSBzY3NpcS0+c2dfaGVhZDsKKwlzYXZlZF9kYXRhX2FkZHIgPSBzY3NpcS0+cTEuZGF0YV9hZGRyOworCXNhdmVkX2RhdGFfY250ID0gc2NzaXEtPnExLmRhdGFfY250OworCXNjc2lxLT5xMS5kYXRhX2FkZHIgPSAoQVNDX1BBRERSKSBzZ19oZWFkLT5zZ19saXN0WzBdLmFkZHI7CisJc2NzaXEtPnExLmRhdGFfY250ID0gKEFTQ19EQ05UKSBzZ19oZWFkLT5zZ19saXN0WzBdLmJ5dGVzOwogI2lmIENDX1ZFUllfTE9OR19TR19MSVNUCi0gICAgLyoKLSAgICAgKiBJZiBzZ19oZWFkLT5lbnRyeV9jbnQgaXMgZ3JlYXRlciB0aGFuIEFTQ19NQVhfU0dfTElTVAotICAgICAqIHRoZW4gbm90IGFsbCBTRyBlbGVtZW50cyB3aWxsIGZpdCBpbiB0aGUgYWxsb2NhdGVkIHF1ZXVlcy4KLSAgICAgKiBUaGUgcmVzdCBvZiB0aGUgU0cgZWxlbWVudHMgd2lsbCBiZSBjb3BpZWQgd2hlbiB0aGUgUklTQwotICAgICAqIGNvbXBsZXRlcyB0aGUgU0cgZWxlbWVudHMgdGhhdCBmaXQgYW5kIGhhbHRzLgotICAgICAqLwotICAgIGlmIChzZ19oZWFkLT5lbnRyeV9jbnQgPiBBU0NfTUFYX1NHX0xJU1QpCi0gICAgewotICAgICAgICAgLyoKLSAgICAgICAgICAqIFNldCBzZ19lbnRyeV9jbnQgdG8gYmUgdGhlIG51bWJlciBvZiBTRyBlbGVtZW50cyB0aGF0Ci0gICAgICAgICAgKiB3aWxsIGZpdCBpbiB0aGUgYWxsb2NhdGVkIFNHIHF1ZXVlcy4gSXQgaXMgbWludXMgMSwgYmVjYXVzZQotICAgICAgICAgICogdGhlIGZpcnN0IFNHIGVsZW1lbnQgaXMgaGFuZGxlZCBhYm92ZS4gQVNDX01BWF9TR19MSVNUIGlzCi0gICAgICAgICAgKiBhbHJlYWR5IGluZmxhdGVkIGJ5IDEgdG8gYWNjb3VudCBmb3IgdGhpcy4gRm9yIGV4YW1wbGUgaXQKLSAgICAgICAgICAqIG1heSBiZSA1MCB3aGljaCBpcyAxICsgNyBxdWV1ZXMgKiA3IFNHIGVsZW1lbnRzLgotICAgICAgICAgICovCi0gICAgICAgICBzZ19lbnRyeV9jbnQgPSBBU0NfTUFYX1NHX0xJU1QgLSAxOworCS8qCisJICogSWYgc2dfaGVhZC0+ZW50cnlfY250IGlzIGdyZWF0ZXIgdGhhbiBBU0NfTUFYX1NHX0xJU1QKKwkgKiB0aGVuIG5vdCBhbGwgU0cgZWxlbWVudHMgd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZCBxdWV1ZXMuCisJICogVGhlIHJlc3Qgb2YgdGhlIFNHIGVsZW1lbnRzIHdpbGwgYmUgY29waWVkIHdoZW4gdGhlIFJJU0MKKwkgKiBjb21wbGV0ZXMgdGhlIFNHIGVsZW1lbnRzIHRoYXQgZml0IGFuZCBoYWx0cy4KKwkgKi8KKwlpZiAoc2dfaGVhZC0+ZW50cnlfY250ID4gQVNDX01BWF9TR19MSVNUKSB7CisJCS8qCisJCSAqIFNldCBzZ19lbnRyeV9jbnQgdG8gYmUgdGhlIG51bWJlciBvZiBTRyBlbGVtZW50cyB0aGF0CisJCSAqIHdpbGwgZml0IGluIHRoZSBhbGxvY2F0ZWQgU0cgcXVldWVzLiBJdCBpcyBtaW51cyAxLCBiZWNhdXNlCisJCSAqIHRoZSBmaXJzdCBTRyBlbGVtZW50IGlzIGhhbmRsZWQgYWJvdmUuIEFTQ19NQVhfU0dfTElTVCBpcworCQkgKiBhbHJlYWR5IGluZmxhdGVkIGJ5IDEgdG8gYWNjb3VudCBmb3IgdGhpcy4gRm9yIGV4YW1wbGUgaXQKKwkJICogbWF5IGJlIDUwIHdoaWNoIGlzIDEgKyA3IHF1ZXVlcyAqIDcgU0cgZWxlbWVudHMuCisJCSAqLworCQlzZ19lbnRyeV9jbnQgPSBBU0NfTUFYX1NHX0xJU1QgLSAxOwogCi0gICAgICAgICAvKgotICAgICAgICAgICogS2VlcCB0cmFjayBvZiByZW1haW5pbmcgbnVtYmVyIG9mIFNHIGVsZW1lbnRzIHRoYXQgd2lsbAotICAgICAgICAgICogbmVlZCB0byBiZSBoYW5kbGVkIGZyb20gYV9pc3IuYy4KLSAgICAgICAgICAqLwotICAgICAgICAgc2NzaXEtPnJlbWFpbl9zZ19lbnRyeV9jbnQgPSBzZ19oZWFkLT5lbnRyeV9jbnQgLSBBU0NfTUFYX1NHX0xJU1Q7Ci0gICAgfSBlbHNlCi0gICAgeworCQkvKgorCQkgKiBLZWVwIHRyYWNrIG9mIHJlbWFpbmluZyBudW1iZXIgb2YgU0cgZWxlbWVudHMgdGhhdCB3aWxsCisJCSAqIG5lZWQgdG8gYmUgaGFuZGxlZCBmcm9tIGFfaXNyLmMuCisJCSAqLworCQlzY3NpcS0+cmVtYWluX3NnX2VudHJ5X2NudCA9CisJCSAgICBzZ19oZWFkLT5lbnRyeV9jbnQgLSBBU0NfTUFYX1NHX0xJU1Q7CisJfSBlbHNlIHsKICNlbmRpZiAvKiBDQ19WRVJZX0xPTkdfU0dfTElTVCAqLwotICAgICAgICAgLyoKLSAgICAgICAgICAqIFNldCBzZ19lbnRyeV9jbnQgdG8gYmUgdGhlIG51bWJlciBvZiBTRyBlbGVtZW50cyB0aGF0Ci0gICAgICAgICAgKiB3aWxsIGZpdCBpbiB0aGUgYWxsb2NhdGVkIFNHIHF1ZXVlcy4gSXQgaXMgbWludXMgMSwgYmVjYXVzZQotICAgICAgICAgICogdGhlIGZpcnN0IFNHIGVsZW1lbnQgaXMgaGFuZGxlZCBhYm92ZS4KLSAgICAgICAgICAqLwotICAgICAgICAgc2dfZW50cnlfY250ID0gc2dfaGVhZC0+ZW50cnlfY250IC0gMTsKKwkJLyoKKwkJICogU2V0IHNnX2VudHJ5X2NudCB0byBiZSB0aGUgbnVtYmVyIG9mIFNHIGVsZW1lbnRzIHRoYXQKKwkJICogd2lsbCBmaXQgaW4gdGhlIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIEl0IGlzIG1pbnVzIDEsIGJlY2F1c2UKKwkJICogdGhlIGZpcnN0IFNHIGVsZW1lbnQgaXMgaGFuZGxlZCBhYm92ZS4KKwkJICovCisJCXNnX2VudHJ5X2NudCA9IHNnX2hlYWQtPmVudHJ5X2NudCAtIDE7CiAjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKLSAgICB9CisJfQogI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCi0gICAgaWYgKHNnX2VudHJ5X2NudCAhPSAwKSB7Ci0gICAgICAgIHNjc2lxLT5xMS5jbnRsIHw9IFFDX1NHX0hFQUQ7Ci0gICAgICAgIHFfYWRkciA9IEFTQ19RTk9fVE9fUUFERFIocV9ubyk7Ci0gICAgICAgIHNnX2luZGV4ID0gMTsKLSAgICAgICAgc2NzaXEtPnExLnNnX3F1ZXVlX2NudCA9IHNnX2hlYWQtPnF1ZXVlX2NudDsKLSAgICAgICAgc2NzaV9zZ19xLnNnX2hlYWRfcXAgPSBxX25vOwotICAgICAgICBzY3NpX3NnX3EuY250bCA9IFFDU0dfU0dfWEZFUl9MSVNUOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2dfaGVhZC0+cXVldWVfY250OyBpKyspIHsKLSAgICAgICAgICAgIHNjc2lfc2dfcS5zZXFfbm8gPSBpICsgMTsKLSAgICAgICAgICAgIGlmIChzZ19lbnRyeV9jbnQgPiBBU0NfU0dfTElTVF9QRVJfUSkgewotICAgICAgICAgICAgICAgIHNnX2xpc3RfZHdvcmRzID0gKHVjaGFyKSAoQVNDX1NHX0xJU1RfUEVSX1EgKiAyKTsKLSAgICAgICAgICAgICAgICBzZ19lbnRyeV9jbnQgLT0gQVNDX1NHX0xJU1RfUEVSX1E7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPSBBU0NfU0dfTElTVF9QRVJfUTsKLSAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9ROwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9IEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeworCWlmIChzZ19lbnRyeV9jbnQgIT0gMCkgeworCQlzY3NpcS0+cTEuY250bCB8PSBRQ19TR19IRUFEOworCQlxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKHFfbm8pOworCQlzZ19pbmRleCA9IDE7CisJCXNjc2lxLT5xMS5zZ19xdWV1ZV9jbnQgPSBzZ19oZWFkLT5xdWV1ZV9jbnQ7CisJCXNjc2lfc2dfcS5zZ19oZWFkX3FwID0gcV9ubzsKKwkJc2NzaV9zZ19xLmNudGwgPSBRQ1NHX1NHX1hGRVJfTElTVDsKKwkJZm9yIChpID0gMDsgaSA8IHNnX2hlYWQtPnF1ZXVlX2NudDsgaSsrKSB7CisJCQlzY3NpX3NnX3Euc2VxX25vID0gaSArIDE7CisJCQlpZiAoc2dfZW50cnlfY250ID4gQVNDX1NHX0xJU1RfUEVSX1EpIHsKKwkJCQlzZ19saXN0X2R3b3JkcyA9ICh1Y2hhcikoQVNDX1NHX0xJU1RfUEVSX1EgKiAyKTsKKwkJCQlzZ19lbnRyeV9jbnQgLT0gQVNDX1NHX0xJU1RfUEVSX1E7CisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQlzY3NpX3NnX3Euc2dfbGlzdF9jbnQgPQorCQkJCQkgICAgQVNDX1NHX0xJU1RfUEVSX1E7CisJCQkJCXNjc2lfc2dfcS5zZ19jdXJfbGlzdF9jbnQgPQorCQkJCQkgICAgQVNDX1NHX0xJU1RfUEVSX1E7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2NzaV9zZ19xLnNnX2xpc3RfY250ID0KKwkJCQkJICAgIEFTQ19TR19MSVNUX1BFUl9RIC0gMTsKKwkJCQkJc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9CisJCQkJCSAgICBBU0NfU0dfTElTVF9QRVJfUSAtIDE7CisJCQkJfQorCQkJfSBlbHNlIHsKICNpZiBDQ19WRVJZX0xPTkdfU0dfTElTVAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgbGFzdCBTRyBxdWV1ZSBpbiB0aGUgbGlzdCBvZgotICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIElmIHRoZXJlIGFyZSBtb3JlCi0gICAgICAgICAgICAgICAgICogU0cgZWxlbWVudHMgdGhhbiB3aWxsIGZpdCBpbiB0aGUgYWxsb2NhdGVkCi0gICAgICAgICAgICAgICAgICogcXVldWVzLCB0aGVuIHNldCB0aGUgUUNTR19TR19YRkVSX01PUkUgZmxhZy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc2dfaGVhZC0+ZW50cnlfY250ID4gQVNDX01BWF9TR19MSVNUKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLmNudGwgfD0gUUNTR19TR19YRkVSX01PUkU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgbGFzdCBTRyBxdWV1ZSBpbiB0aGUgbGlzdCBvZgorCQkJCSAqIGFsbG9jYXRlZCBTRyBxdWV1ZXMuIElmIHRoZXJlIGFyZSBtb3JlCisJCQkJICogU0cgZWxlbWVudHMgdGhhbiB3aWxsIGZpdCBpbiB0aGUgYWxsb2NhdGVkCisJCQkJICogcXVldWVzLCB0aGVuIHNldCB0aGUgUUNTR19TR19YRkVSX01PUkUgZmxhZy4KKwkJCQkgKi8KKwkJCQlpZiAoc2dfaGVhZC0+ZW50cnlfY250ID4gQVNDX01BWF9TR19MSVNUKSB7CisJCQkJCXNjc2lfc2dfcS5jbnRsIHw9IFFDU0dfU0dfWEZFUl9NT1JFOworCQkJCX0gZWxzZSB7CiAjZW5kaWYgLyogQ0NfVkVSWV9MT05HX1NHX0xJU1QgKi8KLSAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLmNudGwgfD0gUUNTR19TR19YRkVSX0VORDsKKwkJCQkJc2NzaV9zZ19xLmNudGwgfD0gUUNTR19TR19YRkVSX0VORDsKICNpZiBDQ19WRVJZX0xPTkdfU0dfTElTVAotICAgICAgICAgICAgICAgIH0KKwkJCQl9CiAjZW5kaWYgLyogQ0NfVkVSWV9MT05HX1NHX0xJU1QgKi8KLSAgICAgICAgICAgICAgICBzZ19saXN0X2R3b3JkcyA9IHNnX2VudHJ5X2NudCA8PCAxOwotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2NzaV9zZ19xLnNnX2xpc3RfY250ID0gc2dfZW50cnlfY250OwotICAgICAgICAgICAgICAgICAgICBzY3NpX3NnX3Euc2dfY3VyX2xpc3RfY250ID0gc2dfZW50cnlfY250OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19saXN0X2NudCA9IHNnX2VudHJ5X2NudCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIHNjc2lfc2dfcS5zZ19jdXJfbGlzdF9jbnQgPSBzZ19lbnRyeV9jbnQgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZ19lbnRyeV9jbnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dF9xcCA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCkpOwotICAgICAgICAgICAgc2NzaV9zZ19xLnFfbm8gPSBuZXh0X3FwOwotICAgICAgICAgICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihuZXh0X3FwKTsKLSAgICAgICAgICAgIEFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2FkZHIgKyBBU0NfU0NTSVFfU0dIRF9DUFlfQkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJnNjc2lfc2dfcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFTQ19TR19MSVNUX1EpID4+IDEpOwotICAgICAgICAgICAgQXNjTWVtRFdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX2FkZHIgKyBBU0NfU0dRX0xJU1RfQkVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIgKikgJnNnX2hlYWQtPnNnX2xpc3Rbc2dfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ19saXN0X2R3b3Jkcyk7Ci0gICAgICAgICAgICBzZ19pbmRleCArPSBBU0NfU0dfTElTVF9QRVJfUTsKLSAgICAgICAgICAgIHNjc2lxLT5uZXh0X3NnX2luZGV4ID0gc2dfaW5kZXg7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzY3NpcS0+cTEuY250bCAmPSB+UUNfU0dfSEVBRDsKLSAgICB9Ci0gICAgc3RhID0gQXNjUHV0UmVhZHlRdWV1ZShhc2NfZHZjLCBzY3NpcSwgcV9ubyk7Ci0gICAgc2NzaXEtPnExLmRhdGFfYWRkciA9IHNhdmVkX2RhdGFfYWRkcjsKLSAgICBzY3NpcS0+cTEuZGF0YV9jbnQgPSBzYXZlZF9kYXRhX2NudDsKLSAgICByZXR1cm4gKHN0YSk7CisJCQkJc2dfbGlzdF9kd29yZHMgPSBzZ19lbnRyeV9jbnQgPDwgMTsKKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCXNjc2lfc2dfcS5zZ19saXN0X2NudCA9IHNnX2VudHJ5X2NudDsKKwkJCQkJc2NzaV9zZ19xLnNnX2N1cl9saXN0X2NudCA9CisJCQkJCSAgICBzZ19lbnRyeV9jbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2NzaV9zZ19xLnNnX2xpc3RfY250ID0KKwkJCQkJICAgIHNnX2VudHJ5X2NudCAtIDE7CisJCQkJCXNjc2lfc2dfcS5zZ19jdXJfbGlzdF9jbnQgPQorCQkJCQkgICAgc2dfZW50cnlfY250IC0gMTsKKwkJCQl9CisJCQkJc2dfZW50cnlfY250ID0gMDsKKwkJCX0KKwkJCW5leHRfcXAgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsCisJCQkJCQkgICh1c2hvcnQpKHFfYWRkciArCisJCQkJCQkJICAgQVNDX1NDU0lRX0JfRldEKSk7CisJCQlzY3NpX3NnX3EucV9ubyA9IG5leHRfcXA7CisJCQlxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKG5leHRfcXApOworCQkJQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisJCQkJCQlxX2FkZHIgKyBBU0NfU0NTSVFfU0dIRF9DUFlfQkVHLAorCQkJCQkJKHVjaGFyICopJnNjc2lfc2dfcSwKKwkJCQkJCXNpemVvZihBU0NfU0dfTElTVF9RKSA+PiAxKTsKKwkJCUFzY01lbURXb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwKKwkJCQkJCSBxX2FkZHIgKyBBU0NfU0dRX0xJU1RfQkVHLAorCQkJCQkJICh1Y2hhciAqKSZzZ19oZWFkLT4KKwkJCQkJCSBzZ19saXN0W3NnX2luZGV4XSwKKwkJCQkJCSBzZ19saXN0X2R3b3Jkcyk7CisJCQlzZ19pbmRleCArPSBBU0NfU0dfTElTVF9QRVJfUTsKKwkJCXNjc2lxLT5uZXh0X3NnX2luZGV4ID0gc2dfaW5kZXg7CisJCX0KKwl9IGVsc2UgeworCQlzY3NpcS0+cTEuY250bCAmPSB+UUNfU0dfSEVBRDsKKwl9CisJc3RhID0gQXNjUHV0UmVhZHlRdWV1ZShhc2NfZHZjLCBzY3NpcSwgcV9ubyk7CisJc2NzaXEtPnExLmRhdGFfYWRkciA9IHNhdmVkX2RhdGFfYWRkcjsKKwlzY3NpcS0+cTEuZGF0YV9jbnQgPSBzYXZlZF9kYXRhX2NudDsKKwlyZXR1cm4gKHN0YSk7CiB9CiAKLVNUQVRJQyBpbnQKLUFzY1NldFJ1bkNoaXBTeW5SZWdBdElEKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX2RhdGEKLSkKK3N0YXRpYyBpbnQKK0FzY1NldFJ1bkNoaXBTeW5SZWdBdElEKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciB0aWRfbm8sIHVjaGFyIHNkdHJfZGF0YSkKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YSA9IEZBTFNFOworCWludCBzdGEgPSBGQUxTRTsKIAotICAgIGlmIChBc2NIb3N0UmVxUmlzY0hhbHQoaW9wX2Jhc2UpKSB7Ci0gICAgICAgIHN0YSA9IEFzY1NldENoaXBTeW5SZWdBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7Ci0gICAgICAgIEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSk7Ci0gICAgICAgIHJldHVybiAoc3RhKTsKLSAgICB9Ci0gICAgcmV0dXJuIChzdGEpOworCWlmIChBc2NIb3N0UmVxUmlzY0hhbHQoaW9wX2Jhc2UpKSB7CisJCXN0YSA9IEFzY1NldENoaXBTeW5SZWdBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7CisJCUFzY1N0YXJ0Q2hpcChpb3BfYmFzZSk7CisJCXJldHVybiAoc3RhKTsKKwl9CisJcmV0dXJuIChzdGEpOwogfQogCi1TVEFUSUMgaW50Ci1Bc2NTZXRDaGlwU3luUmVnQXRJRCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX2RhdGEKLSkKK3N0YXRpYyBpbnQgQXNjU2V0Q2hpcFN5blJlZ0F0SUQoUG9ydEFkZHIgaW9wX2Jhc2UsIHVjaGFyIGlkLCB1Y2hhciBzZHRyX2RhdGEpCiB7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgb3JnX2lkOwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YSA9IFRSVUU7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgb3JnX2lkOworCWludCBpOworCWludCBzdGEgPSBUUlVFOwogCi0gICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMSk7Ci0gICAgb3JnX2lkID0gQXNjUmVhZENoaXBEdmNJRChpb3BfYmFzZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGlmIChvcmdfaWQgPT0gKDB4MDEgPDwgaSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgb3JnX2lkID0gKEFTQ19TQ1NJX0JJVF9JRF9UWVBFKSBpOwotICAgIEFzY1dyaXRlQ2hpcER2Y0lEKGlvcF9iYXNlLCBpZCk7Ci0gICAgaWYgKEFzY1JlYWRDaGlwRHZjSUQoaW9wX2Jhc2UpID09ICgweDAxIDw8IGlkKSkgewotICAgICAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAwKTsKLSAgICAgICAgQXNjU2V0Q2hpcFN5bihpb3BfYmFzZSwgc2R0cl9kYXRhKTsKLSAgICAgICAgaWYgKEFzY0dldENoaXBTeW4oaW9wX2Jhc2UpICE9IHNkdHJfZGF0YSkgewotICAgICAgICAgICAgc3RhID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzdGEgPSBGQUxTRTsKLSAgICB9Ci0gICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMSk7Ci0gICAgQXNjV3JpdGVDaGlwRHZjSUQoaW9wX2Jhc2UsIG9yZ19pZCk7Ci0gICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7Ci0gICAgcmV0dXJuIChzdGEpOworCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworCW9yZ19pZCA9IEFzY1JlYWRDaGlwRHZjSUQoaW9wX2Jhc2UpOworCWZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworCQlpZiAob3JnX2lkID09ICgweDAxIDw8IGkpKQorCQkJYnJlYWs7CisJfQorCW9yZ19pZCA9IChBU0NfU0NTSV9CSVRfSURfVFlQRSkgaTsKKwlBc2NXcml0ZUNoaXBEdmNJRChpb3BfYmFzZSwgaWQpOworCWlmIChBc2NSZWFkQ2hpcER2Y0lEKGlvcF9iYXNlKSA9PSAoMHgwMSA8PCBpZCkpIHsKKwkJQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7CisJCUFzY1NldENoaXBTeW4oaW9wX2Jhc2UsIHNkdHJfZGF0YSk7CisJCWlmIChBc2NHZXRDaGlwU3luKGlvcF9iYXNlKSAhPSBzZHRyX2RhdGEpIHsKKwkJCXN0YSA9IEZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkJc3RhID0gRkFMU0U7CisJfQorCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworCUFzY1dyaXRlQ2hpcER2Y0lEKGlvcF9iYXNlLCBvcmdfaWQpOworCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworCXJldHVybiAoc3RhKTsKIH0KIAotU1RBVElDIHVzaG9ydAotQXNjSW5pdExyYW0oCi0gICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YwotKQorc3RhdGljIHVzaG9ydCBBc2NJbml0THJhbShBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGk7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBzX2FkZHI7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKKwl1Y2hhciBpOworCXVzaG9ydCBzX2FkZHI7CisJUG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IHdhcm5fY29kZTsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7Ci0gICAgd2Fybl9jb2RlID0gMDsKLSAgICBBc2NNZW1Xb3JkU2V0THJhbShpb3BfYmFzZSwgQVNDX1FBRFJfQkVHLCAwLAotICAgICAgICAgICAgICAgKHVzaG9ydCkgKCgoaW50KSAoYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyArIDIgKyAxKSAqIDY0KSA+PiAxKQotKTsKLSAgICBpID0gQVNDX01JTl9BQ1RJVkVfUU5POwotICAgIHNfYWRkciA9IEFTQ19RQURSX0JFRyArIEFTQ19RQkxLX1NJWkU7Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCi0gICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChpICsgMSkpOwotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9CV0QpLAotICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZykpOwotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9RTk8pLAotICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSBpKTsKLSAgICBpKys7Ci0gICAgc19hZGRyICs9IEFTQ19RQkxLX1NJWkU7Ci0gICAgZm9yICg7IGkgPCBhc2NfZHZjLT5tYXhfdG90YWxfcW5nOyBpKyssIHNfYWRkciArPSBBU0NfUUJMS19TSVpFKSB7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9GV0QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGkgKyAxKSk7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9CV0QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGkgLSAxKSk7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9RTk8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgaSk7Ci0gICAgfQotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpIChzX2FkZHIgKyBBU0NfU0NTSVFfQl9GV0QpLAotICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSBBU0NfUUxJTktfRU5EKTsKLSAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSAoc19hZGRyICsgQVNDX1NDU0lRX0JfQldEKSwKLSAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGFzY19kdmMtPm1heF90b3RhbF9xbmcgLSAxKSk7Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkgKHNfYWRkciArIEFTQ19TQ1NJUV9CX1FOTyksCi0gICAgICAgICAgICAgICAgICAgICAodWNoYXIpIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOwotICAgIGkrKzsKLSAgICBzX2FkZHIgKz0gQVNDX1FCTEtfU0laRTsKLSAgICBmb3IgKDsgaSA8PSAodWNoYXIpIChhc2NfZHZjLT5tYXhfdG90YWxfcW5nICsgMyk7Ci0gICAgICAgICBpKyssIHNfYWRkciArPSBBU0NfUUJMS19TSVpFKSB7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHNfYWRkciArICh1c2hvcnQpIEFTQ19TQ1NJUV9CX0ZXRCksIGkpOwotICAgICAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChzX2FkZHIgKyAodXNob3J0KSBBU0NfU0NTSVFfQl9CV0QpLCBpKTsKLSAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodXNob3J0KSAoc19hZGRyICsgKHVzaG9ydCkgQVNDX1NDU0lRX0JfUU5PKSwgaSk7Ci0gICAgfQotICAgIHJldHVybiAod2Fybl9jb2RlKTsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCXdhcm5fY29kZSA9IDA7CisJQXNjTWVtV29yZFNldExyYW0oaW9wX2Jhc2UsIEFTQ19RQURSX0JFRywgMCwKKwkJCSAgKHVzaG9ydCkoKChpbnQpKGFzY19kdmMtPm1heF90b3RhbF9xbmcgKyAyICsgMSkgKgorCQkJCSAgICA2NCkgPj4gMSkKKwkgICAgKTsKKwlpID0gQVNDX01JTl9BQ1RJVkVfUU5POworCXNfYWRkciA9IEFTQ19RQURSX0JFRyArIEFTQ19RQkxLX1NJWkU7CisJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkoc19hZGRyICsgQVNDX1NDU0lRX0JfRldEKSwKKwkJCSAodWNoYXIpKGkgKyAxKSk7CisJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkoc19hZGRyICsgQVNDX1NDU0lRX0JfQldEKSwKKwkJCSAodWNoYXIpKGFzY19kdmMtPm1heF90b3RhbF9xbmcpKTsKKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KShzX2FkZHIgKyBBU0NfU0NTSVFfQl9RTk8pLAorCQkJICh1Y2hhcilpKTsKKwlpKys7CisJc19hZGRyICs9IEFTQ19RQkxLX1NJWkU7CisJZm9yICg7IGkgPCBhc2NfZHZjLT5tYXhfdG90YWxfcW5nOyBpKyssIHNfYWRkciArPSBBU0NfUUJMS19TSVpFKSB7CisJCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCisJCQkJICh1Y2hhcikoaSArIDEpKTsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgKHVzaG9ydCkoc19hZGRyICsgQVNDX1NDU0lRX0JfQldEKSwKKwkJCQkgKHVjaGFyKShpIC0gMSkpOworCQlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KShzX2FkZHIgKyBBU0NfU0NTSVFfQl9RTk8pLAorCQkJCSAodWNoYXIpaSk7CisJfQorCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpKHNfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCksCisJCQkgKHVjaGFyKUFTQ19RTElOS19FTkQpOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpKHNfYWRkciArIEFTQ19TQ1NJUV9CX0JXRCksCisJCQkgKHVjaGFyKShhc2NfZHZjLT5tYXhfdG90YWxfcW5nIC0gMSkpOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsICh1c2hvcnQpKHNfYWRkciArIEFTQ19TQ1NJUV9CX1FOTyksCisJCQkgKHVjaGFyKWFzY19kdmMtPm1heF90b3RhbF9xbmcpOworCWkrKzsKKwlzX2FkZHIgKz0gQVNDX1FCTEtfU0laRTsKKwlmb3IgKDsgaSA8PSAodWNoYXIpKGFzY19kdmMtPm1heF90b3RhbF9xbmcgKyAzKTsKKwkgICAgIGkrKywgc19hZGRyICs9IEFTQ19RQkxLX1NJWkUpIHsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgKHVzaG9ydCkoc19hZGRyICsgKHVzaG9ydClBU0NfU0NTSVFfQl9GV0QpLCBpKTsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgKHVzaG9ydCkoc19hZGRyICsgKHVzaG9ydClBU0NfU0NTSVFfQl9CV0QpLCBpKTsKKwkJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCQkgKHVzaG9ydCkoc19hZGRyICsgKHVzaG9ydClBU0NfU0NTSVFfQl9RTk8pLCBpKTsKKwl9CisJcmV0dXJuICh3YXJuX2NvZGUpOwogfQogCi1TVEFUSUMgdXNob3J0Ci1Bc2NJbml0UUxpbmtWYXIoCi0gICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKLSkKK3N0YXRpYyB1c2hvcnQgQXNjSW5pdFFMaW5rVmFyKEFTQ19EVkNfVkFSICphc2NfZHZjKQogewotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgbHJhbV9hZGRyOworCVBvcnRBZGRyIGlvcF9iYXNlOworCWludCBpOworCXVzaG9ydCBscmFtX2FkZHI7CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwotICAgIEFzY1B1dFJpc2NWYXJGcmVlUUhlYWQoaW9wX2Jhc2UsIDEpOwotICAgIEFzY1B1dFJpc2NWYXJEb25lUVRhaWwoaW9wX2Jhc2UsIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOwotICAgIEFzY1B1dFZhckZyZWVRSGVhZChpb3BfYmFzZSwgMSk7Ci0gICAgQXNjUHV0VmFyRG9uZVFUYWlsKGlvcF9iYXNlLCBhc2NfZHZjLT5tYXhfdG90YWxfcW5nKTsKLSAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0JVU1lfUUhFQURfQiwKLSAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKChpbnQpIGFzY19kdmMtPm1heF90b3RhbF9xbmcgKyAxKSk7Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9ESVNDMV9RSEVBRF9CLAotICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoKGludCkgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyArIDIpKTsKLSAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KSBBU0NWX1RPVEFMX1JFQURZX1FfQiwKLSAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOwotICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfQVNDRFZDX0VSUl9DT0RFX1csIDApOwotICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TVE9QX0NPREVfQiwgMCk7Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TQ1NJQlVTWV9CLCAwKTsKLSAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1dUTV9GTEFHX0IsIDApOwotICAgIEFzY1B1dFFEb25lSW5Qcm9ncmVzcyhpb3BfYmFzZSwgMCk7Ci0gICAgbHJhbV9hZGRyID0gQVNDX1FBRFJfQkVHOwotICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrLCBscmFtX2FkZHIgKz0gMikgewotICAgICAgICBBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBscmFtX2FkZHIsIDApOwotICAgIH0KLSAgICByZXR1cm4gKDApOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJQXNjUHV0UmlzY1ZhckZyZWVRSGVhZChpb3BfYmFzZSwgMSk7CisJQXNjUHV0UmlzY1ZhckRvbmVRVGFpbChpb3BfYmFzZSwgYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyk7CisJQXNjUHV0VmFyRnJlZVFIZWFkKGlvcF9iYXNlLCAxKTsKKwlBc2NQdXRWYXJEb25lUVRhaWwoaW9wX2Jhc2UsIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfQlVTWV9RSEVBRF9CLAorCQkJICh1Y2hhcikoKGludClhc2NfZHZjLT5tYXhfdG90YWxfcW5nICsgMSkpOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfRElTQzFfUUhFQURfQiwKKwkJCSAodWNoYXIpKChpbnQpYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyArIDIpKTsKKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KUFTQ1ZfVE9UQUxfUkVBRFlfUV9CLAorCQkJIGFzY19kdmMtPm1heF90b3RhbF9xbmcpOworCUFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfQVNDRFZDX0VSUl9DT0RFX1csIDApOworCUFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMCk7CisJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TVE9QX0NPREVfQiwgMCk7CisJQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9TQ1NJQlVTWV9CLCAwKTsKKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1dUTV9GTEFHX0IsIDApOworCUFzY1B1dFFEb25lSW5Qcm9ncmVzcyhpb3BfYmFzZSwgMCk7CisJbHJhbV9hZGRyID0gQVNDX1FBRFJfQkVHOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrLCBscmFtX2FkZHIgKz0gMikgeworCQlBc2NXcml0ZUxyYW1Xb3JkKGlvcF9iYXNlLCBscmFtX2FkZHIsIDApOworCX0KKwlyZXR1cm4gKDApOwogfQogCi1TVEFUSUMgaW50Ci1Bc2NTZXRMaWJFcnJvckNvZGUoCi0gICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICAgICAgICAgdXNob3J0IGVycl9jb2RlCi0pCitzdGF0aWMgaW50IEFzY1NldExpYkVycm9yQ29kZShBU0NfRFZDX1ZBUiAqYXNjX2R2YywgdXNob3J0IGVycl9jb2RlKQogewotICAgIGlmIChhc2NfZHZjLT5lcnJfY29kZSA9PSAwKSB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gZXJyX2NvZGU7Ci0gICAgICAgIEFzY1dyaXRlTHJhbVdvcmQoYXNjX2R2Yy0+aW9wX2Jhc2UsIEFTQ1ZfQVNDRFZDX0VSUl9DT0RFX1csCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUpOwotICAgIH0KLSAgICByZXR1cm4gKGVycl9jb2RlKTsKKwlpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgPT0gMCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSA9IGVycl9jb2RlOworCQlBc2NXcml0ZUxyYW1Xb3JkKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX0FTQ0RWQ19FUlJfQ09ERV9XLAorCQkJCSBlcnJfY29kZSk7CisJfQorCXJldHVybiAoZXJyX2NvZGUpOwogfQogCi0KLVNUQVRJQyB1Y2hhcgotQXNjTXNnT3V0U0RUUigKLSAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICAgIHVjaGFyIHNkdHJfcGVyaW9kLAotICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX29mZnNldAotKQorc3RhdGljIHVjaGFyCitBc2NNc2dPdXRTRFRSKEFTQ19EVkNfVkFSICphc2NfZHZjLCB1Y2hhciBzZHRyX3BlcmlvZCwgdWNoYXIgc2R0cl9vZmZzZXQpCiB7Ci0gICAgRVhUX01TRyAgICAgICAgICAgICBzZHRyX2J1ZjsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfcGVyaW9kX2luZGV4OwotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisJRVhUX01TRyBzZHRyX2J1ZjsKKwl1Y2hhciBzZHRyX3BlcmlvZF9pbmRleDsKKwlQb3J0QWRkciBpb3BfYmFzZTsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7Ci0gICAgc2R0cl9idWYubXNnX3R5cGUgPSBNU19FWFRFTkQ7Ci0gICAgc2R0cl9idWYubXNnX2xlbiA9IE1TX1NEVFJfTEVOOwotICAgIHNkdHJfYnVmLm1zZ19yZXEgPSBNU19TRFRSX0NPREU7Ci0gICAgc2R0cl9idWYueGZlcl9wZXJpb2QgPSBzZHRyX3BlcmlvZDsKLSAgICBzZHRyX29mZnNldCAmPSBBU0NfU1lOX01BWF9PRkZTRVQ7Ci0gICAgc2R0cl9idWYucmVxX2Fja19vZmZzZXQgPSBzZHRyX29mZnNldDsKLSAgICBpZiAoKHNkdHJfcGVyaW9kX2luZGV4ID0KLSAgICAgICAgIEFzY0dldFN5blBlcmlvZEluZGV4KGFzY19kdmMsIHNkdHJfcGVyaW9kKSkgPD0KLSAgICAgICAgYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXgpIHsKLSAgICAgICAgQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ1ZfTVNHT1VUX0JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzZHRyX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChFWFRfTVNHKSA+PiAxKTsKLSAgICAgICAgcmV0dXJuICgoc2R0cl9wZXJpb2RfaW5kZXggPDwgNCkgfCBzZHRyX29mZnNldCk7Ci0gICAgfSBlbHNlIHsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCXNkdHJfYnVmLm1zZ190eXBlID0gTVNfRVhURU5EOworCXNkdHJfYnVmLm1zZ19sZW4gPSBNU19TRFRSX0xFTjsKKwlzZHRyX2J1Zi5tc2dfcmVxID0gTVNfU0RUUl9DT0RFOworCXNkdHJfYnVmLnhmZXJfcGVyaW9kID0gc2R0cl9wZXJpb2Q7CisJc2R0cl9vZmZzZXQgJj0gQVNDX1NZTl9NQVhfT0ZGU0VUOworCXNkdHJfYnVmLnJlcV9hY2tfb2Zmc2V0ID0gc2R0cl9vZmZzZXQ7CisJaWYgKChzZHRyX3BlcmlvZF9pbmRleCA9CisJICAgICBBc2NHZXRTeW5QZXJpb2RJbmRleChhc2NfZHZjLCBzZHRyX3BlcmlvZCkpIDw9CisJICAgIGFzY19kdmMtPm1heF9zZHRyX2luZGV4KSB7CisJCUFzY01lbVdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLAorCQkJCQlBU0NWX01TR09VVF9CRUcsCisJCQkJCSh1Y2hhciAqKSZzZHRyX2J1ZiwKKwkJCQkJc2l6ZW9mKEVYVF9NU0cpID4+IDEpOworCQlyZXR1cm4gKChzZHRyX3BlcmlvZF9pbmRleCA8PCA0KSB8IHNkdHJfb2Zmc2V0KTsKKwl9IGVsc2UgewogCi0gICAgICAgIHNkdHJfYnVmLnJlcV9hY2tfb2Zmc2V0ID0gMDsKLSAgICAgICAgQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ1ZfTVNHT1VUX0JFRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyICopICZzZHRyX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChFWFRfTVNHKSA+PiAxKTsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9CisJCXNkdHJfYnVmLnJlcV9hY2tfb2Zmc2V0ID0gMDsKKwkJQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsCisJCQkJCUFTQ1ZfTVNHT1VUX0JFRywKKwkJCQkJKHVjaGFyICopJnNkdHJfYnVmLAorCQkJCQlzaXplb2YoRVhUX01TRykgPj4gMSk7CisJCXJldHVybiAoMCk7CisJfQogfQogCi1TVEFUSUMgdWNoYXIKLUFzY0NhbFNEVFJEYXRhKAotICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICAgICB1Y2hhciBzZHRyX3BlcmlvZCwKLSAgICAgICAgICAgICAgICAgIHVjaGFyIHN5bl9vZmZzZXQKLSkKK3N0YXRpYyB1Y2hhcgorQXNjQ2FsU0RUUkRhdGEoQVNDX0RWQ19WQVIgKmFzY19kdmMsIHVjaGFyIHNkdHJfcGVyaW9kLCB1Y2hhciBzeW5fb2Zmc2V0KQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgYnl0ZTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIHNkdHJfcGVyaW9kX2l4OworCXVjaGFyIGJ5dGU7CisJdWNoYXIgc2R0cl9wZXJpb2RfaXg7CiAKLSAgICBzZHRyX3BlcmlvZF9peCA9IEFzY0dldFN5blBlcmlvZEluZGV4KGFzY19kdmMsIHNkdHJfcGVyaW9kKTsKLSAgICBpZiAoCi0gICAgICAgICAgIChzZHRyX3BlcmlvZF9peCA+IGFzY19kdmMtPm1heF9zZHRyX2luZGV4KQotKSB7Ci0gICAgICAgIHJldHVybiAoMHhGRik7Ci0gICAgfQotICAgIGJ5dGUgPSAoc2R0cl9wZXJpb2RfaXggPDwgNCkgfCAoc3luX29mZnNldCAmIEFTQ19TWU5fTUFYX09GRlNFVCk7Ci0gICAgcmV0dXJuIChieXRlKTsKKwlzZHRyX3BlcmlvZF9peCA9IEFzY0dldFN5blBlcmlvZEluZGV4KGFzY19kdmMsIHNkdHJfcGVyaW9kKTsKKwlpZiAoKHNkdHJfcGVyaW9kX2l4ID4gYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXgpCisJICAgICkgeworCQlyZXR1cm4gKDB4RkYpOworCX0KKwlieXRlID0gKHNkdHJfcGVyaW9kX2l4IDw8IDQpIHwgKHN5bl9vZmZzZXQgJiBBU0NfU1lOX01BWF9PRkZTRVQpOworCXJldHVybiAoYnl0ZSk7CiB9CiAKLVNUQVRJQyB2b2lkCi1Bc2NTZXRDaGlwU0RUUigKLSAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgdWNoYXIgc2R0cl9kYXRhLAotICAgICAgICAgICAgICAgICAgdWNoYXIgdGlkX25vCi0pCitzdGF0aWMgdm9pZCBBc2NTZXRDaGlwU0RUUihQb3J0QWRkciBpb3BfYmFzZSwgdWNoYXIgc2R0cl9kYXRhLCB1Y2hhciB0aWRfbm8pCiB7Ci0gICAgQXNjU2V0Q2hpcFN5blJlZ0F0SUQoaW9wX2Jhc2UsIHRpZF9ubywgc2R0cl9kYXRhKTsKLSAgICBBc2NQdXRNQ29kZVNEVFJEb25lQXRJRChpb3BfYmFzZSwgdGlkX25vLCBzZHRyX2RhdGEpOwotICAgIHJldHVybjsKKwlBc2NTZXRDaGlwU3luUmVnQXRJRChpb3BfYmFzZSwgdGlkX25vLCBzZHRyX2RhdGEpOworCUFzY1B1dE1Db2RlU0RUUkRvbmVBdElEKGlvcF9iYXNlLCB0aWRfbm8sIHNkdHJfZGF0YSk7CisJcmV0dXJuOwogfQogCi1TVEFUSUMgdWNoYXIKLUFzY0dldFN5blBlcmlvZEluZGV4KAotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBzeW5fdGltZQotKQorc3RhdGljIHVjaGFyIEFzY0dldFN5blBlcmlvZEluZGV4KEFTQ19EVkNfVkFSICphc2NfZHZjLCB1Y2hhciBzeW5fdGltZSkKIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAqcGVyaW9kX3RhYmxlOwotICAgIGludCAgICAgICAgICAgICAgICAgbWF4X2luZGV4OwotICAgIGludCAgICAgICAgICAgICAgICAgbWluX2luZGV4OwotICAgIGludCAgICAgICAgICAgICAgICAgaTsKKwl1Y2hhciAqcGVyaW9kX3RhYmxlOworCWludCBtYXhfaW5kZXg7CisJaW50IG1pbl9pbmRleDsKKwlpbnQgaTsKIAotICAgIHBlcmlvZF90YWJsZSA9IGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibDsKLSAgICBtYXhfaW5kZXggPSAoaW50KSBhc2NfZHZjLT5tYXhfc2R0cl9pbmRleDsKLSAgICBtaW5faW5kZXggPSAoaW50KWFzY19kdmMtPmhvc3RfaW5pdF9zZHRyX2luZGV4OwotICAgIGlmICgoc3luX3RpbWUgPD0gcGVyaW9kX3RhYmxlW21heF9pbmRleF0pKSB7Ci0gICAgICAgIGZvciAoaSA9IG1pbl9pbmRleDsgaSA8IChtYXhfaW5kZXggLSAxKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3luX3RpbWUgPD0gcGVyaW9kX3RhYmxlW2ldKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgodWNoYXIpIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKHVjaGFyKSBtYXhfaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoKHVjaGFyKSAobWF4X2luZGV4ICsgMSkpOwotICAgIH0KKwlwZXJpb2RfdGFibGUgPSBhc2NfZHZjLT5zZHRyX3BlcmlvZF90Ymw7CisJbWF4X2luZGV4ID0gKGludClhc2NfZHZjLT5tYXhfc2R0cl9pbmRleDsKKwltaW5faW5kZXggPSAoaW50KWFzY19kdmMtPmhvc3RfaW5pdF9zZHRyX2luZGV4OworCWlmICgoc3luX3RpbWUgPD0gcGVyaW9kX3RhYmxlW21heF9pbmRleF0pKSB7CisJCWZvciAoaSA9IG1pbl9pbmRleDsgaSA8IChtYXhfaW5kZXggLSAxKTsgaSsrKSB7CisJCQlpZiAoc3luX3RpbWUgPD0gcGVyaW9kX3RhYmxlW2ldKSB7CisJCQkJcmV0dXJuICgodWNoYXIpaSk7CisJCQl9CisJCX0KKwkJcmV0dXJuICgodWNoYXIpbWF4X2luZGV4KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKCh1Y2hhcikobWF4X2luZGV4ICsgMSkpOworCX0KIH0KIAotU1RBVElDIHVjaGFyCi1Bc2NBbGxvY0ZyZWVRdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgdWNoYXIgZnJlZV9xX2hlYWQKLSkKK3N0YXRpYyB1Y2hhciBBc2NBbGxvY0ZyZWVRdWV1ZShQb3J0QWRkciBpb3BfYmFzZSwgdWNoYXIgZnJlZV9xX2hlYWQpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBxX2FkZHI7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBuZXh0X3FwOwotICAgIHVjaGFyICAgICAgICAgICAgICAgcV9zdGF0dXM7CisJdXNob3J0IHFfYWRkcjsKKwl1Y2hhciBuZXh0X3FwOworCXVjaGFyIHFfc3RhdHVzOwogCi0gICAgcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihmcmVlX3FfaGVhZCk7Ci0gICAgcV9zdGF0dXMgPSAodWNoYXIpIEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQpIChxX2FkZHIgKyBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKLSAgICBuZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKHFfYWRkciArIEFTQ19TQ1NJUV9CX0ZXRCkpOwotICAgIGlmICgoKHFfc3RhdHVzICYgUVNfUkVBRFkpID09IDApICYmIChuZXh0X3FwICE9IEFTQ19RTElOS19FTkQpKSB7Ci0gICAgICAgIHJldHVybiAobmV4dF9xcCk7Ci0gICAgfQotICAgIHJldHVybiAoQVNDX1FMSU5LX0VORCk7CisJcV9hZGRyID0gQVNDX1FOT19UT19RQUREUihmcmVlX3FfaGVhZCk7CisJcV9zdGF0dXMgPSAodWNoYXIpQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLAorCQkJCQkgICh1c2hvcnQpKHFfYWRkciArCisJCQkJCQkgICBBU0NfU0NTSVFfQl9TVEFUVVMpKTsKKwluZXh0X3FwID0gQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCAodXNob3J0KShxX2FkZHIgKyBBU0NfU0NTSVFfQl9GV0QpKTsKKwlpZiAoKChxX3N0YXR1cyAmIFFTX1JFQURZKSA9PSAwKSAmJiAobmV4dF9xcCAhPSBBU0NfUUxJTktfRU5EKSkgeworCQlyZXR1cm4gKG5leHRfcXApOworCX0KKwlyZXR1cm4gKEFTQ19RTElOS19FTkQpOwogfQogCi1TVEFUSUMgdWNoYXIKLUFzY0FsbG9jTXVsdGlwbGVGcmVlUXVldWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciBmcmVlX3FfaGVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgbl9mcmVlX3EKLSkKK3N0YXRpYyB1Y2hhcgorQXNjQWxsb2NNdWx0aXBsZUZyZWVRdWV1ZShQb3J0QWRkciBpb3BfYmFzZSwgdWNoYXIgZnJlZV9xX2hlYWQsIHVjaGFyIG5fZnJlZV9xKQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgaTsKKwl1Y2hhciBpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG5fZnJlZV9xOyBpKyspIHsKLSAgICAgICAgaWYgKChmcmVlX3FfaGVhZCA9IEFzY0FsbG9jRnJlZVF1ZXVlKGlvcF9iYXNlLCBmcmVlX3FfaGVhZCkpCi0gICAgICAgICAgICA9PSBBU0NfUUxJTktfRU5EKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEFTQ19RTElOS19FTkQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoZnJlZV9xX2hlYWQpOworCWZvciAoaSA9IDA7IGkgPCBuX2ZyZWVfcTsgaSsrKSB7CisJCWlmICgoZnJlZV9xX2hlYWQgPSBBc2NBbGxvY0ZyZWVRdWV1ZShpb3BfYmFzZSwgZnJlZV9xX2hlYWQpKQorCQkgICAgPT0gQVNDX1FMSU5LX0VORCkgeworCQkJcmV0dXJuIChBU0NfUUxJTktfRU5EKTsKKwkJfQorCX0KKwlyZXR1cm4gKGZyZWVfcV9oZWFkKTsKIH0KIAotU1RBVElDIGludAotQXNjSG9zdFJlcVJpc2NIYWx0KAotICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCi0pCitzdGF0aWMgaW50IEFzY0hvc3RSZXFSaXNjSGFsdChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHN0YSA9IDA7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBzYXZlZF9zdG9wX2NvZGU7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgc3RhID0gMDsKKwl1Y2hhciBzYXZlZF9zdG9wX2NvZGU7CiAKLSAgICBpZiAoQXNjSXNDaGlwSGFsdGVkKGlvcF9iYXNlKSkKLSAgICAgICAgcmV0dXJuICgxKTsKLSAgICBzYXZlZF9zdG9wX2NvZGUgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IpOwotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IsCi0gICAgICAgICAgICAgICAgICAgICBBU0NfU1RPUF9IT1NUX1JFUV9SSVNDX0hBTFQgfCBBU0NfU1RPUF9SRVFfUklTQ19TVE9QCi0pOwotICAgIGRvIHsKLSAgICAgICAgaWYgKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkpIHsKLSAgICAgICAgICAgIHN0YSA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7Ci0gICAgfSB3aGlsZSAoY291bnQrKyA8IDIwKTsKLSAgICBBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CLCBzYXZlZF9zdG9wX2NvZGUpOwotICAgIHJldHVybiAoc3RhKTsKKwlpZiAoQXNjSXNDaGlwSGFsdGVkKGlvcF9iYXNlKSkKKwkJcmV0dXJuICgxKTsKKwlzYXZlZF9zdG9wX2NvZGUgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IpOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IsCisJCQkgQVNDX1NUT1BfSE9TVF9SRVFfUklTQ19IQUxUIHwgQVNDX1NUT1BfUkVRX1JJU0NfU1RPUCk7CisJZG8geworCQlpZiAoQXNjSXNDaGlwSGFsdGVkKGlvcF9iYXNlKSkgeworCQkJc3RhID0gMTsKKwkJCWJyZWFrOworCQl9CisJCUR2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKKwl9IHdoaWxlIChjb3VudCsrIDwgMjApOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IsIHNhdmVkX3N0b3BfY29kZSk7CisJcmV0dXJuIChzdGEpOwogfQogCi1TVEFUSUMgaW50Ci1Bc2NTdG9wUXVldWVFeGUoCi0gICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKLSkKK3N0YXRpYyBpbnQgQXNjU3RvcFF1ZXVlRXhlKFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIGludCAgICAgICAgICAgICAgICAgY291bnQgPSAwOworCWludCBjb3VudCA9IDA7CiAKLSAgICBpZiAoQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKSA9PSAwKSB7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVNDX1NUT1BfUkVRX1JJU0NfU1RPUCk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IpICYKLSAgICAgICAgICAgICAgICAgICBBU0NfU1RPUF9BQ0tfUklTQ19TVE9QKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKLSAgICAgICAgfSB3aGlsZSAoY291bnQrKyA8IDIwKTsKLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKKwlpZiAoQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKSA9PSAwKSB7CisJCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfU1RPUF9DT0RFX0IsCisJCQkJIEFTQ19TVE9QX1JFUV9SSVNDX1NUT1ApOworCQlkbyB7CisJCQlpZiAoQXNjUmVhZExyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX1NUT1BfQ09ERV9CKSAmCisJCQkgICAgQVNDX1NUT1BfQUNLX1JJU0NfU1RPUCkgeworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCQlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7CisJCX0gd2hpbGUgKGNvdW50KysgPCAyMCk7CisJfQorCXJldHVybiAoMCk7CiB9CiAKLVNUQVRJQyB2b2lkCi1EdmNEZWxheU1pY3JvU2Vjb25kKEFEVl9EVkNfVkFSICphc2NfZHZjLCB1c2hvcnQgbWljcm9fc2VjKQorc3RhdGljIHZvaWQgRHZjRGVsYXlNaWNyb1NlY29uZChBRFZfRFZDX1ZBUiAqYXNjX2R2YywgdXNob3J0IG1pY3JvX3NlYykKIHsKLSAgICB1ZGVsYXkobWljcm9fc2VjKTsKKwl1ZGVsYXkobWljcm9fc2VjKTsKIH0KIAotU1RBVElDIHZvaWQKLUR2Y0RlbGF5TmFub1NlY29uZChBU0NfRFZDX1ZBUiAqYXNjX2R2YywgQVNDX0RDTlQgbmFub19zZWMpCitzdGF0aWMgdm9pZCBEdmNEZWxheU5hbm9TZWNvbmQoQVNDX0RWQ19WQVIgKmFzY19kdmMsIEFTQ19EQ05UIG5hbm9fc2VjKQogewotICAgIHVkZWxheSgobmFub19zZWMgKyA5OTkpLzEwMDApOworCXVkZWxheSgobmFub19zZWMgKyA5OTkpIC8gMTAwMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSVNBCi1TVEFUSUMgQVNDX0RDTlQgX19pbml0Ci1Bc2NHZXRFaXNhUHJvZHVjdElEKAotICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSkKK3N0YXRpYyBBU0NfRENOVCBfX2luaXQgQXNjR2V0RWlzYVByb2R1Y3RJRChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICBQb3J0QWRkciAgICAgICAgICAgIGVpc2FfaW9wOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgcHJvZHVjdF9pZF9oaWdoLCBwcm9kdWN0X2lkX2xvdzsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIHByb2R1Y3RfaWQ7CisJUG9ydEFkZHIgZWlzYV9pb3A7CisJdXNob3J0IHByb2R1Y3RfaWRfaGlnaCwgcHJvZHVjdF9pZF9sb3c7CisJQVNDX0RDTlQgcHJvZHVjdF9pZDsKIAotICAgIGVpc2FfaW9wID0gQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwgQVNDX0VJU0FfUElEX0lPUF9NQVNLOwotICAgIHByb2R1Y3RfaWRfbG93ID0gaW5wdyhlaXNhX2lvcCk7Ci0gICAgcHJvZHVjdF9pZF9oaWdoID0gaW5wdyhlaXNhX2lvcCArIDIpOwotICAgIHByb2R1Y3RfaWQgPSAoKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2hpZ2ggPDwgMTYpIHwKLSAgICAgICAgKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2xvdzsKLSAgICByZXR1cm4gKHByb2R1Y3RfaWQpOworCWVpc2FfaW9wID0gQVNDX0dFVF9FSVNBX1NMT1QoaW9wX2Jhc2UpIHwgQVNDX0VJU0FfUElEX0lPUF9NQVNLOworCXByb2R1Y3RfaWRfbG93ID0gaW5wdyhlaXNhX2lvcCk7CisJcHJvZHVjdF9pZF9oaWdoID0gaW5wdyhlaXNhX2lvcCArIDIpOworCXByb2R1Y3RfaWQgPSAoKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2hpZ2ggPDwgMTYpIHwKKwkgICAgKEFTQ19EQ05UKSBwcm9kdWN0X2lkX2xvdzsKKwlyZXR1cm4gKHByb2R1Y3RfaWQpOwogfQogCi1TVEFUSUMgUG9ydEFkZHIgX19pbml0Ci1Bc2NTZWFyY2hJT1BvcnRBZGRyRUlTQSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQorc3RhdGljIFBvcnRBZGRyIF9faW5pdCBBc2NTZWFyY2hJT1BvcnRBZGRyRUlTQShQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIGVpc2FfcHJvZHVjdF9pZDsKKwlBU0NfRENOVCBlaXNhX3Byb2R1Y3RfaWQ7CiAKLSAgICBpZiAoaW9wX2Jhc2UgPT0gMCkgewotICAgICAgICBpb3BfYmFzZSA9IEFTQ19FSVNBX01JTl9JT1BfQUREUjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoaW9wX2Jhc2UgPT0gQVNDX0VJU0FfTUFYX0lPUF9BRERSKQotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgaWYgKChpb3BfYmFzZSAmIDB4MDA1MCkgPT0gMHgwMDUwKSB7Ci0gICAgICAgICAgICBpb3BfYmFzZSArPSBBU0NfRUlTQV9CSUdfSU9QX0dBUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlvcF9iYXNlICs9IEFTQ19FSVNBX1NNQUxMX0lPUF9HQVA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKGlvcF9iYXNlIDw9IEFTQ19FSVNBX01BWF9JT1BfQUREUikgewotICAgICAgICBlaXNhX3Byb2R1Y3RfaWQgPSBBc2NHZXRFaXNhUHJvZHVjdElEKGlvcF9iYXNlKTsKLSAgICAgICAgaWYgKChlaXNhX3Byb2R1Y3RfaWQgPT0gQVNDX0VJU0FfSURfNzQwKSB8fAotICAgICAgICAgICAgKGVpc2FfcHJvZHVjdF9pZCA9PSBBU0NfRUlTQV9JRF83NTApKSB7Ci0gICAgICAgICAgICBpZiAoQXNjRmluZFNpZ25hdHVyZShpb3BfYmFzZSkpIHsKLSAgICAgICAgICAgICAgICBpbnB3KGlvcF9iYXNlICsgNCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChpb3BfYmFzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlvcF9iYXNlID09IEFTQ19FSVNBX01BWF9JT1BfQUREUikKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIGlmICgoaW9wX2Jhc2UgJiAweDAwNTApID09IDB4MDA1MCkgewotICAgICAgICAgICAgaW9wX2Jhc2UgKz0gQVNDX0VJU0FfQklHX0lPUF9HQVA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpb3BfYmFzZSArPSBBU0NfRUlTQV9TTUFMTF9JT1BfR0FQOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisJaWYgKGlvcF9iYXNlID09IDApIHsKKwkJaW9wX2Jhc2UgPSBBU0NfRUlTQV9NSU5fSU9QX0FERFI7CisJfSBlbHNlIHsKKwkJaWYgKGlvcF9iYXNlID09IEFTQ19FSVNBX01BWF9JT1BfQUREUikKKwkJCXJldHVybiAoMCk7CisJCWlmICgoaW9wX2Jhc2UgJiAweDAwNTApID09IDB4MDA1MCkgeworCQkJaW9wX2Jhc2UgKz0gQVNDX0VJU0FfQklHX0lPUF9HQVA7CisJCX0gZWxzZSB7CisJCQlpb3BfYmFzZSArPSBBU0NfRUlTQV9TTUFMTF9JT1BfR0FQOworCQl9CisJfQorCXdoaWxlIChpb3BfYmFzZSA8PSBBU0NfRUlTQV9NQVhfSU9QX0FERFIpIHsKKwkJZWlzYV9wcm9kdWN0X2lkID0gQXNjR2V0RWlzYVByb2R1Y3RJRChpb3BfYmFzZSk7CisJCWlmICgoZWlzYV9wcm9kdWN0X2lkID09IEFTQ19FSVNBX0lEXzc0MCkgfHwKKwkJICAgIChlaXNhX3Byb2R1Y3RfaWQgPT0gQVNDX0VJU0FfSURfNzUwKSkgeworCQkJaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7CisJCQkJaW5wdyhpb3BfYmFzZSArIDQpOworCQkJCXJldHVybiAoaW9wX2Jhc2UpOworCQkJfQorCQl9CisJCWlmIChpb3BfYmFzZSA9PSBBU0NfRUlTQV9NQVhfSU9QX0FERFIpCisJCQlyZXR1cm4gKDApOworCQlpZiAoKGlvcF9iYXNlICYgMHgwMDUwKSA9PSAweDAwNTApIHsKKwkJCWlvcF9iYXNlICs9IEFTQ19FSVNBX0JJR19JT1BfR0FQOworCQl9IGVsc2UgeworCQkJaW9wX2Jhc2UgKz0gQVNDX0VJU0FfU01BTExfSU9QX0dBUDsKKwkJfQorCX0KKwlyZXR1cm4gKDApOwogfQogI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KIAotU1RBVElDIGludAotQXNjU3RhcnRDaGlwKAotICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCi0pCitzdGF0aWMgaW50IEFzY1N0YXJ0Q2hpcChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICBBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgMCk7Ci0gICAgaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgcmV0dXJuICgxKTsKKwlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgMCk7CisJaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpICE9IDApIHsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKIH0KIAotU1RBVElDIGludAotQXNjU3RvcENoaXAoCi0gICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQotKQorc3RhdGljIGludCBBc2NTdG9wQ2hpcChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGNjX3ZhbDsKKwl1Y2hhciBjY192YWw7CiAKLSAgICBjY192YWwgPSBBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJiAofihDQ19TSU5HTEVfU1RFUCB8IENDX1RFU1QgfCBDQ19ESUFHKSk7Ci0gICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsICh1Y2hhcikgKGNjX3ZhbCB8IENDX0hBTFQpKTsKLSAgICBBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19IQUxUKTsKLSAgICBBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19SRkxBR19XVE0pOwotICAgIGlmICgoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfSEFMVEVEKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIHJldHVybiAoMSk7CisJY2NfdmFsID0KKwkgICAgQXNjR2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UpICYKKwkgICAgKH4oQ0NfU0lOR0xFX1NURVAgfCBDQ19URVNUIHwgQ0NfRElBRykpOworCUFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCAodWNoYXIpKGNjX3ZhbCB8IENDX0hBTFQpKTsKKwlBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19IQUxUKTsKKwlBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19SRkxBR19XVE0pOworCWlmICgoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfSEFMVEVEKSA9PSAwKSB7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7CiB9CiAKLVNUQVRJQyBpbnQKLUFzY0lzQ2hpcEhhbHRlZCgKLSAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQotKQorc3RhdGljIGludCBBc2NJc0NoaXBIYWx0ZWQoUG9ydEFkZHIgaW9wX2Jhc2UpCiB7Ci0gICAgaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpICE9IDApIHsKLSAgICAgICAgaWYgKChBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJiBDQ19IQUxUKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisJaWYgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19IQUxURUQpICE9IDApIHsKKwkJaWYgKChBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJiBDQ19IQUxUKSAhPSAwKSB7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7CiB9CiAKLVNUQVRJQyB2b2lkCi1Bc2NTZXRDaGlwSUgoCi0gICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgdXNob3J0IGluc19jb2RlCi0pCitzdGF0aWMgdm9pZCBBc2NTZXRDaGlwSUgoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBpbnNfY29kZSkKIHsKLSAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKLSAgICBBc2NXcml0ZUNoaXBJSChpb3BfYmFzZSwgaW5zX2NvZGUpOwotICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOwotICAgIHJldHVybjsKKwlBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKKwlBc2NXcml0ZUNoaXBJSChpb3BfYmFzZSwgaW5zX2NvZGUpOworCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworCXJldHVybjsKIH0KIAotU1RBVElDIHZvaWQKLUFzY0Fja0ludGVycnVwdCgKLSAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZQotKQorc3RhdGljIHZvaWQgQXNjQWNrSW50ZXJydXB0KFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgaG9zdF9mbGFnOwotICAgIHVjaGFyICAgICAgICAgICAgICAgcmlzY19mbGFnOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgbG9vcDsKKwl1Y2hhciBob3N0X2ZsYWc7CisJdWNoYXIgcmlzY19mbGFnOworCXVzaG9ydCBsb29wOwogCi0gICAgbG9vcCA9IDA7Ci0gICAgZG8gewotICAgICAgICByaXNjX2ZsYWcgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfUklTQ19GTEFHX0IpOwotICAgICAgICBpZiAobG9vcCsrID4gMHg3RkZGKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKChyaXNjX2ZsYWcgJiBBU0NfUklTQ19GTEFHX0dFTl9JTlQpICE9IDApOwotICAgIGhvc3RfZmxhZyA9IEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9IT1NUX0ZMQUdfQikgJiAofkFTQ19IT1NUX0ZMQUdfQUNLX0lOVCk7Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9IT1NUX0ZMQUdfQiwKLSAgICAgICAgICAgICAgICAgICAgICh1Y2hhcikgKGhvc3RfZmxhZyB8IEFTQ19IT1NUX0ZMQUdfQUNLX0lOVCkpOwotICAgIEFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIENJV19JTlRfQUNLKTsKLSAgICBsb29wID0gMDsKLSAgICB3aGlsZSAoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfSU5UX1BFTkRJTkcpIHsKLSAgICAgICAgQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0lOVF9BQ0spOwotICAgICAgICBpZiAobG9vcCsrID4gMykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQXNjV3JpdGVMcmFtQnl0ZShpb3BfYmFzZSwgQVNDVl9IT1NUX0ZMQUdfQiwgaG9zdF9mbGFnKTsKLSAgICByZXR1cm47CisJbG9vcCA9IDA7CisJZG8geworCQlyaXNjX2ZsYWcgPSBBc2NSZWFkTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfUklTQ19GTEFHX0IpOworCQlpZiAobG9vcCsrID4gMHg3RkZGKSB7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKChyaXNjX2ZsYWcgJiBBU0NfUklTQ19GTEFHX0dFTl9JTlQpICE9IDApOworCWhvc3RfZmxhZyA9CisJICAgIEFzY1JlYWRMcmFtQnl0ZShpb3BfYmFzZSwKKwkJCSAgICBBU0NWX0hPU1RfRkxBR19CKSAmICh+QVNDX0hPU1RfRkxBR19BQ0tfSU5UKTsKKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLAorCQkJICh1Y2hhcikoaG9zdF9mbGFnIHwgQVNDX0hPU1RfRkxBR19BQ0tfSU5UKSk7CisJQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0lOVF9BQ0spOworCWxvb3AgPSAwOworCXdoaWxlIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19JTlRfUEVORElORykgeworCQlBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfSU5UX0FDSyk7CisJCWlmIChsb29wKysgPiAzKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RfRkxBR19CLCBob3N0X2ZsYWcpOworCXJldHVybjsKIH0KIAotU1RBVElDIHZvaWQKLUFzY0Rpc2FibGVJbnRlcnJ1cHQoCi0gICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCi0pCitzdGF0aWMgdm9pZCBBc2NEaXNhYmxlSW50ZXJydXB0KFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgY2ZnOworCXVzaG9ydCBjZmc7CiAKLSAgICBjZmcgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKLSAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmcgJiAofkFTQ19DRkcwX0hPU1RfSU5UX09OKSk7Ci0gICAgcmV0dXJuOworCWNmZyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOworCUFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZyAmICh+QVNDX0NGRzBfSE9TVF9JTlRfT04pKTsKKwlyZXR1cm47CiB9CiAKLVNUQVRJQyB2b2lkCi1Bc2NFbmFibGVJbnRlcnJ1cHQoCi0gICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UKLSkKK3N0YXRpYyB2b2lkIEFzY0VuYWJsZUludGVycnVwdChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZzsKKwl1c2hvcnQgY2ZnOwogCi0gICAgY2ZnID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSk7Ci0gICAgQXNjU2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSwgY2ZnIHwgQVNDX0NGRzBfSE9TVF9JTlRfT04pOwotICAgIHJldHVybjsKKwljZmcgPSBBc2NHZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlKTsKKwlBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmcgfCBBU0NfQ0ZHMF9IT1NUX0lOVF9PTik7CisJcmV0dXJuOwogfQogCi0KLQotU1RBVElDIHZvaWQKLUFzY1NldEJhbmsoCi0gICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICB1Y2hhciBiYW5rCi0pCitzdGF0aWMgdm9pZCBBc2NTZXRCYW5rKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBiYW5rKQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgdmFsOworCXVjaGFyIHZhbDsKIAotICAgIHZhbCA9IEFzY0dldENoaXBDb250cm9sKGlvcF9iYXNlKSAmCi0gICAgICAofihDQ19TSU5HTEVfU1RFUCB8IENDX1RFU1QgfCBDQ19ESUFHIHwgQ0NfU0NTSV9SRVNFVCB8IENDX0NISVBfUkVTRVQpKTsKLSAgICBpZiAoYmFuayA9PSAxKSB7Ci0gICAgICAgIHZhbCB8PSBDQ19CQU5LX09ORTsKLSAgICB9IGVsc2UgaWYgKGJhbmsgPT0gMikgewotICAgICAgICB2YWwgfD0gQ0NfRElBRyB8IENDX0JBTktfT05FOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbCAmPSB+Q0NfQkFOS19PTkU7Ci0gICAgfQotICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCB2YWwpOwotICAgIHJldHVybjsKKwl2YWwgPSBBc2NHZXRDaGlwQ29udHJvbChpb3BfYmFzZSkgJgorCSAgICAofgorCSAgICAgKENDX1NJTkdMRV9TVEVQIHwgQ0NfVEVTVCB8IENDX0RJQUcgfCBDQ19TQ1NJX1JFU0VUIHwKKwkgICAgICBDQ19DSElQX1JFU0VUKSk7CisJaWYgKGJhbmsgPT0gMSkgeworCQl2YWwgfD0gQ0NfQkFOS19PTkU7CisJfSBlbHNlIGlmIChiYW5rID09IDIpIHsKKwkJdmFsIHw9IENDX0RJQUcgfCBDQ19CQU5LX09ORTsKKwl9IGVsc2UgeworCQl2YWwgJj0gfkNDX0JBTktfT05FOworCX0KKwlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgdmFsKTsKKwlyZXR1cm47CiB9CiAKLVNUQVRJQyBpbnQKLUFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCi0pCitzdGF0aWMgaW50IEFzY1Jlc2V0Q2hpcEFuZFNjc2lCdXMoQVNDX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgUG9ydEFkZHIgICAgaW9wX2Jhc2U7Ci0gICAgaW50ICAgICAgICAgaSA9IDEwOworCVBvcnRBZGRyIGlvcF9iYXNlOworCWludCBpID0gMTA7CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwotICAgIHdoaWxlICgoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfU0NTSV9SRVNFVF9BQ1RJVkUpICYmIChpLS0gPiAwKSkKLSAgICB7Ci0gICAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMDApOwotICAgIH0KLSAgICBBc2NTdG9wQ2hpcChpb3BfYmFzZSk7Ci0gICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIENDX0NISVBfUkVTRVQgfCBDQ19TQ1NJX1JFU0VUIHwgQ0NfSEFMVCk7Ci0gICAgRHZjRGVsYXlOYW5vU2Vjb25kKGFzY19kdmMsIDYwMDAwKTsKLSAgICBBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19SRkxBR19XVE0pOwotICAgIEFzY1NldENoaXBJSChpb3BfYmFzZSwgSU5TX0hBTFQpOwotICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19DSElQX1JFU0VUIHwgQ0NfSEFMVCk7Ci0gICAgQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIENDX0hBTFQpOwotICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMjAwKTsKLSAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCBDSVdfQ0xSX1NDU0lfUkVTRVRfSU5UKTsKLSAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKLSAgICByZXR1cm4gKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkpOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJd2hpbGUgKChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19TQ1NJX1JFU0VUX0FDVElWRSkKKwkgICAgICAgJiYgKGktLSA+IDApKSB7CisJCUR2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKKwl9CisJQXNjU3RvcENoaXAoaW9wX2Jhc2UpOworCUFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19DSElQX1JFU0VUIHwgQ0NfU0NTSV9SRVNFVCB8IENDX0hBTFQpOworCUR2Y0RlbGF5TmFub1NlY29uZChhc2NfZHZjLCA2MDAwMCk7CisJQXNjU2V0Q2hpcElIKGlvcF9iYXNlLCBJTlNfUkZMQUdfV1RNKTsKKwlBc2NTZXRDaGlwSUgoaW9wX2Jhc2UsIElOU19IQUxUKTsKKwlBc2NTZXRDaGlwQ29udHJvbChpb3BfYmFzZSwgQ0NfQ0hJUF9SRVNFVCB8IENDX0hBTFQpOworCUFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19IQUxUKTsKKwlEdmNTbGVlcE1pbGxpU2Vjb25kKDIwMCk7CisJQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgQ0lXX0NMUl9TQ1NJX1JFU0VUX0lOVCk7CisJQXNjU2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSwgMCk7CisJcmV0dXJuIChBc2NJc0NoaXBIYWx0ZWQoaW9wX2Jhc2UpKTsKIH0KIAotU1RBVElDIEFTQ19EQ05UIF9faW5pdAotQXNjR2V0TWF4RG1hQ291bnQoCi0gICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYnVzX3R5cGUpCitzdGF0aWMgQVNDX0RDTlQgX19pbml0IEFzY0dldE1heERtYUNvdW50KHVzaG9ydCBidXNfdHlwZSkKIHsKLSAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfSVNBKQotICAgICAgICByZXR1cm4gKEFTQ19NQVhfSVNBX0RNQV9DT1VOVCk7Ci0gICAgZWxzZSBpZiAoYnVzX3R5cGUgJiAoQVNDX0lTX0VJU0EgfCBBU0NfSVNfVkwpKQotICAgICAgICByZXR1cm4gKEFTQ19NQVhfVkxfRE1BX0NPVU5UKTsKLSAgICByZXR1cm4gKEFTQ19NQVhfUENJX0RNQV9DT1VOVCk7CisJaWYgKGJ1c190eXBlICYgQVNDX0lTX0lTQSkKKwkJcmV0dXJuIChBU0NfTUFYX0lTQV9ETUFfQ09VTlQpOworCWVsc2UgaWYgKGJ1c190eXBlICYgKEFTQ19JU19FSVNBIHwgQVNDX0lTX1ZMKSkKKwkJcmV0dXJuIChBU0NfTUFYX1ZMX0RNQV9DT1VOVCk7CisJcmV0dXJuIChBU0NfTUFYX1BDSV9ETUFfQ09VTlQpOwogfQogCiAjaWZkZWYgQ09ORklHX0lTQQotU1RBVElDIHVzaG9ydCBfX2luaXQKLUFzY0dldElzYURtYUNoYW5uZWwoCi0gICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlKQorc3RhdGljIHVzaG9ydCBfX2luaXQgQXNjR2V0SXNhRG1hQ2hhbm5lbChQb3J0QWRkciBpb3BfYmFzZSkKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNoYW5uZWw7CisJdXNob3J0IGNoYW5uZWw7CiAKLSAgICBjaGFubmVsID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSkgJiAweDAwMDM7Ci0gICAgaWYgKGNoYW5uZWwgPT0gMHgwMykKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICBlbHNlIGlmIChjaGFubmVsID09IDB4MDApCi0gICAgICAgIHJldHVybiAoNyk7Ci0gICAgcmV0dXJuIChjaGFubmVsICsgNCk7CisJY2hhbm5lbCA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHgwMDAzOworCWlmIChjaGFubmVsID09IDB4MDMpCisJCXJldHVybiAoMCk7CisJZWxzZSBpZiAoY2hhbm5lbCA9PSAweDAwKQorCQlyZXR1cm4gKDcpOworCXJldHVybiAoY2hhbm5lbCArIDQpOwogfQogCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQXNjU2V0SXNhRG1hQ2hhbm5lbCgKLSAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBkbWFfY2hhbm5lbCkKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY1NldElzYURtYUNoYW5uZWwoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBkbWFfY2hhbm5lbCkKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19sc3c7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICB2YWx1ZTsKKwl1c2hvcnQgY2ZnX2xzdzsKKwl1Y2hhciB2YWx1ZTsKIAotICAgIGlmICgoZG1hX2NoYW5uZWwgPj0gNSkgJiYgKGRtYV9jaGFubmVsIDw9IDcpKSB7Ci0gICAgICAgIGlmIChkbWFfY2hhbm5lbCA9PSA3KQotICAgICAgICAgICAgdmFsdWUgPSAweDAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YWx1ZSA9IGRtYV9jaGFubmVsIC0gNDsKLSAgICAgICAgY2ZnX2xzdyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpICYgMHhGRkZDOwotICAgICAgICBjZmdfbHN3IHw9IHZhbHVlOwotICAgICAgICBBc2NTZXRDaGlwQ2ZnTHN3KGlvcF9iYXNlLCBjZmdfbHN3KTsKLSAgICAgICAgcmV0dXJuIChBc2NHZXRJc2FEbWFDaGFubmVsKGlvcF9iYXNlKSk7Ci0gICAgfQotICAgIHJldHVybiAoMCk7CisJaWYgKChkbWFfY2hhbm5lbCA+PSA1KSAmJiAoZG1hX2NoYW5uZWwgPD0gNykpIHsKKwkJaWYgKGRtYV9jaGFubmVsID09IDcpCisJCQl2YWx1ZSA9IDB4MDA7CisJCWVsc2UKKwkJCXZhbHVlID0gZG1hX2NoYW5uZWwgLSA0OworCQljZmdfbHN3ID0gQXNjR2V0Q2hpcENmZ0xzdyhpb3BfYmFzZSkgJiAweEZGRkM7CisJCWNmZ19sc3cgfD0gdmFsdWU7CisJCUFzY1NldENoaXBDZmdMc3coaW9wX2Jhc2UsIGNmZ19sc3cpOworCQlyZXR1cm4gKEFzY0dldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UpKTsKKwl9CisJcmV0dXJuICgwKTsKIH0KIAotU1RBVElDIHVjaGFyIF9faW5pdAotQXNjU2V0SXNhRG1hU3BlZWQoCi0gICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIHVjaGFyIHNwZWVkX3ZhbHVlKQorc3RhdGljIHVjaGFyIF9faW5pdCBBc2NTZXRJc2FEbWFTcGVlZChQb3J0QWRkciBpb3BfYmFzZSwgdWNoYXIgc3BlZWRfdmFsdWUpCiB7Ci0gICAgc3BlZWRfdmFsdWUgJj0gMHgwNzsKLSAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKLSAgICBBc2NXcml0ZUNoaXBEbWFTcGVlZChpb3BfYmFzZSwgc3BlZWRfdmFsdWUpOwotICAgIEFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOwotICAgIHJldHVybiAoQXNjR2V0SXNhRG1hU3BlZWQoaW9wX2Jhc2UpKTsKKwlzcGVlZF92YWx1ZSAmPSAweDA3OworCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDEpOworCUFzY1dyaXRlQ2hpcERtYVNwZWVkKGlvcF9iYXNlLCBzcGVlZF92YWx1ZSk7CisJQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7CisJcmV0dXJuIChBc2NHZXRJc2FEbWFTcGVlZChpb3BfYmFzZSkpOwogfQogCi1TVEFUSUMgdWNoYXIgX19pbml0Ci1Bc2NHZXRJc2FEbWFTcGVlZCgKLSAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlCi0pCitzdGF0aWMgdWNoYXIgX19pbml0IEFzY0dldElzYURtYVNwZWVkKFBvcnRBZGRyIGlvcF9iYXNlKQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgc3BlZWRfdmFsdWU7CisJdWNoYXIgc3BlZWRfdmFsdWU7CiAKLSAgICBBc2NTZXRCYW5rKGlvcF9iYXNlLCAxKTsKLSAgICBzcGVlZF92YWx1ZSA9IEFzY1JlYWRDaGlwRG1hU3BlZWQoaW9wX2Jhc2UpOwotICAgIHNwZWVkX3ZhbHVlICY9IDB4MDc7Ci0gICAgQXNjU2V0QmFuayhpb3BfYmFzZSwgMCk7Ci0gICAgcmV0dXJuIChzcGVlZF92YWx1ZSk7CisJQXNjU2V0QmFuayhpb3BfYmFzZSwgMSk7CisJc3BlZWRfdmFsdWUgPSBBc2NSZWFkQ2hpcERtYVNwZWVkKGlvcF9iYXNlKTsKKwlzcGVlZF92YWx1ZSAmPSAweDA3OworCUFzY1NldEJhbmsoaW9wX2Jhc2UsIDApOworCXJldHVybiAoc3BlZWRfdmFsdWUpOwogfQogI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KIAotU1RBVElDIHVzaG9ydCBfX2luaXQKLUFzY1JlYWRQQ0lDb25maWdXb3JkKAotICAgIEFTQ19EVkNfVkFSICphc2NfZHZjLAotICAgIHVzaG9ydCBwY2lfY29uZmlnX29mZnNldCkKK3N0YXRpYyB1c2hvcnQgX19pbml0CitBc2NSZWFkUENJQ29uZmlnV29yZChBU0NfRFZDX1ZBUiAqYXNjX2R2YywgdXNob3J0IHBjaV9jb25maWdfb2Zmc2V0KQogewotICAgIHVjaGFyICAgICAgIGxzYiwgbXNiOworCXVjaGFyIGxzYiwgbXNiOwogCi0gICAgbHNiID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgcGNpX2NvbmZpZ19vZmZzZXQpOwotICAgIG1zYiA9IER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsIHBjaV9jb25maWdfb2Zmc2V0ICsgMSk7Ci0gICAgcmV0dXJuICgodXNob3J0KSAoKG1zYiA8PCA4KSB8IGxzYikpOworCWxzYiA9IER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsIHBjaV9jb25maWdfb2Zmc2V0KTsKKwltc2IgPSBEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBwY2lfY29uZmlnX29mZnNldCArIDEpOworCXJldHVybiAoKHVzaG9ydCkoKG1zYiA8PCA4KSB8IGxzYikpOwogfQogCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQXNjSW5pdEdldENvbmZpZygKLSAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKLSkKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY0luaXRHZXRDb25maWcoQVNDX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIFBDSURldmljZUlEOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgUENJVmVuZG9ySUQ7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBQQ0lSZXZpc2lvbklEOwotICAgIHVjaGFyICAgICAgICAgICAgICAgcHJldkNtZFJlZ0JpdHM7CisJdXNob3J0IHdhcm5fY29kZTsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwl1c2hvcnQgUENJRGV2aWNlSUQ7CisJdXNob3J0IFBDSVZlbmRvcklEOworCXVjaGFyIFBDSVJldmlzaW9uSUQ7CisJdWNoYXIgcHJldkNtZFJlZ0JpdHM7CiAKLSAgICB3YXJuX2NvZGUgPSAwOwotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7Ci0gICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSA9IEFTQ19JTklUX1NUQVRFX0JFR19HRVRfQ0ZHOwotICAgIGlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAoVVdfRVJSKTsKLSAgICB9Ci0gICAgaWYgKGFzY19kdmMtPmJ1c190eXBlID09IEFTQ19JU19QQ0kpIHsKLSAgICAgICAgUENJVmVuZG9ySUQgPSBBc2NSZWFkUENJQ29uZmlnV29yZChhc2NfZHZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnVmVuZG9ySURSZWdpc3Rlcik7CisJd2Fybl9jb2RlID0gMDsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCWFzY19kdmMtPmluaXRfc3RhdGUgPSBBU0NfSU5JVF9TVEFURV9CRUdfR0VUX0NGRzsKKwlpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkgeworCQlyZXR1cm4gKFVXX0VSUik7CisJfQorCWlmIChhc2NfZHZjLT5idXNfdHlwZSA9PSBBU0NfSVNfUENJKSB7CisJCVBDSVZlbmRvcklEID0gQXNjUmVhZFBDSUNvbmZpZ1dvcmQoYXNjX2R2YywKKwkJCQkJCSAgIEFzY1BDSUNvbmZpZ1ZlbmRvcklEUmVnaXN0ZXIpOwogCi0gICAgICAgIFBDSURldmljZUlEID0gQXNjUmVhZFBDSUNvbmZpZ1dvcmQoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0RldmljZUlEUmVnaXN0ZXIpOworCQlQQ0lEZXZpY2VJRCA9IEFzY1JlYWRQQ0lDb25maWdXb3JkKGFzY19kdmMsCisJCQkJCQkgICBBc2NQQ0lDb25maWdEZXZpY2VJRFJlZ2lzdGVyKTsKIAotICAgICAgICBQQ0lSZXZpc2lvbklEID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ1JldmlzaW9uSURSZWdpc3Rlcik7CisJCVBDSVJldmlzaW9uSUQgPSBEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLAorCQkJCQkJICAgICBBc2NQQ0lDb25maWdSZXZpc2lvbklEUmVnaXN0ZXIpOwogCi0gICAgICAgIGlmIChQQ0lWZW5kb3JJRCAhPSBQQ0lfVkVORE9SX0lEX0FTUCkgewotICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOwotICAgICAgICB9Ci0gICAgICAgIHByZXZDbWRSZWdCaXRzID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0NvbW1hbmRSZWdpc3Rlcik7CisJCWlmIChQQ0lWZW5kb3JJRCAhPSBQQ0lfVkVORE9SX0lEX0FTUCkgeworCQkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOworCQl9CisJCXByZXZDbWRSZWdCaXRzID0gRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKwkJCQkJCSAgICAgIEFzY1BDSUNvbmZpZ0NvbW1hbmRSZWdpc3Rlcik7CiAKLSAgICAgICAgaWYgKChwcmV2Q21kUmVnQml0cyAmIEFzY1BDSUNtZFJlZ0JpdHNfSU9NZW1CdXNNYXN0ZXIpICE9Ci0gICAgICAgICAgICBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSB7Ci0gICAgICAgICAgICBEdmNXcml0ZVBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZDbWRSZWdCaXRzIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikpOworCQlpZiAoKHByZXZDbWRSZWdCaXRzICYgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikgIT0KKwkJICAgIEFzY1BDSUNtZFJlZ0JpdHNfSU9NZW1CdXNNYXN0ZXIpIHsKKwkJCUR2Y1dyaXRlUENJQ29uZmlnQnl0ZShhc2NfZHZjLAorCQkJCQkgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIsCisJCQkJCSAgICAgIChwcmV2Q21kUmVnQml0cyB8CisJCQkJCSAgICAgICBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSk7CiAKLSAgICAgICAgICAgIGlmICgoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKQotICAgICAgICAgICAgICAgICAmIEFzY1BDSUNtZFJlZ0JpdHNfSU9NZW1CdXNNYXN0ZXIpCi0gICAgICAgICAgICAgICAgIT0gQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikgewotICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKFBDSURldmljZUlEID09IFBDSV9ERVZJQ0VfSURfQVNQXzEyMDBBKSB8fAotICAgICAgICAgICAgKFBDSURldmljZUlEID09IFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MCkpIHsKLSAgICAgICAgICAgIER2Y1dyaXRlUENJQ29uZmlnQnl0ZShhc2NfZHZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgwMCk7Ci0gICAgICAgICAgICBpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKQotICAgICAgICAgICAgICAgICE9IDB4MDApIHsKLSAgICAgICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fU0VUX1BDSV9DT05GSUdfU1BBQ0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoUENJRGV2aWNlSUQgPT0gUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVSkgewotICAgICAgICAgICAgaWYgKER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lcikgPCAweDIwKSB7Ci0gICAgICAgICAgICAgICAgRHZjV3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdMYXRlbmN5VGltZXIsIDB4MjApOworCQkJaWYgKChEdmNSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLAorCQkJCQkJICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpCisJCQkgICAgICYgQXNjUENJQ21kUmVnQml0c19JT01lbUJ1c01hc3RlcikKKwkJCSAgICAhPSBBc2NQQ0lDbWRSZWdCaXRzX0lPTWVtQnVzTWFzdGVyKSB7CisJCQkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOworCQkJfQorCQl9CisJCWlmICgoUENJRGV2aWNlSUQgPT0gUENJX0RFVklDRV9JRF9BU1BfMTIwMEEpIHx8CisJCSAgICAoUENJRGV2aWNlSUQgPT0gUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwKSkgeworCQkJRHZjV3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsCisJCQkJCSAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgwMCk7CisJCQlpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUKKwkJCSAgICAoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKQorCQkJICAgICE9IDB4MDApIHsKKwkJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fU0VUX1BDSV9DT05GSUdfU1BBQ0U7CisJCQl9CisJCX0gZWxzZSBpZiAoUENJRGV2aWNlSUQgPT0gUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVSkgeworCQkJaWYgKER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisJCQkJCQkgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8CisJCQkgICAgMHgyMCkgeworCQkJCUR2Y1dyaXRlUENJQ29uZmlnQnl0ZShhc2NfZHZjLAorCQkJCQkJICAgICAgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyLAorCQkJCQkJICAgICAgMHgyMCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoRHZjUmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lcikgPCAweDIwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCQkJaWYgKER2Y1JlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisJCQkJCQkJIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lcikKKwkJCQkgICAgPCAweDIwKSB7CisJCQkJCXdhcm5fY29kZSB8PQorCQkJCQkgICAgQVNDX1dBUk5fU0VUX1BDSV9DT05GSUdfU1BBQ0U7CisJCQkJfQorCQkJfQorCQl9CisJfQogCi0gICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpKSB7Ci0gICAgICAgIHdhcm5fY29kZSB8PSBBc2NJbml0QXNjRHZjVmFyKGFzY19kdmMpOwotICAgICAgICB3YXJuX2NvZGUgfD0gQXNjSW5pdEZyb21FRVAoYXNjX2R2Yyk7Ci0gICAgICAgIGFzY19kdmMtPmluaXRfc3RhdGUgfD0gQVNDX0lOSVRfU1RBVEVfRU5EX0dFVF9DRkc7Ci0gICAgICAgIGlmIChhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPiBBU0NfTUFYX1NDU0lfUkVTRVRfV0FJVCkgewotICAgICAgICAgICAgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID0gQVNDX01BWF9TQ1NJX1JFU0VUX1dBSVQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSA9IEFTQ19JRVJSX0JBRF9TSUdOQVRVUkU7Ci0gICAgfQotICAgIHJldHVybih3YXJuX2NvZGUpOworCWlmIChBc2NGaW5kU2lnbmF0dXJlKGlvcF9iYXNlKSkgeworCQl3YXJuX2NvZGUgfD0gQXNjSW5pdEFzY0R2Y1Zhcihhc2NfZHZjKTsKKwkJd2Fybl9jb2RlIHw9IEFzY0luaXRGcm9tRUVQKGFzY19kdmMpOworCQlhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0VORF9HRVRfQ0ZHOworCQlpZiAoYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID4gQVNDX01BWF9TQ1NJX1JFU0VUX1dBSVQpIHsKKwkJCWFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IEFTQ19NQVhfU0NTSV9SRVNFVF9XQUlUOworCQl9CisJfSBlbHNlIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFOworCX0KKwlyZXR1cm4gKHdhcm5fY29kZSk7CiB9CiAKLVNUQVRJQyB1c2hvcnQgX19pbml0Ci1Bc2NJbml0U2V0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICBBU0NfRFZDX1ZBUiAqYXNjX2R2YwotKQorc3RhdGljIHVzaG9ydCBfX2luaXQgQXNjSW5pdFNldENvbmZpZyhBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZSA9IDA7CisJdXNob3J0IHdhcm5fY29kZSA9IDA7CiAKLSAgICBhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0JFR19TRVRfQ0ZHOwotICAgIGlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKQotICAgICAgICByZXR1cm4gKFVXX0VSUik7Ci0gICAgaWYgKEFzY0ZpbmRTaWduYXR1cmUoYXNjX2R2Yy0+aW9wX2Jhc2UpKSB7Ci0gICAgICAgIHdhcm5fY29kZSB8PSBBc2NJbml0RnJvbUFzY0R2Y1Zhcihhc2NfZHZjKTsKLSAgICAgICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9FTkRfU0VUX0NGRzsKLSAgICB9IGVsc2UgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSA9IEFTQ19JRVJSX0JBRF9TSUdOQVRVUkU7Ci0gICAgfQotICAgIHJldHVybiAod2Fybl9jb2RlKTsKKwlhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1NUQVRFX0JFR19TRVRfQ0ZHOworCWlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKQorCQlyZXR1cm4gKFVXX0VSUik7CisJaWYgKEFzY0ZpbmRTaWduYXR1cmUoYXNjX2R2Yy0+aW9wX2Jhc2UpKSB7CisJCXdhcm5fY29kZSB8PSBBc2NJbml0RnJvbUFzY0R2Y1Zhcihhc2NfZHZjKTsKKwkJYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9FTkRfU0VUX0NGRzsKKwl9IGVsc2UgeworCQlhc2NfZHZjLT5lcnJfY29kZSA9IEFTQ19JRVJSX0JBRF9TSUdOQVRVUkU7CisJfQorCXJldHVybiAod2Fybl9jb2RlKTsKIH0KIAotU1RBVElDIHVzaG9ydCBfX2luaXQKLUFzY0luaXRGcm9tQXNjRHZjVmFyKAotICAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKLSkKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY0luaXRGcm9tQXNjRHZjVmFyKEFTQ19EVkNfVkFSICphc2NfZHZjKQogewotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBjZmdfbXN3OwotICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgcGNpX2RldmljZV9pZCA9IDA7CisJUG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IGNmZ19tc3c7CisJdXNob3J0IHdhcm5fY29kZTsKKwl1c2hvcnQgcGNpX2RldmljZV9pZCA9IDA7CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CiAjaWZkZWYgQ09ORklHX1BDSQotICAgIGlmIChhc2NfZHZjLT5jZmctPmRldikKLSAgICAgICAgcGNpX2RldmljZV9pZCA9IHRvX3BjaV9kZXYoYXNjX2R2Yy0+Y2ZnLT5kZXYpLT5kZXZpY2U7CisJaWYgKGFzY19kdmMtPmNmZy0+ZGV2KQorCQlwY2lfZGV2aWNlX2lkID0gdG9fcGNpX2Rldihhc2NfZHZjLT5jZmctPmRldiktPmRldmljZTsKICNlbmRpZgotICAgIHdhcm5fY29kZSA9IDA7Ci0gICAgY2ZnX21zdyA9IEFzY0dldENoaXBDZmdNc3coaW9wX2Jhc2UpOwotICAgIGlmICgoY2ZnX21zdyAmIEFTQ19DRkdfTVNXX0NMUl9NQVNLKSAhPSAwKSB7Ci0gICAgICAgIGNmZ19tc3cgJj0gKH4oQVNDX0NGR19NU1dfQ0xSX01BU0spKTsKLSAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NGR19NU1dfUkVDT1ZFUjsKLSAgICAgICAgQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7Ci0gICAgfQotICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT5jbWRfcW5nX2VuYWJsZWQgJiBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKSAhPQotICAgICAgICBhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCkgewotICAgICAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gYXNjX2R2Yy0+Y2ZnLT5jbWRfcW5nX2VuYWJsZWQ7Ci0gICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9DTURfUU5HX0NPTkZMSUNUOwotICAgIH0KLSAgICBpZiAoQXNjR2V0Q2hpcFN0YXR1cyhpb3BfYmFzZSkgJiBDU1dfQVVUT19DT05GSUcpIHsKLSAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0FVVE9fQ09ORklHOwotICAgIH0KLSAgICBpZiAoKGFzY19kdmMtPmJ1c190eXBlICYgKEFTQ19JU19JU0EgfCBBU0NfSVNfVkwpKSAhPSAwKSB7Ci0gICAgICAgIGlmIChBc2NTZXRDaGlwSVJRKGlvcF9iYXNlLCBhc2NfZHZjLT5pcnFfbm8sIGFzY19kdmMtPmJ1c190eXBlKQotICAgICAgICAgICAgIT0gYXNjX2R2Yy0+aXJxX25vKSB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TRVRfSVJRX05POwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19QQ0kpIHsKLSAgICAgICAgY2ZnX21zdyAmPSAweEZGQzA7Ci0gICAgICAgIEFzY1NldENoaXBDZmdNc3coaW9wX2Jhc2UsIGNmZ19tc3cpOwotICAgICAgICBpZiAoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSV9VTFRSQSkgPT0gQVNDX0lTX1BDSV9VTFRSQSkgewotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChwY2lfZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQVNQXzEyMDBBKSB8fAotICAgICAgICAgICAgICAgIChwY2lfZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MCkpIHsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5idWdfZml4X2NudGwgfD0gQVNDX0JVR19GSVhfSUZfTk9UX0RXQjsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5idWdfZml4X2NudGwgfD0gQVNDX0JVR19GSVhfQVNZTl9VU0VfU1lOOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChhc2NfZHZjLT5idXNfdHlwZSA9PSBBU0NfSVNfSVNBUE5QKSB7Ci0gICAgICAgIGlmIChBc2NHZXRDaGlwVmVyc2lvbihpb3BfYmFzZSwgYXNjX2R2Yy0+YnVzX3R5cGUpCi0gICAgICAgICAgICA9PSBBU0NfQ0hJUF9WRVJfQVNZTl9CVUcpIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmJ1Z19maXhfY250bCB8PSBBU0NfQlVHX0ZJWF9BU1lOX1VTRV9TWU47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKEFzY1NldENoaXBTY3NpSUQoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+Y2hpcF9zY3NpX2lkKSAhPQotICAgICAgICBhc2NfZHZjLT5jZmctPmNoaXBfc2NzaV9pZCkgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TRVRfU0NTSV9JRDsKLSAgICB9CisJd2Fybl9jb2RlID0gMDsKKwljZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7CisJaWYgKChjZmdfbXN3ICYgQVNDX0NGR19NU1dfQ0xSX01BU0spICE9IDApIHsKKwkJY2ZnX21zdyAmPSAofihBU0NfQ0ZHX01TV19DTFJfTUFTSykpOworCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQ0ZHX01TV19SRUNPVkVSOworCQlBc2NTZXRDaGlwQ2ZnTXN3KGlvcF9iYXNlLCBjZmdfbXN3KTsKKwl9CisJaWYgKChhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCAmIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUpICE9CisJICAgIGFzY19kdmMtPmNmZy0+Y21kX3FuZ19lbmFibGVkKSB7CisJCWFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZDsKKwkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q7CisJfQorCWlmIChBc2NHZXRDaGlwU3RhdHVzKGlvcF9iYXNlKSAmIENTV19BVVRPX0NPTkZJRykgeworCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fQVVUT19DT05GSUc7CisJfQorCWlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiAoQVNDX0lTX0lTQSB8IEFTQ19JU19WTCkpICE9IDApIHsKKwkJaWYgKEFzY1NldENoaXBJUlEoaW9wX2Jhc2UsIGFzY19kdmMtPmlycV9ubywgYXNjX2R2Yy0+YnVzX3R5cGUpCisJCSAgICAhPSBhc2NfZHZjLT5pcnFfbm8pIHsKKwkJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9JUlFfTk87CisJCX0KKwl9CisJaWYgKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgeworCQljZmdfbXN3ICY9IDB4RkZDMDsKKwkJQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7CisJCWlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfUENJX1VMVFJBKSA9PSBBU0NfSVNfUENJX1VMVFJBKSB7CisJCX0gZWxzZSB7CisJCQlpZiAoKHBjaV9kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9BU1BfMTIwMEEpIHx8CisJCQkgICAgKHBjaV9kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwKSkgeworCQkJCWFzY19kdmMtPmJ1Z19maXhfY250bCB8PSBBU0NfQlVHX0ZJWF9JRl9OT1RfRFdCOworCQkJCWFzY19kdmMtPmJ1Z19maXhfY250bCB8PQorCQkJCSAgICBBU0NfQlVHX0ZJWF9BU1lOX1VTRV9TWU47CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGFzY19kdmMtPmJ1c190eXBlID09IEFTQ19JU19JU0FQTlApIHsKKwkJaWYgKEFzY0dldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSkKKwkJICAgID09IEFTQ19DSElQX1ZFUl9BU1lOX0JVRykgeworCQkJYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsIHw9IEFTQ19CVUdfRklYX0FTWU5fVVNFX1NZTjsKKwkJfQorCX0KKwlpZiAoQXNjU2V0Q2hpcFNjc2lJRChpb3BfYmFzZSwgYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQpICE9CisJICAgIGFzY19kdmMtPmNmZy0+Y2hpcF9zY3NpX2lkKSB7CisJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9TQ1NJX0lEOworCX0KICNpZmRlZiBDT05GSUdfSVNBCi0gICAgaWYgKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX0lTQSkgewotICAgICAgICBBc2NTZXRJc2FEbWFDaGFubmVsKGlvcF9iYXNlLCBhc2NfZHZjLT5jZmctPmlzYV9kbWFfY2hhbm5lbCk7Ci0gICAgICAgIEFzY1NldElzYURtYVNwZWVkKGlvcF9iYXNlLCBhc2NfZHZjLT5jZmctPmlzYV9kbWFfc3BlZWQpOwotICAgIH0KKwlpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSB7CisJCUFzY1NldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9jaGFubmVsKTsKKwkJQXNjU2V0SXNhRG1hU3BlZWQoaW9wX2Jhc2UsIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9zcGVlZCk7CisJfQogI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KLSAgICByZXR1cm4gKHdhcm5fY29kZSk7CisJcmV0dXJuICh3YXJuX2NvZGUpOwogfQogCi1TVEFUSUMgdXNob3J0Ci1Bc2NJbml0QXNjMTAwMERyaXZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjCi0pCitzdGF0aWMgdXNob3J0IEFzY0luaXRBc2MxMDAwRHJpdmVyKEFTQ19EVkNfVkFSICphc2NfZHZjKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOwotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7CisJdXNob3J0IHdhcm5fY29kZTsKKwlQb3J0QWRkciBpb3BfYmFzZTsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7Ci0gICAgd2Fybl9jb2RlID0gMDsKLSAgICBpZiAoKGFzY19kdmMtPmR2Y19jbnRsICYgQVNDX0NOVExfUkVTRVRfU0NTSSkgJiYKLSAgICAgICAgIShhc2NfZHZjLT5pbml0X3N0YXRlICYgQVNDX0lOSVRfUkVTRVRfU0NTSV9ET05FKSkgewotICAgICAgICBBc2NSZXNldENoaXBBbmRTY3NpQnVzKGFzY19kdmMpOwotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKChBU0NfRENOVCkKLSAgICAgICAgICAgICgodXNob3J0KSBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgKiAxMDAwKSk7Ci0gICAgfQotICAgIGFzY19kdmMtPmluaXRfc3RhdGUgfD0gQVNDX0lOSVRfU1RBVEVfQkVHX0xPQURfTUM7Ci0gICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCi0gICAgICAgIHJldHVybiAoVVdfRVJSKTsKLSAgICBpZiAoIUFzY0ZpbmRTaWduYXR1cmUoYXNjX2R2Yy0+aW9wX2Jhc2UpKSB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKLSAgICAgICAgcmV0dXJuICh3YXJuX2NvZGUpOwotICAgIH0KLSAgICBBc2NEaXNhYmxlSW50ZXJydXB0KGlvcF9iYXNlKTsKLSAgICB3YXJuX2NvZGUgfD0gQXNjSW5pdExyYW0oYXNjX2R2Yyk7Ci0gICAgaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApCi0gICAgICAgIHJldHVybiAoVVdfRVJSKTsKLSAgICBBU0NfREJHMSgxLCAiQXNjSW5pdEFzYzEwMDBEcml2ZXI6IF9hc2NfbWNvZGVfY2hrc3VtIDB4JWx4XG4iLAotICAgICAgICAodWxvbmcpIF9hc2NfbWNvZGVfY2hrc3VtKTsKLSAgICBpZiAoQXNjTG9hZE1pY3JvQ29kZShpb3BfYmFzZSwgMCwgX2FzY19tY29kZV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX2FzY19tY29kZV9zaXplKSAhPSBfYXNjX21jb2RlX2Noa3N1bSkgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07Ci0gICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKLSAgICB9Ci0gICAgd2Fybl9jb2RlIHw9IEFzY0luaXRNaWNyb0NvZGVWYXIoYXNjX2R2Yyk7Ci0gICAgYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9FTkRfTE9BRF9NQzsKLSAgICBBc2NFbmFibGVJbnRlcnJ1cHQoaW9wX2Jhc2UpOwotICAgIHJldHVybiAod2Fybl9jb2RlKTsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCXdhcm5fY29kZSA9IDA7CisJaWYgKChhc2NfZHZjLT5kdmNfY250bCAmIEFTQ19DTlRMX1JFU0VUX1NDU0kpICYmCisJICAgICEoYXNjX2R2Yy0+aW5pdF9zdGF0ZSAmIEFTQ19JTklUX1JFU0VUX1NDU0lfRE9ORSkpIHsKKwkJQXNjUmVzZXRDaGlwQW5kU2NzaUJ1cyhhc2NfZHZjKTsKKwkJRHZjU2xlZXBNaWxsaVNlY29uZCgoQVNDX0RDTlQpCisJCQkJICAgICgodXNob3J0KWFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCAqIDEwMDApKTsKKwl9CisJYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9CRUdfTE9BRF9NQzsKKwlpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKwkJcmV0dXJuIChVV19FUlIpOworCWlmICghQXNjRmluZFNpZ25hdHVyZShhc2NfZHZjLT5pb3BfYmFzZSkpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfU0lHTkFUVVJFOworCQlyZXR1cm4gKHdhcm5fY29kZSk7CisJfQorCUFzY0Rpc2FibGVJbnRlcnJ1cHQoaW9wX2Jhc2UpOworCXdhcm5fY29kZSB8PSBBc2NJbml0THJhbShhc2NfZHZjKTsKKwlpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKKwkJcmV0dXJuIChVV19FUlIpOworCUFTQ19EQkcxKDEsICJBc2NJbml0QXNjMTAwMERyaXZlcjogX2FzY19tY29kZV9jaGtzdW0gMHglbHhcbiIsCisJCSAodWxvbmcpX2FzY19tY29kZV9jaGtzdW0pOworCWlmIChBc2NMb2FkTWljcm9Db2RlKGlvcF9iYXNlLCAwLCBfYXNjX21jb2RlX2J1ZiwKKwkJCSAgICAgX2FzY19tY29kZV9zaXplKSAhPSBfYXNjX21jb2RlX2Noa3N1bSkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07CisJCXJldHVybiAod2Fybl9jb2RlKTsKKwl9CisJd2Fybl9jb2RlIHw9IEFzY0luaXRNaWNyb0NvZGVWYXIoYXNjX2R2Yyk7CisJYXNjX2R2Yy0+aW5pdF9zdGF0ZSB8PSBBU0NfSU5JVF9TVEFURV9FTkRfTE9BRF9NQzsKKwlBc2NFbmFibGVJbnRlcnJ1cHQoaW9wX2Jhc2UpOworCXJldHVybiAod2Fybl9jb2RlKTsKIH0KIAotU1RBVElDIHVzaG9ydCBfX2luaXQKLUFzY0luaXRBc2NEdmNWYXIoCi0gICAgICAgICAgICAgICAgICAgIEFTQ19EVkNfVkFSICphc2NfZHZjKQorc3RhdGljIHVzaG9ydCBfX2luaXQgQXNjSW5pdEFzY0R2Y1ZhcihBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGNoaXBfdmVyc2lvbjsKKwlpbnQgaTsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwl1c2hvcnQgd2Fybl9jb2RlOworCXVjaGFyIGNoaXBfdmVyc2lvbjsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7Ci0gICAgd2Fybl9jb2RlID0gMDsKLSAgICBhc2NfZHZjLT5lcnJfY29kZSA9IDA7Ci0gICAgaWYgKChhc2NfZHZjLT5idXNfdHlwZSAmCi0gICAgICAgICAoQVNDX0lTX0lTQSB8IEFTQ19JU19QQ0kgfCBBU0NfSVNfRUlTQSB8IEFTQ19JU19WTCkpID09IDApIHsKLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfTk9fQlVTX1RZUEU7Ci0gICAgfQotICAgIEFzY1NldENoaXBDb250cm9sKGlvcF9iYXNlLCBDQ19IQUxUKTsKLSAgICBBc2NTZXRDaGlwU3RhdHVzKGlvcF9iYXNlLCAwKTsKLSAgICBhc2NfZHZjLT5idWdfZml4X2NudGwgPSAwOwotICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyID0gMDsKLSAgICBhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlcl9hbHdheXMgPSAwOwotICAgIC8qIGFzY19kdmMtPmluaXRfc3RhdGUgaW5pdGFsaXplZCBpbiBBc2NJbml0R2V0Q29uZmlnKCkuICovCi0gICAgYXNjX2R2Yy0+c2R0cl9kb25lID0gMDsKLSAgICBhc2NfZHZjLT5jdXJfdG90YWxfcW5nID0gMDsKLSAgICBhc2NfZHZjLT5pc19pbl9pbnQgPSAwOwotICAgIGFzY19kdmMtPmluX2NyaXRpY2FsX2NudCA9IDA7Ci0gICAgYXNjX2R2Yy0+bGFzdF9xX3Nob3J0YWdlID0gMDsKLSAgICBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZyA9IDA7Ci0gICAgYXNjX2R2Yy0+bm9fc2NhbSA9IDA7Ci0gICAgYXNjX2R2Yy0+dW5pdF9ub3RfcmVhZHkgPSAwOwotICAgIGFzY19kdmMtPnF1ZXVlX2Z1bGxfb3JfYnVzeSA9IDA7Ci0gICAgYXNjX2R2Yy0+cmVkb19zY2FtID0gMDsKLSAgICBhc2NfZHZjLT5yZXMyID0gMDsKLSAgICBhc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleCA9IDA7Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5jYW5fdGFnZ2VkX3FuZyA9IDA7Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5jbWRfcW5nX2VuYWJsZWQgPSAwOwotICAgIGFzY19kdmMtPmR2Y19jbnRsID0gQVNDX0RFRl9EVkNfQ05UTDsKLSAgICBhc2NfZHZjLT5pbml0X3NkdHIgPSAwOwotICAgIGFzY19kdmMtPm1heF90b3RhbF9xbmcgPSBBU0NfREVGX01BWF9UT1RBTF9RTkc7Ci0gICAgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID0gMzsKLSAgICBhc2NfZHZjLT5zdGFydF9tb3RvciA9IEFTQ19TQ1NJX1dJRFRIX0JJVF9TRVQ7Ci0gICAgYXNjX2R2Yy0+bWF4X2RtYV9jb3VudCA9IEFzY0dldE1heERtYUNvdW50KGFzY19kdmMtPmJ1c190eXBlKTsKLSAgICBhc2NfZHZjLT5jZmctPnNkdHJfZW5hYmxlID0gQVNDX1NDU0lfV0lEVEhfQklUX1NFVDsKLSAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gQVNDX1NDU0lfV0lEVEhfQklUX1NFVDsKLSAgICBhc2NfZHZjLT5jZmctPmNoaXBfc2NzaV9pZCA9IEFTQ19ERUZfQ0hJUF9TQ1NJX0lEOwotICAgIGFzY19kdmMtPmNmZy0+bGliX3NlcmlhbF9ubyA9IEFTQ19MSUJfU0VSSUFMX05VTUJFUjsKLSAgICBhc2NfZHZjLT5jZmctPmxpYl92ZXJzaW9uID0gKEFTQ19MSUJfVkVSU0lPTl9NQUpPUiA8PCA4KSB8Ci0gICAgICBBU0NfTElCX1ZFUlNJT05fTUlOT1I7Ci0gICAgY2hpcF92ZXJzaW9uID0gQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKTsKLSAgICBhc2NfZHZjLT5jZmctPmNoaXBfdmVyc2lvbiA9IGNoaXBfdmVyc2lvbjsKLSAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMF0gPSBTWU5fWEZFUl9OU18wOwotICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxXSA9IFNZTl9YRkVSX05TXzE7Ci0gICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzJdID0gU1lOX1hGRVJfTlNfMjsKLSAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbM10gPSBTWU5fWEZFUl9OU18zOwotICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFs0XSA9IFNZTl9YRkVSX05TXzQ7Ci0gICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzVdID0gU1lOX1hGRVJfTlNfNTsKLSAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNl0gPSBTWU5fWEZFUl9OU182OwotICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFs3XSA9IFNZTl9YRkVSX05TXzc7Ci0gICAgYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggPSA3OwotICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfUENJKSAmJgotICAgICAgICAoY2hpcF92ZXJzaW9uID49IEFTQ19DSElQX1ZFUl9QQ0lfVUxUUkFfMzE1MCkpIHsKLSAgICAgICAgYXNjX2R2Yy0+YnVzX3R5cGUgPSBBU0NfSVNfUENJX1VMVFJBOwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMF0gPSBTWU5fVUxUUkFfWEZFUl9OU18wOwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMV0gPSBTWU5fVUxUUkFfWEZFUl9OU18xOwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMl0gPSBTWU5fVUxUUkFfWEZFUl9OU18yOwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbM10gPSBTWU5fVUxUUkFfWEZFUl9OU18zOwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNF0gPSBTWU5fVUxUUkFfWEZFUl9OU180OwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNV0gPSBTWU5fVUxUUkFfWEZFUl9OU181OwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNl0gPSBTWU5fVUxUUkFfWEZFUl9OU182OwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbN10gPSBTWU5fVUxUUkFfWEZFUl9OU183OwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbOF0gPSBTWU5fVUxUUkFfWEZFUl9OU184OwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbOV0gPSBTWU5fVUxUUkFfWEZFUl9OU185OwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTBdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTA7Ci0gICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxMV0gPSBTWU5fVUxUUkFfWEZFUl9OU18xMTsKLSAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEyXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEyOwotICAgICAgICBhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTNdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTM7Ci0gICAgICAgIGFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxNF0gPSBTWU5fVUxUUkFfWEZFUl9OU18xNDsKLSAgICAgICAgYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzE1XSA9IFNZTl9VTFRSQV9YRkVSX05TXzE1OwotICAgICAgICBhc2NfZHZjLT5tYXhfc2R0cl9pbmRleCA9IDE1OwotICAgICAgICBpZiAoY2hpcF92ZXJzaW9uID09IEFTQ19DSElQX1ZFUl9QQ0lfVUxUUkFfMzE1MCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNjU2V0RXh0cmFDb250cm9sKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgIChTRUNfQUNUSVZFX05FR0FURSB8IFNFQ19TTEVXX1JBVEUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjaGlwX3ZlcnNpb24gPj0gQVNDX0NISVBfVkVSX1BDSV9VTFRSQV8zMDUwKSB7Ci0gICAgICAgICAgICBBc2NTZXRFeHRyYUNvbnRyb2woaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgKFNFQ19BQ1RJVkVfTkVHQVRFIHwgU0VDX0VOQUJMRV9GSUxURVIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYXNjX2R2Yy0+YnVzX3R5cGUgPT0gQVNDX0lTX1BDSSkgewotICAgICAgICAgICBBc2NTZXRFeHRyYUNvbnRyb2woaW9wX2Jhc2UsIChTRUNfQUNUSVZFX05FR0FURSB8IFNFQ19TTEVXX1JBVEUpKTsKLSAgICB9CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwl3YXJuX2NvZGUgPSAwOworCWFzY19kdmMtPmVycl9jb2RlID0gMDsKKwlpZiAoKGFzY19kdmMtPmJ1c190eXBlICYKKwkgICAgIChBU0NfSVNfSVNBIHwgQVNDX0lTX1BDSSB8IEFTQ19JU19FSVNBIHwgQVNDX0lTX1ZMKSkgPT0gMCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19CVVNfVFlQRTsKKwl9CisJQXNjU2V0Q2hpcENvbnRyb2woaW9wX2Jhc2UsIENDX0hBTFQpOworCUFzY1NldENoaXBTdGF0dXMoaW9wX2Jhc2UsIDApOworCWFzY19kdmMtPmJ1Z19maXhfY250bCA9IDA7CisJYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgPSAwOworCWFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyX2Fsd2F5cyA9IDA7CisJLyogYXNjX2R2Yy0+aW5pdF9zdGF0ZSBpbml0YWxpemVkIGluIEFzY0luaXRHZXRDb25maWcoKS4gKi8KKwlhc2NfZHZjLT5zZHRyX2RvbmUgPSAwOworCWFzY19kdmMtPmN1cl90b3RhbF9xbmcgPSAwOworCWFzY19kdmMtPmlzX2luX2ludCA9IDA7CisJYXNjX2R2Yy0+aW5fY3JpdGljYWxfY250ID0gMDsKKwlhc2NfZHZjLT5sYXN0X3Ffc2hvcnRhZ2UgPSAwOworCWFzY19kdmMtPnVzZV90YWdnZWRfcW5nID0gMDsKKwlhc2NfZHZjLT5ub19zY2FtID0gMDsKKwlhc2NfZHZjLT51bml0X25vdF9yZWFkeSA9IDA7CisJYXNjX2R2Yy0+cXVldWVfZnVsbF9vcl9idXN5ID0gMDsKKwlhc2NfZHZjLT5yZWRvX3NjYW0gPSAwOworCWFzY19kdmMtPnJlczIgPSAwOworCWFzY19kdmMtPmhvc3RfaW5pdF9zZHRyX2luZGV4ID0gMDsKKwlhc2NfZHZjLT5jZmctPmNhbl90YWdnZWRfcW5nID0gMDsKKwlhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCA9IDA7CisJYXNjX2R2Yy0+ZHZjX2NudGwgPSBBU0NfREVGX0RWQ19DTlRMOworCWFzY19kdmMtPmluaXRfc2R0ciA9IDA7CisJYXNjX2R2Yy0+bWF4X3RvdGFsX3FuZyA9IEFTQ19ERUZfTUFYX1RPVEFMX1FORzsKKwlhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSAzOworCWFzY19kdmMtPnN0YXJ0X21vdG9yID0gQVNDX1NDU0lfV0lEVEhfQklUX1NFVDsKKwlhc2NfZHZjLT5tYXhfZG1hX2NvdW50ID0gQXNjR2V0TWF4RG1hQ291bnQoYXNjX2R2Yy0+YnVzX3R5cGUpOworCWFzY19kdmMtPmNmZy0+c2R0cl9lbmFibGUgPSBBU0NfU0NTSV9XSURUSF9CSVRfU0VUOworCWFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBBU0NfU0NTSV9XSURUSF9CSVRfU0VUOworCWFzY19kdmMtPmNmZy0+Y2hpcF9zY3NpX2lkID0gQVNDX0RFRl9DSElQX1NDU0lfSUQ7CisJYXNjX2R2Yy0+Y2ZnLT5saWJfc2VyaWFsX25vID0gQVNDX0xJQl9TRVJJQUxfTlVNQkVSOworCWFzY19kdmMtPmNmZy0+bGliX3ZlcnNpb24gPSAoQVNDX0xJQl9WRVJTSU9OX01BSk9SIDw8IDgpIHwKKwkgICAgQVNDX0xJQl9WRVJTSU9OX01JTk9SOworCWNoaXBfdmVyc2lvbiA9IEFzY0dldENoaXBWZXJzaW9uKGlvcF9iYXNlLCBhc2NfZHZjLT5idXNfdHlwZSk7CisJYXNjX2R2Yy0+Y2ZnLT5jaGlwX3ZlcnNpb24gPSBjaGlwX3ZlcnNpb247CisJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzBdID0gU1lOX1hGRVJfTlNfMDsKKwlhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMV0gPSBTWU5fWEZFUl9OU18xOworCWFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsyXSA9IFNZTl9YRkVSX05TXzI7CisJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzNdID0gU1lOX1hGRVJfTlNfMzsKKwlhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbNF0gPSBTWU5fWEZFUl9OU180OworCWFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFs1XSA9IFNZTl9YRkVSX05TXzU7CisJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzZdID0gU1lOX1hGRVJfTlNfNjsKKwlhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbN10gPSBTWU5fWEZFUl9OU183OworCWFzY19kdmMtPm1heF9zZHRyX2luZGV4ID0gNzsKKwlpZiAoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSSkgJiYKKwkgICAgKGNoaXBfdmVyc2lvbiA+PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMxNTApKSB7CisJCWFzY19kdmMtPmJ1c190eXBlID0gQVNDX0lTX1BDSV9VTFRSQTsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzBdID0gU1lOX1VMVFJBX1hGRVJfTlNfMDsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzFdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzJdID0gU1lOX1VMVFJBX1hGRVJfTlNfMjsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzNdID0gU1lOX1VMVFJBX1hGRVJfTlNfMzsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzRdID0gU1lOX1VMVFJBX1hGRVJfTlNfNDsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzVdID0gU1lOX1VMVFJBX1hGRVJfTlNfNTsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzZdID0gU1lOX1VMVFJBX1hGRVJfTlNfNjsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzddID0gU1lOX1VMVFJBX1hGRVJfTlNfNzsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzhdID0gU1lOX1VMVFJBX1hGRVJfTlNfODsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzldID0gU1lOX1VMVFJBX1hGRVJfTlNfOTsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEwXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEwOworCQlhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTFdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTE7CisJCWFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxMl0gPSBTWU5fVUxUUkFfWEZFUl9OU18xMjsKKwkJYXNjX2R2Yy0+c2R0cl9wZXJpb2RfdGJsWzEzXSA9IFNZTl9VTFRSQV9YRkVSX05TXzEzOworCQlhc2NfZHZjLT5zZHRyX3BlcmlvZF90YmxbMTRdID0gU1lOX1VMVFJBX1hGRVJfTlNfMTQ7CisJCWFzY19kdmMtPnNkdHJfcGVyaW9kX3RibFsxNV0gPSBTWU5fVUxUUkFfWEZFUl9OU18xNTsKKwkJYXNjX2R2Yy0+bWF4X3NkdHJfaW5kZXggPSAxNTsKKwkJaWYgKGNoaXBfdmVyc2lvbiA9PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMxNTApIHsKKwkJCUFzY1NldEV4dHJhQ29udHJvbChpb3BfYmFzZSwKKwkJCQkJICAgKFNFQ19BQ1RJVkVfTkVHQVRFIHwgU0VDX1NMRVdfUkFURSkpOworCQl9IGVsc2UgaWYgKGNoaXBfdmVyc2lvbiA+PSBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMwNTApIHsKKwkJCUFzY1NldEV4dHJhQ29udHJvbChpb3BfYmFzZSwKKwkJCQkJICAgKFNFQ19BQ1RJVkVfTkVHQVRFIHwKKwkJCQkJICAgIFNFQ19FTkFCTEVfRklMVEVSKSk7CisJCX0KKwl9CisJaWYgKGFzY19kdmMtPmJ1c190eXBlID09IEFTQ19JU19QQ0kpIHsKKwkJQXNjU2V0RXh0cmFDb250cm9sKGlvcF9iYXNlLAorCQkJCSAgIChTRUNfQUNUSVZFX05FR0FURSB8IFNFQ19TTEVXX1JBVEUpKTsKKwl9CiAKLSAgICBhc2NfZHZjLT5jZmctPmlzYV9kbWFfc3BlZWQgPSBBU0NfREVGX0lTQV9ETUFfU1BFRUQ7Ci0gICAgaWYgKEFzY0dldENoaXBCdXNUeXBlKGlvcF9iYXNlKSA9PSBBU0NfSVNfSVNBUE5QKSB7Ci0gICAgICAgIEFzY1NldENoaXBJRkMoaW9wX2Jhc2UsIElGQ19JTklUX0RFRkFVTFQpOwotICAgICAgICBhc2NfZHZjLT5idXNfdHlwZSA9IEFTQ19JU19JU0FQTlA7Ci0gICAgfQorCWFzY19kdmMtPmNmZy0+aXNhX2RtYV9zcGVlZCA9IEFTQ19ERUZfSVNBX0RNQV9TUEVFRDsKKwlpZiAoQXNjR2V0Q2hpcEJ1c1R5cGUoaW9wX2Jhc2UpID09IEFTQ19JU19JU0FQTlApIHsKKwkJQXNjU2V0Q2hpcElGQyhpb3BfYmFzZSwgSUZDX0lOSVRfREVGQVVMVCk7CisJCWFzY19kdmMtPmJ1c190eXBlID0gQVNDX0lTX0lTQVBOUDsKKwl9CiAjaWZkZWYgQ09ORklHX0lTQQotICAgIGlmICgoYXNjX2R2Yy0+YnVzX3R5cGUgJiBBU0NfSVNfSVNBKSAhPSAwKSB7Ci0gICAgICAgIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9jaGFubmVsID0gKHVjaGFyKSBBc2NHZXRJc2FEbWFDaGFubmVsKGlvcF9iYXNlKTsKLSAgICB9CisJaWYgKChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19JU0EpICE9IDApIHsKKwkJYXNjX2R2Yy0+Y2ZnLT5pc2FfZG1hX2NoYW5uZWwgPQorCQkgICAgKHVjaGFyKUFzY0dldElzYURtYUNoYW5uZWwoaW9wX2Jhc2UpOworCX0KICNlbmRpZiAvKiBDT05GSUdfSVNBICovCi0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIGFzY19kdmMtPmN1cl9kdmNfcW5nW2ldID0gMDsKLSAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbaV0gPSBBU0NfTUFYX1NDU0kxX1FORzsKLSAgICAgICAgYXNjX2R2Yy0+c2NzaXFfYnVzeV9oZWFkW2ldID0gKEFTQ19TQ1NJX1EgKikgMEw7Ci0gICAgICAgIGFzY19kdmMtPnNjc2lxX2J1c3lfdGFpbFtpXSA9IChBU0NfU0NTSV9RICopIDBMOwotICAgICAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW2ldID0gQVNDX01BWF9JTlJBTV9UQUdfUU5HOwotICAgIH0KLSAgICByZXR1cm4gKHdhcm5fY29kZSk7CisJZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisJCWFzY19kdmMtPmN1cl9kdmNfcW5nW2ldID0gMDsKKwkJYXNjX2R2Yy0+bWF4X2R2Y19xbmdbaV0gPSBBU0NfTUFYX1NDU0kxX1FORzsKKwkJYXNjX2R2Yy0+c2NzaXFfYnVzeV9oZWFkW2ldID0gKEFTQ19TQ1NJX1EgKikwTDsKKwkJYXNjX2R2Yy0+c2NzaXFfYnVzeV90YWlsW2ldID0gKEFTQ19TQ1NJX1EgKikwTDsKKwkJYXNjX2R2Yy0+Y2ZnLT5tYXhfdGFnX3FuZ1tpXSA9IEFTQ19NQVhfSU5SQU1fVEFHX1FORzsKKwl9CisJcmV0dXJuICh3YXJuX2NvZGUpOwogfQogCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQXNjSW5pdEZyb21FRVAoQVNDX0RWQ19WQVIgKmFzY19kdmMpCitzdGF0aWMgdXNob3J0IF9faW5pdCBBc2NJbml0RnJvbUVFUChBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBBU0NFRVBfQ09ORklHICAgICAgIGVlcF9jb25maWdfYnVmOwotICAgIEFTQ0VFUF9DT05GSUcgICAgICAgKmVlcF9jb25maWc7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNoa3N1bTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdhcm5fY29kZTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGNmZ19tc3csIGNmZ19sc3c7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVfZWVwID0gMDsKKwlBU0NFRVBfQ09ORklHIGVlcF9jb25maWdfYnVmOworCUFTQ0VFUF9DT05GSUcgKmVlcF9jb25maWc7CisJUG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IGNoa3N1bTsKKwl1c2hvcnQgd2Fybl9jb2RlOworCXVzaG9ydCBjZmdfbXN3LCBjZmdfbHN3OworCWludCBpOworCWludCB3cml0ZV9lZXAgPSAwOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICB3YXJuX2NvZGUgPSAwOwotICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMHgwMEZFKTsKLSAgICBBc2NTdG9wUXVldWVFeGUoaW9wX2Jhc2UpOwotICAgIGlmICgoQXNjU3RvcENoaXAoaW9wX2Jhc2UpID09IEZBTFNFKSB8fAotICAgICAgICAoQXNjR2V0Q2hpcFNjc2lDdHJsKGlvcF9iYXNlKSAhPSAwKSkgewotICAgICAgICBhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1JFU0VUX1NDU0lfRE9ORTsKLSAgICAgICAgQXNjUmVzZXRDaGlwQW5kU2NzaUJ1cyhhc2NfZHZjKTsKLSAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgoQVNDX0RDTlQpCi0gICAgICAgICAgICAoKHVzaG9ydCkgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ICogMTAwMCkpOwotICAgIH0KLSAgICBpZiAoQXNjSXNDaGlwSGFsdGVkKGlvcF9iYXNlKSA9PSBGQUxTRSkgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TVEFSVF9TVE9QX0NISVA7Ci0gICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKLSAgICB9Ci0gICAgQXNjU2V0UENBZGRyKGlvcF9iYXNlLCBBU0NfTUNPREVfU1RBUlRfQUREUik7Ci0gICAgaWYgKEFzY0dldFBDQWRkcihpb3BfYmFzZSkgIT0gQVNDX01DT0RFX1NUQVJUX0FERFIpIHsKLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1BDX0FERFI7Ci0gICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKLSAgICB9Ci0gICAgZWVwX2NvbmZpZyA9IChBU0NFRVBfQ09ORklHICopICZlZXBfY29uZmlnX2J1ZjsKLSAgICBjZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7Ci0gICAgY2ZnX2xzdyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOwotICAgIGlmICgoY2ZnX21zdyAmIEFTQ19DRkdfTVNXX0NMUl9NQVNLKSAhPSAwKSB7Ci0gICAgICAgIGNmZ19tc3cgJj0gKH4oQVNDX0NGR19NU1dfQ0xSX01BU0spKTsKLSAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NGR19NU1dfUkVDT1ZFUjsKLSAgICAgICAgQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7Ci0gICAgfQotICAgIGNoa3N1bSA9IEFzY0dldEVFUENvbmZpZyhpb3BfYmFzZSwgZWVwX2NvbmZpZywgYXNjX2R2Yy0+YnVzX3R5cGUpOwotICAgIEFTQ19EQkcxKDEsICJBc2NJbml0RnJvbUVFUDogY2hrc3VtIDB4JXhcbiIsIGNoa3N1bSk7Ci0gICAgaWYgKGNoa3N1bSA9PSAwKSB7Ci0gICAgICAgIGNoa3N1bSA9IDB4YWE1NTsKLSAgICB9Ci0gICAgaWYgKEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpICYgQ1NXX0FVVE9fQ09ORklHKSB7Ci0gICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9BVVRPX0NPTkZJRzsKLSAgICAgICAgaWYgKGFzY19kdmMtPmNmZy0+Y2hpcF92ZXJzaW9uID09IDMpIHsKLSAgICAgICAgICAgIGlmIChlZXBfY29uZmlnLT5jZmdfbHN3ICE9IGNmZ19sc3cpIHsKLSAgICAgICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1JFQ09WRVI7Ci0gICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+Y2ZnX2xzdyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVlcF9jb25maWctPmNmZ19tc3cgIT0gY2ZnX21zdykgewotICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fUkVDT1ZFUjsKLSAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5jZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWVwX2NvbmZpZy0+Y2ZnX21zdyAmPSB+QVNDX0NGR19NU1dfQ0xSX01BU0s7Ci0gICAgZWVwX2NvbmZpZy0+Y2ZnX2xzdyB8PSBBU0NfQ0ZHMF9IT1NUX0lOVF9PTjsKLSAgICBBU0NfREJHMSgxLCAiQXNjSW5pdEZyb21FRVA6IGVlcF9jb25maWctPmNoa3N1bSAweCV4XG4iLAotICAgICAgICBlZXBfY29uZmlnLT5jaGtzdW0pOwotICAgIGlmIChjaGtzdW0gIT0gZWVwX2NvbmZpZy0+Y2hrc3VtKSB7Ci0gICAgICAgICAgICBpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKSA9PQotICAgICAgICAgICAgICAgICAgICBBU0NfQ0hJUF9WRVJfUENJX1VMVFJBXzMwNTAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFTQ19EQkcoMSwKLSJBc2NJbml0RnJvbUVFUDogY2hrc3VtIGVycm9yIGlnbm9yZWQ7IEVFUFJPTS1sZXNzIGJvYXJkXG4iKTsKLSAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5pbml0X3NkdHIgPSAweEZGOwotICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmRpc2NfZW5hYmxlID0gMHhGRjsKLSAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5zdGFydF9tb3RvciA9IDB4RkY7Ci0gICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmcgPSAwOwotICAgICAgICAgICAgICAgIGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPSAweEYwOwotICAgICAgICAgICAgICAgIGVlcF9jb25maWctPm1heF90YWdfcW5nID0gMHgyMDsKLSAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5jbnRsID0gMHhCRkZGOwotICAgICAgICAgICAgICAgIEFTQ19FRVBfU0VUX0NISVBfSUQoZWVwX2NvbmZpZywgNyk7Ci0gICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+bm9fc2NhbSA9IDA7Ci0gICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzBdID0gMDsKLSAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMV0gPSAwOwotICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1syXSA9IDA7Ci0gICAgICAgICAgICAgICAgZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzNdID0gMDsKLSAgICAgICAgICAgICAgICBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNF0gPSAwOwotICAgICAgICAgICAgICAgIC8qIEluZGljYXRlIEVFUFJPTS1sZXNzIGJvYXJkLiAqLwotICAgICAgICAgICAgICAgIGVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1s1XSA9IDB4QkI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTQ19QUklOVCgKLSJBc2NJbml0RnJvbUVFUDogRUVQUk9NIGNoZWNrc3VtIGVycm9yOyBXaWxsIHRyeSB0byByZS13cml0ZSBFRVBST00uXG4iKTsKLSAgICAgICAgICAgICAgICB3cml0ZV9lZXAgPSAxOwotICAgICAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBhc2NfZHZjLT5jZmctPnNkdHJfZW5hYmxlID0gZWVwX2NvbmZpZy0+aW5pdF9zZHRyOwotICAgIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLT5kaXNjX2VuYWJsZTsKLSAgICBhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCA9IGVlcF9jb25maWctPnVzZV9jbWRfcW5nOwotICAgIGFzY19kdmMtPmNmZy0+aXNhX2RtYV9zcGVlZCA9IEFTQ19FRVBfR0VUX0RNQV9TUEQoZWVwX2NvbmZpZyk7Ci0gICAgYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBlZXBfY29uZmlnLT5zdGFydF9tb3RvcjsKLSAgICBhc2NfZHZjLT5kdmNfY250bCA9IGVlcF9jb25maWctPmNudGw7Ci0gICAgYXNjX2R2Yy0+bm9fc2NhbSA9IGVlcF9jb25maWctPm5vX3NjYW07Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bMF0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMF07Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bMV0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMV07Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bMl0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMl07Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bM10gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bM107Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bNF0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNF07Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bNV0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNV07Ci0gICAgaWYgKCFBc2NUZXN0RXh0ZXJuYWxMcmFtKGFzY19kdmMpKSB7Ci0gICAgICAgIGlmICgoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSV9VTFRSQSkgPT0gQVNDX0lTX1BDSV9VTFRSQSkpIHsKLSAgICAgICAgICAgIGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPSBBU0NfTUFYX1BDSV9VTFRSQV9JTlJBTV9UT1RBTF9RTkc7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdGFnX3FuZyA9IEFTQ19NQVhfUENJX1VMVFJBX0lOUkFNX1RBR19RTkc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLT5jZmdfbXN3IHw9IDB4MDgwMDsKLSAgICAgICAgICAgIGNmZ19tc3cgfD0gMHgwODAwOwotICAgICAgICAgICAgQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01BWF9QQ0lfSU5SQU1fVE9UQUxfUU5HOwotICAgICAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBBU0NfTUFYX0lOUkFNX1RBR19RTkc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgIH0KLSAgICBpZiAoZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA8IEFTQ19NSU5fVE9UQUxfUU5HKSB7Ci0gICAgICAgIGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPSBBU0NfTUlOX1RPVEFMX1FORzsKLSAgICB9Ci0gICAgaWYgKGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPiBBU0NfTUFYX1RPVEFMX1FORykgewotICAgICAgICBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01BWF9UT1RBTF9RTkc7Ci0gICAgfQotICAgIGlmIChlZXBfY29uZmlnLT5tYXhfdGFnX3FuZyA+IGVlcF9jb25maWctPm1heF90b3RhbF9xbmcpIHsKLSAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nOwotICAgIH0KLSAgICBpZiAoZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPCBBU0NfTUlOX1RBR19RX1BFUl9EVkMpIHsKLSAgICAgICAgZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBBU0NfTUlOX1RBR19RX1BFUl9EVkM7Ci0gICAgfQotICAgIGFzY19kdmMtPm1heF90b3RhbF9xbmcgPSBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nOwotICAgIGlmICgoZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmcgJiBlZXBfY29uZmlnLT5kaXNjX2VuYWJsZSkgIT0KLSAgICAgICAgZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmcpIHsKLSAgICAgICAgZWVwX2NvbmZpZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLT51c2VfY21kX3FuZzsKLSAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q7Ci0gICAgfQotICAgIGlmIChhc2NfZHZjLT5idXNfdHlwZSAmIChBU0NfSVNfSVNBIHwgQVNDX0lTX1ZMIHwgQVNDX0lTX0VJU0EpKSB7Ci0gICAgICAgIGFzY19kdmMtPmlycV9ubyA9IEFzY0dldENoaXBJUlEoaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKTsKLSAgICB9Ci0gICAgQVNDX0VFUF9TRVRfQ0hJUF9JRChlZXBfY29uZmlnLCBBU0NfRUVQX0dFVF9DSElQX0lEKGVlcF9jb25maWcpICYgQVNDX01BWF9USUQpOwotICAgIGFzY19kdmMtPmNmZy0+Y2hpcF9zY3NpX2lkID0gQVNDX0VFUF9HRVRfQ0hJUF9JRChlZXBfY29uZmlnKTsKLSAgICBpZiAoKChhc2NfZHZjLT5idXNfdHlwZSAmIEFTQ19JU19QQ0lfVUxUUkEpID09IEFTQ19JU19QQ0lfVUxUUkEpICYmCi0gICAgICAgICEoYXNjX2R2Yy0+ZHZjX2NudGwgJiBBU0NfQ05UTF9TRFRSX0VOQUJMRV9VTFRSQSkpIHsKLSAgICAgICAgYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXggPSBBU0NfU0RUUl9VTFRSQV9QQ0lfMTBNQl9JTkRFWDsKLSAgICB9CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwl3YXJuX2NvZGUgPSAwOworCUFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIEFTQ1ZfSEFMVENPREVfVywgMHgwMEZFKTsKKwlBc2NTdG9wUXVldWVFeGUoaW9wX2Jhc2UpOworCWlmICgoQXNjU3RvcENoaXAoaW9wX2Jhc2UpID09IEZBTFNFKSB8fAorCSAgICAoQXNjR2V0Q2hpcFNjc2lDdHJsKGlvcF9iYXNlKSAhPSAwKSkgeworCQlhc2NfZHZjLT5pbml0X3N0YXRlIHw9IEFTQ19JTklUX1JFU0VUX1NDU0lfRE9ORTsKKwkJQXNjUmVzZXRDaGlwQW5kU2NzaUJ1cyhhc2NfZHZjKTsKKwkJRHZjU2xlZXBNaWxsaVNlY29uZCgoQVNDX0RDTlQpCisJCQkJICAgICgodXNob3J0KWFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCAqIDEwMDApKTsKKwl9CisJaWYgKEFzY0lzQ2hpcEhhbHRlZChpb3BfYmFzZSkgPT0gRkFMU0UpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU1RBUlRfU1RPUF9DSElQOworCQlyZXR1cm4gKHdhcm5fY29kZSk7CisJfQorCUFzY1NldFBDQWRkcihpb3BfYmFzZSwgQVNDX01DT0RFX1NUQVJUX0FERFIpOworCWlmIChBc2NHZXRQQ0FkZHIoaW9wX2Jhc2UpICE9IEFTQ19NQ09ERV9TVEFSVF9BRERSKSB7CisJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1NFVF9QQ19BRERSOworCQlyZXR1cm4gKHdhcm5fY29kZSk7CisJfQorCWVlcF9jb25maWcgPSAoQVNDRUVQX0NPTkZJRyAqKSZlZXBfY29uZmlnX2J1ZjsKKwljZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7CisJY2ZnX2xzdyA9IEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOworCWlmICgoY2ZnX21zdyAmIEFTQ19DRkdfTVNXX0NMUl9NQVNLKSAhPSAwKSB7CisJCWNmZ19tc3cgJj0gKH4oQVNDX0NGR19NU1dfQ0xSX01BU0spKTsKKwkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NGR19NU1dfUkVDT1ZFUjsKKwkJQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7CisJfQorCWNoa3N1bSA9IEFzY0dldEVFUENvbmZpZyhpb3BfYmFzZSwgZWVwX2NvbmZpZywgYXNjX2R2Yy0+YnVzX3R5cGUpOworCUFTQ19EQkcxKDEsICJBc2NJbml0RnJvbUVFUDogY2hrc3VtIDB4JXhcbiIsIGNoa3N1bSk7CisJaWYgKGNoa3N1bSA9PSAwKSB7CisJCWNoa3N1bSA9IDB4YWE1NTsKKwl9CisJaWYgKEFzY0dldENoaXBTdGF0dXMoaW9wX2Jhc2UpICYgQ1NXX0FVVE9fQ09ORklHKSB7CisJCXdhcm5fY29kZSB8PSBBU0NfV0FSTl9BVVRPX0NPTkZJRzsKKwkJaWYgKGFzY19kdmMtPmNmZy0+Y2hpcF92ZXJzaW9uID09IDMpIHsKKwkJCWlmIChlZXBfY29uZmlnLT5jZmdfbHN3ICE9IGNmZ19sc3cpIHsKKwkJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1JFQ09WRVI7CisJCQkJZWVwX2NvbmZpZy0+Y2ZnX2xzdyA9CisJCQkJICAgIEFzY0dldENoaXBDZmdMc3coaW9wX2Jhc2UpOworCQkJfQorCQkJaWYgKGVlcF9jb25maWctPmNmZ19tc3cgIT0gY2ZnX21zdykgeworCQkJCXdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fUkVDT1ZFUjsKKwkJCQllZXBfY29uZmlnLT5jZmdfbXN3ID0KKwkJCQkgICAgQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7CisJCQl9CisJCX0KKwl9CisJZWVwX2NvbmZpZy0+Y2ZnX21zdyAmPSB+QVNDX0NGR19NU1dfQ0xSX01BU0s7CisJZWVwX2NvbmZpZy0+Y2ZnX2xzdyB8PSBBU0NfQ0ZHMF9IT1NUX0lOVF9PTjsKKwlBU0NfREJHMSgxLCAiQXNjSW5pdEZyb21FRVA6IGVlcF9jb25maWctPmNoa3N1bSAweCV4XG4iLAorCQkgZWVwX2NvbmZpZy0+Y2hrc3VtKTsKKwlpZiAoY2hrc3VtICE9IGVlcF9jb25maWctPmNoa3N1bSkgeworCQlpZiAoQXNjR2V0Q2hpcFZlcnNpb24oaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKSA9PQorCQkgICAgQVNDX0NISVBfVkVSX1BDSV9VTFRSQV8zMDUwKSB7CisJCQlBU0NfREJHKDEsCisJCQkJIkFzY0luaXRGcm9tRUVQOiBjaGtzdW0gZXJyb3IgaWdub3JlZDsgRUVQUk9NLWxlc3MgYm9hcmRcbiIpOworCQkJZWVwX2NvbmZpZy0+aW5pdF9zZHRyID0gMHhGRjsKKwkJCWVlcF9jb25maWctPmRpc2NfZW5hYmxlID0gMHhGRjsKKwkJCWVlcF9jb25maWctPnN0YXJ0X21vdG9yID0gMHhGRjsKKwkJCWVlcF9jb25maWctPnVzZV9jbWRfcW5nID0gMDsKKwkJCWVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPSAweEYwOworCQkJZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSAweDIwOworCQkJZWVwX2NvbmZpZy0+Y250bCA9IDB4QkZGRjsKKwkJCUFTQ19FRVBfU0VUX0NISVBfSUQoZWVwX2NvbmZpZywgNyk7CisJCQllZXBfY29uZmlnLT5ub19zY2FtID0gMDsKKwkJCWVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1swXSA9IDA7CisJCQllZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMV0gPSAwOworCQkJZWVwX2NvbmZpZy0+YWRhcHRlcl9pbmZvWzJdID0gMDsKKwkJCWVlcF9jb25maWctPmFkYXB0ZXJfaW5mb1szXSA9IDA7CisJCQllZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNF0gPSAwOworCQkJLyogSW5kaWNhdGUgRUVQUk9NLWxlc3MgYm9hcmQuICovCisJCQllZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNV0gPSAweEJCOworCQl9IGVsc2UgeworCQkJQVNDX1BSSU5UCisJCQkgICAgKCJBc2NJbml0RnJvbUVFUDogRUVQUk9NIGNoZWNrc3VtIGVycm9yOyBXaWxsIHRyeSB0byByZS13cml0ZSBFRVBST00uXG4iKTsKKwkJCXdyaXRlX2VlcCA9IDE7CisJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX0NIS1NVTTsKKwkJfQorCX0KKwlhc2NfZHZjLT5jZmctPnNkdHJfZW5hYmxlID0gZWVwX2NvbmZpZy0+aW5pdF9zZHRyOworCWFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLT5kaXNjX2VuYWJsZTsKKwlhc2NfZHZjLT5jZmctPmNtZF9xbmdfZW5hYmxlZCA9IGVlcF9jb25maWctPnVzZV9jbWRfcW5nOworCWFzY19kdmMtPmNmZy0+aXNhX2RtYV9zcGVlZCA9IEFTQ19FRVBfR0VUX0RNQV9TUEQoZWVwX2NvbmZpZyk7CisJYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBlZXBfY29uZmlnLT5zdGFydF9tb3RvcjsKKwlhc2NfZHZjLT5kdmNfY250bCA9IGVlcF9jb25maWctPmNudGw7CisJYXNjX2R2Yy0+bm9fc2NhbSA9IGVlcF9jb25maWctPm5vX3NjYW07CisJYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bMF0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMF07CisJYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bMV0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMV07CisJYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bMl0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bMl07CisJYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bM10gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bM107CisJYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bNF0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNF07CisJYXNjX2R2Yy0+Y2ZnLT5hZGFwdGVyX2luZm9bNV0gPSBlZXBfY29uZmlnLT5hZGFwdGVyX2luZm9bNV07CisJaWYgKCFBc2NUZXN0RXh0ZXJuYWxMcmFtKGFzY19kdmMpKSB7CisJCWlmICgoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSV9VTFRSQSkgPT0KKwkJICAgICBBU0NfSVNfUENJX1VMVFJBKSkgeworCQkJZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA9CisJCQkgICAgQVNDX01BWF9QQ0lfVUxUUkFfSU5SQU1fVE9UQUxfUU5HOworCQkJZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPQorCQkJICAgIEFTQ19NQVhfUENJX1VMVFJBX0lOUkFNX1RBR19RTkc7CisJCX0gZWxzZSB7CisJCQllZXBfY29uZmlnLT5jZmdfbXN3IHw9IDB4MDgwMDsKKwkJCWNmZ19tc3cgfD0gMHgwODAwOworCQkJQXNjU2V0Q2hpcENmZ01zdyhpb3BfYmFzZSwgY2ZnX21zdyk7CisJCQllZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01BWF9QQ0lfSU5SQU1fVE9UQUxfUU5HOworCQkJZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBBU0NfTUFYX0lOUkFNX1RBR19RTkc7CisJCX0KKwl9IGVsc2UgeworCX0KKwlpZiAoZWVwX2NvbmZpZy0+bWF4X3RvdGFsX3FuZyA8IEFTQ19NSU5fVE9UQUxfUU5HKSB7CisJCWVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPSBBU0NfTUlOX1RPVEFMX1FORzsKKwl9CisJaWYgKGVlcF9jb25maWctPm1heF90b3RhbF9xbmcgPiBBU0NfTUFYX1RPVEFMX1FORykgeworCQllZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nID0gQVNDX01BWF9UT1RBTF9RTkc7CisJfQorCWlmIChlZXBfY29uZmlnLT5tYXhfdGFnX3FuZyA+IGVlcF9jb25maWctPm1heF90b3RhbF9xbmcpIHsKKwkJZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nOworCX0KKwlpZiAoZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPCBBU0NfTUlOX1RBR19RX1BFUl9EVkMpIHsKKwkJZWVwX2NvbmZpZy0+bWF4X3RhZ19xbmcgPSBBU0NfTUlOX1RBR19RX1BFUl9EVkM7CisJfQorCWFzY19kdmMtPm1heF90b3RhbF9xbmcgPSBlZXBfY29uZmlnLT5tYXhfdG90YWxfcW5nOworCWlmICgoZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmcgJiBlZXBfY29uZmlnLT5kaXNjX2VuYWJsZSkgIT0KKwkgICAgZWVwX2NvbmZpZy0+dXNlX2NtZF9xbmcpIHsKKwkJZWVwX2NvbmZpZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLT51c2VfY21kX3FuZzsKKwkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q7CisJfQorCWlmIChhc2NfZHZjLT5idXNfdHlwZSAmIChBU0NfSVNfSVNBIHwgQVNDX0lTX1ZMIHwgQVNDX0lTX0VJU0EpKSB7CisJCWFzY19kdmMtPmlycV9ubyA9IEFzY0dldENoaXBJUlEoaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKTsKKwl9CisJQVNDX0VFUF9TRVRfQ0hJUF9JRChlZXBfY29uZmlnLAorCQkJICAgIEFTQ19FRVBfR0VUX0NISVBfSUQoZWVwX2NvbmZpZykgJiBBU0NfTUFYX1RJRCk7CisJYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQgPSBBU0NfRUVQX0dFVF9DSElQX0lEKGVlcF9jb25maWcpOworCWlmICgoKGFzY19kdmMtPmJ1c190eXBlICYgQVNDX0lTX1BDSV9VTFRSQSkgPT0gQVNDX0lTX1BDSV9VTFRSQSkgJiYKKwkgICAgIShhc2NfZHZjLT5kdmNfY250bCAmIEFTQ19DTlRMX1NEVFJfRU5BQkxFX1VMVFJBKSkgeworCQlhc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleCA9IEFTQ19TRFRSX1VMVFJBX1BDSV8xME1CX0lOREVYOworCX0KIAotICAgIGZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgewotICAgICAgICBhc2NfZHZjLT5kb3NfaW50MTNfdGFibGVbaV0gPSBlZXBfY29uZmlnLT5kb3NfaW50MTNfdGFibGVbaV07Ci0gICAgICAgIGFzY19kdmMtPmNmZy0+bWF4X3RhZ19xbmdbaV0gPSBlZXBfY29uZmlnLT5tYXhfdGFnX3FuZzsKLSAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5zZHRyX3BlcmlvZF9vZmZzZXRbaV0gPQotICAgICAgICAgICAgKHVjaGFyKSAoQVNDX0RFRl9TRFRSX09GRlNFVCB8Ci0gICAgICAgICAgICAgICAgICAgICAoYXNjX2R2Yy0+aG9zdF9pbml0X3NkdHJfaW5kZXggPDwgNCkpOwotICAgIH0KLSAgICBlZXBfY29uZmlnLT5jZmdfbXN3ID0gQXNjR2V0Q2hpcENmZ01zdyhpb3BfYmFzZSk7Ci0gICAgaWYgKHdyaXRlX2VlcCkgewotICAgICAgICBpZiAoKGkgPSBBc2NTZXRFRVBDb25maWcoaW9wX2Jhc2UsIGVlcF9jb25maWcsIGFzY19kdmMtPmJ1c190eXBlKSkgIT0KLSAgICAgICAgICAgICAwKSB7Ci0gICAgICAgICAgICAgICAgQVNDX1BSSU5UMSgKLSJBc2NJbml0RnJvbUVFUDogRmFpbGVkIHRvIHJlLXdyaXRlIEVFUFJPTSB3aXRoICVkIGVycm9ycy5cbiIsIGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTQ19QUklOVCgiQXNjSW5pdEZyb21FRVA6IFN1Y2Nlc3NmdWxseSByZS13cm90ZSBFRVBST00uXG4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHdhcm5fY29kZSk7CisJZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7CisJCWFzY19kdmMtPmRvc19pbnQxM190YWJsZVtpXSA9IGVlcF9jb25maWctPmRvc19pbnQxM190YWJsZVtpXTsKKwkJYXNjX2R2Yy0+Y2ZnLT5tYXhfdGFnX3FuZ1tpXSA9IGVlcF9jb25maWctPm1heF90YWdfcW5nOworCQlhc2NfZHZjLT5jZmctPnNkdHJfcGVyaW9kX29mZnNldFtpXSA9CisJCSAgICAodWNoYXIpKEFTQ19ERUZfU0RUUl9PRkZTRVQgfAorCQkJICAgIChhc2NfZHZjLT5ob3N0X2luaXRfc2R0cl9pbmRleCA8PCA0KSk7CisJfQorCWVlcF9jb25maWctPmNmZ19tc3cgPSBBc2NHZXRDaGlwQ2ZnTXN3KGlvcF9iYXNlKTsKKwlpZiAod3JpdGVfZWVwKSB7CisJCWlmICgoaSA9CisJCSAgICAgQXNjU2V0RUVQQ29uZmlnKGlvcF9iYXNlLCBlZXBfY29uZmlnLAorCQkJCSAgICAgYXNjX2R2Yy0+YnVzX3R5cGUpKSAhPSAwKSB7CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJBc2NJbml0RnJvbUVFUDogRmFpbGVkIHRvIHJlLXdyaXRlIEVFUFJPTSB3aXRoICVkIGVycm9ycy5cbiIsCisJCQkgICAgIGkpOworCQl9IGVsc2UgeworCQkJQVNDX1BSSU5UCisJCQkgICAgKCJBc2NJbml0RnJvbUVFUDogU3VjY2Vzc2Z1bGx5IHJlLXdyb3RlIEVFUFJPTS5cbiIpOworCQl9CisJfQorCXJldHVybiAod2Fybl9jb2RlKTsKIH0KIAotU1RBVElDIHVzaG9ydAotQXNjSW5pdE1pY3JvQ29kZVZhcigKLSAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMKLSkKK3N0YXRpYyB1c2hvcnQgQXNjSW5pdE1pY3JvQ29kZVZhcihBU0NfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICB3YXJuX2NvZGU7Ci0gICAgUG9ydEFkZHIgICAgICAgICAgICBpb3BfYmFzZTsKLSAgICBBU0NfUEFERFIgICAgICAgICAgIHBoeV9hZGRyOwotICAgIEFTQ19EQ05UICAgICAgICAgICAgcGh5X3NpemU7CisJaW50IGk7CisJdXNob3J0IHdhcm5fY29kZTsKKwlQb3J0QWRkciBpb3BfYmFzZTsKKwlBU0NfUEFERFIgcGh5X2FkZHI7CisJQVNDX0RDTlQgcGh5X3NpemU7CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwotICAgIHdhcm5fY29kZSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBBU0NfTUFYX1RJRDsgaSsrKSB7Ci0gICAgICAgIEFzY1B1dE1Db2RlSW5pdFNEVFJBdElEKGlvcF9iYXNlLCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPnNkdHJfcGVyaW9kX29mZnNldFtpXQotKTsKLSAgICB9CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwl3YXJuX2NvZGUgPSAwOworCWZvciAoaSA9IDA7IGkgPD0gQVNDX01BWF9USUQ7IGkrKykgeworCQlBc2NQdXRNQ29kZUluaXRTRFRSQXRJRChpb3BfYmFzZSwgaSwKKwkJCQkJYXNjX2R2Yy0+Y2ZnLT5zZHRyX3BlcmlvZF9vZmZzZXRbaV0KKwkJICAgICk7CisJfQogCi0gICAgQXNjSW5pdFFMaW5rVmFyKGFzY19kdmMpOwotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfRElTQ19FTkFCTEVfQiwKLSAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUpOwotICAgIEFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfSE9TVFNDU0lfSURfQiwKLSAgICAgICAgICAgICAgICAgICAgIEFTQ19USURfVE9fVEFSR0VUX0lEKGFzY19kdmMtPmNmZy0+Y2hpcF9zY3NpX2lkKSk7CisJQXNjSW5pdFFMaW5rVmFyKGFzY19kdmMpOworCUFzY1dyaXRlTHJhbUJ5dGUoaW9wX2Jhc2UsIEFTQ1ZfRElTQ19FTkFCTEVfQiwKKwkJCSBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKKwlBc2NXcml0ZUxyYW1CeXRlKGlvcF9iYXNlLCBBU0NWX0hPU1RTQ1NJX0lEX0IsCisJCQkgQVNDX1RJRF9UT19UQVJHRVRfSUQoYXNjX2R2Yy0+Y2ZnLT5jaGlwX3Njc2lfaWQpKTsKIAotICAgIC8qIEFsaWduIG92ZXJydW4gYnVmZmVyIG9uIGFuIDggYnl0ZSBib3VuZGFyeS4gKi8KLSAgICBwaHlfYWRkciA9IHZpcnRfdG9fYnVzKGFzY19kdmMtPmNmZy0+b3ZlcnJ1bl9idWYpOwotICAgIHBoeV9hZGRyID0gY3B1X3RvX2xlMzIoKHBoeV9hZGRyICsgNykgJiB+MHg3KTsKLSAgICBBc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oaW9wX2Jhc2UsIEFTQ1ZfT1ZFUlJVTl9QQUREUl9ELAotICAgICAgICAodWNoYXIgKikgJnBoeV9hZGRyLCAxKTsKLSAgICBwaHlfc2l6ZSA9IGNwdV90b19sZTMyKEFTQ19PVkVSUlVOX0JTSVpFIC0gOCk7Ci0gICAgQXNjTWVtRFdvcmRDb3B5UHRyVG9McmFtKGlvcF9iYXNlLCBBU0NWX09WRVJSVU5fQlNJWkVfRCwKLSAgICAgICAgKHVjaGFyICopICZwaHlfc2l6ZSwgMSk7CisJLyogQWxpZ24gb3ZlcnJ1biBidWZmZXIgb24gYW4gOCBieXRlIGJvdW5kYXJ5LiAqLworCXBoeV9hZGRyID0gdmlydF90b19idXMoYXNjX2R2Yy0+Y2ZnLT5vdmVycnVuX2J1Zik7CisJcGh5X2FkZHIgPSBjcHVfdG9fbGUzMigocGh5X2FkZHIgKyA3KSAmIH4weDcpOworCUFzY01lbURXb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwgQVNDVl9PVkVSUlVOX1BBRERSX0QsCisJCQkJICh1Y2hhciAqKSZwaHlfYWRkciwgMSk7CisJcGh5X3NpemUgPSBjcHVfdG9fbGUzMihBU0NfT1ZFUlJVTl9CU0laRSAtIDgpOworCUFzY01lbURXb3JkQ29weVB0clRvTHJhbShpb3BfYmFzZSwgQVNDVl9PVkVSUlVOX0JTSVpFX0QsCisJCQkJICh1Y2hhciAqKSZwaHlfc2l6ZSwgMSk7CiAKLSAgICBhc2NfZHZjLT5jZmctPm1jb2RlX2RhdGUgPQotICAgICAgICBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfTUNfREFURV9XKTsKLSAgICBhc2NfZHZjLT5jZmctPm1jb2RlX3ZlcnNpb24gPQotICAgICAgICBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsICh1c2hvcnQpIEFTQ1ZfTUNfVkVSX1cpOworCWFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSA9CisJICAgIEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgKHVzaG9ydClBU0NWX01DX0RBVEVfVyk7CisJYXNjX2R2Yy0+Y2ZnLT5tY29kZV92ZXJzaW9uID0KKwkgICAgQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCAodXNob3J0KUFTQ1ZfTUNfVkVSX1cpOwogCi0gICAgQXNjU2V0UENBZGRyKGlvcF9iYXNlLCBBU0NfTUNPREVfU1RBUlRfQUREUik7Ci0gICAgaWYgKEFzY0dldFBDQWRkcihpb3BfYmFzZSkgIT0gQVNDX01DT0RFX1NUQVJUX0FERFIpIHsKLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1BDX0FERFI7Ci0gICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKLSAgICB9Ci0gICAgaWYgKEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSkgIT0gMSkgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TVEFSVF9TVE9QX0NISVA7Ci0gICAgICAgIHJldHVybiAod2Fybl9jb2RlKTsKLSAgICB9CisJQXNjU2V0UENBZGRyKGlvcF9iYXNlLCBBU0NfTUNPREVfU1RBUlRfQUREUik7CisJaWYgKEFzY0dldFBDQWRkcihpb3BfYmFzZSkgIT0gQVNDX01DT0RFX1NUQVJUX0FERFIpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0VUX1BDX0FERFI7CisJCXJldHVybiAod2Fybl9jb2RlKTsKKwl9CisJaWYgKEFzY1N0YXJ0Q2hpcChpb3BfYmFzZSkgIT0gMSkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TVEFSVF9TVE9QX0NISVA7CisJCXJldHVybiAod2Fybl9jb2RlKTsKKwl9CiAKLSAgICByZXR1cm4gKHdhcm5fY29kZSk7CisJcmV0dXJuICh3YXJuX2NvZGUpOwogfQogCi1TVEFUSUMgaW50IF9faW5pdAotQXNjVGVzdEV4dGVybmFsTHJhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMpCitzdGF0aWMgaW50IF9faW5pdCBBc2NUZXN0RXh0ZXJuYWxMcmFtKEFTQ19EVkNfVkFSICphc2NfZHZjKQogewotICAgIFBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBxX2FkZHI7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBzYXZlZF93b3JkOwotICAgIGludCAgICAgICAgICAgICAgICAgc3RhOworCVBvcnRBZGRyIGlvcF9iYXNlOworCXVzaG9ydCBxX2FkZHI7CisJdXNob3J0IHNhdmVkX3dvcmQ7CisJaW50IHN0YTsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7Ci0gICAgc3RhID0gMDsKLSAgICBxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKDI0MSk7Ci0gICAgc2F2ZWRfd29yZCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyKTsKLSAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHFfYWRkcik7Ci0gICAgQXNjU2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlLCAweDU1QUEpOwotICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOwotICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgcV9hZGRyKTsKLSAgICBpZiAoQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKSA9PSAweDU1QUEpIHsKLSAgICAgICAgc3RhID0gMTsKLSAgICAgICAgQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyLCBzYXZlZF93b3JkKTsKLSAgICB9Ci0gICAgcmV0dXJuIChzdGEpOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJc3RhID0gMDsKKwlxX2FkZHIgPSBBU0NfUU5PX1RPX1FBRERSKDI0MSk7CisJc2F2ZWRfd29yZCA9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyKTsKKwlBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHFfYWRkcik7CisJQXNjU2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlLCAweDU1QUEpOworCUR2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOworCUFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgcV9hZGRyKTsKKwlpZiAoQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKSA9PSAweDU1QUEpIHsKKwkJc3RhID0gMTsKKwkJQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgcV9hZGRyLCBzYXZlZF93b3JkKTsKKwl9CisJcmV0dXJuIChzdGEpOwogfQogCi1TVEFUSUMgaW50IF9faW5pdAotQXNjV3JpdGVFRVBDbWRSZWcoCi0gICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIHVjaGFyIGNtZF9yZWcKLSkKK3N0YXRpYyBpbnQgX19pbml0IEFzY1dyaXRlRUVQQ21kUmVnKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBjbWRfcmVnKQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgcmVhZF9iYWNrOwotICAgIGludCAgICAgICAgICAgICAgICAgcmV0cnk7CisJdWNoYXIgcmVhZF9iYWNrOworCWludCByZXRyeTsKIAotICAgIHJldHJ5ID0gMDsKLSAgICB3aGlsZSAoVFJVRSkgewotICAgICAgICBBc2NTZXRDaGlwRUVQQ21kKGlvcF9iYXNlLCBjbWRfcmVnKTsKLSAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxKTsKLSAgICAgICAgcmVhZF9iYWNrID0gQXNjR2V0Q2hpcEVFUENtZChpb3BfYmFzZSk7Ci0gICAgICAgIGlmIChyZWFkX2JhY2sgPT0gY21kX3JlZykgewotICAgICAgICAgICAgcmV0dXJuICgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0cnkrKyA+IEFTQ19FRVBfTUFYX1JFVFJZKSB7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0gICAgfQorCXJldHJ5ID0gMDsKKwl3aGlsZSAoVFJVRSkgeworCQlBc2NTZXRDaGlwRUVQQ21kKGlvcF9iYXNlLCBjbWRfcmVnKTsKKwkJRHZjU2xlZXBNaWxsaVNlY29uZCgxKTsKKwkJcmVhZF9iYWNrID0gQXNjR2V0Q2hpcEVFUENtZChpb3BfYmFzZSk7CisJCWlmIChyZWFkX2JhY2sgPT0gY21kX3JlZykgeworCQkJcmV0dXJuICgxKTsKKwkJfQorCQlpZiAocmV0cnkrKyA+IEFTQ19FRVBfTUFYX1JFVFJZKSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQogfQogCi1TVEFUSUMgaW50IF9faW5pdAotQXNjV3JpdGVFRVBEYXRhUmVnKAotICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBkYXRhX3JlZwotKQorc3RhdGljIGludCBfX2luaXQgQXNjV3JpdGVFRVBEYXRhUmVnKFBvcnRBZGRyIGlvcF9iYXNlLCB1c2hvcnQgZGF0YV9yZWcpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICByZWFkX2JhY2s7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXRyeTsKKwl1c2hvcnQgcmVhZF9iYWNrOworCWludCByZXRyeTsKIAotICAgIHJldHJ5ID0gMDsKLSAgICB3aGlsZSAoVFJVRSkgewotICAgICAgICBBc2NTZXRDaGlwRUVQRGF0YShpb3BfYmFzZSwgZGF0YV9yZWcpOwotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEpOwotICAgICAgICByZWFkX2JhY2sgPSBBc2NHZXRDaGlwRUVQRGF0YShpb3BfYmFzZSk7Ci0gICAgICAgIGlmIChyZWFkX2JhY2sgPT0gZGF0YV9yZWcpIHsKLSAgICAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHJ5KysgPiBBU0NfRUVQX01BWF9SRVRSWSkgewotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgIH0KKwlyZXRyeSA9IDA7CisJd2hpbGUgKFRSVUUpIHsKKwkJQXNjU2V0Q2hpcEVFUERhdGEoaW9wX2Jhc2UsIGRhdGFfcmVnKTsKKwkJRHZjU2xlZXBNaWxsaVNlY29uZCgxKTsKKwkJcmVhZF9iYWNrID0gQXNjR2V0Q2hpcEVFUERhdGEoaW9wX2Jhc2UpOworCQlpZiAocmVhZF9iYWNrID09IGRhdGFfcmVnKSB7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWlmIChyZXRyeSsrID4gQVNDX0VFUF9NQVhfUkVUUlkpIHsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CiB9CiAKLVNUQVRJQyB2b2lkIF9faW5pdAotQXNjV2FpdEVFUFJlYWQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBBc2NXYWl0RUVQUmVhZCh2b2lkKQogewotICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7Ci0gICAgcmV0dXJuOworCUR2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7CisJcmV0dXJuOwogfQogCi1TVEFUSUMgdm9pZCBfX2luaXQKLUFzY1dhaXRFRVBXcml0ZSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IEFzY1dhaXRFRVBXcml0ZSh2b2lkKQogewotICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMjApOwotICAgIHJldHVybjsKKwlEdmNTbGVlcE1pbGxpU2Vjb25kKDIwKTsKKwlyZXR1cm47CiB9CiAKLVNUQVRJQyB1c2hvcnQgX19pbml0Ci1Bc2NSZWFkRUVQV29yZCgKLSAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgdWNoYXIgYWRkcikKK3N0YXRpYyB1c2hvcnQgX19pbml0IEFzY1JlYWRFRVBXb3JkKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBhZGRyKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgcmVhZF93dmFsOwotICAgIHVjaGFyICAgICAgICAgICAgICAgY21kX3JlZzsKKwl1c2hvcnQgcmVhZF93dmFsOworCXVjaGFyIGNtZF9yZWc7CiAKLSAgICBBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgQVNDX0VFUF9DTURfV1JJVEVfRElTQUJMRSk7Ci0gICAgQXNjV2FpdEVFUFJlYWQoKTsKLSAgICBjbWRfcmVnID0gYWRkciB8IEFTQ19FRVBfQ01EX1JFQUQ7Ci0gICAgQXNjV3JpdGVFRVBDbWRSZWcoaW9wX2Jhc2UsIGNtZF9yZWcpOwotICAgIEFzY1dhaXRFRVBSZWFkKCk7Ci0gICAgcmVhZF93dmFsID0gQXNjR2V0Q2hpcEVFUERhdGEoaW9wX2Jhc2UpOwotICAgIEFzY1dhaXRFRVBSZWFkKCk7Ci0gICAgcmV0dXJuIChyZWFkX3d2YWwpOworCUFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKwlBc2NXYWl0RUVQUmVhZCgpOworCWNtZF9yZWcgPSBhZGRyIHwgQVNDX0VFUF9DTURfUkVBRDsKKwlBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgY21kX3JlZyk7CisJQXNjV2FpdEVFUFJlYWQoKTsKKwlyZWFkX3d2YWwgPSBBc2NHZXRDaGlwRUVQRGF0YShpb3BfYmFzZSk7CisJQXNjV2FpdEVFUFJlYWQoKTsKKwlyZXR1cm4gKHJlYWRfd3ZhbCk7CiB9CiAKLVNUQVRJQyB1c2hvcnQgX19pbml0Ci1Bc2NXcml0ZUVFUFdvcmQoCi0gICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgdWNoYXIgYWRkciwKLSAgICAgICAgICAgICAgICAgICB1c2hvcnQgd29yZF92YWwpCitzdGF0aWMgdXNob3J0IF9faW5pdAorQXNjV3JpdGVFRVBXb3JkKFBvcnRBZGRyIGlvcF9iYXNlLCB1Y2hhciBhZGRyLCB1c2hvcnQgd29yZF92YWwpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICByZWFkX3d2YWw7CisJdXNob3J0IHJlYWRfd3ZhbDsKIAotICAgIHJlYWRfd3ZhbCA9IEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCBhZGRyKTsKLSAgICBpZiAocmVhZF93dmFsICE9IHdvcmRfdmFsKSB7Ci0gICAgICAgIEFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLCBBU0NfRUVQX0NNRF9XUklURV9BQkxFKTsKLSAgICAgICAgQXNjV2FpdEVFUFJlYWQoKTsKLSAgICAgICAgQXNjV3JpdGVFRVBEYXRhUmVnKGlvcF9iYXNlLCB3b3JkX3ZhbCk7Ci0gICAgICAgIEFzY1dhaXRFRVBSZWFkKCk7Ci0gICAgICAgIEFzY1dyaXRlRUVQQ21kUmVnKGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpICgodWNoYXIpIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcikpOwotICAgICAgICBBc2NXYWl0RUVQV3JpdGUoKTsKLSAgICAgICAgQXNjV3JpdGVFRVBDbWRSZWcoaW9wX2Jhc2UsIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUpOwotICAgICAgICBBc2NXYWl0RUVQUmVhZCgpOwotICAgICAgICByZXR1cm4gKEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCBhZGRyKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVhZF93dmFsKTsKKwlyZWFkX3d2YWwgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgYWRkcik7CisJaWYgKHJlYWRfd3ZhbCAhPSB3b3JkX3ZhbCkgeworCQlBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7CisJCUFzY1dhaXRFRVBSZWFkKCk7CisJCUFzY1dyaXRlRUVQRGF0YVJlZyhpb3BfYmFzZSwgd29yZF92YWwpOworCQlBc2NXYWl0RUVQUmVhZCgpOworCQlBc2NXcml0ZUVFUENtZFJlZyhpb3BfYmFzZSwKKwkJCQkgICh1Y2hhcikoKHVjaGFyKUFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcikpOworCQlBc2NXYWl0RUVQV3JpdGUoKTsKKwkJQXNjV3JpdGVFRVBDbWRSZWcoaW9wX2Jhc2UsIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUpOworCQlBc2NXYWl0RUVQUmVhZCgpOworCQlyZXR1cm4gKEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCBhZGRyKSk7CisJfQorCXJldHVybiAocmVhZF93dmFsKTsKIH0KIAotU1RBVElDIHVzaG9ydCBfX2luaXQKLUFzY0dldEVFUENvbmZpZygKLSAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICogY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlKQorc3RhdGljIHVzaG9ydCBfX2luaXQKK0FzY0dldEVFUENvbmZpZyhQb3J0QWRkciBpb3BfYmFzZSwgQVNDRUVQX0NPTkZJRyAqY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgd3ZhbDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHN1bTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICp3YnVmOwotICAgIGludCAgICAgICAgICAgICAgICAgY2ZnX2JlZzsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGNmZ19lbmQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB1Y2hhcl9lbmRfaW5fY29uZmlnID0gQVNDX0VFUF9NQVhfRFZDX0FERFIgLSAyOwotICAgIGludCAgICAgICAgICAgICAgICAgc19hZGRyOworCXVzaG9ydCB3dmFsOworCXVzaG9ydCBzdW07CisJdXNob3J0ICp3YnVmOworCWludCBjZmdfYmVnOworCWludCBjZmdfZW5kOworCWludCB1Y2hhcl9lbmRfaW5fY29uZmlnID0gQVNDX0VFUF9NQVhfRFZDX0FERFIgLSAyOworCWludCBzX2FkZHI7CiAKLSAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOwotICAgIHN1bSA9IDA7Ci0gICAgLyogUmVhZCB0d28gY29uZmlnIHdvcmRzOyBCeXRlLXN3YXBwaW5nIGRvbmUgYnkgQXNjUmVhZEVFUFdvcmQoKS4gKi8KLSAgICBmb3IgKHNfYWRkciA9IDA7IHNfYWRkciA8IDI7IHNfYWRkcisrLCB3YnVmKyspIHsKLSAgICAgICAgKndidWYgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIpOwotICAgICAgICBzdW0gKz0gKndidWY7Ci0gICAgfQotICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19WTCkgewotICAgICAgICBjZmdfYmVnID0gQVNDX0VFUF9EVkNfQ0ZHX0JFR19WTDsKLSAgICAgICAgY2ZnX2VuZCA9IEFTQ19FRVBfTUFYX0RWQ19BRERSX1ZMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHOwotICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFI7Ci0gICAgfQotICAgIGZvciAoc19hZGRyID0gY2ZnX2JlZzsgc19hZGRyIDw9IChjZmdfZW5kIC0gMSk7IHNfYWRkcisrLCB3YnVmKyspIHsKLSAgICAgICAgd3ZhbCA9IEFzY1JlYWRFRVBXb3JkKCBpb3BfYmFzZSwgKCB1Y2hhciApc19hZGRyICkgOwotICAgICAgICBpZiAoc19hZGRyIDw9IHVjaGFyX2VuZF9pbl9jb25maWcpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTd2FwIGFsbCBjaGFyIGZpZWxkcyAtIG11c3QgdW5zd2FwIGJ5dGVzIGFscmVhZHkgc3dhcHBlZAotICAgICAgICAgICAgICogYnkgQXNjUmVhZEVFUFdvcmQoKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIERvbid0IHN3YXAgd29yZCBmaWVsZCBhdCB0aGUgZW5kIC0gY250bCBmaWVsZC4gKi8KLSAgICAgICAgICAgICp3YnVmID0gd3ZhbDsKLSAgICAgICAgfQotICAgICAgICBzdW0gKz0gd3ZhbDsgLyogQ2hlY2tzdW0gdHJlYXRzIGFsbCBFRVBST00gZGF0YSBhcyB3b3Jkcy4gKi8KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBSZWFkIHRoZSBjaGVja3N1bSB3b3JkIHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCAnc3VtJwotICAgICAqIGJ5IHRoZSBjYWxsZXIuIFdvcmQgZmllbGQgYWxyZWFkeSBzd2FwcGVkLgotICAgICAqLwotICAgICp3YnVmID0gQXNjUmVhZEVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcikgc19hZGRyKTsKLSAgICByZXR1cm4gKHN1bSk7CisJd2J1ZiA9ICh1c2hvcnQgKiljZmdfYnVmOworCXN1bSA9IDA7CisJLyogUmVhZCB0d28gY29uZmlnIHdvcmRzOyBCeXRlLXN3YXBwaW5nIGRvbmUgYnkgQXNjUmVhZEVFUFdvcmQoKS4gKi8KKwlmb3IgKHNfYWRkciA9IDA7IHNfYWRkciA8IDI7IHNfYWRkcisrLCB3YnVmKyspIHsKKwkJKndidWYgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKXNfYWRkcik7CisJCXN1bSArPSAqd2J1ZjsKKwl9CisJaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisJCWNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMOworCQljZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFJfVkw7CisJfSBlbHNlIHsKKwkJY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUc7CisJCWNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUjsKKwl9CisJZm9yIChzX2FkZHIgPSBjZmdfYmVnOyBzX2FkZHIgPD0gKGNmZ19lbmQgLSAxKTsgc19hZGRyKyssIHdidWYrKykgeworCQl3dmFsID0gQXNjUmVhZEVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcilzX2FkZHIpOworCQlpZiAoc19hZGRyIDw9IHVjaGFyX2VuZF9pbl9jb25maWcpIHsKKwkJCS8qCisJCQkgKiBTd2FwIGFsbCBjaGFyIGZpZWxkcyAtIG11c3QgdW5zd2FwIGJ5dGVzIGFscmVhZHkgc3dhcHBlZAorCQkJICogYnkgQXNjUmVhZEVFUFdvcmQoKS4KKwkJCSAqLworCQkJKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IHN3YXAgd29yZCBmaWVsZCBhdCB0aGUgZW5kIC0gY250bCBmaWVsZC4gKi8KKwkJCSp3YnVmID0gd3ZhbDsKKwkJfQorCQlzdW0gKz0gd3ZhbDsJLyogQ2hlY2tzdW0gdHJlYXRzIGFsbCBFRVBST00gZGF0YSBhcyB3b3Jkcy4gKi8KKwl9CisJLyoKKwkgKiBSZWFkIHRoZSBjaGVja3N1bSB3b3JkIHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCAnc3VtJworCSAqIGJ5IHRoZSBjYWxsZXIuIFdvcmQgZmllbGQgYWxyZWFkeSBzd2FwcGVkLgorCSAqLworCSp3YnVmID0gQXNjUmVhZEVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcilzX2FkZHIpOworCXJldHVybiAoc3VtKTsKIH0KIAotU1RBVElDIGludCBfX2luaXQKLUFzY1NldEVFUENvbmZpZ09uY2UoCi0gICAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICBBU0NFRVBfQ09ORklHICogY2ZnX2J1ZiwgdXNob3J0IGJ1c190eXBlKQorc3RhdGljIGludCBfX2luaXQKK0FzY1NldEVFUENvbmZpZ09uY2UoUG9ydEFkZHIgaW9wX2Jhc2UsIEFTQ0VFUF9DT05GSUcgKmNmZ19idWYsIHVzaG9ydCBidXNfdHlwZSkKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG5fZXJyb3I7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmQ7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBzdW07Ci0gICAgaW50ICAgICAgICAgICAgICAgICBzX2FkZHI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBjZmdfYmVnOwotICAgIGludCAgICAgICAgICAgICAgICAgY2ZnX2VuZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHVjaGFyX2VuZF9pbl9jb25maWcgPSBBU0NfRUVQX01BWF9EVkNfQUREUiAtIDI7CisJaW50IG5fZXJyb3I7CisJdXNob3J0ICp3YnVmOworCXVzaG9ydCB3b3JkOworCXVzaG9ydCBzdW07CisJaW50IHNfYWRkcjsKKwlpbnQgY2ZnX2JlZzsKKwlpbnQgY2ZnX2VuZDsKKwlpbnQgdWNoYXJfZW5kX2luX2NvbmZpZyA9IEFTQ19FRVBfTUFYX0RWQ19BRERSIC0gMjsKIAorCXdidWYgPSAodXNob3J0ICopY2ZnX2J1ZjsKKwluX2Vycm9yID0gMDsKKwlzdW0gPSAwOworCS8qIFdyaXRlIHR3byBjb25maWcgd29yZHM7IEFzY1dyaXRlRUVQV29yZCgpIHdpbGwgc3dhcCBieXRlcy4gKi8KKwlmb3IgKHNfYWRkciA9IDA7IHNfYWRkciA8IDI7IHNfYWRkcisrLCB3YnVmKyspIHsKKwkJc3VtICs9ICp3YnVmOworCQlpZiAoKndidWYgIT0gQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpc19hZGRyLCAqd2J1ZikpIHsKKwkJCW5fZXJyb3IrKzsKKwkJfQorCX0KKwlpZiAoYnVzX3R5cGUgJiBBU0NfSVNfVkwpIHsKKwkJY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUdfVkw7CisJCWNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUl9WTDsKKwl9IGVsc2UgeworCQljZmdfYmVnID0gQVNDX0VFUF9EVkNfQ0ZHX0JFRzsKKwkJY2ZnX2VuZCA9IEFTQ19FRVBfTUFYX0RWQ19BRERSOworCX0KKwlmb3IgKHNfYWRkciA9IGNmZ19iZWc7IHNfYWRkciA8PSAoY2ZnX2VuZCAtIDEpOyBzX2FkZHIrKywgd2J1ZisrKSB7CisJCWlmIChzX2FkZHIgPD0gdWNoYXJfZW5kX2luX2NvbmZpZykgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYSBjaGFyIGZpZWxkLiBTd2FwIGNoYXIgZmllbGRzIGJlZm9yZSB0aGV5IGFyZQorCQkJICogc3dhcHBlZCBhZ2FpbiBieSBBc2NXcml0ZUVFUFdvcmQoKS4KKwkJCSAqLworCQkJd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKwkJCWlmICh3b3JkICE9CisJCQkgICAgQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpc19hZGRyLCB3b3JkKSkgeworCQkJCW5fZXJyb3IrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IHN3YXAgd29yZCBmaWVsZCBhdCB0aGUgZW5kIC0gY250bCBmaWVsZC4gKi8KKwkJCWlmICgqd2J1ZiAhPQorCQkJICAgIEFzY1dyaXRlRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKXNfYWRkciwgKndidWYpKSB7CisJCQkJbl9lcnJvcisrOworCQkJfQorCQl9CisJCXN1bSArPSAqd2J1ZjsJLyogQ2hlY2tzdW0gY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworCX0KKwkvKiBXcml0ZSBjaGVja3N1bSB3b3JkLiBJdCB3aWxsIGJlIHN3YXBwZWQgYnkgQXNjV3JpdGVFRVBXb3JkKCkuICovCisJKndidWYgPSBzdW07CisJaWYgKHN1bSAhPSBBc2NXcml0ZUVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcilzX2FkZHIsIHN1bSkpIHsKKwkJbl9lcnJvcisrOworCX0KIAotICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7Ci0gICAgbl9lcnJvciA9IDA7Ci0gICAgc3VtID0gMDsKLSAgICAvKiBXcml0ZSB0d28gY29uZmlnIHdvcmRzOyBBc2NXcml0ZUVFUFdvcmQoKSB3aWxsIHN3YXAgYnl0ZXMuICovCi0gICAgZm9yIChzX2FkZHIgPSAwOyBzX2FkZHIgPCAyOyBzX2FkZHIrKywgd2J1ZisrKSB7Ci0gICAgICAgIHN1bSArPSAqd2J1ZjsKLSAgICAgICAgaWYgKCp3YnVmICE9IEFzY1dyaXRlRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIsICp3YnVmKSkgewotICAgICAgICAgICAgbl9lcnJvcisrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChidXNfdHlwZSAmIEFTQ19JU19WTCkgewotICAgICAgICBjZmdfYmVnID0gQVNDX0VFUF9EVkNfQ0ZHX0JFR19WTDsKLSAgICAgICAgY2ZnX2VuZCA9IEFTQ19FRVBfTUFYX0RWQ19BRERSX1ZMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHOwotICAgICAgICBjZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFI7Ci0gICAgfQotICAgIGZvciAoc19hZGRyID0gY2ZnX2JlZzsgc19hZGRyIDw9IChjZmdfZW5kIC0gMSk7IHNfYWRkcisrLCB3YnVmKyspIHsKLSAgICAgICAgaWYgKHNfYWRkciA8PSB1Y2hhcl9lbmRfaW5fY29uZmlnKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhpcyBpcyBhIGNoYXIgZmllbGQuIFN3YXAgY2hhciBmaWVsZHMgYmVmb3JlIHRoZXkgYXJlCi0gICAgICAgICAgICAgKiBzd2FwcGVkIGFnYWluIGJ5IEFzY1dyaXRlRUVQV29yZCgpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOwotICAgICAgICAgICAgaWYgKHdvcmQgIT0gQXNjV3JpdGVFRVBXb3JkKCBpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIsIHdvcmQpKSB7Ci0gICAgICAgICAgICAgICAgbl9lcnJvcisrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogRG9uJ3Qgc3dhcCB3b3JkIGZpZWxkIGF0IHRoZSBlbmQgLSBjbnRsIGZpZWxkLiAqLwotICAgICAgICAgICAgaWYgKCp3YnVmICE9IEFzY1dyaXRlRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIsICp3YnVmKSkgewotICAgICAgICAgICAgICAgIG5fZXJyb3IrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdW0gKz0gKndidWY7IC8qIENoZWNrc3VtIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KLSAgICB9Ci0gICAgLyogV3JpdGUgY2hlY2tzdW0gd29yZC4gSXQgd2lsbCBiZSBzd2FwcGVkIGJ5IEFzY1dyaXRlRUVQV29yZCgpLiAqLwotICAgICp3YnVmID0gc3VtOwotICAgIGlmIChzdW0gIT0gQXNjV3JpdGVFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkciwgc3VtKSkgewotICAgICAgICBuX2Vycm9yKys7Ci0gICAgfQotCi0gICAgLyogUmVhZCBFRVBST00gYmFjayBhZ2Fpbi4gKi8KLSAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOwotICAgIC8qCi0gICAgICogUmVhZCB0d28gY29uZmlnIHdvcmRzOyBCeXRlLXN3YXBwaW5nIGRvbmUgYnkgQXNjUmVhZEVFUFdvcmQoKS4KLSAgICAgKi8KLSAgICBmb3IgKHNfYWRkciA9IDA7IHNfYWRkciA8IDI7IHNfYWRkcisrLCB3YnVmKyspIHsKLSAgICAgICAgaWYgKCp3YnVmICE9IEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpIHNfYWRkcikpIHsKLSAgICAgICAgICAgIG5fZXJyb3IrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYnVzX3R5cGUgJiBBU0NfSVNfVkwpIHsKLSAgICAgICAgY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUdfVkw7Ci0gICAgICAgIGNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUl9WTDsKLSAgICB9IGVsc2UgewotICAgICAgICBjZmdfYmVnID0gQVNDX0VFUF9EVkNfQ0ZHX0JFRzsKLSAgICAgICAgY2ZnX2VuZCA9IEFTQ19FRVBfTUFYX0RWQ19BRERSOwotICAgIH0KLSAgICBmb3IgKHNfYWRkciA9IGNmZ19iZWc7IHNfYWRkciA8PSAoY2ZnX2VuZCAtIDEpOyBzX2FkZHIrKywgd2J1ZisrKSB7Ci0gICAgICAgIGlmIChzX2FkZHIgPD0gdWNoYXJfZW5kX2luX2NvbmZpZykgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFN3YXAgYWxsIGNoYXIgZmllbGRzLiBNdXN0IHVuc3dhcCBieXRlcyBhbHJlYWR5IHN3YXBwZWQKLSAgICAgICAgICAgICAqIGJ5IEFzY1JlYWRFRVBXb3JkKCkuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHdvcmQgPSBsZTE2X3RvX2NwdShBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIERvbid0IHN3YXAgd29yZCBmaWVsZCBhdCB0aGUgZW5kIC0gY250bCBmaWVsZC4gKi8KLSAgICAgICAgICAgIHdvcmQgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqd2J1ZiAhPSB3b3JkKSB7Ci0gICAgICAgICAgICBuX2Vycm9yKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogUmVhZCBjaGVja3N1bTsgQnl0ZSBzd2FwcGluZyBub3QgbmVlZGVkLiAqLwotICAgIGlmIChBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKSBzX2FkZHIpICE9IHN1bSkgewotICAgICAgICBuX2Vycm9yKys7Ci0gICAgfQotICAgIHJldHVybiAobl9lcnJvcik7CisJLyogUmVhZCBFRVBST00gYmFjayBhZ2Fpbi4gKi8KKwl3YnVmID0gKHVzaG9ydCAqKWNmZ19idWY7CisJLyoKKwkgKiBSZWFkIHR3byBjb25maWcgd29yZHM7IEJ5dGUtc3dhcHBpbmcgZG9uZSBieSBBc2NSZWFkRUVQV29yZCgpLgorCSAqLworCWZvciAoc19hZGRyID0gMDsgc19hZGRyIDwgMjsgc19hZGRyKyssIHdidWYrKykgeworCQlpZiAoKndidWYgIT0gQXNjUmVhZEVFUFdvcmQoaW9wX2Jhc2UsICh1Y2hhcilzX2FkZHIpKSB7CisJCQluX2Vycm9yKys7CisJCX0KKwl9CisJaWYgKGJ1c190eXBlICYgQVNDX0lTX1ZMKSB7CisJCWNmZ19iZWcgPSBBU0NfRUVQX0RWQ19DRkdfQkVHX1ZMOworCQljZmdfZW5kID0gQVNDX0VFUF9NQVhfRFZDX0FERFJfVkw7CisJfSBlbHNlIHsKKwkJY2ZnX2JlZyA9IEFTQ19FRVBfRFZDX0NGR19CRUc7CisJCWNmZ19lbmQgPSBBU0NfRUVQX01BWF9EVkNfQUREUjsKKwl9CisJZm9yIChzX2FkZHIgPSBjZmdfYmVnOyBzX2FkZHIgPD0gKGNmZ19lbmQgLSAxKTsgc19hZGRyKyssIHdidWYrKykgeworCQlpZiAoc19hZGRyIDw9IHVjaGFyX2VuZF9pbl9jb25maWcpIHsKKwkJCS8qCisJCQkgKiBTd2FwIGFsbCBjaGFyIGZpZWxkcy4gTXVzdCB1bnN3YXAgYnl0ZXMgYWxyZWFkeSBzd2FwcGVkCisJCQkgKiBieSBBc2NSZWFkRUVQV29yZCgpLgorCQkJICovCisJCQl3b3JkID0KKwkJCSAgICBsZTE2X3RvX2NwdShBc2NSZWFkRUVQV29yZAorCQkJCQkoaW9wX2Jhc2UsICh1Y2hhcilzX2FkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERvbid0IHN3YXAgd29yZCBmaWVsZCBhdCB0aGUgZW5kIC0gY250bCBmaWVsZC4gKi8KKwkJCXdvcmQgPSBBc2NSZWFkRUVQV29yZChpb3BfYmFzZSwgKHVjaGFyKXNfYWRkcik7CisJCX0KKwkJaWYgKCp3YnVmICE9IHdvcmQpIHsKKwkJCW5fZXJyb3IrKzsKKwkJfQorCX0KKwkvKiBSZWFkIGNoZWNrc3VtOyBCeXRlIHN3YXBwaW5nIG5vdCBuZWVkZWQuICovCisJaWYgKEFzY1JlYWRFRVBXb3JkKGlvcF9iYXNlLCAodWNoYXIpc19hZGRyKSAhPSBzdW0pIHsKKwkJbl9lcnJvcisrOworCX0KKwlyZXR1cm4gKG5fZXJyb3IpOwogfQogCi1TVEFUSUMgaW50IF9faW5pdAotQXNjU2V0RUVQQ29uZmlnKAotICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgIEFTQ0VFUF9DT05GSUcgKiBjZmdfYnVmLCB1c2hvcnQgYnVzX3R5cGUKLSkKK3N0YXRpYyBpbnQgX19pbml0CitBc2NTZXRFRVBDb25maWcoUG9ydEFkZHIgaW9wX2Jhc2UsIEFTQ0VFUF9DT05GSUcgKmNmZ19idWYsIHVzaG9ydCBidXNfdHlwZSkKIHsKLSAgICBpbnQgICAgICAgICAgICByZXRyeTsKLSAgICBpbnQgICAgICAgICAgICBuX2Vycm9yOworCWludCByZXRyeTsKKwlpbnQgbl9lcnJvcjsKIAotICAgIHJldHJ5ID0gMDsKLSAgICB3aGlsZSAoVFJVRSkgewotICAgICAgICBpZiAoKG5fZXJyb3IgPSBBc2NTZXRFRVBDb25maWdPbmNlKGlvcF9iYXNlLCBjZmdfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c190eXBlKSkgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCsrcmV0cnkgPiBBU0NfRUVQX01BWF9SRVRSWSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChuX2Vycm9yKTsKKwlyZXRyeSA9IDA7CisJd2hpbGUgKFRSVUUpIHsKKwkJaWYgKChuX2Vycm9yID0gQXNjU2V0RUVQQ29uZmlnT25jZShpb3BfYmFzZSwgY2ZnX2J1ZiwKKwkJCQkJCSAgIGJ1c190eXBlKSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCsrcmV0cnkgPiBBU0NfRUVQX01BWF9SRVRSWSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChuX2Vycm9yKTsKIH0KIAotU1RBVElDIHZvaWQKLUFzY0FzeW5jRml4KAotICAgICAgICAgICAgICAgQVNDX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICB1Y2hhciB0aWRfbm8sCi0gICAgICAgICAgICAgICBBU0NfU0NTSV9JTlFVSVJZICppbnEpCitzdGF0aWMgdm9pZAorQXNjQXN5bmNGaXgoQVNDX0RWQ19WQVIgKmFzY19kdmMsIHVjaGFyIHRpZF9ubywgQVNDX1NDU0lfSU5RVUlSWSAqaW5xKQogewotICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICAgICBkdmNfdHlwZTsKLSAgICBBU0NfU0NTSV9CSVRfSURfVFlQRSAgICAgICAgdGlkX2JpdHM7CisJdWNoYXIgZHZjX3R5cGU7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgdGlkX2JpdHM7CiAKLSAgICBkdmNfdHlwZSA9IEFTQ19JTlFfRFZDX1RZUEUoaW5xKTsKLSAgICB0aWRfYml0cyA9IEFTQ19USVhfVE9fVEFSR0VUX0lEKHRpZF9ubyk7CisJZHZjX3R5cGUgPSBBU0NfSU5RX0RWQ19UWVBFKGlucSk7CisJdGlkX2JpdHMgPSBBU0NfVElYX1RPX1RBUkdFVF9JRCh0aWRfbm8pOwogCi0gICAgaWYgKGFzY19kdmMtPmJ1Z19maXhfY250bCAmIEFTQ19CVUdfRklYX0FTWU5fVVNFX1NZTikKLSAgICB7Ci0gICAgICAgIGlmICghKGFzY19kdmMtPmluaXRfc2R0ciAmIHRpZF9iaXRzKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChkdmNfdHlwZSA9PSBUWVBFX1JPTSkgJiYKLSAgICAgICAgICAgICAgICAoQXNjQ29tcGFyZVN0cmluZygodWNoYXIgKikgaW5xLT52ZW5kb3JfaWQsCi0gICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSAiSFAgIiwgMykgPT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzIHw9IHRpZF9iaXRzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgfD0gdGlkX2JpdHM7Ci0gICAgICAgICAgICBpZiAoKGR2Y190eXBlID09IFRZUEVfUFJPQ0VTU09SKSB8fAotICAgICAgICAgICAgICAgIChkdmNfdHlwZSA9PSBUWVBFX1NDQU5ORVIpIHx8Ci0gICAgICAgICAgICAgICAgKGR2Y190eXBlID09IFRZUEVfUk9NKSB8fAotICAgICAgICAgICAgICAgIChkdmNfdHlwZSA9PSBUWVBFX1RBUEUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICY9IH50aWRfYml0czsKLSAgICAgICAgICAgIH0KKwlpZiAoYXNjX2R2Yy0+YnVnX2ZpeF9jbnRsICYgQVNDX0JVR19GSVhfQVNZTl9VU0VfU1lOKSB7CisJCWlmICghKGFzY19kdmMtPmluaXRfc2R0ciAmIHRpZF9iaXRzKSkgeworCQkJaWYgKChkdmNfdHlwZSA9PSBUWVBFX1JPTSkgJiYKKwkJCSAgICAoQXNjQ29tcGFyZVN0cmluZygodWNoYXIgKilpbnEtPnZlbmRvcl9pZCwKKwkJCQkJICAgICAgKHVjaGFyICopIkhQICIsIDMpID09IDApKSB7CisJCQkJYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXJfYWx3YXlzIHw9IHRpZF9iaXRzOworCQkJfQorCQkJYXNjX2R2Yy0+cGNpX2ZpeF9hc3luX3hmZXIgfD0gdGlkX2JpdHM7CisJCQlpZiAoKGR2Y190eXBlID09IFRZUEVfUFJPQ0VTU09SKSB8fAorCQkJICAgIChkdmNfdHlwZSA9PSBUWVBFX1NDQU5ORVIpIHx8CisJCQkgICAgKGR2Y190eXBlID09IFRZUEVfUk9NKSB8fCAoZHZjX3R5cGUgPT0gVFlQRV9UQVBFKSkgeworCQkJCWFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICY9IH50aWRfYml0czsKKwkJCX0KIAotICAgICAgICAgICAgaWYgKGFzY19kdmMtPnBjaV9maXhfYXN5bl94ZmVyICYgdGlkX2JpdHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNjU2V0UnVuQ2hpcFN5blJlZ0F0SUQoYXNjX2R2Yy0+aW9wX2Jhc2UsIHRpZF9ubywKLSAgICAgICAgICAgICAgICAgICAgQVNZTl9TRFRSX0RBVEFfRklYX1BDSV9SRVZfQUIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKKwkJCWlmIChhc2NfZHZjLT5wY2lfZml4X2FzeW5feGZlciAmIHRpZF9iaXRzKSB7CisJCQkJQXNjU2V0UnVuQ2hpcFN5blJlZ0F0SUQoYXNjX2R2Yy0+aW9wX2Jhc2UsCisJCQkJCQkJdGlkX25vLAorCQkJCQkJCUFTWU5fU0RUUl9EQVRBX0ZJWF9QQ0lfUkVWX0FCKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm47CiB9CiAKLVNUQVRJQyBpbnQKLUFzY1RhZ1F1ZXVpbmdTYWZlKEFTQ19TQ1NJX0lOUVVJUlkgKmlucSkKK3N0YXRpYyBpbnQgQXNjVGFnUXVldWluZ1NhZmUoQVNDX1NDU0lfSU5RVUlSWSAqaW5xKQogewotICAgIGlmICgoaW5xLT5hZGRfbGVuID49IDMyKSAmJgotICAgICAgICAoQXNjQ29tcGFyZVN0cmluZygodWNoYXIgKikgaW5xLT52ZW5kb3JfaWQsCi0gICAgICAgICAgICAodWNoYXIgKikgIlFVQU5UVU0gWFAzNDMwMSIsIDE1KSA9PSAwKSAmJgotICAgICAgICAoQXNjQ29tcGFyZVN0cmluZygodWNoYXIgKikgaW5xLT5wcm9kdWN0X3Jldl9sZXZlbCwKLSAgICAgICAgICAgICh1Y2hhciAqKSAiMTA3MSIsIDQpID09IDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOworCWlmICgoaW5xLT5hZGRfbGVuID49IDMyKSAmJgorCSAgICAoQXNjQ29tcGFyZVN0cmluZygodWNoYXIgKilpbnEtPnZlbmRvcl9pZCwKKwkJCSAgICAgICh1Y2hhciAqKSJRVUFOVFVNIFhQMzQzMDEiLCAxNSkgPT0gMCkgJiYKKwkgICAgKEFzY0NvbXBhcmVTdHJpbmcoKHVjaGFyICopaW5xLT5wcm9kdWN0X3Jldl9sZXZlbCwKKwkJCSAgICAgICh1Y2hhciAqKSIxMDcxIiwgNCkgPT0gMCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOwogfQogCi1TVEFUSUMgdm9pZAotQXNjSW5xdWlyeUhhbmRsaW5nKEFTQ19EVkNfVkFSICphc2NfZHZjLAotICAgICAgICAgICAgICAgICAgIHVjaGFyIHRpZF9ubywgQVNDX1NDU0lfSU5RVUlSWSAqaW5xKQorc3RhdGljIHZvaWQKK0FzY0lucXVpcnlIYW5kbGluZyhBU0NfRFZDX1ZBUiAqYXNjX2R2YywgdWNoYXIgdGlkX25vLCBBU0NfU0NTSV9JTlFVSVJZICppbnEpCiB7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgdGlkX2JpdCA9IEFTQ19USVhfVE9fVEFSR0VUX0lEKHRpZF9ubyk7Ci0gICAgQVNDX1NDU0lfQklUX0lEX1RZUEUgb3JpZ19pbml0X3NkdHIsIG9yaWdfdXNlX3RhZ2dlZF9xbmc7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgdGlkX2JpdCA9IEFTQ19USVhfVE9fVEFSR0VUX0lEKHRpZF9ubyk7CisJQVNDX1NDU0lfQklUX0lEX1RZUEUgb3JpZ19pbml0X3NkdHIsIG9yaWdfdXNlX3RhZ2dlZF9xbmc7CiAKLSAgICBvcmlnX2luaXRfc2R0ciA9IGFzY19kdmMtPmluaXRfc2R0cjsKLSAgICBvcmlnX3VzZV90YWdnZWRfcW5nID0gYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmc7CisJb3JpZ19pbml0X3NkdHIgPSBhc2NfZHZjLT5pbml0X3NkdHI7CisJb3JpZ191c2VfdGFnZ2VkX3FuZyA9IGFzY19kdmMtPnVzZV90YWdnZWRfcW5nOwogCi0gICAgYXNjX2R2Yy0+aW5pdF9zZHRyICY9IH50aWRfYml0OwotICAgIGFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgJj0gfnRpZF9iaXQ7Ci0gICAgYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmcgJj0gfnRpZF9iaXQ7CisJYXNjX2R2Yy0+aW5pdF9zZHRyICY9IH50aWRfYml0OworCWFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgJj0gfnRpZF9iaXQ7CisJYXNjX2R2Yy0+dXNlX3RhZ2dlZF9xbmcgJj0gfnRpZF9iaXQ7CiAKLSAgICBpZiAoQVNDX0lOUV9SRVNQT05TRV9GTVQoaW5xKSA+PSAyIHx8IEFTQ19JTlFfQU5TSV9WRVIoaW5xKSA+PSAyKSB7Ci0gICAgICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT5zZHRyX2VuYWJsZSAmIHRpZF9iaXQpICYmIEFTQ19JTlFfU1lOQyhpbnEpKSB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5pbml0X3NkdHIgfD0gdGlkX2JpdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGFzY19kdmMtPmNmZy0+Y21kX3FuZ19lbmFibGVkICYgdGlkX2JpdCkgJiYKLSAgICAgICAgICAgICBBU0NfSU5RX0NNRF9RVUVVRShpbnEpKSB7Ci0gICAgICAgICAgICBpZiAoQXNjVGFnUXVldWluZ1NhZmUoaW5xKSkgewotICAgICAgICAgICAgICAgIGFzY19kdmMtPnVzZV90YWdnZWRfcW5nIHw9IHRpZF9iaXQ7Ci0gICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT5jYW5fdGFnZ2VkX3FuZyB8PSB0aWRfYml0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChvcmlnX3VzZV90YWdnZWRfcW5nICE9IGFzY19kdmMtPnVzZV90YWdnZWRfcW5nKSB7Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsIEFTQ1ZfRElTQ19FTkFCTEVfQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKLSAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShhc2NfZHZjLT5pb3BfYmFzZSwgQVNDVl9VU0VfVEFHR0VEX1FOR19CLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPnVzZV90YWdnZWRfcW5nKTsKLSAgICAgICAgQXNjV3JpdGVMcmFtQnl0ZShhc2NfZHZjLT5pb3BfYmFzZSwgQVNDVl9DQU5fVEFHR0VEX1FOR19CLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcpOworCWlmIChBU0NfSU5RX1JFU1BPTlNFX0ZNVChpbnEpID49IDIgfHwgQVNDX0lOUV9BTlNJX1ZFUihpbnEpID49IDIpIHsKKwkJaWYgKChhc2NfZHZjLT5jZmctPnNkdHJfZW5hYmxlICYgdGlkX2JpdCkgJiYgQVNDX0lOUV9TWU5DKGlucSkpIHsKKwkJCWFzY19kdmMtPmluaXRfc2R0ciB8PSB0aWRfYml0OworCQl9CisJCWlmICgoYXNjX2R2Yy0+Y2ZnLT5jbWRfcW5nX2VuYWJsZWQgJiB0aWRfYml0KSAmJgorCQkgICAgQVNDX0lOUV9DTURfUVVFVUUoaW5xKSkgeworCQkJaWYgKEFzY1RhZ1F1ZXVpbmdTYWZlKGlucSkpIHsKKwkJCQlhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZyB8PSB0aWRfYml0OworCQkJCWFzY19kdmMtPmNmZy0+Y2FuX3RhZ2dlZF9xbmcgfD0gdGlkX2JpdDsKKwkJCX0KKwkJfQorCX0KKwlpZiAob3JpZ191c2VfdGFnZ2VkX3FuZyAhPSBhc2NfZHZjLT51c2VfdGFnZ2VkX3FuZykgeworCQlBc2NXcml0ZUxyYW1CeXRlKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX0RJU0NfRU5BQkxFX0IsCisJCQkJIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUpOworCQlBc2NXcml0ZUxyYW1CeXRlKGFzY19kdmMtPmlvcF9iYXNlLCBBU0NWX1VTRV9UQUdHRURfUU5HX0IsCisJCQkJIGFzY19kdmMtPnVzZV90YWdnZWRfcW5nKTsKKwkJQXNjV3JpdGVMcmFtQnl0ZShhc2NfZHZjLT5pb3BfYmFzZSwgQVNDVl9DQU5fVEFHR0VEX1FOR19CLAorCQkJCSBhc2NfZHZjLT5jZmctPmNhbl90YWdnZWRfcW5nKTsKIAotICAgICAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dID0KLSAgICAgICAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW3RpZF9ub107Ci0gICAgICAgIEFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVzaG9ydCkgKEFTQ1ZfTUFYX0RWQ19RTkdfQkVHICsgdGlkX25vKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZ1t0aWRfbm9dKTsKLSAgICB9Ci0gICAgaWYgKG9yaWdfaW5pdF9zZHRyICE9IGFzY19kdmMtPmluaXRfc2R0cikgewotICAgICAgICBBc2NBc3luY0ZpeChhc2NfZHZjLCB0aWRfbm8sIGlucSk7Ci0gICAgfQotICAgIHJldHVybjsKKwkJYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSA9CisJCSAgICBhc2NfZHZjLT5jZmctPm1heF90YWdfcW5nW3RpZF9ub107CisJCUFzY1dyaXRlTHJhbUJ5dGUoYXNjX2R2Yy0+aW9wX2Jhc2UsCisJCQkJICh1c2hvcnQpKEFTQ1ZfTUFYX0RWQ19RTkdfQkVHICsgdGlkX25vKSwKKwkJCQkgYXNjX2R2Yy0+bWF4X2R2Y19xbmdbdGlkX25vXSk7CisJfQorCWlmIChvcmlnX2luaXRfc2R0ciAhPSBhc2NfZHZjLT5pbml0X3NkdHIpIHsKKwkJQXNjQXN5bmNGaXgoYXNjX2R2YywgdGlkX25vLCBpbnEpOworCX0KKwlyZXR1cm47CiB9CiAKLVNUQVRJQyBpbnQKLUFzY0NvbXBhcmVTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHVjaGFyICpzdHIxLAotICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc3RyMiwKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbgotKQorc3RhdGljIGludCBBc2NDb21wYXJlU3RyaW5nKHVjaGFyICpzdHIxLCB1Y2hhciAqc3RyMiwgaW50IGxlbikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBkaWZmOworCWludCBpOworCWludCBkaWZmOwogCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGRpZmYgPSAoaW50KSAoc3RyMVtpXSAtIHN0cjJbaV0pOwotICAgICAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIChkaWZmKTsKLSAgICB9Ci0gICAgcmV0dXJuICgwKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJZGlmZiA9IChpbnQpKHN0cjFbaV0gLSBzdHIyW2ldKTsKKwkJaWYgKGRpZmYgIT0gMCkKKwkJCXJldHVybiAoZGlmZik7CisJfQorCXJldHVybiAoMCk7CiB9CiAKLVNUQVRJQyB1Y2hhcgotQXNjUmVhZExyYW1CeXRlKAotICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyCi0pCitzdGF0aWMgdWNoYXIgQXNjUmVhZExyYW1CeXRlKFBvcnRBZGRyIGlvcF9iYXNlLCB1c2hvcnQgYWRkcikKIHsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIGJ5dGVfZGF0YTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmRfZGF0YTsKKwl1Y2hhciBieXRlX2RhdGE7CisJdXNob3J0IHdvcmRfZGF0YTsKIAotICAgIGlmIChpc29kZF93b3JkKGFkZHIpKSB7Ci0gICAgICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgYWRkciAtIDEpOwotICAgICAgICB3b3JkX2RhdGEgPSBBc2NHZXRDaGlwTHJhbURhdGEoaW9wX2Jhc2UpOwotICAgICAgICBieXRlX2RhdGEgPSAodWNoYXIpICgod29yZF9kYXRhID4+IDgpICYgMHhGRik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBhZGRyKTsKLSAgICAgICAgd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKLSAgICAgICAgYnl0ZV9kYXRhID0gKHVjaGFyKSAod29yZF9kYXRhICYgMHhGRik7Ci0gICAgfQotICAgIHJldHVybiAoYnl0ZV9kYXRhKTsKKwlpZiAoaXNvZGRfd29yZChhZGRyKSkgeworCQlBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIgLSAxKTsKKwkJd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKwkJYnl0ZV9kYXRhID0gKHVjaGFyKSgod29yZF9kYXRhID4+IDgpICYgMHhGRik7CisJfSBlbHNlIHsKKwkJQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBhZGRyKTsKKwkJd29yZF9kYXRhID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKwkJYnl0ZV9kYXRhID0gKHVjaGFyKSh3b3JkX2RhdGEgJiAweEZGKTsKKwl9CisJcmV0dXJuIChieXRlX2RhdGEpOwogfQotU1RBVElDIHVzaG9ydAotQXNjUmVhZExyYW1Xb3JkKAotICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyCi0pCi17Ci0gICAgdXNob3J0ICAgICAgICAgICAgICB3b3JkX2RhdGE7CiAKLSAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOwotICAgIHdvcmRfZGF0YSA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7Ci0gICAgcmV0dXJuICh3b3JkX2RhdGEpOworc3RhdGljIHVzaG9ydCBBc2NSZWFkTHJhbVdvcmQoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBhZGRyKQoreworCXVzaG9ydCB3b3JkX2RhdGE7CisKKwlBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOworCXdvcmRfZGF0YSA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7CisJcmV0dXJuICh3b3JkX2RhdGEpOwogfQogCiAjaWYgQ0NfVkVSWV9MT05HX1NHX0xJU1QKLVNUQVRJQyBBU0NfRENOVAotQXNjUmVhZExyYW1EV29yZCgKLSAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgIHVzaG9ydCBhZGRyCi0pCitzdGF0aWMgQVNDX0RDTlQgQXNjUmVhZExyYW1EV29yZChQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IGFkZHIpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICB2YWxfbG93LCB2YWxfaGlnaDsKLSAgICBBU0NfRENOVCAgICAgICAgICAgIGR3b3JkX2RhdGE7CisJdXNob3J0IHZhbF9sb3csIHZhbF9oaWdoOworCUFTQ19EQ05UIGR3b3JkX2RhdGE7CiAKLSAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOwotICAgIHZhbF9sb3cgPSBBc2NHZXRDaGlwTHJhbURhdGEoaW9wX2Jhc2UpOwotICAgIHZhbF9oaWdoID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKLSAgICBkd29yZF9kYXRhID0gKChBU0NfRENOVCkgdmFsX2hpZ2ggPDwgMTYpIHwgKEFTQ19EQ05UKSB2YWxfbG93OwotICAgIHJldHVybiAoZHdvcmRfZGF0YSk7CisJQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBhZGRyKTsKKwl2YWxfbG93ID0gQXNjR2V0Q2hpcExyYW1EYXRhKGlvcF9iYXNlKTsKKwl2YWxfaGlnaCA9IEFzY0dldENoaXBMcmFtRGF0YShpb3BfYmFzZSk7CisJZHdvcmRfZGF0YSA9ICgoQVNDX0RDTlQpIHZhbF9oaWdoIDw8IDE2KSB8IChBU0NfRENOVCkgdmFsX2xvdzsKKwlyZXR1cm4gKGR3b3JkX2RhdGEpOwogfQogI2VuZGlmIC8qIENDX1ZFUllfTE9OR19TR19MSVNUICovCiAKLVNUQVRJQyB2b2lkCi1Bc2NXcml0ZUxyYW1Xb3JkKAotICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgdXNob3J0IGFkZHIsCi0gICAgICAgICAgICAgICAgICAgIHVzaG9ydCB3b3JkX3ZhbAotKQorc3RhdGljIHZvaWQgQXNjV3JpdGVMcmFtV29yZChQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IGFkZHIsIHVzaG9ydCB3b3JkX3ZhbCkKIHsKLSAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOwotICAgIEFzY1NldENoaXBMcmFtRGF0YShpb3BfYmFzZSwgd29yZF92YWwpOwotICAgIHJldHVybjsKKwlBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIGFkZHIpOworCUFzY1NldENoaXBMcmFtRGF0YShpb3BfYmFzZSwgd29yZF92YWwpOworCXJldHVybjsKIH0KIAotU1RBVElDIHZvaWQKLUFzY1dyaXRlTHJhbUJ5dGUoCi0gICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICB1c2hvcnQgYWRkciwKLSAgICAgICAgICAgICAgICAgICAgdWNoYXIgYnl0ZV92YWwKLSkKK3N0YXRpYyB2b2lkIEFzY1dyaXRlTHJhbUJ5dGUoUG9ydEFkZHIgaW9wX2Jhc2UsIHVzaG9ydCBhZGRyLCB1Y2hhciBieXRlX3ZhbCkKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHdvcmRfZGF0YTsKKwl1c2hvcnQgd29yZF9kYXRhOwogCi0gICAgaWYgKGlzb2RkX3dvcmQoYWRkcikpIHsKLSAgICAgICAgYWRkci0tOwotICAgICAgICB3b3JkX2RhdGEgPSBBc2NSZWFkTHJhbVdvcmQoaW9wX2Jhc2UsIGFkZHIpOwotICAgICAgICB3b3JkX2RhdGEgJj0gMHgwMEZGOwotICAgICAgICB3b3JkX2RhdGEgfD0gKCgodXNob3J0KSBieXRlX3ZhbCA8PCA4KSAmIDB4RkYwMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd29yZF9kYXRhID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyKTsKLSAgICAgICAgd29yZF9kYXRhICY9IDB4RkYwMDsKLSAgICAgICAgd29yZF9kYXRhIHw9ICgodXNob3J0KSBieXRlX3ZhbCAmIDB4MDBGRik7Ci0gICAgfQotICAgIEFzY1dyaXRlTHJhbVdvcmQoaW9wX2Jhc2UsIGFkZHIsIHdvcmRfZGF0YSk7Ci0gICAgcmV0dXJuOworCWlmIChpc29kZF93b3JkKGFkZHIpKSB7CisJCWFkZHItLTsKKwkJd29yZF9kYXRhID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyKTsKKwkJd29yZF9kYXRhICY9IDB4MDBGRjsKKwkJd29yZF9kYXRhIHw9ICgoKHVzaG9ydClieXRlX3ZhbCA8PCA4KSAmIDB4RkYwMCk7CisJfSBlbHNlIHsKKwkJd29yZF9kYXRhID0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBhZGRyKTsKKwkJd29yZF9kYXRhICY9IDB4RkYwMDsKKwkJd29yZF9kYXRhIHw9ICgodXNob3J0KWJ5dGVfdmFsICYgMHgwMEZGKTsKKwl9CisJQXNjV3JpdGVMcmFtV29yZChpb3BfYmFzZSwgYWRkciwgd29yZF9kYXRhKTsKKwlyZXR1cm47CiB9CiAKIC8qCkBAIC0xMjg0MSwzMCArMTE2MjgsMjYgQEAKICAqIFRoZSBzb3VyY2UgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgaW4gbWVtb3J5CiAgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdHRlbiB0byBMUkFNLgogICovCi1TVEFUSUMgdm9pZAotQXNjTWVtV29yZENvcHlQdHJUb0xyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc19idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKLSkKK3N0YXRpYyB2b2lkCitBc2NNZW1Xb3JkQ29weVB0clRvTHJhbShQb3J0QWRkciBpb3BfYmFzZSwKKwkJCXVzaG9ydCBzX2FkZHIsIHVjaGFyICpzX2J1ZmZlciwgaW50IHdvcmRzKQogewotICAgIGludCAgICBpOworCWludCBpOwogCi0gICAgQXNjU2V0Q2hpcExyYW1BZGRyKGlvcF9iYXNlLCBzX2FkZHIpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyICogd29yZHM7IGkgKz0gMikgewotICAgICAgICAvKgotICAgICAgICAgKiBPbiBhIGxpdHRsZS1lbmRpYW4gc3lzdGVtIHRoZSBzZWNvbmQgYXJndW1lbnQgYmVsb3cKLSAgICAgICAgICogcHJvZHVjZXMgYSBsaXR0bGUtZW5kaWFuIHVzaG9ydCB3aGljaCBpcyB3cml0dGVuIHRvCi0gICAgICAgICAqIExSQU0gaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4gT24gYSBiaWctZW5kaWFuIHN5c3RlbQotICAgICAgICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHByb2R1Y2VzIGEgYmlnLWVuZGlhbiB1c2hvcnQgd2hpY2gKLSAgICAgICAgICogaXMgInRyYW5zcGFyZW50bHkiIGJ5dGUtc3dhcHBlZCBieSBvdXRwdygpIGFuZCB3cml0dGVuCi0gICAgICAgICAqIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgdG8gTFJBTS4KLSAgICAgICAgICovCi0gICAgICAgIG91dHB3KGlvcF9iYXNlICsgSU9QX1JBTV9EQVRBLAotICAgICAgICAgICAgKCh1c2hvcnQpIHNfYnVmZmVyW2kgKyAxXSA8PCA4KSB8IHNfYnVmZmVyW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuOworCUFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKKwkJLyoKKwkJICogT24gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSB0aGUgc2Vjb25kIGFyZ3VtZW50IGJlbG93CisJCSAqIHByb2R1Y2VzIGEgbGl0dGxlLWVuZGlhbiB1c2hvcnQgd2hpY2ggaXMgd3JpdHRlbiB0bworCQkgKiBMUkFNIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuIE9uIGEgYmlnLWVuZGlhbiBzeXN0ZW0KKwkJICogdGhlIHNlY29uZCBhcmd1bWVudCBwcm9kdWNlcyBhIGJpZy1lbmRpYW4gdXNob3J0IHdoaWNoCisJCSAqIGlzICJ0cmFuc3BhcmVudGx5IiBieXRlLXN3YXBwZWQgYnkgb3V0cHcoKSBhbmQgd3JpdHRlbgorCQkgKiBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHRvIExSQU0uCisJCSAqLworCQlvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwKKwkJICAgICAgKCh1c2hvcnQpc19idWZmZXJbaSArIDFdIDw8IDgpIHwgc19idWZmZXJbaV0pOworCX0KKwlyZXR1cm47CiB9CiAKIC8qCkBAIC0xMjg3MywyNCArMTE2NTYsMTggQEAKICAqIFRoZSBzb3VyY2UgZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgaW4gbWVtb3J5CiAgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdGVuIHRvIExSQU0uCiAgKi8KLVNUQVRJQyB2b2lkCi1Bc2NNZW1EV29yZENvcHlQdHJUb0xyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgUG9ydEFkZHIgaW9wX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqc19idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR3b3JkcwotKQorc3RhdGljIHZvaWQKK0FzY01lbURXb3JkQ29weVB0clRvTHJhbShQb3J0QWRkciBpb3BfYmFzZSwKKwkJCSB1c2hvcnQgc19hZGRyLCB1Y2hhciAqc19idWZmZXIsIGludCBkd29yZHMpCiB7Ci0gICAgaW50ICAgICAgIGk7CisJaW50IGk7CiAKLSAgICBBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHNfYWRkcik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQgKiBkd29yZHM7IGkgKz0gNCkgewotICAgICAgICBvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwKLSAgICAgICAgICAgICgodXNob3J0KSBzX2J1ZmZlcltpICsgMV0gPDwgOCkgfCBzX2J1ZmZlcltpXSk7IC8qIExTVyAqLwotICAgICAgICBvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwKLSAgICAgICAgICAgICgodXNob3J0KSBzX2J1ZmZlcltpICsgM10gPDwgOCkgfCBzX2J1ZmZlcltpICsgMl0pOyAvKiBNU1cgKi8KLSAgICB9Ci0gICAgcmV0dXJuOworCUFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNCAqIGR3b3JkczsgaSArPSA0KSB7CisJCW91dHB3KGlvcF9iYXNlICsgSU9QX1JBTV9EQVRBLCAoKHVzaG9ydClzX2J1ZmZlcltpICsgMV0gPDwgOCkgfCBzX2J1ZmZlcltpXSk7CS8qIExTVyAqLworCQlvdXRwdyhpb3BfYmFzZSArIElPUF9SQU1fREFUQSwgKCh1c2hvcnQpc19idWZmZXJbaSArIDNdIDw8IDgpIHwgc19idWZmZXJbaSArIDJdKTsJLyogTVNXICovCisJfQorCXJldHVybjsKIH0KIAogLyoKQEAgLTEyODk5LDYxICsxMTY3Niw0NiBAQAogICogVGhlIHNvdXJjZSBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBpbiBMUkFNCiAgKiBhbmQgaXMgbWFpbnRhaW5lZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIHdoZW4gd3JpdHRlbiB0byBtZW1vcnkuCiAgKi8KLVNUQVRJQyB2b2lkCi1Bc2NNZW1Xb3JkQ29weVB0ckZyb21McmFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKmRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKLSkKK3N0YXRpYyB2b2lkCitBc2NNZW1Xb3JkQ29weVB0ckZyb21McmFtKFBvcnRBZGRyIGlvcF9iYXNlLAorCQkJICB1c2hvcnQgc19hZGRyLCB1Y2hhciAqZF9idWZmZXIsIGludCB3b3JkcykKIHsKLSAgICBpbnQgaTsKLSAgICB1c2hvcnQgd29yZDsKKwlpbnQgaTsKKwl1c2hvcnQgd29yZDsKIAotICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHdvcmRzOyBpICs9IDIpIHsKLSAgICAgICAgd29yZCA9IGlucHcoaW9wX2Jhc2UgKyBJT1BfUkFNX0RBVEEpOwotICAgICAgICBkX2J1ZmZlcltpXSA9IHdvcmQgJiAweGZmOwotICAgICAgICBkX2J1ZmZlcltpICsgMV0gPSAod29yZCA+PiA4KSAmIDB4ZmY7Ci0gICAgfQotICAgIHJldHVybjsKKwlBc2NTZXRDaGlwTHJhbUFkZHIoaW9wX2Jhc2UsIHNfYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDIgKiB3b3JkczsgaSArPSAyKSB7CisJCXdvcmQgPSBpbnB3KGlvcF9iYXNlICsgSU9QX1JBTV9EQVRBKTsKKwkJZF9idWZmZXJbaV0gPSB3b3JkICYgMHhmZjsKKwkJZF9idWZmZXJbaSArIDFdID0gKHdvcmQgPj4gOCkgJiAweGZmOworCX0KKwlyZXR1cm47CiB9CiAKLVNUQVRJQyBBU0NfRENOVAotQXNjTWVtU3VtTHJhbVdvcmQoCi0gICAgICAgICAgICAgICAgICAgICBQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgd29yZHMKLSkKK3N0YXRpYyBBU0NfRENOVCBBc2NNZW1TdW1McmFtV29yZChQb3J0QWRkciBpb3BfYmFzZSwgdXNob3J0IHNfYWRkciwgaW50IHdvcmRzKQogewotICAgIEFTQ19EQ05UICAgICAgICAgc3VtOwotICAgIGludCAgICAgICAgICAgICAgaTsKKwlBU0NfRENOVCBzdW07CisJaW50IGk7CiAKLSAgICBzdW0gPSAwTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKywgc19hZGRyICs9IDIpIHsKLSAgICAgICAgc3VtICs9IEFzY1JlYWRMcmFtV29yZChpb3BfYmFzZSwgc19hZGRyKTsKLSAgICB9Ci0gICAgcmV0dXJuIChzdW0pOworCXN1bSA9IDBMOworCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrLCBzX2FkZHIgKz0gMikgeworCQlzdW0gKz0gQXNjUmVhZExyYW1Xb3JkKGlvcF9iYXNlLCBzX2FkZHIpOworCX0KKwlyZXR1cm4gKHN1bSk7CiB9CiAKLVNUQVRJQyB2b2lkCi1Bc2NNZW1Xb3JkU2V0THJhbSgKLSAgICAgICAgICAgICAgICAgICAgIFBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgdXNob3J0IHNfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBzZXRfd3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgIGludCB3b3JkcwotKQorc3RhdGljIHZvaWQKK0FzY01lbVdvcmRTZXRMcmFtKFBvcnRBZGRyIGlvcF9iYXNlLCB1c2hvcnQgc19hZGRyLCB1c2hvcnQgc2V0X3d2YWwsIGludCB3b3JkcykKIHsKLSAgICBpbnQgICAgICAgICAgICAgaTsKKwlpbnQgaTsKIAotICAgIEFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotICAgICAgICBBc2NTZXRDaGlwTHJhbURhdGEoaW9wX2Jhc2UsIHNldF93dmFsKTsKLSAgICB9Ci0gICAgcmV0dXJuOworCUFzY1NldENoaXBMcmFtQWRkcihpb3BfYmFzZSwgc19hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworCQlBc2NTZXRDaGlwTHJhbURhdGEoaW9wX2Jhc2UsIHNldF93dmFsKTsKKwl9CisJcmV0dXJuOwogfQogCi0KIC8qCiAgKiAtLS0gQWR2IExpYnJhcnkgRnVuY3Rpb25zCiAgKi8KQEAgLTEyOTYxLDEwNzYgKzExNzIzLDIxMTIgQEAKIC8qIGFfbWNvZGUuaCAqLwogCiAvKiBNaWNyb2NvZGUgYnVmZmVyIGlzIGtlcHQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gZm9yIGVycm9yIHJlY292ZXJ5LiAqLwotU1RBVElDIHVuc2lnbmVkIGNoYXIgX2Fkdl9hc2MzNTUwX2J1ZltdID0gewotICAweDAwLCAgMHgwMCwgIDB4MDAsICAweGYyLCAgMHgwMCwgIDB4ZjAsICAweDAwLCAgMHgxNiwgIDB4MTgsICAweGU0LCAgMHgwMCwgIDB4ZmMsICAweDAxLCAgMHgwMCwgIDB4NDgsICAweGU0LAotICAweGJlLCAgMHgxOCwgIDB4MTgsICAweDgwLCAgMHgwMywgIDB4ZjYsICAweDAyLCAgMHgwMCwgIDB4MDAsICAweGZhLCAgMHhmZiwgIDB4ZmYsICAweDI4LCAgMHgwZSwgIDB4OWUsICAweGU3LAotICAweGZmLCAgMHgwMCwgIDB4ODIsICAweGU3LCAgMHgwMCwgIDB4ZWEsICAweDAwLCAgMHhmNiwgIDB4MDEsICAweGU2LCAgMHgwOSwgIDB4ZTcsICAweDU1LCAgMHhmMCwgIDB4MDEsICAweGY2LAotICAweDAxLCAgMHhmYSwgIDB4MDgsICAweDAwLCAgMHgwMywgIDB4MDAsICAweDA0LCAgMHgwMCwgIDB4MTgsICAweGY0LCAgMHgxMCwgIDB4MDAsICAweDAwLCAgMHhlYywgIDB4ODUsICAweGYwLAotICAweGJjLCAgMHgwMCwgIDB4ZDUsICAweGYwLCAgMHg4ZSwgIDB4MGMsICAweDM4LCAgMHg1NCwgIDB4MDAsICAweGU2LCAgMHgxZSwgIDB4ZjAsICAweDg2LCAgMHhmMCwgIDB4YjQsICAweDAwLAotICAweDk4LCAgMHg1NywgIDB4ZDAsICAweDAxLCAgMHgwYywgIDB4MWMsICAweDNlLCAgMHgxYywgIDB4MGMsICAweDAwLCAgMHhiYiwgIDB4MDAsICAweGFhLCAgMHgxOCwgIDB4MDIsICAweDgwLAotICAweDMyLCAgMHhmMCwgIDB4MDEsICAweGZjLCAgMHg4OCwgIDB4MGMsICAweGM2LCAgMHgxMiwgIDB4MDIsICAweDEzLCAgMHgxOCwgIDB4NDAsICAweDAwLCAgMHg1NywgIDB4MDEsICAweGVhLAotICAweDNjLCAgMHgwMCwgIDB4NmMsICAweDAxLCAgMHg2ZSwgIDB4MDEsICAweDA0LCAgMHgxMiwgIDB4M2UsICAweDU3LCAgMHgwMCwgIDB4ODAsICAweDAzLCAgMHhlNiwgIDB4YjYsICAweDAwLAotICAweGMwLCAgMHgwMCwgIDB4MDEsICAweDAxLCAgMHgzZSwgIDB4MDEsICAweGRhLCAgMHgwZiwgIDB4MjIsICAweDEwLCAgMHgwOCwgIDB4MTIsICAweDAyLCAgMHg0YSwgIDB4YjksICAweDU0LAotICAweDAzLCAgMHg1OCwgIDB4MWIsICAweDgwLCAgMHgzMCwgIDB4ZTQsICAweDRiLCAgMHhlNCwgIDB4MjAsICAweDAwLCAgMHgzMiwgIDB4MDAsICAweDNlLCAgMHgwMCwgIDB4ODAsICAweDAwLAotICAweDI0LCAgMHgwMSwgIDB4M2MsICAweDAxLCAgMHg2OCwgIDB4MDEsICAweDZhLCAgMHgwMSwgIDB4NzAsICAweDAxLCAgMHg3MiwgIDB4MDEsICAweDc0LCAgMHgwMSwgIDB4NzYsICAweDAxLAotICAweDc4LCAgMHgwMSwgIDB4NjIsICAweDBhLCAgMHg5MiwgIDB4MGMsICAweDJjLCAgMHgxMCwgIDB4MmUsICAweDEwLCAgMHgwNiwgIDB4MTMsICAweDRjLCAgMHgxYywgIDB4YmIsICAweDU1LAotICAweDNjLCAgMHg1NiwgIDB4MDQsICAweDgwLCAgMHg0YSwgIDB4ZTQsICAweDAyLCAgMHhlZSwgIDB4NWIsICAweGYwLCAgMHhiMSwgIDB4ZjAsICAweDAzLCAgMHhmNywgIDB4MDYsICAweGY3LAotICAweDAzLCAgMHhmYywgIDB4MGYsICAweDAwLCAgMHg0MCwgIDB4MDAsICAweGJlLCAgMHgwMCwgIDB4MDAsICAweDAxLCAgMHhiMCwgIDB4MDgsICAweDMwLCAgMHgxMywgIDB4NjQsICAweDE1LAotICAweDMyLCAgMHgxYywgIDB4MzgsICAweDFjLCAgMHg0ZSwgIDB4MWMsICAweDEwLCAgMHg0NCwgIDB4MDIsICAweDQ4LCAgMHgwMCwgIDB4NGMsICAweDA0LCAgMHhlYSwgIDB4NWQsICAweGYwLAotICAweDA0LCAgMHhmNiwgIDB4MDIsICAweGZjLCAgMHgwNSwgIDB4MDAsICAweDM0LCAgMHgwMCwgIDB4MzYsICAweDAwLCAgMHg5OCwgIDB4MDAsICAweGNjLCAgMHgwMCwgIDB4MjAsICAweDAxLAotICAweDRlLCAgMHgwMSwgIDB4NGUsICAweDBiLCAgMHgxZSwgIDB4MGUsICAweDBjLCAgMHgxMCwgIDB4MGEsICAweDEyLCAgMHgwNCwgIDB4MTMsICAweDQwLCAgMHgxMywgIDB4MzAsICAweDFjLAotICAweDAwLCAgMHg0ZSwgIDB4YmQsICAweDU2LCAgMHgwNiwgIDB4ODMsICAweDAwLCAgMHhkYywgIDB4MDUsICAweGYwLCAgMHgwOSwgIDB4ZjAsICAweDU5LCAgMHhmMCwgIDB4YTcsICAweGYwLAotICAweGI4LCAgMHhmMCwgIDB4MGUsICAweGY3LCAgMHgwNiwgIDB4MDAsICAweDE5LCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHg5YiwgIDB4MDAsICAweGE0LCAgMHgwMCwgIDB4YjUsICAweDAwLAotICAweGJhLCAgMHgwMCwgIDB4ZDAsICAweDAwLCAgMHhlMSwgIDB4MDAsICAweGU3LCAgMHgwMCwgIDB4ZGUsICAweDAzLCAgMHg1NiwgIDB4MGEsICAweDE0LCAgMHgwZSwgIDB4MDIsICAweDEwLAotICAweDA0LCAgMHgxMCwgIDB4MGEsICAweDEwLCAgMHgzNiwgIDB4MTAsICAweDBhLCAgMHgxMywgIDB4MTIsICAweDEzLCAgMHg1MiwgIDB4MTMsICAweDEwLCAgMHgxNSwgIDB4MTQsICAweDE1LAotICAweGFjLCAgMHgxNiwgIDB4MjAsICAweDFjLCAgMHgzNCwgIDB4MWMsICAweDM2LCAgMHgxYywgIDB4MDgsICAweDQ0LCAgMHgzOCwgIDB4NDQsICAweDkxLCAgMHg0NCwgIDB4MGEsICAweDQ1LAotICAweDQ4LCAgMHg0NiwgIDB4MDEsICAweDQ4LCAgMHg2OCwgIDB4NTQsICAweDgzLCAgMHg1NSwgIDB4YjAsICAweDU3LCAgMHgwMSwgIDB4NTgsICAweDgzLCAgMHg1OSwgIDB4MDUsICAweGU2LAotICAweDBiLCAgMHhmMCwgIDB4MGMsICAweGYwLCAgMHg1YywgIDB4ZjAsICAweDRiLCAgMHhmNCwgIDB4MDQsICAweGY4LCAgMHgwNSwgIDB4ZjgsICAweDAyLCAgMHhmYSwgIDB4MDMsICAweGZhLAotICAweDA0LCAgMHhmYywgIDB4MDUsICAweGZjLCAgMHgwNywgIDB4MDAsICAweDBhLCAgMHgwMCwgIDB4MGQsICAweDAwLCAgMHgxYywgIDB4MDAsICAweDllLCAgMHgwMCwgIDB4YTgsICAweDAwLAotICAweGFhLCAgMHgwMCwgIDB4YjksICAweDAwLCAgMHhlMCwgIDB4MDAsICAweDIyLCAgMHgwMSwgIDB4MjYsICAweDAxLCAgMHg3OSwgIDB4MDEsICAweDdhLCAgMHgwMSwgIDB4YzAsICAweDAxLAotICAweGMyLCAgMHgwMSwgIDB4N2MsICAweDAyLCAgMHg1YSwgIDB4MDMsICAweGVhLCAgMHgwNCwgIDB4ZTgsICAweDA3LCAgMHg2OCwgIDB4MDgsICAweDY5LCAgMHgwOCwgIDB4YmEsICAweDA4LAotICAweGU5LCAgMHgwOSwgIDB4MDYsICAweDBiLCAgMHgzYSwgIDB4MGUsICAweDAwLCAgMHgxMCwgIDB4MWEsICAweDEwLCAgMHhlZCwgIDB4MTAsICAweGYxLCAgMHgxMCwgIDB4MDYsICAweDEyLAotICAweDBjLCAgMHgxMywgIDB4MTYsICAweDEzLCAgMHgxZSwgIDB4MTMsICAweDgyLCAgMHgxMywgIDB4NDIsICAweDE0LCAgMHhkNiwgIDB4MTQsICAweDhhLCAgMHgxNSwgIDB4YzYsICAweDE3LAotICAweGQyLCAgMHgxNywgIDB4NmIsICAweDE4LCAgMHgxMiwgIDB4MWMsICAweDQ2LCAgMHgxYywgIDB4OWMsICAweDMyLCAgMHgwMCwgIDB4NDAsICAweDBlLCAgMHg0NywgIDB4NDgsICAweDQ3LAotICAweDQxLCAgMHg0OCwgIDB4ODksICAweDQ4LCAgMHg4MCwgIDB4NGMsICAweDAwLCAgMHg1NCwgIDB4NDQsICAweDU1LCAgMHhlNSwgIDB4NTUsICAweDE0LCAgMHg1NiwgIDB4NzcsICAweDU3LAotICAweGJmLCAgMHg1NywgIDB4NDAsICAweDVjLCAgMHgwNiwgIDB4ODAsICAweDA4LCAgMHg5MCwgIDB4MDMsICAweGExLCAgMHhmZSwgIDB4OWMsICAweGYwLCAgMHgyOSwgIDB4MDIsICAweGZlLAotICAweGI4LCAgMHgwYywgIDB4ZmYsICAweDEwLCAgMHgwMCwgIDB4MDAsICAweGQwLCAgMHhmZSwgIDB4Y2MsICAweDE4LCAgMHgwMCwgIDB4Y2YsICAweGZlLCAgMHg4MCwgIDB4MDEsICAweGZmLAotICAweDAzLCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg5MywgIDB4MTUsICAweGZlLCAgMHgwZiwgIDB4MDUsICAweGZmLCAgMHgzOCwgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NTcsICAweDI0LAotICAweDAwLCAgMHhmZSwgIDB4NDgsICAweDAwLCAgMHg0ZiwgIDB4ZmYsICAweDA0LCAgMHgwMCwgIDB4MDAsICAweDEwLCAgMHhmZiwgIDB4MDksICAweDAwLCAgMHgwMCwgIDB4ZmYsICAweDA4LAotICAweDAxLCAgMHgwMSwgIDB4ZmYsICAweDA4LCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHgyNywgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MTAsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDBmLAotICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDc4LCAgMHg1NiwgIDB4ZmUsICAweDM0LCAgMHgxMiwgIDB4ZmYsICAweDIxLCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGNmLAotICAweDJhLCAgMHg2NywgIDB4MGIsICAweDAxLCAgMHhmZSwgIDB4Y2UsICAweDBlLCAgMHhmZSwgIDB4MDQsICAweGY3LCAgMHhjZiwgIDB4NjcsICAweDBiLCAgMHgzYywgIDB4MmEsICAweGZlLAotICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDAyLCAgMHgwMiwgIDB4ZmUsICAweDIwLCAgMHhmMCwgIDB4OWMsICAweGZlLCAgMHg5MSwgIDB4ZjAsICAweGZlLCAgMHhmMCwgIDB4MDEsICAweGZlLAotICAweDkwLCAgMHhmMCwgIDB4ZmUsICAweGYwLCAgMHgwMSwgIDB4ZmUsICAweDhmLCAgMHhmMCwgIDB4OWMsICAweDA1LCAgMHg1MSwgIDB4M2IsICAweDAyLCAgMHhmZSwgIDB4ZDQsICAweDBjLAotICAweDAxLCAgMHhmZSwgIDB4NDQsICAweDBkLCAgMHhmZSwgIDB4ZGQsICAweDEyLCAgMHhmZSwgIDB4ZmMsICAweDEwLCAgMHhmZSwgIDB4MjgsICAweDFjLCAgMHgwNSwgIDB4ZmUsICAweGE2LAotICAweDAwLCAgMHhmZSwgIDB4ZDMsICAweDEyLCAgMHg0NywgIDB4MTgsICAweGZlLCAgMHhhNiwgIDB4MDAsICAweGI1LCAgMHhmZSwgIDB4NDgsICAweGYwLCAgMHhmZSwgIDB4ODYsICAweDAyLAotICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHhhMCwgIDB4MDIsICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHhiZSwgIDB4MDIsICAweGZlLCAgMHg0NiwgIDB4ZjAsICAweGZlLAotICAweDUwLCAgMHgwMiwgIDB4ZmUsICAweDQ3LCAgMHhmMCwgIDB4ZmUsICAweDU2LCAgMHgwMiwgIDB4ZmUsICAweDQzLCAgMHhmMCwgIDB4ZmUsICAweDQ0LCAgMHgwMiwgIDB4ZmUsICAweDQ0LAotICAweGYwLCAgMHhmZSwgIDB4NDgsICAweDAyLCAgMHhmZSwgIDB4NDUsICAweGYwLCAgMHhmZSwgIDB4NGMsICAweDAyLCAgMHgxNywgIDB4MGIsICAweGEwLCAgMHgxNywgIDB4MDYsICAweDE4LAotICAweDk2LCAgMHgwMiwgIDB4MjksICAweGZlLCAgMHgwMCwgIDB4MWMsICAweGRlLCAgMHhmZSwgIDB4MDIsICAweDFjLCAgMHhkZCwgIDB4ZmUsICAweDFlLCAgMHgxYywgIDB4ZmUsICAweGU5LAotICAweDEwLCAgMHgwMSwgIDB4ZmUsICAweDIwLCAgMHgxNywgIDB4ZmUsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDA2LCAgMHhmYywgIDB4YzcsICAweDBhLCAgMHg2YiwgIDB4MDEsICAweDllLAotICAweDAyLCAgMHgyOSwgIDB4MTQsICAweDRkLCAgMHgzNywgIDB4OTcsICAweDAxLCAgMHhmZSwgIDB4NjQsICAweDBmLCAgMHgwYSwgIDB4NmIsICAweDAxLCAgMHg4MiwgIDB4ZmUsICAweGJkLAotICAweDEwLCAgMHgwYSwgIDB4NmIsICAweDAxLCAgMHg4MiwgIDB4ZmUsICAweGFkLCAgMHgxMCwgIDB4ZmUsICAweDE2LCAgMHgxYywgIDB4ZmUsICAweDU4LCAgMHgxYywgIDB4MTcsICAweDA2LAotICAweDE4LCAgMHg5NiwgIDB4MmEsICAweDI1LCAgMHgyOSwgIDB4ZmUsICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDAyLCAgMHgwMiwgIDB4MjEsICAweGZlLCAgMHg5NCwgIDB4MDIsICAweGZlLAotICAweDVhLCAgMHgxYywgIDB4ZWEsICAweGZlLCAgMHgxNCwgIDB4MWMsICAweDE0LCAgMHhmZSwgIDB4MzAsICAweDAwLCAgMHgzNywgIDB4OTcsICAweDAxLCAgMHhmZSwgIDB4NTQsICAweDBmLAotICAweDE3LCAgMHgwNiwgIDB4MTgsICAweDk2LCAgMHgwMiwgIDB4ZDAsICAweDFlLCAgMHgyMCwgIDB4MDcsICAweDEwLCAgMHgzNCwgIDB4ZmUsICAweDY5LCAgMHgxMCwgIDB4MTcsICAweDA2LAotICAweDE4LCAgMHg5NiwgIDB4ZmUsICAweDA0LCAgMHhlYywgIDB4MjAsICAweDQ2LCAgMHgzZCwgIDB4MTIsICAweDIwLCAgMHhmZSwgIDB4MDUsICAweGY2LCAgMHhjNywgIDB4MDEsICAweGZlLAotICAweDUyLCAgMHgxNiwgIDB4MDksICAweDRhLCAgMHg0YywgIDB4MzUsICAweDExLCAgMHgyZCwgIDB4M2MsICAweDhhLCAgMHgwMSwgIDB4ZTYsICAweDAyLCAgMHgyOSwgIDB4MGEsICAweDQwLAotICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDAwLCAgMHg1ZCwgIDB4MDEsICAweDZmLCAgMHhmZSwgIDB4MTgsICAweDEwLCAgMHhmZSwgIDB4NDEsICAweDU4LCAgMHgwYSwgIDB4OTksICAweDAxLAotICAweDBlLCAgMHhmZSwgIDB4YzgsICAweDU0LCAgMHg2NCwgIDB4ZmUsICAweDBjLCAgMHgwMywgIDB4MDEsICAweGU2LCAgMHgwMiwgIDB4MjksICAweDJhLCAgMHg0NiwgIDB4ZmUsICAweDAyLAotICAweGU4LCAgMHgyNywgIDB4ZjgsICAweGZlLCAgMHg5ZSwgIDB4NDMsICAweGY3LCAgMHhmZSwgIDB4MjcsICAweGYwLCAgMHhmZSwgIDB4ZGMsICAweDAxLCAgMHhmZSwgIDB4MDcsICAweDRiLAotICAweGZlLCAgMHgyMCwgIDB4ZjAsICAweDljLCAgMHhmZSwgIDB4NDAsICAweDFjLCAgMHgyNSwgIDB4ZDIsICAweGZlLCAgMHgyNiwgIDB4ZjAsICAweGZlLCAgMHg1NiwgIDB4MDMsICAweGZlLAotICAweGEwLCAgMHhmMCwgIDB4ZmUsICAweDQ0LCAgMHgwMywgIDB4ZmUsICAweDExLCAgMHhmMCwgIDB4OWMsICAweGZlLCAgMHhlZiwgIDB4MTAsICAweGZlLCAgMHg5ZiwgIDB4ZjAsICAweGZlLAotICAweDY0LCAgMHgwMywgIDB4ZWIsICAweDBmLCAgMHhmZSwgIDB4MTEsICAweDAwLCAgMHgwMiwgIDB4NWEsICAweDJhLCAgMHhmZSwgIDB4NDgsICAweDFjLCAgMHhlYiwgIDB4MDksICAweDA0LAotICAweDFkLCAgMHhmZSwgIDB4MTgsICAweDEzLCAgMHgyMywgIDB4MWUsICAweDk4LCAgMHhhYywgIDB4MTIsICAweDk4LCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4YWMsICAweDc1LAotICAweDAxLCAgMHhmZSwgIDB4YmMsICAweDE1LCAgMHgxMSwgIDB4Y2EsICAweDI1LCAgMHhkMiwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4ZDIsICAweGZlLCAgMHg4MiwgIDB4ZjAsICAweGZlLAotICAweDkyLCAgMHgwMywgIDB4ZWMsICAweDExLCAgMHhmZSwgIDB4ZTQsICAweDAwLCAgMHg2NSwgIDB4ZmUsICAweGE0LCAgMHgwMywgIDB4MjUsICAweDMyLCAgMHgxZiwgIDB4ZmUsICAweGI0LAotICAweDAzLCAgMHgwMSwgIDB4NDMsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHhjNCwgIDB4MDMsICAweDhkLCAgMHg4MSwgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsICAweDdhLAotICAweDA2LCAgMHgwMiwgIDB4MjIsICAweDA1LCAgMHg2YiwgIDB4MjgsICAweDE2LCAgMHhmZSwgIDB4ZjYsICAweDA0LCAgMHgxNCwgIDB4MmMsICAweDAxLCAgMHgzMywgIDB4OGYsICAweGZlLAotICAweDY2LCAgMHgwMiwgIDB4MDIsICAweGQxLCAgMHhlYiwgIDB4MmEsICAweDY3LCAgMHgxYSwgIDB4ZmUsICAweDY3LCAgMHgxYiwgIDB4ZjgsICAweGY3LCAgMHhmZSwgIDB4NDgsICAweDFjLAotICAweDcwLCAgMHgwMSwgIDB4NmUsICAweDg3LCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDAwLCAgMHgxNiwgIDB4ZDMsICAweDBhLCAgMHhjYSwgIDB4MDEsICAweDBlLAotICAweDc0LCAgMHg2MCwgIDB4NTksICAweDc2LCAgMHgyNywgIDB4MDUsICAweDZiLCAgMHgyOCwgIDB4ZmUsICAweDEwLCAgMHgxMiwgIDB4MTQsICAweDJjLCAgMHgwMSwgIDB4MzMsICAweDhmLAotICAweGZlLCAgMHg2NiwgIDB4MDIsICAweDAyLCAgMHhkMSwgIDB4YmMsICAweDdkLCAgMHhiZCwgIDB4N2YsICAweDI1LCAgMHgyMiwgIDB4NjUsICAweGZlLCAgMHgzYywgIDB4MDQsICAweDFmLAotICAweGZlLCAgMHgzOCwgIDB4MDQsICAweDY4LCAgMHhmZSwgIDB4YTAsICAweDAwLCAgMHhmZSwgIDB4OWIsICAweDU3LCAgMHhmZSwgIDB4NGUsICAweDEyLCAgMHgyYiwgIDB4ZmYsICAweDAyLAotICAweDAwLCAgMHgxMCwgIDB4MDEsICAweDA4LCAgMHgxZiwgIDB4ZmUsICAweGUwLCAgMHgwNCwgIDB4MmIsICAweDAxLCAgMHgwOCwgIDB4MWYsICAweDIyLCAgMHgzMCwgIDB4MmUsICAweGQ1LAotICAweGZlLCAgMHg0YywgIDB4NDQsICAweGZlLCAgMHg0YywgIDB4MTIsICAweDYwLCAgMHhmZSwgIDB4NDQsICAweDQ4LCAgMHgxMywgIDB4MmMsICAweGZlLCAgMHg0YywgIDB4NTQsICAweDY0LAotICAweGQzLCAgMHg0NiwgIDB4NzYsICAweDI3LCAgMHhmYSwgIDB4ZWYsICAweGZlLCAgMHg2MiwgIDB4MTMsICAweDA5LCAgMHgwNCwgIDB4MWQsICAweGZlLCAgMHgyYSwgIDB4MTMsICAweDJmLAotICAweDA3LCAgMHg3ZSwgIDB4YTUsICAweGZlLCAgMHgyMCwgIDB4MTAsICAweDEzLCAgMHgyYywgIDB4ZmUsICAweDRjLCAgMHg1NCwgIDB4NjQsICAweGQzLCAgMHhmYSwgIDB4ZWYsICAweDg2LAotICAweDA5LCAgMHgwNCwgIDB4MWQsICAweGZlLCAgMHgwOCwgIDB4MTMsICAweDJmLCAgMHgwNywgIDB4N2UsICAweDZlLCAgMHgwOSwgIDB4MDQsICAweDFkLCAgMHhmZSwgIDB4MWMsICAweDEyLAotICAweDE0LCAgMHg5MiwgIDB4MDksICAweDA0LCAgMHgwNiwgIDB4M2IsICAweDE0LCAgMHhjNCwgIDB4MDEsICAweDMzLCAgMHg4ZiwgIDB4ZmUsICAweDcwLCAgMHgwYywgIDB4MDIsICAweDIyLAotICAweDJiLCAgMHgxMSwgIDB4ZmUsICAweGU2LCAgMHgwMCwgIDB4ZmUsICAweDFjLCAgMHg5MCwgIDB4ZjksICAweDAzLCAgMHgxNCwgIDB4OTIsICAweDAxLCAgMHgzMywgIDB4MDIsICAweDI5LAotICAweGZlLCAgMHg0MiwgIDB4NWIsICAweDY3LCAgMHgxYSwgIDB4ZmUsICAweDQ2LCAgMHg1OSwgIDB4ZjgsICAweGY3LCAgMHhmZSwgIDB4ODcsICAweDgwLCAgMHhmZSwgIDB4MzEsICAweGU0LAotICAweDRmLCAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwgIDB4NzgsICAweDEzLCAgMHhmZSwgIDB4MjAsICAweDgwLCAgMHgwNywgIDB4MWEsICAweGZlLCAgMHg3MCwgIDB4MTIsICAweDQ5LAotICAweDA0LCAgMHgwNiwgIDB4ZmUsICAweDYwLCAgMHgxMywgIDB4MDUsICAweGZlLCAgMHhhMiwgIDB4MDAsICAweDI4LCAgMHgxNiwgIDB4ZmUsICAweDgwLCAgMHgwNSwgIDB4ZmUsICAweDMxLAotICAweGU0LCAgMHg2YSwgIDB4NDksICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDRhLCAgMHgxMywgIDB4MDUsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweDI4LCAgMHhmZSwgIDB4NDIsICAweDEyLAotICAweDVlLCAgMHgwMSwgIDB4MDgsICAweDI1LCAgMHgzMiwgIDB4ZjEsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGZlLCAgMHg5OCwgIDB4MDUsICAweDExLCAgMHhmZSwgIDB4ZTMsICAweDAwLAotICAweDIzLCAgMHg0OSwgIDB4ZmUsICAweDRhLCAgMHhmMCwgIDB4ZmUsICAweDZhLCAgMHgwNSwgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweDY0LCAgMHgwNSwgIDB4ODMsICAweDI0LAotICAweGZlLCAgMHgyMSwgIDB4MDAsICAweGExLCAgMHgyNCwgIDB4ZmUsICAweDIyLCAgMHgwMCwgIDB4YTAsICAweDI0LCAgMHg0YywgIDB4ZmUsICAweDA5LCAgMHg0OCwgIDB4MDEsICAweDA4LAotICAweDI2LCAgMHhmZSwgIDB4OTgsICAweDA1LCAgMHhmZSwgIDB4ZTIsICAweDA4LCAgMHg0OSwgIDB4MDQsICAweGM1LCAgMHgzYiwgIDB4MDEsICAweDg2LCAgMHgyNCwgIDB4MDYsICAweDEyLAotICAweGNjLCAgMHgzNywgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4MDksICAweDA0LCAgMHgxZCwgIDB4ZmUsICAweDIyLCAgMHgxMiwgIDB4NDcsICAweDAxLCAgMHhhNywgIDB4MTQsICAweDkyLAotICAweDA5LCAgMHgwNCwgIDB4MDYsICAweDNiLCAgMHgxNCwgIDB4YzQsICAweDAxLCAgMHgzMywgIDB4OGYsICAweGZlLCAgMHg3MCwgIDB4MGMsICAweDAyLCAgMHgyMiwgIDB4MDUsICAweGZlLAotICAweDljLCAgMHgwMCwgIDB4MjgsICAweGZlLCAgMHgzZSwgIDB4MTIsICAweDA1LCAgMHg1MCwgIDB4MjgsICAweGZlLCAgMHgzNiwgIDB4MTMsICAweDQ3LCAgMHgwMSwgIDB4YTcsICAweDI2LAotICAweGZlLCAgMHgwOCwgIDB4MDYsICAweDBhLCAgMHgwNiwgIDB4NDksICAweDA0LCAgMHgxOSwgIDB4ZmUsICAweDAyLCAgMHgxMiwgIDB4NWYsICAweDAxLCAgMHhmZSwgIDB4YWEsICAweDE0LAotICAweDFmLCAgMHhmZSwgIDB4ZmUsICAweDA1LCAgMHgxMSwgIDB4OWEsICAweDAxLCAgMHg0MywgIDB4MTEsICAweGZlLCAgMHhlNSwgIDB4MDAsICAweDA1LCAgMHg1MCwgIDB4YjQsICAweDBjLAotICAweDUwLCAgMHgwNSwgIDB4YzYsICAweDI4LCAgMHhmZSwgIDB4NjIsICAweDEyLCAgMHgwNSwgIDB4M2YsICAweDI4LCAgMHhmZSwgIDB4NWEsICAweDEzLCAgMHgwMSwgIDB4ZmUsICAweDE0LAotICAweDE4LCAgMHgwMSwgIDB4ZmUsICAweDY2LCAgMHgxOCwgIDB4ZmUsICAweDQzLCAgMHg0OCwgIDB4YjcsICAweDE5LCAgMHgxMywgIDB4NmMsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LAotICAweDQ4LCAgMHg4YiwgIDB4MWMsICAweDNkLCAgMHg4NSwgIDB4YjcsICAweDY5LCAgMHg0NywgIDB4MDEsICAweGE3LCAgMHgyNiwgIDB4ZmUsICAweDcyLCAgMHgwNiwgIDB4NDksICAweDA0LAotICAweDFiLCAgMHhkZiwgIDB4ODksICAweDBhLCAgMHg0ZCwgIDB4MDEsICAweGZlLCAgMHhkOCwgIDB4MTQsICAweDFmLCAgMHhmZSwgIDB4NjgsICAweDA2LCAgMHgxMSwgIDB4OWEsICAweDAxLAotICAweDQzLCAgMHgxMSwgIDB4ZmUsICAweGU1LCAgMHgwMCwgIDB4MDUsICAweDNmLCAgMHhiNCwgIDB4MGMsICAweDNmLCAgMHgxNywgIDB4MDYsICAweDAxLCAgMHhhNywgIDB4ZWMsICAweDcyLAotICAweDcwLCAgMHgwMSwgIDB4NmUsICAweDg3LCAgMHgxMSwgIDB4ZmUsICAweGUyLCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgyNSwgIDB4MzIsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLAotICAweGE2LCAgMHgwNiwgIDB4OGMsICAweGZlLCAgMHg1YywgIDB4MDcsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHg2NCwgIDB4MDcsICAweDhkLCAgMHg4MSwgIDB4MDIsICAweDIyLAotICAweDA5LCAgMHgwNCwgIDB4MGIsICAweGZlLCAgMHgyZSwgIDB4MTIsICAweDE1LCAgMHgxYSwgIDB4MDEsICAweDA4LCAgMHgxNSwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDAwLAotICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweGZlLCAgMHg5OSwgIDB4YTQsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMiwgIDB4ZmUsICAweDMyLAotICAweDA4LCAgMHg2MSwgIDB4MDQsICAweDFiLCAgMHhmZSwgIDB4MzgsICAweDEyLCAgMHgwOSwgIDB4MDQsICAweDFiLCAgMHg2ZSwgIDB4MTUsICAweGZlLCAgMHgxYiwgIDB4MDAsICAweDAxLAotICAweDA4LCAgMHgxNSwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTUsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE1LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgxNSwgIDB4MDYsICAweDAxLAotICAweDA4LCAgMHgxNSwgIDB4MDAsICAweDAyLCAgMHhkOSwgIDB4NjYsICAweDRjLCAgMHhmZSwgIDB4M2EsICAweDU1LCAgMHg1ZiwgIDB4ZmUsICAweDlhLCAgMHg4MSwgIDB4NGIsICAweDFkLAotICAweGJhLCAgMHhmZSwgIDB4MzIsICAweDA3LCAgMHgwYSwgIDB4MWQsICAweGZlLCAgMHgwOSwgIDB4NmYsICAweGFmLCAgMHhmZSwgIDB4Y2EsICAweDQ1LCAgMHhmZSwgIDB4MzIsICAweDEyLAotICAweDYyLCAgMHgyYywgIDB4ODUsICAweDY2LCAgMHg3YiwgIDB4MDEsICAweDA4LCAgMHgyNSwgIDB4MzIsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHgzMiwgIDB4MDcsICAweDhkLAotICAweDgxLCAgMHg4YywgIDB4ZmUsICAweDVjLCAgMHgwNywgIDB4MDIsICAweDIyLCAgMHgwMSwgIDB4NDMsICAweDAyLCAgMHhmZSwgIDB4OGEsICAweDA2LCAgMHgxNSwgIDB4MTksICAweDAyLAotICAweGZlLCAgMHg4YSwgIDB4MDYsICAweGZlLCAgMHg5YywgIDB4ZjcsICAweGQ0LCAgMHhmZSwgIDB4MmMsICAweDkwLCAgMHhmZSwgIDB4YWUsICAweDkwLCAgMHg3NywgIDB4ZmUsICAweGNhLAotICAweDA3LCAgMHgwYywgIDB4NTQsICAweDE4LCAgMHg1NSwgIDB4MDksICAweDRhLCAgMHg2YSwgIDB4MzUsICAweDFlLCAgMHgyMCwgIDB4MDcsICAweDEwLCAgMHhmZSwgIDB4MGUsICAweDEyLAotICAweDc0LCAgMHhmZSwgIDB4ODAsICAweDgwLCAgMHgzNywgIDB4MjAsICAweDYzLCAgMHgyNywgIDB4ZmUsICAweDA2LCAgMHgxMCwgIDB4ZmUsICAweDgzLCAgMHhlNywgIDB4YzQsICAweGExLAotICAweGZlLCAgMHgwMywgIDB4NDAsICAweDA5LCAgMHg0YSwgIDB4NGYsICAweDM1LCAgMHgwMSwgIDB4YTgsICAweGFkLCAgMHhmZSwgIDB4MWYsICAweDQwLCAgMHgxMiwgIDB4NTgsICAweDAxLAotICAweGE1LCAgMHhmZSwgIDB4MDgsICAweDUwLCAgMHhmZSwgIDB4OGEsICAweDUwLCAgMHhmZSwgIDB4NDQsICAweDUxLCAgMHhmZSwgIDB4YzYsICAweDUxLCAgMHg4MywgIDB4ZmIsICAweGZlLAotICAweDhhLCAgMHg5MCwgIDB4MGMsICAweDUyLCAgMHgxOCwgIDB4NTMsICAweGZlLCAgMHgwYywgIDB4OTAsICAweGZlLCAgMHg4ZSwgIDB4OTAsICAweGZlLCAgMHg0MCwgIDB4NTAsICAweGZlLAotICAweGMyLCAgMHg1MCwgIDB4MGMsICAweDM5LCAgMHgxOCwgIDB4M2EsICAweGZlLCAgMHg0YSwgIDB4MTAsICAweDA5LCAgMHgwNCwgIDB4NmEsICAweGZlLCAgMHgyYSwgIDB4MTIsICAweGZlLAotICAweDJjLCAgMHg5MCwgIDB4ZmUsICAweGFlLCAgMHg5MCwgIDB4MGMsICAweDU0LCAgMHgxOCwgIDB4NTUsICAweDA5LCAgMHgwNCwgIDB4NGYsICAweDg1LCAgMHgwMSwgIDB4YTgsICAweGZlLAotICAweDFmLCAgMHg4MCwgIDB4MTIsICAweDU4LCAgMHhmZSwgIDB4NDQsICAweDkwLCAgMHhmZSwgIDB4YzYsICAweDkwLCAgMHgwYywgIDB4NTYsICAweDE4LCAgMHg1NywgIDB4ZmIsICAweGZlLAotICAweDhhLCAgMHg5MCwgIDB4MGMsICAweDUyLCAgMHgxOCwgIDB4NTMsICAweGZlLCAgMHg0MCwgIDB4OTAsICAweGZlLCAgMHhjMiwgIDB4OTAsICAweDBjLCAgMHgzOSwgIDB4MTgsICAweDNhLAotICAweDBjLCAgMHgzOCwgIDB4MTgsICAweDRlLCAgMHgwOSwgIDB4NGEsICAweDE5LCAgMHgzNSwgIDB4MmEsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHg2NSwgIDB4ZmUsICAweDQ4LAotICAweDA4LCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4NWMsICAweDA4LCAgMHhiMSwgIDB4MTYsICAweDMyLCAgMHgyYSwgIDB4NzMsICAweGRkLCAgMHhiOCwgIDB4ZmUsICAweDgwLAotICAweDA4LCAgMHhiOSwgIDB4ZmUsICAweDllLCAgMHgwOCwgIDB4OGMsICAweGZlLCAgMHg3NCwgIDB4MDgsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHg3YSwgIDB4MDgsICAweDhkLAotICAweDgxLCAgMHgwMiwgIDB4MjIsICAweDAxLCAgMHg0MywgIDB4ZmUsICAweGM5LCAgMHgxMCwgIDB4MTUsICAweDE5LCAgMHhmZSwgIDB4YzksICAweDEwLCAgMHg2MSwgIDB4MDQsICAweDA2LAotICAweGZlLCAgMHgxMCwgIDB4MTIsICAweDYxLCAgMHgwNCwgIDB4MGIsICAweDQ1LCAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwgIDB4NjgsICAweDEyLCAgMHhmZSwgIDB4MmUsICAweDFjLAotICAweDAyLCAgMHhmZSwgIDB4MjQsICAweDBhLCAgMHg2MSwgIDB4MDQsICAweDA2LCAgMHg0NSwgIDB4NjEsICAweDA0LCAgMHgwYiwgIDB4ZmUsICAweDUyLCAgMHgxMiwgIDB4ZmUsICAweDJjLAotICAweDFjLCAgMHhmZSwgIDB4YWEsICAweGYwLCAgMHhmZSwgIDB4MWUsICAweDA5LCAgMHhmZSwgIDB4YWMsICAweGYwLCAgMHhmZSwgIDB4YmUsICAweDA4LCAgMHhmZSwgIDB4OGEsICAweDEwLAotICAweGFhLCAgMHhmZSwgIDB4ZjMsICAweDEwLCAgMHhmZSwgIDB4YWQsICAweGYwLCAgMHhmZSwgIDB4Y2EsICAweDA4LCAgMHgwMiwgIDB4ZmUsICAweDI0LCAgMHgwYSwgIDB4YWIsICAweGZlLAotICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDJiLCAgMHhmMCwgIDB4OWQsICAweGU5LCAgMHgxYywgIDB4ZmUsICAweDAwLCAgMHhmZSwgIDB4ZmUsICAweDFjLCAgMHgxMiwgIDB4YjUsICAweGZlLAotICAweGQyLCAgMHhmMCwgIDB4OWQsICAweGZlLCAgMHg3NiwgIDB4MTgsICAweDFjLCAgMHgxYSwgIDB4MTYsICAweDlkLCAgMHgwNSwgIDB4Y2IsICAweDFjLCAgMHgwNiwgIDB4MTYsICAweDlkLAotICAweGI4LCAgMHg2ZCwgIDB4YjksICAweDZkLCAgMHhhYSwgIDB4YWIsICAweGZlLCAgMHhiMSwgIDB4MTAsICAweDcwLCAgMHg1ZSwgIDB4MmIsICAweDE0LCAgMHg5MiwgIDB4MDEsICAweDMzLAotICAweDBmLCAgMHhmZSwgIDB4MzUsICAweDAwLCAgMHhmZSwgIDB4MDEsICAweGYwLCAgMHg1YSwgIDB4MGYsICAweDdjLCAgMHgwMiwgIDB4NWEsICAweGZlLCAgMHg3NCwgIDB4MTgsICAweDFjLAotICAweGZlLCAgMHgwMCwgIDB4ZjgsICAweDE2LCAgMHg2ZCwgIDB4NjcsICAweDFiLCAgMHgwMSwgIDB4ZmUsICAweDQ0LCAgMHgwZCwgIDB4M2IsICAweDAxLCAgMHhlNiwgIDB4MWUsICAweDI3LAotICAweDc0LCAgMHg2NywgIDB4MWEsICAweDAyLCAgMHg2ZCwgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4MjEsICAweGZlLCAgMHgwNiwgIDB4MGEsICAweDA5LCAgMHgwNCwgIDB4NmEsICAweGZlLAotICAweDgyLCAgMHgxMiwgIDB4MDksICAweDA0LCAgMHgxOSwgIDB4ZmUsICAweDY2LCAgMHgxMywgIDB4MWUsICAweDU4LCAgMHhhYywgIDB4ZmMsICAweGZlLCAgMHg4MywgIDB4ODAsICAweGZlLAotICAweGM4LCAgMHg0NCwgIDB4ZmUsICAweDJlLCAgMHgxMywgIDB4ZmUsICAweDA0LCAgMHg5MSwgIDB4ZmUsICAweDg2LCAgMHg5MSwgIDB4NjMsICAweDI3LCAgMHhmZSwgIDB4NDAsICAweDU5LAotICAweGZlLCAgMHhjMSwgIDB4NTksICAweDc3LCAgMHhkNywgIDB4MDUsICAweDU0LCAgMHgzMSwgIDB4NTUsICAweDBjLCAgMHg3YiwgIDB4MTgsICAweDdjLCAgMHhiZSwgIDB4NTQsICAweGJmLAotICAweDU1LCAgMHgwMSwgIDB4YTgsICAweGFkLCAgMHg2MywgIDB4MjcsICAweDEyLCAgMHg1OCwgIDB4YzAsICAweDM4LCAgMHhjMSwgIDB4NGUsICAweDc5LCAgMHg1NiwgIDB4NjgsICAweDU3LAotICAweGY0LCAgMHhmNSwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4MzgsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDRlLCAgMHgwMSwgIDB4YTUsICAweGEyLCAgMHgyMywgIDB4MGMsICAweDdiLAotICAweDBjLCAgMHg3YywgIDB4NzksICAweDU2LCAgMHg2OCwgIDB4NTcsICAweGZlLCAgMHgxMiwgIDB4MTAsICAweDA5LCAgMHgwNCwgIDB4MTksICAweDE2LCAgMHhkNywgIDB4NzksICAweDM5LAotICAweDY4LCAgMHgzYSwgIDB4MDksICAweDA0LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHgzNSwgIDB4MDUsICAweDUyLCAgMHgzMSwgIDB4NTMsICAweGZlLCAgMHgxMCwgIDB4NTgsICAweGZlLAotICAweDkxLCAgMHg1OCwgIDB4ZmUsICAweDE0LCAgMHg1OSwgIDB4ZmUsICAweDk1LCAgMHg1OSwgIDB4MDIsICAweDZkLCAgMHgwOSwgIDB4MDQsICAweDE5LCAgMHgxNiwgIDB4ZDcsICAweDA5LAotICAweDA0LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHgzNSwgIDB4ZmUsICAweDNhLCAgMHg1NSwgIDB4ZmUsICAweDE5LCAgMHg4MSwgIDB4NWYsICAweGZlLCAgMHgxMCwgIDB4OTAsICAweGZlLAotICAweDkyLCAgMHg5MCwgIDB4ZmUsICAweGQ3LCAgMHgxMCwgIDB4MmYsICAweDA3LCAgMHg5YiwgIDB4MTYsICAweGZlLCAgMHhjNiwgIDB4MDgsICAweDExLCAgMHg5YiwgIDB4MDksICAweDA0LAotICAweDBiLCAgMHhmZSwgIDB4MTQsICAweDEzLCAgMHgwNSwgIDB4MzksICAweDMxLCAgMHgzYSwgIDB4NzcsICAweGZlLCAgMHhjNiwgIDB4MDgsICAweGZlLCAgMHgwYywgIDB4NTgsICAweGZlLAotICAweDhkLCAgMHg1OCwgIDB4MDIsICAweDZkLCAgMHgyMywgIDB4NDcsICAweGZlLCAgMHgxOSwgIDB4ODAsICAweGRlLCAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhmZSwgIDB4MWEsICAweDEyLAotICAweGZlLCAgMHg2YywgIDB4MTksICAweGZlLCAgMHgxOSwgIDB4NDEsICAweGU5LCAgMHhiNSwgIDB4ZmUsICAweGQxLCAgMHhmMCwgIDB4ZDksICAweDE0LCAgMHg3YSwgIDB4MDEsICAweDMzLAotICAweDBmLCAgMHhmZSwgIDB4NDQsICAweDAwLCAgMHhmZSwgIDB4OGUsICAweDEwLCAgMHhmZSwgIDB4NmMsICAweDE5LCAgMHhiZSwgIDB4MzksICAweGZlLCAgMHhlZCwgIDB4MTksICAweGJmLAotICAweDNhLCAgMHhmZSwgIDB4MGMsICAweDUxLCAgMHhmZSwgIDB4OGUsICAweDUxLCAgMHhlOSwgIDB4MWMsICAweGZlLCAgMHgwMCwgIDB4ZmYsICAweDM0LCAgMHhmZSwgIDB4NzQsICAweDEwLAotICAweGI1LCAgMHhmZSwgIDB4ZDIsICAweGYwLCAgMHhmZSwgIDB4YjIsICAweDBhLCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgxYywgIDB4MWEsICAweDg0LCAgMHgwNSwgIDB4Y2IsICAweDFjLAotICAweDA2LCAgMHhmZSwgIDB4MDgsICAweDEzLCAgMHgwZiwgIDB4ZmUsICAweDE2LCAgMHgwMCwgIDB4MDIsICAweDVhLCAgMHhmZSwgIDB4ZDEsICAweGYwLCAgMHhmZSwgIDB4YzQsICAweDBhLAotICAweDE0LCAgMHg3YSwgIDB4MDEsICAweDMzLCAgMHgwZiwgIDB4ZmUsICAweDE3LCAgMHgwMCwgIDB4ZmUsICAweDQyLCAgMHgxMCwgIDB4ZmUsICAweGNlLCAgMHhmMCwgIDB4ZmUsICAweGNhLAotICAweDBhLCAgMHhmZSwgIDB4M2MsICAweDEwLCAgMHhmZSwgIDB4Y2QsICAweGYwLCAgMHhmZSwgIDB4ZDYsICAweDBhLCAgMHgwZiwgIDB4ZmUsICAweDIyLCAgMHgwMCwgIDB4MDIsICAweDVhLAotICAweGZlLCAgMHhjYiwgIDB4ZjAsICAweGZlLCAgMHhlMiwgIDB4MGEsICAweDBmLCAgMHhmZSwgIDB4MjQsICAweDAwLCAgMHgwMiwgIDB4NWEsICAweGZlLCAgMHhkMCwgIDB4ZjAsICAweGZlLAotICAweGVjLCAgMHgwYSwgIDB4MGYsICAweDkzLCAgMHhkYywgIDB4ZmUsICAweGNmLCAgMHhmMCwgIDB4ZmUsICAweGY2LCAgMHgwYSwgIDB4MGYsICAweDRjLCAgMHhmZSwgIDB4MTAsICAweDEwLAotICAweGZlLCAgMHhjYywgIDB4ZjAsICAweGQ5LCAgMHg2MSwgIDB4MDQsICAweDE5LCAgMHgzYiwgIDB4MGYsICAweGZlLCAgMHgxMiwgIDB4MDAsICAweDJhLCAgMHgxMywgIDB4ZmUsICAweDRlLAotICAweDExLCAgMHg2NSwgIDB4ZmUsICAweDBjLCAgMHgwYiwgIDB4ZmUsICAweDllLCAgMHhmMCwgIDB4ZmUsICAweDIwLCAgMHgwYiwgIDB4YjEsICAweDE2LCAgMHgzMiwgIDB4MmEsICAweDczLAotICAweGRkLCAgMHhiOCwgIDB4MjIsICAweGI5LCAgMHgyMiwgIDB4MmEsICAweGVjLCAgMHg2NSwgIDB4ZmUsICAweDJjLCAgMHgwYiwgIDB4MjUsICAweDMyLCAgMHg4YywgIDB4ZmUsICAweDQ4LAotICAweDBiLCAgMHg4ZCwgIDB4ODEsICAweGI4LCAgMHhkNCwgIDB4YjksICAweGQ0LCAgMHgwMiwgIDB4MjIsICAweDAxLCAgMHg0MywgIDB4ZmUsICAweGRiLCAgMHgxMCwgIDB4MTEsICAweGZlLAotICAweGU4LCAgMHgwMCwgIDB4YWEsICAweGFiLCAgMHg3MCwgIDB4YmMsICAweDdkLCAgMHhiZCwgIDB4N2YsICAweGZlLCAgMHg4OSwgIDB4ZjAsICAweDIyLCAgMHgzMCwgIDB4MmUsICAweGQ4LAotICAweGJjLCAgMHg3ZCwgIDB4YmQsICAweDdmLCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHgyMiwgIDB4MzAsICAweDJlLCAgMHhkNiwgIDB4YjEsICAweDQ1LCAgMHgwZiwgIDB4ZmUsICAweDQyLAotICAweDAwLCAgMHgwMiwgIDB4NWEsICAweDc4LCAgMHgwNiwgIDB4ZmUsICAweDgxLCAgMHg0OSwgIDB4MTYsICAweGZlLCAgMHgzOCwgIDB4MGMsICAweDA5LCAgMHgwNCwgIDB4MGIsICAweGZlLAotICAweDQ0LCAgMHgxMywgIDB4MGYsICAweDAwLCAgMHg0YiwgIDB4MGIsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDRiLCAgMHhmZSwgIDB4MjgsICAweDAwLCAgMHgyMSwgIDB4ZmUsICAweGE2LAotICAweDBjLCAgMHgwYSwgIDB4NDAsICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDAwLCAgMHg1ZCwgIDB4M2UsICAweGZlLCAgMHgyOCwgIDB4MDAsICAweGZlLCAgMHhlMiwgIDB4MTAsICAweDAxLAotICAweGU3LCAgMHgwMSwgIDB4ZTgsICAweDBhLCAgMHg5OSwgIDB4MDEsICAweGZlLCAgMHgzMiwgIDB4MGUsICAweDU5LCAgMHgxMSwgIDB4MmQsICAweDAxLCAgMHg2ZiwgIDB4MDIsICAweDI5LAotICAweDBmLCAgMHhmZSwgIDB4NDQsICAweDAwLCAgMHg0YiwgIDB4MGIsICAweGRmLCAgMHgzZSwgIDB4MGIsICAweGZlLCAgMHhiNCwgIDB4MTAsICAweDAxLCAgMHg4NiwgIDB4M2UsICAweDBiLAotICAweGZlLCAgMHhhYSwgIDB4MTAsICAweDAxLCAgMHg4NiwgIDB4ZmUsICAweDE5LCAgMHg4MiwgIDB4ZmUsICAweDM0LCAgMHg0NiwgIDB4YTMsICAweDNlLCAgMHgwYiwgIDB4MGYsICAweGZlLAotICAweDQzLCAgMHgwMCwgIDB4ZmUsICAweDk2LCAgMHgxMCwgIDB4MDksICAweDRhLCAgMHgwYiwgIDB4MzUsICAweDAxLCAgMHhlNywgIDB4MDEsICAweGU4LCAgMHg1OSwgIDB4MTEsICAweDJkLAotICAweDAxLCAgMHg2ZiwgIDB4NjcsICAweDBiLCAgMHg1OSwgIDB4M2MsICAweDhhLCAgMHgwMiwgIDB4ZmUsICAweDJhLCAgMHgwMywgIDB4MDksICAweDA0LCAgMHgwYiwgIDB4ODQsICAweDNlLAotICAweDBiLCAgMHgwZiwgIDB4MDAsICAweGZlLCAgMHg1YywgIDB4MTAsICAweDYxLCAgMHgwNCwgIDB4MWIsICAweGZlLCAgMHg1OCwgIDB4MTIsICAweDA5LCAgMHgwNCwgIDB4MWIsICAweGZlLAotICAweDUwLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsICAweDVjLCAgMHgwYywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLAotICAweGYwLCAgMHhmZSwgIDB4NjIsICAweDBjLCAgMHgwOSwgIDB4NGEsICAweDFiLCAgMHgzNSwgIDB4ZmUsICAweGE5LCAgMHgxMCwgIDB4MGYsICAweGZlLCAgMHgxNSwgIDB4MDAsICAweGZlLAotICAweDA0LCAgMHhlNiwgIDB4MGIsICAweDVmLCAgMHg1YywgIDB4MGYsICAweGZlLCAgMHgxMywgIDB4MDAsICAweGZlLCAgMHgxMCwgIDB4MTAsICAweDBmLCAgMHhmZSwgIDB4NDcsICAweDAwLAotICAweGExLCAgMHgwZiwgIDB4ZmUsICAweDQxLCAgMHgwMCwgIDB4YTAsICAweDBmLCAgMHhmZSwgIDB4MjQsICAweDAwLCAgMHg4NywgIDB4YWEsICAweGFiLCAgMHg3MCwgIDB4MDUsICAweDZiLAotICAweDI4LCAgMHgyMSwgIDB4ZDEsICAweDVmLCAgMHhmZSwgIDB4MDQsICAweGU2LCAgMHgxYiwgIDB4ZmUsICAweDlkLCAgMHg0MSwgIDB4ZmUsICAweDFjLCAgMHg0MiwgIDB4NTksICAweDAxLAotICAweGRhLCAgMHgwMiwgIDB4MjksICAweGVhLCAgMHgxNCwgIDB4MGIsICAweDM3LCAgMHg5NSwgIDB4YTksICAweDE0LCAgMHhmZSwgIDB4MzEsICAweDAwLCAgMHgzNywgIDB4OTcsICAweDAxLAotICAweGZlLCAgMHg1NCwgIDB4MGYsICAweDAyLCAgMHhkMCwgIDB4M2MsICAweGZlLCAgMHgwNiwgIDB4ZWMsICAweGM5LCAgMHhlZSwgIDB4M2UsICAweDFkLCAgMHhmZSwgIDB4Y2UsICAweDQ1LAotICAweDM0LCAgMHgzYywgIDB4ZmUsICAweDA2LCAgMHhlYSwgIDB4YzksICAweGZlLCAgMHg0NywgIDB4NGIsICAweDg5LCAgMHhmZSwgIDB4NzUsICAweDU3LCAgMHgwNSwgIDB4NTEsICAweGZlLAotICAweDk4LCAgMHg1NiwgIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MGEsICAweDQyLCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDQ2LCAgMHgwOSwgIDB4MDQsICAweDFkLAotICAweGZlLCAgMHgxYSwgIDB4MTMsICAweDBhLCAgMHg0MCwgIDB4MDEsICAweDBlLCAgMHg0NywgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MGEsICAweDk5LCAgMHgwMSwgIDB4MGUsICAweGZlLAotICAweDQ5LCAgMHg1NCwgIDB4OGUsICAweGZlLCAgMHgyYSwgIDB4MGQsICAweDAyLCAgMHhmZSwgIDB4MmEsICAweDAzLCAgMHgwYSwgIDB4NTEsICAweGZlLCAgMHhlZSwgIDB4MTQsICAweGVlLAotICAweDNlLCAgMHgxZCwgIDB4ZmUsICAweGNlLCAgMHg0NSwgIDB4MzQsICAweDNjLCAgMHhmZSwgIDB4Y2UsICAweDQ3LCAgMHhmZSwgIDB4YWQsICAweDEzLCAgMHgwMiwgIDB4MjksICAweDFlLAotICAweDIwLCAgMHgwNywgIDB4MTAsICAweGZlLCAgMHg5ZSwgIDB4MTIsICAweDIzLCAgMHgxMiwgIDB4NGQsICAweDEyLCAgMHg5NCwgIDB4MTIsICAweGNlLCAgMHgxZSwgIDB4MmQsICAweDQ3LAotICAweDM3LCAgMHgyZCwgIDB4YjEsICAweGUwLCAgMHhmZSwgIDB4YmMsICAweGYwLCAgMHhmZSwgIDB4ZWMsICAweDBkLCAgMHgxMywgIDB4MDYsICAweDEyLCAgMHg0ZCwgIDB4MDEsICAweGZlLAotICAweGUyLCAgMHgxNSwgIDB4MDUsICAweGZlLCAgMHgzOCwgIDB4MDEsICAweDMxLCAgMHhmZSwgIDB4M2EsICAweDAxLCAgMHg3NywgIDB4ZmUsICAweGYwLCAgMHgwZCwgIDB4ZmUsICAweDAyLAotICAweGVjLCAgMHhjZSwgIDB4NjIsICAweDAwLCAgMHg1ZCwgIDB4ZmUsICAweDA0LCAgMHhlYywgIDB4MjAsICAweDQ2LCAgMHhmZSwgIDB4MDUsICAweGY2LCAgMHhmZSwgIDB4MzQsICAweDAxLAotICAweDAxLCAgMHhmZSwgIDB4NTIsICAweDE2LCAgMHhmYiwgIDB4ZmUsICAweDQ4LCAgMHhmNCwgIDB4MGQsICAweGZlLCAgMHgxOCwgIDB4MTMsICAweGFmLCAgMHhmZSwgIDB4MDIsICAweGVhLAotICAweGNlLCAgMHg2MiwgIDB4N2EsICAweGZlLCAgMHhjNSwgIDB4MTMsICAweDE0LCAgMHgxYiwgIDB4MzcsICAweDk1LCAgMHhhOSwgIDB4NWMsICAweDA1LCAgMHhmZSwgIDB4MzgsICAweDAxLAotICAweDFjLCAgMHhmZSwgIDB4ZjAsICAweGZmLCAgMHgwYywgIDB4ZmUsICAweDYwLCAgMHgwMSwgIDB4MDUsICAweGZlLCAgMHgzYSwgIDB4MDEsICAweDBjLCAgMHhmZSwgIDB4NjIsICAweDAxLAotICAweDNkLCAgMHgxMiwgIDB4MjAsICAweDI0LCAgMHgwNiwgIDB4MTIsICAweDJkLCAgMHgxMSwgIDB4MmQsICAweDhhLCAgMHgxMywgIDB4MDYsICAweDAzLCAgMHgyMywgIDB4MDMsICAweDFlLAotICAweDRkLCAgMHhmZSwgIDB4ZjcsICAweDEyLCAgMHgxZSwgIDB4OTQsICAweGFjLCAgMHgxMiwgIDB4OTQsICAweDA3LCAgMHg3YSwgIDB4ZmUsICAweDcxLCAgMHgxMywgIDB4ZmUsICAweDI0LAotICAweDFjLCAgMHgxNCwgIDB4MWEsICAweDM3LCAgMHg5NSwgIDB4YTksICAweGZlLCAgMHhkOSwgIDB4MTAsICAweGI2LCAgMHhmZSwgIDB4MDMsICAweGRjLCAgMHhmZSwgIDB4NzMsICAweDU3LAotICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDAzLCAgMHhiNiwgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsICAweDViLCAgMHg1NywgIDB4ZmUsICAweDgwLCAgMHg1ZCwgIDB4MDMsICAweGZlLAotICAweDAzLCAgMHg1NywgIDB4YjYsICAweDIzLCAgMHhmZSwgIDB4MDAsICAweGNjLCAgMHgwMywgIDB4ZmUsICAweDAzLCAgMHg1NywgIDB4YjYsICAweDc1LCAgMHgwMywgIDB4MDksICAweDA0LAotICAweDRjLCAgMHhmZSwgIDB4MjIsICAweDEzLCAgMHhmZSwgIDB4MWMsICAweDgwLCAgMHgwNywgIDB4MDYsICAweGZlLCAgMHgxYSwgIDB4MTMsICAweGZlLCAgMHgxZSwgIDB4ODAsICAweGUxLAotICAweGZlLCAgMHgxZCwgIDB4ODAsICAweGE0LCAgMHhmZSwgIDB4MGMsICAweDkwLCAgMHhmZSwgIDB4MGUsICAweDEzLCAgMHhmZSwgIDB4MGUsICAweDkwLCAgMHhhMywgIDB4ZmUsICAweDNjLAotICAweDkwLCAgMHhmZSwgIDB4MzAsICAweGY0LCAgMHgwYiwgIDB4ZmUsICAweDNjLCAgMHg1MCwgIDB4YTAsICAweDAxLCAgMHhmZSwgIDB4ODIsICAweDE2LCAgMHgyZiwgIDB4MDcsICAweDJkLAotICAweGUwLCAgMHgwMSwgIDB4ZmUsICAweGJjLCAgMHgxNSwgIDB4MDksICAweDA0LCAgMHgxZCwgIDB4NDUsICAweDAxLCAgMHhlNywgIDB4MDEsICAweGU4LCAgMHgxMSwgIDB4ZmUsICAweGU5LAotICAweDAwLCAgMHgwOSwgIDB4MDQsICAweDRjLCAgMHhmZSwgIDB4MmMsICAweDEzLCAgMHgwMSwgIDB4ZmUsICAweDE0LCAgMHgxNiwgIDB4ZmUsICAweDFlLCAgMHgxYywgIDB4ZmUsICAweDE0LAotICAweDkwLCAgMHhmZSwgIDB4OTYsICAweDkwLCAgMHgwYywgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg2NiwgIDB4MDEsICAweDA5LCAgMHgwNCwgIDB4NGYsICAweGZlLAotICAweDEyLCAgMHgxMiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4NzQsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweDIwLCAgMHhmZSwgIDB4ODAsICAweDQwLCAgMHgxMiwgIDB4MjAsICAweDYzLAotICAweDI3LCAgMHgxMSwgIDB4YzgsICAweDU5LCAgMHgxZSwgIDB4MjAsICAweGVkLCAgMHg3NiwgIDB4MjAsICAweDAzLCAgMHhmZSwgIDB4MDgsICAweDFjLCAgMHgwNSwgIDB4ZmUsICAweGFjLAotICAweDAwLCAgMHhmZSwgIDB4MDYsICAweDU4LCAgMHgwNSwgIDB4ZmUsICAweGFlLCAgMHgwMCwgIDB4ZmUsICAweDA3LCAgMHg1OCwgIDB4MDUsICAweGZlLCAgMHhiMCwgIDB4MDAsICAweGZlLAotICAweDA4LCAgMHg1OCwgIDB4MDUsICAweGZlLCAgMHhiMiwgIDB4MDAsICAweGZlLCAgMHgwOSwgIDB4NTgsICAweGZlLCAgMHgwYSwgIDB4MWMsICAweDI0LCAgMHg2OSwgIDB4MTIsICAweGM5LAotICAweDIzLCAgMHgwYywgIDB4NTAsICAweDBjLCAgMHgzZiwgIDB4MTMsICAweDQwLCAgMHg0OCwgIDB4NWYsICAweDE3LCAgMHgxZCwgIDB4ZmUsICAweDkwLCAgMHg0ZCwgIDB4ZmUsICAweDkxLAotICAweDU0LCAgMHgyMSwgIDB4ZmUsICAweDA4LCAgMHgwZiwgIDB4M2UsICAweDEwLCAgMHgxMywgIDB4NDIsICAweDQ4LCAgMHgxNywgIDB4NGMsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLAotICAweDkxLCAgMHg1NCwgIDB4MjEsICAweGZlLCAgMHgxZSwgIDB4MGYsICAweDI0LCAgMHgxMCwgIDB4MTIsICAweDIwLCAgMHg3OCwgIDB4MmMsICAweDQ2LCAgMHgxZSwgIDB4MjAsICAweGVkLAotICAweDc2LCAgMHgyMCwgIDB4MTEsICAweGM4LCAgMHhmNiwgIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDMyLCAgMHgwZiwgIDB4ZWEsICAweDcwLCAgMHhmZSwgIDB4MTQsICAweDFjLAotICAweGZlLCAgMHgxMCwgIDB4MWMsICAweGZlLCAgMHgxOCwgIDB4MWMsICAweDAzLCAgMHgzYywgIDB4ZmUsICAweDBjLCAgMHgxNCwgIDB4ZWUsICAweGZlLCAgMHgwNywgIDB4ZTYsICAweDFkLAotICAweGZlLCAgMHhjZSwgIDB4NDcsICAweGZlLCAgMHhmNSwgIDB4MTMsICAweDAzLCAgMHgwMSwgIDB4ODYsICAweDc4LCAgMHgyYywgIDB4NDYsICAweGZhLCAgMHhlZiwgIDB4ZmUsICAweDQyLAotICAweDEzLCAgMHgyZiwgIDB4MDcsICAweDJkLCAgMHhmZSwgIDB4MzQsICAweDEzLCAgMHgwYSwgIDB4NDIsICAweDAxLCAgMHgwZSwgIDB4YjAsICAweGZlLCAgMHgzNiwgIDB4MTIsICAweGYwLAotICAweGZlLCAgMHg0NSwgIDB4NDgsICAweDAxLCAgMHhlMywgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4YjAsICAweGZlLCAgMHhmMywgIDB4MTMsICAweDNkLCAgMHg3NSwgIDB4MDcsICAweDEwLAotICAweGEzLCAgMHgwYSwgIDB4ODAsICAweDAxLCAgMHgwZSwgIDB4ZmUsICAweDgwLCAgMHg1YywgIDB4MDEsICAweDZmLCAgMHhmZSwgIDB4MGUsICAweDEwLCAgMHgwNywgIDB4N2UsICAweDQ1LAotICAweGY2LCAgMHhmZSwgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4NmMsICAweDBmLCAgMHgwMywgIDB4ZmUsICAweDQ0LCAgMHg1OCwgIDB4NzQsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweDk3LAotICAweGZlLCAgMHg5ZSwgIDB4NDAsICAweGZlLCAgMHg5ZCwgIDB4ZTcsICAweDAwLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgxYiwgIDB4NzYsICAweDI3LCAgMHgwMSwgIDB4ZGEsICAweGZlLAotICAweGRkLCAgMHgxMCwgIDB4MmEsICAweGJjLCAgMHg3ZCwgIDB4YmQsICAweDdmLCAgMHgzMCwgIDB4MmUsICAweGQ1LCAgMHgwNywgIDB4MWIsICAweGZlLCAgMHg0OCwgIDB4MTIsICAweDA3LAotICAweDBiLCAgMHhmZSwgIDB4NTYsICAweDEyLCAgMHgwNywgIDB4MWEsICAweGZlLCAgMHgzMCwgIDB4MTIsICAweDA3LCAgMHhjMiwgIDB4MTYsICAweGZlLCAgMHgzZSwgIDB4MTEsICAweDA3LAotICAweGZlLCAgMHgyMywgIDB4MDAsICAweDE2LCAgMHhmZSwgIDB4NGEsICAweDExLCAgMHgwNywgIDB4MDYsICAweDE2LCAgMHhmZSwgIDB4YTgsICAweDExLCAgMHgwNywgIDB4MTksICAweGZlLAotICAweDEyLCAgMHgxMiwgIDB4MDcsICAweDAwLCAgMHgxNiwgIDB4MjIsICAweDE0LCAgMHhjMiwgIDB4MDEsICAweDMzLCAgMHg5ZiwgIDB4MmIsICAweDAxLCAgMHgwOCwgIDB4OGMsICAweDQzLAotICAweDAzLCAgMHgyYiwgIDB4ZmUsICAweDYyLCAgMHgwOCwgIDB4MGEsICAweGNhLCAgMHgwMSwgIDB4ZmUsICAweDMyLCAgMHgwZSwgIDB4MTEsICAweDdlLCAgMHgwMiwgIDB4MjksICAweDJiLAotICAweDJmLCAgMHgwNywgIDB4OWIsICAweGZlLCAgMHhkOSwgIDB4MTMsICAweDc5LCAgMHgzOSwgIDB4NjgsICAweDNhLCAgMHg3NywgIDB4ZmUsICAweGZjLCAgMHgxMCwgIDB4MDksICAweDA0LAotICAweDZhLCAgMHhmZSwgIDB4NzIsICAweDEyLCAgMHhjMCwgIDB4MzgsICAweGMxLCAgMHg0ZSwgIDB4ZjQsICAweGY1LCAgMHg4ZSwgIDB4ZmUsICAweGM2LCAgMHgxMCwgIDB4MWUsICAweDU4LAotICAweGZlLCAgMHgyNiwgIDB4MTMsICAweDA1LCAgMHg3YiwgIDB4MzEsICAweDdjLCAgMHg3NywgIDB4ZmUsICAweDgyLCAgMHgwYywgIDB4MGMsICAweDU0LCAgMHgxOCwgIDB4NTUsICAweDIzLAotICAweDBjLCAgMHg3YiwgIDB4MGMsICAweDdjLCAgMHgwMSwgIDB4YTgsICAweDI0LCAgMHg2OSwgIDB4NzMsICAweDEyLCAgMHg1OCwgIDB4MDEsICAweGE1LCAgMHhjMCwgIDB4MzgsICAweGMxLAotICAweDRlLCAgMHhmZSwgIDB4MDQsICAweDU1LCAgMHhmZSwgIDB4YTUsICAweDU1LCAgMHhmZSwgIDB4MDQsICAweGZhLCAgMHgzOCwgIDB4ZmUsICAweDA1LCAgMHhmYSwgIDB4NGUsICAweGZlLAotICAweDkxLCAgMHgxMCwgIDB4MDUsICAweDU2LCAgMHgzMSwgIDB4NTcsICAweGZlLCAgMHg0MCwgIDB4NTYsICAweGZlLCAgMHhlMSwgIDB4NTYsICAweDBjLCAgMHg1NiwgIDB4MTgsICAweDU3LAotICAweDgzLCAgMHhjMCwgIDB4MzgsICAweGMxLCAgMHg0ZSwgIDB4ZjQsICAweGY1LCAgMHgwNSwgIDB4NTIsICAweDMxLCAgMHg1MywgIDB4ZmUsICAweDAwLCAgMHg1NiwgIDB4ZmUsICAweGExLAotICAweDU2LCAgMHgwYywgIDB4NTIsICAweDE4LCAgMHg1MywgIDB4MDksICAweDA0LCAgMHg2YSwgIDB4ZmUsICAweDFlLCAgMHgxMiwgIDB4MWUsICAweDU4LCAgMHhmZSwgIDB4MWYsICAweDQwLAotICAweDA1LCAgMHg1NCwgIDB4MzEsICAweDU1LCAgMHhmZSwgIDB4MmMsICAweDUwLCAgMHhmZSwgIDB4YWUsICAweDUwLCAgMHgwNSwgIDB4NTYsICAweDMxLCAgMHg1NywgIDB4ZmUsICAweDQ0LAotICAweDUwLCAgMHhmZSwgIDB4YzYsICAweDUwLCAgMHgwNSwgIDB4NTIsICAweDMxLCAgMHg1MywgIDB4ZmUsICAweDA4LCAgMHg1MCwgIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4MDUsICAweDM5LAotICAweDMxLCAgMHgzYSwgIDB4ZmUsICAweDQwLCAgMHg1MCwgIDB4ZmUsICAweGMyLCAgMHg1MCwgIDB4MDIsICAweDVjLCAgMHgyNCwgIDB4MDYsICAweDEyLCAgMHhjZCwgIDB4MDIsICAweDViLAotICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHg0NCwgIDB4MzAsICAweDJlLCAgMHhkNSwgIDB4MDcsICAweDA2LCAgMHgyMSwgIDB4NDQsICAweDJmLCAgMHgwNywgIDB4OWIsICAweDIxLAotICAweDViLCAgMHgwMSwgIDB4NmUsICAweDFjLCAgMHgzZCwgIDB4MTYsICAweDQ0LCAgMHgwOSwgIDB4MDQsICAweDBiLCAgMHhlMiwgIDB4NzksICAweDM5LCAgMHg2OCwgIDB4M2EsICAweGZlLAotICAweDBhLCAgMHg1NSwgIDB4MzQsICAweGZlLCAgMHg4YiwgIDB4NTUsICAweGJlLCAgMHgzOSwgIDB4YmYsICAweDNhLCAgMHhmZSwgIDB4MGMsICAweDUxLCAgMHhmZSwgIDB4OGUsICAweDUxLAotICAweDAyLCAgMHg1YiwgIDB4ZmUsICAweDE5LCAgMHg4MSwgIDB4YWYsICAweGZlLCAgMHgxOSwgIDB4NDEsICAweDAyLCAgMHg1YiwgIDB4MmIsICAweDAxLCAgMHgwOCwgIDB4MjUsICAweDMyLAotICAweDFmLCAgMHhhMiwgIDB4MzAsICAweDJlLCAgMHhkOCwgIDB4NGIsICAweDFhLCAgMHhmZSwgIDB4YTYsICAweDEyLCAgMHg0YiwgIDB4MGIsICAweDNiLCAgMHgwMiwgIDB4NDQsICAweDAxLAotICAweDA4LCAgMHgyNSwgIDB4MzIsICAweDFmLCAgMHhhMiwgIDB4MzAsICAweDJlLCAgMHhkNiwgIDB4MDcsICAweDFhLCAgMHgyMSwgIDB4NDQsICAweDAxLCAgMHgwOCwgIDB4MWYsICAweGEyLAotICAweDMwLCAgMHgyZSwgIDB4ZmUsICAweGU4LCAgMHgwOSwgIDB4ZmUsICAweGMyLCAgMHg0OSwgIDB4NjAsICAweDA1LCAgMHhmZSwgIDB4OWMsICAweDAwLCAgMHgyOCwgIDB4ODQsICAweDQ5LAotICAweDA0LCAgMHgxOSwgIDB4MzQsICAweDlmLCAgMHhmZSwgIDB4YmIsICAweDQ1LCAgMHg0YiwgIDB4MDAsICAweDQ1LCAgMHgzZSwgIDB4MDYsICAweDc4LCAgMHgzZCwgIDB4ZmUsICAweGRhLAotICAweDE0LCAgMHgwMSwgIDB4NmUsICAweDg3LCAgMHhmZSwgIDB4NGIsICAweDQ1LCAgMHhlMiwgIDB4MmYsICAweDA3LCAgMHg5YSwgIDB4ZTEsICAweDA1LCAgMHhjNiwgIDB4MjgsICAweDg0LAotICAweDA1LCAgMHgzZiwgIDB4MjgsICAweDM0LCAgMHg1ZSwgIDB4MDIsICAweDViLCAgMHhmZSwgIDB4YzAsICAweDVkLCAgMHhmZSwgIDB4ZjgsICAweDE0LCAgMHhmZSwgIDB4MDMsICAweDE3LAotICAweDA1LCAgMHg1MCwgIDB4YjQsICAweDBjLCAgMHg1MCwgIDB4NWUsICAweDJiLCAgMHgwMSwgIDB4MDgsICAweDI2LCAgMHg1YywgIDB4MDEsICAweGZlLCAgMHhhYSwgIDB4MTQsICAweDAyLAotICAweDVjLCAgMHgwMSwgIDB4MDgsICAweDI1LCAgMHgzMiwgIDB4MWYsICAweDQ0LCAgMHgzMCwgIDB4MmUsICAweGQ2LCAgMHgwNywgIDB4MDYsICAweDIxLCAgMHg0NCwgIDB4MDEsICAweGZlLAotICAweDhlLCAgMHgxMywgIDB4ZmUsICAweDQyLCAgMHg1OCwgIDB4ZmUsICAweDgyLCAgMHgxNCwgIDB4ZmUsICAweGE0LCAgMHgxNCwgIDB4ODcsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDBiLAotICAweDE2LCAgMHg0NCwgIDB4ZmUsICAweDRhLCAgMHhmNCwgIDB4MDYsICAweGZlLCAgMHgwYywgIDB4MTIsICAweDJmLCAgMHgwNywgIDB4OWEsICAweDg1LCAgMHgwMiwgIDB4NWIsICAweDA1LAotICAweDNmLCAgMHhiNCwgIDB4MGMsICAweDNmLCAgMHg1ZSwgIDB4MmIsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweDVjLCAgMHgwMSwgIDB4ZmUsICAweGQ4LCAgMHgxNCwgIDB4MDIsICAweDVjLAotICAweDEzLCAgMHgwNiwgIDB4NjUsICAweGZlLCAgMHhjYSwgIDB4MTIsICAweDI2LCAgMHhmZSwgIDB4ZTAsICAweDEyLCAgMHg3MiwgIDB4ZjEsICAweDAxLCAgMHgwOCwgIDB4MjMsICAweDcyLAotICAweDAzLCAgMHg4ZiwgIDB4ZmUsICAweGRjLCAgMHgxMiwgIDB4MjUsICAweGZlLCAgMHhkYywgIDB4MTIsICAweDFmLCAgMHhmZSwgIDB4Y2EsICAweDEyLCAgMHg1ZSwgIDB4MmIsICAweDAxLAotICAweDA4LCAgMHhmZSwgIDB4ZDUsICAweDEwLCAgMHgxMywgIDB4NmMsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg0OCwgIDB4OGIsICAweDFjLCAgMHhmZSwgIDB4ZmYsICAweDdmLAotICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDAzLCAgMHgxMywgIDB4NmMsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg0OCwgIDB4OGIsICAweDFjLAotICAweDNkLCAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwMywgIDB4MTMsICAweDZjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NDgsICAweDhiLAotICAweDAzLCAgMHgxMywgIDB4NmMsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg0OCwgIDB4OGIsICAweGZlLCAgMHgwYiwgIDB4NTgsICAweDAzLCAgMHgwYSwgIDB4NTAsICAweDAxLAotICAweDgyLCAgMHgwYSwgIDB4M2YsICAweDAxLCAgMHg4MiwgIDB4MDMsICAweGZjLCAgMHgxYywgIDB4MTAsICAweGZmLCAgMHgwMywgIDB4MDAsICAweDU0LCAgMHhmZSwgIDB4MDAsICAweGY0LAotICAweDE5LCAgMHg0OCwgIDB4ZmUsICAweDAwLCAgMHg3ZCwgIDB4ZmUsICAweDAxLCAgMHg3ZCwgIDB4ZmUsICAweDAyLCAgMHg3ZCwgIDB4ZmUsICAweDAzLCAgMHg3YywgIDB4NjMsICAweDI3LAotICAweDBjLCAgMHg1MiwgIDB4MTgsICAweDUzLCAgMHhiZSwgIDB4NTYsICAweGJmLCAgMHg1NywgIDB4MDMsICAweGZlLCAgMHg2MiwgIDB4MDgsICAweGZlLCAgMHg4MiwgIDB4NGEsICAweGZlLAotICAweGUxLCAgMHgxYSwgIDB4ZmUsICAweDgzLCAgMHg1YSwgIDB4NzQsICAweDAzLCAgMHgwMSwgIDB4ZmUsICAweDE0LCAgMHgxOCwgIDB4ZmUsICAweDQyLCAgMHg0OCwgIDB4NWYsICAweDYwLAotICAweDg5LCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHhmZSwgIDB4YTIsICAweDE0LCAgMHgzMCwgIDB4MmUsICAweGQ4LCAgMHgwMSwgIDB4MDgsICAweDFmLCAgMHhmZSwgIDB4YTIsICAweDE0LAotICAweDMwLCAgMHgyZSwgIDB4ZmUsICAweGU4LCAgMHgwYSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4MDUsICAweGM2LCAgMHgyOCwgIDB4ZmUsICAweGNjLCAgMHgxMiwgIDB4NDksICAweDA0LAotICAweDFiLCAgMHhmZSwgIDB4YzQsICAweDEzLCAgMHgyMywgIDB4NjIsICAweDFiLCAgMHhlMiwgIDB4NGIsICAweGMzLCAgMHg2NCwgIDB4ZmUsICAweGU4LCAgMHgxMywgIDB4M2IsICAweDEzLAotICAweDA2LCAgMHgxNywgIDB4YzMsICAweDc4LCAgMHhkYiwgIDB4ZmUsICAweDc4LCAgMHgxMCwgIDB4ZmYsICAweDAyLCAgMHg4MywgIDB4NTUsICAweGExLCAgMHhmZiwgIDB4MDIsICAweDgzLAotICAweDU1LCAgMHg2MiwgIDB4MWEsICAweGE0LCAgMHhiYiwgIDB4ZmUsICAweDMwLCAgMHgwMCwgIDB4OGUsICAweGU0LCAgMHgxNywgIDB4MmMsICAweDEzLCAgMHgwNiwgIDB4ZmUsICAweDU2LAotICAweDEwLCAgMHg2MiwgIDB4MGIsICAweGUxLCAgMHhiYiwgIDB4ZmUsICAweDY0LCAgMHgwMCwgIDB4OGUsICAweGU0LCAgMHgwYSwgIDB4ZmUsICAweDY0LCAgMHgwMCwgIDB4MTcsICAweDkzLAotICAweDEzLCAgMHgwNiwgIDB4ZmUsICAweDI4LCAgMHgxMCwgIDB4NjIsICAweDA2LCAgMHhmZSwgIDB4NjAsICAweDEzLCAgMHhiYiwgIDB4ZmUsICAweGM4LCAgMHgwMCwgIDB4OGUsICAweGU0LAotICAweDBhLCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHgxNywgIDB4NGQsICAweDEzLCAgMHgwNiwgIDB4ODMsICAweGJiLCAgMHhmZSwgIDB4OTAsICAweDAxLCAgMHhiYSwgIDB4ZmUsICAweDRlLAotICAweDE0LCAgMHg4OSwgIDB4ZmUsICAweDEyLCAgMHgxMCwgIDB4ZmUsICAweDQzLCAgMHhmNCwgIDB4OTQsICAweGZlLCAgMHg1NiwgIDB4ZjAsICAweGZlLCAgMHg2MCwgIDB4MTQsICAweGZlLAotICAweDA0LCAgMHhmNCwgIDB4NmMsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDkzLCAgMHhmZSwgIDB4ZjMsICAweDEwLCAgMHhmOSwgIDB4MDEsICAweGZlLCAgMHgyMiwgIDB4MTMsICAweDFjLAotICAweDNkLCAgMHhmZSwgIDB4MTAsICAweDEzLCAgMHhmZSwgIDB4MDAsICAweDE3LCAgMHhmZSwgIDB4NGQsICAweGU0LCAgMHg2OSwgIDB4YmEsICAweGZlLCAgMHg5YywgIDB4MTQsICAweGI3LAotICAweDY5LCAgMHhmZSwgIDB4MWMsICAweDEwLCAgMHhmZSwgIDB4MDAsICAweDE3LCAgMHhmZSwgIDB4NGQsICAweGU0LCAgMHgxOSwgIDB4YmEsICAweGZlLCAgMHg5YywgIDB4MTQsICAweGI3LAotICAweDE5LCAgMHg4MywgIDB4NjAsICAweDIzLCAgMHhmZSwgIDB4NGQsICAweGY0LCAgMHgwMCwgIDB4ZGYsICAweDg5LCAgMHgxMywgIDB4MDYsICAweGZlLCAgMHhiNCwgIDB4NTYsICAweGZlLAotICAweGMzLCAgMHg1OCwgIDB4MDMsICAweDYwLCAgMHgxMywgIDB4MGIsICAweDAzLCAgMHgxNSwgIDB4MDYsICAweDAxLCAgMHgwOCwgIDB4MjYsICAweGU1LCAgMHgxNSwgIDB4MGIsICAweDAxLAotICAweDA4LCAgMHgyNiwgIDB4ZTUsICAweDE1LCAgMHgxYSwgIDB4MDEsICAweDA4LCAgMHgyNiwgIDB4ZTUsICAweDcyLCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDAzLAotICAweDE1LCAgMHgwNiwgIDB4MDEsICAweDA4LCAgMHgyNiwgIDB4YTYsICAweDE1LCAgMHgxYSwgIDB4MDEsICAweDA4LCAgMHgyNiwgIDB4YTYsICAweDE1LCAgMHgwNiwgIDB4MDEsICAweDA4LAotICAweDI2LCAgMHhhNiwgIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgyNiwgIDB4YTYsICAweDcyLCAgMHhmZSwgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDAzLAotICAweDYwLCAgMHgwMywgIDB4MWUsICAweGNjLCAgMHgwNywgIDB4MDYsICAweGZlLCAgMHg0NCwgIDB4MTMsICAweGFkLCAgMHgxMiwgIDB4Y2MsICAweGZlLCAgMHg0OSwgIDB4ZjQsICAweDAwLAotICAweDNiLCAgMHg3MiwgIDB4OWYsICAweDVlLCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHhmZSwgIDB4MjcsICAweDAxLCAgMHhmMSwgIDB4MDEsICAweDA4LCAgMHgyZiwgIDB4MDcsICAweGZlLAotICAweGUzLCAgMHgwMCwgIDB4ZmUsICAweDIwLCAgMHgxMywgIDB4MWYsICAweGZlLCAgMHg1YSwgIDB4MTUsICAweDIzLCAgMHgxMiwgIDB4Y2QsICAweDAxLCAgMHg0MywgIDB4MWUsICAweGNkLAotICAweDA3LCAgMHgwNiwgIDB4NDUsICAweDA5LCAgMHg0YSwgIDB4MDYsICAweDM1LCAgMHgwMywgIDB4MGEsICAweDQyLCAgMHgwMSwgIDB4MGUsICAweGVkLCAgMHg4OCwgIDB4MDcsICAweDEwLAotICAweGE0LCAgMHgwYSwgIDB4ODAsICAweDAxLCAgMHgwZSwgIDB4ODgsICAweDBhLCAgMHg1MSwgIDB4MDEsICAweDllLCAgMHgwMywgIDB4MGEsICAweDgwLCAgMHgwMSwgIDB4MGUsICAweDg4LAotICAweGZlLCAgMHg4MCwgIDB4ZTcsICAweDEwLCAgMHgwNywgIDB4MTAsICAweDg0LCAgMHhmZSwgIDB4NDUsICAweDU4LCAgMHgwMSwgIDB4ZTMsICAweDg4LCAgMHgwMywgIDB4MGEsICAweDQyLAotICAweDAxLCAgMHgwZSwgIDB4ODgsICAweDBhLCAgMHg1MSwgIDB4MDEsICAweDllLCAgMHgwMywgIDB4MGEsICAweDQyLCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg4MCwgIDB4ODAsICAweGYyLAotICAweGZlLCAgMHg0OSwgIDB4ZTQsICAweDEwLCAgMHhhNCwgIDB4MGEsICAweDgwLCAgMHgwMSwgIDB4MGUsICAweGYyLCAgMHgwYSwgIDB4NTEsICAweDAxLCAgMHg4MiwgIDB4MDMsICAweDE3LAotICAweDEwLCAgMHg3MSwgIDB4NjYsICAweGZlLCAgMHg2MCwgIDB4MDEsICAweGZlLCAgMHgxOCwgIDB4ZGYsICAweGZlLCAgMHgxOSwgIDB4ZGUsICAweGZlLCAgMHgyNCwgIDB4MWMsICAweGZlLAotICAweDFkLCAgMHhmNywgIDB4MWQsICAweDkwLCAgMHhmZSwgIDB4ZjYsICAweDE1LCAgMHgwMSwgIDB4ZmUsICAweGZjLCAgMHgxNiwgIDB4ZTAsICAweDkxLCAgMHgxZCwgIDB4NjYsICAweGZlLAotICAweDJjLCAgMHgwMSwgIDB4ZmUsICAweDJmLCAgMHgxOSwgIDB4MDMsICAweGFlLCAgMHgyMSwgIDB4ZmUsICAweGU2LCAgMHgxNSwgIDB4ZmUsICAweGRhLCAgMHgxMCwgIDB4MTcsICAweDEwLAotICAweDcxLCAgMHgwNSwgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MTksICAweGZlLCAgMHgxOCwgIDB4NTgsICAweDA1LCAgMHhmZSwgIDB4NjYsICAweDAxLAotICAweGZlLCAgMHgxOSwgIDB4NTgsICAweDkxLCAgMHgxOSwgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MDYsICAweGZlLCAgMHgzYywgIDB4NTAsICAweDY2LAotICAweGZlLCAgMHgzOCwgIDB4MDAsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDE5LCAgMHg5MCwgIDB4ZmUsICAweDQwLCAgMHgxNiwgIDB4ZmUsICAweGI2LAotICAweDE0LCAgMHgzNCwgIDB4MDMsICAweGFlLCAgMHgyMSwgIDB4ZmUsICAweDE4LCAgMHgxNiwgIDB4ZmUsICAweDljLCAgMHgxMCwgIDB4MTcsICAweDEwLCAgMHg3MSwgIDB4ZmUsICAweDgzLAotICAweDVhLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgzOCwgIDB4OTAsICAweGZlLCAgMHg2MiwgIDB4MTYsICAweGZlLAotICAweDk0LCAgMHgxNCwgIDB4ZmUsICAweDEwLCAgMHgxMywgIDB4OTEsICAweDM4LCAgMHg2NiwgIDB4MWIsICAweGZlLCAgMHhhZiwgIDB4MTksICAweGZlLCAgMHg5OCwgIDB4ZTcsICAweDAwLAotICAweDAzLCAgMHhhZSwgIDB4MjEsICAweGZlLCAgMHg1NiwgIDB4MTYsICAweGZlLCAgMHg2YywgIDB4MTAsICAweDE3LCAgMHgxMCwgIDB4NzEsICAweGZlLCAgMHgzMCwgIDB4YmMsICAweGZlLAotICAweGIyLCAgMHhiYywgIDB4OTEsICAweGM1LCAgMHg2NiwgIDB4MWIsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweGM1LCAgMHg5MCwgIDB4ZmUsICAweDlhLAotICAweDE2LCAgMHhmZSwgIDB4NWMsICAweDE0LCAgMHgzNCwgIDB4MDMsICAweGFlLCAgMHgyMSwgIDB4ZmUsICAweDg2LCAgMHgxNiwgIDB4ZmUsICAweDQyLCAgMHgxMCwgIDB4ZmUsICAweDAyLAotICAweGY2LCAgMHgxMCwgIDB4NzEsICAweGZlLCAgMHgxOCwgIDB4ZmUsICAweDU0LCAgMHhmZSwgIDB4MTksICAweGZlLCAgMHg1NSwgIDB4ZmMsICAweGZlLCAgMHgxZCwgIDB4ZjcsICAweDRmLAotICAweDkwLCAgMHhmZSwgIDB4YzAsICAweDE2LCAgMHhmZSwgIDB4MzYsICAweDE0LCAgMHhmZSwgIDB4MWMsICAweDEzLCAgMHg5MSwgIDB4NGYsICAweDQ3LCAgMHhmZSwgIDB4ODMsICAweDU4LAotICAweGZlLCAgMHhhZiwgIDB4MTksICAweGZlLCAgMHg4MCwgIDB4ZTcsICAweDEwLCAgMHhmZSwgIDB4ODEsICAweGU3LCAgMHgxMCwgIDB4MTEsICAweGZlLCAgMHhkZCwgIDB4MDAsICAweDYzLAotICAweDI3LCAgMHgwMywgIDB4NjMsICAweDI3LCAgMHhmZSwgIDB4MTIsICAweDQ1LCAgMHgyMSwgIDB4ZmUsICAweGIwLCAgMHgxNiwgIDB4MTQsICAweDA2LCAgMHgzNywgIDB4OTUsICAweGE5LAotICAweDAyLCAgMHgyOSwgIDB4ZmUsICAweDM5LCAgMHhmMCwgIDB4ZmUsICAweDA0LCAgMHgxNywgIDB4MjMsICAweDAzLCAgMHhmZSwgIDB4N2UsICAweDE4LCAgMHgxYywgIDB4MWEsICAweDVkLAotICAweDEzLCAgMHgwZCwgIDB4MDMsICAweDcxLCAgMHgwNSwgIDB4Y2IsICAweDFjLCAgMHgwNiwgIDB4ZmUsICAweGVmLCAgMHgxMiwgIDB4ZmUsICAweGUxLCAgMHgxMCwgIDB4NzgsICAweDJjLAotICAweDQ2LCAgMHgyZiwgIDB4MDcsICAweDJkLCAgMHhmZSwgIDB4M2MsICAweDEzLCAgMHhmZSwgIDB4ODIsICAweDE0LCAgMHhmZSwgIDB4NDIsICAweDEzLCAgMHgzYywgIDB4OGEsICAweDBhLAotICAweDQyLCAgMHgwMSwgIDB4MGUsICAweGIwLCAgMHhmZSwgIDB4M2UsICAweDEyLCAgMHhmMCwgIDB4ZmUsICAweDQ1LCAgMHg0OCwgIDB4MDEsICAweGUzLCAgMHhmZSwgIDB4MDAsICAweGNjLAotICAweGIwLCAgMHhmZSwgIDB4ZjMsICAweDEzLCAgMHgzZCwgIDB4NzUsICAweDA3LCAgMHgxMCwgIDB4YTMsICAweDBhLCAgMHg4MCwgIDB4MDEsICAweDBlLCAgMHhmMiwgIDB4MDEsICAweDZmLAotICAweGZlLCAgMHgxNiwgIDB4MTAsICAweDA3LCAgMHg3ZSwgIDB4ODUsICAweGZlLCAgMHg0MCwgIDB4MTQsICAweGZlLCAgMHgyNCwgIDB4MTIsICAweGY2LCAgMHhmZSwgIDB4ZDYsICAweGYwLAotICAweGZlLCAgMHgyNCwgIDB4MTcsICAweDE3LCAgMHgwYiwgIDB4MDMsICAweGZlLCAgMHg5YywgIDB4ZTcsICAweDBiLCAgMHgwZiwgIDB4ZmUsICAweDE1LCAgMHgwMCwgIDB4NTksICAweDc2LAotICAweDI3LCAgMHgwMSwgIDB4ZGEsICAweDE3LCAgMHgwNiwgIDB4MDMsICAweDNjLCAgMHg4YSwgIDB4MDksICAweDRhLCAgMHgxZCwgIDB4MzUsICAweDExLCAgMHgyZCwgIDB4MDEsICAweDZmLAotICAweDE3LCAgMHgwNiwgIDB4MDMsICAweGZlLCAgMHgzOCwgIDB4OTAsICAweGZlLCAgMHhiYSwgIDB4OTAsICAweDc5LCAgMHhjNywgIDB4NjgsICAweGM4LCAgMHhmZSwgIDB4NDgsICAweDU1LAotICAweDM0LCAgMHhmZSwgIDB4YzksICAweDU1LCAgMHgwMywgIDB4MWUsICAweDk4LCAgMHg3MywgIDB4MTIsICAweDk4LCAgMHgwMywgIDB4MGEsICAweDk5LCAgMHgwMSwgIDB4MGUsICAweGYwLAotICAweDBhLCAgMHg0MCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDksICAweDQ0LCAgMHgxNiwgIDB4ZmUsICAweGYwLCAgMHgxNywgIDB4NzMsICAweDc1LCAgMHgwMywgIDB4MGEsICAweDQyLAotICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDEwLCAgMHg0NSwgIDB4MGEsICAweDUxLCAgMHgwMSwgIDB4OWUsICAweDBhLCAgMHg0MCwgIDB4MDEsICAweDBlLCAgMHg3MywgIDB4NzUsICAweDAzLAotICAweGZlLCAgMHg0ZSwgIDB4ZTQsICAweDFhLCAgMHg2NCwgIDB4ZmUsICAweDI0LCAgMHgxOCwgIDB4MDUsICAweGZlLCAgMHg5MCwgIDB4MDAsICAweGZlLCAgMHgzYSwgIDB4NDUsICAweDViLAotICAweGZlLCAgMHg0ZSwgIDB4ZTQsICAweGMyLCAgMHg2NCwgIDB4ZmUsICAweDM2LCAgMHgxOCwgIDB4MDUsICAweGZlLCAgMHg5MiwgIDB4MDAsICAweGZlLCAgMHgwMiwgIDB4ZTYsICAweDFiLAotICAweGRjLCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhmZSwgIDB4MGIsICAweDAwLCAgMHg2NCwgIDB4ZmUsICAweDQ4LCAgMHgxOCwgIDB4MDUsICAweGZlLCAgMHg5NCwgIDB4MDAsICAweGZlLAotICAweDAyLCAgMHhlNiwgIDB4MTksICAweGZlLCAgMHgwOCwgIDB4MTAsICAweDA1LCAgMHhmZSwgIDB4OTYsICAweDAwLCAgMHhmZSwgIDB4MDIsICAweGU2LCAgMHgyYywgIDB4ZmUsICAweDRlLAotICAweDQ1LCAgMHhmZSwgIDB4MGMsICAweDEyLCAgMHhhZiwgIDB4ZmYsICAweDA0LCAgMHg2OCwgIDB4NTQsICAweGRlLCAgMHgxYywgIDB4NjksICAweDAzLCAgMHgwNywgIDB4N2EsICAweGZlLAotICAweDVhLCAgMHhmMCwgIDB4ZmUsICAweDc0LCAgMHgxOCwgIDB4MjQsICAweGZlLCAgMHgwOSwgIDB4MDAsICAweGZlLCAgMHgzNCwgIDB4MTAsICAweDA3LCAgMHgxYiwgIDB4ZmUsICAweDVhLAotICAweGYwLCAgMHhmZSwgIDB4ODIsICAweDE4LCAgMHgyNCwgIDB4YzMsICAweGZlLCAgMHgyNiwgIDB4MTAsICAweDA3LCAgMHgxYSwgIDB4NWQsICAweDI0LCAgMHgyYywgIDB4ZGMsICAweDA3LAotICAweDBiLCAgMHg1ZCwgIDB4MjQsICAweDkzLCAgMHhmZSwgIDB4MGUsICAweDEwLCAgMHgwNywgIDB4MDYsICAweDVkLCAgMHgyNCwgIDB4NGQsICAweDlmLCAgMHhhZCwgIDB4MDMsICAweDE0LAotICAweGZlLCAgMHgwOSwgIDB4MDAsICAweDAxLCAgMHgzMywgIDB4ZmUsICAweDA0LCAgMHhmZSwgIDB4N2QsICAweDA1LCAgMHg3ZiwgIDB4ZjksICAweDAzLCAgMHgyNSwgIDB4ZmUsICAweGNhLAotICAweDE4LCAgMHhmZSwgIDB4MTQsICAweGYwLCAgMHgwOCwgIDB4NjUsICAweGZlLCAgMHhjNiwgIDB4MTgsICAweDAzLCAgMHhmZiwgIDB4MWEsICAweDAwLCAgMHgwMCwKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9hZHZfYXNjMzU1MF9idWZbXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweGYyLCAweDAwLCAweGYwLCAweDAwLCAweDE2LCAweDE4LCAweGU0LCAweDAwLCAweGZjLAorCTB4MDEsIDB4MDAsIDB4NDgsIDB4ZTQsCisJMHhiZSwgMHgxOCwgMHgxOCwgMHg4MCwgMHgwMywgMHhmNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhmYSwgMHhmZiwgMHhmZiwKKwkweDI4LCAweDBlLCAweDllLCAweGU3LAorCTB4ZmYsIDB4MDAsIDB4ODIsIDB4ZTcsIDB4MDAsIDB4ZWEsIDB4MDAsIDB4ZjYsIDB4MDEsIDB4ZTYsIDB4MDksIDB4ZTcsCisJMHg1NSwgMHhmMCwgMHgwMSwgMHhmNiwKKwkweDAxLCAweGZhLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweDA0LCAweDAwLCAweDE4LCAweGY0LCAweDEwLCAweDAwLAorCTB4MDAsIDB4ZWMsIDB4ODUsIDB4ZjAsCisJMHhiYywgMHgwMCwgMHhkNSwgMHhmMCwgMHg4ZSwgMHgwYywgMHgzOCwgMHg1NCwgMHgwMCwgMHhlNiwgMHgxZSwgMHhmMCwKKwkweDg2LCAweGYwLCAweGI0LCAweDAwLAorCTB4OTgsIDB4NTcsIDB4ZDAsIDB4MDEsIDB4MGMsIDB4MWMsIDB4M2UsIDB4MWMsIDB4MGMsIDB4MDAsIDB4YmIsIDB4MDAsCisJMHhhYSwgMHgxOCwgMHgwMiwgMHg4MCwKKwkweDMyLCAweGYwLCAweDAxLCAweGZjLCAweDg4LCAweDBjLCAweGM2LCAweDEyLCAweDAyLCAweDEzLCAweDE4LCAweDQwLAorCTB4MDAsIDB4NTcsIDB4MDEsIDB4ZWEsCisJMHgzYywgMHgwMCwgMHg2YywgMHgwMSwgMHg2ZSwgMHgwMSwgMHgwNCwgMHgxMiwgMHgzZSwgMHg1NywgMHgwMCwgMHg4MCwKKwkweDAzLCAweGU2LCAweGI2LCAweDAwLAorCTB4YzAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4M2UsIDB4MDEsIDB4ZGEsIDB4MGYsIDB4MjIsIDB4MTAsIDB4MDgsIDB4MTIsCisJMHgwMiwgMHg0YSwgMHhiOSwgMHg1NCwKKwkweDAzLCAweDU4LCAweDFiLCAweDgwLCAweDMwLCAweGU0LCAweDRiLCAweGU0LCAweDIwLCAweDAwLCAweDMyLCAweDAwLAorCTB4M2UsIDB4MDAsIDB4ODAsIDB4MDAsCisJMHgyNCwgMHgwMSwgMHgzYywgMHgwMSwgMHg2OCwgMHgwMSwgMHg2YSwgMHgwMSwgMHg3MCwgMHgwMSwgMHg3MiwgMHgwMSwKKwkweDc0LCAweDAxLCAweDc2LCAweDAxLAorCTB4NzgsIDB4MDEsIDB4NjIsIDB4MGEsIDB4OTIsIDB4MGMsIDB4MmMsIDB4MTAsIDB4MmUsIDB4MTAsIDB4MDYsIDB4MTMsCisJMHg0YywgMHgxYywgMHhiYiwgMHg1NSwKKwkweDNjLCAweDU2LCAweDA0LCAweDgwLCAweDRhLCAweGU0LCAweDAyLCAweGVlLCAweDViLCAweGYwLCAweGIxLCAweGYwLAorCTB4MDMsIDB4ZjcsIDB4MDYsIDB4ZjcsCisJMHgwMywgMHhmYywgMHgwZiwgMHgwMCwgMHg0MCwgMHgwMCwgMHhiZSwgMHgwMCwgMHgwMCwgMHgwMSwgMHhiMCwgMHgwOCwKKwkweDMwLCAweDEzLCAweDY0LCAweDE1LAorCTB4MzIsIDB4MWMsIDB4MzgsIDB4MWMsIDB4NGUsIDB4MWMsIDB4MTAsIDB4NDQsIDB4MDIsIDB4NDgsIDB4MDAsIDB4NGMsCisJMHgwNCwgMHhlYSwgMHg1ZCwgMHhmMCwKKwkweDA0LCAweGY2LCAweDAyLCAweGZjLCAweDA1LCAweDAwLCAweDM0LCAweDAwLCAweDM2LCAweDAwLCAweDk4LCAweDAwLAorCTB4Y2MsIDB4MDAsIDB4MjAsIDB4MDEsCisJMHg0ZSwgMHgwMSwgMHg0ZSwgMHgwYiwgMHgxZSwgMHgwZSwgMHgwYywgMHgxMCwgMHgwYSwgMHgxMiwgMHgwNCwgMHgxMywKKwkweDQwLCAweDEzLCAweDMwLCAweDFjLAorCTB4MDAsIDB4NGUsIDB4YmQsIDB4NTYsIDB4MDYsIDB4ODMsIDB4MDAsIDB4ZGMsIDB4MDUsIDB4ZjAsIDB4MDksIDB4ZjAsCisJMHg1OSwgMHhmMCwgMHhhNywgMHhmMCwKKwkweGI4LCAweGYwLCAweDBlLCAweGY3LCAweDA2LCAweDAwLCAweDE5LCAweDAwLCAweDMzLCAweDAwLCAweDliLCAweDAwLAorCTB4YTQsIDB4MDAsIDB4YjUsIDB4MDAsCisJMHhiYSwgMHgwMCwgMHhkMCwgMHgwMCwgMHhlMSwgMHgwMCwgMHhlNywgMHgwMCwgMHhkZSwgMHgwMywgMHg1NiwgMHgwYSwKKwkweDE0LCAweDBlLCAweDAyLCAweDEwLAorCTB4MDQsIDB4MTAsIDB4MGEsIDB4MTAsIDB4MzYsIDB4MTAsIDB4MGEsIDB4MTMsIDB4MTIsIDB4MTMsIDB4NTIsIDB4MTMsCisJMHgxMCwgMHgxNSwgMHgxNCwgMHgxNSwKKwkweGFjLCAweDE2LCAweDIwLCAweDFjLCAweDM0LCAweDFjLCAweDM2LCAweDFjLCAweDA4LCAweDQ0LCAweDM4LCAweDQ0LAorCTB4OTEsIDB4NDQsIDB4MGEsIDB4NDUsCisJMHg0OCwgMHg0NiwgMHgwMSwgMHg0OCwgMHg2OCwgMHg1NCwgMHg4MywgMHg1NSwgMHhiMCwgMHg1NywgMHgwMSwgMHg1OCwKKwkweDgzLCAweDU5LCAweDA1LCAweGU2LAorCTB4MGIsIDB4ZjAsIDB4MGMsIDB4ZjAsIDB4NWMsIDB4ZjAsIDB4NGIsIDB4ZjQsIDB4MDQsIDB4ZjgsIDB4MDUsIDB4ZjgsCisJMHgwMiwgMHhmYSwgMHgwMywgMHhmYSwKKwkweDA0LCAweGZjLCAweDA1LCAweGZjLCAweDA3LCAweDAwLCAweDBhLCAweDAwLCAweDBkLCAweDAwLCAweDFjLCAweDAwLAorCTB4OWUsIDB4MDAsIDB4YTgsIDB4MDAsCisJMHhhYSwgMHgwMCwgMHhiOSwgMHgwMCwgMHhlMCwgMHgwMCwgMHgyMiwgMHgwMSwgMHgyNiwgMHgwMSwgMHg3OSwgMHgwMSwKKwkweDdhLCAweDAxLCAweGMwLCAweDAxLAorCTB4YzIsIDB4MDEsIDB4N2MsIDB4MDIsIDB4NWEsIDB4MDMsIDB4ZWEsIDB4MDQsIDB4ZTgsIDB4MDcsIDB4NjgsIDB4MDgsCisJMHg2OSwgMHgwOCwgMHhiYSwgMHgwOCwKKwkweGU5LCAweDA5LCAweDA2LCAweDBiLCAweDNhLCAweDBlLCAweDAwLCAweDEwLCAweDFhLCAweDEwLCAweGVkLCAweDEwLAorCTB4ZjEsIDB4MTAsIDB4MDYsIDB4MTIsCisJMHgwYywgMHgxMywgMHgxNiwgMHgxMywgMHgxZSwgMHgxMywgMHg4MiwgMHgxMywgMHg0MiwgMHgxNCwgMHhkNiwgMHgxNCwKKwkweDhhLCAweDE1LCAweGM2LCAweDE3LAorCTB4ZDIsIDB4MTcsIDB4NmIsIDB4MTgsIDB4MTIsIDB4MWMsIDB4NDYsIDB4MWMsIDB4OWMsIDB4MzIsIDB4MDAsIDB4NDAsCisJMHgwZSwgMHg0NywgMHg0OCwgMHg0NywKKwkweDQxLCAweDQ4LCAweDg5LCAweDQ4LCAweDgwLCAweDRjLCAweDAwLCAweDU0LCAweDQ0LCAweDU1LCAweGU1LCAweDU1LAorCTB4MTQsIDB4NTYsIDB4NzcsIDB4NTcsCisJMHhiZiwgMHg1NywgMHg0MCwgMHg1YywgMHgwNiwgMHg4MCwgMHgwOCwgMHg5MCwgMHgwMywgMHhhMSwgMHhmZSwgMHg5YywKKwkweGYwLCAweDI5LCAweDAyLCAweGZlLAorCTB4YjgsIDB4MGMsIDB4ZmYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4ZDAsIDB4ZmUsIDB4Y2MsIDB4MTgsIDB4MDAsIDB4Y2YsCisJMHhmZSwgMHg4MCwgMHgwMSwgMHhmZiwKKwkweDAzLCAweDAwLCAweDAwLCAweGZlLCAweDkzLCAweDE1LCAweGZlLCAweDBmLCAweDA1LCAweGZmLCAweDM4LCAweDAwLAorCTB4MDAsIDB4ZmUsIDB4NTcsIDB4MjQsCisJMHgwMCwgMHhmZSwgMHg0OCwgMHgwMCwgMHg0ZiwgMHhmZiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHhmZiwgMHgwOSwKKwkweDAwLCAweDAwLCAweGZmLCAweDA4LAorCTB4MDEsIDB4MDEsIDB4ZmYsIDB4MDgsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MTAsCisJMHhmZiwgMHhmZiwgMHhmZiwgMHgwZiwKKwkweDAwLCAweDAwLCAweGZlLCAweDc4LCAweDU2LCAweGZlLCAweDM0LCAweDEyLCAweGZmLCAweDIxLCAweDAwLCAweDAwLAorCTB4ZmUsIDB4MDQsIDB4ZjcsIDB4Y2YsCisJMHgyYSwgMHg2NywgMHgwYiwgMHgwMSwgMHhmZSwgMHhjZSwgMHgwZSwgMHhmZSwgMHgwNCwgMHhmNywgMHhjZiwgMHg2NywKKwkweDBiLCAweDNjLCAweDJhLCAweGZlLAorCTB4M2QsIDB4ZjAsIDB4ZmUsIDB4MDIsIDB4MDIsIDB4ZmUsIDB4MjAsIDB4ZjAsIDB4OWMsIDB4ZmUsIDB4OTEsIDB4ZjAsCisJMHhmZSwgMHhmMCwgMHgwMSwgMHhmZSwKKwkweDkwLCAweGYwLCAweGZlLCAweGYwLCAweDAxLCAweGZlLCAweDhmLCAweGYwLCAweDljLCAweDA1LCAweDUxLCAweDNiLAorCTB4MDIsIDB4ZmUsIDB4ZDQsIDB4MGMsCisJMHgwMSwgMHhmZSwgMHg0NCwgMHgwZCwgMHhmZSwgMHhkZCwgMHgxMiwgMHhmZSwgMHhmYywgMHgxMCwgMHhmZSwgMHgyOCwKKwkweDFjLCAweDA1LCAweGZlLCAweGE2LAorCTB4MDAsIDB4ZmUsIDB4ZDMsIDB4MTIsIDB4NDcsIDB4MTgsIDB4ZmUsIDB4YTYsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4NDgsCisJMHhmMCwgMHhmZSwgMHg4NiwgMHgwMiwKKwkweGZlLCAweDQ5LCAweGYwLCAweGZlLCAweGEwLCAweDAyLCAweGZlLCAweDRhLCAweGYwLCAweGZlLCAweGJlLCAweDAyLAorCTB4ZmUsIDB4NDYsIDB4ZjAsIDB4ZmUsCisJMHg1MCwgMHgwMiwgMHhmZSwgMHg0NywgMHhmMCwgMHhmZSwgMHg1NiwgMHgwMiwgMHhmZSwgMHg0MywgMHhmMCwgMHhmZSwKKwkweDQ0LCAweDAyLCAweGZlLCAweDQ0LAorCTB4ZjAsIDB4ZmUsIDB4NDgsIDB4MDIsIDB4ZmUsIDB4NDUsIDB4ZjAsIDB4ZmUsIDB4NGMsIDB4MDIsIDB4MTcsIDB4MGIsCisJMHhhMCwgMHgxNywgMHgwNiwgMHgxOCwKKwkweDk2LCAweDAyLCAweDI5LCAweGZlLCAweDAwLCAweDFjLCAweGRlLCAweGZlLCAweDAyLCAweDFjLCAweGRkLCAweGZlLAorCTB4MWUsIDB4MWMsIDB4ZmUsIDB4ZTksCisJMHgxMCwgMHgwMSwgMHhmZSwgMHgyMCwgMHgxNywgMHhmZSwgMHhlNywgMHgxMCwgMHhmZSwgMHgwNiwgMHhmYywgMHhjNywKKwkweDBhLCAweDZiLCAweDAxLCAweDllLAorCTB4MDIsIDB4MjksIDB4MTQsIDB4NGQsIDB4MzcsIDB4OTcsIDB4MDEsIDB4ZmUsIDB4NjQsIDB4MGYsIDB4MGEsIDB4NmIsCisJMHgwMSwgMHg4MiwgMHhmZSwgMHhiZCwKKwkweDEwLCAweDBhLCAweDZiLCAweDAxLCAweDgyLCAweGZlLCAweGFkLCAweDEwLCAweGZlLCAweDE2LCAweDFjLCAweGZlLAorCTB4NTgsIDB4MWMsIDB4MTcsIDB4MDYsCisJMHgxOCwgMHg5NiwgMHgyYSwgMHgyNSwgMHgyOSwgMHhmZSwgMHgzZCwgMHhmMCwgMHhmZSwgMHgwMiwgMHgwMiwgMHgyMSwKKwkweGZlLCAweDk0LCAweDAyLCAweGZlLAorCTB4NWEsIDB4MWMsIDB4ZWEsIDB4ZmUsIDB4MTQsIDB4MWMsIDB4MTQsIDB4ZmUsIDB4MzAsIDB4MDAsIDB4MzcsIDB4OTcsCisJMHgwMSwgMHhmZSwgMHg1NCwgMHgwZiwKKwkweDE3LCAweDA2LCAweDE4LCAweDk2LCAweDAyLCAweGQwLCAweDFlLCAweDIwLCAweDA3LCAweDEwLCAweDM0LCAweGZlLAorCTB4NjksIDB4MTAsIDB4MTcsIDB4MDYsCisJMHgxOCwgMHg5NiwgMHhmZSwgMHgwNCwgMHhlYywgMHgyMCwgMHg0NiwgMHgzZCwgMHgxMiwgMHgyMCwgMHhmZSwgMHgwNSwKKwkweGY2LCAweGM3LCAweDAxLCAweGZlLAorCTB4NTIsIDB4MTYsIDB4MDksIDB4NGEsIDB4NGMsIDB4MzUsIDB4MTEsIDB4MmQsIDB4M2MsIDB4OGEsIDB4MDEsIDB4ZTYsCisJMHgwMiwgMHgyOSwgMHgwYSwgMHg0MCwKKwkweDAxLCAweDBlLCAweDA3LCAweDAwLCAweDVkLCAweDAxLCAweDZmLCAweGZlLCAweDE4LCAweDEwLCAweGZlLCAweDQxLAorCTB4NTgsIDB4MGEsIDB4OTksIDB4MDEsCisJMHgwZSwgMHhmZSwgMHhjOCwgMHg1NCwgMHg2NCwgMHhmZSwgMHgwYywgMHgwMywgMHgwMSwgMHhlNiwgMHgwMiwgMHgyOSwKKwkweDJhLCAweDQ2LCAweGZlLCAweDAyLAorCTB4ZTgsIDB4MjcsIDB4ZjgsIDB4ZmUsIDB4OWUsIDB4NDMsIDB4ZjcsIDB4ZmUsIDB4MjcsIDB4ZjAsIDB4ZmUsIDB4ZGMsCisJMHgwMSwgMHhmZSwgMHgwNywgMHg0YiwKKwkweGZlLCAweDIwLCAweGYwLCAweDljLCAweGZlLCAweDQwLCAweDFjLCAweDI1LCAweGQyLCAweGZlLCAweDI2LCAweGYwLAorCTB4ZmUsIDB4NTYsIDB4MDMsIDB4ZmUsCisJMHhhMCwgMHhmMCwgMHhmZSwgMHg0NCwgMHgwMywgMHhmZSwgMHgxMSwgMHhmMCwgMHg5YywgMHhmZSwgMHhlZiwgMHgxMCwKKwkweGZlLCAweDlmLCAweGYwLCAweGZlLAorCTB4NjQsIDB4MDMsIDB4ZWIsIDB4MGYsIDB4ZmUsIDB4MTEsIDB4MDAsIDB4MDIsIDB4NWEsIDB4MmEsIDB4ZmUsIDB4NDgsCisJMHgxYywgMHhlYiwgMHgwOSwgMHgwNCwKKwkweDFkLCAweGZlLCAweDE4LCAweDEzLCAweDIzLCAweDFlLCAweDk4LCAweGFjLCAweDEyLCAweDk4LCAweDBhLCAweDQwLAorCTB4MDEsIDB4MGUsIDB4YWMsIDB4NzUsCisJMHgwMSwgMHhmZSwgMHhiYywgMHgxNSwgMHgxMSwgMHhjYSwgMHgyNSwgMHhkMiwgMHhmZSwgMHgwMSwgMHhmMCwgMHhkMiwKKwkweGZlLCAweDgyLCAweGYwLCAweGZlLAorCTB4OTIsIDB4MDMsIDB4ZWMsIDB4MTEsIDB4ZmUsIDB4ZTQsIDB4MDAsIDB4NjUsIDB4ZmUsIDB4YTQsIDB4MDMsIDB4MjUsCisJMHgzMiwgMHgxZiwgMHhmZSwgMHhiNCwKKwkweDAzLCAweDAxLCAweDQzLCAweGZlLCAweDA2LCAweGYwLCAweGZlLCAweGM0LCAweDAzLCAweDhkLCAweDgxLCAweGZlLAorCTB4MGEsIDB4ZjAsIDB4ZmUsIDB4N2EsCisJMHgwNiwgMHgwMiwgMHgyMiwgMHgwNSwgMHg2YiwgMHgyOCwgMHgxNiwgMHhmZSwgMHhmNiwgMHgwNCwgMHgxNCwgMHgyYywKKwkweDAxLCAweDMzLCAweDhmLCAweGZlLAorCTB4NjYsIDB4MDIsIDB4MDIsIDB4ZDEsIDB4ZWIsIDB4MmEsIDB4NjcsIDB4MWEsIDB4ZmUsIDB4NjcsIDB4MWIsIDB4ZjgsCisJMHhmNywgMHhmZSwgMHg0OCwgMHgxYywKKwkweDcwLCAweDAxLCAweDZlLCAweDg3LCAweDBhLCAweDQwLCAweDAxLCAweDBlLCAweDA3LCAweDAwLCAweDE2LCAweGQzLAorCTB4MGEsIDB4Y2EsIDB4MDEsIDB4MGUsCisJMHg3NCwgMHg2MCwgMHg1OSwgMHg3NiwgMHgyNywgMHgwNSwgMHg2YiwgMHgyOCwgMHhmZSwgMHgxMCwgMHgxMiwgMHgxNCwKKwkweDJjLCAweDAxLCAweDMzLCAweDhmLAorCTB4ZmUsIDB4NjYsIDB4MDIsIDB4MDIsIDB4ZDEsIDB4YmMsIDB4N2QsIDB4YmQsIDB4N2YsIDB4MjUsIDB4MjIsIDB4NjUsCisJMHhmZSwgMHgzYywgMHgwNCwgMHgxZiwKKwkweGZlLCAweDM4LCAweDA0LCAweDY4LCAweGZlLCAweGEwLCAweDAwLCAweGZlLCAweDliLCAweDU3LCAweGZlLCAweDRlLAorCTB4MTIsIDB4MmIsIDB4ZmYsIDB4MDIsCisJMHgwMCwgMHgxMCwgMHgwMSwgMHgwOCwgMHgxZiwgMHhmZSwgMHhlMCwgMHgwNCwgMHgyYiwgMHgwMSwgMHgwOCwgMHgxZiwKKwkweDIyLCAweDMwLCAweDJlLCAweGQ1LAorCTB4ZmUsIDB4NGMsIDB4NDQsIDB4ZmUsIDB4NGMsIDB4MTIsIDB4NjAsIDB4ZmUsIDB4NDQsIDB4NDgsIDB4MTMsIDB4MmMsCisJMHhmZSwgMHg0YywgMHg1NCwgMHg2NCwKKwkweGQzLCAweDQ2LCAweDc2LCAweDI3LCAweGZhLCAweGVmLCAweGZlLCAweDYyLCAweDEzLCAweDA5LCAweDA0LCAweDFkLAorCTB4ZmUsIDB4MmEsIDB4MTMsIDB4MmYsCisJMHgwNywgMHg3ZSwgMHhhNSwgMHhmZSwgMHgyMCwgMHgxMCwgMHgxMywgMHgyYywgMHhmZSwgMHg0YywgMHg1NCwgMHg2NCwKKwkweGQzLCAweGZhLCAweGVmLCAweDg2LAorCTB4MDksIDB4MDQsIDB4MWQsIDB4ZmUsIDB4MDgsIDB4MTMsIDB4MmYsIDB4MDcsIDB4N2UsIDB4NmUsIDB4MDksIDB4MDQsCisJMHgxZCwgMHhmZSwgMHgxYywgMHgxMiwKKwkweDE0LCAweDkyLCAweDA5LCAweDA0LCAweDA2LCAweDNiLCAweDE0LCAweGM0LCAweDAxLCAweDMzLCAweDhmLCAweGZlLAorCTB4NzAsIDB4MGMsIDB4MDIsIDB4MjIsCisJMHgyYiwgMHgxMSwgMHhmZSwgMHhlNiwgMHgwMCwgMHhmZSwgMHgxYywgMHg5MCwgMHhmOSwgMHgwMywgMHgxNCwgMHg5MiwKKwkweDAxLCAweDMzLCAweDAyLCAweDI5LAorCTB4ZmUsIDB4NDIsIDB4NWIsIDB4NjcsIDB4MWEsIDB4ZmUsIDB4NDYsIDB4NTksIDB4ZjgsIDB4ZjcsIDB4ZmUsIDB4ODcsCisJMHg4MCwgMHhmZSwgMHgzMSwgMHhlNCwKKwkweDRmLCAweDA5LCAweDA0LCAweDBiLCAweGZlLCAweDc4LCAweDEzLCAweGZlLCAweDIwLCAweDgwLCAweDA3LCAweDFhLAorCTB4ZmUsIDB4NzAsIDB4MTIsIDB4NDksCisJMHgwNCwgMHgwNiwgMHhmZSwgMHg2MCwgMHgxMywgMHgwNSwgMHhmZSwgMHhhMiwgMHgwMCwgMHgyOCwgMHgxNiwgMHhmZSwKKwkweDgwLCAweDA1LCAweGZlLCAweDMxLAorCTB4ZTQsIDB4NmEsIDB4NDksIDB4MDQsIDB4MGIsIDB4ZmUsIDB4NGEsIDB4MTMsIDB4MDUsIDB4ZmUsIDB4YTAsIDB4MDAsCisJMHgyOCwgMHhmZSwgMHg0MiwgMHgxMiwKKwkweDVlLCAweDAxLCAweDA4LCAweDI1LCAweDMyLCAweGYxLCAweDAxLCAweDA4LCAweDI2LCAweGZlLCAweDk4LCAweDA1LAorCTB4MTEsIDB4ZmUsIDB4ZTMsIDB4MDAsCisJMHgyMywgMHg0OSwgMHhmZSwgMHg0YSwgMHhmMCwgMHhmZSwgMHg2YSwgMHgwNSwgMHhmZSwgMHg0OSwgMHhmMCwgMHhmZSwKKwkweDY0LCAweDA1LCAweDgzLCAweDI0LAorCTB4ZmUsIDB4MjEsIDB4MDAsIDB4YTEsIDB4MjQsIDB4ZmUsIDB4MjIsIDB4MDAsIDB4YTAsIDB4MjQsIDB4NGMsIDB4ZmUsCisJMHgwOSwgMHg0OCwgMHgwMSwgMHgwOCwKKwkweDI2LCAweGZlLCAweDk4LCAweDA1LCAweGZlLCAweGUyLCAweDA4LCAweDQ5LCAweDA0LCAweGM1LCAweDNiLCAweDAxLAorCTB4ODYsIDB4MjQsIDB4MDYsIDB4MTIsCisJMHhjYywgMHgzNywgMHhmZSwgMHgyNywgMHgwMSwgMHgwOSwgMHgwNCwgMHgxZCwgMHhmZSwgMHgyMiwgMHgxMiwgMHg0NywKKwkweDAxLCAweGE3LCAweDE0LCAweDkyLAorCTB4MDksIDB4MDQsIDB4MDYsIDB4M2IsIDB4MTQsIDB4YzQsIDB4MDEsIDB4MzMsIDB4OGYsIDB4ZmUsIDB4NzAsIDB4MGMsCisJMHgwMiwgMHgyMiwgMHgwNSwgMHhmZSwKKwkweDljLCAweDAwLCAweDI4LCAweGZlLCAweDNlLCAweDEyLCAweDA1LCAweDUwLCAweDI4LCAweGZlLCAweDM2LCAweDEzLAorCTB4NDcsIDB4MDEsIDB4YTcsIDB4MjYsCisJMHhmZSwgMHgwOCwgMHgwNiwgMHgwYSwgMHgwNiwgMHg0OSwgMHgwNCwgMHgxOSwgMHhmZSwgMHgwMiwgMHgxMiwgMHg1ZiwKKwkweDAxLCAweGZlLCAweGFhLCAweDE0LAorCTB4MWYsIDB4ZmUsIDB4ZmUsIDB4MDUsIDB4MTEsIDB4OWEsIDB4MDEsIDB4NDMsIDB4MTEsIDB4ZmUsIDB4ZTUsIDB4MDAsCisJMHgwNSwgMHg1MCwgMHhiNCwgMHgwYywKKwkweDUwLCAweDA1LCAweGM2LCAweDI4LCAweGZlLCAweDYyLCAweDEyLCAweDA1LCAweDNmLCAweDI4LCAweGZlLCAweDVhLAorCTB4MTMsIDB4MDEsIDB4ZmUsIDB4MTQsCisJMHgxOCwgMHgwMSwgMHhmZSwgMHg2NiwgMHgxOCwgMHhmZSwgMHg0MywgMHg0OCwgMHhiNywgMHgxOSwgMHgxMywgMHg2YywKKwkweGZmLCAweDAyLCAweDAwLCAweDU3LAorCTB4NDgsIDB4OGIsIDB4MWMsIDB4M2QsIDB4ODUsIDB4YjcsIDB4NjksIDB4NDcsIDB4MDEsIDB4YTcsIDB4MjYsIDB4ZmUsCisJMHg3MiwgMHgwNiwgMHg0OSwgMHgwNCwKKwkweDFiLCAweGRmLCAweDg5LCAweDBhLCAweDRkLCAweDAxLCAweGZlLCAweGQ4LCAweDE0LCAweDFmLCAweGZlLCAweDY4LAorCTB4MDYsIDB4MTEsIDB4OWEsIDB4MDEsCisJMHg0MywgMHgxMSwgMHhmZSwgMHhlNSwgMHgwMCwgMHgwNSwgMHgzZiwgMHhiNCwgMHgwYywgMHgzZiwgMHgxNywgMHgwNiwKKwkweDAxLCAweGE3LCAweGVjLCAweDcyLAorCTB4NzAsIDB4MDEsIDB4NmUsIDB4ODcsIDB4MTEsIDB4ZmUsIDB4ZTIsIDB4MDAsIDB4MDEsIDB4MDgsIDB4MjUsIDB4MzIsCisJMHhmZSwgMHgwYSwgMHhmMCwgMHhmZSwKKwkweGE2LCAweDA2LCAweDhjLCAweGZlLCAweDVjLCAweDA3LCAweGZlLCAweDA2LCAweGYwLCAweGZlLCAweDY0LCAweDA3LAorCTB4OGQsIDB4ODEsIDB4MDIsIDB4MjIsCisJMHgwOSwgMHgwNCwgMHgwYiwgMHhmZSwgMHgyZSwgMHgxMiwgMHgxNSwgMHgxYSwgMHgwMSwgMHgwOCwgMHgxNSwgMHgwMCwKKwkweDAxLCAweDA4LCAweDE1LCAweDAwLAorCTB4MDEsIDB4MDgsIDB4MTUsIDB4MDAsIDB4MDEsIDB4MDgsIDB4ZmUsIDB4OTksIDB4YTQsIDB4MDEsIDB4MDgsIDB4MTUsCisJMHgwMCwgMHgwMiwgMHhmZSwgMHgzMiwKKwkweDA4LCAweDYxLCAweDA0LCAweDFiLCAweGZlLCAweDM4LCAweDEyLCAweDA5LCAweDA0LCAweDFiLCAweDZlLCAweDE1LAorCTB4ZmUsIDB4MWIsIDB4MDAsIDB4MDEsCisJMHgwOCwgMHgxNSwgMHgwMCwgMHgwMSwgMHgwOCwgMHgxNSwgMHgwMCwgMHgwMSwgMHgwOCwgMHgxNSwgMHgwMCwgMHgwMSwKKwkweDA4LCAweDE1LCAweDA2LCAweDAxLAorCTB4MDgsIDB4MTUsIDB4MDAsIDB4MDIsIDB4ZDksIDB4NjYsIDB4NGMsIDB4ZmUsIDB4M2EsIDB4NTUsIDB4NWYsIDB4ZmUsCisJMHg5YSwgMHg4MSwgMHg0YiwgMHgxZCwKKwkweGJhLCAweGZlLCAweDMyLCAweDA3LCAweDBhLCAweDFkLCAweGZlLCAweDA5LCAweDZmLCAweGFmLCAweGZlLCAweGNhLAorCTB4NDUsIDB4ZmUsIDB4MzIsIDB4MTIsCisJMHg2MiwgMHgyYywgMHg4NSwgMHg2NiwgMHg3YiwgMHgwMSwgMHgwOCwgMHgyNSwgMHgzMiwgMHhmZSwgMHgwYSwgMHhmMCwKKwkweGZlLCAweDMyLCAweDA3LCAweDhkLAorCTB4ODEsIDB4OGMsIDB4ZmUsIDB4NWMsIDB4MDcsIDB4MDIsIDB4MjIsIDB4MDEsIDB4NDMsIDB4MDIsIDB4ZmUsIDB4OGEsCisJMHgwNiwgMHgxNSwgMHgxOSwgMHgwMiwKKwkweGZlLCAweDhhLCAweDA2LCAweGZlLCAweDljLCAweGY3LCAweGQ0LCAweGZlLCAweDJjLCAweDkwLCAweGZlLCAweGFlLAorCTB4OTAsIDB4NzcsIDB4ZmUsIDB4Y2EsCisJMHgwNywgMHgwYywgMHg1NCwgMHgxOCwgMHg1NSwgMHgwOSwgMHg0YSwgMHg2YSwgMHgzNSwgMHgxZSwgMHgyMCwgMHgwNywKKwkweDEwLCAweGZlLCAweDBlLCAweDEyLAorCTB4NzQsIDB4ZmUsIDB4ODAsIDB4ODAsIDB4MzcsIDB4MjAsIDB4NjMsIDB4MjcsIDB4ZmUsIDB4MDYsIDB4MTAsIDB4ZmUsCisJMHg4MywgMHhlNywgMHhjNCwgMHhhMSwKKwkweGZlLCAweDAzLCAweDQwLCAweDA5LCAweDRhLCAweDRmLCAweDM1LCAweDAxLCAweGE4LCAweGFkLCAweGZlLCAweDFmLAorCTB4NDAsIDB4MTIsIDB4NTgsIDB4MDEsCisJMHhhNSwgMHhmZSwgMHgwOCwgMHg1MCwgMHhmZSwgMHg4YSwgMHg1MCwgMHhmZSwgMHg0NCwgMHg1MSwgMHhmZSwgMHhjNiwKKwkweDUxLCAweDgzLCAweGZiLCAweGZlLAorCTB4OGEsIDB4OTAsIDB4MGMsIDB4NTIsIDB4MTgsIDB4NTMsIDB4ZmUsIDB4MGMsIDB4OTAsIDB4ZmUsIDB4OGUsIDB4OTAsCisJMHhmZSwgMHg0MCwgMHg1MCwgMHhmZSwKKwkweGMyLCAweDUwLCAweDBjLCAweDM5LCAweDE4LCAweDNhLCAweGZlLCAweDRhLCAweDEwLCAweDA5LCAweDA0LCAweDZhLAorCTB4ZmUsIDB4MmEsIDB4MTIsIDB4ZmUsCisJMHgyYywgMHg5MCwgMHhmZSwgMHhhZSwgMHg5MCwgMHgwYywgMHg1NCwgMHgxOCwgMHg1NSwgMHgwOSwgMHgwNCwgMHg0ZiwKKwkweDg1LCAweDAxLCAweGE4LCAweGZlLAorCTB4MWYsIDB4ODAsIDB4MTIsIDB4NTgsIDB4ZmUsIDB4NDQsIDB4OTAsIDB4ZmUsIDB4YzYsIDB4OTAsIDB4MGMsIDB4NTYsCisJMHgxOCwgMHg1NywgMHhmYiwgMHhmZSwKKwkweDhhLCAweDkwLCAweDBjLCAweDUyLCAweDE4LCAweDUzLCAweGZlLCAweDQwLCAweDkwLCAweGZlLCAweGMyLCAweDkwLAorCTB4MGMsIDB4MzksIDB4MTgsIDB4M2EsCisJMHgwYywgMHgzOCwgMHgxOCwgMHg0ZSwgMHgwOSwgMHg0YSwgMHgxOSwgMHgzNSwgMHgyYSwgMHgxMywgMHhmZSwgMHg0ZSwKKwkweDExLCAweDY1LCAweGZlLCAweDQ4LAorCTB4MDgsIDB4ZmUsIDB4OWUsIDB4ZjAsIDB4ZmUsIDB4NWMsIDB4MDgsIDB4YjEsIDB4MTYsIDB4MzIsIDB4MmEsIDB4NzMsCisJMHhkZCwgMHhiOCwgMHhmZSwgMHg4MCwKKwkweDA4LCAweGI5LCAweGZlLCAweDllLCAweDA4LCAweDhjLCAweGZlLCAweDc0LCAweDA4LCAweGZlLCAweDA2LCAweGYwLAorCTB4ZmUsIDB4N2EsIDB4MDgsIDB4OGQsCisJMHg4MSwgMHgwMiwgMHgyMiwgMHgwMSwgMHg0MywgMHhmZSwgMHhjOSwgMHgxMCwgMHgxNSwgMHgxOSwgMHhmZSwgMHhjOSwKKwkweDEwLCAweDYxLCAweDA0LCAweDA2LAorCTB4ZmUsIDB4MTAsIDB4MTIsIDB4NjEsIDB4MDQsIDB4MGIsIDB4NDUsIDB4MDksIDB4MDQsIDB4MGIsIDB4ZmUsIDB4NjgsCisJMHgxMiwgMHhmZSwgMHgyZSwgMHgxYywKKwkweDAyLCAweGZlLCAweDI0LCAweDBhLCAweDYxLCAweDA0LCAweDA2LCAweDQ1LCAweDYxLCAweDA0LCAweDBiLCAweGZlLAorCTB4NTIsIDB4MTIsIDB4ZmUsIDB4MmMsCisJMHgxYywgMHhmZSwgMHhhYSwgMHhmMCwgMHhmZSwgMHgxZSwgMHgwOSwgMHhmZSwgMHhhYywgMHhmMCwgMHhmZSwgMHhiZSwKKwkweDA4LCAweGZlLCAweDhhLCAweDEwLAorCTB4YWEsIDB4ZmUsIDB4ZjMsIDB4MTAsIDB4ZmUsIDB4YWQsIDB4ZjAsIDB4ZmUsIDB4Y2EsIDB4MDgsIDB4MDIsIDB4ZmUsCisJMHgyNCwgMHgwYSwgMHhhYiwgMHhmZSwKKwkweGU3LCAweDEwLCAweGZlLCAweDJiLCAweGYwLCAweDlkLCAweGU5LCAweDFjLCAweGZlLCAweDAwLCAweGZlLCAweGZlLAorCTB4MWMsIDB4MTIsIDB4YjUsIDB4ZmUsCisJMHhkMiwgMHhmMCwgMHg5ZCwgMHhmZSwgMHg3NiwgMHgxOCwgMHgxYywgMHgxYSwgMHgxNiwgMHg5ZCwgMHgwNSwgMHhjYiwKKwkweDFjLCAweDA2LCAweDE2LCAweDlkLAorCTB4YjgsIDB4NmQsIDB4YjksIDB4NmQsIDB4YWEsIDB4YWIsIDB4ZmUsIDB4YjEsIDB4MTAsIDB4NzAsIDB4NWUsIDB4MmIsCisJMHgxNCwgMHg5MiwgMHgwMSwgMHgzMywKKwkweDBmLCAweGZlLCAweDM1LCAweDAwLCAweGZlLCAweDAxLCAweGYwLCAweDVhLCAweDBmLCAweDdjLCAweDAyLCAweDVhLAorCTB4ZmUsIDB4NzQsIDB4MTgsIDB4MWMsCisJMHhmZSwgMHgwMCwgMHhmOCwgMHgxNiwgMHg2ZCwgMHg2NywgMHgxYiwgMHgwMSwgMHhmZSwgMHg0NCwgMHgwZCwgMHgzYiwKKwkweDAxLCAweGU2LCAweDFlLCAweDI3LAorCTB4NzQsIDB4NjcsIDB4MWEsIDB4MDIsIDB4NmQsIDB4MDksIDB4MDQsIDB4MGIsIDB4MjEsIDB4ZmUsIDB4MDYsIDB4MGEsCisJMHgwOSwgMHgwNCwgMHg2YSwgMHhmZSwKKwkweDgyLCAweDEyLCAweDA5LCAweDA0LCAweDE5LCAweGZlLCAweDY2LCAweDEzLCAweDFlLCAweDU4LCAweGFjLCAweGZjLAorCTB4ZmUsIDB4ODMsIDB4ODAsIDB4ZmUsCisJMHhjOCwgMHg0NCwgMHhmZSwgMHgyZSwgMHgxMywgMHhmZSwgMHgwNCwgMHg5MSwgMHhmZSwgMHg4NiwgMHg5MSwgMHg2MywKKwkweDI3LCAweGZlLCAweDQwLCAweDU5LAorCTB4ZmUsIDB4YzEsIDB4NTksIDB4NzcsIDB4ZDcsIDB4MDUsIDB4NTQsIDB4MzEsIDB4NTUsIDB4MGMsIDB4N2IsIDB4MTgsCisJMHg3YywgMHhiZSwgMHg1NCwgMHhiZiwKKwkweDU1LCAweDAxLCAweGE4LCAweGFkLCAweDYzLCAweDI3LCAweDEyLCAweDU4LCAweGMwLCAweDM4LCAweGMxLCAweDRlLAorCTB4NzksIDB4NTYsIDB4NjgsIDB4NTcsCisJMHhmNCwgMHhmNSwgMHhmZSwgMHgwNCwgMHhmYSwgMHgzOCwgMHhmZSwgMHgwNSwgMHhmYSwgMHg0ZSwgMHgwMSwgMHhhNSwKKwkweGEyLCAweDIzLCAweDBjLCAweDdiLAorCTB4MGMsIDB4N2MsIDB4NzksIDB4NTYsIDB4NjgsIDB4NTcsIDB4ZmUsIDB4MTIsIDB4MTAsIDB4MDksIDB4MDQsIDB4MTksCisJMHgxNiwgMHhkNywgMHg3OSwgMHgzOSwKKwkweDY4LCAweDNhLCAweDA5LCAweDA0LCAweGZlLCAweGY3LCAweDAwLCAweDM1LCAweDA1LCAweDUyLCAweDMxLCAweDUzLAorCTB4ZmUsIDB4MTAsIDB4NTgsIDB4ZmUsCisJMHg5MSwgMHg1OCwgMHhmZSwgMHgxNCwgMHg1OSwgMHhmZSwgMHg5NSwgMHg1OSwgMHgwMiwgMHg2ZCwgMHgwOSwgMHgwNCwKKwkweDE5LCAweDE2LCAweGQ3LCAweDA5LAorCTB4MDQsIDB4ZmUsIDB4ZjcsIDB4MDAsIDB4MzUsIDB4ZmUsIDB4M2EsIDB4NTUsIDB4ZmUsIDB4MTksIDB4ODEsIDB4NWYsCisJMHhmZSwgMHgxMCwgMHg5MCwgMHhmZSwKKwkweDkyLCAweDkwLCAweGZlLCAweGQ3LCAweDEwLCAweDJmLCAweDA3LCAweDliLCAweDE2LCAweGZlLCAweGM2LCAweDA4LAorCTB4MTEsIDB4OWIsIDB4MDksIDB4MDQsCisJMHgwYiwgMHhmZSwgMHgxNCwgMHgxMywgMHgwNSwgMHgzOSwgMHgzMSwgMHgzYSwgMHg3NywgMHhmZSwgMHhjNiwgMHgwOCwKKwkweGZlLCAweDBjLCAweDU4LCAweGZlLAorCTB4OGQsIDB4NTgsIDB4MDIsIDB4NmQsIDB4MjMsIDB4NDcsIDB4ZmUsIDB4MTksIDB4ODAsIDB4ZGUsIDB4MDksIDB4MDQsCisJMHgwYiwgMHhmZSwgMHgxYSwgMHgxMiwKKwkweGZlLCAweDZjLCAweDE5LCAweGZlLCAweDE5LCAweDQxLCAweGU5LCAweGI1LCAweGZlLCAweGQxLCAweGYwLCAweGQ5LAorCTB4MTQsIDB4N2EsIDB4MDEsIDB4MzMsCisJMHgwZiwgMHhmZSwgMHg0NCwgMHgwMCwgMHhmZSwgMHg4ZSwgMHgxMCwgMHhmZSwgMHg2YywgMHgxOSwgMHhiZSwgMHgzOSwKKwkweGZlLCAweGVkLCAweDE5LCAweGJmLAorCTB4M2EsIDB4ZmUsIDB4MGMsIDB4NTEsIDB4ZmUsIDB4OGUsIDB4NTEsIDB4ZTksIDB4MWMsIDB4ZmUsIDB4MDAsIDB4ZmYsCisJMHgzNCwgMHhmZSwgMHg3NCwgMHgxMCwKKwkweGI1LCAweGZlLCAweGQyLCAweGYwLCAweGZlLCAweGIyLCAweDBhLCAweGZlLCAweDc2LCAweDE4LCAweDFjLCAweDFhLAorCTB4ODQsIDB4MDUsIDB4Y2IsIDB4MWMsCisJMHgwNiwgMHhmZSwgMHgwOCwgMHgxMywgMHgwZiwgMHhmZSwgMHgxNiwgMHgwMCwgMHgwMiwgMHg1YSwgMHhmZSwgMHhkMSwKKwkweGYwLCAweGZlLCAweGM0LCAweDBhLAorCTB4MTQsIDB4N2EsIDB4MDEsIDB4MzMsIDB4MGYsIDB4ZmUsIDB4MTcsIDB4MDAsIDB4ZmUsIDB4NDIsIDB4MTAsIDB4ZmUsCisJMHhjZSwgMHhmMCwgMHhmZSwgMHhjYSwKKwkweDBhLCAweGZlLCAweDNjLCAweDEwLCAweGZlLCAweGNkLCAweGYwLCAweGZlLCAweGQ2LCAweDBhLCAweDBmLCAweGZlLAorCTB4MjIsIDB4MDAsIDB4MDIsIDB4NWEsCisJMHhmZSwgMHhjYiwgMHhmMCwgMHhmZSwgMHhlMiwgMHgwYSwgMHgwZiwgMHhmZSwgMHgyNCwgMHgwMCwgMHgwMiwgMHg1YSwKKwkweGZlLCAweGQwLCAweGYwLCAweGZlLAorCTB4ZWMsIDB4MGEsIDB4MGYsIDB4OTMsIDB4ZGMsIDB4ZmUsIDB4Y2YsIDB4ZjAsIDB4ZmUsIDB4ZjYsIDB4MGEsIDB4MGYsCisJMHg0YywgMHhmZSwgMHgxMCwgMHgxMCwKKwkweGZlLCAweGNjLCAweGYwLCAweGQ5LCAweDYxLCAweDA0LCAweDE5LCAweDNiLCAweDBmLCAweGZlLCAweDEyLCAweDAwLAorCTB4MmEsIDB4MTMsIDB4ZmUsIDB4NGUsCisJMHgxMSwgMHg2NSwgMHhmZSwgMHgwYywgMHgwYiwgMHhmZSwgMHg5ZSwgMHhmMCwgMHhmZSwgMHgyMCwgMHgwYiwgMHhiMSwKKwkweDE2LCAweDMyLCAweDJhLCAweDczLAorCTB4ZGQsIDB4YjgsIDB4MjIsIDB4YjksIDB4MjIsIDB4MmEsIDB4ZWMsIDB4NjUsIDB4ZmUsIDB4MmMsIDB4MGIsIDB4MjUsCisJMHgzMiwgMHg4YywgMHhmZSwgMHg0OCwKKwkweDBiLCAweDhkLCAweDgxLCAweGI4LCAweGQ0LCAweGI5LCAweGQ0LCAweDAyLCAweDIyLCAweDAxLCAweDQzLCAweGZlLAorCTB4ZGIsIDB4MTAsIDB4MTEsIDB4ZmUsCisJMHhlOCwgMHgwMCwgMHhhYSwgMHhhYiwgMHg3MCwgMHhiYywgMHg3ZCwgMHhiZCwgMHg3ZiwgMHhmZSwgMHg4OSwgMHhmMCwKKwkweDIyLCAweDMwLCAweDJlLCAweGQ4LAorCTB4YmMsIDB4N2QsIDB4YmQsIDB4N2YsIDB4MDEsIDB4MDgsIDB4MWYsIDB4MjIsIDB4MzAsIDB4MmUsIDB4ZDYsIDB4YjEsCisJMHg0NSwgMHgwZiwgMHhmZSwgMHg0MiwKKwkweDAwLCAweDAyLCAweDVhLCAweDc4LCAweDA2LCAweGZlLCAweDgxLCAweDQ5LCAweDE2LCAweGZlLCAweDM4LCAweDBjLAorCTB4MDksIDB4MDQsIDB4MGIsIDB4ZmUsCisJMHg0NCwgMHgxMywgMHgwZiwgMHgwMCwgMHg0YiwgMHgwYiwgMHhmZSwgMHg1NCwgMHgxMiwgMHg0YiwgMHhmZSwgMHgyOCwKKwkweDAwLCAweDIxLCAweGZlLCAweGE2LAorCTB4MGMsIDB4MGEsIDB4NDAsIDB4MDEsIDB4MGUsIDB4MDcsIDB4MDAsIDB4NWQsIDB4M2UsIDB4ZmUsIDB4MjgsIDB4MDAsCisJMHhmZSwgMHhlMiwgMHgxMCwgMHgwMSwKKwkweGU3LCAweDAxLCAweGU4LCAweDBhLCAweDk5LCAweDAxLCAweGZlLCAweDMyLCAweDBlLCAweDU5LCAweDExLCAweDJkLAorCTB4MDEsIDB4NmYsIDB4MDIsIDB4MjksCisJMHgwZiwgMHhmZSwgMHg0NCwgMHgwMCwgMHg0YiwgMHgwYiwgMHhkZiwgMHgzZSwgMHgwYiwgMHhmZSwgMHhiNCwgMHgxMCwKKwkweDAxLCAweDg2LCAweDNlLCAweDBiLAorCTB4ZmUsIDB4YWEsIDB4MTAsIDB4MDEsIDB4ODYsIDB4ZmUsIDB4MTksIDB4ODIsIDB4ZmUsIDB4MzQsIDB4NDYsIDB4YTMsCisJMHgzZSwgMHgwYiwgMHgwZiwgMHhmZSwKKwkweDQzLCAweDAwLCAweGZlLCAweDk2LCAweDEwLCAweDA5LCAweDRhLCAweDBiLCAweDM1LCAweDAxLCAweGU3LCAweDAxLAorCTB4ZTgsIDB4NTksIDB4MTEsIDB4MmQsCisJMHgwMSwgMHg2ZiwgMHg2NywgMHgwYiwgMHg1OSwgMHgzYywgMHg4YSwgMHgwMiwgMHhmZSwgMHgyYSwgMHgwMywgMHgwOSwKKwkweDA0LCAweDBiLCAweDg0LCAweDNlLAorCTB4MGIsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4NWMsIDB4MTAsIDB4NjEsIDB4MDQsIDB4MWIsIDB4ZmUsIDB4NTgsIDB4MTIsCisJMHgwOSwgMHgwNCwgMHgxYiwgMHhmZSwKKwkweDUwLCAweDEzLCAweGZlLCAweDFjLCAweDFjLCAweGZlLCAweDlkLCAweGYwLCAweGZlLCAweDVjLCAweDBjLCAweGZlLAorCTB4MWMsIDB4MWMsIDB4ZmUsIDB4OWQsCisJMHhmMCwgMHhmZSwgMHg2MiwgMHgwYywgMHgwOSwgMHg0YSwgMHgxYiwgMHgzNSwgMHhmZSwgMHhhOSwgMHgxMCwgMHgwZiwKKwkweGZlLCAweDE1LCAweDAwLCAweGZlLAorCTB4MDQsIDB4ZTYsIDB4MGIsIDB4NWYsIDB4NWMsIDB4MGYsIDB4ZmUsIDB4MTMsIDB4MDAsIDB4ZmUsIDB4MTAsIDB4MTAsCisJMHgwZiwgMHhmZSwgMHg0NywgMHgwMCwKKwkweGExLCAweDBmLCAweGZlLCAweDQxLCAweDAwLCAweGEwLCAweDBmLCAweGZlLCAweDI0LCAweDAwLCAweDg3LCAweGFhLAorCTB4YWIsIDB4NzAsIDB4MDUsIDB4NmIsCisJMHgyOCwgMHgyMSwgMHhkMSwgMHg1ZiwgMHhmZSwgMHgwNCwgMHhlNiwgMHgxYiwgMHhmZSwgMHg5ZCwgMHg0MSwgMHhmZSwKKwkweDFjLCAweDQyLCAweDU5LCAweDAxLAorCTB4ZGEsIDB4MDIsIDB4MjksIDB4ZWEsIDB4MTQsIDB4MGIsIDB4MzcsIDB4OTUsIDB4YTksIDB4MTQsIDB4ZmUsIDB4MzEsCisJMHgwMCwgMHgzNywgMHg5NywgMHgwMSwKKwkweGZlLCAweDU0LCAweDBmLCAweDAyLCAweGQwLCAweDNjLCAweGZlLCAweDA2LCAweGVjLCAweGM5LCAweGVlLCAweDNlLAorCTB4MWQsIDB4ZmUsIDB4Y2UsIDB4NDUsCisJMHgzNCwgMHgzYywgMHhmZSwgMHgwNiwgMHhlYSwgMHhjOSwgMHhmZSwgMHg0NywgMHg0YiwgMHg4OSwgMHhmZSwgMHg3NSwKKwkweDU3LCAweDA1LCAweDUxLCAweGZlLAorCTB4OTgsIDB4NTYsIDB4ZmUsIDB4MzgsIDB4MTIsIDB4MGEsIDB4NDIsIDB4MDEsIDB4MGUsIDB4ZmUsIDB4NDQsIDB4NDgsCisJMHg0NiwgMHgwOSwgMHgwNCwgMHgxZCwKKwkweGZlLCAweDFhLCAweDEzLCAweDBhLCAweDQwLCAweDAxLCAweDBlLCAweDQ3LCAweGZlLCAweDQxLCAweDU4LCAweDBhLAorCTB4OTksIDB4MDEsIDB4MGUsIDB4ZmUsCisJMHg0OSwgMHg1NCwgMHg4ZSwgMHhmZSwgMHgyYSwgMHgwZCwgMHgwMiwgMHhmZSwgMHgyYSwgMHgwMywgMHgwYSwgMHg1MSwKKwkweGZlLCAweGVlLCAweDE0LCAweGVlLAorCTB4M2UsIDB4MWQsIDB4ZmUsIDB4Y2UsIDB4NDUsIDB4MzQsIDB4M2MsIDB4ZmUsIDB4Y2UsIDB4NDcsIDB4ZmUsIDB4YWQsCisJMHgxMywgMHgwMiwgMHgyOSwgMHgxZSwKKwkweDIwLCAweDA3LCAweDEwLCAweGZlLCAweDllLCAweDEyLCAweDIzLCAweDEyLCAweDRkLCAweDEyLCAweDk0LCAweDEyLAorCTB4Y2UsIDB4MWUsIDB4MmQsIDB4NDcsCisJMHgzNywgMHgyZCwgMHhiMSwgMHhlMCwgMHhmZSwgMHhiYywgMHhmMCwgMHhmZSwgMHhlYywgMHgwZCwgMHgxMywgMHgwNiwKKwkweDEyLCAweDRkLCAweDAxLCAweGZlLAorCTB4ZTIsIDB4MTUsIDB4MDUsIDB4ZmUsIDB4MzgsIDB4MDEsIDB4MzEsIDB4ZmUsIDB4M2EsIDB4MDEsIDB4NzcsIDB4ZmUsCisJMHhmMCwgMHgwZCwgMHhmZSwgMHgwMiwKKwkweGVjLCAweGNlLCAweDYyLCAweDAwLCAweDVkLCAweGZlLCAweDA0LCAweGVjLCAweDIwLCAweDQ2LCAweGZlLCAweDA1LAorCTB4ZjYsIDB4ZmUsIDB4MzQsIDB4MDEsCisJMHgwMSwgMHhmZSwgMHg1MiwgMHgxNiwgMHhmYiwgMHhmZSwgMHg0OCwgMHhmNCwgMHgwZCwgMHhmZSwgMHgxOCwgMHgxMywKKwkweGFmLCAweGZlLCAweDAyLCAweGVhLAorCTB4Y2UsIDB4NjIsIDB4N2EsIDB4ZmUsIDB4YzUsIDB4MTMsIDB4MTQsIDB4MWIsIDB4MzcsIDB4OTUsIDB4YTksIDB4NWMsCisJMHgwNSwgMHhmZSwgMHgzOCwgMHgwMSwKKwkweDFjLCAweGZlLCAweGYwLCAweGZmLCAweDBjLCAweGZlLCAweDYwLCAweDAxLCAweDA1LCAweGZlLCAweDNhLCAweDAxLAorCTB4MGMsIDB4ZmUsIDB4NjIsIDB4MDEsCisJMHgzZCwgMHgxMiwgMHgyMCwgMHgyNCwgMHgwNiwgMHgxMiwgMHgyZCwgMHgxMSwgMHgyZCwgMHg4YSwgMHgxMywgMHgwNiwKKwkweDAzLCAweDIzLCAweDAzLCAweDFlLAorCTB4NGQsIDB4ZmUsIDB4ZjcsIDB4MTIsIDB4MWUsIDB4OTQsIDB4YWMsIDB4MTIsIDB4OTQsIDB4MDcsIDB4N2EsIDB4ZmUsCisJMHg3MSwgMHgxMywgMHhmZSwgMHgyNCwKKwkweDFjLCAweDE0LCAweDFhLCAweDM3LCAweDk1LCAweGE5LCAweGZlLCAweGQ5LCAweDEwLCAweGI2LCAweGZlLCAweDAzLAorCTB4ZGMsIDB4ZmUsIDB4NzMsIDB4NTcsCisJMHhmZSwgMHg4MCwgMHg1ZCwgMHgwMywgMHhiNiwgMHhmZSwgMHgwMywgMHhkYywgMHhmZSwgMHg1YiwgMHg1NywgMHhmZSwKKwkweDgwLCAweDVkLCAweDAzLCAweGZlLAorCTB4MDMsIDB4NTcsIDB4YjYsIDB4MjMsIDB4ZmUsIDB4MDAsIDB4Y2MsIDB4MDMsIDB4ZmUsIDB4MDMsIDB4NTcsIDB4YjYsCisJMHg3NSwgMHgwMywgMHgwOSwgMHgwNCwKKwkweDRjLCAweGZlLCAweDIyLCAweDEzLCAweGZlLCAweDFjLCAweDgwLCAweDA3LCAweDA2LCAweGZlLCAweDFhLCAweDEzLAorCTB4ZmUsIDB4MWUsIDB4ODAsIDB4ZTEsCisJMHhmZSwgMHgxZCwgMHg4MCwgMHhhNCwgMHhmZSwgMHgwYywgMHg5MCwgMHhmZSwgMHgwZSwgMHgxMywgMHhmZSwgMHgwZSwKKwkweDkwLCAweGEzLCAweGZlLCAweDNjLAorCTB4OTAsIDB4ZmUsIDB4MzAsIDB4ZjQsIDB4MGIsIDB4ZmUsIDB4M2MsIDB4NTAsIDB4YTAsIDB4MDEsIDB4ZmUsIDB4ODIsCisJMHgxNiwgMHgyZiwgMHgwNywgMHgyZCwKKwkweGUwLCAweDAxLCAweGZlLCAweGJjLCAweDE1LCAweDA5LCAweDA0LCAweDFkLCAweDQ1LCAweDAxLCAweGU3LCAweDAxLAorCTB4ZTgsIDB4MTEsIDB4ZmUsIDB4ZTksCisJMHgwMCwgMHgwOSwgMHgwNCwgMHg0YywgMHhmZSwgMHgyYywgMHgxMywgMHgwMSwgMHhmZSwgMHgxNCwgMHgxNiwgMHhmZSwKKwkweDFlLCAweDFjLCAweGZlLCAweDE0LAorCTB4OTAsIDB4ZmUsIDB4OTYsIDB4OTAsIDB4MGMsIDB4ZmUsIDB4NjQsIDB4MDEsIDB4MTgsIDB4ZmUsIDB4NjYsIDB4MDEsCisJMHgwOSwgMHgwNCwgMHg0ZiwgMHhmZSwKKwkweDEyLCAweDEyLCAweGZlLCAweDAzLCAweDgwLCAweDc0LCAweGZlLCAweDAxLCAweGVjLCAweDIwLCAweGZlLCAweDgwLAorCTB4NDAsIDB4MTIsIDB4MjAsIDB4NjMsCisJMHgyNywgMHgxMSwgMHhjOCwgMHg1OSwgMHgxZSwgMHgyMCwgMHhlZCwgMHg3NiwgMHgyMCwgMHgwMywgMHhmZSwgMHgwOCwKKwkweDFjLCAweDA1LCAweGZlLCAweGFjLAorCTB4MDAsIDB4ZmUsIDB4MDYsIDB4NTgsIDB4MDUsIDB4ZmUsIDB4YWUsIDB4MDAsIDB4ZmUsIDB4MDcsIDB4NTgsIDB4MDUsCisJMHhmZSwgMHhiMCwgMHgwMCwgMHhmZSwKKwkweDA4LCAweDU4LCAweDA1LCAweGZlLCAweGIyLCAweDAwLCAweGZlLCAweDA5LCAweDU4LCAweGZlLCAweDBhLCAweDFjLAorCTB4MjQsIDB4NjksIDB4MTIsIDB4YzksCisJMHgyMywgMHgwYywgMHg1MCwgMHgwYywgMHgzZiwgMHgxMywgMHg0MCwgMHg0OCwgMHg1ZiwgMHgxNywgMHgxZCwgMHhmZSwKKwkweDkwLCAweDRkLCAweGZlLCAweDkxLAorCTB4NTQsIDB4MjEsIDB4ZmUsIDB4MDgsIDB4MGYsIDB4M2UsIDB4MTAsIDB4MTMsIDB4NDIsIDB4NDgsIDB4MTcsIDB4NGMsCisJMHhmZSwgMHg5MCwgMHg0ZCwgMHhmZSwKKwkweDkxLCAweDU0LCAweDIxLCAweGZlLCAweDFlLCAweDBmLCAweDI0LCAweDEwLCAweDEyLCAweDIwLCAweDc4LCAweDJjLAorCTB4NDYsIDB4MWUsIDB4MjAsIDB4ZWQsCisJMHg3NiwgMHgyMCwgMHgxMSwgMHhjOCwgMHhmNiwgMHhmZSwgMHhkNiwgMHhmMCwgMHhmZSwgMHgzMiwgMHgwZiwgMHhlYSwKKwkweDcwLCAweGZlLCAweDE0LCAweDFjLAorCTB4ZmUsIDB4MTAsIDB4MWMsIDB4ZmUsIDB4MTgsIDB4MWMsIDB4MDMsIDB4M2MsIDB4ZmUsIDB4MGMsIDB4MTQsIDB4ZWUsCisJMHhmZSwgMHgwNywgMHhlNiwgMHgxZCwKKwkweGZlLCAweGNlLCAweDQ3LCAweGZlLCAweGY1LCAweDEzLCAweDAzLCAweDAxLCAweDg2LCAweDc4LCAweDJjLCAweDQ2LAorCTB4ZmEsIDB4ZWYsIDB4ZmUsIDB4NDIsCisJMHgxMywgMHgyZiwgMHgwNywgMHgyZCwgMHhmZSwgMHgzNCwgMHgxMywgMHgwYSwgMHg0MiwgMHgwMSwgMHgwZSwgMHhiMCwKKwkweGZlLCAweDM2LCAweDEyLCAweGYwLAorCTB4ZmUsIDB4NDUsIDB4NDgsIDB4MDEsIDB4ZTMsIDB4ZmUsIDB4MDAsIDB4Y2MsIDB4YjAsIDB4ZmUsIDB4ZjMsIDB4MTMsCisJMHgzZCwgMHg3NSwgMHgwNywgMHgxMCwKKwkweGEzLCAweDBhLCAweDgwLCAweDAxLCAweDBlLCAweGZlLCAweDgwLCAweDVjLCAweDAxLCAweDZmLCAweGZlLCAweDBlLAorCTB4MTAsIDB4MDcsIDB4N2UsIDB4NDUsCisJMHhmNiwgMHhmZSwgMHhkNiwgMHhmMCwgMHhmZSwgMHg2YywgMHgwZiwgMHgwMywgMHhmZSwgMHg0NCwgMHg1OCwgMHg3NCwKKwkweGZlLCAweDAxLCAweGVjLCAweDk3LAorCTB4ZmUsIDB4OWUsIDB4NDAsIDB4ZmUsIDB4OWQsIDB4ZTcsIDB4MDAsIDB4ZmUsIDB4OWMsIDB4ZTcsIDB4MWIsIDB4NzYsCisJMHgyNywgMHgwMSwgMHhkYSwgMHhmZSwKKwkweGRkLCAweDEwLCAweDJhLCAweGJjLCAweDdkLCAweGJkLCAweDdmLCAweDMwLCAweDJlLCAweGQ1LCAweDA3LCAweDFiLAorCTB4ZmUsIDB4NDgsIDB4MTIsIDB4MDcsCisJMHgwYiwgMHhmZSwgMHg1NiwgMHgxMiwgMHgwNywgMHgxYSwgMHhmZSwgMHgzMCwgMHgxMiwgMHgwNywgMHhjMiwgMHgxNiwKKwkweGZlLCAweDNlLCAweDExLCAweDA3LAorCTB4ZmUsIDB4MjMsIDB4MDAsIDB4MTYsIDB4ZmUsIDB4NGEsIDB4MTEsIDB4MDcsIDB4MDYsIDB4MTYsIDB4ZmUsIDB4YTgsCisJMHgxMSwgMHgwNywgMHgxOSwgMHhmZSwKKwkweDEyLCAweDEyLCAweDA3LCAweDAwLCAweDE2LCAweDIyLCAweDE0LCAweGMyLCAweDAxLCAweDMzLCAweDlmLCAweDJiLAorCTB4MDEsIDB4MDgsIDB4OGMsIDB4NDMsCisJMHgwMywgMHgyYiwgMHhmZSwgMHg2MiwgMHgwOCwgMHgwYSwgMHhjYSwgMHgwMSwgMHhmZSwgMHgzMiwgMHgwZSwgMHgxMSwKKwkweDdlLCAweDAyLCAweDI5LCAweDJiLAorCTB4MmYsIDB4MDcsIDB4OWIsIDB4ZmUsIDB4ZDksIDB4MTMsIDB4NzksIDB4MzksIDB4NjgsIDB4M2EsIDB4NzcsIDB4ZmUsCisJMHhmYywgMHgxMCwgMHgwOSwgMHgwNCwKKwkweDZhLCAweGZlLCAweDcyLCAweDEyLCAweGMwLCAweDM4LCAweGMxLCAweDRlLCAweGY0LCAweGY1LCAweDhlLCAweGZlLAorCTB4YzYsIDB4MTAsIDB4MWUsIDB4NTgsCisJMHhmZSwgMHgyNiwgMHgxMywgMHgwNSwgMHg3YiwgMHgzMSwgMHg3YywgMHg3NywgMHhmZSwgMHg4MiwgMHgwYywgMHgwYywKKwkweDU0LCAweDE4LCAweDU1LCAweDIzLAorCTB4MGMsIDB4N2IsIDB4MGMsIDB4N2MsIDB4MDEsIDB4YTgsIDB4MjQsIDB4NjksIDB4NzMsIDB4MTIsIDB4NTgsIDB4MDEsCisJMHhhNSwgMHhjMCwgMHgzOCwgMHhjMSwKKwkweDRlLCAweGZlLCAweDA0LCAweDU1LCAweGZlLCAweGE1LCAweDU1LCAweGZlLCAweDA0LCAweGZhLCAweDM4LCAweGZlLAorCTB4MDUsIDB4ZmEsIDB4NGUsIDB4ZmUsCisJMHg5MSwgMHgxMCwgMHgwNSwgMHg1NiwgMHgzMSwgMHg1NywgMHhmZSwgMHg0MCwgMHg1NiwgMHhmZSwgMHhlMSwgMHg1NiwKKwkweDBjLCAweDU2LCAweDE4LCAweDU3LAorCTB4ODMsIDB4YzAsIDB4MzgsIDB4YzEsIDB4NGUsIDB4ZjQsIDB4ZjUsIDB4MDUsIDB4NTIsIDB4MzEsIDB4NTMsIDB4ZmUsCisJMHgwMCwgMHg1NiwgMHhmZSwgMHhhMSwKKwkweDU2LCAweDBjLCAweDUyLCAweDE4LCAweDUzLCAweDA5LCAweDA0LCAweDZhLCAweGZlLCAweDFlLCAweDEyLCAweDFlLAorCTB4NTgsIDB4ZmUsIDB4MWYsIDB4NDAsCisJMHgwNSwgMHg1NCwgMHgzMSwgMHg1NSwgMHhmZSwgMHgyYywgMHg1MCwgMHhmZSwgMHhhZSwgMHg1MCwgMHgwNSwgMHg1NiwKKwkweDMxLCAweDU3LCAweGZlLCAweDQ0LAorCTB4NTAsIDB4ZmUsIDB4YzYsIDB4NTAsIDB4MDUsIDB4NTIsIDB4MzEsIDB4NTMsIDB4ZmUsIDB4MDgsIDB4NTAsIDB4ZmUsCisJMHg4YSwgMHg1MCwgMHgwNSwgMHgzOSwKKwkweDMxLCAweDNhLCAweGZlLCAweDQwLCAweDUwLCAweGZlLCAweGMyLCAweDUwLCAweDAyLCAweDVjLCAweDI0LCAweDA2LAorCTB4MTIsIDB4Y2QsIDB4MDIsIDB4NWIsCisJMHgyYiwgMHgwMSwgMHgwOCwgMHgxZiwgMHg0NCwgMHgzMCwgMHgyZSwgMHhkNSwgMHgwNywgMHgwNiwgMHgyMSwgMHg0NCwKKwkweDJmLCAweDA3LCAweDliLCAweDIxLAorCTB4NWIsIDB4MDEsIDB4NmUsIDB4MWMsIDB4M2QsIDB4MTYsIDB4NDQsIDB4MDksIDB4MDQsIDB4MGIsIDB4ZTIsIDB4NzksCisJMHgzOSwgMHg2OCwgMHgzYSwgMHhmZSwKKwkweDBhLCAweDU1LCAweDM0LCAweGZlLCAweDhiLCAweDU1LCAweGJlLCAweDM5LCAweGJmLCAweDNhLCAweGZlLCAweDBjLAorCTB4NTEsIDB4ZmUsIDB4OGUsIDB4NTEsCisJMHgwMiwgMHg1YiwgMHhmZSwgMHgxOSwgMHg4MSwgMHhhZiwgMHhmZSwgMHgxOSwgMHg0MSwgMHgwMiwgMHg1YiwgMHgyYiwKKwkweDAxLCAweDA4LCAweDI1LCAweDMyLAorCTB4MWYsIDB4YTIsIDB4MzAsIDB4MmUsIDB4ZDgsIDB4NGIsIDB4MWEsIDB4ZmUsIDB4YTYsIDB4MTIsIDB4NGIsIDB4MGIsCisJMHgzYiwgMHgwMiwgMHg0NCwgMHgwMSwKKwkweDA4LCAweDI1LCAweDMyLCAweDFmLCAweGEyLCAweDMwLCAweDJlLCAweGQ2LCAweDA3LCAweDFhLCAweDIxLCAweDQ0LAorCTB4MDEsIDB4MDgsIDB4MWYsIDB4YTIsCisJMHgzMCwgMHgyZSwgMHhmZSwgMHhlOCwgMHgwOSwgMHhmZSwgMHhjMiwgMHg0OSwgMHg2MCwgMHgwNSwgMHhmZSwgMHg5YywKKwkweDAwLCAweDI4LCAweDg0LCAweDQ5LAorCTB4MDQsIDB4MTksIDB4MzQsIDB4OWYsIDB4ZmUsIDB4YmIsIDB4NDUsIDB4NGIsIDB4MDAsIDB4NDUsIDB4M2UsIDB4MDYsCisJMHg3OCwgMHgzZCwgMHhmZSwgMHhkYSwKKwkweDE0LCAweDAxLCAweDZlLCAweDg3LCAweGZlLCAweDRiLCAweDQ1LCAweGUyLCAweDJmLCAweDA3LCAweDlhLCAweGUxLAorCTB4MDUsIDB4YzYsIDB4MjgsIDB4ODQsCisJMHgwNSwgMHgzZiwgMHgyOCwgMHgzNCwgMHg1ZSwgMHgwMiwgMHg1YiwgMHhmZSwgMHhjMCwgMHg1ZCwgMHhmZSwgMHhmOCwKKwkweDE0LCAweGZlLCAweDAzLCAweDE3LAorCTB4MDUsIDB4NTAsIDB4YjQsIDB4MGMsIDB4NTAsIDB4NWUsIDB4MmIsIDB4MDEsIDB4MDgsIDB4MjYsIDB4NWMsIDB4MDEsCisJMHhmZSwgMHhhYSwgMHgxNCwgMHgwMiwKKwkweDVjLCAweDAxLCAweDA4LCAweDI1LCAweDMyLCAweDFmLCAweDQ0LCAweDMwLCAweDJlLCAweGQ2LCAweDA3LCAweDA2LAorCTB4MjEsIDB4NDQsIDB4MDEsIDB4ZmUsCisJMHg4ZSwgMHgxMywgMHhmZSwgMHg0MiwgMHg1OCwgMHhmZSwgMHg4MiwgMHgxNCwgMHhmZSwgMHhhNCwgMHgxNCwgMHg4NywKKwkweGZlLCAweDRhLCAweGY0LCAweDBiLAorCTB4MTYsIDB4NDQsIDB4ZmUsIDB4NGEsIDB4ZjQsIDB4MDYsIDB4ZmUsIDB4MGMsIDB4MTIsIDB4MmYsIDB4MDcsIDB4OWEsCisJMHg4NSwgMHgwMiwgMHg1YiwgMHgwNSwKKwkweDNmLCAweGI0LCAweDBjLCAweDNmLCAweDVlLCAweDJiLCAweDAxLCAweDA4LCAweDI2LCAweDVjLCAweDAxLCAweGZlLAorCTB4ZDgsIDB4MTQsIDB4MDIsIDB4NWMsCisJMHgxMywgMHgwNiwgMHg2NSwgMHhmZSwgMHhjYSwgMHgxMiwgMHgyNiwgMHhmZSwgMHhlMCwgMHgxMiwgMHg3MiwgMHhmMSwKKwkweDAxLCAweDA4LCAweDIzLCAweDcyLAorCTB4MDMsIDB4OGYsIDB4ZmUsIDB4ZGMsIDB4MTIsIDB4MjUsIDB4ZmUsIDB4ZGMsIDB4MTIsIDB4MWYsIDB4ZmUsIDB4Y2EsCisJMHgxMiwgMHg1ZSwgMHgyYiwgMHgwMSwKKwkweDA4LCAweGZlLCAweGQ1LCAweDEwLCAweDEzLCAweDZjLCAweGZmLCAweDAyLCAweDAwLCAweDU3LCAweDQ4LCAweDhiLAorCTB4MWMsIDB4ZmUsIDB4ZmYsIDB4N2YsCisJMHhmZSwgMHgzMCwgMHg1NiwgMHhmZSwgMHgwMCwgMHg1YywgMHgwMywgMHgxMywgMHg2YywgMHhmZiwgMHgwMiwgMHgwMCwKKwkweDU3LCAweDQ4LCAweDhiLCAweDFjLAorCTB4M2QsIDB4ZmUsIDB4MzAsIDB4NTYsIDB4ZmUsIDB4MDAsIDB4NWMsIDB4MDMsIDB4MTMsIDB4NmMsIDB4ZmYsIDB4MDIsCisJMHgwMCwgMHg1NywgMHg0OCwgMHg4YiwKKwkweDAzLCAweDEzLCAweDZjLCAweGZmLCAweDAyLCAweDAwLCAweDU3LCAweDQ4LCAweDhiLCAweGZlLCAweDBiLCAweDU4LAorCTB4MDMsIDB4MGEsIDB4NTAsIDB4MDEsCisJMHg4MiwgMHgwYSwgMHgzZiwgMHgwMSwgMHg4MiwgMHgwMywgMHhmYywgMHgxYywgMHgxMCwgMHhmZiwgMHgwMywgMHgwMCwKKwkweDU0LCAweGZlLCAweDAwLCAweGY0LAorCTB4MTksIDB4NDgsIDB4ZmUsIDB4MDAsIDB4N2QsIDB4ZmUsIDB4MDEsIDB4N2QsIDB4ZmUsIDB4MDIsIDB4N2QsIDB4ZmUsCisJMHgwMywgMHg3YywgMHg2MywgMHgyNywKKwkweDBjLCAweDUyLCAweDE4LCAweDUzLCAweGJlLCAweDU2LCAweGJmLCAweDU3LCAweDAzLCAweGZlLCAweDYyLCAweDA4LAorCTB4ZmUsIDB4ODIsIDB4NGEsIDB4ZmUsCisJMHhlMSwgMHgxYSwgMHhmZSwgMHg4MywgMHg1YSwgMHg3NCwgMHgwMywgMHgwMSwgMHhmZSwgMHgxNCwgMHgxOCwgMHhmZSwKKwkweDQyLCAweDQ4LCAweDVmLCAweDYwLAorCTB4ODksIDB4MDEsIDB4MDgsIDB4MWYsIDB4ZmUsIDB4YTIsIDB4MTQsIDB4MzAsIDB4MmUsIDB4ZDgsIDB4MDEsIDB4MDgsCisJMHgxZiwgMHhmZSwgMHhhMiwgMHgxNCwKKwkweDMwLCAweDJlLCAweGZlLCAweGU4LCAweDBhLCAweGZlLCAweGMxLCAweDU5LCAweDA1LCAweGM2LCAweDI4LCAweGZlLAorCTB4Y2MsIDB4MTIsIDB4NDksIDB4MDQsCisJMHgxYiwgMHhmZSwgMHhjNCwgMHgxMywgMHgyMywgMHg2MiwgMHgxYiwgMHhlMiwgMHg0YiwgMHhjMywgMHg2NCwgMHhmZSwKKwkweGU4LCAweDEzLCAweDNiLCAweDEzLAorCTB4MDYsIDB4MTcsIDB4YzMsIDB4NzgsIDB4ZGIsIDB4ZmUsIDB4NzgsIDB4MTAsIDB4ZmYsIDB4MDIsIDB4ODMsIDB4NTUsCisJMHhhMSwgMHhmZiwgMHgwMiwgMHg4MywKKwkweDU1LCAweDYyLCAweDFhLCAweGE0LCAweGJiLCAweGZlLCAweDMwLCAweDAwLCAweDhlLCAweGU0LCAweDE3LCAweDJjLAorCTB4MTMsIDB4MDYsIDB4ZmUsIDB4NTYsCisJMHgxMCwgMHg2MiwgMHgwYiwgMHhlMSwgMHhiYiwgMHhmZSwgMHg2NCwgMHgwMCwgMHg4ZSwgMHhlNCwgMHgwYSwgMHhmZSwKKwkweDY0LCAweDAwLCAweDE3LCAweDkzLAorCTB4MTMsIDB4MDYsIDB4ZmUsIDB4MjgsIDB4MTAsIDB4NjIsIDB4MDYsIDB4ZmUsIDB4NjAsIDB4MTMsIDB4YmIsIDB4ZmUsCisJMHhjOCwgMHgwMCwgMHg4ZSwgMHhlNCwKKwkweDBhLCAweGZlLCAweGM4LCAweDAwLCAweDE3LCAweDRkLCAweDEzLCAweDA2LCAweDgzLCAweGJiLCAweGZlLCAweDkwLAorCTB4MDEsIDB4YmEsIDB4ZmUsIDB4NGUsCisJMHgxNCwgMHg4OSwgMHhmZSwgMHgxMiwgMHgxMCwgMHhmZSwgMHg0MywgMHhmNCwgMHg5NCwgMHhmZSwgMHg1NiwgMHhmMCwKKwkweGZlLCAweDYwLCAweDE0LCAweGZlLAorCTB4MDQsIDB4ZjQsIDB4NmMsIDB4ZmUsIDB4NDMsIDB4ZjQsIDB4OTMsIDB4ZmUsIDB4ZjMsIDB4MTAsIDB4ZjksIDB4MDEsCisJMHhmZSwgMHgyMiwgMHgxMywgMHgxYywKKwkweDNkLCAweGZlLCAweDEwLCAweDEzLCAweGZlLCAweDAwLCAweDE3LCAweGZlLCAweDRkLCAweGU0LCAweDY5LCAweGJhLAorCTB4ZmUsIDB4OWMsIDB4MTQsIDB4YjcsCisJMHg2OSwgMHhmZSwgMHgxYywgMHgxMCwgMHhmZSwgMHgwMCwgMHgxNywgMHhmZSwgMHg0ZCwgMHhlNCwgMHgxOSwgMHhiYSwKKwkweGZlLCAweDljLCAweDE0LCAweGI3LAorCTB4MTksIDB4ODMsIDB4NjAsIDB4MjMsIDB4ZmUsIDB4NGQsIDB4ZjQsIDB4MDAsIDB4ZGYsIDB4ODksIDB4MTMsIDB4MDYsCisJMHhmZSwgMHhiNCwgMHg1NiwgMHhmZSwKKwkweGMzLCAweDU4LCAweDAzLCAweDYwLCAweDEzLCAweDBiLCAweDAzLCAweDE1LCAweDA2LCAweDAxLCAweDA4LCAweDI2LAorCTB4ZTUsIDB4MTUsIDB4MGIsIDB4MDEsCisJMHgwOCwgMHgyNiwgMHhlNSwgMHgxNSwgMHgxYSwgMHgwMSwgMHgwOCwgMHgyNiwgMHhlNSwgMHg3MiwgMHhmZSwgMHg4OSwKKwkweDQ5LCAweDAxLCAweDA4LCAweDAzLAorCTB4MTUsIDB4MDYsIDB4MDEsIDB4MDgsIDB4MjYsIDB4YTYsIDB4MTUsIDB4MWEsIDB4MDEsIDB4MDgsIDB4MjYsIDB4YTYsCisJMHgxNSwgMHgwNiwgMHgwMSwgMHgwOCwKKwkweDI2LCAweGE2LCAweGZlLCAweDg5LCAweDQ5LCAweDAxLCAweDA4LCAweDI2LCAweGE2LCAweDcyLCAweGZlLCAweDg5LAorCTB4NGEsIDB4MDEsIDB4MDgsIDB4MDMsCisJMHg2MCwgMHgwMywgMHgxZSwgMHhjYywgMHgwNywgMHgwNiwgMHhmZSwgMHg0NCwgMHgxMywgMHhhZCwgMHgxMiwgMHhjYywKKwkweGZlLCAweDQ5LCAweGY0LCAweDAwLAorCTB4M2IsIDB4NzIsIDB4OWYsIDB4NWUsIDB4ZmUsIDB4MDEsIDB4ZWMsIDB4ZmUsIDB4MjcsIDB4MDEsIDB4ZjEsIDB4MDEsCisJMHgwOCwgMHgyZiwgMHgwNywgMHhmZSwKKwkweGUzLCAweDAwLCAweGZlLCAweDIwLCAweDEzLCAweDFmLCAweGZlLCAweDVhLCAweDE1LCAweDIzLCAweDEyLCAweGNkLAorCTB4MDEsIDB4NDMsIDB4MWUsIDB4Y2QsCisJMHgwNywgMHgwNiwgMHg0NSwgMHgwOSwgMHg0YSwgMHgwNiwgMHgzNSwgMHgwMywgMHgwYSwgMHg0MiwgMHgwMSwgMHgwZSwKKwkweGVkLCAweDg4LCAweDA3LCAweDEwLAorCTB4YTQsIDB4MGEsIDB4ODAsIDB4MDEsIDB4MGUsIDB4ODgsIDB4MGEsIDB4NTEsIDB4MDEsIDB4OWUsIDB4MDMsIDB4MGEsCisJMHg4MCwgMHgwMSwgMHgwZSwgMHg4OCwKKwkweGZlLCAweDgwLCAweGU3LCAweDEwLCAweDA3LCAweDEwLCAweDg0LCAweGZlLCAweDQ1LCAweDU4LCAweDAxLCAweGUzLAorCTB4ODgsIDB4MDMsIDB4MGEsIDB4NDIsCisJMHgwMSwgMHgwZSwgMHg4OCwgMHgwYSwgMHg1MSwgMHgwMSwgMHg5ZSwgMHgwMywgMHgwYSwgMHg0MiwgMHgwMSwgMHgwZSwKKwkweGZlLCAweDgwLCAweDgwLCAweGYyLAorCTB4ZmUsIDB4NDksIDB4ZTQsIDB4MTAsIDB4YTQsIDB4MGEsIDB4ODAsIDB4MDEsIDB4MGUsIDB4ZjIsIDB4MGEsIDB4NTEsCisJMHgwMSwgMHg4MiwgMHgwMywgMHgxNywKKwkweDEwLCAweDcxLCAweDY2LCAweGZlLCAweDYwLCAweDAxLCAweGZlLCAweDE4LCAweGRmLCAweGZlLCAweDE5LCAweGRlLAorCTB4ZmUsIDB4MjQsIDB4MWMsIDB4ZmUsCisJMHgxZCwgMHhmNywgMHgxZCwgMHg5MCwgMHhmZSwgMHhmNiwgMHgxNSwgMHgwMSwgMHhmZSwgMHhmYywgMHgxNiwgMHhlMCwKKwkweDkxLCAweDFkLCAweDY2LCAweGZlLAorCTB4MmMsIDB4MDEsIDB4ZmUsIDB4MmYsIDB4MTksIDB4MDMsIDB4YWUsIDB4MjEsIDB4ZmUsIDB4ZTYsIDB4MTUsIDB4ZmUsCisJMHhkYSwgMHgxMCwgMHgxNywgMHgxMCwKKwkweDcxLCAweDA1LCAweGZlLCAweDY0LCAweDAxLCAweGZlLCAweDAwLCAweGY0LCAweDE5LCAweGZlLCAweDE4LCAweDU4LAorCTB4MDUsIDB4ZmUsIDB4NjYsIDB4MDEsCisJMHhmZSwgMHgxOSwgMHg1OCwgMHg5MSwgMHgxOSwgMHhmZSwgMHgzYywgMHg5MCwgMHhmZSwgMHgzMCwgMHhmNCwgMHgwNiwKKwkweGZlLCAweDNjLCAweDUwLCAweDY2LAorCTB4ZmUsIDB4MzgsIDB4MDAsIDB4ZmUsIDB4MGYsIDB4NzksIDB4ZmUsIDB4MWMsIDB4ZjcsIDB4MTksIDB4OTAsIDB4ZmUsCisJMHg0MCwgMHgxNiwgMHhmZSwgMHhiNiwKKwkweDE0LCAweDM0LCAweDAzLCAweGFlLCAweDIxLCAweGZlLCAweDE4LCAweDE2LCAweGZlLCAweDljLCAweDEwLCAweDE3LAorCTB4MTAsIDB4NzEsIDB4ZmUsIDB4ODMsCisJMHg1YSwgMHhmZSwgMHgxOCwgMHhkZiwgMHhmZSwgMHgxOSwgMHhkZSwgMHhmZSwgMHgxZCwgMHhmNywgMHgzOCwgMHg5MCwKKwkweGZlLCAweDYyLCAweDE2LCAweGZlLAorCTB4OTQsIDB4MTQsIDB4ZmUsIDB4MTAsIDB4MTMsIDB4OTEsIDB4MzgsIDB4NjYsIDB4MWIsIDB4ZmUsIDB4YWYsIDB4MTksCisJMHhmZSwgMHg5OCwgMHhlNywgMHgwMCwKKwkweDAzLCAweGFlLCAweDIxLCAweGZlLCAweDU2LCAweDE2LCAweGZlLCAweDZjLCAweDEwLCAweDE3LCAweDEwLCAweDcxLAorCTB4ZmUsIDB4MzAsIDB4YmMsIDB4ZmUsCisJMHhiMiwgMHhiYywgMHg5MSwgMHhjNSwgMHg2NiwgMHgxYiwgMHhmZSwgMHgwZiwgMHg3OSwgMHhmZSwgMHgxYywgMHhmNywKKwkweGM1LCAweDkwLCAweGZlLCAweDlhLAorCTB4MTYsIDB4ZmUsIDB4NWMsIDB4MTQsIDB4MzQsIDB4MDMsIDB4YWUsIDB4MjEsIDB4ZmUsIDB4ODYsIDB4MTYsIDB4ZmUsCisJMHg0MiwgMHgxMCwgMHhmZSwgMHgwMiwKKwkweGY2LCAweDEwLCAweDcxLCAweGZlLCAweDE4LCAweGZlLCAweDU0LCAweGZlLCAweDE5LCAweGZlLCAweDU1LCAweGZjLAorCTB4ZmUsIDB4MWQsIDB4ZjcsIDB4NGYsCisJMHg5MCwgMHhmZSwgMHhjMCwgMHgxNiwgMHhmZSwgMHgzNiwgMHgxNCwgMHhmZSwgMHgxYywgMHgxMywgMHg5MSwgMHg0ZiwKKwkweDQ3LCAweGZlLCAweDgzLCAweDU4LAorCTB4ZmUsIDB4YWYsIDB4MTksIDB4ZmUsIDB4ODAsIDB4ZTcsIDB4MTAsIDB4ZmUsIDB4ODEsIDB4ZTcsIDB4MTAsIDB4MTEsCisJMHhmZSwgMHhkZCwgMHgwMCwgMHg2MywKKwkweDI3LCAweDAzLCAweDYzLCAweDI3LCAweGZlLCAweDEyLCAweDQ1LCAweDIxLCAweGZlLCAweGIwLCAweDE2LCAweDE0LAorCTB4MDYsIDB4MzcsIDB4OTUsIDB4YTksCisJMHgwMiwgMHgyOSwgMHhmZSwgMHgzOSwgMHhmMCwgMHhmZSwgMHgwNCwgMHgxNywgMHgyMywgMHgwMywgMHhmZSwgMHg3ZSwKKwkweDE4LCAweDFjLCAweDFhLCAweDVkLAorCTB4MTMsIDB4MGQsIDB4MDMsIDB4NzEsIDB4MDUsIDB4Y2IsIDB4MWMsIDB4MDYsIDB4ZmUsIDB4ZWYsIDB4MTIsIDB4ZmUsCisJMHhlMSwgMHgxMCwgMHg3OCwgMHgyYywKKwkweDQ2LCAweDJmLCAweDA3LCAweDJkLCAweGZlLCAweDNjLCAweDEzLCAweGZlLCAweDgyLCAweDE0LCAweGZlLCAweDQyLAorCTB4MTMsIDB4M2MsIDB4OGEsIDB4MGEsCisJMHg0MiwgMHgwMSwgMHgwZSwgMHhiMCwgMHhmZSwgMHgzZSwgMHgxMiwgMHhmMCwgMHhmZSwgMHg0NSwgMHg0OCwgMHgwMSwKKwkweGUzLCAweGZlLCAweDAwLCAweGNjLAorCTB4YjAsIDB4ZmUsIDB4ZjMsIDB4MTMsIDB4M2QsIDB4NzUsIDB4MDcsIDB4MTAsIDB4YTMsIDB4MGEsIDB4ODAsIDB4MDEsCisJMHgwZSwgMHhmMiwgMHgwMSwgMHg2ZiwKKwkweGZlLCAweDE2LCAweDEwLCAweDA3LCAweDdlLCAweDg1LCAweGZlLCAweDQwLCAweDE0LCAweGZlLCAweDI0LCAweDEyLAorCTB4ZjYsIDB4ZmUsIDB4ZDYsIDB4ZjAsCisJMHhmZSwgMHgyNCwgMHgxNywgMHgxNywgMHgwYiwgMHgwMywgMHhmZSwgMHg5YywgMHhlNywgMHgwYiwgMHgwZiwgMHhmZSwKKwkweDE1LCAweDAwLCAweDU5LCAweDc2LAorCTB4MjcsIDB4MDEsIDB4ZGEsIDB4MTcsIDB4MDYsIDB4MDMsIDB4M2MsIDB4OGEsIDB4MDksIDB4NGEsIDB4MWQsIDB4MzUsCisJMHgxMSwgMHgyZCwgMHgwMSwgMHg2ZiwKKwkweDE3LCAweDA2LCAweDAzLCAweGZlLCAweDM4LCAweDkwLCAweGZlLCAweGJhLCAweDkwLCAweDc5LCAweGM3LCAweDY4LAorCTB4YzgsIDB4ZmUsIDB4NDgsIDB4NTUsCisJMHgzNCwgMHhmZSwgMHhjOSwgMHg1NSwgMHgwMywgMHgxZSwgMHg5OCwgMHg3MywgMHgxMiwgMHg5OCwgMHgwMywgMHgwYSwKKwkweDk5LCAweDAxLCAweDBlLCAweGYwLAorCTB4MGEsIDB4NDAsIDB4MDEsIDB4MGUsIDB4ZmUsIDB4NDksIDB4NDQsIDB4MTYsIDB4ZmUsIDB4ZjAsIDB4MTcsIDB4NzMsCisJMHg3NSwgMHgwMywgMHgwYSwgMHg0MiwKKwkweDAxLCAweDBlLCAweDA3LCAweDEwLCAweDQ1LCAweDBhLCAweDUxLCAweDAxLCAweDllLCAweDBhLCAweDQwLCAweDAxLAorCTB4MGUsIDB4NzMsIDB4NzUsIDB4MDMsCisJMHhmZSwgMHg0ZSwgMHhlNCwgMHgxYSwgMHg2NCwgMHhmZSwgMHgyNCwgMHgxOCwgMHgwNSwgMHhmZSwgMHg5MCwgMHgwMCwKKwkweGZlLCAweDNhLCAweDQ1LCAweDViLAorCTB4ZmUsIDB4NGUsIDB4ZTQsIDB4YzIsIDB4NjQsIDB4ZmUsIDB4MzYsIDB4MTgsIDB4MDUsIDB4ZmUsIDB4OTIsIDB4MDAsCisJMHhmZSwgMHgwMiwgMHhlNiwgMHgxYiwKKwkweGRjLCAweGZlLCAweDRlLCAweGU0LCAweGZlLCAweDBiLCAweDAwLCAweDY0LCAweGZlLCAweDQ4LCAweDE4LCAweDA1LAorCTB4ZmUsIDB4OTQsIDB4MDAsIDB4ZmUsCisJMHgwMiwgMHhlNiwgMHgxOSwgMHhmZSwgMHgwOCwgMHgxMCwgMHgwNSwgMHhmZSwgMHg5NiwgMHgwMCwgMHhmZSwgMHgwMiwKKwkweGU2LCAweDJjLCAweGZlLCAweDRlLAorCTB4NDUsIDB4ZmUsIDB4MGMsIDB4MTIsIDB4YWYsIDB4ZmYsIDB4MDQsIDB4NjgsIDB4NTQsIDB4ZGUsIDB4MWMsIDB4NjksCisJMHgwMywgMHgwNywgMHg3YSwgMHhmZSwKKwkweDVhLCAweGYwLCAweGZlLCAweDc0LCAweDE4LCAweDI0LCAweGZlLCAweDA5LCAweDAwLCAweGZlLCAweDM0LCAweDEwLAorCTB4MDcsIDB4MWIsIDB4ZmUsIDB4NWEsCisJMHhmMCwgMHhmZSwgMHg4MiwgMHgxOCwgMHgyNCwgMHhjMywgMHhmZSwgMHgyNiwgMHgxMCwgMHgwNywgMHgxYSwgMHg1ZCwKKwkweDI0LCAweDJjLCAweGRjLCAweDA3LAorCTB4MGIsIDB4NWQsIDB4MjQsIDB4OTMsIDB4ZmUsIDB4MGUsIDB4MTAsIDB4MDcsIDB4MDYsIDB4NWQsIDB4MjQsIDB4NGQsCisJMHg5ZiwgMHhhZCwgMHgwMywgMHgxNCwKKwkweGZlLCAweDA5LCAweDAwLCAweDAxLCAweDMzLCAweGZlLCAweDA0LCAweGZlLCAweDdkLCAweDA1LCAweDdmLCAweGY5LAorCTB4MDMsIDB4MjUsIDB4ZmUsIDB4Y2EsCisJMHgxOCwgMHhmZSwgMHgxNCwgMHhmMCwgMHgwOCwgMHg2NSwgMHhmZSwgMHhjNiwgMHgxOCwgMHgwMywgMHhmZiwgMHgxYSwKKwkweDAwLCAweDAwLAogfTsKIAotU1RBVElDIHVuc2lnbmVkIHNob3J0IF9hZHZfYXNjMzU1MF9zaXplID0KLSAgICAgICAgc2l6ZW9mKF9hZHZfYXNjMzU1MF9idWYpOyAvKiAweDEzQUQgKi8KLVNUQVRJQyBBRFZfRENOVCBfYWR2X2FzYzM1NTBfY2hrc3VtID0KLSAgICAgICAgMHgwNEQ1MkRERFVMOyAvKiBFeHBhbmRlZCBsaXR0bGUtZW5kaWFuIGNoZWNrc3VtLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IF9hZHZfYXNjMzU1MF9zaXplID0gc2l6ZW9mKF9hZHZfYXNjMzU1MF9idWYpOwkvKiAweDEzQUQgKi8KK3N0YXRpYyBBRFZfRENOVCBfYWR2X2FzYzM1NTBfY2hrc3VtID0gMHgwNEQ1MkRERFVMOwkvKiBFeHBhbmRlZCBsaXR0bGUtZW5kaWFuIGNoZWNrc3VtLiAqLwogCiAvKiBNaWNyb2NvZGUgYnVmZmVyIGlzIGtlcHQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gZm9yIGVycm9yIHJlY292ZXJ5LiAqLwotU1RBVElDIHVuc2lnbmVkIGNoYXIgX2Fkdl9hc2MzOEMwODAwX2J1ZltdID0gewotICAweDAwLCAgMHgwMCwgIDB4MDAsICAweGYyLCAgMHgwMCwgIDB4ZjAsICAweDAwLCAgMHhmYywgIDB4MDAsICAweDE2LCAgMHgxOCwgIDB4ZTQsICAweDAxLCAgMHgwMCwgIDB4NDgsICAweGU0LAotICAweDE4LCAgMHg4MCwgIDB4MDMsICAweGY2LCAgMHgwMiwgIDB4MDAsICAweGNlLCAgMHgxOSwgIDB4MDAsICAweGZhLCAgMHhmZiwgIDB4ZmYsICAweDFjLCAgMHgwZiwgIDB4MDAsICAweGY2LAotICAweDllLCAgMHhlNywgIDB4ZmYsICAweDAwLCAgMHg4MiwgIDB4ZTcsICAweDAwLCAgMHhlYSwgIDB4MDEsICAweGZhLCAgMHgwMSwgIDB4ZTYsICAweDA5LCAgMHhlNywgIDB4NTUsICAweGYwLAotICAweDAxLCAgMHhmNiwgIDB4MDMsICAweDAwLCAgMHgwNCwgIDB4MDAsICAweDEwLCAgMHgwMCwgIDB4MWUsICAweGYwLCAgMHg4NSwgIDB4ZjAsICAweDE4LCAgMHhmNCwgIDB4MDgsICAweDAwLAotICAweGJjLCAgMHgwMCwgIDB4MzgsICAweDU0LCAgMHgwMCwgIDB4ZWMsICAweGQ1LCAgMHhmMCwgIDB4ODIsICAweDBkLCAgMHgwMCwgIDB4ZTYsICAweDg2LCAgMHhmMCwgIDB4YjEsICAweGYwLAotICAweDk4LCAgMHg1NywgIDB4MDEsICAweGZjLCAgMHhiNCwgIDB4MDAsICAweGQ0LCAgMHgwMSwgIDB4MGMsICAweDFjLCAgMHgzZSwgIDB4MWMsICAweDNjLCAgMHgwMCwgIDB4YmIsICAweDAwLAotICAweDAwLCAgMHgxMCwgIDB4YmEsICAweDE5LCAgMHgwMiwgIDB4ODAsICAweDMyLCAgMHhmMCwgIDB4N2MsICAweDBkLCAgMHgwMiwgIDB4MTMsICAweGJhLCAgMHgxMywgIDB4MTgsICAweDQwLAotICAweDAwLCAgMHg1NywgIDB4MDEsICAweGVhLCAgMHgwMiwgIDB4ZmMsICAweDAzLCAgMHhmYywgIDB4M2UsICAweDAwLCAgMHg2YywgIDB4MDEsICAweDZlLCAgMHgwMSwgIDB4NzQsICAweDAxLAotICAweDc2LCAgMHgwMSwgIDB4YjksICAweDU0LCAgMHgzZSwgIDB4NTcsICAweDAwLCAgMHg4MCwgIDB4MDMsICAweGU2LCAgMHhiNiwgIDB4MDAsICAweGMwLCAgMHgwMCwgIDB4MDEsICAweDAxLAotICAweDNlLCAgMHgwMSwgIDB4N2EsICAweDAxLCAgMHhjYSwgIDB4MDgsICAweGNlLCAgMHgxMCwgIDB4MTYsICAweDExLCAgMHgwNCwgIDB4MTIsICAweDA4LCAgMHgxMiwgIDB4MDIsICAweDRhLAotICAweGJiLCAgMHg1NSwgIDB4M2MsICAweDU2LCAgMHgwMywgIDB4NTgsICAweDFiLCAgMHg4MCwgIDB4MzAsICAweGU0LCAgMHg0YiwgIDB4ZTQsICAweDVkLCAgMHhmMCwgIDB4MDIsICAweGZhLAotICAweDIwLCAgMHgwMCwgIDB4MzIsICAweDAwLCAgMHg0MCwgIDB4MDAsICAweDgwLCAgMHgwMCwgIDB4MjQsICAweDAxLCAgMHgzYywgIDB4MDEsICAweDY4LCAgMHgwMSwgIDB4NmEsICAweDAxLAotICAweDcwLCAgMHgwMSwgIDB4NzIsICAweDAxLCAgMHg3OCwgIDB4MDEsICAweDdjLCAgMHgwMSwgIDB4NjIsICAweDBhLCAgMHg4NiwgIDB4MGQsICAweDA2LCAgMHgxMywgIDB4NGMsICAweDFjLAotICAweDA0LCAgMHg4MCwgIDB4NGEsICAweGU0LCAgMHgwMiwgIDB4ZWUsICAweDViLCAgMHhmMCwgIDB4MDMsICAweGY3LCAgMHgwYywgIDB4MDAsICAweDBmLCAgMHgwMCwgIDB4NDcsICAweDAwLAotICAweGJlLCAgMHgwMCwgIDB4MDAsICAweDAxLCAgMHgyMCwgIDB4MTEsICAweDVjLCAgMHgxNiwgIDB4MzIsICAweDFjLCAgMHgzOCwgIDB4MWMsICAweDRlLCAgMHgxYywgIDB4MTAsICAweDQ0LAotICAweDAwLCAgMHg0YywgIDB4MDQsICAweGVhLCAgMHg1YywgIDB4ZjAsICAweGE3LCAgMHhmMCwgIDB4MDQsICAweGY2LCAgMHgwMywgIDB4ZmEsICAweDA1LCAgMHgwMCwgIDB4MzQsICAweDAwLAotICAweDM2LCAgMHgwMCwgIDB4OTgsICAweDAwLCAgMHhjYywgIDB4MDAsICAweDIwLCAgMHgwMSwgIDB4NGUsICAweDAxLCAgMHg0YSwgIDB4MGIsICAweDQyLCAgMHgwYywgIDB4MTIsICAweDBmLAotICAweDBjLCAgMHgxMCwgIDB4MjIsICAweDExLCAgMHgwYSwgIDB4MTIsICAweDA0LCAgMHgxMywgIDB4MzAsICAweDFjLCAgMHgwMiwgIDB4NDgsICAweDAwLCAgMHg0ZSwgIDB4NDIsICAweDU0LAotICAweDQ0LCAgMHg1NSwgIDB4YmQsICAweDU2LCAgMHgwNiwgIDB4ODMsICAweDAwLCAgMHhkYywgIDB4MDUsICAweGYwLCAgMHgwOSwgIDB4ZjAsICAweDU5LCAgMHhmMCwgIDB4YjgsICAweGYwLAotICAweDRiLCAgMHhmNCwgIDB4MDYsICAweGY3LCAgMHgwZSwgIDB4ZjcsICAweDA0LCAgMHhmYywgIDB4MDUsICAweGZjLCAgMHgwNiwgIDB4MDAsICAweDE5LCAgMHgwMCwgIDB4MzMsICAweDAwLAotICAweDliLCAgMHgwMCwgIDB4YTQsICAweDAwLCAgMHhiNSwgIDB4MDAsICAweGJhLCAgMHgwMCwgIDB4ZDAsICAweDAwLCAgMHhlMSwgIDB4MDAsICAweGU3LCAgMHgwMCwgIDB4ZTIsICAweDAzLAotICAweDA4LCAgMHgwZiwgIDB4MDIsICAweDEwLCAgMHgwNCwgIDB4MTAsICAweDBhLCAgMHgxMCwgIDB4MGEsICAweDEzLCAgMHgwYywgIDB4MTMsICAweDEyLCAgMHgxMywgIDB4MjQsICAweDE0LAotICAweDM0LCAgMHgxNCwgIDB4MDQsICAweDE2LCAgMHgwOCwgIDB4MTYsICAweGE0LCAgMHgxNywgIDB4MjAsICAweDFjLCAgMHgzNCwgIDB4MWMsICAweDM2LCAgMHgxYywgIDB4MDgsICAweDQ0LAotICAweDM4LCAgMHg0NCwgIDB4OTEsICAweDQ0LCAgMHgwYSwgIDB4NDUsICAweDQ4LCAgMHg0NiwgIDB4MDEsICAweDQ4LCAgMHg2OCwgIDB4NTQsICAweDNhLCAgMHg1NSwgIDB4ODMsICAweDU1LAotICAweGU1LCAgMHg1NSwgIDB4YjAsICAweDU3LCAgMHgwMSwgIDB4NTgsICAweDgzLCAgMHg1OSwgIDB4MDUsICAweGU2LCAgMHgwYiwgIDB4ZjAsICAweDBjLCAgMHhmMCwgIDB4MDQsICAweGY4LAotICAweDA1LCAgMHhmOCwgIDB4MDcsICAweDAwLCAgMHgwYSwgIDB4MDAsICAweDFjLCAgMHgwMCwgIDB4MWUsICAweDAwLCAgMHg5ZSwgIDB4MDAsICAweGE4LCAgMHgwMCwgIDB4YWEsICAweDAwLAotICAweGI5LCAgMHgwMCwgIDB4ZTAsICAweDAwLCAgMHgyMiwgIDB4MDEsICAweDI2LCAgMHgwMSwgIDB4NzksICAweDAxLCAgMHg3ZSwgIDB4MDEsICAweGM0LCAgMHgwMSwgIDB4YzYsICAweDAxLAotICAweDgwLCAgMHgwMiwgIDB4NWUsICAweDAzLCAgMHhlZSwgIDB4MDQsICAweDlhLCAgMHgwNiwgIDB4ZjgsICAweDA3LCAgMHg2MiwgIDB4MDgsICAweDY4LCAgMHgwOCwgIDB4NjksICAweDA4LAotICAweGQ2LCAgMHgwOCwgIDB4ZTksICAweDA5LCAgMHhmYSwgIDB4MGIsICAweDJlLCAgMHgwZiwgIDB4MTIsICAweDEwLCAgMHgxYSwgIDB4MTAsICAweGVkLCAgMHgxMCwgIDB4ZjEsICAweDEwLAotICAweDJhLCAgMHgxMSwgIDB4MDYsICAweDEyLCAgMHgwYywgIDB4MTIsICAweDNlLCAgMHgxMiwgIDB4MTAsICAweDEzLCAgMHgxNiwgIDB4MTMsICAweDFlLCAgMHgxMywgIDB4NDYsICAweDE0LAotICAweDc2LCAgMHgxNCwgIDB4ODIsICAweDE0LCAgMHgzNiwgIDB4MTUsICAweGNhLCAgMHgxNSwgIDB4NmIsICAweDE4LCAgMHhiZSwgIDB4MTgsICAweGNhLCAgMHgxOCwgIDB4ZTYsICAweDE5LAotICAweDEyLCAgMHgxYywgIDB4NDYsICAweDFjLCAgMHg5YywgIDB4MzIsICAweDAwLCAgMHg0MCwgIDB4MGUsICAweDQ3LCAgMHhmZSwgIDB4OWMsICAweGYwLCAgMHgyYiwgIDB4MDIsICAweGZlLAotICAweGFjLCAgMHgwZCwgIDB4ZmYsICAweDEwLCAgMHgwMCwgIDB4MDAsICAweGQ3LCAgMHhmZSwgIDB4ZTgsICAweDE5LCAgMHgwMCwgIDB4ZDYsICAweGZlLCAgMHg4NCwgIDB4MDEsICAweGZmLAotICAweDAzLCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg5MywgIDB4MTUsICAweGZlLCAgMHgwZiwgIDB4MDUsICAweGZmLCAgMHgzOCwgIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NTcsICAweDI0LAotICAweDAwLCAgMHhmZSwgIDB4NGMsICAweDAwLCAgMHg1YiwgIDB4ZmYsICAweDA0LCAgMHgwMCwgIDB4MDAsICAweDExLCAgMHhmZiwgIDB4MDksICAweDAwLCAgMHgwMCwgIDB4ZmYsICAweDA4LAotICAweDAxLCAgMHgwMSwgIDB4ZmYsICAweDA4LCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHgyNywgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MTAsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDExLAotICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDc4LCAgMHg1NiwgIDB4ZmUsICAweDM0LCAgMHgxMiwgIDB4ZmYsICAweDIxLCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGQ2LAotICAweDJjLCAgMHg5OSwgIDB4MGEsICAweDAxLCAgMHhmZSwgIDB4YzIsICAweDBmLCAgMHhmZSwgIDB4MDQsICAweGY3LCAgMHhkNiwgIDB4OTksICAweDBhLCAgMHg0MiwgIDB4MmMsICAweGZlLAotICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDA2LCAgMHgwMiwgIDB4ZmUsICAweDIwLCAgMHhmMCwgIDB4YTcsICAweGZlLCAgMHg5MSwgIDB4ZjAsICAweGZlLCAgMHhmNCwgIDB4MDEsICAweGZlLAotICAweDkwLCAgMHhmMCwgIDB4ZmUsICAweGY0LCAgMHgwMSwgIDB4ZmUsICAweDhmLCAgMHhmMCwgIDB4YTcsICAweDAzLCAgMHg1ZCwgIDB4NGQsICAweDAyLCAgMHhmZSwgIDB4YzgsICAweDBkLAotICAweDAxLCAgMHhmZSwgIDB4MzgsICAweDBlLCAgMHhmZSwgIDB4ZGQsICAweDEyLCAgMHhmZSwgIDB4ZmMsICAweDEwLCAgMHhmZSwgIDB4MjgsICAweDFjLCAgMHgwMywgIDB4ZmUsICAweGE2LAotICAweDAwLCAgMHhmZSwgIDB4ZDMsICAweDEyLCAgMHg0MSwgIDB4MTQsICAweGZlLCAgMHhhNiwgIDB4MDAsICAweGMyLCAgMHhmZSwgIDB4NDgsICAweGYwLCAgMHhmZSwgIDB4OGEsICAweDAyLAotICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHhhNCwgIDB4MDIsICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHhjMiwgIDB4MDIsICAweGZlLCAgMHg0NiwgIDB4ZjAsICAweGZlLAotICAweDU0LCAgMHgwMiwgIDB4ZmUsICAweDQ3LCAgMHhmMCwgIDB4ZmUsICAweDVhLCAgMHgwMiwgIDB4ZmUsICAweDQzLCAgMHhmMCwgIDB4ZmUsICAweDQ4LCAgMHgwMiwgIDB4ZmUsICAweDQ0LAotICAweGYwLCAgMHhmZSwgIDB4NGMsICAweDAyLCAgMHhmZSwgIDB4NDUsICAweGYwLCAgMHhmZSwgIDB4NTAsICAweDAyLCAgMHgxOCwgIDB4MGEsICAweGFhLCAgMHgxOCwgIDB4MDYsICAweDE0LAotICAweGExLCAgMHgwMiwgIDB4MmIsICAweGZlLCAgMHgwMCwgIDB4MWMsICAweGU3LCAgMHhmZSwgIDB4MDIsICAweDFjLCAgMHhlNiwgIDB4ZmUsICAweDFlLCAgMHgxYywgIDB4ZmUsICAweGU5LAotICAweDEwLCAgMHgwMSwgIDB4ZmUsICAweDE4LCAgMHgxOCwgIDB4ZmUsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDA2LCAgMHhmYywgIDB4Y2UsICAweDA5LCAgMHg3MCwgIDB4MDEsICAweGE4LAotICAweDAyLCAgMHgyYiwgIDB4MTUsICAweDU5LCAgMHgzOSwgIDB4YTIsICAweDAxLCAgMHhmZSwgIDB4NTgsICAweDEwLCAgMHgwOSwgIDB4NzAsICAweDAxLCAgMHg4NywgIDB4ZmUsICAweGJkLAotICAweDEwLCAgMHgwOSwgIDB4NzAsICAweDAxLCAgMHg4NywgIDB4ZmUsICAweGFkLCAgMHgxMCwgIDB4ZmUsICAweDE2LCAgMHgxYywgIDB4ZmUsICAweDU4LCAgMHgxYywgIDB4MTgsICAweDA2LAotICAweDE0LCAgMHhhMSwgIDB4MmMsICAweDFjLCAgMHgyYiwgIDB4ZmUsICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDA2LCAgMHgwMiwgIDB4MjMsICAweGZlLCAgMHg5OCwgIDB4MDIsICAweGZlLAotICAweDVhLCAgMHgxYywgIDB4ZjgsICAweGZlLCAgMHgxNCwgIDB4MWMsICAweDE1LCAgMHhmZSwgIDB4MzAsICAweDAwLCAgMHgzOSwgIDB4YTIsICAweDAxLCAgMHhmZSwgIDB4NDgsICAweDEwLAotICAweDE4LCAgMHgwNiwgIDB4MTQsICAweGExLCAgMHgwMiwgIDB4ZDcsICAweDIyLCAgMHgyMCwgIDB4MDcsICAweDExLCAgMHgzNSwgIDB4ZmUsICAweDY5LCAgMHgxMCwgIDB4MTgsICAweDA2LAotICAweDE0LCAgMHhhMSwgIDB4ZmUsICAweDA0LCAgMHhlYywgIDB4MjAsICAweDRmLCAgMHg0MywgIDB4MTMsICAweDIwLCAgMHhmZSwgIDB4MDUsICAweGY2LCAgMHhjZSwgIDB4MDEsICAweGZlLAotICAweDRhLCAgMHgxNywgIDB4MDgsICAweDU0LCAgMHg1OCwgIDB4MzcsICAweDEyLCAgMHgyZiwgIDB4NDIsICAweDkyLCAgMHgwMSwgIDB4ZmUsICAweDgyLCAgMHgxNiwgIDB4MDIsICAweDJiLAotICAweDA5LCAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHgwNywgIDB4MDAsICAweDY2LCAgMHgwMSwgIDB4NzMsICAweGZlLCAgMHgxOCwgIDB4MTAsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDA5LAotICAweGE0LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHhjOCwgIDB4NTQsICAweDZiLCAgMHhmZSwgIDB4MTAsICAweDAzLCAgMHgwMSwgIDB4ZmUsICAweDgyLCAgMHgxNiwgIDB4MDIsICAweDJiLAotICAweDJjLCAgMHg0ZiwgIDB4ZmUsICAweDAyLCAgMHhlOCwgIDB4MmEsICAweGZlLCAgMHhiZiwgIDB4NTcsICAweGZlLCAgMHg5ZSwgIDB4NDMsICAweGZlLCAgMHg3NywgIDB4NTcsICAweGZlLAotICAweDI3LCAgMHhmMCwgIDB4ZmUsICAweGUwLCAgMHgwMSwgIDB4ZmUsICAweDA3LCAgMHg0YiwgIDB4ZmUsICAweDIwLCAgMHhmMCwgIDB4YTcsICAweGZlLCAgMHg0MCwgIDB4MWMsICAweDFjLAotICAweGQ5LCAgMHhmZSwgIDB4MjYsICAweGYwLCAgMHhmZSwgIDB4NWEsICAweDAzLCAgMHhmZSwgIDB4YTAsICAweGYwLCAgMHhmZSwgIDB4NDgsICAweDAzLCAgMHhmZSwgIDB4MTEsICAweGYwLAotICAweGE3LCAgMHhmZSwgIDB4ZWYsICAweDEwLCAgMHhmZSwgIDB4OWYsICAweGYwLCAgMHhmZSwgIDB4NjgsICAweDAzLCAgMHhmOSwgIDB4MTAsICAweGZlLCAgMHgxMSwgIDB4MDAsICAweDAyLAotICAweDY1LCAgMHgyYywgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4ZjksICAweDA4LCAgMHgwNSwgIDB4MWIsICAweGZlLCAgMHgxOCwgIDB4MTMsICAweDIxLCAgMHgyMiwgIDB4YTMsICAweGI3LAotICAweDEzLCAgMHhhMywgIDB4MDksICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweGI3LCAgMHg3OCwgIDB4MDEsICAweGZlLCAgMHhiNCwgIDB4MTYsICAweDEyLCAgMHhkMSwgIDB4MWMsICAweGQ5LAotICAweGZlLCAgMHgwMSwgIDB4ZjAsICAweGQ5LCAgMHhmZSwgIDB4ODIsICAweGYwLCAgMHhmZSwgIDB4OTYsICAweDAzLCAgMHhmYSwgIDB4MTIsICAweGZlLCAgMHhlNCwgIDB4MDAsICAweDI3LAotICAweGZlLCAgMHhhOCwgIDB4MDMsICAweDFjLCAgMHgzNCwgIDB4MWQsICAweGZlLCAgMHhiOCwgIDB4MDMsICAweDAxLCAgMHg0YiwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsICAweGM4LAotICAweDAzLCAgMHg5NSwgIDB4ODYsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHg4YSwgIDB4MDYsICAweDAyLCAgMHgyNCwgIDB4MDMsICAweDcwLCAgMHgyOCwgIDB4MTcsICAweGZlLAotICAweGZhLCAgMHgwNCwgIDB4MTUsICAweDZkLCAgMHgwMSwgIDB4MzYsICAweDdiLCAgMHhmZSwgIDB4NmEsICAweDAyLCAgMHgwMiwgIDB4ZDgsICAweGY5LCAgMHgyYywgIDB4OTksICAweDE5LAotICAweGZlLCAgMHg2NywgIDB4MWIsICAweGZlLCAgMHhiZiwgIDB4NTcsICAweGZlLCAgMHg3NywgIDB4NTcsICAweGZlLCAgMHg0OCwgIDB4MWMsICAweDc0LCAgMHgwMSwgIDB4YWYsICAweDhjLAotICAweDA5LCAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHgwNywgIDB4MDAsICAweDE3LCAgMHhkYSwgIDB4MDksICAweGQxLCAgMHgwMSwgIDB4MGUsICAweDhkLCAgMHg1MSwgIDB4NjQsICAweDc5LAotICAweDJhLCAgMHgwMywgIDB4NzAsICAweDI4LCAgMHhmZSwgIDB4MTAsICAweDEyLCAgMHgxNSwgIDB4NmQsICAweDAxLCAgMHgzNiwgIDB4N2IsICAweGZlLCAgMHg2YSwgIDB4MDIsICAweDAyLAotICAweGQ4LCAgMHhjNywgIDB4ODEsICAweGM4LCAgMHg4MywgIDB4MWMsICAweDI0LCAgMHgyNywgIDB4ZmUsICAweDQwLCAgMHgwNCwgIDB4MWQsICAweGZlLCAgMHgzYywgIDB4MDQsICAweDNiLAotICAweGZlLCAgMHhhMCwgIDB4MDAsICAweGZlLCAgMHg5YiwgIDB4NTcsICAweGZlLCAgMHg0ZSwgIDB4MTIsICAweDJkLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MDEsICAweDBiLAotICAweDFkLCAgMHhmZSwgIDB4ZTQsICAweDA0LCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHgxZCwgIDB4MjQsICAweDMzLCAgMHgzMSwgIDB4ZGUsICAweGZlLCAgMHg0YywgIDB4NDQsICAweGZlLAotICAweDRjLCAgMHgxMiwgIDB4NTEsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDBmLCAgMHg2ZiwgIDB4ZmUsICAweDRjLCAgMHg1NCwgIDB4NmIsICAweGRhLCAgMHg0ZiwgIDB4NzksICAweDJhLAotICAweGZlLCAgMHgwNiwgIDB4ODAsICAweGZlLCAgMHg0OCwgIDB4NDcsICAweGZlLCAgMHg2MiwgIDB4MTMsICAweDA4LCAgMHgwNSwgIDB4MWIsICAweGZlLCAgMHgyYSwgIDB4MTMsICAweDMyLAotICAweDA3LCAgMHg4MiwgIDB4ZmUsICAweDUyLCAgMHgxMywgIDB4ZmUsICAweDIwLCAgMHgxMCwgIDB4MGYsICAweDZmLCAgMHhmZSwgIDB4NGMsICAweDU0LCAgMHg2YiwgIDB4ZGEsICAweGZlLAotICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDQwLCAgMHgxMywgIDB4MDgsICAweDA1LCAgMHgxYiwgIDB4ZmUsICAweDA4LCAgMHgxMywgIDB4MzIsICAweDA3LAotICAweDgyLCAgMHhmZSwgIDB4MzAsICAweDEzLCAgMHgwOCwgIDB4MDUsICAweDFiLCAgMHhmZSwgIDB4MWMsICAweDEyLCAgMHgxNSwgIDB4OWQsICAweDA4LCAgMHgwNSwgIDB4MDYsICAweDRkLAotICAweDE1LCAgMHhmZSwgIDB4MGQsICAweDAwLCAgMHgwMSwgIDB4MzYsICAweDdiLCAgMHhmZSwgIDB4NjQsICAweDBkLCAgMHgwMiwgIDB4MjQsICAweDJkLCAgMHgxMiwgIDB4ZmUsICAweGU2LAotICAweDAwLCAgMHhmZSwgIDB4MWMsICAweDkwLCAgMHhmZSwgIDB4NDAsICAweDVjLCAgMHgwNCwgIDB4MTUsICAweDlkLCAgMHgwMSwgIDB4MzYsICAweDAyLCAgMHgyYiwgIDB4ZmUsICAweDQyLAotICAweDViLCAgMHg5OSwgIDB4MTksICAweGZlLCAgMHg0NiwgIDB4NTksICAweGZlLCAgMHhiZiwgIDB4NTcsICAweGZlLCAgMHg3NywgIDB4NTcsICAweGZlLCAgMHg4NywgIDB4ODAsICAweGZlLAotICAweDMxLCAgMHhlNCwgIDB4NWIsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHg4NCwgIDB4MTMsICAweGZlLCAgMHgyMCwgIDB4ODAsICAweDA3LCAgMHgxOSwgIDB4ZmUsICAweDdjLAotICAweDEyLCAgMHg1MywgIDB4MDUsICAweDA2LCAgMHhmZSwgIDB4NmMsICAweDEzLCAgMHgwMywgIDB4ZmUsICAweGEyLCAgMHgwMCwgIDB4MjgsICAweDE3LCAgMHhmZSwgIDB4OTAsICAweDA1LAotICAweGZlLCAgMHgzMSwgIDB4ZTQsICAweDVhLCAgMHg1MywgIDB4MDUsICAweDBhLCAgMHhmZSwgIDB4NTYsICAweDEzLCAgMHgwMywgIDB4ZmUsICAweGEwLCAgMHgwMCwgIDB4MjgsICAweGZlLAotICAweDRlLCAgMHgxMiwgIDB4NjcsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgyNywgIDB4ZmUsICAweDQ4LCAgMHgwNSwgIDB4MWMsICAweDM0LCAgMHhmZSwgIDB4ODksICAweDQ4LAotICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgyNywgIDB4ZmUsICAweDU2LCAgMHgwNSwgIDB4MjYsICAweGZlLCAgMHhhOCwgIDB4MDUsICAweDEyLCAgMHhmZSwgIDB4ZTMsICAweDAwLAotICAweDIxLCAgMHg1MywgIDB4ZmUsICAweDRhLCAgMHhmMCwgIDB4ZmUsICAweDc2LCAgMHgwNSwgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweDcwLCAgMHgwNSwgIDB4ODgsICAweDI1LAotICAweGZlLCAgMHgyMSwgIDB4MDAsICAweGFiLCAgMHgyNSwgIDB4ZmUsICAweDIyLCAgMHgwMCwgIDB4YWEsICAweDI1LCAgMHg1OCwgIDB4ZmUsICAweDA5LCAgMHg0OCwgIDB4ZmYsICAweDAyLAotICAweDAwLCAgMHgxMCwgIDB4MjcsICAweGZlLCAgMHg4NiwgIDB4MDUsICAweDI2LCAgMHhmZSwgIDB4YTgsICAweDA1LCAgMHhmZSwgIDB4ZTIsICAweDA4LCAgMHg1MywgIDB4MDUsICAweGNiLAotICAweDRkLCAgMHgwMSwgIDB4YjAsICAweDI1LCAgMHgwNiwgIDB4MTMsICAweGQzLCAgMHgzOSwgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4MDgsICAweDA1LCAgMHgxYiwgIDB4ZmUsICAweDIyLAotICAweDEyLCAgMHg0MSwgIDB4MDEsICAweGIyLCAgMHgxNSwgIDB4OWQsICAweDA4LCAgMHgwNSwgIDB4MDYsICAweDRkLCAgMHgxNSwgIDB4ZmUsICAweDBkLCAgMHgwMCwgIDB4MDEsICAweDM2LAotICAweDdiLCAgMHhmZSwgIDB4NjQsICAweDBkLCAgMHgwMiwgIDB4MjQsICAweDAzLCAgMHhmZSwgIDB4OWMsICAweDAwLCAgMHgyOCwgIDB4ZWIsICAweDAzLCAgMHg1YywgIDB4MjgsICAweGZlLAotICAweDM2LCAgMHgxMywgIDB4NDEsICAweDAxLCAgMHhiMiwgIDB4MjYsICAweGZlLCAgMHgxOCwgIDB4MDYsICAweDA5LCAgMHgwNiwgIDB4NTMsICAweDA1LCAgMHgxZiwgIDB4ZmUsICAweDAyLAotICAweDEyLCAgMHg1MCwgIDB4MDEsICAweGZlLCAgMHg5ZSwgIDB4MTUsICAweDFkLCAgMHhmZSwgIDB4MGUsICAweDA2LCAgMHgxMiwgIDB4YTUsICAweDAxLCAgMHg0YiwgIDB4MTIsICAweGZlLAotICAweGU1LCAgMHgwMCwgIDB4MDMsICAweDVjLCAgMHhjMSwgIDB4MGMsICAweDVjLCAgMHgwMywgIDB4Y2QsICAweDI4LCAgMHhmZSwgIDB4NjIsICAweDEyLCAgMHgwMywgIDB4NDUsICAweDI4LAotICAweGZlLCAgMHg1YSwgIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4MGMsICAweDE5LCAgMHgwMSwgIDB4ZmUsICAweDc2LCAgMHgxOSwgIDB4ZmUsICAweDQzLCAgMHg0OCwgIDB4YzQsICAweGNjLAotICAweDBmLCAgMHg3MSwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDUyLCAgMHg5MywgIDB4MWUsICAweDQzLCAgMHg4YiwgIDB4YzQsICAweDZlLCAgMHg0MSwgIDB4MDEsICAweGIyLAotICAweDI2LCAgMHhmZSwgIDB4ODIsICAweDA2LCAgMHg1MywgIDB4MDUsICAweDFhLCAgMHhlOSwgIDB4OTEsICAweDA5LCAgMHg1OSwgIDB4MDEsICAweGZlLCAgMHhjYywgIDB4MTUsICAweDFkLAotICAweGZlLCAgMHg3OCwgIDB4MDYsICAweDEyLCAgMHhhNSwgIDB4MDEsICAweDRiLCAgMHgxMiwgIDB4ZmUsICAweGU1LCAgMHgwMCwgIDB4MDMsICAweDQ1LCAgMHhjMSwgIDB4MGMsICAweDQ1LAotICAweDE4LCAgMHgwNiwgIDB4MDEsICAweGIyLCAgMHhmYSwgIDB4NzYsICAweDc0LCAgMHgwMSwgIDB4YWYsICAweDhjLCAgMHgxMiwgIDB4ZmUsICAweGUyLCAgMHgwMCwgIDB4MjcsICAweGRiLAotICAweDFjLCAgMHgzNCwgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsICAweGI2LCAgMHgwNiwgIDB4OTQsICAweGZlLCAgMHg2YywgIDB4MDcsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLAotICAweDc0LCAgMHgwNywgIDB4OTUsICAweDg2LCAgMHgwMiwgIDB4MjQsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHgyZSwgIDB4MTIsICAweDE2LCAgMHgxOSwgIDB4MDEsICAweDBiLAotICAweDE2LCAgMHgwMCwgIDB4MDEsICAweDBiLCAgMHgxNiwgIDB4MDAsICAweDAxLCAgMHgwYiwgIDB4MTYsICAweDAwLCAgMHgwMSwgIDB4MGIsICAweGZlLCAgMHg5OSwgIDB4YTQsICAweDAxLAotICAweDBiLCAgMHgxNiwgIDB4MDAsICAweDAyLCAgMHhmZSwgIDB4NDIsICAweDA4LCAgMHg2OCwgIDB4MDUsICAweDFhLCAgMHhmZSwgIDB4MzgsICAweDEyLCAgMHgwOCwgIDB4MDUsICAweDFhLAotICAweGZlLCAgMHgzMCwgIDB4MTMsICAweDE2LCAgMHhmZSwgIDB4MWIsICAweDAwLCAgMHgwMSwgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDEsICAweDBiLCAgMHgxNiwgIDB4MDAsICAweDAxLAotICAweDBiLCAgMHgxNiwgIDB4MDAsICAweDAxLCAgMHgwYiwgIDB4MTYsICAweDA2LCAgMHgwMSwgIDB4MGIsICAweDE2LCAgMHgwMCwgIDB4MDIsICAweGUyLCAgMHg2YywgIDB4NTgsICAweGJlLAotICAweDUwLCAgMHhmZSwgIDB4OWEsICAweDgxLCAgMHg1NSwgIDB4MWIsICAweDdhLCAgMHhmZSwgIDB4NDIsICAweDA3LCAgMHgwOSwgIDB4MWIsICAweGZlLCAgMHgwOSwgIDB4NmYsICAweGJhLAotICAweGZlLCAgMHhjYSwgIDB4NDUsICAweGZlLCAgMHgzMiwgIDB4MTIsICAweDY5LCAgMHg2ZCwgIDB4OGIsICAweDZjLCAgMHg3ZiwgIDB4MjcsICAweGZlLCAgMHg1NCwgIDB4MDcsICAweDFjLAotICAweDM0LCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4NDIsICAweDA3LCAgMHg5NSwgIDB4ODYsICAweDk0LCAgMHhmZSwgIDB4NmMsICAweDA3LCAgMHgwMiwgIDB4MjQsICAweDAxLAotICAweDRiLCAgMHgwMiwgIDB4ZGIsICAweDE2LCAgMHgxZiwgIDB4MDIsICAweGRiLCAgMHhmZSwgIDB4OWMsICAweGY3LCAgMHhkYywgIDB4ZmUsICAweDJjLCAgMHg5MCwgIDB4ZmUsICAweGFlLAotICAweDkwLCAgMHg1NiwgIDB4ZmUsICAweGRhLCAgMHgwNywgIDB4MGMsICAweDYwLCAgMHgxNCwgIDB4NjEsICAweDA4LCAgMHg1NCwgIDB4NWEsICAweDM3LCAgMHgyMiwgIDB4MjAsICAweDA3LAotICAweDExLCAgMHhmZSwgIDB4MGUsICAweDEyLCAgMHg4ZCwgIDB4ZmUsICAweDgwLCAgMHg4MCwgIDB4MzksICAweDIwLCAgMHg2YSwgIDB4MmEsICAweGZlLCAgMHgwNiwgIDB4MTAsICAweGZlLAotICAweDgzLCAgMHhlNywgIDB4ZmUsICAweDQ4LCAgMHgwMCwgIDB4YWIsICAweGZlLCAgMHgwMywgIDB4NDAsICAweDA4LCAgMHg1NCwgIDB4NWIsICAweDM3LCAgMHgwMSwgIDB4YjMsICAweGI4LAotICAweGZlLCAgMHgxZiwgIDB4NDAsICAweDEzLCAgMHg2MiwgIDB4MDEsICAweGVmLCAgMHhmZSwgIDB4MDgsICAweDUwLCAgMHhmZSwgIDB4OGEsICAweDUwLCAgMHhmZSwgIDB4NDQsICAweDUxLAotICAweGZlLCAgMHhjNiwgIDB4NTEsICAweDg4LCAgMHhmZSwgIDB4MDgsICAweDkwLCAgMHhmZSwgIDB4OGEsICAweDkwLCAgMHgwYywgIDB4NWUsICAweDE0LCAgMHg1ZiwgIDB4ZmUsICAweDBjLAotICAweDkwLCAgMHhmZSwgIDB4OGUsICAweDkwLCAgMHhmZSwgIDB4NDAsICAweDUwLCAgMHhmZSwgIDB4YzIsICAweDUwLCAgMHgwYywgIDB4M2QsICAweDE0LCAgMHgzZSwgIDB4ZmUsICAweDRhLAotICAweDEwLCAgMHgwOCwgIDB4MDUsICAweDVhLCAgMHhmZSwgIDB4MmEsICAweDEyLCAgMHhmZSwgIDB4MmMsICAweDkwLCAgMHhmZSwgIDB4YWUsICAweDkwLCAgMHgwYywgIDB4NjAsICAweDE0LAotICAweDYxLCAgMHgwOCwgIDB4MDUsICAweDViLCAgMHg4YiwgIDB4MDEsICAweGIzLCAgMHhmZSwgIDB4MWYsICAweDgwLCAgMHgxMywgIDB4NjIsICAweGZlLCAgMHg0NCwgIDB4OTAsICAweGZlLAotICAweGM2LCAgMHg5MCwgIDB4MGMsICAweDNmLCAgMHgxNCwgIDB4NDAsICAweGZlLCAgMHgwOCwgIDB4OTAsICAweGZlLCAgMHg4YSwgIDB4OTAsICAweDBjLCAgMHg1ZSwgIDB4MTQsICAweDVmLAotICAweGZlLCAgMHg0MCwgIDB4OTAsICAweGZlLCAgMHhjMiwgIDB4OTAsICAweDBjLCAgMHgzZCwgIDB4MTQsICAweDNlLCAgMHgwYywgIDB4MmUsICAweDE0LCAgMHgzYywgIDB4MjEsICAweDBjLAotICAweDQ5LCAgMHgwYywgIDB4NjMsICAweDA4LCAgMHg1NCwgIDB4MWYsICAweDM3LCAgMHgyYywgIDB4MGYsICAweGZlLCAgMHg0ZSwgIDB4MTEsICAweDI3LCAgMHhkZCwgIDB4ZmUsICAweDllLAotICAweGYwLCAgMHhmZSwgIDB4NzYsICAweDA4LCAgMHhiYywgIDB4MTcsICAweDM0LCAgMHgyYywgIDB4NzcsICAweGU2LCAgMHhjNSwgIDB4ZmUsICAweDlhLCAgMHgwOCwgIDB4YzYsICAweGZlLAotICAweGI4LCAgMHgwOCwgIDB4OTQsICAweGZlLCAgMHg4ZSwgIDB4MDgsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHg5NCwgIDB4MDgsICAweDk1LCAgMHg4NiwgIDB4MDIsICAweDI0LAotICAweDAxLCAgMHg0YiwgIDB4ZmUsICAweGM5LCAgMHgxMCwgIDB4MTYsICAweDFmLCAgMHhmZSwgIDB4YzksICAweDEwLCAgMHg2OCwgIDB4MDUsICAweDA2LCAgMHhmZSwgIDB4MTAsICAweDEyLAotICAweDY4LCAgMHgwNSwgIDB4MGEsICAweDRlLCAgMHgwOCwgIDB4MDUsICAweDBhLCAgMHhmZSwgIDB4OTAsICAweDEyLCAgMHhmZSwgIDB4MmUsICAweDFjLCAgMHgwMiwgIDB4ZmUsICAweDE4LAotICAweDBiLCAgMHg2OCwgIDB4MDUsICAweDA2LCAgMHg0ZSwgIDB4NjgsICAweDA1LCAgMHgwYSwgIDB4ZmUsICAweDdhLCAgMHgxMiwgIDB4ZmUsICAweDJjLCAgMHgxYywgIDB4ZmUsICAweGFhLAotICAweGYwLCAgMHhmZSwgIDB4ZDIsICAweDA5LCAgMHhmZSwgIDB4YWMsICAweGYwLCAgMHhmZSwgIDB4MDAsICAweDA5LCAgMHgwMiwgIDB4ZmUsICAweGRlLCAgMHgwOSwgIDB4ZmUsICAweGI3LAotICAweGYwLCAgMHhmZSwgIDB4ZmMsICAweDA4LCAgMHhmZSwgIDB4MDIsICAweGY2LCAgMHgxYSwgIDB4NTAsICAweGZlLCAgMHg3MCwgIDB4MTgsICAweGZlLCAgMHhmMSwgIDB4MTgsICAweGZlLAotICAweDQwLCAgMHg1NSwgIDB4ZmUsICAweGUxLCAgMHg1NSwgIDB4ZmUsICAweDEwLCAgMHg1OCwgIDB4ZmUsICAweDkxLCAgMHg1OCwgIDB4ZmUsICAweDE0LCAgMHg1OSwgIDB4ZmUsICAweDk1LAotICAweDU5LCAgMHgxYywgIDB4ODUsICAweGZlLCAgMHg4YywgIDB4ZjAsICAweGZlLCAgMHhmYywgIDB4MDgsICAweGZlLCAgMHhhYywgIDB4ZjAsICAweGZlLCAgMHhmMCwgIDB4MDgsICAweGI1LAotICAweGZlLCAgMHhjYiwgIDB4MTAsICAweGZlLCAgMHhhZCwgIDB4ZjAsICAweGZlLCAgMHgwYywgIDB4MDksICAweDAyLCAgMHhmZSwgIDB4MTgsICAweDBiLCAgMHhiNiwgIDB4ZmUsICAweGJmLAotICAweDEwLCAgMHhmZSwgIDB4MmIsICAweGYwLCAgMHg4NSwgIDB4ZjQsICAweDFlLCAgMHhmZSwgIDB4MDAsICAweGZlLCAgMHhmZSwgIDB4MWMsICAweDEyLCAgMHhjMiwgIDB4ZmUsICAweGQyLAotICAweGYwLCAgMHg4NSwgIDB4ZmUsICAweDc2LCAgMHgxOCwgIDB4MWUsICAweDE5LCAgMHgxNywgIDB4ODUsICAweDAzLCAgMHhkMiwgIDB4MWUsICAweDA2LCAgMHgxNywgIDB4ODUsICAweGM1LAotICAweDRhLCAgMHhjNiwgIDB4NGEsICAweGI1LCAgMHhiNiwgIDB4ZmUsICAweDg5LCAgMHgxMCwgIDB4NzQsICAweDY3LCAgMHgyZCwgIDB4MTUsICAweDlkLCAgMHgwMSwgIDB4MzYsICAweDEwLAotICAweGZlLCAgMHgzNSwgIDB4MDAsICAweGZlLCAgMHgwMSwgIDB4ZjAsICAweDY1LCAgMHgxMCwgIDB4ODAsICAweDAyLCAgMHg2NSwgIDB4ZmUsICAweDk4LCAgMHg4MCwgIDB4ZmUsICAweDE5LAotICAweGU0LCAgMHgwYSwgIDB4ZmUsICAweDFhLCAgMHgxMiwgIDB4NTEsICAweGZlLCAgMHgxOSwgIDB4ODIsICAweGZlLCAgMHg2YywgIDB4MTgsICAweGZlLCAgMHg0NCwgIDB4NTQsICAweGJlLAotICAweGZlLCAgMHgxOSwgIDB4ODEsICAweGZlLCAgMHg3NCwgIDB4MTgsICAweDhmLCAgMHg5MCwgIDB4MTcsICAweGZlLCAgMHhjZSwgIDB4MDgsICAweDAyLCAgMHg0YSwgIDB4MDgsICAweDA1LAotICAweDVhLCAgMHhlYywgIDB4MDMsICAweDJlLCAgMHgyOSwgIDB4M2MsICAweDBjLCAgMHgzZiwgIDB4MTQsICAweDQwLCAgMHg5YiwgIDB4MmUsICAweDljLCAgMHgzYywgIDB4ZmUsICAweDZjLAotICAweDE4LCAgMHhmZSwgIDB4ZWQsICAweDE4LCAgMHhmZSwgIDB4NDQsICAweDU0LCAgMHhmZSwgIDB4ZTUsICAweDU0LCAgMHgzYSwgIDB4M2YsICAweDNiLCAgMHg0MCwgIDB4MDMsICAweDQ5LAotICAweDI5LCAgMHg2MywgIDB4OGYsICAweGZlLCAgMHhlMywgIDB4NTQsICAweGZlLCAgMHg3NCwgIDB4MTgsICAweGZlLCAgMHhmNSwgIDB4MTgsICAweDhmLCAgMHhmZSwgIDB4ZTMsICAweDU0LAotICAweDkwLCAgMHhjMCwgIDB4NTYsICAweGZlLCAgMHhjZSwgIDB4MDgsICAweDAyLCAgMHg0YSwgIDB4ZmUsICAweDM3LCAgMHhmMCwgIDB4ZmUsICAweGRhLCAgMHgwOSwgIDB4ZmUsICAweDhiLAotICAweGYwLCAgMHhmZSwgIDB4NjAsICAweDA5LCAgMHgwMiwgIDB4NGEsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweDIzLCAgMHhmZSwgIDB4ZmEsICAweDBhLCAgMHgzYSwgIDB4NDksICAweDNiLAotICAweDYzLCAgMHg1NiwgIDB4ZmUsICAweDNlLCAgMHgwYSwgIDB4MGYsICAweGZlLCAgMHhjMCwgIDB4MDcsICAweDQxLCAgMHg5OCwgIDB4MDAsICAweGFkLCAgMHhmZSwgIDB4MDEsICAweDU5LAotICAweGZlLCAgMHg1MiwgIDB4ZjAsICAweGZlLCAgMHgwYywgIDB4MGEsICAweDhmLCAgMHg3YSwgIDB4ZmUsICAweDI0LCAgMHgwYSwgIDB4M2EsICAweDQ5LCAgMHg4ZiwgIDB4ZmUsICAweGUzLAotICAweDU0LCAgMHg1NywgIDB4NDksICAweDdkLCAgMHg2MywgIDB4ZmUsICAweDE0LCAgMHg1OCwgIDB4ZmUsICAweDk1LCAgMHg1OCwgIDB4MDIsICAweDRhLCAgMHgzYSwgIDB4NDksICAweDNiLAotICAweDYzLCAgMHhmZSwgIDB4MTQsICAweDU5LCAgMHhmZSwgIDB4OTUsICAweDU5LCAgMHhiZSwgIDB4NTcsICAweDQ5LCAgMHg1NywgIDB4NjMsICAweDAyLCAgMHg0YSwgIDB4MDgsICAweDA1LAotICAweDVhLCAgMHhmZSwgIDB4ODIsICAweDEyLCAgMHgwOCwgIDB4MDUsICAweDFmLCAgMHhmZSwgIDB4NjYsICAweDEzLCAgMHgyMiwgIDB4NjIsICAweGI3LCAgMHhmZSwgIDB4MDMsICAweGExLAotICAweGZlLCAgMHg4MywgIDB4ODAsICAweGZlLCAgMHhjOCwgIDB4NDQsICAweGZlLCAgMHgyZSwgIDB4MTMsICAweGZlLCAgMHgwNCwgIDB4OTEsICAweGZlLCAgMHg4NiwgIDB4OTEsICAweDZhLAotICAweDJhLCAgMHhmZSwgIDB4NDAsICAweDU5LCAgMHhmZSwgIDB4YzEsICAweDU5LCAgMHg1NiwgIDB4ZTAsICAweDAzLCAgMHg2MCwgIDB4MjksICAweDYxLCAgMHgwYywgIDB4N2YsICAweDE0LAotICAweDgwLCAgMHg1NywgIDB4NjAsICAweDdkLCAgMHg2MSwgIDB4MDEsICAweGIzLCAgMHhiOCwgIDB4NmEsICAweDJhLCAgMHgxMywgIDB4NjIsICAweDliLCAgMHgyZSwgIDB4OWMsICAweDNjLAotICAweDNhLCAgMHgzZiwgIDB4M2IsICAweDQwLCAgMHg5MCwgIDB4YzAsICAweGZlLCAgMHgwNCwgIDB4ZmEsICAweDJlLCAgMHhmZSwgIDB4MDUsICAweGZhLCAgMHgzYywgIDB4MDEsICAweGVmLAotICAweGZlLCAgMHgzNiwgIDB4MTAsICAweDIxLCAgMHgwYywgIDB4N2YsICAweDBjLCAgMHg4MCwgIDB4M2EsICAweDNmLCAgMHgzYiwgIDB4NDAsICAweGU0LCAgMHgwOCwgIDB4MDUsICAweDFmLAotICAweDE3LCAgMHhlMCwgIDB4M2EsICAweDNkLCAgMHgzYiwgIDB4M2UsICAweDA4LCAgMHgwNSwgIDB4ZmUsICAweGY3LCAgMHgwMCwgIDB4MzcsICAweDAzLCAgMHg1ZSwgIDB4MjksICAweDVmLAotICAweGZlLCAgMHgxMCwgIDB4NTgsICAweGZlLCAgMHg5MSwgIDB4NTgsICAweDU3LCAgMHg0OSwgIDB4N2QsICAweDYzLCAgMHgwMiwgIDB4ZmUsICAweGY0LCAgMHgwOSwgIDB4MDgsICAweDA1LAotICAweDFmLCAgMHgxNywgIDB4ZTAsICAweDA4LCAgMHgwNSwgIDB4ZmUsICAweGY3LCAgMHgwMCwgIDB4MzcsICAweGJlLCAgMHhmZSwgIDB4MTksICAweDgxLCAgMHg1MCwgIDB4ZmUsICAweDEwLAotICAweDkwLCAgMHhmZSwgIDB4OTIsICAweDkwLCAgMHhmZSwgIDB4ZDMsICAweDEwLCAgMHgzMiwgIDB4MDcsICAweGE2LCAgMHgxNywgIDB4ZmUsICAweDA4LCAgMHgwOSwgIDB4MTIsICAweGE2LAotICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHgxNCwgIDB4MTMsICAweDAzLCAgMHgzZCwgIDB4MjksICAweDNlLCAgMHg1NiwgIDB4ZmUsICAweDA4LCAgMHgwOSwgIDB4ZmUsICAweDBjLAotICAweDU4LCAgMHhmZSwgIDB4OGQsICAweDU4LCAgMHgwMiwgIDB4NGEsICAweDIxLCAgMHg0MSwgIDB4ZmUsICAweDE5LCAgMHg4MCwgIDB4ZTcsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLAotICAweDFhLCAgMHgxMiwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4ZmUsICAweDE5LCAgMHg0MSwgIDB4ZjQsICAweGMyLCAgMHhmZSwgIDB4ZDEsICAweGYwLCAgMHhlMiwgIDB4MTUsICAweDdlLAotICAweDAxLCAgMHgzNiwgIDB4MTAsICAweGZlLCAgMHg0NCwgIDB4MDAsICAweGZlLCAgMHg4ZSwgIDB4MTAsICAweGZlLCAgMHg2YywgIDB4MTksICAweDU3LCAgMHgzZCwgIDB4ZmUsICAweGVkLAotICAweDE5LCAgMHg3ZCwgIDB4M2UsICAweGZlLCAgMHgwYywgIDB4NTEsICAweGZlLCAgMHg4ZSwgIDB4NTEsICAweGY0LCAgMHgxZSwgIDB4ZmUsICAweDAwLCAgMHhmZiwgIDB4MzUsICAweGZlLAotICAweDc0LCAgMHgxMCwgIDB4YzIsICAweGZlLCAgMHhkMiwgIDB4ZjAsICAweGZlLCAgMHhhNiwgIDB4MGIsICAweGZlLCAgMHg3NiwgIDB4MTgsICAweDFlLCAgMHgxOSwgIDB4OGEsICAweDAzLAotICAweGQyLCAgMHgxZSwgIDB4MDYsICAweGZlLCAgMHgwOCwgIDB4MTMsICAweDEwLCAgMHhmZSwgIDB4MTYsICAweDAwLCAgMHgwMiwgIDB4NjUsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGZlLAotICAweGI4LCAgMHgwYiwgIDB4MTUsICAweDdlLCAgMHgwMSwgIDB4MzYsICAweDEwLCAgMHhmZSwgIDB4MTcsICAweDAwLCAgMHhmZSwgIDB4NDIsICAweDEwLCAgMHhmZSwgIDB4Y2UsICAweGYwLAotICAweGZlLCAgMHhiZSwgIDB4MGIsICAweGZlLCAgMHgzYywgIDB4MTAsICAweGZlLCAgMHhjZCwgIDB4ZjAsICAweGZlLCAgMHhjYSwgIDB4MGIsICAweDEwLCAgMHhmZSwgIDB4MjIsICAweDAwLAotICAweDAyLCAgMHg2NSwgIDB4ZmUsICAweGNiLCAgMHhmMCwgIDB4ZmUsICAweGQ2LCAgMHgwYiwgIDB4MTAsICAweGZlLCAgMHgyNCwgIDB4MDAsICAweDAyLCAgMHg2NSwgIDB4ZmUsICAweGQwLAotICAweGYwLCAgMHhmZSwgIDB4ZTAsICAweDBiLCAgMHgxMCwgIDB4OWUsICAweGU1LCAgMHhmZSwgIDB4Y2YsICAweGYwLCAgMHhmZSwgIDB4ZWEsICAweDBiLCAgMHgxMCwgIDB4NTgsICAweGZlLAotICAweDEwLCAgMHgxMCwgIDB4ZmUsICAweGNjLCAgMHhmMCwgIDB4ZTIsICAweDY4LCAgMHgwNSwgIDB4MWYsICAweDRkLCAgMHgxMCwgIDB4ZmUsICAweDEyLCAgMHgwMCwgIDB4MmMsICAweDBmLAotICAweGZlLCAgMHg0ZSwgIDB4MTEsICAweDI3LCAgMHhmZSwgIDB4MDAsICAweDBjLCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4MTQsICAweDBjLCAgMHhiYywgIDB4MTcsICAweDM0LAotICAweDJjLCAgMHg3NywgIDB4ZTYsICAweGM1LCAgMHgyNCwgIDB4YzYsICAweDI0LCAgMHgyYywgIDB4ZmEsICAweDI3LCAgMHhmZSwgIDB4MjAsICAweDBjLCAgMHgxYywgIDB4MzQsICAweDk0LAotICAweGZlLCAgMHgzYywgIDB4MGMsICAweDk1LCAgMHg4NiwgIDB4YzUsICAweGRjLCAgMHhjNiwgIDB4ZGMsICAweDAyLCAgMHgyNCwgIDB4MDEsICAweDRiLCAgMHhmZSwgIDB4ZGIsICAweDEwLAotICAweDEyLCAgMHhmZSwgIDB4ZTgsICAweDAwLCAgMHhiNSwgIDB4YjYsICAweDc0LCAgMHhjNywgIDB4ODEsICAweGM4LCAgMHg4MywgIDB4ZmUsICAweDg5LCAgMHhmMCwgIDB4MjQsICAweDMzLAotICAweDMxLCAgMHhlMSwgIDB4YzcsICAweDgxLCAgMHhjOCwgIDB4ODMsICAweDI3LCAgMHhmZSwgIDB4NjYsICAweDBjLCAgMHgxZCwgIDB4MjQsICAweDMzLCAgMHgzMSwgIDB4ZGYsICAweGJjLAotICAweDRlLCAgMHgxMCwgIDB4ZmUsICAweDQyLCAgMHgwMCwgIDB4MDIsICAweDY1LCAgMHg3YywgIDB4MDYsICAweGZlLCAgMHg4MSwgIDB4NDksICAweDE3LCAgMHhmZSwgIDB4MmMsICAweDBkLAotICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGZlLCAgMHg0NCwgIDB4MTMsICAweDEwLCAgMHgwMCwgIDB4NTUsICAweDBhLCAgMHhmZSwgIDB4NTQsICAweDEyLCAgMHg1NSwgIDB4ZmUsICAweDI4LAotICAweDAwLCAgMHgyMywgIDB4ZmUsICAweDlhLCAgMHgwZCwgIDB4MDksICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweDA3LCAgMHgwMCwgIDB4NjYsICAweDQ0LCAgMHhmZSwgIDB4MjgsICAweDAwLAotICAweGZlLCAgMHhlMiwgIDB4MTAsICAweDAxLCAgMHhmNSwgIDB4MDEsICAweGY2LCAgMHgwOSwgIDB4YTQsICAweDAxLCAgMHhmZSwgIDB4MjYsICAweDBmLCAgMHg2NCwgIDB4MTIsICAweDJmLAotICAweDAxLCAgMHg3MywgIDB4MDIsICAweDJiLCAgMHgxMCwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4NTUsICAweDBhLCAgMHhlOSwgIDB4NDQsICAweDBhLCAgMHhmZSwgIDB4YjQsICAweDEwLAotICAweDAxLCAgMHhiMCwgIDB4NDQsICAweDBhLCAgMHhmZSwgIDB4YWEsICAweDEwLCAgMHgwMSwgIDB4YjAsICAweGZlLCAgMHgxOSwgIDB4ODIsICAweGZlLCAgMHgzNCwgIDB4NDYsICAweGFjLAotICAweDQ0LCAgMHgwYSwgIDB4MTAsICAweGZlLCAgMHg0MywgIDB4MDAsICAweGZlLCAgMHg5NiwgIDB4MTAsICAweDA4LCAgMHg1NCwgIDB4MGEsICAweDM3LCAgMHgwMSwgIDB4ZjUsICAweDAxLAotICAweGY2LCAgMHg2NCwgIDB4MTIsICAweDJmLCAgMHgwMSwgIDB4NzMsICAweDk5LCAgMHgwYSwgIDB4NjQsICAweDQyLCAgMHg5MiwgIDB4MDIsICAweGZlLCAgMHgyZSwgIDB4MDMsICAweDA4LAotICAweDA1LCAgMHgwYSwgIDB4OGEsICAweDQ0LCAgMHgwYSwgIDB4MTAsICAweDAwLCAgMHhmZSwgIDB4NWMsICAweDEwLCAgMHg2OCwgIDB4MDUsICAweDFhLCAgMHhmZSwgIDB4NTgsICAweDEyLAotICAweDA4LCAgMHgwNSwgIDB4MWEsICAweGZlLCAgMHg1MCwgIDB4MTMsICAweGZlLCAgMHgxYywgIDB4MWMsICAweGZlLCAgMHg5ZCwgIDB4ZjAsICAweGZlLCAgMHg1MCwgIDB4MGQsICAweGZlLAotICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsICAweDU2LCAgMHgwZCwgIDB4MDgsICAweDU0LCAgMHgxYSwgIDB4MzcsICAweGZlLCAgMHhhOSwgIDB4MTAsICAweDEwLAotICAweGZlLCAgMHgxNSwgIDB4MDAsICAweGZlLCAgMHgwNCwgIDB4ZTYsICAweDBhLCAgMHg1MCwgIDB4ZmUsICAweDJlLCAgMHgxMCwgIDB4MTAsICAweGZlLCAgMHgxMywgIDB4MDAsICAweGZlLAotICAweDEwLCAgMHgxMCwgIDB4MTAsICAweDZmLCAgMHhhYiwgIDB4MTAsICAweGZlLCAgMHg0MSwgIDB4MDAsICAweGFhLCAgMHgxMCwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4OGMsICAweGI1LAotICAweGI2LCAgMHg3NCwgIDB4MDMsICAweDcwLCAgMHgyOCwgIDB4MjMsICAweGQ4LCAgMHg1MCwgIDB4ZmUsICAweDA0LCAgMHhlNiwgIDB4MWEsICAweGZlLCAgMHg5ZCwgIDB4NDEsICAweGZlLAotICAweDFjLCAgMHg0MiwgIDB4NjQsICAweDAxLCAgMHhlMywgIDB4MDIsICAweDJiLCAgMHhmOCwgIDB4MTUsICAweDBhLCAgMHgzOSwgIDB4YTAsICAweGI0LCAgMHgxNSwgIDB4ZmUsICAweDMxLAotICAweDAwLCAgMHgzOSwgIDB4YTIsICAweDAxLCAgMHhmZSwgIDB4NDgsICAweDEwLCAgMHgwMiwgIDB4ZDcsICAweDQyLCAgMHhmZSwgIDB4MDYsICAweGVjLCAgMHhkMCwgIDB4ZmMsICAweDQ0LAotICAweDFiLCAgMHhmZSwgIDB4Y2UsICAweDQ1LCAgMHgzNSwgIDB4NDIsICAweGZlLCAgMHgwNiwgIDB4ZWEsICAweGQwLCAgMHhmZSwgIDB4NDcsICAweDRiLCAgMHg5MSwgIDB4ZmUsICAweDc1LAotICAweDU3LCAgMHgwMywgIDB4NWQsICAweGZlLCAgMHg5OCwgIDB4NTYsICAweGZlLCAgMHgzOCwgIDB4MTIsICAweDA5LCAgMHg0OCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDQsICAweDQ4LAotICAweDRmLCAgMHgwOCwgIDB4MDUsICAweDFiLCAgMHhmZSwgIDB4MWEsICAweDEzLCAgMHgwOSwgIDB4NDYsICAweDAxLCAgMHgwZSwgIDB4NDEsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDA5LAotICAweGE0LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg0OSwgIDB4NTQsICAweDk2LCAgMHhmZSwgIDB4MWUsICAweDBlLCAgMHgwMiwgIDB4ZmUsICAweDJlLCAgMHgwMywgIDB4MDksICAweDVkLAotICAweGZlLCAgMHhlZSwgIDB4MTQsICAweGZjLCAgMHg0NCwgIDB4MWIsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDM1LCAgMHg0MiwgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGFkLAotICAweDEzLCAgMHgwMiwgIDB4MmIsICAweDIyLCAgMHgyMCwgIDB4MDcsICAweDExLCAgMHhmZSwgIDB4OWUsICAweDEyLCAgMHgyMSwgIDB4MTMsICAweDU5LCAgMHgxMywgIDB4OWYsICAweDEzLAotICAweGQ1LCAgMHgyMiwgIDB4MmYsICAweDQxLCAgMHgzOSwgIDB4MmYsICAweGJjLCAgMHhhZCwgIDB4ZmUsICAweGJjLCAgMHhmMCwgIDB4ZmUsICAweGUwLCAgMHgwZSwgIDB4MGYsICAweDA2LAotICAweDEzLCAgMHg1OSwgIDB4MDEsICAweGZlLCAgMHhkYSwgIDB4MTYsICAweDAzLCAgMHhmZSwgIDB4MzgsICAweDAxLCAgMHgyOSwgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4NTYsICAweGZlLAotICAweGU0LCAgMHgwZSwgIDB4ZmUsICAweDAyLCAgMHhlYywgIDB4ZDUsICAweDY5LCAgMHgwMCwgIDB4NjYsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDIwLCAgMHg0ZiwgIDB4ZmUsICAweDA1LAotICAweGY2LCAgMHhmZSwgIDB4MzQsICAweDAxLCAgMHgwMSwgIDB4ZmUsICAweDRhLCAgMHgxNywgIDB4ZmUsICAweDA4LCAgMHg5MCwgIDB4ZmUsICAweDQ4LCAgMHhmNCwgIDB4MGQsICAweGZlLAotICAweDE4LCAgMHgxMywgIDB4YmEsICAweGZlLCAgMHgwMiwgIDB4ZWEsICAweGQ1LCAgMHg2OSwgIDB4N2UsICAweGZlLCAgMHhjNSwgIDB4MTMsICAweDE1LCAgMHgxYSwgIDB4MzksICAweGEwLAotICAweGI0LCAgMHhmZSwgIDB4MmUsICAweDEwLCAgMHgwMywgIDB4ZmUsICAweDM4LCAgMHgwMSwgIDB4MWUsICAweGZlLCAgMHhmMCwgIDB4ZmYsICAweDBjLCAgMHhmZSwgIDB4NjAsICAweDAxLAotICAweDAzLCAgMHhmZSwgIDB4M2EsICAweDAxLCAgMHgwYywgIDB4ZmUsICAweDYyLCAgMHgwMSwgIDB4NDMsICAweDEzLCAgMHgyMCwgIDB4MjUsICAweDA2LCAgMHgxMywgIDB4MmYsICAweDEyLAotICAweDJmLCAgMHg5MiwgIDB4MGYsICAweDA2LCAgMHgwNCwgIDB4MjEsICAweDA0LCAgMHgyMiwgIDB4NTksICAweGZlLCAgMHhmNywgIDB4MTIsICAweDIyLCAgMHg5ZiwgIDB4YjcsICAweDEzLAotICAweDlmLCAgMHgwNywgIDB4N2UsICAweGZlLCAgMHg3MSwgIDB4MTMsICAweGZlLCAgMHgyNCwgIDB4MWMsICAweDE1LCAgMHgxOSwgIDB4MzksICAweGEwLCAgMHhiNCwgIDB4ZmUsICAweGQ5LAotICAweDEwLCAgMHhjMywgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsICAweDczLCAgMHg1NywgIDB4ZmUsICAweDgwLCAgMHg1ZCwgIDB4MDQsICAweGMzLCAgMHhmZSwgIDB4MDMsICAweGRjLAotICAweGZlLCAgMHg1YiwgIDB4NTcsICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDA0LCAgMHhmZSwgIDB4MDMsICAweDU3LCAgMHhjMywgIDB4MjEsICAweGZlLCAgMHgwMCwgIDB4Y2MsICAweDA0LAotICAweGZlLCAgMHgwMywgIDB4NTcsICAweGMzLCAgMHg3OCwgIDB4MDQsICAweDA4LCAgMHgwNSwgIDB4NTgsICAweGZlLCAgMHgyMiwgIDB4MTMsICAweGZlLCAgMHgxYywgIDB4ODAsICAweDA3LAotICAweDA2LCAgMHhmZSwgIDB4MWEsICAweDEzLCAgMHhmZSwgIDB4MWUsICAweDgwLCAgMHhlZCwgIDB4ZmUsICAweDFkLCAgMHg4MCwgIDB4YWUsICAweGZlLCAgMHgwYywgIDB4OTAsICAweGZlLAotICAweDBlLCAgMHgxMywgIDB4ZmUsICAweDBlLCAgMHg5MCwgIDB4YWMsICAweGZlLCAgMHgzYywgIDB4OTAsICAweGZlLCAgMHgzMCwgIDB4ZjQsICAweDBhLCAgMHhmZSwgIDB4M2MsICAweDUwLAotICAweGFhLCAgMHgwMSwgIDB4ZmUsICAweDdhLCAgMHgxNywgIDB4MzIsICAweDA3LCAgMHgyZiwgIDB4YWQsICAweDAxLCAgMHhmZSwgIDB4YjQsICAweDE2LCAgMHgwOCwgIDB4MDUsICAweDFiLAotICAweDRlLCAgMHgwMSwgIDB4ZjUsICAweDAxLCAgMHhmNiwgIDB4MTIsICAweGZlLCAgMHhlOSwgIDB4MDAsICAweDA4LCAgMHgwNSwgIDB4NTgsICAweGZlLCAgMHgyYywgIDB4MTMsICAweDAxLAotICAweGZlLCAgMHgwYywgIDB4MTcsICAweGZlLCAgMHgxZSwgIDB4MWMsICAweGZlLCAgMHgxNCwgIDB4OTAsICAweGZlLCAgMHg5NiwgIDB4OTAsICAweDBjLCAgMHhmZSwgIDB4NjQsICAweDAxLAotICAweDE0LCAgMHhmZSwgIDB4NjYsICAweDAxLCAgMHgwOCwgIDB4MDUsICAweDViLCAgMHhmZSwgIDB4MTIsICAweDEyLCAgMHhmZSwgIDB4MDMsICAweDgwLCAgMHg4ZCwgIDB4ZmUsICAweDAxLAotICAweGVjLCAgMHgyMCwgIDB4ZmUsICAweDgwLCAgMHg0MCwgIDB4MTMsICAweDIwLCAgMHg2YSwgIDB4MmEsICAweDEyLCAgMHhjZiwgIDB4NjQsICAweDIyLCAgMHgyMCwgIDB4ZmIsICAweDc5LAotICAweDIwLCAgMHgwNCwgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4MDMsICAweGZlLCAgMHhhYywgIDB4MDAsICAweGZlLCAgMHgwNiwgIDB4NTgsICAweDAzLCAgMHhmZSwgIDB4YWUsICAweDAwLAorc3RhdGljIHVuc2lnbmVkIGNoYXIgX2Fkdl9hc2MzOEMwODAwX2J1ZltdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MTYsIDB4MTgsIDB4ZTQsCisJMHgwMSwgMHgwMCwgMHg0OCwgMHhlNCwKKwkweDE4LCAweDgwLCAweDAzLCAweGY2LCAweDAyLCAweDAwLCAweGNlLCAweDE5LCAweDAwLCAweGZhLCAweGZmLCAweGZmLAorCTB4MWMsIDB4MGYsIDB4MDAsIDB4ZjYsCisJMHg5ZSwgMHhlNywgMHhmZiwgMHgwMCwgMHg4MiwgMHhlNywgMHgwMCwgMHhlYSwgMHgwMSwgMHhmYSwgMHgwMSwgMHhlNiwKKwkweDA5LCAweGU3LCAweDU1LCAweGYwLAorCTB4MDEsIDB4ZjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MWUsIDB4ZjAsIDB4ODUsIDB4ZjAsCisJMHgxOCwgMHhmNCwgMHgwOCwgMHgwMCwKKwkweGJjLCAweDAwLCAweDM4LCAweDU0LCAweDAwLCAweGVjLCAweGQ1LCAweGYwLCAweDgyLCAweDBkLCAweDAwLCAweGU2LAorCTB4ODYsIDB4ZjAsIDB4YjEsIDB4ZjAsCisJMHg5OCwgMHg1NywgMHgwMSwgMHhmYywgMHhiNCwgMHgwMCwgMHhkNCwgMHgwMSwgMHgwYywgMHgxYywgMHgzZSwgMHgxYywKKwkweDNjLCAweDAwLCAweGJiLCAweDAwLAorCTB4MDAsIDB4MTAsIDB4YmEsIDB4MTksIDB4MDIsIDB4ODAsIDB4MzIsIDB4ZjAsIDB4N2MsIDB4MGQsIDB4MDIsIDB4MTMsCisJMHhiYSwgMHgxMywgMHgxOCwgMHg0MCwKKwkweDAwLCAweDU3LCAweDAxLCAweGVhLCAweDAyLCAweGZjLCAweDAzLCAweGZjLCAweDNlLCAweDAwLCAweDZjLCAweDAxLAorCTB4NmUsIDB4MDEsIDB4NzQsIDB4MDEsCisJMHg3NiwgMHgwMSwgMHhiOSwgMHg1NCwgMHgzZSwgMHg1NywgMHgwMCwgMHg4MCwgMHgwMywgMHhlNiwgMHhiNiwgMHgwMCwKKwkweGMwLCAweDAwLCAweDAxLCAweDAxLAorCTB4M2UsIDB4MDEsIDB4N2EsIDB4MDEsIDB4Y2EsIDB4MDgsIDB4Y2UsIDB4MTAsIDB4MTYsIDB4MTEsIDB4MDQsIDB4MTIsCisJMHgwOCwgMHgxMiwgMHgwMiwgMHg0YSwKKwkweGJiLCAweDU1LCAweDNjLCAweDU2LCAweDAzLCAweDU4LCAweDFiLCAweDgwLCAweDMwLCAweGU0LCAweDRiLCAweGU0LAorCTB4NWQsIDB4ZjAsIDB4MDIsIDB4ZmEsCisJMHgyMCwgMHgwMCwgMHgzMiwgMHgwMCwgMHg0MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgyNCwgMHgwMSwgMHgzYywgMHgwMSwKKwkweDY4LCAweDAxLCAweDZhLCAweDAxLAorCTB4NzAsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzgsIDB4MDEsIDB4N2MsIDB4MDEsIDB4NjIsIDB4MGEsIDB4ODYsIDB4MGQsCisJMHgwNiwgMHgxMywgMHg0YywgMHgxYywKKwkweDA0LCAweDgwLCAweDRhLCAweGU0LCAweDAyLCAweGVlLCAweDViLCAweGYwLCAweDAzLCAweGY3LCAweDBjLCAweDAwLAorCTB4MGYsIDB4MDAsIDB4NDcsIDB4MDAsCisJMHhiZSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyMCwgMHgxMSwgMHg1YywgMHgxNiwgMHgzMiwgMHgxYywgMHgzOCwgMHgxYywKKwkweDRlLCAweDFjLCAweDEwLCAweDQ0LAorCTB4MDAsIDB4NGMsIDB4MDQsIDB4ZWEsIDB4NWMsIDB4ZjAsIDB4YTcsIDB4ZjAsIDB4MDQsIDB4ZjYsIDB4MDMsIDB4ZmEsCisJMHgwNSwgMHgwMCwgMHgzNCwgMHgwMCwKKwkweDM2LCAweDAwLCAweDk4LCAweDAwLCAweGNjLCAweDAwLCAweDIwLCAweDAxLCAweDRlLCAweDAxLCAweDRhLCAweDBiLAorCTB4NDIsIDB4MGMsIDB4MTIsIDB4MGYsCisJMHgwYywgMHgxMCwgMHgyMiwgMHgxMSwgMHgwYSwgMHgxMiwgMHgwNCwgMHgxMywgMHgzMCwgMHgxYywgMHgwMiwgMHg0OCwKKwkweDAwLCAweDRlLCAweDQyLCAweDU0LAorCTB4NDQsIDB4NTUsIDB4YmQsIDB4NTYsIDB4MDYsIDB4ODMsIDB4MDAsIDB4ZGMsIDB4MDUsIDB4ZjAsIDB4MDksIDB4ZjAsCisJMHg1OSwgMHhmMCwgMHhiOCwgMHhmMCwKKwkweDRiLCAweGY0LCAweDA2LCAweGY3LCAweDBlLCAweGY3LCAweDA0LCAweGZjLCAweDA1LCAweGZjLCAweDA2LCAweDAwLAorCTB4MTksIDB4MDAsIDB4MzMsIDB4MDAsCisJMHg5YiwgMHgwMCwgMHhhNCwgMHgwMCwgMHhiNSwgMHgwMCwgMHhiYSwgMHgwMCwgMHhkMCwgMHgwMCwgMHhlMSwgMHgwMCwKKwkweGU3LCAweDAwLCAweGUyLCAweDAzLAorCTB4MDgsIDB4MGYsIDB4MDIsIDB4MTAsIDB4MDQsIDB4MTAsIDB4MGEsIDB4MTAsIDB4MGEsIDB4MTMsIDB4MGMsIDB4MTMsCisJMHgxMiwgMHgxMywgMHgyNCwgMHgxNCwKKwkweDM0LCAweDE0LCAweDA0LCAweDE2LCAweDA4LCAweDE2LCAweGE0LCAweDE3LCAweDIwLCAweDFjLCAweDM0LCAweDFjLAorCTB4MzYsIDB4MWMsIDB4MDgsIDB4NDQsCisJMHgzOCwgMHg0NCwgMHg5MSwgMHg0NCwgMHgwYSwgMHg0NSwgMHg0OCwgMHg0NiwgMHgwMSwgMHg0OCwgMHg2OCwgMHg1NCwKKwkweDNhLCAweDU1LCAweDgzLCAweDU1LAorCTB4ZTUsIDB4NTUsIDB4YjAsIDB4NTcsIDB4MDEsIDB4NTgsIDB4ODMsIDB4NTksIDB4MDUsIDB4ZTYsIDB4MGIsIDB4ZjAsCisJMHgwYywgMHhmMCwgMHgwNCwgMHhmOCwKKwkweDA1LCAweGY4LCAweDA3LCAweDAwLCAweDBhLCAweDAwLCAweDFjLCAweDAwLCAweDFlLCAweDAwLCAweDllLCAweDAwLAorCTB4YTgsIDB4MDAsIDB4YWEsIDB4MDAsCisJMHhiOSwgMHgwMCwgMHhlMCwgMHgwMCwgMHgyMiwgMHgwMSwgMHgyNiwgMHgwMSwgMHg3OSwgMHgwMSwgMHg3ZSwgMHgwMSwKKwkweGM0LCAweDAxLCAweGM2LCAweDAxLAorCTB4ODAsIDB4MDIsIDB4NWUsIDB4MDMsIDB4ZWUsIDB4MDQsIDB4OWEsIDB4MDYsIDB4ZjgsIDB4MDcsIDB4NjIsIDB4MDgsCisJMHg2OCwgMHgwOCwgMHg2OSwgMHgwOCwKKwkweGQ2LCAweDA4LCAweGU5LCAweDA5LCAweGZhLCAweDBiLCAweDJlLCAweDBmLCAweDEyLCAweDEwLCAweDFhLCAweDEwLAorCTB4ZWQsIDB4MTAsIDB4ZjEsIDB4MTAsCisJMHgyYSwgMHgxMSwgMHgwNiwgMHgxMiwgMHgwYywgMHgxMiwgMHgzZSwgMHgxMiwgMHgxMCwgMHgxMywgMHgxNiwgMHgxMywKKwkweDFlLCAweDEzLCAweDQ2LCAweDE0LAorCTB4NzYsIDB4MTQsIDB4ODIsIDB4MTQsIDB4MzYsIDB4MTUsIDB4Y2EsIDB4MTUsIDB4NmIsIDB4MTgsIDB4YmUsIDB4MTgsCisJMHhjYSwgMHgxOCwgMHhlNiwgMHgxOSwKKwkweDEyLCAweDFjLCAweDQ2LCAweDFjLCAweDljLCAweDMyLCAweDAwLCAweDQwLCAweDBlLCAweDQ3LCAweGZlLCAweDljLAorCTB4ZjAsIDB4MmIsIDB4MDIsIDB4ZmUsCisJMHhhYywgMHgwZCwgMHhmZiwgMHgxMCwgMHgwMCwgMHgwMCwgMHhkNywgMHhmZSwgMHhlOCwgMHgxOSwgMHgwMCwgMHhkNiwKKwkweGZlLCAweDg0LCAweDAxLCAweGZmLAorCTB4MDMsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4OTMsIDB4MTUsIDB4ZmUsIDB4MGYsIDB4MDUsIDB4ZmYsIDB4MzgsIDB4MDAsCisJMHgwMCwgMHhmZSwgMHg1NywgMHgyNCwKKwkweDAwLCAweGZlLCAweDRjLCAweDAwLCAweDViLCAweGZmLCAweDA0LCAweDAwLCAweDAwLCAweDExLCAweGZmLCAweDA5LAorCTB4MDAsIDB4MDAsIDB4ZmYsIDB4MDgsCisJMHgwMSwgMHgwMSwgMHhmZiwgMHgwOCwgMHhmZiwgMHhmZiwgMHhmZiwgMHgyNywgMHgwMCwgMHgwMCwgMHhmZiwgMHgxMCwKKwkweGZmLCAweGZmLCAweGZmLCAweDExLAorCTB4MDAsIDB4MDAsIDB4ZmUsIDB4NzgsIDB4NTYsIDB4ZmUsIDB4MzQsIDB4MTIsIDB4ZmYsIDB4MjEsIDB4MDAsIDB4MDAsCisJMHhmZSwgMHgwNCwgMHhmNywgMHhkNiwKKwkweDJjLCAweDk5LCAweDBhLCAweDAxLCAweGZlLCAweGMyLCAweDBmLCAweGZlLCAweDA0LCAweGY3LCAweGQ2LCAweDk5LAorCTB4MGEsIDB4NDIsIDB4MmMsIDB4ZmUsCisJMHgzZCwgMHhmMCwgMHhmZSwgMHgwNiwgMHgwMiwgMHhmZSwgMHgyMCwgMHhmMCwgMHhhNywgMHhmZSwgMHg5MSwgMHhmMCwKKwkweGZlLCAweGY0LCAweDAxLCAweGZlLAorCTB4OTAsIDB4ZjAsIDB4ZmUsIDB4ZjQsIDB4MDEsIDB4ZmUsIDB4OGYsIDB4ZjAsIDB4YTcsIDB4MDMsIDB4NWQsIDB4NGQsCisJMHgwMiwgMHhmZSwgMHhjOCwgMHgwZCwKKwkweDAxLCAweGZlLCAweDM4LCAweDBlLCAweGZlLCAweGRkLCAweDEyLCAweGZlLCAweGZjLCAweDEwLCAweGZlLCAweDI4LAorCTB4MWMsIDB4MDMsIDB4ZmUsIDB4YTYsCisJMHgwMCwgMHhmZSwgMHhkMywgMHgxMiwgMHg0MSwgMHgxNCwgMHhmZSwgMHhhNiwgMHgwMCwgMHhjMiwgMHhmZSwgMHg0OCwKKwkweGYwLCAweGZlLCAweDhhLCAweDAyLAorCTB4ZmUsIDB4NDksIDB4ZjAsIDB4ZmUsIDB4YTQsIDB4MDIsIDB4ZmUsIDB4NGEsIDB4ZjAsIDB4ZmUsIDB4YzIsIDB4MDIsCisJMHhmZSwgMHg0NiwgMHhmMCwgMHhmZSwKKwkweDU0LCAweDAyLCAweGZlLCAweDQ3LCAweGYwLCAweGZlLCAweDVhLCAweDAyLCAweGZlLCAweDQzLCAweGYwLCAweGZlLAorCTB4NDgsIDB4MDIsIDB4ZmUsIDB4NDQsCisJMHhmMCwgMHhmZSwgMHg0YywgMHgwMiwgMHhmZSwgMHg0NSwgMHhmMCwgMHhmZSwgMHg1MCwgMHgwMiwgMHgxOCwgMHgwYSwKKwkweGFhLCAweDE4LCAweDA2LCAweDE0LAorCTB4YTEsIDB4MDIsIDB4MmIsIDB4ZmUsIDB4MDAsIDB4MWMsIDB4ZTcsIDB4ZmUsIDB4MDIsIDB4MWMsIDB4ZTYsIDB4ZmUsCisJMHgxZSwgMHgxYywgMHhmZSwgMHhlOSwKKwkweDEwLCAweDAxLCAweGZlLCAweDE4LCAweDE4LCAweGZlLCAweGU3LCAweDEwLCAweGZlLCAweDA2LCAweGZjLCAweGNlLAorCTB4MDksIDB4NzAsIDB4MDEsIDB4YTgsCisJMHgwMiwgMHgyYiwgMHgxNSwgMHg1OSwgMHgzOSwgMHhhMiwgMHgwMSwgMHhmZSwgMHg1OCwgMHgxMCwgMHgwOSwgMHg3MCwKKwkweDAxLCAweDg3LCAweGZlLCAweGJkLAorCTB4MTAsIDB4MDksIDB4NzAsIDB4MDEsIDB4ODcsIDB4ZmUsIDB4YWQsIDB4MTAsIDB4ZmUsIDB4MTYsIDB4MWMsIDB4ZmUsCisJMHg1OCwgMHgxYywgMHgxOCwgMHgwNiwKKwkweDE0LCAweGExLCAweDJjLCAweDFjLCAweDJiLCAweGZlLCAweDNkLCAweGYwLCAweGZlLCAweDA2LCAweDAyLCAweDIzLAorCTB4ZmUsIDB4OTgsIDB4MDIsIDB4ZmUsCisJMHg1YSwgMHgxYywgMHhmOCwgMHhmZSwgMHgxNCwgMHgxYywgMHgxNSwgMHhmZSwgMHgzMCwgMHgwMCwgMHgzOSwgMHhhMiwKKwkweDAxLCAweGZlLCAweDQ4LCAweDEwLAorCTB4MTgsIDB4MDYsIDB4MTQsIDB4YTEsIDB4MDIsIDB4ZDcsIDB4MjIsIDB4MjAsIDB4MDcsIDB4MTEsIDB4MzUsIDB4ZmUsCisJMHg2OSwgMHgxMCwgMHgxOCwgMHgwNiwKKwkweDE0LCAweGExLCAweGZlLCAweDA0LCAweGVjLCAweDIwLCAweDRmLCAweDQzLCAweDEzLCAweDIwLCAweGZlLCAweDA1LAorCTB4ZjYsIDB4Y2UsIDB4MDEsIDB4ZmUsCisJMHg0YSwgMHgxNywgMHgwOCwgMHg1NCwgMHg1OCwgMHgzNywgMHgxMiwgMHgyZiwgMHg0MiwgMHg5MiwgMHgwMSwgMHhmZSwKKwkweDgyLCAweDE2LCAweDAyLCAweDJiLAorCTB4MDksIDB4NDYsIDB4MDEsIDB4MGUsIDB4MDcsIDB4MDAsIDB4NjYsIDB4MDEsIDB4NzMsIDB4ZmUsIDB4MTgsIDB4MTAsCisJMHhmZSwgMHg0MSwgMHg1OCwgMHgwOSwKKwkweGE0LCAweDAxLCAweDBlLCAweGZlLCAweGM4LCAweDU0LCAweDZiLCAweGZlLCAweDEwLCAweDAzLCAweDAxLCAweGZlLAorCTB4ODIsIDB4MTYsIDB4MDIsIDB4MmIsCisJMHgyYywgMHg0ZiwgMHhmZSwgMHgwMiwgMHhlOCwgMHgyYSwgMHhmZSwgMHhiZiwgMHg1NywgMHhmZSwgMHg5ZSwgMHg0MywKKwkweGZlLCAweDc3LCAweDU3LCAweGZlLAorCTB4MjcsIDB4ZjAsIDB4ZmUsIDB4ZTAsIDB4MDEsIDB4ZmUsIDB4MDcsIDB4NGIsIDB4ZmUsIDB4MjAsIDB4ZjAsIDB4YTcsCisJMHhmZSwgMHg0MCwgMHgxYywgMHgxYywKKwkweGQ5LCAweGZlLCAweDI2LCAweGYwLCAweGZlLCAweDVhLCAweDAzLCAweGZlLCAweGEwLCAweGYwLCAweGZlLCAweDQ4LAorCTB4MDMsIDB4ZmUsIDB4MTEsIDB4ZjAsCisJMHhhNywgMHhmZSwgMHhlZiwgMHgxMCwgMHhmZSwgMHg5ZiwgMHhmMCwgMHhmZSwgMHg2OCwgMHgwMywgMHhmOSwgMHgxMCwKKwkweGZlLCAweDExLCAweDAwLCAweDAyLAorCTB4NjUsIDB4MmMsIDB4ZmUsIDB4NDgsIDB4MWMsIDB4ZjksIDB4MDgsIDB4MDUsIDB4MWIsIDB4ZmUsIDB4MTgsIDB4MTMsCisJMHgyMSwgMHgyMiwgMHhhMywgMHhiNywKKwkweDEzLCAweGEzLCAweDA5LCAweDQ2LCAweDAxLCAweDBlLCAweGI3LCAweDc4LCAweDAxLCAweGZlLCAweGI0LCAweDE2LAorCTB4MTIsIDB4ZDEsIDB4MWMsIDB4ZDksCisJMHhmZSwgMHgwMSwgMHhmMCwgMHhkOSwgMHhmZSwgMHg4MiwgMHhmMCwgMHhmZSwgMHg5NiwgMHgwMywgMHhmYSwgMHgxMiwKKwkweGZlLCAweGU0LCAweDAwLCAweDI3LAorCTB4ZmUsIDB4YTgsIDB4MDMsIDB4MWMsIDB4MzQsIDB4MWQsIDB4ZmUsIDB4YjgsIDB4MDMsIDB4MDEsIDB4NGIsIDB4ZmUsCisJMHgwNiwgMHhmMCwgMHhmZSwgMHhjOCwKKwkweDAzLCAweDk1LCAweDg2LCAweGZlLCAweDBhLCAweGYwLCAweGZlLCAweDhhLCAweDA2LCAweDAyLCAweDI0LCAweDAzLAorCTB4NzAsIDB4MjgsIDB4MTcsIDB4ZmUsCisJMHhmYSwgMHgwNCwgMHgxNSwgMHg2ZCwgMHgwMSwgMHgzNiwgMHg3YiwgMHhmZSwgMHg2YSwgMHgwMiwgMHgwMiwgMHhkOCwKKwkweGY5LCAweDJjLCAweDk5LCAweDE5LAorCTB4ZmUsIDB4NjcsIDB4MWIsIDB4ZmUsIDB4YmYsIDB4NTcsIDB4ZmUsIDB4NzcsIDB4NTcsIDB4ZmUsIDB4NDgsIDB4MWMsCisJMHg3NCwgMHgwMSwgMHhhZiwgMHg4YywKKwkweDA5LCAweDQ2LCAweDAxLCAweDBlLCAweDA3LCAweDAwLCAweDE3LCAweGRhLCAweDA5LCAweGQxLCAweDAxLCAweDBlLAorCTB4OGQsIDB4NTEsIDB4NjQsIDB4NzksCisJMHgyYSwgMHgwMywgMHg3MCwgMHgyOCwgMHhmZSwgMHgxMCwgMHgxMiwgMHgxNSwgMHg2ZCwgMHgwMSwgMHgzNiwgMHg3YiwKKwkweGZlLCAweDZhLCAweDAyLCAweDAyLAorCTB4ZDgsIDB4YzcsIDB4ODEsIDB4YzgsIDB4ODMsIDB4MWMsIDB4MjQsIDB4MjcsIDB4ZmUsIDB4NDAsIDB4MDQsIDB4MWQsCisJMHhmZSwgMHgzYywgMHgwNCwgMHgzYiwKKwkweGZlLCAweGEwLCAweDAwLCAweGZlLCAweDliLCAweDU3LCAweGZlLCAweDRlLCAweDEyLCAweDJkLCAweGZmLCAweDAyLAorCTB4MDAsIDB4MTAsIDB4MDEsIDB4MGIsCisJMHgxZCwgMHhmZSwgMHhlNCwgMHgwNCwgMHgyZCwgMHgwMSwgMHgwYiwgMHgxZCwgMHgyNCwgMHgzMywgMHgzMSwgMHhkZSwKKwkweGZlLCAweDRjLCAweDQ0LCAweGZlLAorCTB4NGMsIDB4MTIsIDB4NTEsIDB4ZmUsIDB4NDQsIDB4NDgsIDB4MGYsIDB4NmYsIDB4ZmUsIDB4NGMsIDB4NTQsIDB4NmIsCisJMHhkYSwgMHg0ZiwgMHg3OSwgMHgyYSwKKwkweGZlLCAweDA2LCAweDgwLCAweGZlLCAweDQ4LCAweDQ3LCAweGZlLCAweDYyLCAweDEzLCAweDA4LCAweDA1LCAweDFiLAorCTB4ZmUsIDB4MmEsIDB4MTMsIDB4MzIsCisJMHgwNywgMHg4MiwgMHhmZSwgMHg1MiwgMHgxMywgMHhmZSwgMHgyMCwgMHgxMCwgMHgwZiwgMHg2ZiwgMHhmZSwgMHg0YywKKwkweDU0LCAweDZiLCAweGRhLCAweGZlLAorCTB4MDYsIDB4ODAsIDB4ZmUsIDB4NDgsIDB4NDcsIDB4ZmUsIDB4NDAsIDB4MTMsIDB4MDgsIDB4MDUsIDB4MWIsIDB4ZmUsCisJMHgwOCwgMHgxMywgMHgzMiwgMHgwNywKKwkweDgyLCAweGZlLCAweDMwLCAweDEzLCAweDA4LCAweDA1LCAweDFiLCAweGZlLCAweDFjLCAweDEyLCAweDE1LCAweDlkLAorCTB4MDgsIDB4MDUsIDB4MDYsIDB4NGQsCisJMHgxNSwgMHhmZSwgMHgwZCwgMHgwMCwgMHgwMSwgMHgzNiwgMHg3YiwgMHhmZSwgMHg2NCwgMHgwZCwgMHgwMiwgMHgyNCwKKwkweDJkLCAweDEyLCAweGZlLCAweGU2LAorCTB4MDAsIDB4ZmUsIDB4MWMsIDB4OTAsIDB4ZmUsIDB4NDAsIDB4NWMsIDB4MDQsIDB4MTUsIDB4OWQsIDB4MDEsIDB4MzYsCisJMHgwMiwgMHgyYiwgMHhmZSwgMHg0MiwKKwkweDViLCAweDk5LCAweDE5LCAweGZlLCAweDQ2LCAweDU5LCAweGZlLCAweGJmLCAweDU3LCAweGZlLCAweDc3LCAweDU3LAorCTB4ZmUsIDB4ODcsIDB4ODAsIDB4ZmUsCisJMHgzMSwgMHhlNCwgMHg1YiwgMHgwOCwgMHgwNSwgMHgwYSwgMHhmZSwgMHg4NCwgMHgxMywgMHhmZSwgMHgyMCwgMHg4MCwKKwkweDA3LCAweDE5LCAweGZlLCAweDdjLAorCTB4MTIsIDB4NTMsIDB4MDUsIDB4MDYsIDB4ZmUsIDB4NmMsIDB4MTMsIDB4MDMsIDB4ZmUsIDB4YTIsIDB4MDAsIDB4MjgsCisJMHgxNywgMHhmZSwgMHg5MCwgMHgwNSwKKwkweGZlLCAweDMxLCAweGU0LCAweDVhLCAweDUzLCAweDA1LCAweDBhLCAweGZlLCAweDU2LCAweDEzLCAweDAzLCAweGZlLAorCTB4YTAsIDB4MDAsIDB4MjgsIDB4ZmUsCisJMHg0ZSwgMHgxMiwgMHg2NywgMHhmZiwgMHgwMiwgMHgwMCwgMHgxMCwgMHgyNywgMHhmZSwgMHg0OCwgMHgwNSwgMHgxYywKKwkweDM0LCAweGZlLCAweDg5LCAweDQ4LAorCTB4ZmYsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MjcsIDB4ZmUsIDB4NTYsIDB4MDUsIDB4MjYsIDB4ZmUsIDB4YTgsIDB4MDUsCisJMHgxMiwgMHhmZSwgMHhlMywgMHgwMCwKKwkweDIxLCAweDUzLCAweGZlLCAweDRhLCAweGYwLCAweGZlLCAweDc2LCAweDA1LCAweGZlLCAweDQ5LCAweGYwLCAweGZlLAorCTB4NzAsIDB4MDUsIDB4ODgsIDB4MjUsCisJMHhmZSwgMHgyMSwgMHgwMCwgMHhhYiwgMHgyNSwgMHhmZSwgMHgyMiwgMHgwMCwgMHhhYSwgMHgyNSwgMHg1OCwgMHhmZSwKKwkweDA5LCAweDQ4LCAweGZmLCAweDAyLAorCTB4MDAsIDB4MTAsIDB4MjcsIDB4ZmUsIDB4ODYsIDB4MDUsIDB4MjYsIDB4ZmUsIDB4YTgsIDB4MDUsIDB4ZmUsIDB4ZTIsCisJMHgwOCwgMHg1MywgMHgwNSwgMHhjYiwKKwkweDRkLCAweDAxLCAweGIwLCAweDI1LCAweDA2LCAweDEzLCAweGQzLCAweDM5LCAweGZlLCAweDI3LCAweDAxLCAweDA4LAorCTB4MDUsIDB4MWIsIDB4ZmUsIDB4MjIsCisJMHgxMiwgMHg0MSwgMHgwMSwgMHhiMiwgMHgxNSwgMHg5ZCwgMHgwOCwgMHgwNSwgMHgwNiwgMHg0ZCwgMHgxNSwgMHhmZSwKKwkweDBkLCAweDAwLCAweDAxLCAweDM2LAorCTB4N2IsIDB4ZmUsIDB4NjQsIDB4MGQsIDB4MDIsIDB4MjQsIDB4MDMsIDB4ZmUsIDB4OWMsIDB4MDAsIDB4MjgsIDB4ZWIsCisJMHgwMywgMHg1YywgMHgyOCwgMHhmZSwKKwkweDM2LCAweDEzLCAweDQxLCAweDAxLCAweGIyLCAweDI2LCAweGZlLCAweDE4LCAweDA2LCAweDA5LCAweDA2LCAweDUzLAorCTB4MDUsIDB4MWYsIDB4ZmUsIDB4MDIsCisJMHgxMiwgMHg1MCwgMHgwMSwgMHhmZSwgMHg5ZSwgMHgxNSwgMHgxZCwgMHhmZSwgMHgwZSwgMHgwNiwgMHgxMiwgMHhhNSwKKwkweDAxLCAweDRiLCAweDEyLCAweGZlLAorCTB4ZTUsIDB4MDAsIDB4MDMsIDB4NWMsIDB4YzEsIDB4MGMsIDB4NWMsIDB4MDMsIDB4Y2QsIDB4MjgsIDB4ZmUsIDB4NjIsCisJMHgxMiwgMHgwMywgMHg0NSwgMHgyOCwKKwkweGZlLCAweDVhLCAweDEzLCAweDAxLCAweGZlLCAweDBjLCAweDE5LCAweDAxLCAweGZlLCAweDc2LCAweDE5LCAweGZlLAorCTB4NDMsIDB4NDgsIDB4YzQsIDB4Y2MsCisJMHgwZiwgMHg3MSwgMHhmZiwgMHgwMiwgMHgwMCwgMHg1NywgMHg1MiwgMHg5MywgMHgxZSwgMHg0MywgMHg4YiwgMHhjNCwKKwkweDZlLCAweDQxLCAweDAxLCAweGIyLAorCTB4MjYsIDB4ZmUsIDB4ODIsIDB4MDYsIDB4NTMsIDB4MDUsIDB4MWEsIDB4ZTksIDB4OTEsIDB4MDksIDB4NTksIDB4MDEsCisJMHhmZSwgMHhjYywgMHgxNSwgMHgxZCwKKwkweGZlLCAweDc4LCAweDA2LCAweDEyLCAweGE1LCAweDAxLCAweDRiLCAweDEyLCAweGZlLCAweGU1LCAweDAwLCAweDAzLAorCTB4NDUsIDB4YzEsIDB4MGMsIDB4NDUsCisJMHgxOCwgMHgwNiwgMHgwMSwgMHhiMiwgMHhmYSwgMHg3NiwgMHg3NCwgMHgwMSwgMHhhZiwgMHg4YywgMHgxMiwgMHhmZSwKKwkweGUyLCAweDAwLCAweDI3LCAweGRiLAorCTB4MWMsIDB4MzQsIDB4ZmUsIDB4MGEsIDB4ZjAsIDB4ZmUsIDB4YjYsIDB4MDYsIDB4OTQsIDB4ZmUsIDB4NmMsIDB4MDcsCisJMHhmZSwgMHgwNiwgMHhmMCwgMHhmZSwKKwkweDc0LCAweDA3LCAweDk1LCAweDg2LCAweDAyLCAweDI0LCAweDA4LCAweDA1LCAweDBhLCAweGZlLCAweDJlLCAweDEyLAorCTB4MTYsIDB4MTksIDB4MDEsIDB4MGIsCisJMHgxNiwgMHgwMCwgMHgwMSwgMHgwYiwgMHgxNiwgMHgwMCwgMHgwMSwgMHgwYiwgMHgxNiwgMHgwMCwgMHgwMSwgMHgwYiwKKwkweGZlLCAweDk5LCAweGE0LCAweDAxLAorCTB4MGIsIDB4MTYsIDB4MDAsIDB4MDIsIDB4ZmUsIDB4NDIsIDB4MDgsIDB4NjgsIDB4MDUsIDB4MWEsIDB4ZmUsIDB4MzgsCisJMHgxMiwgMHgwOCwgMHgwNSwgMHgxYSwKKwkweGZlLCAweDMwLCAweDEzLCAweDE2LCAweGZlLCAweDFiLCAweDAwLCAweDAxLCAweDBiLCAweDE2LCAweDAwLCAweDAxLAorCTB4MGIsIDB4MTYsIDB4MDAsIDB4MDEsCisJMHgwYiwgMHgxNiwgMHgwMCwgMHgwMSwgMHgwYiwgMHgxNiwgMHgwNiwgMHgwMSwgMHgwYiwgMHgxNiwgMHgwMCwgMHgwMiwKKwkweGUyLCAweDZjLCAweDU4LCAweGJlLAorCTB4NTAsIDB4ZmUsIDB4OWEsIDB4ODEsIDB4NTUsIDB4MWIsIDB4N2EsIDB4ZmUsIDB4NDIsIDB4MDcsIDB4MDksIDB4MWIsCisJMHhmZSwgMHgwOSwgMHg2ZiwgMHhiYSwKKwkweGZlLCAweGNhLCAweDQ1LCAweGZlLCAweDMyLCAweDEyLCAweDY5LCAweDZkLCAweDhiLCAweDZjLCAweDdmLCAweDI3LAorCTB4ZmUsIDB4NTQsIDB4MDcsIDB4MWMsCisJMHgzNCwgMHhmZSwgMHgwYSwgMHhmMCwgMHhmZSwgMHg0MiwgMHgwNywgMHg5NSwgMHg4NiwgMHg5NCwgMHhmZSwgMHg2YywKKwkweDA3LCAweDAyLCAweDI0LCAweDAxLAorCTB4NGIsIDB4MDIsIDB4ZGIsIDB4MTYsIDB4MWYsIDB4MDIsIDB4ZGIsIDB4ZmUsIDB4OWMsIDB4ZjcsIDB4ZGMsIDB4ZmUsCisJMHgyYywgMHg5MCwgMHhmZSwgMHhhZSwKKwkweDkwLCAweDU2LCAweGZlLCAweGRhLCAweDA3LCAweDBjLCAweDYwLCAweDE0LCAweDYxLCAweDA4LCAweDU0LCAweDVhLAorCTB4MzcsIDB4MjIsIDB4MjAsIDB4MDcsCisJMHgxMSwgMHhmZSwgMHgwZSwgMHgxMiwgMHg4ZCwgMHhmZSwgMHg4MCwgMHg4MCwgMHgzOSwgMHgyMCwgMHg2YSwgMHgyYSwKKwkweGZlLCAweDA2LCAweDEwLCAweGZlLAorCTB4ODMsIDB4ZTcsIDB4ZmUsIDB4NDgsIDB4MDAsIDB4YWIsIDB4ZmUsIDB4MDMsIDB4NDAsIDB4MDgsIDB4NTQsIDB4NWIsCisJMHgzNywgMHgwMSwgMHhiMywgMHhiOCwKKwkweGZlLCAweDFmLCAweDQwLCAweDEzLCAweDYyLCAweDAxLCAweGVmLCAweGZlLCAweDA4LCAweDUwLCAweGZlLCAweDhhLAorCTB4NTAsIDB4ZmUsIDB4NDQsIDB4NTEsCisJMHhmZSwgMHhjNiwgMHg1MSwgMHg4OCwgMHhmZSwgMHgwOCwgMHg5MCwgMHhmZSwgMHg4YSwgMHg5MCwgMHgwYywgMHg1ZSwKKwkweDE0LCAweDVmLCAweGZlLCAweDBjLAorCTB4OTAsIDB4ZmUsIDB4OGUsIDB4OTAsIDB4ZmUsIDB4NDAsIDB4NTAsIDB4ZmUsIDB4YzIsIDB4NTAsIDB4MGMsIDB4M2QsCisJMHgxNCwgMHgzZSwgMHhmZSwgMHg0YSwKKwkweDEwLCAweDA4LCAweDA1LCAweDVhLCAweGZlLCAweDJhLCAweDEyLCAweGZlLCAweDJjLCAweDkwLCAweGZlLCAweGFlLAorCTB4OTAsIDB4MGMsIDB4NjAsIDB4MTQsCisJMHg2MSwgMHgwOCwgMHgwNSwgMHg1YiwgMHg4YiwgMHgwMSwgMHhiMywgMHhmZSwgMHgxZiwgMHg4MCwgMHgxMywgMHg2MiwKKwkweGZlLCAweDQ0LCAweDkwLCAweGZlLAorCTB4YzYsIDB4OTAsIDB4MGMsIDB4M2YsIDB4MTQsIDB4NDAsIDB4ZmUsIDB4MDgsIDB4OTAsIDB4ZmUsIDB4OGEsIDB4OTAsCisJMHgwYywgMHg1ZSwgMHgxNCwgMHg1ZiwKKwkweGZlLCAweDQwLCAweDkwLCAweGZlLCAweGMyLCAweDkwLCAweDBjLCAweDNkLCAweDE0LCAweDNlLCAweDBjLCAweDJlLAorCTB4MTQsIDB4M2MsIDB4MjEsIDB4MGMsCisJMHg0OSwgMHgwYywgMHg2MywgMHgwOCwgMHg1NCwgMHgxZiwgMHgzNywgMHgyYywgMHgwZiwgMHhmZSwgMHg0ZSwgMHgxMSwKKwkweDI3LCAweGRkLCAweGZlLCAweDllLAorCTB4ZjAsIDB4ZmUsIDB4NzYsIDB4MDgsIDB4YmMsIDB4MTcsIDB4MzQsIDB4MmMsIDB4NzcsIDB4ZTYsIDB4YzUsIDB4ZmUsCisJMHg5YSwgMHgwOCwgMHhjNiwgMHhmZSwKKwkweGI4LCAweDA4LCAweDk0LCAweGZlLCAweDhlLCAweDA4LCAweGZlLCAweDA2LCAweGYwLCAweGZlLCAweDk0LCAweDA4LAorCTB4OTUsIDB4ODYsIDB4MDIsIDB4MjQsCisJMHgwMSwgMHg0YiwgMHhmZSwgMHhjOSwgMHgxMCwgMHgxNiwgMHgxZiwgMHhmZSwgMHhjOSwgMHgxMCwgMHg2OCwgMHgwNSwKKwkweDA2LCAweGZlLCAweDEwLCAweDEyLAorCTB4NjgsIDB4MDUsIDB4MGEsIDB4NGUsIDB4MDgsIDB4MDUsIDB4MGEsIDB4ZmUsIDB4OTAsIDB4MTIsIDB4ZmUsIDB4MmUsCisJMHgxYywgMHgwMiwgMHhmZSwgMHgxOCwKKwkweDBiLCAweDY4LCAweDA1LCAweDA2LCAweDRlLCAweDY4LCAweDA1LCAweDBhLCAweGZlLCAweDdhLCAweDEyLCAweGZlLAorCTB4MmMsIDB4MWMsIDB4ZmUsIDB4YWEsCisJMHhmMCwgMHhmZSwgMHhkMiwgMHgwOSwgMHhmZSwgMHhhYywgMHhmMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMiwgMHhmZSwKKwkweGRlLCAweDA5LCAweGZlLCAweGI3LAorCTB4ZjAsIDB4ZmUsIDB4ZmMsIDB4MDgsIDB4ZmUsIDB4MDIsIDB4ZjYsIDB4MWEsIDB4NTAsIDB4ZmUsIDB4NzAsIDB4MTgsCisJMHhmZSwgMHhmMSwgMHgxOCwgMHhmZSwKKwkweDQwLCAweDU1LCAweGZlLCAweGUxLCAweDU1LCAweGZlLCAweDEwLCAweDU4LCAweGZlLCAweDkxLCAweDU4LCAweGZlLAorCTB4MTQsIDB4NTksIDB4ZmUsIDB4OTUsCisJMHg1OSwgMHgxYywgMHg4NSwgMHhmZSwgMHg4YywgMHhmMCwgMHhmZSwgMHhmYywgMHgwOCwgMHhmZSwgMHhhYywgMHhmMCwKKwkweGZlLCAweGYwLCAweDA4LCAweGI1LAorCTB4ZmUsIDB4Y2IsIDB4MTAsIDB4ZmUsIDB4YWQsIDB4ZjAsIDB4ZmUsIDB4MGMsIDB4MDksIDB4MDIsIDB4ZmUsIDB4MTgsCisJMHgwYiwgMHhiNiwgMHhmZSwgMHhiZiwKKwkweDEwLCAweGZlLCAweDJiLCAweGYwLCAweDg1LCAweGY0LCAweDFlLCAweGZlLCAweDAwLCAweGZlLCAweGZlLCAweDFjLAorCTB4MTIsIDB4YzIsIDB4ZmUsIDB4ZDIsCisJMHhmMCwgMHg4NSwgMHhmZSwgMHg3NiwgMHgxOCwgMHgxZSwgMHgxOSwgMHgxNywgMHg4NSwgMHgwMywgMHhkMiwgMHgxZSwKKwkweDA2LCAweDE3LCAweDg1LCAweGM1LAorCTB4NGEsIDB4YzYsIDB4NGEsIDB4YjUsIDB4YjYsIDB4ZmUsIDB4ODksIDB4MTAsIDB4NzQsIDB4NjcsIDB4MmQsIDB4MTUsCisJMHg5ZCwgMHgwMSwgMHgzNiwgMHgxMCwKKwkweGZlLCAweDM1LCAweDAwLCAweGZlLCAweDAxLCAweGYwLCAweDY1LCAweDEwLCAweDgwLCAweDAyLCAweDY1LCAweGZlLAorCTB4OTgsIDB4ODAsIDB4ZmUsIDB4MTksCisJMHhlNCwgMHgwYSwgMHhmZSwgMHgxYSwgMHgxMiwgMHg1MSwgMHhmZSwgMHgxOSwgMHg4MiwgMHhmZSwgMHg2YywgMHgxOCwKKwkweGZlLCAweDQ0LCAweDU0LCAweGJlLAorCTB4ZmUsIDB4MTksIDB4ODEsIDB4ZmUsIDB4NzQsIDB4MTgsIDB4OGYsIDB4OTAsIDB4MTcsIDB4ZmUsIDB4Y2UsIDB4MDgsCisJMHgwMiwgMHg0YSwgMHgwOCwgMHgwNSwKKwkweDVhLCAweGVjLCAweDAzLCAweDJlLCAweDI5LCAweDNjLCAweDBjLCAweDNmLCAweDE0LCAweDQwLCAweDliLCAweDJlLAorCTB4OWMsIDB4M2MsIDB4ZmUsIDB4NmMsCisJMHgxOCwgMHhmZSwgMHhlZCwgMHgxOCwgMHhmZSwgMHg0NCwgMHg1NCwgMHhmZSwgMHhlNSwgMHg1NCwgMHgzYSwgMHgzZiwKKwkweDNiLCAweDQwLCAweDAzLCAweDQ5LAorCTB4MjksIDB4NjMsIDB4OGYsIDB4ZmUsIDB4ZTMsIDB4NTQsIDB4ZmUsIDB4NzQsIDB4MTgsIDB4ZmUsIDB4ZjUsIDB4MTgsCisJMHg4ZiwgMHhmZSwgMHhlMywgMHg1NCwKKwkweDkwLCAweGMwLCAweDU2LCAweGZlLCAweGNlLCAweDA4LCAweDAyLCAweDRhLCAweGZlLCAweDM3LCAweGYwLCAweGZlLAorCTB4ZGEsIDB4MDksIDB4ZmUsIDB4OGIsCisJMHhmMCwgMHhmZSwgMHg2MCwgMHgwOSwgMHgwMiwgMHg0YSwgMHgwOCwgMHgwNSwgMHgwYSwgMHgyMywgMHhmZSwgMHhmYSwKKwkweDBhLCAweDNhLCAweDQ5LCAweDNiLAorCTB4NjMsIDB4NTYsIDB4ZmUsIDB4M2UsIDB4MGEsIDB4MGYsIDB4ZmUsIDB4YzAsIDB4MDcsIDB4NDEsIDB4OTgsIDB4MDAsCisJMHhhZCwgMHhmZSwgMHgwMSwgMHg1OSwKKwkweGZlLCAweDUyLCAweGYwLCAweGZlLCAweDBjLCAweDBhLCAweDhmLCAweDdhLCAweGZlLCAweDI0LCAweDBhLCAweDNhLAorCTB4NDksIDB4OGYsIDB4ZmUsIDB4ZTMsCisJMHg1NCwgMHg1NywgMHg0OSwgMHg3ZCwgMHg2MywgMHhmZSwgMHgxNCwgMHg1OCwgMHhmZSwgMHg5NSwgMHg1OCwgMHgwMiwKKwkweDRhLCAweDNhLCAweDQ5LCAweDNiLAorCTB4NjMsIDB4ZmUsIDB4MTQsIDB4NTksIDB4ZmUsIDB4OTUsIDB4NTksIDB4YmUsIDB4NTcsIDB4NDksIDB4NTcsIDB4NjMsCisJMHgwMiwgMHg0YSwgMHgwOCwgMHgwNSwKKwkweDVhLCAweGZlLCAweDgyLCAweDEyLCAweDA4LCAweDA1LCAweDFmLCAweGZlLCAweDY2LCAweDEzLCAweDIyLCAweDYyLAorCTB4YjcsIDB4ZmUsIDB4MDMsIDB4YTEsCisJMHhmZSwgMHg4MywgMHg4MCwgMHhmZSwgMHhjOCwgMHg0NCwgMHhmZSwgMHgyZSwgMHgxMywgMHhmZSwgMHgwNCwgMHg5MSwKKwkweGZlLCAweDg2LCAweDkxLCAweDZhLAorCTB4MmEsIDB4ZmUsIDB4NDAsIDB4NTksIDB4ZmUsIDB4YzEsIDB4NTksIDB4NTYsIDB4ZTAsIDB4MDMsIDB4NjAsIDB4MjksCisJMHg2MSwgMHgwYywgMHg3ZiwgMHgxNCwKKwkweDgwLCAweDU3LCAweDYwLCAweDdkLCAweDYxLCAweDAxLCAweGIzLCAweGI4LCAweDZhLCAweDJhLCAweDEzLCAweDYyLAorCTB4OWIsIDB4MmUsIDB4OWMsIDB4M2MsCisJMHgzYSwgMHgzZiwgMHgzYiwgMHg0MCwgMHg5MCwgMHhjMCwgMHhmZSwgMHgwNCwgMHhmYSwgMHgyZSwgMHhmZSwgMHgwNSwKKwkweGZhLCAweDNjLCAweDAxLCAweGVmLAorCTB4ZmUsIDB4MzYsIDB4MTAsIDB4MjEsIDB4MGMsIDB4N2YsIDB4MGMsIDB4ODAsIDB4M2EsIDB4M2YsIDB4M2IsIDB4NDAsCisJMHhlNCwgMHgwOCwgMHgwNSwgMHgxZiwKKwkweDE3LCAweGUwLCAweDNhLCAweDNkLCAweDNiLCAweDNlLCAweDA4LCAweDA1LCAweGZlLCAweGY3LCAweDAwLCAweDM3LAorCTB4MDMsIDB4NWUsIDB4MjksIDB4NWYsCisJMHhmZSwgMHgxMCwgMHg1OCwgMHhmZSwgMHg5MSwgMHg1OCwgMHg1NywgMHg0OSwgMHg3ZCwgMHg2MywgMHgwMiwgMHhmZSwKKwkweGY0LCAweDA5LCAweDA4LCAweDA1LAorCTB4MWYsIDB4MTcsIDB4ZTAsIDB4MDgsIDB4MDUsIDB4ZmUsIDB4ZjcsIDB4MDAsIDB4MzcsIDB4YmUsIDB4ZmUsIDB4MTksCisJMHg4MSwgMHg1MCwgMHhmZSwgMHgxMCwKKwkweDkwLCAweGZlLCAweDkyLCAweDkwLCAweGZlLCAweGQzLCAweDEwLCAweDMyLCAweDA3LCAweGE2LCAweDE3LCAweGZlLAorCTB4MDgsIDB4MDksIDB4MTIsIDB4YTYsCisJMHgwOCwgMHgwNSwgMHgwYSwgMHhmZSwgMHgxNCwgMHgxMywgMHgwMywgMHgzZCwgMHgyOSwgMHgzZSwgMHg1NiwgMHhmZSwKKwkweDA4LCAweDA5LCAweGZlLCAweDBjLAorCTB4NTgsIDB4ZmUsIDB4OGQsIDB4NTgsIDB4MDIsIDB4NGEsIDB4MjEsIDB4NDEsIDB4ZmUsIDB4MTksIDB4ODAsIDB4ZTcsCisJMHgwOCwgMHgwNSwgMHgwYSwgMHhmZSwKKwkweDFhLCAweDEyLCAweGZlLCAweDZjLCAweDE5LCAweGZlLCAweDE5LCAweDQxLCAweGY0LCAweGMyLCAweGZlLCAweGQxLAorCTB4ZjAsIDB4ZTIsIDB4MTUsIDB4N2UsCisJMHgwMSwgMHgzNiwgMHgxMCwgMHhmZSwgMHg0NCwgMHgwMCwgMHhmZSwgMHg4ZSwgMHgxMCwgMHhmZSwgMHg2YywgMHgxOSwKKwkweDU3LCAweDNkLCAweGZlLCAweGVkLAorCTB4MTksIDB4N2QsIDB4M2UsIDB4ZmUsIDB4MGMsIDB4NTEsIDB4ZmUsIDB4OGUsIDB4NTEsIDB4ZjQsIDB4MWUsIDB4ZmUsCisJMHgwMCwgMHhmZiwgMHgzNSwgMHhmZSwKKwkweDc0LCAweDEwLCAweGMyLCAweGZlLCAweGQyLCAweGYwLCAweGZlLCAweGE2LCAweDBiLCAweGZlLCAweDc2LCAweDE4LAorCTB4MWUsIDB4MTksIDB4OGEsIDB4MDMsCisJMHhkMiwgMHgxZSwgMHgwNiwgMHhmZSwgMHgwOCwgMHgxMywgMHgxMCwgMHhmZSwgMHgxNiwgMHgwMCwgMHgwMiwgMHg2NSwKKwkweGZlLCAweGQxLCAweGYwLCAweGZlLAorCTB4YjgsIDB4MGIsIDB4MTUsIDB4N2UsIDB4MDEsIDB4MzYsIDB4MTAsIDB4ZmUsIDB4MTcsIDB4MDAsIDB4ZmUsIDB4NDIsCisJMHgxMCwgMHhmZSwgMHhjZSwgMHhmMCwKKwkweGZlLCAweGJlLCAweDBiLCAweGZlLCAweDNjLCAweDEwLCAweGZlLCAweGNkLCAweGYwLCAweGZlLCAweGNhLCAweDBiLAorCTB4MTAsIDB4ZmUsIDB4MjIsIDB4MDAsCisJMHgwMiwgMHg2NSwgMHhmZSwgMHhjYiwgMHhmMCwgMHhmZSwgMHhkNiwgMHgwYiwgMHgxMCwgMHhmZSwgMHgyNCwgMHgwMCwKKwkweDAyLCAweDY1LCAweGZlLCAweGQwLAorCTB4ZjAsIDB4ZmUsIDB4ZTAsIDB4MGIsIDB4MTAsIDB4OWUsIDB4ZTUsIDB4ZmUsIDB4Y2YsIDB4ZjAsIDB4ZmUsIDB4ZWEsCisJMHgwYiwgMHgxMCwgMHg1OCwgMHhmZSwKKwkweDEwLCAweDEwLCAweGZlLCAweGNjLCAweGYwLCAweGUyLCAweDY4LCAweDA1LCAweDFmLCAweDRkLCAweDEwLCAweGZlLAorCTB4MTIsIDB4MDAsIDB4MmMsIDB4MGYsCisJMHhmZSwgMHg0ZSwgMHgxMSwgMHgyNywgMHhmZSwgMHgwMCwgMHgwYywgMHhmZSwgMHg5ZSwgMHhmMCwgMHhmZSwgMHgxNCwKKwkweDBjLCAweGJjLCAweDE3LCAweDM0LAorCTB4MmMsIDB4NzcsIDB4ZTYsIDB4YzUsIDB4MjQsIDB4YzYsIDB4MjQsIDB4MmMsIDB4ZmEsIDB4MjcsIDB4ZmUsIDB4MjAsCisJMHgwYywgMHgxYywgMHgzNCwgMHg5NCwKKwkweGZlLCAweDNjLCAweDBjLCAweDk1LCAweDg2LCAweGM1LCAweGRjLCAweGM2LCAweGRjLCAweDAyLCAweDI0LCAweDAxLAorCTB4NGIsIDB4ZmUsIDB4ZGIsIDB4MTAsCisJMHgxMiwgMHhmZSwgMHhlOCwgMHgwMCwgMHhiNSwgMHhiNiwgMHg3NCwgMHhjNywgMHg4MSwgMHhjOCwgMHg4MywgMHhmZSwKKwkweDg5LCAweGYwLCAweDI0LCAweDMzLAorCTB4MzEsIDB4ZTEsIDB4YzcsIDB4ODEsIDB4YzgsIDB4ODMsIDB4MjcsIDB4ZmUsIDB4NjYsIDB4MGMsIDB4MWQsIDB4MjQsCisJMHgzMywgMHgzMSwgMHhkZiwgMHhiYywKKwkweDRlLCAweDEwLCAweGZlLCAweDQyLCAweDAwLCAweDAyLCAweDY1LCAweDdjLCAweDA2LCAweGZlLCAweDgxLCAweDQ5LAorCTB4MTcsIDB4ZmUsIDB4MmMsIDB4MGQsCisJMHgwOCwgMHgwNSwgMHgwYSwgMHhmZSwgMHg0NCwgMHgxMywgMHgxMCwgMHgwMCwgMHg1NSwgMHgwYSwgMHhmZSwgMHg1NCwKKwkweDEyLCAweDU1LCAweGZlLCAweDI4LAorCTB4MDAsIDB4MjMsIDB4ZmUsIDB4OWEsIDB4MGQsIDB4MDksIDB4NDYsIDB4MDEsIDB4MGUsIDB4MDcsIDB4MDAsIDB4NjYsCisJMHg0NCwgMHhmZSwgMHgyOCwgMHgwMCwKKwkweGZlLCAweGUyLCAweDEwLCAweDAxLCAweGY1LCAweDAxLCAweGY2LCAweDA5LCAweGE0LCAweDAxLCAweGZlLCAweDI2LAorCTB4MGYsIDB4NjQsIDB4MTIsIDB4MmYsCisJMHgwMSwgMHg3MywgMHgwMiwgMHgyYiwgMHgxMCwgMHhmZSwgMHg0NCwgMHgwMCwgMHg1NSwgMHgwYSwgMHhlOSwgMHg0NCwKKwkweDBhLCAweGZlLCAweGI0LCAweDEwLAorCTB4MDEsIDB4YjAsIDB4NDQsIDB4MGEsIDB4ZmUsIDB4YWEsIDB4MTAsIDB4MDEsIDB4YjAsIDB4ZmUsIDB4MTksIDB4ODIsCisJMHhmZSwgMHgzNCwgMHg0NiwgMHhhYywKKwkweDQ0LCAweDBhLCAweDEwLCAweGZlLCAweDQzLCAweDAwLCAweGZlLCAweDk2LCAweDEwLCAweDA4LCAweDU0LCAweDBhLAorCTB4MzcsIDB4MDEsIDB4ZjUsIDB4MDEsCisJMHhmNiwgMHg2NCwgMHgxMiwgMHgyZiwgMHgwMSwgMHg3MywgMHg5OSwgMHgwYSwgMHg2NCwgMHg0MiwgMHg5MiwgMHgwMiwKKwkweGZlLCAweDJlLCAweDAzLCAweDA4LAorCTB4MDUsIDB4MGEsIDB4OGEsIDB4NDQsIDB4MGEsIDB4MTAsIDB4MDAsIDB4ZmUsIDB4NWMsIDB4MTAsIDB4NjgsIDB4MDUsCisJMHgxYSwgMHhmZSwgMHg1OCwgMHgxMiwKKwkweDA4LCAweDA1LCAweDFhLCAweGZlLCAweDUwLCAweDEzLCAweGZlLCAweDFjLCAweDFjLCAweGZlLCAweDlkLCAweGYwLAorCTB4ZmUsIDB4NTAsIDB4MGQsIDB4ZmUsCisJMHgxYywgMHgxYywgMHhmZSwgMHg5ZCwgMHhmMCwgMHhmZSwgMHg1NiwgMHgwZCwgMHgwOCwgMHg1NCwgMHgxYSwgMHgzNywKKwkweGZlLCAweGE5LCAweDEwLCAweDEwLAorCTB4ZmUsIDB4MTUsIDB4MDAsIDB4ZmUsIDB4MDQsIDB4ZTYsIDB4MGEsIDB4NTAsIDB4ZmUsIDB4MmUsIDB4MTAsIDB4MTAsCisJMHhmZSwgMHgxMywgMHgwMCwgMHhmZSwKKwkweDEwLCAweDEwLCAweDEwLCAweDZmLCAweGFiLCAweDEwLCAweGZlLCAweDQxLCAweDAwLCAweGFhLCAweDEwLCAweGZlLAorCTB4MjQsIDB4MDAsIDB4OGMsIDB4YjUsCisJMHhiNiwgMHg3NCwgMHgwMywgMHg3MCwgMHgyOCwgMHgyMywgMHhkOCwgMHg1MCwgMHhmZSwgMHgwNCwgMHhlNiwgMHgxYSwKKwkweGZlLCAweDlkLCAweDQxLCAweGZlLAorCTB4MWMsIDB4NDIsIDB4NjQsIDB4MDEsIDB4ZTMsIDB4MDIsIDB4MmIsIDB4ZjgsIDB4MTUsIDB4MGEsIDB4MzksIDB4YTAsCisJMHhiNCwgMHgxNSwgMHhmZSwgMHgzMSwKKwkweDAwLCAweDM5LCAweGEyLCAweDAxLCAweGZlLCAweDQ4LCAweDEwLCAweDAyLCAweGQ3LCAweDQyLCAweGZlLCAweDA2LAorCTB4ZWMsIDB4ZDAsIDB4ZmMsIDB4NDQsCisJMHgxYiwgMHhmZSwgMHhjZSwgMHg0NSwgMHgzNSwgMHg0MiwgMHhmZSwgMHgwNiwgMHhlYSwgMHhkMCwgMHhmZSwgMHg0NywKKwkweDRiLCAweDkxLCAweGZlLCAweDc1LAorCTB4NTcsIDB4MDMsIDB4NWQsIDB4ZmUsIDB4OTgsIDB4NTYsIDB4ZmUsIDB4MzgsIDB4MTIsIDB4MDksIDB4NDgsIDB4MDEsCisJMHgwZSwgMHhmZSwgMHg0NCwgMHg0OCwKKwkweDRmLCAweDA4LCAweDA1LCAweDFiLCAweGZlLCAweDFhLCAweDEzLCAweDA5LCAweDQ2LCAweDAxLCAweDBlLCAweDQxLAorCTB4ZmUsIDB4NDEsIDB4NTgsIDB4MDksCisJMHhhNCwgMHgwMSwgMHgwZSwgMHhmZSwgMHg0OSwgMHg1NCwgMHg5NiwgMHhmZSwgMHgxZSwgMHgwZSwgMHgwMiwgMHhmZSwKKwkweDJlLCAweDAzLCAweDA5LCAweDVkLAorCTB4ZmUsIDB4ZWUsIDB4MTQsIDB4ZmMsIDB4NDQsIDB4MWIsIDB4ZmUsIDB4Y2UsIDB4NDUsIDB4MzUsIDB4NDIsIDB4ZmUsCisJMHhjZSwgMHg0NywgMHhmZSwgMHhhZCwKKwkweDEzLCAweDAyLCAweDJiLCAweDIyLCAweDIwLCAweDA3LCAweDExLCAweGZlLCAweDllLCAweDEyLCAweDIxLCAweDEzLAorCTB4NTksIDB4MTMsIDB4OWYsIDB4MTMsCisJMHhkNSwgMHgyMiwgMHgyZiwgMHg0MSwgMHgzOSwgMHgyZiwgMHhiYywgMHhhZCwgMHhmZSwgMHhiYywgMHhmMCwgMHhmZSwKKwkweGUwLCAweDBlLCAweDBmLCAweDA2LAorCTB4MTMsIDB4NTksIDB4MDEsIDB4ZmUsIDB4ZGEsIDB4MTYsIDB4MDMsIDB4ZmUsIDB4MzgsIDB4MDEsIDB4MjksIDB4ZmUsCisJMHgzYSwgMHgwMSwgMHg1NiwgMHhmZSwKKwkweGU0LCAweDBlLCAweGZlLCAweDAyLCAweGVjLCAweGQ1LCAweDY5LCAweDAwLCAweDY2LCAweGZlLCAweDA0LCAweGVjLAorCTB4MjAsIDB4NGYsIDB4ZmUsIDB4MDUsCisJMHhmNiwgMHhmZSwgMHgzNCwgMHgwMSwgMHgwMSwgMHhmZSwgMHg0YSwgMHgxNywgMHhmZSwgMHgwOCwgMHg5MCwgMHhmZSwKKwkweDQ4LCAweGY0LCAweDBkLCAweGZlLAorCTB4MTgsIDB4MTMsIDB4YmEsIDB4ZmUsIDB4MDIsIDB4ZWEsIDB4ZDUsIDB4NjksIDB4N2UsIDB4ZmUsIDB4YzUsIDB4MTMsCisJMHgxNSwgMHgxYSwgMHgzOSwgMHhhMCwKKwkweGI0LCAweGZlLCAweDJlLCAweDEwLCAweDAzLCAweGZlLCAweDM4LCAweDAxLCAweDFlLCAweGZlLCAweGYwLCAweGZmLAorCTB4MGMsIDB4ZmUsIDB4NjAsIDB4MDEsCisJMHgwMywgMHhmZSwgMHgzYSwgMHgwMSwgMHgwYywgMHhmZSwgMHg2MiwgMHgwMSwgMHg0MywgMHgxMywgMHgyMCwgMHgyNSwKKwkweDA2LCAweDEzLCAweDJmLCAweDEyLAorCTB4MmYsIDB4OTIsIDB4MGYsIDB4MDYsIDB4MDQsIDB4MjEsIDB4MDQsIDB4MjIsIDB4NTksIDB4ZmUsIDB4ZjcsIDB4MTIsCisJMHgyMiwgMHg5ZiwgMHhiNywgMHgxMywKKwkweDlmLCAweDA3LCAweDdlLCAweGZlLCAweDcxLCAweDEzLCAweGZlLCAweDI0LCAweDFjLCAweDE1LCAweDE5LCAweDM5LAorCTB4YTAsIDB4YjQsIDB4ZmUsIDB4ZDksCisJMHgxMCwgMHhjMywgMHhmZSwgMHgwMywgMHhkYywgMHhmZSwgMHg3MywgMHg1NywgMHhmZSwgMHg4MCwgMHg1ZCwgMHgwNCwKKwkweGMzLCAweGZlLCAweDAzLCAweGRjLAorCTB4ZmUsIDB4NWIsIDB4NTcsIDB4ZmUsIDB4ODAsIDB4NWQsIDB4MDQsIDB4ZmUsIDB4MDMsIDB4NTcsIDB4YzMsIDB4MjEsCisJMHhmZSwgMHgwMCwgMHhjYywgMHgwNCwKKwkweGZlLCAweDAzLCAweDU3LCAweGMzLCAweDc4LCAweDA0LCAweDA4LCAweDA1LCAweDU4LCAweGZlLCAweDIyLCAweDEzLAorCTB4ZmUsIDB4MWMsIDB4ODAsIDB4MDcsCisJMHgwNiwgMHhmZSwgMHgxYSwgMHgxMywgMHhmZSwgMHgxZSwgMHg4MCwgMHhlZCwgMHhmZSwgMHgxZCwgMHg4MCwgMHhhZSwKKwkweGZlLCAweDBjLCAweDkwLCAweGZlLAorCTB4MGUsIDB4MTMsIDB4ZmUsIDB4MGUsIDB4OTAsIDB4YWMsIDB4ZmUsIDB4M2MsIDB4OTAsIDB4ZmUsIDB4MzAsIDB4ZjQsCisJMHgwYSwgMHhmZSwgMHgzYywgMHg1MCwKKwkweGFhLCAweDAxLCAweGZlLCAweDdhLCAweDE3LCAweDMyLCAweDA3LCAweDJmLCAweGFkLCAweDAxLCAweGZlLCAweGI0LAorCTB4MTYsIDB4MDgsIDB4MDUsIDB4MWIsCisJMHg0ZSwgMHgwMSwgMHhmNSwgMHgwMSwgMHhmNiwgMHgxMiwgMHhmZSwgMHhlOSwgMHgwMCwgMHgwOCwgMHgwNSwgMHg1OCwKKwkweGZlLCAweDJjLCAweDEzLCAweDAxLAorCTB4ZmUsIDB4MGMsIDB4MTcsIDB4ZmUsIDB4MWUsIDB4MWMsIDB4ZmUsIDB4MTQsIDB4OTAsIDB4ZmUsIDB4OTYsIDB4OTAsCisJMHgwYywgMHhmZSwgMHg2NCwgMHgwMSwKKwkweDE0LCAweGZlLCAweDY2LCAweDAxLCAweDA4LCAweDA1LCAweDViLCAweGZlLCAweDEyLCAweDEyLCAweGZlLCAweDAzLAorCTB4ODAsIDB4OGQsIDB4ZmUsIDB4MDEsCisJMHhlYywgMHgyMCwgMHhmZSwgMHg4MCwgMHg0MCwgMHgxMywgMHgyMCwgMHg2YSwgMHgyYSwgMHgxMiwgMHhjZiwgMHg2NCwKKwkweDIyLCAweDIwLCAweGZiLCAweDc5LAorCTB4MjAsIDB4MDQsIDB4ZmUsIDB4MDgsIDB4MWMsIDB4MDMsIDB4ZmUsIDB4YWMsIDB4MDAsIDB4ZmUsIDB4MDYsIDB4NTgsCisJMHgwMywgMHhmZSwgMHhhZSwgMHgwMCwKIAotICAweGZlLCAgMHgwNywgIDB4NTgsICAweDAzLCAgMHhmZSwgIDB4YjAsICAweDAwLCAgMHhmZSwgIDB4MDgsICAweDU4LCAgMHgwMywgIDB4ZmUsICAweGIyLCAgMHgwMCwgIDB4ZmUsICAweDA5LAotICAweDU4LCAgMHhmZSwgIDB4MGEsICAweDFjLCAgMHgyNSwgIDB4NmUsICAweDEzLCAgMHhkMCwgIDB4MjEsICAweDBjLCAgMHg1YywgIDB4MGMsICAweDQ1LCAgMHgwZiwgIDB4NDYsICAweDUyLAotICAweDUwLCAgMHgxOCwgIDB4MWIsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLCAgMHg5MSwgIDB4NTQsICAweDIzLCAgMHhmZSwgIDB4ZmMsICAweDBmLCAgMHg0NCwgIDB4MTEsICAweDBmLAotICAweDQ4LCAgMHg1MiwgIDB4MTgsICAweDU4LCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwgIDB4OTEsICAweDU0LCAgMHgyMywgIDB4ZTQsICAweDI1LCAgMHgxMSwgIDB4MTMsICAweDIwLAotICAweDdjLCAgMHg2ZiwgIDB4NGYsICAweDIyLCAgMHgyMCwgIDB4ZmIsICAweDc5LCAgMHgyMCwgIDB4MTIsICAweGNmLCAgMHhmZSwgIDB4MTQsICAweDU2LCAgMHhmZSwgIDB4ZDYsICAweGYwLAotICAweGZlLCAgMHgyNiwgIDB4MTAsICAweGY4LCAgMHg3NCwgIDB4ZmUsICAweDE0LCAgMHgxYywgIDB4ZmUsICAweDEwLCAgMHgxYywgIDB4ZmUsICAweDE4LCAgMHgxYywgIDB4MDQsICAweDQyLAotICAweGZlLCAgMHgwYywgIDB4MTQsICAweGZjLCAgMHhmZSwgIDB4MDcsICAweGU2LCAgMHgxYiwgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGY1LCAgMHgxMywgIDB4MDQsICAweDAxLAotICAweGIwLCAgMHg3YywgIDB4NmYsICAweDRmLCAgMHhmZSwgIDB4MDYsICAweDgwLCAgMHhmZSwgIDB4NDgsICAweDQ3LCAgMHhmZSwgIDB4NDIsICAweDEzLCAgMHgzMiwgIDB4MDcsICAweDJmLAotICAweGZlLCAgMHgzNCwgIDB4MTMsICAweDA5LCAgMHg0OCwgIDB4MDEsICAweDBlLCAgMHhiYiwgIDB4ZmUsICAweDM2LCAgMHgxMiwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4ZmUsICAweDQ1LAotICAweDQ4LCAgMHgwMSwgIDB4ZjAsICAweGZlLCAgMHgwMCwgIDB4Y2MsICAweGJiLCAgMHhmZSwgIDB4ZjMsICAweDEzLCAgMHg0MywgIDB4NzgsICAweDA3LCAgMHgxMSwgIDB4YWMsICAweDA5LAotICAweDg0LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg4MCwgIDB4NWMsICAweDAxLCAgMHg3MywgIDB4ZmUsICAweDBlLCAgMHgxMCwgIDB4MDcsICAweDgyLCAgMHg0ZSwgIDB4ZmUsICAweDE0LAotICAweDU2LCAgMHhmZSwgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4NjAsICAweDEwLCAgMHgwNCwgIDB4ZmUsICAweDQ0LCAgMHg1OCwgIDB4OGQsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGEyLAotICAweGZlLCAgMHg5ZSwgIDB4NDAsICAweGZlLCAgMHg5ZCwgIDB4ZTcsICAweDAwLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgxYSwgIDB4NzksICAweDJhLCAgMHgwMSwgIDB4ZTMsICAweGZlLAotICAweGRkLCAgMHgxMCwgIDB4MmMsICAweGM3LCAgMHg4MSwgIDB4YzgsICAweDgzLCAgMHgzMywgIDB4MzEsICAweGRlLCAgMHgwNywgIDB4MWEsICAweGZlLCAgMHg0OCwgIDB4MTIsICAweDA3LAotICAweDBhLCAgMHhmZSwgIDB4NTYsICAweDEyLCAgMHgwNywgIDB4MTksICAweGZlLCAgMHgzMCwgIDB4MTIsICAweDA3LCAgMHhjOSwgIDB4MTcsICAweGZlLCAgMHgzMiwgIDB4MTIsICAweDA3LAotICAweGZlLCAgMHgyMywgIDB4MDAsICAweDE3LCAgMHhlYiwgIDB4MDcsICAweDA2LCAgMHgxNywgIDB4ZmUsICAweDljLCAgMHgxMiwgIDB4MDcsICAweDFmLCAgMHhmZSwgIDB4MTIsICAweDEyLAotICAweDA3LCAgMHgwMCwgIDB4MTcsICAweDI0LCAgMHgxNSwgIDB4YzksICAweDAxLCAgMHgzNiwgIDB4YTksICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDk0LCAgMHg0YiwgIDB4MDQsICAweDJkLAotICAweGRkLCAgMHgwOSwgIDB4ZDEsICAweDAxLCAgMHhmZSwgIDB4MjYsICAweDBmLCAgMHgxMiwgIDB4ODIsICAweDAyLCAgMHgyYiwgIDB4MmQsICAweDMyLCAgMHgwNywgIDB4YTYsICAweGZlLAotICAweGQ5LCAgMHgxMywgIDB4M2EsICAweDNkLCAgMHgzYiwgIDB4M2UsICAweDU2LCAgMHhmZSwgIDB4ZjAsICAweDExLCAgMHgwOCwgIDB4MDUsICAweDVhLCAgMHhmZSwgIDB4NzIsICAweDEyLAotICAweDliLCAgMHgyZSwgIDB4OWMsICAweDNjLCAgMHg5MCwgIDB4YzAsICAweDk2LCAgMHhmZSwgIDB4YmEsICAweDExLCAgMHgyMiwgIDB4NjIsICAweGZlLCAgMHgyNiwgIDB4MTMsICAweDAzLAotICAweDdmLCAgMHgyOSwgIDB4ODAsICAweDU2LCAgMHhmZSwgIDB4NzYsICAweDBkLCAgMHgwYywgIDB4NjAsICAweDE0LCAgMHg2MSwgIDB4MjEsICAweDBjLCAgMHg3ZiwgIDB4MGMsICAweDgwLAotICAweDAxLCAgMHhiMywgIDB4MjUsICAweDZlLCAgMHg3NywgIDB4MTMsICAweDYyLCAgMHgwMSwgIDB4ZWYsICAweDliLCAgMHgyZSwgIDB4OWMsICAweDNjLCAgMHhmZSwgIDB4MDQsICAweDU1LAotICAweGZlLCAgMHhhNSwgIDB4NTUsICAweGZlLCAgMHgwNCwgIDB4ZmEsICAweDJlLCAgMHhmZSwgIDB4MDUsICAweGZhLCAgMHgzYywgIDB4ZmUsICAweDkxLCAgMHgxMCwgIDB4MDMsICAweDNmLAotICAweDI5LCAgMHg0MCwgIDB4ZmUsICAweDQwLCAgMHg1NiwgIDB4ZmUsICAweGUxLCAgMHg1NiwgIDB4MGMsICAweDNmLCAgMHgxNCwgIDB4NDAsICAweDg4LCAgMHg5YiwgIDB4MmUsICAweDljLAotICAweDNjLCAgMHg5MCwgIDB4YzAsICAweDAzLCAgMHg1ZSwgIDB4MjksICAweDVmLCAgMHhmZSwgIDB4MDAsICAweDU2LCAgMHhmZSwgIDB4YTEsICAweDU2LCAgMHgwYywgIDB4NWUsICAweDE0LAotICAweDVmLCAgMHgwOCwgIDB4MDUsICAweDVhLCAgMHhmZSwgIDB4MWUsICAweDEyLCAgMHgyMiwgIDB4NjIsICAweGZlLCAgMHgxZiwgIDB4NDAsICAweDAzLCAgMHg2MCwgIDB4MjksICAweDYxLAotICAweGZlLCAgMHgyYywgIDB4NTAsICAweGZlLCAgMHhhZSwgIDB4NTAsICAweDAzLCAgMHgzZiwgIDB4MjksICAweDQwLCAgMHhmZSwgIDB4NDQsICAweDUwLCAgMHhmZSwgIDB4YzYsICAweDUwLAotICAweDAzLCAgMHg1ZSwgIDB4MjksICAweDVmLCAgMHhmZSwgIDB4MDgsICAweDUwLCAgMHhmZSwgIDB4OGEsICAweDUwLCAgMHgwMywgIDB4M2QsICAweDI5LCAgMHgzZSwgIDB4ZmUsICAweDQwLAotICAweDUwLCAgMHhmZSwgIDB4YzIsICAweDUwLCAgMHgwMiwgIDB4ODksICAweDI1LCAgMHgwNiwgIDB4MTMsICAweGQ0LCAgMHgwMiwgIDB4NzIsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweDFkLAotICAweDRjLCAgMHgzMywgIDB4MzEsICAweGRlLCAgMHgwNywgIDB4MDYsICAweDIzLCAgMHg0YywgIDB4MzIsICAweDA3LCAgMHhhNiwgIDB4MjMsICAweDcyLCAgMHgwMSwgIDB4YWYsICAweDFlLAotICAweDQzLCAgMHgxNywgIDB4NGMsICAweDA4LCAgMHgwNSwgIDB4MGEsICAweGVlLCAgMHgzYSwgIDB4M2QsICAweDNiLCAgMHgzZSwgIDB4ZmUsICAweDBhLCAgMHg1NSwgIDB4MzUsICAweGZlLAotICAweDhiLCAgMHg1NSwgIDB4NTcsICAweDNkLCAgMHg3ZCwgIDB4M2UsICAweGZlLCAgMHgwYywgIDB4NTEsICAweGZlLCAgMHg4ZSwgIDB4NTEsICAweDAyLCAgMHg3MiwgIDB4ZmUsICAweDE5LAotICAweDgxLCAgMHhiYSwgIDB4ZmUsICAweDE5LCAgMHg0MSwgIDB4MDIsICAweDcyLCAgMHgyZCwgIDB4MDEsICAweDBiLCAgMHgxYywgIDB4MzQsICAweDFkLCAgMHhlOCwgIDB4MzMsICAweDMxLAotICAweGUxLCAgMHg1NSwgIDB4MTksICAweGZlLCAgMHhhNiwgIDB4MTIsICAweDU1LCAgMHgwYSwgIDB4NGQsICAweDAyLCAgMHg0YywgIDB4MDEsICAweDBiLCAgMHgxYywgIDB4MzQsICAweDFkLAotICAweGU4LCAgMHgzMywgIDB4MzEsICAweGRmLCAgMHgwNywgIDB4MTksICAweDIzLCAgMHg0YywgIDB4MDEsICAweDBiLCAgMHgxZCwgIDB4ZTgsICAweDMzLCAgMHgzMSwgIDB4ZmUsICAweGU4LAotICAweDA5LCAgMHhmZSwgIDB4YzIsICAweDQ5LCAgMHg1MSwgIDB4MDMsICAweGZlLCAgMHg5YywgIDB4MDAsICAweDI4LCAgMHg4YSwgIDB4NTMsICAweDA1LCAgMHgxZiwgIDB4MzUsICAweGE5LAotICAweGZlLCAgMHhiYiwgIDB4NDUsICAweDU1LCAgMHgwMCwgIDB4NGUsICAweDQ0LCAgMHgwNiwgIDB4N2MsICAweDQzLCAgMHhmZSwgIDB4ZGEsICAweDE0LCAgMHgwMSwgIDB4YWYsICAweDhjLAotICAweGZlLCAgMHg0YiwgIDB4NDUsICAweGVlLCAgMHgzMiwgIDB4MDcsICAweGE1LCAgMHhlZCwgIDB4MDMsICAweGNkLCAgMHgyOCwgIDB4OGEsICAweDAzLCAgMHg0NSwgIDB4MjgsICAweDM1LAotICAweDY3LCAgMHgwMiwgIDB4NzIsICAweGZlLCAgMHhjMCwgIDB4NWQsICAweGZlLCAgMHhmOCwgIDB4MTQsICAweGZlLCAgMHgwMywgIDB4MTcsICAweDAzLCAgMHg1YywgIDB4YzEsICAweDBjLAotICAweDVjLCAgMHg2NywgIDB4MmQsICAweDAxLCAgMHgwYiwgIDB4MjYsICAweDg5LCAgMHgwMSwgIDB4ZmUsICAweDllLCAgMHgxNSwgIDB4MDIsICAweDg5LCAgMHgwMSwgIDB4MGIsICAweDFjLAotICAweDM0LCAgMHgxZCwgIDB4NGMsICAweDMzLCAgMHgzMSwgIDB4ZGYsICAweDA3LCAgMHgwNiwgIDB4MjMsICAweDRjLCAgMHgwMSwgIDB4ZjEsICAweGZlLCAgMHg0MiwgIDB4NTgsICAweGYxLAotICAweGZlLCAgMHhhNCwgIDB4MTQsICAweDhjLCAgMHhmZSwgIDB4NGEsICAweGY0LCAgMHgwYSwgIDB4MTcsICAweDRjLCAgMHhmZSwgIDB4NGEsICAweGY0LCAgMHgwNiwgIDB4ZWEsICAweDMyLAotICAweDA3LCAgMHhhNSwgIDB4OGIsICAweDAyLCAgMHg3MiwgIDB4MDMsICAweDQ1LCAgMHhjMSwgIDB4MGMsICAweDQ1LCAgMHg2NywgIDB4MmQsICAweDAxLCAgMHgwYiwgIDB4MjYsICAweDg5LAotICAweDAxLCAgMHhmZSwgIDB4Y2MsICAweDE1LCAgMHgwMiwgIDB4ODksICAweDBmLCAgMHgwNiwgIDB4MjcsICAweGZlLCAgMHhiZSwgIDB4MTMsICAweDI2LCAgMHhmZSwgIDB4ZDQsICAweDEzLAotICAweDc2LCAgMHhmZSwgIDB4ODksICAweDQ4LCAgMHgwMSwgIDB4MGIsICAweDIxLCAgMHg3NiwgIDB4MDQsICAweDdiLCAgMHhmZSwgIDB4ZDAsICAweDEzLCAgMHgxYywgIDB4ZmUsICAweGQwLAotICAweDEzLCAgMHgxZCwgIDB4ZmUsICAweGJlLCAgMHgxMywgIDB4NjcsICAweDJkLCAgMHgwMSwgIDB4MGIsICAweGZlLCAgMHhkNSwgIDB4MTAsICAweDBmLCAgMHg3MSwgIDB4ZmYsICAweDAyLAotICAweDAwLCAgMHg1NywgIDB4NTIsICAweDkzLCAgMHgxZSwgIDB4ZmUsICAweGZmLCAgMHg3ZiwgIDB4ZmUsICAweDMwLCAgMHg1NiwgIDB4ZmUsICAweDAwLCAgMHg1YywgIDB4MDQsICAweDBmLAotICAweDcxLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsICAweDkzLCAgMHgxZSwgIDB4NDMsICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDA0LAotICAweDBmLCAgMHg3MSwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDUyLCAgMHg5MywgIDB4MDQsICAweDBmLCAgMHg3MSwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4NTcsICAweDUyLAotICAweDkzLCAgMHhmZSwgIDB4MGIsICAweDU4LCAgMHgwNCwgIDB4MDksICAweDVjLCAgMHgwMSwgIDB4ODcsICAweDA5LCAgMHg0NSwgIDB4MDEsICAweDg3LCAgMHgwNCwgIDB4ZmUsICAweDAzLAotICAweGExLCAgMHgxZSwgIDB4MTEsICAweGZmLCAgMHgwMywgIDB4MDAsICAweDU0LCAgMHhmZSwgIDB4MDAsICAweGY0LCAgMHgxZiwgIDB4NTIsICAweGZlLCAgMHgwMCwgIDB4N2QsICAweGZlLAotICAweDAxLCAgMHg3ZCwgIDB4ZmUsICAweDAyLCAgMHg3ZCwgIDB4ZmUsICAweDAzLCAgMHg3YywgIDB4NmEsICAweDJhLCAgMHgwYywgIDB4NWUsICAweDE0LCAgMHg1ZiwgIDB4NTcsICAweDNmLAotICAweDdkLCAgMHg0MCwgIDB4MDQsICAweGRkLCAgMHhmZSwgIDB4ODIsICAweDRhLCAgMHhmZSwgIDB4ZTEsICAweDFhLCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHg4ZCwgIDB4MDQsICAweDAxLAotICAweGZlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHg0MiwgIDB4NDgsICAweDUwLCAgMHg1MSwgIDB4OTEsICAweDAxLCAgMHgwYiwgIDB4MWQsICAweGZlLCAgMHg5NiwgIDB4MTUsICAweDMzLAotICAweDMxLCAgMHhlMSwgIDB4MDEsICAweDBiLCAgMHgxZCwgIDB4ZmUsICAweDk2LCAgMHgxNSwgIDB4MzMsICAweDMxLCAgMHhmZSwgIDB4ZTgsICAweDBhLCAgMHhmZSwgIDB4YzEsICAweDU5LAotICAweDAzLCAgMHhjZCwgIDB4MjgsICAweGZlLCAgMHhjYywgIDB4MTIsICAweDUzLCAgMHgwNSwgIDB4MWEsICAweGZlLCAgMHhjNCwgIDB4MTMsICAweDIxLCAgMHg2OSwgIDB4MWEsICAweGVlLAotICAweDU1LCAgMHhjYSwgIDB4NmIsICAweGZlLCAgMHhkYywgIDB4MTQsICAweDRkLCAgMHgwZiwgIDB4MDYsICAweDE4LCAgMHhjYSwgIDB4N2MsICAweDMwLCAgMHhmZSwgIDB4NzgsICAweDEwLAotICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHhhYiwgIDB4ZmYsICAweDAyLCAgMHg4MywgIDB4NTUsICAweDY5LCAgMHgxOSwgIDB4YWUsICAweDk4LCAgMHhmZSwgIDB4MzAsICAweDAwLAotICAweDk2LCAgMHhmMiwgIDB4MTgsICAweDZkLCAgMHgwZiwgIDB4MDYsICAweGZlLCAgMHg1NiwgIDB4MTAsICAweDY5LCAgMHgwYSwgIDB4ZWQsICAweDk4LCAgMHhmZSwgIDB4NjQsICAweDAwLAotICAweDk2LCAgMHhmMiwgIDB4MDksICAweGZlLCAgMHg2NCwgIDB4MDAsICAweDE4LCAgMHg5ZSwgIDB4MGYsICAweDA2LCAgMHhmZSwgIDB4MjgsICAweDEwLCAgMHg2OSwgIDB4MDYsICAweGZlLAotICAweDYwLCAgMHgxMywgIDB4OTgsICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDk2LCAgMHhmMiwgIDB4MDksICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDE4LCAgMHg1OSwgIDB4MGYsICAweDA2LAotICAweDg4LCAgMHg5OCwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4N2EsICAweGZlLCAgMHg0MiwgIDB4MTUsICAweDkxLCAgMHhlNCwgIDB4ZmUsICAweDQzLCAgMHhmNCwgIDB4OWYsICAweGZlLAotICAweDU2LCAgMHhmMCwgIDB4ZmUsICAweDU0LCAgMHgxNSwgIDB4ZmUsICAweDA0LCAgMHhmNCwgIDB4NzEsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDllLCAgMHhmZSwgIDB4ZjMsICAweDEwLAotICAweGZlLCAgMHg0MCwgIDB4NWMsICAweDAxLCAgMHhmZSwgIDB4MTYsICAweDE0LCAgMHgxZSwgIDB4NDMsICAweGVjLCAgMHhmZSwgIDB4MDAsICAweDE3LCAgMHhmZSwgIDB4NGQsICAweGU0LAotICAweDZlLCAgMHg3YSwgIDB4ZmUsICAweDkwLCAgMHgxNSwgIDB4YzQsICAweDZlLCAgMHhmZSwgIDB4MWMsICAweDEwLCAgMHhmZSwgIDB4MDAsICAweDE3LCAgMHhmZSwgIDB4NGQsICAweGU0LAotICAweGNjLCAgMHg3YSwgIDB4ZmUsICAweDkwLCAgMHgxNSwgIDB4YzQsICAweGNjLCAgMHg4OCwgIDB4NTEsICAweDIxLCAgMHhmZSwgIDB4NGQsICAweGY0LCAgMHgwMCwgIDB4ZTksICAweDkxLAotICAweDBmLCAgMHgwNiwgIDB4ZmUsICAweGI0LCAgMHg1NiwgIDB4ZmUsICAweGMzLCAgMHg1OCwgIDB4MDQsICAweDUxLCAgMHgwZiwgIDB4MGEsICAweDA0LCAgMHgxNiwgIDB4MDYsICAweDAxLAotICAweDBiLCAgMHgyNiwgIDB4ZjMsICAweDE2LCAgMHgwYSwgIDB4MDEsICAweDBiLCAgMHgyNiwgIDB4ZjMsICAweDE2LCAgMHgxOSwgIDB4MDEsICAweDBiLCAgMHgyNiwgIDB4ZjMsICAweDc2LAotICAweGZlLCAgMHg4OSwgIDB4NDksICAweDAxLCAgMHgwYiwgIDB4MDQsICAweDE2LCAgMHgwNiwgIDB4MDEsICAweDBiLCAgMHgyNiwgIDB4YjEsICAweDE2LCAgMHgxOSwgIDB4MDEsICAweDBiLAotICAweDI2LCAgMHhiMSwgIDB4MTYsICAweDA2LCAgMHgwMSwgIDB4MGIsICAweDI2LCAgMHhiMSwgIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDBiLCAgMHgyNiwgIDB4YjEsICAweDc2LAotICAweGZlLCAgMHg4OSwgIDB4NGEsICAweDAxLCAgMHgwYiwgIDB4MDQsICAweDUxLCAgMHgwNCwgIDB4MjIsICAweGQzLCAgMHgwNywgIDB4MDYsICAweGZlLCAgMHg0OCwgIDB4MTMsICAweGI4LAotICAweDEzLCAgMHhkMywgIDB4ZmUsICAweDQ5LCAgMHhmNCwgIDB4MDAsICAweDRkLCAgMHg3NiwgIDB4YTksICAweDY3LCAgMHhmZSwgIDB4MDEsICAweGVjLCAgMHhmZSwgIDB4MjcsICAweDAxLAotICAweGZlLCAgMHg4OSwgIDB4NDgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgyNywgIDB4ZmUsICAweDJlLCAgMHgxNiwgIDB4MzIsICAweDA3LCAgMHhmZSwgIDB4ZTMsICAweDAwLAotICAweGZlLCAgMHgyMCwgIDB4MTMsICAweDFkLCAgMHhmZSwgIDB4NTIsICAweDE2LCAgMHgyMSwgIDB4MTMsICAweGQ0LCAgMHgwMSwgIDB4NGIsICAweDIyLCAgMHhkNCwgIDB4MDcsICAweDA2LAotICAweDRlLCAgMHgwOCwgIDB4NTQsICAweDA2LCAgMHgzNywgIDB4MDQsICAweDA5LCAgMHg0OCwgIDB4MDEsICAweDBlLCAgMHhmYiwgIDB4OGUsICAweDA3LCAgMHgxMSwgIDB4YWUsICAweDA5LAotICAweDg0LCAgMHgwMSwgIDB4MGUsICAweDhlLCAgMHgwOSwgIDB4NWQsICAweDAxLCAgMHhhOCwgIDB4MDQsICAweDA5LCAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHg4ZSwgIDB4ZmUsICAweDgwLAotICAweGU3LCAgMHgxMSwgIDB4MDcsICAweDExLCAgMHg4YSwgIDB4ZmUsICAweDQ1LCAgMHg1OCwgIDB4MDEsICAweGYwLCAgMHg4ZSwgIDB4MDQsICAweDA5LCAgMHg0OCwgIDB4MDEsICAweDBlLAotICAweDhlLCAgMHgwOSwgIDB4NWQsICAweDAxLCAgMHhhOCwgIDB4MDQsICAweDA5LCAgMHg0OCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDgwLCAgMHhmZSwgIDB4ODAsICAweDRjLAotICAweGZlLCAgMHg0OSwgIDB4ZTQsICAweDExLCAgMHhhZSwgIDB4MDksICAweDg0LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg4MCwgIDB4NGMsICAweDA5LCAgMHg1ZCwgIDB4MDEsICAweDg3LAotICAweDA0LCAgMHgxOCwgIDB4MTEsICAweDc1LCAgMHg2YywgIDB4ZmUsICAweDYwLCAgMHgwMSwgIDB4ZmUsICAweDE4LCAgMHhkZiwgIDB4ZmUsICAweDE5LCAgMHhkZSwgIDB4ZmUsICAweDI0LAotICAweDFjLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgxYiwgIDB4OTcsICAweGZlLCAgMHhlZSwgIDB4MTYsICAweDAxLCAgMHhmZSwgIDB4ZjQsICAweDE3LCAgMHhhZCwgIDB4OWEsICAweDFiLAotICAweDZjLCAgMHhmZSwgIDB4MmMsICAweDAxLCAgMHhmZSwgIDB4MmYsICAweDE5LCAgMHgwNCwgIDB4YjksICAweDIzLCAgMHhmZSwgIDB4ZGUsICAweDE2LCAgMHhmZSwgIDB4ZGEsICAweDEwLAotICAweDE4LCAgMHgxMSwgIDB4NzUsICAweDAzLCAgMHhmZSwgIDB4NjQsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweGY0LCAgMHgxZiwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDMsICAweGZlLAotICAweDY2LCAgMHgwMSwgIDB4ZmUsICAweDE5LCAgMHg1OCwgIDB4OWEsICAweDFmLCAgMHhmZSwgIDB4M2MsICAweDkwLCAgMHhmZSwgIDB4MzAsICAweGY0LCAgMHgwNiwgIDB4ZmUsICAweDNjLAotICAweDUwLCAgMHg2YywgIDB4ZmUsICAweDM4LCAgMHgwMCwgIDB4ZmUsICAweDBmLCAgMHg3OSwgIDB4ZmUsICAweDFjLCAgMHhmNywgIDB4MWYsICAweDk3LCAgMHhmZSwgIDB4MzgsICAweDE3LAotICAweGZlLCAgMHhiNiwgIDB4MTQsICAweDM1LCAgMHgwNCwgIDB4YjksICAweDIzLCAgMHhmZSwgIDB4MTAsICAweDE3LCAgMHhmZSwgIDB4OWMsICAweDEwLCAgMHgxOCwgIDB4MTEsICAweDc1LAotICAweGZlLCAgMHg4MywgIDB4NWEsICAweGZlLCAgMHgxOCwgIDB4ZGYsICAweGZlLCAgMHgxOSwgIDB4ZGUsICAweGZlLCAgMHgxZCwgIDB4ZjcsICAweDJlLCAgMHg5NywgIDB4ZmUsICAweDVhLAotICAweDE3LCAgMHhmZSwgIDB4OTQsICAweDE0LCAgMHhlYywgIDB4OWEsICAweDJlLCAgMHg2YywgIDB4MWEsICAweGZlLCAgMHhhZiwgIDB4MTksICAweGZlLCAgMHg5OCwgIDB4ZTcsICAweDAwLAotICAweDA0LCAgMHhiOSwgIDB4MjMsICAweGZlLCAgMHg0ZSwgIDB4MTcsICAweGZlLCAgMHg2YywgIDB4MTAsICAweDE4LCAgMHgxMSwgIDB4NzUsICAweGZlLCAgMHgzMCwgIDB4YmMsICAweGZlLAotICAweGIyLCAgMHhiYywgIDB4OWEsICAweGNiLCAgMHg2YywgIDB4MWEsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweGNiLCAgMHg5NywgIDB4ZmUsICAweDkyLAotICAweDE3LCAgMHhmZSwgIDB4NWMsICAweDE0LCAgMHgzNSwgIDB4MDQsICAweGI5LCAgMHgyMywgIDB4ZmUsICAweDdlLCAgMHgxNywgIDB4ZmUsICAweDQyLCAgMHgxMCwgIDB4ZmUsICAweDAyLAotICAweGY2LCAgMHgxMSwgIDB4NzUsICAweGZlLCAgMHgxOCwgIDB4ZmUsICAweDYwLCAgMHhmZSwgIDB4MTksICAweGZlLCAgMHg2MSwgIDB4ZmUsICAweDAzLCAgMHhhMSwgIDB4ZmUsICAweDFkLAotICAweGY3LCAgMHg1YiwgIDB4OTcsICAweGZlLCAgMHhiOCwgIDB4MTcsICAweGZlLCAgMHgzNiwgIDB4MTQsICAweGZlLCAgMHgxYywgIDB4MTMsICAweDlhLCAgMHg1YiwgIDB4NDEsICAweGZlLAotICAweDgzLCAgMHg1OCwgIDB4ZmUsICAweGFmLCAgMHgxOSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MTEsICAweGZlLCAgMHg4MSwgIDB4ZTcsICAweDExLCAgMHgxMiwgIDB4ZmUsICAweGRkLAotICAweDAwLCAgMHg2YSwgIDB4MmEsICAweDA0LCAgMHg2YSwgIDB4MmEsICAweGZlLCAgMHgxMiwgIDB4NDUsICAweDIzLCAgMHhmZSwgIDB4YTgsICAweDE3LCAgMHgxNSwgIDB4MDYsICAweDM5LAotICAweGEwLCAgMHhiNCwgIDB4MDIsICAweDJiLCAgMHhmZSwgIDB4MzksICAweGYwLCAgMHhmZSwgIDB4ZmMsICAweDE3LCAgMHgyMSwgIDB4MDQsICAweGZlLCAgMHg3ZSwgIDB4MTgsICAweDFlLAotICAweDE5LCAgMHg2NiwgIDB4MGYsICAweDBkLCAgMHgwNCwgIDB4NzUsICAweDAzLCAgMHhkMiwgIDB4MWUsICAweDA2LCAgMHhmZSwgIDB4ZWYsICAweDEyLCAgMHhmZSwgIDB4ZTEsICAweDEwLAotICAweDdjLCAgMHg2ZiwgIDB4NGYsICAweDMyLCAgMHgwNywgIDB4MmYsICAweGZlLCAgMHgzYywgIDB4MTMsICAweGYxLCAgMHhmZSwgIDB4NDIsICAweDEzLCAgMHg0MiwgIDB4OTIsICAweDA5LAotICAweDQ4LCAgMHgwMSwgIDB4MGUsICAweGJiLCAgMHhlYiwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4ZmUsICAweDQ1LCAgMHg0OCwgIDB4MDEsICAweGYwLCAgMHhmZSwgIDB4MDAsICAweGNjLAotICAweGJiLCAgMHhmZSwgIDB4ZjMsICAweDEzLCAgMHg0MywgIDB4NzgsICAweDA3LCAgMHgxMSwgIDB4YWMsICAweDA5LCAgMHg4NCwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4ODAsICAweDRjLAotICAweDAxLCAgMHg3MywgIDB4ZmUsICAweDE2LCAgMHgxMCwgIDB4MDcsICAweDgyLCAgMHg4YiwgIDB4ZmUsICAweDQwLCAgMHgxNCwgIDB4ZmUsICAweDI0LCAgMHgxMiwgIDB4ZmUsICAweDE0LAotICAweDU2LCAgMHhmZSwgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4MWMsICAweDE4LCAgMHgxOCwgIDB4MGEsICAweDA0LCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgwYSwgIDB4MTAsICAweGZlLAotICAweDE1LCAgMHgwMCwgIDB4NjQsICAweDc5LCAgMHgyYSwgIDB4MDEsICAweGUzLCAgMHgxOCwgIDB4MDYsICAweDA0LCAgMHg0MiwgIDB4OTIsICAweDA4LCAgMHg1NCwgIDB4MWIsICAweDM3LAotICAweDEyLCAgMHgyZiwgIDB4MDEsICAweDczLCAgMHgxOCwgIDB4MDYsICAweDA0LCAgMHhmZSwgIDB4MzgsICAweDkwLCAgMHhmZSwgIDB4YmEsICAweDkwLCAgMHgzYSwgIDB4Y2UsICAweDNiLAotICAweGNmLCAgMHhmZSwgIDB4NDgsICAweDU1LCAgMHgzNSwgIDB4ZmUsICAweGM5LCAgMHg1NSwgIDB4MDQsICAweDIyLCAgMHhhMywgIDB4NzcsICAweDEzLCAgMHhhMywgIDB4MDQsICAweDA5LAotICAweGE0LCAgMHgwMSwgIDB4MGUsICAweGZlLCAgMHg0MSwgIDB4NDgsICAweDA5LCAgMHg0NiwgIDB4MDEsICAweDBlLCAgMHhmZSwgIDB4NDksICAweDQ0LCAgMHgxNywgIDB4ZmUsICAweGU4LAotICAweDE4LCAgMHg3NywgIDB4NzgsICAweDA0LCAgMHgwOSwgIDB4NDgsICAweDAxLCAgMHgwZSwgIDB4MDcsICAweDExLCAgMHg0ZSwgIDB4MDksICAweDVkLCAgMHgwMSwgIDB4YTgsICAweDA5LAotICAweDQ2LCAgMHgwMSwgIDB4MGUsICAweDc3LCAgMHg3OCwgIDB4MDQsICAweGZlLCAgMHg0ZSwgIDB4ZTQsICAweDE5LCAgMHg2YiwgIDB4ZmUsICAweDFjLCAgMHgxOSwgIDB4MDMsICAweGZlLAotICAweDkwLCAgMHgwMCwgIDB4ZmUsICAweDNhLCAgMHg0NSwgIDB4ZmUsICAweDJjLCAgMHgxMCwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4YzksICAweDZiLCAgMHhmZSwgIDB4MmUsICAweDE5LAotICAweDAzLCAgMHhmZSwgIDB4OTIsICAweDAwLCAgMHhmZSwgIDB4MDIsICAweGU2LCAgMHgxYSwgIDB4ZTUsICAweGZlLCAgMHg0ZSwgIDB4ZTQsICAweGZlLCAgMHgwYiwgIDB4MDAsICAweDZiLAotICAweGZlLCAgMHg0MCwgIDB4MTksICAweDAzLCAgMHhmZSwgIDB4OTQsICAweDAwLCAgMHhmZSwgIDB4MDIsICAweGU2LCAgMHgxZiwgIDB4ZmUsICAweDA4LCAgMHgxMCwgIDB4MDMsICAweGZlLAotICAweDk2LCAgMHgwMCwgIDB4ZmUsICAweDAyLCAgMHhlNiwgIDB4NmQsICAweGZlLCAgMHg0ZSwgIDB4NDUsICAweGVhLCAgMHhiYSwgIDB4ZmYsICAweDA0LCAgMHg2OCwgIDB4NTQsICAweGU3LAotICAweDFlLCAgMHg2ZSwgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4ZmUsICAweDY3LCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4ZmUsICAweDFhLCAgMHhmNCwgIDB4ZmUsICAweDAwLAotICAweDA0LCAgMHhlYSwgIDB4ZmUsICAweDQ4LCAgMHhmNCwgIDB4MTksICAweDdhLCAgMHhmZSwgIDB4NzQsICAweDE5LCAgMHgwZiwgIDB4MTksICAweDA0LCAgMHgwNywgIDB4N2UsICAweGZlLAotICAweDVhLCAgMHhmMCwgIDB4ZmUsICAweDg0LCAgMHgxOSwgIDB4MjUsICAweGZlLCAgMHgwOSwgIDB4MDAsICAweGZlLCAgMHgzNCwgIDB4MTAsICAweDA3LCAgMHgxYSwgIDB4ZmUsICAweDVhLAotICAweGYwLCAgMHhmZSwgIDB4OTIsICAweDE5LCAgMHgyNSwgIDB4Y2EsICAweGZlLCAgMHgyNiwgIDB4MTAsICAweDA3LCAgMHgxOSwgIDB4NjYsICAweDI1LCAgMHg2ZCwgIDB4ZTUsICAweDA3LAotICAweDBhLCAgMHg2NiwgIDB4MjUsICAweDllLCAgMHhmZSwgIDB4MGUsICAweDEwLCAgMHgwNywgIDB4MDYsICAweDY2LCAgMHgyNSwgIDB4NTksICAweGE5LCAgMHhiOCwgIDB4MDQsICAweDE1LAotICAweGZlLCAgMHgwOSwgIDB4MDAsICAweDAxLCAgMHgzNiwgIDB4ZmUsICAweDA0LCAgMHhmZSwgIDB4ODEsICAweDAzLCAgMHg4MywgIDB4ZmUsICAweDQwLCAgMHg1YywgIDB4MDQsICAweDFjLAotICAweGY3LCAgMHhmZSwgIDB4MTQsICAweGYwLCAgMHgwYiwgIDB4MjcsICAweGZlLCAgMHhkNiwgIDB4MTksICAweDFjLCAgMHhmNywgIDB4N2IsICAweGY3LCAgMHhmZSwgIDB4ODIsICAweGYwLAotICAweGZlLCAgMHhkYSwgIDB4MTksICAweDA0LCAgMHhmZiwgIDB4Y2MsICAweDAwLCAgMHgwMCwKKwkweGZlLCAweDA3LCAweDU4LCAweDAzLCAweGZlLCAweGIwLCAweDAwLCAweGZlLCAweDA4LCAweDU4LCAweDAzLCAweGZlLAorCTB4YjIsIDB4MDAsIDB4ZmUsIDB4MDksCisJMHg1OCwgMHhmZSwgMHgwYSwgMHgxYywgMHgyNSwgMHg2ZSwgMHgxMywgMHhkMCwgMHgyMSwgMHgwYywgMHg1YywgMHgwYywKKwkweDQ1LCAweDBmLCAweDQ2LCAweDUyLAorCTB4NTAsIDB4MTgsIDB4MWIsIDB4ZmUsIDB4OTAsIDB4NGQsIDB4ZmUsIDB4OTEsIDB4NTQsIDB4MjMsIDB4ZmUsIDB4ZmMsCisJMHgwZiwgMHg0NCwgMHgxMSwgMHgwZiwKKwkweDQ4LCAweDUyLCAweDE4LCAweDU4LCAweGZlLCAweDkwLCAweDRkLCAweGZlLCAweDkxLCAweDU0LCAweDIzLCAweGU0LAorCTB4MjUsIDB4MTEsIDB4MTMsIDB4MjAsCisJMHg3YywgMHg2ZiwgMHg0ZiwgMHgyMiwgMHgyMCwgMHhmYiwgMHg3OSwgMHgyMCwgMHgxMiwgMHhjZiwgMHhmZSwgMHgxNCwKKwkweDU2LCAweGZlLCAweGQ2LCAweGYwLAorCTB4ZmUsIDB4MjYsIDB4MTAsIDB4ZjgsIDB4NzQsIDB4ZmUsIDB4MTQsIDB4MWMsIDB4ZmUsIDB4MTAsIDB4MWMsIDB4ZmUsCisJMHgxOCwgMHgxYywgMHgwNCwgMHg0MiwKKwkweGZlLCAweDBjLCAweDE0LCAweGZjLCAweGZlLCAweDA3LCAweGU2LCAweDFiLCAweGZlLCAweGNlLCAweDQ3LCAweGZlLAorCTB4ZjUsIDB4MTMsIDB4MDQsIDB4MDEsCisJMHhiMCwgMHg3YywgMHg2ZiwgMHg0ZiwgMHhmZSwgMHgwNiwgMHg4MCwgMHhmZSwgMHg0OCwgMHg0NywgMHhmZSwgMHg0MiwKKwkweDEzLCAweDMyLCAweDA3LCAweDJmLAorCTB4ZmUsIDB4MzQsIDB4MTMsIDB4MDksIDB4NDgsIDB4MDEsIDB4MGUsIDB4YmIsIDB4ZmUsIDB4MzYsIDB4MTIsIDB4ZmUsCisJMHg0MSwgMHg0OCwgMHhmZSwgMHg0NSwKKwkweDQ4LCAweDAxLCAweGYwLCAweGZlLCAweDAwLCAweGNjLCAweGJiLCAweGZlLCAweGYzLCAweDEzLCAweDQzLCAweDc4LAorCTB4MDcsIDB4MTEsIDB4YWMsIDB4MDksCisJMHg4NCwgMHgwMSwgMHgwZSwgMHhmZSwgMHg4MCwgMHg1YywgMHgwMSwgMHg3MywgMHhmZSwgMHgwZSwgMHgxMCwgMHgwNywKKwkweDgyLCAweDRlLCAweGZlLCAweDE0LAorCTB4NTYsIDB4ZmUsIDB4ZDYsIDB4ZjAsIDB4ZmUsIDB4NjAsIDB4MTAsIDB4MDQsIDB4ZmUsIDB4NDQsIDB4NTgsIDB4OGQsCisJMHhmZSwgMHgwMSwgMHhlYywgMHhhMiwKKwkweGZlLCAweDllLCAweDQwLCAweGZlLCAweDlkLCAweGU3LCAweDAwLCAweGZlLCAweDljLCAweGU3LCAweDFhLCAweDc5LAorCTB4MmEsIDB4MDEsIDB4ZTMsIDB4ZmUsCisJMHhkZCwgMHgxMCwgMHgyYywgMHhjNywgMHg4MSwgMHhjOCwgMHg4MywgMHgzMywgMHgzMSwgMHhkZSwgMHgwNywgMHgxYSwKKwkweGZlLCAweDQ4LCAweDEyLCAweDA3LAorCTB4MGEsIDB4ZmUsIDB4NTYsIDB4MTIsIDB4MDcsIDB4MTksIDB4ZmUsIDB4MzAsIDB4MTIsIDB4MDcsIDB4YzksIDB4MTcsCisJMHhmZSwgMHgzMiwgMHgxMiwgMHgwNywKKwkweGZlLCAweDIzLCAweDAwLCAweDE3LCAweGViLCAweDA3LCAweDA2LCAweDE3LCAweGZlLCAweDljLCAweDEyLCAweDA3LAorCTB4MWYsIDB4ZmUsIDB4MTIsIDB4MTIsCisJMHgwNywgMHgwMCwgMHgxNywgMHgyNCwgMHgxNSwgMHhjOSwgMHgwMSwgMHgzNiwgMHhhOSwgMHgyZCwgMHgwMSwgMHgwYiwKKwkweDk0LCAweDRiLCAweDA0LCAweDJkLAorCTB4ZGQsIDB4MDksIDB4ZDEsIDB4MDEsIDB4ZmUsIDB4MjYsIDB4MGYsIDB4MTIsIDB4ODIsIDB4MDIsIDB4MmIsIDB4MmQsCisJMHgzMiwgMHgwNywgMHhhNiwgMHhmZSwKKwkweGQ5LCAweDEzLCAweDNhLCAweDNkLCAweDNiLCAweDNlLCAweDU2LCAweGZlLCAweGYwLCAweDExLCAweDA4LCAweDA1LAorCTB4NWEsIDB4ZmUsIDB4NzIsIDB4MTIsCisJMHg5YiwgMHgyZSwgMHg5YywgMHgzYywgMHg5MCwgMHhjMCwgMHg5NiwgMHhmZSwgMHhiYSwgMHgxMSwgMHgyMiwgMHg2MiwKKwkweGZlLCAweDI2LCAweDEzLCAweDAzLAorCTB4N2YsIDB4MjksIDB4ODAsIDB4NTYsIDB4ZmUsIDB4NzYsIDB4MGQsIDB4MGMsIDB4NjAsIDB4MTQsIDB4NjEsIDB4MjEsCisJMHgwYywgMHg3ZiwgMHgwYywgMHg4MCwKKwkweDAxLCAweGIzLCAweDI1LCAweDZlLCAweDc3LCAweDEzLCAweDYyLCAweDAxLCAweGVmLCAweDliLCAweDJlLCAweDljLAorCTB4M2MsIDB4ZmUsIDB4MDQsIDB4NTUsCisJMHhmZSwgMHhhNSwgMHg1NSwgMHhmZSwgMHgwNCwgMHhmYSwgMHgyZSwgMHhmZSwgMHgwNSwgMHhmYSwgMHgzYywgMHhmZSwKKwkweDkxLCAweDEwLCAweDAzLCAweDNmLAorCTB4MjksIDB4NDAsIDB4ZmUsIDB4NDAsIDB4NTYsIDB4ZmUsIDB4ZTEsIDB4NTYsIDB4MGMsIDB4M2YsIDB4MTQsIDB4NDAsCisJMHg4OCwgMHg5YiwgMHgyZSwgMHg5YywKKwkweDNjLCAweDkwLCAweGMwLCAweDAzLCAweDVlLCAweDI5LCAweDVmLCAweGZlLCAweDAwLCAweDU2LCAweGZlLCAweGExLAorCTB4NTYsIDB4MGMsIDB4NWUsIDB4MTQsCisJMHg1ZiwgMHgwOCwgMHgwNSwgMHg1YSwgMHhmZSwgMHgxZSwgMHgxMiwgMHgyMiwgMHg2MiwgMHhmZSwgMHgxZiwgMHg0MCwKKwkweDAzLCAweDYwLCAweDI5LCAweDYxLAorCTB4ZmUsIDB4MmMsIDB4NTAsIDB4ZmUsIDB4YWUsIDB4NTAsIDB4MDMsIDB4M2YsIDB4MjksIDB4NDAsIDB4ZmUsIDB4NDQsCisJMHg1MCwgMHhmZSwgMHhjNiwgMHg1MCwKKwkweDAzLCAweDVlLCAweDI5LCAweDVmLCAweGZlLCAweDA4LCAweDUwLCAweGZlLCAweDhhLCAweDUwLCAweDAzLCAweDNkLAorCTB4MjksIDB4M2UsIDB4ZmUsIDB4NDAsCisJMHg1MCwgMHhmZSwgMHhjMiwgMHg1MCwgMHgwMiwgMHg4OSwgMHgyNSwgMHgwNiwgMHgxMywgMHhkNCwgMHgwMiwgMHg3MiwKKwkweDJkLCAweDAxLCAweDBiLCAweDFkLAorCTB4NGMsIDB4MzMsIDB4MzEsIDB4ZGUsIDB4MDcsIDB4MDYsIDB4MjMsIDB4NGMsIDB4MzIsIDB4MDcsIDB4YTYsIDB4MjMsCisJMHg3MiwgMHgwMSwgMHhhZiwgMHgxZSwKKwkweDQzLCAweDE3LCAweDRjLCAweDA4LCAweDA1LCAweDBhLCAweGVlLCAweDNhLCAweDNkLCAweDNiLCAweDNlLCAweGZlLAorCTB4MGEsIDB4NTUsIDB4MzUsIDB4ZmUsCisJMHg4YiwgMHg1NSwgMHg1NywgMHgzZCwgMHg3ZCwgMHgzZSwgMHhmZSwgMHgwYywgMHg1MSwgMHhmZSwgMHg4ZSwgMHg1MSwKKwkweDAyLCAweDcyLCAweGZlLCAweDE5LAorCTB4ODEsIDB4YmEsIDB4ZmUsIDB4MTksIDB4NDEsIDB4MDIsIDB4NzIsIDB4MmQsIDB4MDEsIDB4MGIsIDB4MWMsIDB4MzQsCisJMHgxZCwgMHhlOCwgMHgzMywgMHgzMSwKKwkweGUxLCAweDU1LCAweDE5LCAweGZlLCAweGE2LCAweDEyLCAweDU1LCAweDBhLCAweDRkLCAweDAyLCAweDRjLCAweDAxLAorCTB4MGIsIDB4MWMsIDB4MzQsIDB4MWQsCisJMHhlOCwgMHgzMywgMHgzMSwgMHhkZiwgMHgwNywgMHgxOSwgMHgyMywgMHg0YywgMHgwMSwgMHgwYiwgMHgxZCwgMHhlOCwKKwkweDMzLCAweDMxLCAweGZlLCAweGU4LAorCTB4MDksIDB4ZmUsIDB4YzIsIDB4NDksIDB4NTEsIDB4MDMsIDB4ZmUsIDB4OWMsIDB4MDAsIDB4MjgsIDB4OGEsIDB4NTMsCisJMHgwNSwgMHgxZiwgMHgzNSwgMHhhOSwKKwkweGZlLCAweGJiLCAweDQ1LCAweDU1LCAweDAwLCAweDRlLCAweDQ0LCAweDA2LCAweDdjLCAweDQzLCAweGZlLCAweGRhLAorCTB4MTQsIDB4MDEsIDB4YWYsIDB4OGMsCisJMHhmZSwgMHg0YiwgMHg0NSwgMHhlZSwgMHgzMiwgMHgwNywgMHhhNSwgMHhlZCwgMHgwMywgMHhjZCwgMHgyOCwgMHg4YSwKKwkweDAzLCAweDQ1LCAweDI4LCAweDM1LAorCTB4NjcsIDB4MDIsIDB4NzIsIDB4ZmUsIDB4YzAsIDB4NWQsIDB4ZmUsIDB4ZjgsIDB4MTQsIDB4ZmUsIDB4MDMsIDB4MTcsCisJMHgwMywgMHg1YywgMHhjMSwgMHgwYywKKwkweDVjLCAweDY3LCAweDJkLCAweDAxLCAweDBiLCAweDI2LCAweDg5LCAweDAxLCAweGZlLCAweDllLCAweDE1LCAweDAyLAorCTB4ODksIDB4MDEsIDB4MGIsIDB4MWMsCisJMHgzNCwgMHgxZCwgMHg0YywgMHgzMywgMHgzMSwgMHhkZiwgMHgwNywgMHgwNiwgMHgyMywgMHg0YywgMHgwMSwgMHhmMSwKKwkweGZlLCAweDQyLCAweDU4LCAweGYxLAorCTB4ZmUsIDB4YTQsIDB4MTQsIDB4OGMsIDB4ZmUsIDB4NGEsIDB4ZjQsIDB4MGEsIDB4MTcsIDB4NGMsIDB4ZmUsIDB4NGEsCisJMHhmNCwgMHgwNiwgMHhlYSwgMHgzMiwKKwkweDA3LCAweGE1LCAweDhiLCAweDAyLCAweDcyLCAweDAzLCAweDQ1LCAweGMxLCAweDBjLCAweDQ1LCAweDY3LCAweDJkLAorCTB4MDEsIDB4MGIsIDB4MjYsIDB4ODksCisJMHgwMSwgMHhmZSwgMHhjYywgMHgxNSwgMHgwMiwgMHg4OSwgMHgwZiwgMHgwNiwgMHgyNywgMHhmZSwgMHhiZSwgMHgxMywKKwkweDI2LCAweGZlLCAweGQ0LCAweDEzLAorCTB4NzYsIDB4ZmUsIDB4ODksIDB4NDgsIDB4MDEsIDB4MGIsIDB4MjEsIDB4NzYsIDB4MDQsIDB4N2IsIDB4ZmUsIDB4ZDAsCisJMHgxMywgMHgxYywgMHhmZSwgMHhkMCwKKwkweDEzLCAweDFkLCAweGZlLCAweGJlLCAweDEzLCAweDY3LCAweDJkLCAweDAxLCAweDBiLCAweGZlLCAweGQ1LCAweDEwLAorCTB4MGYsIDB4NzEsIDB4ZmYsIDB4MDIsCisJMHgwMCwgMHg1NywgMHg1MiwgMHg5MywgMHgxZSwgMHhmZSwgMHhmZiwgMHg3ZiwgMHhmZSwgMHgzMCwgMHg1NiwgMHhmZSwKKwkweDAwLCAweDVjLCAweDA0LCAweDBmLAorCTB4NzEsIDB4ZmYsIDB4MDIsIDB4MDAsIDB4NTcsIDB4NTIsIDB4OTMsIDB4MWUsIDB4NDMsIDB4ZmUsIDB4MzAsIDB4NTYsCisJMHhmZSwgMHgwMCwgMHg1YywgMHgwNCwKKwkweDBmLCAweDcxLCAweGZmLCAweDAyLCAweDAwLCAweDU3LCAweDUyLCAweDkzLCAweDA0LCAweDBmLCAweDcxLCAweGZmLAorCTB4MDIsIDB4MDAsIDB4NTcsIDB4NTIsCisJMHg5MywgMHhmZSwgMHgwYiwgMHg1OCwgMHgwNCwgMHgwOSwgMHg1YywgMHgwMSwgMHg4NywgMHgwOSwgMHg0NSwgMHgwMSwKKwkweDg3LCAweDA0LCAweGZlLCAweDAzLAorCTB4YTEsIDB4MWUsIDB4MTEsIDB4ZmYsIDB4MDMsIDB4MDAsIDB4NTQsIDB4ZmUsIDB4MDAsIDB4ZjQsIDB4MWYsIDB4NTIsCisJMHhmZSwgMHgwMCwgMHg3ZCwgMHhmZSwKKwkweDAxLCAweDdkLCAweGZlLCAweDAyLCAweDdkLCAweGZlLCAweDAzLCAweDdjLCAweDZhLCAweDJhLCAweDBjLCAweDVlLAorCTB4MTQsIDB4NWYsIDB4NTcsIDB4M2YsCisJMHg3ZCwgMHg0MCwgMHgwNCwgMHhkZCwgMHhmZSwgMHg4MiwgMHg0YSwgMHhmZSwgMHhlMSwgMHgxYSwgMHhmZSwgMHg4MywKKwkweDVhLCAweDhkLCAweDA0LCAweDAxLAorCTB4ZmUsIDB4MGMsIDB4MTksIDB4ZmUsIDB4NDIsIDB4NDgsIDB4NTAsIDB4NTEsIDB4OTEsIDB4MDEsIDB4MGIsIDB4MWQsCisJMHhmZSwgMHg5NiwgMHgxNSwgMHgzMywKKwkweDMxLCAweGUxLCAweDAxLCAweDBiLCAweDFkLCAweGZlLCAweDk2LCAweDE1LCAweDMzLCAweDMxLCAweGZlLCAweGU4LAorCTB4MGEsIDB4ZmUsIDB4YzEsIDB4NTksCisJMHgwMywgMHhjZCwgMHgyOCwgMHhmZSwgMHhjYywgMHgxMiwgMHg1MywgMHgwNSwgMHgxYSwgMHhmZSwgMHhjNCwgMHgxMywKKwkweDIxLCAweDY5LCAweDFhLCAweGVlLAorCTB4NTUsIDB4Y2EsIDB4NmIsIDB4ZmUsIDB4ZGMsIDB4MTQsIDB4NGQsIDB4MGYsIDB4MDYsIDB4MTgsIDB4Y2EsIDB4N2MsCisJMHgzMCwgMHhmZSwgMHg3OCwgMHgxMCwKKwkweGZmLCAweDAyLCAweDgzLCAweDU1LCAweGFiLCAweGZmLCAweDAyLCAweDgzLCAweDU1LCAweDY5LCAweDE5LCAweGFlLAorCTB4OTgsIDB4ZmUsIDB4MzAsIDB4MDAsCisJMHg5NiwgMHhmMiwgMHgxOCwgMHg2ZCwgMHgwZiwgMHgwNiwgMHhmZSwgMHg1NiwgMHgxMCwgMHg2OSwgMHgwYSwgMHhlZCwKKwkweDk4LCAweGZlLCAweDY0LCAweDAwLAorCTB4OTYsIDB4ZjIsIDB4MDksIDB4ZmUsIDB4NjQsIDB4MDAsIDB4MTgsIDB4OWUsIDB4MGYsIDB4MDYsIDB4ZmUsIDB4MjgsCisJMHgxMCwgMHg2OSwgMHgwNiwgMHhmZSwKKwkweDYwLCAweDEzLCAweDk4LCAweGZlLCAweGM4LCAweDAwLCAweDk2LCAweGYyLCAweDA5LCAweGZlLCAweGM4LCAweDAwLAorCTB4MTgsIDB4NTksIDB4MGYsIDB4MDYsCisJMHg4OCwgMHg5OCwgMHhmZSwgMHg5MCwgMHgwMSwgMHg3YSwgMHhmZSwgMHg0MiwgMHgxNSwgMHg5MSwgMHhlNCwgMHhmZSwKKwkweDQzLCAweGY0LCAweDlmLCAweGZlLAorCTB4NTYsIDB4ZjAsIDB4ZmUsIDB4NTQsIDB4MTUsIDB4ZmUsIDB4MDQsIDB4ZjQsIDB4NzEsIDB4ZmUsIDB4NDMsIDB4ZjQsCisJMHg5ZSwgMHhmZSwgMHhmMywgMHgxMCwKKwkweGZlLCAweDQwLCAweDVjLCAweDAxLCAweGZlLCAweDE2LCAweDE0LCAweDFlLCAweDQzLCAweGVjLCAweGZlLCAweDAwLAorCTB4MTcsIDB4ZmUsIDB4NGQsIDB4ZTQsCisJMHg2ZSwgMHg3YSwgMHhmZSwgMHg5MCwgMHgxNSwgMHhjNCwgMHg2ZSwgMHhmZSwgMHgxYywgMHgxMCwgMHhmZSwgMHgwMCwKKwkweDE3LCAweGZlLCAweDRkLCAweGU0LAorCTB4Y2MsIDB4N2EsIDB4ZmUsIDB4OTAsIDB4MTUsIDB4YzQsIDB4Y2MsIDB4ODgsIDB4NTEsIDB4MjEsIDB4ZmUsIDB4NGQsCisJMHhmNCwgMHgwMCwgMHhlOSwgMHg5MSwKKwkweDBmLCAweDA2LCAweGZlLCAweGI0LCAweDU2LCAweGZlLCAweGMzLCAweDU4LCAweDA0LCAweDUxLCAweDBmLCAweDBhLAorCTB4MDQsIDB4MTYsIDB4MDYsIDB4MDEsCisJMHgwYiwgMHgyNiwgMHhmMywgMHgxNiwgMHgwYSwgMHgwMSwgMHgwYiwgMHgyNiwgMHhmMywgMHgxNiwgMHgxOSwgMHgwMSwKKwkweDBiLCAweDI2LCAweGYzLCAweDc2LAorCTB4ZmUsIDB4ODksIDB4NDksIDB4MDEsIDB4MGIsIDB4MDQsIDB4MTYsIDB4MDYsIDB4MDEsIDB4MGIsIDB4MjYsIDB4YjEsCisJMHgxNiwgMHgxOSwgMHgwMSwgMHgwYiwKKwkweDI2LCAweGIxLCAweDE2LCAweDA2LCAweDAxLCAweDBiLCAweDI2LCAweGIxLCAweGZlLCAweDg5LCAweDQ5LCAweDAxLAorCTB4MGIsIDB4MjYsIDB4YjEsIDB4NzYsCisJMHhmZSwgMHg4OSwgMHg0YSwgMHgwMSwgMHgwYiwgMHgwNCwgMHg1MSwgMHgwNCwgMHgyMiwgMHhkMywgMHgwNywgMHgwNiwKKwkweGZlLCAweDQ4LCAweDEzLCAweGI4LAorCTB4MTMsIDB4ZDMsIDB4ZmUsIDB4NDksIDB4ZjQsIDB4MDAsIDB4NGQsIDB4NzYsIDB4YTksIDB4NjcsIDB4ZmUsIDB4MDEsCisJMHhlYywgMHhmZSwgMHgyNywgMHgwMSwKKwkweGZlLCAweDg5LCAweDQ4LCAweGZmLCAweDAyLCAweDAwLCAweDEwLCAweDI3LCAweGZlLCAweDJlLCAweDE2LCAweDMyLAorCTB4MDcsIDB4ZmUsIDB4ZTMsIDB4MDAsCisJMHhmZSwgMHgyMCwgMHgxMywgMHgxZCwgMHhmZSwgMHg1MiwgMHgxNiwgMHgyMSwgMHgxMywgMHhkNCwgMHgwMSwgMHg0YiwKKwkweDIyLCAweGQ0LCAweDA3LCAweDA2LAorCTB4NGUsIDB4MDgsIDB4NTQsIDB4MDYsIDB4MzcsIDB4MDQsIDB4MDksIDB4NDgsIDB4MDEsIDB4MGUsIDB4ZmIsIDB4OGUsCisJMHgwNywgMHgxMSwgMHhhZSwgMHgwOSwKKwkweDg0LCAweDAxLCAweDBlLCAweDhlLCAweDA5LCAweDVkLCAweDAxLCAweGE4LCAweDA0LCAweDA5LCAweDg0LCAweDAxLAorCTB4MGUsIDB4OGUsIDB4ZmUsIDB4ODAsCisJMHhlNywgMHgxMSwgMHgwNywgMHgxMSwgMHg4YSwgMHhmZSwgMHg0NSwgMHg1OCwgMHgwMSwgMHhmMCwgMHg4ZSwgMHgwNCwKKwkweDA5LCAweDQ4LCAweDAxLCAweDBlLAorCTB4OGUsIDB4MDksIDB4NWQsIDB4MDEsIDB4YTgsIDB4MDQsIDB4MDksIDB4NDgsIDB4MDEsIDB4MGUsIDB4ZmUsIDB4ODAsCisJMHg4MCwgMHhmZSwgMHg4MCwgMHg0YywKKwkweGZlLCAweDQ5LCAweGU0LCAweDExLCAweGFlLCAweDA5LCAweDg0LCAweDAxLCAweDBlLCAweGZlLCAweDgwLCAweDRjLAorCTB4MDksIDB4NWQsIDB4MDEsIDB4ODcsCisJMHgwNCwgMHgxOCwgMHgxMSwgMHg3NSwgMHg2YywgMHhmZSwgMHg2MCwgMHgwMSwgMHhmZSwgMHgxOCwgMHhkZiwgMHhmZSwKKwkweDE5LCAweGRlLCAweGZlLCAweDI0LAorCTB4MWMsIDB4ZmUsIDB4MWQsIDB4ZjcsIDB4MWIsIDB4OTcsIDB4ZmUsIDB4ZWUsIDB4MTYsIDB4MDEsIDB4ZmUsIDB4ZjQsCisJMHgxNywgMHhhZCwgMHg5YSwgMHgxYiwKKwkweDZjLCAweGZlLCAweDJjLCAweDAxLCAweGZlLCAweDJmLCAweDE5LCAweDA0LCAweGI5LCAweDIzLCAweGZlLCAweGRlLAorCTB4MTYsIDB4ZmUsIDB4ZGEsIDB4MTAsCisJMHgxOCwgMHgxMSwgMHg3NSwgMHgwMywgMHhmZSwgMHg2NCwgMHgwMSwgMHhmZSwgMHgwMCwgMHhmNCwgMHgxZiwgMHhmZSwKKwkweDE4LCAweDU4LCAweDAzLCAweGZlLAorCTB4NjYsIDB4MDEsIDB4ZmUsIDB4MTksIDB4NTgsIDB4OWEsIDB4MWYsIDB4ZmUsIDB4M2MsIDB4OTAsIDB4ZmUsIDB4MzAsCisJMHhmNCwgMHgwNiwgMHhmZSwgMHgzYywKKwkweDUwLCAweDZjLCAweGZlLCAweDM4LCAweDAwLCAweGZlLCAweDBmLCAweDc5LCAweGZlLCAweDFjLCAweGY3LCAweDFmLAorCTB4OTcsIDB4ZmUsIDB4MzgsIDB4MTcsCisJMHhmZSwgMHhiNiwgMHgxNCwgMHgzNSwgMHgwNCwgMHhiOSwgMHgyMywgMHhmZSwgMHgxMCwgMHgxNywgMHhmZSwgMHg5YywKKwkweDEwLCAweDE4LCAweDExLCAweDc1LAorCTB4ZmUsIDB4ODMsIDB4NWEsIDB4ZmUsIDB4MTgsIDB4ZGYsIDB4ZmUsIDB4MTksIDB4ZGUsIDB4ZmUsIDB4MWQsIDB4ZjcsCisJMHgyZSwgMHg5NywgMHhmZSwgMHg1YSwKKwkweDE3LCAweGZlLCAweDk0LCAweDE0LCAweGVjLCAweDlhLCAweDJlLCAweDZjLCAweDFhLCAweGZlLCAweGFmLCAweDE5LAorCTB4ZmUsIDB4OTgsIDB4ZTcsIDB4MDAsCisJMHgwNCwgMHhiOSwgMHgyMywgMHhmZSwgMHg0ZSwgMHgxNywgMHhmZSwgMHg2YywgMHgxMCwgMHgxOCwgMHgxMSwgMHg3NSwKKwkweGZlLCAweDMwLCAweGJjLCAweGZlLAorCTB4YjIsIDB4YmMsIDB4OWEsIDB4Y2IsIDB4NmMsIDB4MWEsIDB4ZmUsIDB4MGYsIDB4NzksIDB4ZmUsIDB4MWMsIDB4ZjcsCisJMHhjYiwgMHg5NywgMHhmZSwgMHg5MiwKKwkweDE3LCAweGZlLCAweDVjLCAweDE0LCAweDM1LCAweDA0LCAweGI5LCAweDIzLCAweGZlLCAweDdlLCAweDE3LCAweGZlLAorCTB4NDIsIDB4MTAsIDB4ZmUsIDB4MDIsCisJMHhmNiwgMHgxMSwgMHg3NSwgMHhmZSwgMHgxOCwgMHhmZSwgMHg2MCwgMHhmZSwgMHgxOSwgMHhmZSwgMHg2MSwgMHhmZSwKKwkweDAzLCAweGExLCAweGZlLCAweDFkLAorCTB4ZjcsIDB4NWIsIDB4OTcsIDB4ZmUsIDB4YjgsIDB4MTcsIDB4ZmUsIDB4MzYsIDB4MTQsIDB4ZmUsIDB4MWMsIDB4MTMsCisJMHg5YSwgMHg1YiwgMHg0MSwgMHhmZSwKKwkweDgzLCAweDU4LCAweGZlLCAweGFmLCAweDE5LCAweGZlLCAweDgwLCAweGU3LCAweDExLCAweGZlLCAweDgxLCAweGU3LAorCTB4MTEsIDB4MTIsIDB4ZmUsIDB4ZGQsCisJMHgwMCwgMHg2YSwgMHgyYSwgMHgwNCwgMHg2YSwgMHgyYSwgMHhmZSwgMHgxMiwgMHg0NSwgMHgyMywgMHhmZSwgMHhhOCwKKwkweDE3LCAweDE1LCAweDA2LCAweDM5LAorCTB4YTAsIDB4YjQsIDB4MDIsIDB4MmIsIDB4ZmUsIDB4MzksIDB4ZjAsIDB4ZmUsIDB4ZmMsIDB4MTcsIDB4MjEsIDB4MDQsCisJMHhmZSwgMHg3ZSwgMHgxOCwgMHgxZSwKKwkweDE5LCAweDY2LCAweDBmLCAweDBkLCAweDA0LCAweDc1LCAweDAzLCAweGQyLCAweDFlLCAweDA2LCAweGZlLCAweGVmLAorCTB4MTIsIDB4ZmUsIDB4ZTEsIDB4MTAsCisJMHg3YywgMHg2ZiwgMHg0ZiwgMHgzMiwgMHgwNywgMHgyZiwgMHhmZSwgMHgzYywgMHgxMywgMHhmMSwgMHhmZSwgMHg0MiwKKwkweDEzLCAweDQyLCAweDkyLCAweDA5LAorCTB4NDgsIDB4MDEsIDB4MGUsIDB4YmIsIDB4ZWIsIDB4ZmUsIDB4NDEsIDB4NDgsIDB4ZmUsIDB4NDUsIDB4NDgsIDB4MDEsCisJMHhmMCwgMHhmZSwgMHgwMCwgMHhjYywKKwkweGJiLCAweGZlLCAweGYzLCAweDEzLCAweDQzLCAweDc4LCAweDA3LCAweDExLCAweGFjLCAweDA5LCAweDg0LCAweDAxLAorCTB4MGUsIDB4ZmUsIDB4ODAsIDB4NGMsCisJMHgwMSwgMHg3MywgMHhmZSwgMHgxNiwgMHgxMCwgMHgwNywgMHg4MiwgMHg4YiwgMHhmZSwgMHg0MCwgMHgxNCwgMHhmZSwKKwkweDI0LCAweDEyLCAweGZlLCAweDE0LAorCTB4NTYsIDB4ZmUsIDB4ZDYsIDB4ZjAsIDB4ZmUsIDB4MWMsIDB4MTgsIDB4MTgsIDB4MGEsIDB4MDQsIDB4ZmUsIDB4OWMsCisJMHhlNywgMHgwYSwgMHgxMCwgMHhmZSwKKwkweDE1LCAweDAwLCAweDY0LCAweDc5LCAweDJhLCAweDAxLCAweGUzLCAweDE4LCAweDA2LCAweDA0LCAweDQyLCAweDkyLAorCTB4MDgsIDB4NTQsIDB4MWIsIDB4MzcsCisJMHgxMiwgMHgyZiwgMHgwMSwgMHg3MywgMHgxOCwgMHgwNiwgMHgwNCwgMHhmZSwgMHgzOCwgMHg5MCwgMHhmZSwgMHhiYSwKKwkweDkwLCAweDNhLCAweGNlLCAweDNiLAorCTB4Y2YsIDB4ZmUsIDB4NDgsIDB4NTUsIDB4MzUsIDB4ZmUsIDB4YzksIDB4NTUsIDB4MDQsIDB4MjIsIDB4YTMsIDB4NzcsCisJMHgxMywgMHhhMywgMHgwNCwgMHgwOSwKKwkweGE0LCAweDAxLCAweDBlLCAweGZlLCAweDQxLCAweDQ4LCAweDA5LCAweDQ2LCAweDAxLCAweDBlLCAweGZlLCAweDQ5LAorCTB4NDQsIDB4MTcsIDB4ZmUsIDB4ZTgsCisJMHgxOCwgMHg3NywgMHg3OCwgMHgwNCwgMHgwOSwgMHg0OCwgMHgwMSwgMHgwZSwgMHgwNywgMHgxMSwgMHg0ZSwgMHgwOSwKKwkweDVkLCAweDAxLCAweGE4LCAweDA5LAorCTB4NDYsIDB4MDEsIDB4MGUsIDB4NzcsIDB4NzgsIDB4MDQsIDB4ZmUsIDB4NGUsIDB4ZTQsIDB4MTksIDB4NmIsIDB4ZmUsCisJMHgxYywgMHgxOSwgMHgwMywgMHhmZSwKKwkweDkwLCAweDAwLCAweGZlLCAweDNhLCAweDQ1LCAweGZlLCAweDJjLCAweDEwLCAweGZlLCAweDRlLCAweGU0LCAweGM5LAorCTB4NmIsIDB4ZmUsIDB4MmUsIDB4MTksCisJMHgwMywgMHhmZSwgMHg5MiwgMHgwMCwgMHhmZSwgMHgwMiwgMHhlNiwgMHgxYSwgMHhlNSwgMHhmZSwgMHg0ZSwgMHhlNCwKKwkweGZlLCAweDBiLCAweDAwLCAweDZiLAorCTB4ZmUsIDB4NDAsIDB4MTksIDB4MDMsIDB4ZmUsIDB4OTQsIDB4MDAsIDB4ZmUsIDB4MDIsIDB4ZTYsIDB4MWYsIDB4ZmUsCisJMHgwOCwgMHgxMCwgMHgwMywgMHhmZSwKKwkweDk2LCAweDAwLCAweGZlLCAweDAyLCAweGU2LCAweDZkLCAweGZlLCAweDRlLCAweDQ1LCAweGVhLCAweGJhLCAweGZmLAorCTB4MDQsIDB4NjgsIDB4NTQsIDB4ZTcsCisJMHgxZSwgMHg2ZSwgMHhmZSwgMHgwOCwgMHgxYywgMHhmZSwgMHg2NywgMHgxOSwgMHhmZSwgMHgwYSwgMHgxYywgMHhmZSwKKwkweDFhLCAweGY0LCAweGZlLCAweDAwLAorCTB4MDQsIDB4ZWEsIDB4ZmUsIDB4NDgsIDB4ZjQsIDB4MTksIDB4N2EsIDB4ZmUsIDB4NzQsIDB4MTksIDB4MGYsIDB4MTksCisJMHgwNCwgMHgwNywgMHg3ZSwgMHhmZSwKKwkweDVhLCAweGYwLCAweGZlLCAweDg0LCAweDE5LCAweDI1LCAweGZlLCAweDA5LCAweDAwLCAweGZlLCAweDM0LCAweDEwLAorCTB4MDcsIDB4MWEsIDB4ZmUsIDB4NWEsCisJMHhmMCwgMHhmZSwgMHg5MiwgMHgxOSwgMHgyNSwgMHhjYSwgMHhmZSwgMHgyNiwgMHgxMCwgMHgwNywgMHgxOSwgMHg2NiwKKwkweDI1LCAweDZkLCAweGU1LCAweDA3LAorCTB4MGEsIDB4NjYsIDB4MjUsIDB4OWUsIDB4ZmUsIDB4MGUsIDB4MTAsIDB4MDcsIDB4MDYsIDB4NjYsIDB4MjUsIDB4NTksCisJMHhhOSwgMHhiOCwgMHgwNCwgMHgxNSwKKwkweGZlLCAweDA5LCAweDAwLCAweDAxLCAweDM2LCAweGZlLCAweDA0LCAweGZlLCAweDgxLCAweDAzLCAweDgzLCAweGZlLAorCTB4NDAsIDB4NWMsIDB4MDQsIDB4MWMsCisJMHhmNywgMHhmZSwgMHgxNCwgMHhmMCwgMHgwYiwgMHgyNywgMHhmZSwgMHhkNiwgMHgxOSwgMHgxYywgMHhmNywgMHg3YiwKKwkweGY3LCAweGZlLCAweDgyLCAweGYwLAorCTB4ZmUsIDB4ZGEsIDB4MTksIDB4MDQsIDB4ZmYsIDB4Y2MsIDB4MDAsIDB4MDAsCiB9OwogCi1TVEFUSUMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzOEMwODAwX3NpemUgPQotICAgICAgICBzaXplb2YoX2Fkdl9hc2MzOEMwODAwX2J1Zik7IC8qIDB4MTRFMSAqLwotU1RBVElDIEFEVl9EQ05UIF9hZHZfYXNjMzhDMDgwMF9jaGtzdW0gPQotICAgICAgICAweDA1MEQzRkQ4VUw7IC8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX2Fkdl9hc2MzOEMwODAwX3NpemUgPSBzaXplb2YoX2Fkdl9hc2MzOEMwODAwX2J1Zik7CS8qIDB4MTRFMSAqLworc3RhdGljIEFEVl9EQ05UIF9hZHZfYXNjMzhDMDgwMF9jaGtzdW0gPSAweDA1MEQzRkQ4VUw7CS8qIEV4cGFuZGVkIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0uICovCiAKIC8qIE1pY3JvY29kZSBidWZmZXIgaXMga2VwdCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuICovCi1TVEFUSUMgdW5zaWduZWQgY2hhciBfYWR2X2FzYzM4QzE2MDBfYnVmW10gPSB7Ci0gIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4ZjIsICAweDAwLCAgMHgxNiwgIDB4MDAsICAweGZjLCAgMHgwMCwgIDB4MTAsICAweDAwLCAgMHhmMCwgIDB4MTgsICAweGU0LCAgMHgwMSwgIDB4MDAsCi0gIDB4MDQsICAweDFlLCAgMHg0OCwgIDB4ZTQsICAweDAzLCAgMHhmNiwgIDB4ZjcsICAweDEzLCAgMHgyZSwgIDB4MWUsICAweDAyLCAgMHgwMCwgIDB4MDcsICAweDE3LCAgMHhjMCwgIDB4NWYsCi0gIDB4MDAsICAweGZhLCAgMHhmZiwgIDB4ZmYsICAweDA0LCAgMHgwMCwgIDB4MDAsICAweGY2LCAgMHgwOSwgIDB4ZTcsICAweDgyLCAgMHhlNywgIDB4ODUsICAweGYwLCAgMHg4NiwgIDB4ZjAsCi0gIDB4NGUsICAweDEwLCAgMHg5ZSwgIDB4ZTcsICAweGZmLCAgMHgwMCwgIDB4NTUsICAweGYwLCAgMHgwMSwgIDB4ZjYsICAweDAzLCAgMHgwMCwgIDB4OTgsICAweDU3LCAgMHgwMSwgIDB4ZTYsCi0gIDB4MDAsICAweGVhLCAgMHgwMCwgIDB4ZWMsICAweDAxLCAgMHhmYSwgIDB4MTgsICAweGY0LCAgMHgwOCwgIDB4MDAsICAweGYwLCAgMHgxZCwgIDB4MzgsICAweDU0LCAgMHgzMiwgIDB4ZjAsCi0gIDB4MTAsICAweDAwLCAgMHhjMiwgIDB4MGUsICAweDFlLCAgMHhmMCwgIDB4ZDUsICAweGYwLCAgMHhiYywgIDB4MDAsICAweDRiLCAgMHhlNCwgIDB4MDAsICAweGU2LCAgMHhiMSwgIDB4ZjAsCi0gIDB4YjQsICAweDAwLCAgMHgwMiwgIDB4MTMsICAweDNlLCAgMHgxYywgIDB4YzgsICAweDQ3LCAgMHgzZSwgIDB4MDAsICAweGQ4LCAgMHgwMSwgIDB4MDYsICAweDEzLCAgMHgwYywgIDB4MWMsCi0gIDB4NWUsICAweDFlLCAgMHgwMCwgIDB4NTcsICAweGM4LCAgMHg1NywgIDB4MDEsICAweGZjLCAgMHhiYywgIDB4MGUsICAweGEyLCAgMHgxMiwgIDB4YjksICAweDU0LCAgMHgwMCwgIDB4ODAsCi0gIDB4NjIsICAweDBhLCAgMHg1YSwgIDB4MTIsICAweGM4LCAgMHgxNSwgIDB4M2UsICAweDFlLCAgMHgxOCwgIDB4NDAsICAweGJkLCAgMHg1NiwgIDB4MDMsICAweGU2LCAgMHgwMSwgIDB4ZWEsCi0gIDB4NWMsICAweGYwLCAgMHgwZiwgIDB4MDAsICAweDIwLCAgMHgwMCwgIDB4NmMsICAweDAxLCAgMHg2ZSwgIDB4MDEsICAweDA0LCAgMHgxMiwgIDB4MDQsICAweDEzLCAgMHhiYiwgIDB4NTUsCi0gIDB4M2MsICAweDU2LCAgMHgzZSwgIDB4NTcsICAweDAzLCAgMHg1OCwgIDB4NGEsICAweGU0LCAgMHg0MCwgIDB4MDAsICAweGI2LCAgMHgwMCwgIDB4YmIsICAweDAwLCAgMHhjMCwgIDB4MDAsCi0gIDB4MDAsICAweDAxLCAgMHgwMSwgIDB4MDEsICAweDNlLCAgMHgwMSwgIDB4NTgsICAweDBhLCAgMHg0NCwgIDB4MTAsICAweDBhLCAgMHgxMiwgIDB4NGMsICAweDFjLCAgMHg0ZSwgIDB4MWMsCi0gIDB4MDIsICAweDRhLCAgMHgzMCwgIDB4ZTQsICAweDA1LCAgMHhlNiwgIDB4MGMsICAweDAwLCAgMHgzYywgIDB4MDAsICAweDgwLCAgMHgwMCwgIDB4MjQsICAweDAxLCAgMHgzYywgIDB4MDEsCi0gIDB4NjgsICAweDAxLCAgMHg2YSwgIDB4MDEsICAweDcwLCAgMHgwMSwgIDB4NzIsICAweDAxLCAgMHg3NCwgIDB4MDEsICAweDc2LCAgMHgwMSwgIDB4NzgsICAweDAxLCAgMHg3YywgIDB4MDEsCi0gIDB4YzYsICAweDBlLCAgMHgwYywgIDB4MTAsICAweGFjLCAgMHgxMiwgIDB4YWUsICAweDEyLCAgMHgxNiwgIDB4MWEsICAweDMyLCAgMHgxYywgIDB4NmUsICAweDFlLCAgMHgwMiwgIDB4NDgsCi0gIDB4M2EsICAweDU1LCAgMHhjOSwgIDB4NTcsICAweDAyLCAgMHhlZSwgIDB4NWIsICAweGYwLCAgMHgwMywgIDB4ZjcsICAweDA2LCAgMHhmNywgIDB4MDMsICAweGZjLCAgMHgwNiwgIDB4MDAsCi0gIDB4MWUsICAweDAwLCAgMHhiZSwgIDB4MDAsICAweGUxLCAgMHgwMCwgIDB4MGMsICAweDEyLCAgMHgxOCwgIDB4MWEsICAweDcwLCAgMHgxYSwgIDB4MzAsICAweDFjLCAgMHgzOCwgIDB4MWMsCi0gIDB4MTAsICAweDQ0LCAgMHgwMCwgIDB4NGMsICAweGIwLCAgMHg1NywgIDB4NDAsICAweDVjLCAgMHg0ZCwgIDB4ZTQsICAweDA0LCAgMHhlYSwgIDB4NWQsICAweGYwLCAgMHhhNywgIDB4ZjAsCi0gIDB4MDQsICAweGY2LCAgMHgwMiwgIDB4ZmMsICAweDA1LCAgMHgwMCwgIDB4MDksICAweDAwLCAgMHgxOSwgIDB4MDAsICAweDMyLCAgMHgwMCwgIDB4MzMsICAweDAwLCAgMHgzNCwgIDB4MDAsCi0gIDB4MzYsICAweDAwLCAgMHg5OCwgIDB4MDAsICAweDllLCAgMHgwMCwgIDB4Y2MsICAweDAwLCAgMHgyMCwgIDB4MDEsICAweDRlLCAgMHgwMSwgIDB4NzksICAweDAxLCAgMHgzYywgIDB4MDksCi0gIDB4NjgsICAweDBkLCAgMHgwMiwgIDB4MTAsICAweDA0LCAgMHgxMCwgIDB4M2EsICAweDEwLCAgMHgwOCwgIDB4MTIsICAweDBhLCAgMHgxMywgIDB4NDAsICAweDE2LCAgMHg1MCwgIDB4MTYsCi0gIDB4MDAsICAweDE3LCAgMHg0YSwgIDB4MTksICAweDAwLCAgMHg0ZSwgIDB4MDAsICAweDU0LCAgMHgwMSwgIDB4NTgsICAweDAwLCAgMHhkYywgIDB4MDUsICAweGYwLCAgMHgwOSwgIDB4ZjAsCi0gIDB4NTksICAweGYwLCAgMHhiOCwgIDB4ZjAsICAweDQ4LCAgMHhmNCwgIDB4MGUsICAweGY3LCAgMHgwYSwgIDB4MDAsICAweDliLCAgMHgwMCwgIDB4OWMsICAweDAwLCAgMHhhNCwgIDB4MDAsCi0gIDB4YjUsICAweDAwLCAgMHhiYSwgIDB4MDAsICAweGQwLCAgMHgwMCwgIDB4ZTcsICAweDAwLCAgMHhmMCwgIDB4MDMsICAweDY5LCAgMHgwOCwgIDB4ZTksICAweDA5LCAgMHg1YywgIDB4MGMsCi0gIDB4YjYsICAweDEyLCAgMHhiYywgIDB4MTksICAweGQ4LCAgMHgxYiwgIDB4MjAsICAweDFjLCAgMHgzNCwgIDB4MWMsICAweDM2LCAgMHgxYywgIDB4NDIsICAweDFkLCAgMHgwOCwgIDB4NDQsCi0gIDB4MzgsICAweDQ0LCAgMHg5MSwgIDB4NDQsICAweDBhLCAgMHg0NSwgIDB4NDgsICAweDQ2LCAgMHg4OSwgIDB4NDgsICAweDY4LCAgMHg1NCwgIDB4ODMsICAweDU1LCAgMHg4MywgIDB4NTksCi0gIDB4MzEsICAweGU0LCAgMHgwMiwgIDB4ZTYsICAweDA3LCAgMHhmMCwgIDB4MDgsICAweGYwLCAgMHgwYiwgIDB4ZjAsICAweDBjLCAgMHhmMCwgIDB4NGIsICAweGY0LCAgMHgwNCwgIDB4ZjgsCi0gIDB4MDUsICAweGY4LCAgMHgwMiwgIDB4ZmEsICAweDAzLCAgMHhmYSwgIDB4MDQsICAweGZjLCAgMHgwNSwgIDB4ZmMsICAweDA3LCAgMHgwMCwgIDB4YTgsICAweDAwLCAgMHhhYSwgIDB4MDAsCi0gIDB4YjksICAweDAwLCAgMHhlMCwgIDB4MDAsICAweGU1LCAgMHgwMCwgIDB4MjIsICAweDAxLCAgMHgyNiwgIDB4MDEsICAweDYwLCAgMHgwMSwgIDB4N2EsICAweDAxLCAgMHg4MiwgIDB4MDEsCi0gIDB4YzgsICAweDAxLCAgMHhjYSwgIDB4MDEsICAweDg2LCAgMHgwMiwgIDB4NmEsICAweDAzLCAgMHgxOCwgIDB4MDUsICAweGIyLCAgMHgwNywgIDB4NjgsICAweDA4LCAgMHgxMCwgIDB4MGQsCi0gIDB4MDYsICAweDEwLCAgMHgwYSwgIDB4MTAsICAweDBlLCAgMHgxMCwgIDB4MTIsICAweDEwLCAgMHg2MCwgIDB4MTAsICAweGVkLCAgMHgxMCwgIDB4ZjMsICAweDEwLCAgMHgwNiwgIDB4MTIsCi0gIDB4MTAsICAweDEyLCAgMHgxZSwgIDB4MTIsICAweDBjLCAgMHgxMywgIDB4MGUsICAweDEzLCAgMHgxMCwgIDB4MTMsICAweGZlLCAgMHg5YywgIDB4ZjAsICAweDM1LCAgMHgwNSwgIDB4ZmUsCi0gIDB4ZWMsICAweDBlLCAgMHhmZiwgIDB4MTAsICAweDAwLCAgMHgwMCwgIDB4ZTksICAweGZlLCAgMHgzNCwgIDB4MWYsICAweDAwLCAgMHhlOCwgIDB4ZmUsICAweDg4LCAgMHgwMSwgIDB4ZmYsCi0gIDB4MDMsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDkzLCAgMHgxNSwgIDB4ZmUsICAweDBmLCAgMHgwNSwgIDB4ZmYsICAweDM4LCAgMHgwMCwgIDB4MDAsICAweGZlLCAgMHg1NywgIDB4MjQsCi0gIDB4MDAsICAweGZlLCAgMHg0YywgIDB4MDAsICAweDY1LCAgMHhmZiwgIDB4MDQsICAweDAwLCAgMHgwMCwgIDB4MWEsICAweGZmLCAgMHgwOSwgIDB4MDAsICAweDAwLCAgMHhmZiwgIDB4MDgsCi0gIDB4MDEsICAweDAxLCAgMHhmZiwgIDB4MDgsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweDI3LCAgMHgwMCwgIDB4MDAsICAweGZmLCAgMHgxMCwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4MTMsCi0gIDB4MDAsICAweDAwLCAgMHhmZSwgIDB4NzgsICAweDU2LCAgMHhmZSwgIDB4MzQsICAweDEyLCAgMHhmZiwgIDB4MjEsICAweDAwLCAgMHgwMCwgIDB4ZmUsICAweDA0LCAgMHhmNywgIDB4ZTgsCi0gIDB4MzcsICAweDdkLCAgMHgwZCwgIDB4MDEsICAweGZlLCAgMHg0YSwgIDB4MTEsICAweGZlLCAgMHgwNCwgIDB4ZjcsICAweGU4LCAgMHg3ZCwgIDB4MGQsICAweDUxLCAgMHgzNywgIDB4ZmUsCi0gIDB4M2QsICAweGYwLCAgMHhmZSwgIDB4MGMsICAweDAyLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhiYywgIDB4ZmUsICAweDkxLCAgMHhmMCwgIDB4ZmUsICAweGY4LCAgMHgwMSwgIDB4ZmUsCi0gIDB4OTAsICAweGYwLCAgMHhmZSwgIDB4ZjgsICAweDAxLCAgMHhmZSwgIDB4OGYsICAweGYwLCAgMHhiYywgIDB4MDMsICAweDY3LCAgMHg0ZCwgIDB4MDUsICAweGZlLCAgMHgwOCwgIDB4MGYsCi0gIDB4MDEsICAweGZlLCAgMHg3OCwgIDB4MGYsICAweGZlLCAgMHhkZCwgIDB4MTIsICAweDA1LCAgMHhmZSwgIDB4MGUsICAweDAzLCAgMHhmZSwgIDB4MjgsICAweDFjLCAgMHgwMywgIDB4ZmUsCi0gIDB4YTYsICAweDAwLCAgMHhmZSwgIDB4ZDEsICAweDEyLCAgMHgzZSwgIDB4MjIsICAweGZlLCAgMHhhNiwgIDB4MDAsICAweGFjLCAgMHhmZSwgIDB4NDgsICAweGYwLCAgMHhmZSwgIDB4OTAsCi0gIDB4MDIsICAweGZlLCAgMHg0OSwgIDB4ZjAsICAweGZlLCAgMHhhYSwgIDB4MDIsICAweGZlLCAgMHg0YSwgIDB4ZjAsICAweGZlLCAgMHhjOCwgIDB4MDIsICAweGZlLCAgMHg0NiwgIDB4ZjAsCi0gIDB4ZmUsICAweDVhLCAgMHgwMiwgIDB4ZmUsICAweDQ3LCAgMHhmMCwgIDB4ZmUsICAweDYwLCAgMHgwMiwgIDB4ZmUsICAweDQzLCAgMHhmMCwgIDB4ZmUsICAweDRlLCAgMHgwMiwgIDB4ZmUsCi0gIDB4NDQsICAweGYwLCAgMHhmZSwgIDB4NTIsICAweDAyLCAgMHhmZSwgIDB4NDUsICAweGYwLCAgMHhmZSwgIDB4NTYsICAweDAyLCAgMHgxYywgIDB4MGQsICAweGEyLCAgMHgxYywgIDB4MDcsCi0gIDB4MjIsICAweGI3LCAgMHgwNSwgIDB4MzUsICAweGZlLCAgMHgwMCwgIDB4MWMsICAweGZlLCAgMHhmMSwgIDB4MTAsICAweGZlLCAgMHgwMiwgIDB4MWMsICAweGY1LCAgMHhmZSwgIDB4MWUsCi0gIDB4MWMsICAweGZlLCAgMHhlOSwgIDB4MTAsICAweDAxLCAgMHg1ZiwgIDB4ZmUsICAweGU3LCAgMHgxMCwgIDB4ZmUsICAweDA2LCAgMHhmYywgIDB4ZGUsICAweDBhLCAgMHg4MSwgIDB4MDEsCi0gIDB4YTMsICAweDA1LCAgMHgzNSwgIDB4MWYsICAweDk1LCAgMHg0NywgIDB4YjgsICAweDAxLCAgMHhmZSwgIDB4ZTQsICAweDExLCAgMHgwYSwgIDB4ODEsICAweDAxLCAgMHg1YywgIDB4ZmUsCi0gIDB4YmQsICAweDEwLCAgMHgwYSwgIDB4ODEsICAweDAxLCAgMHg1YywgIDB4ZmUsICAweGFkLCAgMHgxMCwgIDB4ZmUsICAweDE2LCAgMHgxYywgIDB4ZmUsICAweDU4LCAgMHgxYywgIDB4MWMsCi0gIDB4MDcsICAweDIyLCAgMHhiNywgIDB4MzcsICAweDJhLCAgMHgzNSwgIDB4ZmUsICAweDNkLCAgMHhmMCwgIDB4ZmUsICAweDBjLCAgMHgwMiwgIDB4MmIsICAweGZlLCAgMHg5ZSwgIDB4MDIsCi0gIDB4ZmUsICAweDVhLCAgMHgxYywgIDB4ZmUsICAweDEyLCAgMHgxYywgIDB4ZmUsICAweDE0LCAgMHgxYywgIDB4MWYsICAweGZlLCAgMHgzMCwgIDB4MDAsICAweDQ3LCAgMHhiOCwgIDB4MDEsCi0gIDB4ZmUsICAweGQ0LCAgMHgxMSwgIDB4MWMsICAweDA3LCAgMHgyMiwgIDB4YjcsICAweDA1LCAgMHhlOSwgIDB4MjEsICAweDJjLCAgMHgwOSwgIDB4MWEsICAweDMxLCAgMHhmZSwgIDB4NjksCi0gIDB4MTAsICAweDFjLCAgMHgwNywgIDB4MjIsICAweGI3LCAgMHhmZSwgIDB4MDQsICAweGVjLCAgMHgyYywgIDB4NjAsICAweDAxLCAgMHhmZSwgIDB4MWUsICAweDFlLCAgMHgyMCwgIDB4MmMsCi0gIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZGUsICAweDAxLCAgMHhmZSwgIDB4NjIsICAweDFiLCAgMHgwMSwgIDB4MGMsICAweDYxLCAgMHg0YSwgIDB4NDQsICAweDE1LCAgMHg1NiwgIDB4NTEsCi0gIDB4MDEsICAweGZlLCAgMHg5ZSwgIDB4MWUsICAweDAxLCAgMHhmZSwgIDB4OTYsICAweDFhLCAgMHgwNSwgIDB4MzUsICAweDBhLCAgMHg1NywgIDB4MDEsICAweDE4LCAgMHgwOSwgIDB4MDAsCi0gIDB4MzYsICAweDAxLCAgMHg4NSwgIDB4ZmUsICAweDE4LCAgMHgxMCwgIDB4ZmUsICAweDQxLCAgMHg1OCwgIDB4MGEsICAweGJhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHhjOCwgIDB4NTQsCi0gIDB4N2IsICAweGZlLCAgMHgxYywgIDB4MDMsICAweDAxLCAgMHhmZSwgIDB4OTYsICAweDFhLCAgMHgwNSwgIDB4MzUsICAweDM3LCAgMHg2MCwgIDB4ZmUsICAweDAyLCAgMHhlOCwgIDB4MzAsCi0gIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDllLCAgMHg0MywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDI3LCAgMHhmMCwgIDB4ZmUsICAweGU0LCAgMHgwMSwgIDB4ZmUsCi0gIDB4MDcsICAweDRiLCAgMHhmZSwgIDB4MjAsICAweGYwLCAgMHhiYywgIDB4ZmUsICAweDQwLCAgMHgxYywgIDB4MmEsICAweGViLCAgMHhmZSwgIDB4MjYsICAweGYwLCAgMHhmZSwgIDB4NjYsCi0gIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4ZjAsICAweGZlLCAgMHg1NCwgIDB4MDMsICAweGZlLCAgMHgxMSwgIDB4ZjAsICAweGJjLCAgMHhmZSwgIDB4ZWYsICAweDEwLCAgMHhmZSwgIDB4OWYsCi0gIDB4ZjAsICAweGZlLCAgMHg3NCwgIDB4MDMsICAweGZlLCAgMHg0NiwgIDB4MWMsICAweDE5LCAgMHhmZSwgIDB4MTEsICAweDAwLCAgMHgwNSwgIDB4NzAsICAweDM3LCAgMHhmZSwgIDB4NDgsCi0gIDB4MWMsICAweGZlLCAgMHg0NiwgIDB4MWMsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDI4LCAgMHhmZSwgIDB4MTgsICAweDEzLCAgMHgyNiwgIDB4MjEsICAweGI5LCAgMHhjNywgIDB4MjAsCi0gIDB4YjksICAweDBhLCAgMHg1NywgIDB4MDEsICAweDE4LCAgMHhjNywgIDB4ODksICAweDAxLCAgMHhmZSwgIDB4YzgsICAweDFhLCAgMHgxNSwgIDB4ZTEsICAweDJhLCAgMHhlYiwgIDB4ZmUsCi0gIDB4MDEsICAweGYwLCAgMHhlYiwgIDB4ZmUsICAweDgyLCAgMHhmMCwgIDB4ZmUsICAweGE0LCAgMHgwMywgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4MTUsICAweGZlLCAgMHhlNCwgIDB4MDAsCi0gIDB4MmYsICAweGZlLCAgMHhiNiwgIDB4MDMsICAweDJhLCAgMHgzYywgIDB4MTYsICAweGZlLCAgMHhjNiwgIDB4MDMsICAweDAxLCAgMHg0MSwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsCi0gIDB4ZDYsICAweDAzLCAgMHhhZiwgIDB4YTAsICAweGZlLCAgMHgwYSwgIDB4ZjAsICAweGZlLCAgMHhhMiwgIDB4MDcsICAweDA1LCAgMHgyOSwgIDB4MDMsICAweDgxLCAgMHgxZSwgIDB4MWIsCi0gIDB4ZmUsICAweDI0LCAgMHgwNSwgIDB4MWYsICAweDYzLCAgMHgwMSwgIDB4NDIsICAweDhmLCAgMHhmZSwgIDB4NzAsICAweDAyLCAgMHgwNSwgIDB4ZWEsICAweGZlLCAgMHg0NiwgIDB4MWMsCi0gIDB4MzcsICAweDdkLCAgMHgxZCwgIDB4ZmUsICAweDY3LCAgMHgxYiwgIDB4ZmUsICAweGJmLCAgMHg1NywgIDB4ZmUsICAweDc3LCAgMHg1NywgIDB4ZmUsICAweDQ4LCAgMHgxYywgIDB4NzUsCi0gIDB4MDEsICAweGE2LCAgMHg4NiwgIDB4MGEsICAweDU3LCAgMHgwMSwgIDB4MTgsICAweDA5LCAgMHgwMCwgIDB4MWIsICAweGVjLCAgMHgwYSwgIDB4ZTEsICAweDAxLCAgMHgxOCwgIDB4NzcsCi0gIDB4NTAsICAweDQwLCAgMHg4ZCwgIDB4MzAsICAweDAzLCAgMHg4MSwgIDB4MWUsICAweGY4LCAgMHgxZiwgIDB4NjMsICAweDAxLCAgMHg0MiwgIDB4OGYsICAweGZlLCAgMHg3MCwgIDB4MDIsCi0gIDB4MDUsICAweGVhLCAgMHhkNywgIDB4OTksICAweGQ4LCAgMHg5YywgIDB4MmEsICAweDI5LCAgMHgyZiwgIDB4ZmUsICAweDRlLCAgMHgwNCwgIDB4MTYsICAweGZlLCAgMHg0YSwgIDB4MDQsCi0gIDB4N2UsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweGZlLCAgMHg5YiwgIDB4NTcsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDMyLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MDEsCi0gIDB4MDgsICAweDE2LCAgMHhmZSwgIDB4MDIsICAweDA1LCAgMHgzMiwgIDB4MDEsICAweDA4LCAgMHgxNiwgIDB4MjksICAweDI3LCAgMHgyNSwgIDB4ZWUsICAweGZlLCAgMHg0YywgIDB4NDQsCi0gIDB4ZmUsICAweDU4LCAgMHgxMiwgIDB4NTAsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDEzLCAgMHgzNCwgIDB4ZmUsICAweDRjLCAgMHg1NCwgIDB4N2IsICAweGVjLCAgMHg2MCwgIDB4OGQsCi0gIDB4MzAsICAweDAxLCAgMHhmZSwgIDB4NGUsICAweDFlLCAgMHhmZSwgIDB4NDgsICAweDQ3LCAgMHhmZSwgIDB4N2MsICAweDEzLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4ZmUsCi0gIDB4MzIsICAweDEzLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHg5YiwgIDB4ZmUsICAweDY4LCAgMHgxMywgIDB4ZmUsICAweDI2LCAgMHgxMCwgIDB4MTMsICAweDM0LCAgMHhmZSwgIDB4NGMsCi0gIDB4NTQsICAweDdiLCAgMHhlYywgIDB4MDEsICAweGZlLCAgMHg0ZSwgIDB4MWUsICAweGZlLCAgMHg0OCwgIDB4NDcsICAweGZlLCAgMHg1NCwgIDB4MTMsICAweDAxLCAgMHgwYywgIDB4MDYsCi0gIDB4MjgsICAweGE1LCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHg5YiwgIDB4ZmUsICAweDQwLCAgMHgxMywgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MjgsICAweGY5LCAgMHgxZiwgIDB4N2YsCi0gIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MDcsICAweDRkLCAgMHgxZiwgIDB4ZmUsICAweDBkLCAgMHgwMCwgIDB4MDEsICAweDQyLCAgMHg4ZiwgIDB4ZmUsICAweGE0LCAgMHgwZSwgIDB4MDUsCi0gIDB4MjksICAweDMyLCAgMHgxNSwgIDB4ZmUsICAweGU2LCAgMHgwMCwgIDB4MGYsICAweGZlLCAgMHgxYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4OWMsICAweDkzLCAgMHgzYSwgIDB4MGIsCi0gIDB4MGUsICAweDhiLCAgMHgwMiwgIDB4MWYsICAweDdmLCAgMHgwMSwgIDB4NDIsICAweDA1LCAgMHgzNSwgIDB4ZmUsICAweDQyLCAgMHg1YiwgIDB4N2QsICAweDFkLCAgMHhmZSwgIDB4NDYsCi0gIDB4NTksICAweGZlLCAgMHhiZiwgIDB4NTcsICAweGZlLCAgMHg3NywgIDB4NTcsICAweDBmLCAgMHhmZSwgIDB4ODcsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDg3LCAgMHg4MywgIDB4ZmUsCi0gIDB4YzksICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweGQwLCAgMHg2NSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHg5OCwgIDB4MTMsICAweDBmLCAgMHhmZSwgIDB4MjAsCi0gIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4YTAsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwOSwgIDB4MWQsICAweGZlLCAgMHg4NCwgIDB4MTIsICAweDAxLCAgMHgzOCwgIDB4MDYsCi0gIDB4MDcsICAweGZlLCAgMHg3MCwgIDB4MTMsICAweDAzLCAgMHhmZSwgIDB4YTIsICAweDAwLCAgMHgxZSwgIDB4MWIsICAweGZlLCAgMHhkYSwgIDB4MDUsICAweGQwLCAgMHg1NCwgIDB4MDEsCi0gIDB4MzgsICAweDA2LCAgMHgwZCwgIDB4ZmUsICAweDU4LCAgMHgxMywgIDB4MDMsICAweGZlLCAgMHhhMCwgIDB4MDAsICAweDFlLCAgMHhmZSwgIDB4NTAsICAweDEyLCAgMHg1ZSwgIDB4ZmYsCi0gIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MmYsICAweGZlLCAgMHg5MCwgIDB4MDUsICAweDJhLCAgMHgzYywgIDB4Y2MsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDEwLCAgMHgyZiwgIDB4ZmUsCi0gIDB4OWUsICAweDA1LCAgMHgxNywgIDB4ZmUsICAweGY0LCAgMHgwNSwgIDB4MTUsICAweGZlLCAgMHhlMywgIDB4MDAsICAweDI2LCAgMHgwMSwgIDB4MzgsICAweGZlLCAgMHg0YSwgIDB4ZjAsCi0gIDB4ZmUsICAweGMwLCAgMHgwNSwgIDB4ZmUsICAweDQ5LCAgMHhmMCwgIDB4ZmUsICAweGJhLCAgMHgwNSwgIDB4NzEsICAweDJlLCAgMHhmZSwgIDB4MjEsICAweDAwLCAgMHhmMSwgIDB4MmUsCi0gIDB4ZmUsICAweDIyLCAgMHgwMCwgIDB4YTIsICAweDJlLCAgMHg0YSwgIDB4ZmUsICAweDA5LCAgMHg0OCwgIDB4ZmYsICAweDAyLCAgMHgwMCwgIDB4MTAsICAweDJmLCAgMHhmZSwgIDB4ZDAsCi0gIDB4MDUsICAweDE3LCAgMHhmZSwgIDB4ZjQsICAweDA1LCAgMHhmZSwgIDB4ZTIsICAweDA4LCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHhmZSwgIDB4MWMsICAweDAwLCAgMHg0ZCwgIDB4MDEsCi0gIDB4YTcsICAweDJlLCAgMHgwNywgIDB4MjAsICAweGU0LCAgMHg0NywgIDB4ZmUsICAweDI3LCAgMHgwMSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MjgsICAweGZlLCAgMHgyNCwgIDB4MTIsCi0gIDB4M2UsICAweDAxLCAgMHg4NCwgIDB4MWYsICAweDdmLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgwNywgIDB4NGQsICAweDFmLCAgMHhmZSwgIDB4MGQsICAweDAwLCAgMHgwMSwgIDB4NDIsCi0gIDB4OGYsICAweGZlLCAgMHhhNCwgIDB4MGUsICAweDA1LCAgMHgyOSwgIDB4MDMsICAweGU2LCAgMHgxZSwgIDB4ZmUsICAweGNhLCAgMHgxMywgIDB4MDMsICAweGI2LCAgMHgxZSwgIDB4ZmUsCi0gIDB4NDAsICAweDEyLCAgMHgwMywgIDB4NjYsICAweDFlLCAgMHhmZSwgIDB4MzgsICAweDEzLCAgMHgzZSwgIDB4MDEsICAweDg0LCAgMHgxNywgIDB4ZmUsICAweDcyLCAgMHgwNiwgIDB4MGEsCi0gIDB4MDcsICAweDAxLCAgMHgzOCwgIDB4MDYsICAweDI0LCAgMHhmZSwgIDB4MDIsICAweDEyLCAgMHg0ZiwgIDB4MDEsICAweGZlLCAgMHg1NiwgIDB4MTksICAweDE2LCAgMHhmZSwgIDB4NjgsCi0gIDB4MDYsICAweDE1LCAgMHg4MiwgIDB4MDEsICAweDQxLCAgMHgxNSwgIDB4ZTIsICAweDAzLCAgMHg2NiwgIDB4OGEsICAweDEwLCAgMHg2NiwgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4ZmUsCi0gIDB4NzAsICAweDEyLCAgMHgwMywgIDB4NTUsICAweDFlLCAgMHhmZSwgIDB4NjgsICAweDEzLCAgMHgwMSwgIDB4YzYsICAweDA5LCAgMHgxMiwgIDB4NDgsICAweGZlLCAgMHg5MiwgIDB4MDYsCi0gIDB4MmUsICAweDEyLCAgMHgwMSwgIDB4ZmUsICAweGFjLCAgMHgxZCwgIDB4ZmUsICAweDQzLCAgMHg0OCwgIDB4NjIsICAweDgwLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsCi0gIDB4NTcsICAweDUyLCAgMHhhZCwgIDB4MjMsICAweDNmLCAgMHg0ZSwgIDB4NjIsICAweDQ5LCAgMHgzZSwgIDB4MDEsICAweDg0LCAgMHgxNywgIDB4ZmUsICAweGVhLCAgMHgwNiwgIDB4MDEsCi0gIDB4MzgsICAweDA2LCAgMHgxMiwgIDB4ZjcsICAweDQ1LCAgMHgwYSwgIDB4OTUsICAweDAxLCAgMHhmZSwgIDB4ODQsICAweDE5LCAgMHgxNiwgIDB4ZmUsICAweGUwLCAgMHgwNiwgIDB4MTUsCi0gIDB4ODIsICAweDAxLCAgMHg0MSwgIDB4MTUsICAweGUyLCAgMHgwMywgIDB4NTUsICAweDhhLCAgMHgxMCwgIDB4NTUsICAweDFjLCAgMHgwNywgIDB4MDEsICAweDg0LCAgMHhmZSwgIDB4YWUsCi0gIDB4MTAsICAweDAzLCAgMHg2ZiwgIDB4MWUsICAweGZlLCAgMHg5ZSwgIDB4MTMsICAweDNlLCAgMHgwMSwgIDB4ODQsICAweDAzLCAgMHg5YSwgIDB4MWUsICAweGZlLCAgMHgxYSwgIDB4MTIsCi0gIDB4MDEsICAweDM4LCAgMHgwNiwgIDB4MTIsICAweGZjLCAgMHgwMSwgIDB4YzYsICAweDAxLCAgMHhmZSwgIDB4YWMsICAweDFkLCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHg2MiwgIDB4ODAsCi0gIDB4ZjAsICAweDQ1LCAgMHgwYSwgIDB4OTUsICAweDAzLCAgMHhiNiwgIDB4MWUsICAweGY4LCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHgyNCwgIDB4MzYsICAweGZlLCAgMHgwMiwgIDB4ZjYsCi0gIDB4MDcsICAweDcxLCAgMHg3OCwgIDB4OGMsICAweDAwLCAgMHg0ZCwgIDB4NjIsICAweDQ5LCAgMHgzZSwgIDB4MmQsICAweDkzLCAgMHg0ZSwgIDB4ZDAsICAweDBkLCAgMHgxNywgIDB4ZmUsCi0gIDB4OWEsICAweDA3LCAgMHgwMSwgIDB4ZmUsICAweGMwLCAgMHgxOSwgIDB4MTYsICAweGZlLCAgMHg5MCwgIDB4MDcsICAweDI2LCAgMHgyMCwgIDB4OWUsICAweDE1LCAgMHg4MiwgIDB4MDEsCi0gIDB4NDEsICAweDE1LCAgMHhlMiwgIDB4MjEsICAweDllLCAgMHgwOSwgIDB4MDcsICAweGZiLCAgMHgwMywgIDB4ZTYsICAweGZlLCAgMHg1OCwgIDB4NTcsICAweDEwLCAgMHhlNiwgIDB4MDUsCi0gIDB4ZmUsICAweDJhLCAgMHgwNiwgIDB4MDMsICAweDZmLCAgMHg4YSwgIDB4MTAsICAweDZmLCAgMHgxYywgIDB4MDcsICAweDAxLCAgMHg4NCwgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4NWYsCi0gIDB4NzUsICAweDAxLCAgMHhhNiwgIDB4ODYsICAweDE1LCAgMHhmZSwgIDB4ZTIsICAweDAwLCAgMHgyZiwgIDB4ZWQsICAweDJhLCAgMHgzYywgIDB4ZmUsICAweDBhLCAgMHhmMCwgIDB4ZmUsCi0gIDB4Y2UsICAweDA3LCAgMHhhZSwgIDB4ZmUsICAweDk2LCAgMHgwOCwgIDB4ZmUsICAweDA2LCAgMHhmMCwgIDB4ZmUsICAweDllLCAgMHgwOCwgIDB4YWYsICAweGEwLCAgMHgwNSwgIDB4MjksCi0gIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHgyZSwgIDB4MTIsICAweDE0LCAgMHgxZCwgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsCi0gIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweGZlLCAgMHg5OSwgIDB4YTQsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwNSwgIDB4ZmUsCi0gIDB4YzYsICAweDA5LCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweDNhLCAgMHgxMiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MTIsICAweGZlLCAgMHgzMCwgIDB4MTMsCi0gIDB4MTQsICAweGZlLCAgMHgxYiwgIDB4MDAsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE0LCAgMHgwMCwgIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDAsCi0gIDB4MDEsICAweDA4LCAgMHgxNCwgIDB4MDcsICAweDAxLCAgMHgwOCwgIDB4MTQsICAweDAwLCAgMHgwNSwgIDB4ZWYsICAweDdjLCAgMHg0YSwgIDB4NzgsICAweDRmLCAgMHgwZiwgIDB4ZmUsCi0gIDB4OWEsICAweDgxLCAgMHgwNCwgIDB4ZmUsICAweDlhLCAgMHg4MywgIDB4ZmUsICAweGNiLCAgMHg0NywgIDB4MGIsICAweDBlLCAgMHgyZCwgIDB4MjgsICAweDQ4LCAgMHhmZSwgIDB4NmMsCi0gIDB4MDgsICAweDBhLCAgMHgyOCwgIDB4ZmUsICAweDA5LCAgMHg2ZiwgIDB4Y2EsICAweGZlLCAgMHhjYSwgIDB4NDUsICAweGZlLCAgMHgzMiwgIDB4MTIsICAweDUzLCAgMHg2MywgIDB4NGUsCi0gIDB4N2MsICAweDk3LCAgMHgyZiwgIDB4ZmUsICAweDdlLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHhmZSwgIDB4MGEsICAweGYwLCAgMHhmZSwgIDB4NmMsICAweDA4LCAgMHhhZiwgIDB4YTAsCi0gIDB4YWUsICAweGZlLCAgMHg5NiwgIDB4MDgsICAweDA1LCAgMHgyOSwgIDB4MDEsICAweDQxLCAgMHgwNSwgIDB4ZWQsICAweDE0LCAgMHgyNCwgIDB4MDUsICAweGVkLCAgMHhmZSwgIDB4OWMsCi0gIDB4ZjcsICAweDlmLCAgMHgwMSwgIDB4ZmUsICAweGFlLCAgMHgxZSwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDEsICAweGZlLCAgMHhiZSwgIDB4MWUsICAweGZlLCAgMHg5OSwgIDB4NTgsCi0gIDB4ZmUsICAweDc4LCAgMHgxOCwgIDB4ZmUsICAweGY5LCAgMHgxOCwgIDB4OGUsICAweGZlLCAgMHgxNiwgIDB4MDksICAweDEwLCAgMHg2YSwgIDB4MjIsICAweDZiLCAgMHgwMSwgIDB4MGMsCi0gIDB4NjEsICAweDU0LCAgMHg0NCwgIDB4MjEsICAweDJjLCAgMHgwOSwgIDB4MWEsICAweGY4LCAgMHg3NywgIDB4MDEsICAweGZlLCAgMHg3ZSwgIDB4MWUsICAweDQ3LCAgMHgyYywgIDB4N2EsCi0gIDB4MzAsICAweGYwLCAgMHhmZSwgIDB4ODMsICAweGU3LCAgMHhmZSwgIDB4M2YsICAweDAwLCAgMHg3MSwgIDB4ZmUsICAweDAzLCAgMHg0MCwgIDB4MDEsICAweDBjLCAgMHg2MSwgIDB4NjUsCi0gIDB4NDQsICAweDAxLCAgMHhjMiwgIDB4YzgsICAweGZlLCAgMHgxZiwgIDB4NDAsICAweDIwLCAgMHg2ZSwgIDB4MDEsICAweGZlLCAgMHg2YSwgIDB4MTYsICAweGZlLCAgMHgwOCwgIDB4NTAsCi0gIDB4ZmUsICAweDhhLCAgMHg1MCwgIDB4ZmUsICAweDQ0LCAgMHg1MSwgIDB4ZmUsICAweGM2LCAgMHg1MSwgIDB4ZmUsICAweDEwLCAgMHgxMCwgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsCi0gIDB4MDEsICAweGZlLCAgMHhkZSwgIDB4MWUsICAweDEwLCAgMHg2OCwgIDB4MjIsICAweDY5LCAgMHgwMSwgIDB4ZmUsICAweGVlLCAgMHgxZSwgIDB4MDEsICAweGZlLCAgMHhmZSwgIDB4MWUsCi0gIDB4ZmUsICAweDQwLCAgMHg1MCwgIDB4ZmUsICAweGMyLCAgMHg1MCwgIDB4MTAsICAweDRiLCAgMHgyMiwgIDB4NGMsICAweGZlLCAgMHg4YSwgIDB4MTAsICAweDAxLCAgMHgwYywgIDB4MDYsCi0gIDB4NTQsICAweGZlLCAgMHg1MCwgIDB4MTIsICAweDAxLCAgMHhmZSwgIDB4YWUsICAweDFlLCAgMHgwMSwgIDB4ZmUsICAweGJlLCAgMHgxZSwgIDB4MTAsICAweDZhLCAgMHgyMiwgIDB4NmIsCi0gIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4NjUsICAweDRlLCAgMHgwMSwgIDB4YzIsICAweDBmLCAgMHhmZSwgIDB4MWYsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDlmLCAgMHg4MywgIDB4MzMsCi0gIDB4MGIsICAweDBlLCAgMHgyMCwgIDB4NmUsICAweDBmLCAgMHhmZSwgIDB4NDQsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweGM0LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4YzYsCi0gIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4YzYsICAweDkzLCAgMHg3OSwgIDB4MGIsICAweDBlLCAgMHgxMCwgIDB4NmMsICAweDIyLCAgMHg2ZCwgIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsCi0gIDB4MDEsICAweGZlLCAgMHhkZSwgIDB4MWUsICAweDEwLCAgMHg2OCwgIDB4MjIsICAweDY5LCAgMHgwZiwgIDB4ZmUsICAweDQwLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhjMCwgIDB4OTMsCi0gIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4YzIsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweGMyLCAgMHg5MywgIDB4NzksICAweDBiLCAgMHgwZSwgIDB4MTAsICAweDRiLCAgMHgyMiwgIDB4NGMsCi0gIDB4MTAsICAweDY0LCAgMHgyMiwgIDB4MzQsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDI0LCAgMHg0NCwgIDB4MzcsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHgyZiwgIDB4ZmUsCi0gIDB4ZGUsICAweDA5LCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4ZjIsICAweDA5LCAgMHhmZSwgIDB4MDEsICAweDQ4LCAgMHgxYiwgIDB4M2MsICAweDM3LCAgMHg4OCwgIDB4ZjUsCi0gIDB4ZDQsICAweGZlLCAgMHgxZSwgIDB4MGEsICAweGQ1LCAgMHhmZSwgIDB4NDIsICAweDBhLCAgMHhkMiwgIDB4ZmUsICAweDFlLCAgMHgwYSwgIDB4ZDMsICAweGZlLCAgMHg0MiwgIDB4MGEsCi0gIDB4YWUsICAweGZlLCAgMHgxMiwgIDB4MGEsICAweGZlLCAgMHgwNiwgIDB4ZjAsICAweGZlLCAgMHgxOCwgIDB4MGEsICAweGFmLCAgMHhhMCwgIDB4MDUsICAweDI5LCAgMHgwMSwgIDB4NDEsCi0gIDB4ZmUsICAweGMxLCAgMHgxMCwgIDB4MTQsICAweDI0LCAgMHhmZSwgIDB4YzEsICAweDEwLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgwNywgIDB4ZmUsICAweDE0LCAgMHgxMiwgIDB4MDEsCi0gIDB4NzYsICAweDA2LCAgMHgwZCwgIDB4NWQsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDBkLCAgMHhmZSwgIDB4NzQsICAweDEyLCAgMHhmZSwgIDB4MmUsICAweDFjLCAgMHgwNSwgIDB4ZmUsCi0gIDB4MWEsICAweDBjLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgwNywgIDB4NWQsICAweDAxLCAgMHg3NiwgIDB4MDYsICAweDBkLCAgMHg0MSwgIDB4ZmUsICAweDJjLCAgMHgxYywgIDB4ZmUsCi0gIDB4YWEsICAweGYwLCAgMHhmZSwgIDB4Y2UsICAweDBhLCAgMHhmZSwgIDB4YWMsICAweGYwLCAgMHhmZSwgIDB4NjYsICAweDBhLCAgMHhmZSwgIDB4OTIsICAweDEwLCAgMHhjNCwgIDB4ZjYsCi0gIDB4ZmUsICAweGFkLCAgMHhmMCwgIDB4ZmUsICAweDcyLCAgMHgwYSwgIDB4MDUsICAweGZlLCAgMHgxYSwgIDB4MGMsICAweGM1LCAgMHhmZSwgIDB4ZTcsICAweDEwLCAgMHhmZSwgIDB4MmIsCi0gIDB4ZjAsICAweGJmLCAgMHhmZSwgIDB4NmIsICAweDE4LCAgMHgyMywgIDB4ZmUsICAweDAwLCAgMHhmZSwgIDB4ZmUsICAweDFjLCAgMHgxMiwgIDB4YWMsICAweGZlLCAgMHhkMiwgIDB4ZjAsCi0gIDB4YmYsICAweGZlLCAgMHg3NiwgIDB4MTgsICAweDIzLCAgMHgxZCwgIDB4MWIsICAweGJmLCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4MWIsICAweGJmLCAgMHhkNCwgIDB4NWIsCi0gIDB4ZDUsICAweDViLCAgMHhkMiwgIDB4NWIsICAweGQzLCAgMHg1YiwgIDB4YzQsICAweGM1LCAgMHhmZSwgIDB4YTksICAweDEwLCAgMHg3NSwgIDB4NWUsICAweDMyLCAgMHgxZiwgIDB4N2YsCi0gIDB4MDEsICAweDQyLCAgMHgxOSwgIDB4ZmUsICAweDM1LCAgMHgwMCwgIDB4ZmUsICAweDAxLCAgMHhmMCwgIDB4NzAsICAweDE5LCAgMHg5OCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4NzQsCi0gIDB4MTgsICAweDIzLCAgMHhmZSwgIDB4MDAsICAweGY4LCAgMHgxYiwgIDB4NWIsICAweDdkLCAgMHgxMiwgIDB4MDEsICAweGZlLCAgMHg3OCwgIDB4MGYsICAweDRkLCAgMHgwMSwgIDB4ZmUsCi0gIDB4OTYsICAweDFhLCAgMHgyMSwgIDB4MzAsICAweDc3LCAgMHg3ZCwgIDB4MWQsICAweDA1LCAgMHg1YiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweDJiLCAgMHhmZSwgIDB4ZTIsCi0gIDB4MGIsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDU0LCAgMHhmZSwgIDB4YTYsICAweDEyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4ZmUsICAweDg4LCAgMHgxMywgIDB4MjEsCi0gIDB4NmUsICAweGM3LCAgMHgwMSwgIDB4ZmUsICAweDFlLCAgMHgxZiwgIDB4MGYsICAweGZlLCAgMHg4MywgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODMsICAweDgzLCAgMHhmZSwgIDB4YzksCi0gIDB4NDcsICAweDBiLCAgMHgwZSwgIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgwNCwgIDB4OTEsICAweDA0LCAgMHhmZSwgIDB4ODQsCi0gIDB4OTMsICAweGZlLCAgMHhjYSwgIDB4NTcsICAweDBiLCAgMHhmZSwgIDB4ODYsICAweDkxLCAgMHgwNCwgIDB4ZmUsICAweDg2LCAgMHg5MywgIDB4ZmUsICAweGNiLCAgMHg1NywgIDB4MGIsCi0gIDB4MGUsICAweDdhLCAgMHgzMCwgIDB4ZmUsICAweDQwLCAgMHg1OSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4OGUsICAweDQwLCAgMHgwMywgIDB4NmEsICAweDNiLCAgMHg2YiwgIDB4MTAsCi0gIDB4OTcsICAweDIyLCAgMHg5OCwgIDB4ZDksICAweDZhLCAgMHhkYSwgIDB4NmIsICAweDAxLCAgMHhjMiwgIDB4YzgsICAweDdhLCAgMHgzMCwgIDB4MjAsICAweDZlLCAgMHhkYiwgIDB4NjQsCi0gIDB4ZGMsICAweDM0LCAgMHg5MSwgIDB4NmMsICAweDdlLCAgMHg2ZCwgIDB4ZmUsICAweDQ0LCAgMHg1NSwgIDB4ZmUsICAweGU1LCAgMHg1NSwgIDB4ZmUsICAweDA0LCAgMHhmYSwgIDB4NjQsCi0gIDB4ZmUsICAweDA1LCAgMHhmYSwgIDB4MzQsICAweDAxLCAgMHhmZSwgIDB4NmEsICAweDE2LCAgMHhhMywgIDB4MjYsICAweDEwLCAgMHg5NywgIDB4MTAsICAweDk4LCAgMHg5MSwgIDB4NmMsCi0gIDB4N2UsICAweDZkLCAgMHhmZSwgIDB4MTQsICAweDEwLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4MWIsICAweDQwLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4MDEsCi0gIDB4MGMsICAweDA2LCAgMHhmZSwgIDB4ZjcsICAweDAwLCAgMHg0NCwgIDB4MDMsICAweDY4LCAgMHgzYiwgIDB4NjksICAweGZlLCAgMHgxMCwgIDB4NTgsICAweGZlLCAgMHg5MSwgIDB4NTgsCi0gIDB4ZmUsICAweDE0LCAgMHg1OSwgIDB4ZmUsICAweDk1LCAgMHg1OSwgIDB4MDUsICAweDViLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyNCwgIDB4MWIsICAweDQwLCAgMHgwMSwgIDB4MGMsCi0gIDB4MDYsICAweGZlLCAgMHhmNywgIDB4MDAsICAweDQ0LCAgMHg3OCwgIDB4MDEsICAweGZlLCAgMHg4ZSwgIDB4MWUsICAweDRmLCAgMHgwZiwgIDB4ZmUsICAweDEwLCAgMHg5MCwgIDB4MDQsCi0gIDB4ZmUsICAweDkwLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4OTIsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDkyLCAgMHg5MywgIDB4NzksICAweDBiLCAgMHgwZSwgIDB4ZmUsCi0gIDB4YmQsICAweDEwLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHhiYiwgIDB4MWIsICAweGZlLCAgMHg2ZSwgIDB4MGEsICAweDE1LCAgMHhiYiwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsCi0gIDB4ZmUsICAweDE0LCAgMHgxMywgIDB4MDMsICAweDRiLCAgMHgzYiwgIDB4NGMsICAweDhlLCAgMHhmZSwgIDB4NmUsICAweDBhLCAgMHhmZSwgIDB4MGMsICAweDU4LCAgMHhmZSwgIDB4OGQsCi0gIDB4NTgsICAweDA1LCAgMHg1YiwgIDB4MjYsICAweDNlLCAgMHgwZiwgIDB4ZmUsICAweDE5LCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg5OSwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsCi0gIDB4ZmUsICAweGU1LCAgMHgxMCwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHgxYSwgIDB4MTIsICAweGZlLCAgMHg2YywgIDB4MTksICAweGZlLCAgMHgxOSwgIDB4NDEsCi0gIDB4ZmUsICAweDZiLCAgMHgxOCwgIDB4YWMsICAweGZlLCAgMHhkMSwgIDB4ZjAsICAweGVmLCAgMHgxZiwgIDB4OTIsICAweDAxLCAgMHg0MiwgIDB4MTksICAweGZlLCAgMHg0NCwgIDB4MDAsCi0gIDB4ZmUsICAweDkwLCAgMHgxMCwgIDB4ZmUsICAweDZjLCAgMHgxOSwgIDB4ZDksICAweDRiLCAgMHhmZSwgIDB4ZWQsICAweDE5LCAgMHhkYSwgIDB4NGMsICAweGZlLCAgMHgwYywgIDB4NTEsCi0gIDB4ZmUsICAweDhlLCAgMHg1MSwgIDB4ZmUsICAweDZiLCAgMHgxOCwgIDB4MjMsICAweGZlLCAgMHgwMCwgIDB4ZmYsICAweDMxLCAgMHhmZSwgIDB4NzYsICAweDEwLCAgMHhhYywgIDB4ZmUsCi0gIDB4ZDIsICAweGYwLCAgMHhmZSwgIDB4YmEsICAweDBjLCAgMHhmZSwgIDB4NzYsICAweDE4LCAgMHgyMywgIDB4MWQsICAweDVkLCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4ZmUsCi0gIDB4MDgsICAweDEzLCAgMHgxOSwgIDB4ZmUsICAweDE2LCAgMHgwMCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4ZDEsICAweGYwLCAgMHhmZSwgIDB4Y2MsICAweDBjLCAgMHgxZiwgIDB4OTIsCi0gIDB4MDEsICAweDQyLCAgMHgxOSwgIDB4ZmUsICAweDE3LCAgMHgwMCwgIDB4NWMsICAweGZlLCAgMHhjZSwgIDB4ZjAsICAweGZlLCAgMHhkMiwgIDB4MGMsICAweGZlLCAgMHgzZSwgIDB4MTAsCi0gIDB4ZmUsICAweGNkLCAgMHhmMCwgIDB4ZmUsICAweGRlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHgyMiwgIDB4MDAsICAweDA1LCAgMHg3MCwgIDB4ZmUsICAweGNiLCAgMHhmMCwgIDB4ZmUsCi0gIDB4ZWEsICAweDBjLCAgMHgxOSwgIDB4ZmUsICAweDI0LCAgMHgwMCwgIDB4MDUsICAweDcwLCAgMHhmZSwgIDB4ZDAsICAweGYwLCAgMHhmZSwgIDB4ZjQsICAweDBjLCAgMHgxOSwgIDB4OTQsCi0gIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4ZmUsICAweGNmLCAgMHhmMCwgIDB4ZmUsICAweGZlLCAgMHgwYywgIDB4MTksICAweDRhLCAgMHhmMywgIDB4ZmUsICAweGNjLCAgMHhmMCwgIDB4ZWYsCi0gIDB4MDEsICAweDc2LCAgMHgwNiwgIDB4MjQsICAweDRkLCAgMHgxOSwgIDB4ZmUsICAweDEyLCAgMHgwMCwgIDB4MzcsICAweDEzLCAgMHhmZSwgIDB4NGUsICAweDExLCAgMHgyZiwgIDB4ZmUsCi0gIDB4MTYsICAweDBkLCAgMHhmZSwgIDB4OWUsICAweGYwLCAgMHhmZSwgIDB4MmEsICAweDBkLCAgMHhmZSwgIDB4MDEsICAweDQ4LCAgMHgxYiwgIDB4M2MsICAweDM3LCAgMHg4OCwgIDB4ZjUsCi0gIDB4ZDQsICAweDI5LCAgMHhkNSwgIDB4MjksICAweGQyLCAgMHgyOSwgIDB4ZDMsICAweDI5LCAgMHgzNywgIDB4ZmUsICAweDljLCAgMHgzMiwgIDB4MmYsICAweGZlLCAgMHgzZSwgIDB4MGQsCi0gIDB4MmEsICAweDNjLCAgMHhhZSwgIDB4ZmUsICAweDYyLCAgMHgwZCwgIDB4YWYsICAweGEwLCAgMHhkNCwgIDB4OWYsICAweGQ1LCAgMHg5ZiwgIDB4ZDIsICAweDlmLCAgMHhkMywgIDB4OWYsCi0gIDB4MDUsICAweDI5LCAgMHgwMSwgIDB4NDEsICAweGZlLCAgMHhkMywgIDB4MTAsICAweDE1LCAgMHhmZSwgIDB4ZTgsICAweDAwLCAgMHhjNCwgIDB4YzUsICAweDc1LCAgMHhkNywgIDB4OTksCi0gIDB4ZDgsICAweDljLCAgMHhmZSwgIDB4ODksICAweGYwLCAgMHgyOSwgIDB4MjcsICAweDI1LCAgMHhiZSwgIDB4ZDcsICAweDk5LCAgMHhkOCwgIDB4OWMsICAweDJmLCAgMHhmZSwgIDB4OGMsCi0gIDB4MGQsICAweDE2LCAgMHgyOSwgIDB4MjcsICAweDI1LCAgMHhiZCwgIDB4ZmUsICAweDAxLCAgMHg0OCwgIDB4YTQsICAweDE5LCAgMHhmZSwgIDB4NDIsICAweDAwLCAgMHgwNSwgIDB4NzAsCi0gIDB4OTAsICAweDA3LCAgMHhmZSwgIDB4ODEsICAweDQ5LCAgMHgxYiwgIDB4ZmUsICAweDY0LCAgMHgwZSwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4MGQsICAweGZlLCAgMHg0NCwgIDB4MTMsCi0gIDB4MTksICAweDAwLCAgMHgyZCwgIDB4MGQsICAweGZlLCAgMHg1NCwgIDB4MTIsICAweDJkLCAgMHhmZSwgIDB4MjgsICAweDAwLCAgMHgyYiwgIDB4ZmUsICAweGRhLCAgMHgwZSwgIDB4MGEsCi0gIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4MDksICAweDAwLCAgMHgzNiwgIDB4NDYsICAweGZlLCAgMHgyOCwgIDB4MDAsICAweGZlLCAgMHhmYSwgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4ZjQsCi0gIDB4MWMsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweDFkLCAgMHgwYSwgIDB4YmEsICAweDAxLCAgMHhmZSwgIDB4NTgsICAweDEwLCAgMHg0MCwgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ODUsCi0gIDB4MDUsICAweDM1LCAgMHgxOSwgIDB4ZmUsICAweDQ0LCAgMHgwMCwgIDB4MmQsICAweDBkLCAgMHhmNywgIDB4NDYsICAweDBkLCAgMHhmZSwgIDB4Y2MsICAweDEwLCAgMHgwMSwgIDB4YTcsCi0gIDB4NDYsICAweDBkLCAgMHhmZSwgIDB4YzIsICAweDEwLCAgMHgwMSwgIDB4YTcsICAweDBmLCAgMHhmZSwgIDB4MTksICAweDgyLCAgMHgwNCwgIDB4ZmUsICAweDk5LCAgMHg4MywgIDB4ZmUsCi0gIDB4Y2MsICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweGZlLCAgMHgzNCwgIDB4NDYsICAweGE1LCAgMHg0NiwgIDB4MGQsICAweDE5LCAgMHhmZSwgIDB4NDMsICAweDAwLCAgMHhmZSwgIDB4YTIsCi0gIDB4MTAsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDBkLCAgMHg0NCwgIDB4MDEsICAweGZlLCAgMHhmNCwgIDB4MWMsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweDFkLCAgMHg0MCwgIDB4MTUsCi0gIDB4NTYsICAweDAxLCAgMHg4NSwgIDB4N2QsICAweDBkLCAgMHg0MCwgIDB4NTEsICAweDAxLCAgMHhmZSwgIDB4OWUsICAweDFlLCAgMHgwNSwgIDB4ZmUsICAweDNhLCAgMHgwMywgIDB4MDEsCi0gIDB4MGMsICAweDA2LCAgMHgwZCwgIDB4NWQsICAweDQ2LCAgMHgwZCwgIDB4MTksICAweDAwLCAgMHhmZSwgIDB4NjIsICAweDEwLCAgMHgwMSwgIDB4NzYsICAweDA2LCAgMHgxMiwgIDB4ZmUsCi0gIDB4NWMsICAweDEyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweDUyLCAgMHgxMywgIDB4ZmUsICAweDFjLCAgMHgxYywgIDB4ZmUsICAweDlkLCAgMHhmMCwgIDB4ZmUsCi0gIDB4OGUsICAweDBlLCAgMHhmZSwgIDB4MWMsICAweDFjLCAgMHhmZSwgIDB4OWQsICAweGYwLCAgMHhmZSwgIDB4OTQsICAweDBlLCAgMHgwMSwgIDB4MGMsICAweDYxLCAgMHgxMiwgIDB4NDQsCi0gIDB4ZmUsICAweDlmLCAgMHgxMCwgIDB4MTksICAweGZlLCAgMHgxNSwgIDB4MDAsICAweGZlLCAgMHgwNCwgIDB4ZTYsICAweDBkLCAgMHg0ZiwgIDB4ZmUsICAweDJlLCAgMHgxMCwgIDB4MTksCi0gIDB4ZmUsICAweDEzLCAgMHgwMCwgIDB4ZmUsICAweDEwLCAgMHgxMCwgIDB4MTksICAweGZlLCAgMHg0NywgIDB4MDAsICAweGYxLCAgMHgxOSwgIDB4ZmUsICAweDQxLCAgMHgwMCwgIDB4YTIsCi0gIDB4MTksICAweGZlLCAgMHgyNCwgIDB4MDAsICAweDg2LCAgMHhjNCwgIDB4YzUsICAweDc1LCAgMHgwMywgIDB4ODEsICAweDFlLCAgMHgyYiwgIDB4ZWEsICAweDRmLCAgMHhmZSwgIDB4MDQsCi0gIDB4ZTYsICAweDEyLCAgMHhmZSwgIDB4OWQsICAweDQxLCAgMHhmZSwgIDB4MWMsICAweDQyLCAgMHg0MCwgIDB4MDEsICAweGY0LCAgMHgwNSwgIDB4MzUsICAweGZlLCAgMHgxMiwgIDB4MWMsCi0gIDB4MWYsICAweDBkLCAgMHg0NywgIDB4YjUsICAweGMzLCAgMHgxZiwgIDB4ZmUsICAweDMxLCAgMHgwMCwgIDB4NDcsICAweGI4LCAgMHgwMSwgIDB4ZmUsICAweGQ0LCAgMHgxMSwgIDB4MDUsCi0gIDB4ZTksICAweDUxLCAgMHhmZSwgIDB4MDYsICAweGVjLCAgMHhlMCwgIDB4ZmUsICAweDBlLCAgMHg0NywgIDB4NDYsICAweDI4LCAgMHhmZSwgIDB4Y2UsICAweDQ1LCAgMHgzMSwgIDB4NTEsCi0gIDB4ZmUsICAweDA2LCAgMHhlYSwgIDB4ZTAsICAweGZlLCAgMHg0NywgIDB4NGIsICAweDQ1LCAgMHhmZSwgIDB4NzUsICAweDU3LCAgMHgwMywgIDB4NjcsICAweGZlLCAgMHg5OCwgIDB4NTYsCi0gIDB4ZmUsICAweDM4LCAgMHgxMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg0NCwgIDB4NDgsICAweDYwLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4ZmUsCi0gIDB4MTgsICAweDEzLCAgMHgwYSwgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4M2UsICAweGZlLCAgMHg0MSwgIDB4NTgsICAweDBhLCAgMHhiYSwgIDB4ZmUsICAweGZhLCAgMHgxNCwgIDB4ZmUsCi0gIDB4NDksICAweDU0LCAgMHhiMCwgIDB4ZmUsICAweDVlLCAgMHgwZiwgIDB4MDUsICAweGZlLCAgMHgzYSwgIDB4MDMsICAweDBhLCAgMHg2NywgIDB4ZmUsICAweGUwLCAgMHgxNCwgIDB4ZmUsCi0gIDB4MGUsICAweDQ3LCAgMHg0NiwgIDB4MjgsICAweGZlLCAgMHhjZSwgIDB4NDUsICAweDMxLCAgMHg1MSwgIDB4ZmUsICAweGNlLCAgMHg0NywgIDB4ZmUsICAweGFkLCAgMHgxMywgIDB4MDUsCi0gIDB4MzUsICAweDIxLCAgMHgyYywgIDB4MDksICAweDFhLCAgMHhmZSwgIDB4OTgsICAweDEyLCAgMHgyNiwgIDB4MjAsICAweDk2LCAgMHgyMCwgIDB4ZTcsICAweGZlLCAgMHgwOCwgIDB4MWMsCi0gIDB4ZmUsICAweDdjLCAgMHgxOSwgIDB4ZmUsICAweGZkLCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MDMsICAweGU1LCAgMHhmZSwgIDB4NDgsICAweDU1LCAgMHhhNSwgIDB4M2IsCi0gIDB4ZmUsICAweDYyLCAgMHgwMSwgIDB4ZmUsICAweGM5LCAgMHg1NSwgIDB4MzEsICAweGZlLCAgMHg3NCwgIDB4MTAsICAweDAxLCAgMHhmZSwgIDB4ZjAsICAweDFhLCAgMHgwMywgIDB4ZmUsCi0gIDB4MzgsICAweDAxLCAgMHgzYiwgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4OGUsICAweGZlLCAgMHgxZSwgIDB4MTAsICAweGZlLCAgMHgwMiwgIDB4ZWMsICAweGU3LCAgMHg1MywgIDB4MDAsCi0gIDB4MzYsICAweGZlLCAgMHgwNCwgIDB4ZWMsICAweDJjLCAgMHg2MCwgIDB4ZmUsICAweDA1LCAgMHhmNiwgIDB4ZmUsICAweDM0LCAgMHgwMSwgIDB4MDEsICAweGZlLCAgMHg2MiwgIDB4MWIsCi0gIDB4MDEsICAweGZlLCAgMHhjZSwgIDB4MWUsICAweGIyLCAgMHgxMSwgIDB4ZmUsICAweDE4LCAgMHgxMywgIDB4Y2EsICAweGZlLCAgMHgwMiwgIDB4ZWEsICAweGU3LCAgMHg1MywgIDB4OTIsCi0gIDB4ZmUsICAweGMzLCAgMHgxMywgIDB4MWYsICAweDEyLCAgMHg0NywgIDB4YjUsICAweGMzLCAgMHhmZSwgIDB4MmEsICAweDEwLCAgMHgwMywgIDB4ZmUsICAweDM4LCAgMHgwMSwgIDB4MjMsCi0gIDB4ZmUsICAweGYwLCAgMHhmZiwgIDB4MTAsICAweGU1LCAgMHgwMywgIDB4ZmUsICAweDNhLCAgMHgwMSwgIDB4MTAsICAweGZlLCAgMHg2MiwgIDB4MDEsICAweDAxLCAgMHhmZSwgIDB4MWUsCi0gIDB4MWUsICAweDIwLCAgMHgyYywgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ZmUsICAweDllLCAgMHgxZSwgIDB4MTMsICAweDA3LCAgMHgwMiwgIDB4MjYsICAweDAyLCAgMHgyMSwgIDB4OTYsCi0gIDB4YzcsICAweDIwLCAgMHg5NiwgIDB4MDksICAweDkyLCAgMHhmZSwgIDB4NzksICAweDEzLCAgMHgxZiwgIDB4MWQsICAweDQ3LCAgMHhiNSwgIDB4YzMsICAweGZlLCAgMHhlMSwgIDB4MTAsCi0gIDB4Y2YsICAweGZlLCAgMHgwMywgIDB4ZGMsICAweGZlLCAgMHg3MywgIDB4NTcsICAweGZlLCAgMHg4MCwgIDB4NWQsICAweDAyLCAgMHhjZiwgIDB4ZmUsICAweDAzLCAgMHhkYywgIDB4ZmUsCi0gIDB4NWIsICAweDU3LCAgMHhmZSwgIDB4ODAsICAweDVkLCAgMHgwMiwgIDB4ZmUsICAweDAzLCAgMHg1NywgIDB4Y2YsICAweDI2LCAgMHhmZSwgIDB4MDAsICAweGNjLCAgMHgwMiwgIDB4ZmUsCi0gIDB4MDMsICAweDU3LCAgMHhjZiwgIDB4ODksICAweDAyLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHg0YSwgIDB4ZmUsICAweDRlLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxYywgIDB4ODAsCi0gIDB4MDQsICAweGZlLCAgMHg5YywgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDA5LCAgMHgwNywgIDB4ZmUsICAweDNhLCAgMHgxMywgIDB4MGYsICAweGZlLCAgMHgxZSwgIDB4ODAsCi0gIDB4MDQsICAweGZlLCAgMHg5ZSwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweGZlLCAgMHgyYSwgIDB4MTMsICAweDBmLCAgMHhmZSwgIDB4MWQsICAweDgwLCAgMHgwNCwgIDB4ZmUsCi0gIDB4OWQsICAweDgzLCAgMHhmZSwgIDB4ZjksICAweDEzLCAgMHgwZSwgIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4MDEsICAweGZlLCAgMHhlZSwgIDB4MWUsICAweGFjLCAgMHhmZSwgIDB4MTQsCi0gIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4ZmUsICAweDFlLCAgMHhmZSwgIDB4ODEsICAweDU4LCAgMHhmYSwgIDB4MDEsICAweGZlLCAgMHgwZSwgIDB4MWYsICAweGZlLCAgMHgzMCwgIDB4ZjQsCi0gIDB4MGQsICAweGZlLCAgMHgzYywgIDB4NTAsICAweGEyLCAgMHgwMSwgIDB4ZmUsICAweDkyLCAgMHgxYiwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4NTYsICAweGZiLCAgMHgwMSwgIDB4ZmUsCi0gIDB4YzgsICAweDFhLCAgMHgwMSwgIDB4MGMsICAweDA2LCAgMHgyOCwgIDB4YTQsICAweDAxLCAgMHhmZSwgIDB4ZjQsICAweDFjLCAgMHgwMSwgIDB4ZmUsICAweDAwLCAgMHgxZCwgIDB4MTUsCi0gIDB4ZmUsICAweGU5LCAgMHgwMCwgIDB4MDEsICAweDBjLCAgMHgwNiwgIDB4NGEsICAweGZlLCAgMHg0ZSwgIDB4MTMsICAweDAxLCAgMHhmZSwgIDB4MjIsICAweDFiLCAgMHhmZSwgIDB4MWUsCi0gIDB4MWMsICAweDBmLCAgMHhmZSwgIDB4MTQsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDk0LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4OTYsICAweDkwLCAgMHgwNCwgIDB4ZmUsCi0gIDB4OTYsICAweDkzLCAgMHg3OSwgIDB4MGIsICAweDBlLCAgMHgxMCwgIDB4ZmUsICAweDY0LCAgMHgwMSwgIDB4MjIsICAweGZlLCAgMHg2NiwgIDB4MDEsICAweDAxLCAgMHgwYywgIDB4MDYsCi0gIDB4NjUsICAweGY5LCAgMHgwZiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4MywgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDc3LCAgMHhmZSwgIDB4MDEsCi0gIDB4ZWMsICAweDJjLCAgMHhmZSwgIDB4ODAsICAweDQwLCAgMHgyMCwgIDB4MmMsICAweDdhLCAgMHgzMCwgIDB4MTUsICAweGRmLCAgMHg0MCwgIDB4MjEsICAweDJjLCAgMHhmZSwgIDB4MDAsCi0gIDB4NDAsICAweDhkLCAgMHgyYywgIDB4MDIsICAweGZlLCAgMHgwOCwgIDB4MWMsICAweDAzLCAgMHhmZSwgIDB4YWMsICAweDAwLCAgMHhmZSwgIDB4MDYsICAweDU4LCAgMHgwMywgIDB4ZmUsCi0gIDB4YWUsICAweDAwLCAgMHhmZSwgIDB4MDcsICAweDU4LCAgMHgwMywgIDB4ZmUsICAweGIwLCAgMHgwMCwgIDB4ZmUsICAweDA4LCAgMHg1OCwgIDB4MDMsICAweGZlLCAgMHhiMiwgIDB4MDAsCi0gIDB4ZmUsICAweDA5LCAgMHg1OCwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4MmUsICAweDQ5LCAgMHgyMCwgIDB4ZTAsICAweDI2LCAgMHgxMCwgIDB4NjYsICAweDEwLCAgMHg1NSwgIDB4MTAsCi0gIDB4NmYsICAweDEzLCAgMHg1NywgIDB4NTIsICAweDRmLCAgMHgxYywgIDB4MjgsICAweGZlLCAgMHg5MCwgIDB4NGQsICAweGZlLCAgMHg5MSwgIDB4NTQsICAweDJiLCAgMHhmZSwgIDB4ODgsCi0gIDB4MTEsICAweDQ2LCAgMHgxYSwgIDB4MTMsICAweDVhLCAgMHg1MiwgIDB4MWMsICAweDRhLCAgMHhmZSwgIDB4OTAsICAweDRkLCAgMHhmZSwgIDB4OTEsICAweDU0LCAgMHgyYiwgIDB4ZmUsCi0gIDB4OWUsICAweDExLCAgMHgyZSwgIDB4MWEsICAweDIwLCAgMHgyYywgIDB4OTAsICAweDM0LCAgMHg2MCwgIDB4MjEsICAweDJjLCAgMHhmZSwgIDB4MDAsICAweDQwLCAgMHg4ZCwgIDB4MmMsCi0gIDB4MTUsICAweGRmLCAgMHhmZSwgIDB4MTQsICAweDU2LCAgMHhmZSwgIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4YjIsICAweDExLCAgMHhmZSwgIDB4MTIsICAweDFjLCAgMHg3NSwgIDB4ZmUsCi0gIDB4MTQsICAweDFjLCAgMHhmZSwgIDB4MTAsICAweDFjLCAgMHhmZSwgIDB4MTgsICAweDFjLCAgMHgwMiwgIDB4NTEsICAweGZlLCAgMHgwYywgIDB4MTQsICAweGZlLCAgMHgwZSwgIDB4NDcsCi0gIDB4ZmUsICAweDA3LCAgMHhlNiwgIDB4MjgsICAweGZlLCAgMHhjZSwgIDB4NDcsICAweGZlLCAgMHhmNSwgIDB4MTMsICAweDAyLCAgMHgwMSwgIDB4YTcsICAweDkwLCAgMHgzNCwgIDB4NjAsCi0gIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4ZmUsICAweDQ4LCAgMHg0NywgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4ZmUsICAweDAyLCAgMHg4MCwgIDB4MDksICAweDU2LCAgMHhmZSwgIDB4MzQsCi0gIDB4MTMsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHhjYiwgIDB4ZmUsICAweDM2LCAgMHgxMiwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4ZmUsICAweDQ1LCAgMHg0OCwgIDB4MDEsCi0gIDB4ZmUsICAweGIyLCAgMHgxNiwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4Y2IsICAweGZlLCAgMHhmMywgIDB4MTMsICAweDNmLCAgMHg4OSwgIDB4MDksICAweDFhLCAgMHhhNSwgIDB4MGEsCi0gIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg1YywgIDB4MDEsICAweDg1LCAgMHhmMiwgIDB4MDksICAweDliLCAgMHhhNCwgIDB4ZmUsICAweDE0LCAgMHg1NiwgIDB4ZmUsCi0gIDB4ZDYsICAweGYwLCAgMHhmZSwgIDB4ZWMsICAweDExLCAgMHgwMiwgIDB4ZmUsICAweDQ0LCAgMHg1OCwgIDB4NzcsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGI4LCAgMHhmZSwgIDB4OWUsCi0gIDB4NDAsICAweGZlLCAgMHg5ZCwgIDB4ZTcsICAweDAwLCAgMHhmZSwgIDB4OWMsICAweGU3LCAgMHgxMiwgIDB4OGQsICAweDMwLCAgMHgwMSwgIDB4ZjQsICAweGZlLCAgMHhkZCwgIDB4MTAsCi0gIDB4MzcsICAweGQ3LCAgMHg5OSwgIDB4ZDgsICAweDljLCAgMHgyNywgIDB4MjUsICAweGVlLCAgMHgwOSwgIDB4MTIsICAweGZlLCAgMHg0OCwgIDB4MTIsICAweDA5LCAgMHgwZCwgIDB4ZmUsCi0gIDB4NTYsICAweDEyLCAgMHgwOSwgIDB4MWQsICAweGZlLCAgMHgzMCwgIDB4MTIsICAweDA5LCAgMHhkZCwgIDB4MWIsICAweGZlLCAgMHhjNCwgIDB4MTMsICAweDA5LCAgMHhmZSwgIDB4MjMsCi0gIDB4MDAsICAweDFiLCAgMHhmZSwgIDB4ZDAsICAweDEzLCAgMHgwOSwgIDB4MDcsICAweDFiLCAgMHhmZSwgIDB4MzQsICAweDE0LCAgMHgwOSwgIDB4MjQsICAweGZlLCAgMHgxMiwgIDB4MTIsCi0gIDB4MDksICAweDAwLCAgMHgxYiwgIDB4MjksICAweDFmLCAgMHhkZCwgIDB4MDEsICAweDQyLCAgMHhhMSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4YWUsICAweDQxLCAgMHgwMiwgIDB4MzIsCi0gIDB4ZmUsICAweDYyLCAgMHgwOCwgIDB4MGEsICAweGUxLCAgMHgwMSwgIDB4ZmUsICAweDU4LCAgMHgxMCwgIDB4MTUsICAweDliLCAgMHgwNSwgIDB4MzUsICAweDMyLCAgMHgwMSwgIDB4NDMsCi0gIDB4MDksICAweGJiLCAgMHhmZSwgIDB4ZDcsICAweDEzLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4OGUsICAweGZlLCAgMHg4MCwgIDB4MTMsICAweDAxLCAgMHgwYywgIDB4MDYsCi0gIDB4NTQsICAweGZlLCAgMHg3MiwgIDB4MTIsICAweGRiLCAgMHg2NCwgIDB4ZGMsICAweDM0LCAgMHhmZSwgIDB4NDQsICAweDU1LCAgMHhmZSwgIDB4ZTUsICAweDU1LCAgMHhiMCwgIDB4ZmUsCi0gIDB4NGEsICAweDEzLCAgMHgyMSwgIDB4NmUsICAweGZlLCAgMHgyNiwgIDB4MTMsICAweDAzLCAgMHg5NywgIDB4M2IsICAweDk4LCAgMHg4ZSwgIDB4ZmUsICAweGI2LCAgMHgwZSwgIDB4MTAsCi0gIDB4NmEsICAweDIyLCAgMHg2YiwgIDB4MjYsICAweDEwLCAgMHg5NywgIDB4MTAsICAweDk4LCAgMHgwMSwgIDB4YzIsICAweDJlLCAgMHg0OSwgIDB4ODgsICAweDIwLCAgMHg2ZSwgIDB4MDEsCi0gIDB4ZmUsICAweDZhLCAgMHgxNiwgIDB4ZGIsICAweDY0LCAgMHhkYywgIDB4MzQsICAweGZlLCAgMHgwNCwgIDB4NTUsICAweGZlLCAgMHhhNSwgIDB4NTUsICAweGZlLCAgMHgwNCwgIDB4ZmEsCi0gIDB4NjQsICAweGZlLCAgMHgwNSwgIDB4ZmEsICAweDM0LCAgMHhmZSwgIDB4OGYsICAweDEwLCAgMHgwMywgIDB4NmMsICAweDNiLCAgMHg2ZCwgIDB4ZmUsICAweDQwLCAgMHg1NiwgIDB4ZmUsCi0gIDB4ZTEsICAweDU2LCAgMHgxMCwgIDB4NmMsICAweDIyLCAgMHg2ZCwgIDB4NzEsICAweGRiLCAgMHg2NCwgIDB4ZGMsICAweDM0LCAgMHhmZSwgIDB4NDQsICAweDU1LCAgMHhmZSwgIDB4ZTUsCi0gIDB4NTUsICAweDAzLCAgMHg2OCwgIDB4M2IsICAweDY5LCAgMHhmZSwgIDB4MDAsICAweDU2LCAgMHhmZSwgIDB4YTEsICAweDU2LCAgMHgxMCwgIDB4NjgsICAweDIyLCAgMHg2OSwgIDB4MDEsCi0gIDB4MGMsICAweDA2LCAgMHg1NCwgIDB4ZjksICAweDIxLCAgMHg2ZSwgIDB4ZmUsICAweDFmLCAgMHg0MCwgIDB4MDMsICAweDZhLCAgMHgzYiwgIDB4NmIsICAweGZlLCAgMHgyYywgIDB4NTAsCi0gIDB4ZmUsICAweGFlLCAgMHg1MCwgIDB4MDMsICAweDZjLCAgMHgzYiwgIDB4NmQsICAweGZlLCAgMHg0NCwgIDB4NTAsICAweGZlLCAgMHhjNiwgIDB4NTAsICAweDAzLCAgMHg2OCwgIDB4M2IsCi0gIDB4NjksICAweGZlLCAgMHgwOCwgIDB4NTAsICAweGZlLCAgMHg4YSwgIDB4NTAsICAweDAzLCAgMHg0YiwgIDB4M2IsICAweDRjLCAgMHhmZSwgIDB4NDAsICAweDUwLCAgMHhmZSwgIDB4YzIsCi0gIDB4NTAsICAweDA1LCAgMHg3MywgIDB4MmUsICAweDA3LCAgMHgyMCwgIDB4OWUsICAweDA1LCAgMHg3MiwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweDNkLCAgMHgyNywgIDB4MjUsCi0gIDB4ZWUsICAweDA5LCAgMHgwNywgIDB4MmIsICAweDNkLCAgMHgwMSwgIDB4NDMsICAweDA5LCAgMHhiYiwgIDB4MmIsICAweDcyLCAgMHgwMSwgIDB4YTYsICAweDIzLCAgMHgzZiwgIDB4MWIsCi0gIDB4M2QsICAweDAxLCAgMHgwYywgIDB4MDYsICAweDBkLCAgMHhmZSwgIDB4MWUsICAweDEzLCAgMHg5MSwgIDB4NGIsICAweDdlLCAgMHg0YywgIDB4ZmUsICAweDBhLCAgMHg1NSwgIDB4MzEsCi0gIDB4ZmUsICAweDhiLCAgMHg1NSwgIDB4ZDksICAweDRiLCAgMHhkYSwgIDB4NGMsICAweGZlLCAgMHgwYywgIDB4NTEsICAweGZlLCAgMHg4ZSwgIDB4NTEsICAweDA1LCAgMHg3MiwgIDB4MDEsCi0gIDB4ZmUsICAweDhlLCAgMHgxZSwgIDB4Y2EsICAweGZlLCAgMHgxOSwgIDB4NDEsICAweDA1LCAgMHg3MiwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4YzAsCi0gIDB4MjcsICAweDI1LCAgMHhiZSwgIDB4MmQsICAweDFkLCAgMHhjMCwgIDB4MmQsICAweDBkLCAgMHg4MywgIDB4MmQsICAweDdmLCAgMHgxYiwgIDB4ZmUsICAweDY2LCAgMHgxNSwgIDB4MDUsCi0gIDB4M2QsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4YzAsICAweDI3LCAgMHgyNSwgIDB4YmQsICAweDA5LCAgMHgxZCwgIDB4MmIsICAweDNkLCAgMHgwMSwgIDB4MDgsCi0gIDB4MTYsICAweGMwLCAgMHgyNywgIDB4MjUsICAweGZlLCAgMHhlOCwgIDB4MDksICAweGZlLCAgMHhjMiwgIDB4NDksICAweDUwLCAgMHgwMywgIDB4YjYsICAweDFlLCAgMHg4MywgIDB4MDEsCi0gIDB4MzgsICAweDA2LCAgMHgyNCwgIDB4MzEsICAweGExLCAgMHhmZSwgIDB4YmIsICAweDQ1LCAgMHgyZCwgIDB4MDAsICAweGE0LCAgMHg0NiwgIDB4MDcsICAweDkwLCAgMHgzZiwgIDB4MDEsCi0gIDB4ZmUsICAweGY4LCAgMHgxNSwgIDB4MDEsICAweGE2LCAgMHg4NiwgIDB4ZmUsICAweDRiLCAgMHg0NSwgIDB4ZmUsICAweDIwLCAgMHgxMywgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ODIsCi0gIDB4ZmUsICAweDE2LCAgMHgxMywgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4NWQsICAweDAzLCAgMHg1NSwgIDB4MWUsICAweDMxLCAgMHg1ZSwgIDB4MDUsICAweDcyLCAgMHhmZSwgIDB4YzAsCi0gIDB4NWQsICAweDAxLCAgMHhhNywgIDB4ZmUsICAweDAzLCAgMHgxNywgIDB4MDMsICAweDY2LCAgMHg4YSwgIDB4MTAsICAweDY2LCAgMHg1ZSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTcsCi0gIDB4NzMsICAweDAxLCAgMHhmZSwgIDB4NTYsICAweDE5LCAgMHgwNSwgIDB4NzMsICAweDAxLCAgMHgwOCwgIDB4MmEsICAweDNjLCAgMHgxNiwgIDB4M2QsICAweDI3LCAgMHgyNSwgIDB4YmQsCi0gIDB4MDksICAweDA3LCAgMHgyYiwgIDB4M2QsICAweDAxLCAgMHhmZSwgIDB4YmUsICAweDE2LCAgMHhmZSwgIDB4NDIsICAweDU4LCAgMHhmZSwgIDB4ZTgsICAweDE0LCAgMHgwMSwgIDB4YTYsCi0gIDB4ODYsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDBkLCAgMHgxYiwgIDB4M2QsICAweGZlLCAgMHg0YSwgIDB4ZjQsICAweDA3LCAgMHhmZSwgIDB4MGUsICAweDEyLCAgMHgwMSwgIDB4NDMsCi0gIDB4MDksICAweDgyLCAgMHg0ZSwgIDB4MDUsICAweDcyLCAgMHgwMywgIDB4NTUsICAweDhhLCAgMHgxMCwgIDB4NTUsICAweDVlLCAgMHgzMiwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4NzMsCi0gIDB4MDEsICAweGZlLCAgMHg4NCwgIDB4MTksICAweDA1LCAgMHg3MywgIDB4MDEsICAweDA4LCAgMHgyYSwgIDB4M2MsICAweDE2LCAgMHgzZCwgIDB4MjcsICAweDI1LCAgMHhiZCwgIDB4MDksCi0gIDB4MTIsICAweDJiLCAgMHgzZCwgIDB4MDEsICAweGZlLCAgMHhlOCwgIDB4MTcsICAweDhiLCAgMHhmZSwgIDB4YWEsICAweDE0LCAgMHhmZSwgIDB4YjYsICAweDE0LCAgMHg4NiwgIDB4YTgsCi0gIDB4YjIsICAweDBkLCAgMHgxYiwgIDB4M2QsICAweGIyLCAgMHgwNywgIDB4ZmUsICAweDBlLCAgMHgxMiwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ODIsICAweDRlLCAgMHgwNSwgIDB4NzIsCi0gIDB4MDMsICAweDZmLCAgMHg4YSwgIDB4MTAsICAweDZmLCAgMHg1ZSwgIDB4MzIsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweDczLCAgMHgwMSwgIDB4ZmUsICAweGMwLCAgMHgxOSwgIDB4MDUsCi0gIDB4NzMsICAweDEzLCAgMHgwNywgIDB4MmYsICAweGZlLCAgMHhjYywgIDB4MTUsICAweDE3LCAgMHhmZSwgIDB4ZTIsICAweDE1LCAgMHg1ZiwgIDB4Y2MsICAweDAxLCAgMHgwOCwgIDB4MjYsCi0gIDB4NWYsICAweDAyLCAgMHg4ZiwgIDB4ZmUsICAweGRlLCAgMHgxNSwgIDB4MmEsICAweGZlLCAgMHhkZSwgIDB4MTUsICAweDE2LCAgMHhmZSwgIDB4Y2MsICAweDE1LCAgMHg1ZSwgIDB4MzIsCi0gIDB4MDEsICAweDA4LCAgMHhmZSwgIDB4ZDUsICAweDEwLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4YWQsICAweDIzLCAgMHhmZSwgIDB4ZmYsCi0gIDB4N2YsICAweGZlLCAgMHgzMCwgIDB4NTYsICAweGZlLCAgMHgwMCwgIDB4NWMsICAweDAyLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4YWQsCi0gIDB4MjMsICAweDNmLCAgMHhmZSwgIDB4MzAsICAweDU2LCAgMHhmZSwgIDB4MDAsICAweDVjLCAgMHgwMiwgIDB4MTMsICAweDU4LCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsCi0gIDB4YWQsICAweDAyLCAgMHgxMywgIDB4NTgsICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU3LCAgMHg1MiwgIDB4ZmUsICAweDAwLCAgMHg1ZSwgIDB4MDIsICAweDEzLCAgMHg1OCwgIDB4ZmYsCi0gIDB4MDIsICAweDAwLCAgMHg1NywgIDB4NTIsICAweGFkLCAgMHhmZSwgIDB4MGIsICAweDU4LCAgMHgwMiwgIDB4MGEsICAweDY2LCAgMHgwMSwgIDB4NWMsICAweDBhLCAgMHg1NSwgIDB4MDEsCi0gIDB4NWMsICAweDBhLCAgMHg2ZiwgIDB4MDEsICAweDVjLCAgMHgwMiwgIDB4MDEsICAweGZlLCAgMHgxZSwgIDB4MWYsICAweDIzLCAgMHgxYSwgIDB4ZmYsICAweDAzLCAgMHgwMCwgIDB4NTQsCi0gIDB4ZmUsICAweDAwLCAgMHhmNCwgIDB4MjQsICAweDUyLCAgMHgwZiwgIDB4ZmUsICAweDAwLCAgMHg3YywgIDB4MDQsICAweGZlLCAgMHgwNywgIDB4N2MsICAweDNhLCAgMHgwYiwgIDB4MGUsCi0gIDB4ZmUsICAweDAwLCAgMHg3MSwgIDB4ZmUsICAweGY5LCAgMHgxOCwgIDB4ZmUsICAweDdhLCAgMHgxOSwgIDB4ZmUsICAweGZiLCAgMHgxOSwgIDB4ZmUsICAweDFhLCAgMHhmNywgIDB4MDAsCi0gIDB4ZmUsICAweDFiLCAgMHhmNywgIDB4MDAsICAweDdhLCAgMHgzMCwgIDB4MTAsICAweDY4LCAgMHgyMiwgIDB4NjksICAweGQ5LCAgMHg2YywgIDB4ZGEsICAweDZkLCAgMHgwMiwgIDB4ZmUsCi0gIDB4NjIsICAweDA4LCAgMHhmZSwgIDB4ODIsICAweDRhLCAgMHhmZSwgIDB4ZTEsICAweDFhLCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHg3NywgIDB4MDIsICAweDAxLCAgMHhjNiwgIDB4ZmUsCi0gIDB4NDIsICAweDQ4LCAgMHg0ZiwgIDB4NTAsICAweDQ1LCAgMHgwMSwgIDB4MDgsICAweDE2LCAgMHhmZSwgIDB4ZTAsICAweDE3LCAgMHgyNywgIDB4MjUsICAweGJlLCAgMHgwMSwgIDB4MDgsCi0gIDB4MTYsICAweGZlLCAgMHhlMCwgIDB4MTcsICAweDI3LCAgMHgyNSwgIDB4ZmUsICAweGU4LCAgMHgwYSwgIDB4ZmUsICAweGMxLCAgMHg1OSwgIDB4MDMsICAweDlhLCAgMHgxZSwgIDB4ZmUsCi0gIDB4ZGEsICAweDEyLCAgMHgwMSwgIDB4MzgsICAweDA2LCAgMHgxMiwgIDB4ZmUsICAweGQwLCAgMHgxMywgIDB4MjYsICAweDUzLCAgMHgxMiwgIDB4NDgsICAweGZlLCAgMHgwOCwgIDB4MTcsCi0gIDB4ZDEsICAweDEyLCAgMHg1MywgIDB4MTIsICAweGZlLCAgMHgxZSwgIDB4MTMsICAweDJkLCAgMHhiNCwgIDB4N2IsICAweGZlLCAgMHgyNiwgIDB4MTcsICAweDRkLCAgMHgxMywgIDB4MDcsCi0gIDB4MWMsICAweGI0LCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHg3OCwgIDB4MTAsICAweGZmLCAgMHgwMiwgIDB4ODMsICAweDU1LCAgMHhmMSwgIDB4ZmYsICAweDAyLCAgMHg4MywgIDB4NTUsCi0gIDB4NTMsICAweDFkLCAgMHhmZSwgIDB4MTIsICAweDEzLCAgMHhkNiwgIDB4ZmUsICAweDMwLCAgMHgwMCwgIDB4YjAsICAweGZlLCAgMHg4MCwgIDB4MTcsICAweDFjLCAgMHg2MywgIDB4MTMsCi0gIDB4MDcsICAweGZlLCAgMHg1NiwgIDB4MTAsICAweDUzLCAgMHgwZCwgIDB4ZmUsICAweDE2LCAgMHgxMywgIDB4ZDYsICAweGZlLCAgMHg2NCwgIDB4MDAsICAweGIwLCAgMHhmZSwgIDB4ODAsCi0gIDB4MTcsICAweDBhLCAgMHhmZSwgIDB4NjQsICAweDAwLCAgMHgxYywgIDB4OTQsICAweDEzLCAgMHgwNywgIDB4ZmUsICAweDI4LCAgMHgxMCwgIDB4NTMsICAweDA3LCAgMHhmZSwgIDB4NjAsCi0gIDB4MTMsICAweGQ2LCAgMHhmZSwgIDB4YzgsICAweDAwLCAgMHhiMCwgIDB4ZmUsICAweDgwLCAgMHgxNywgIDB4MGEsICAweGZlLCAgMHhjOCwgIDB4MDAsICAweDFjLCAgMHg5NSwgIDB4MTMsCi0gIDB4MDcsICAweDcxLCAgMHhkNiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4NDgsICAweGZlLCAgMHg4YywgIDB4MTcsICAweDQ1LCAgMHhmMywgIDB4ZmUsICAweDQzLCAgMHhmNCwgIDB4OTYsCi0gIDB4ZmUsICAweDU2LCAgMHhmMCwgIDB4ZmUsICAweDllLCAgMHgxNywgIDB4ZmUsICAweDA0LCAgMHhmNCwgIDB4NTgsICAweGZlLCAgMHg0MywgIDB4ZjQsICAweDk0LCAgMHhmNiwgIDB4OGIsCi0gIDB4MDEsICAweGZlLCAgMHgyNCwgIDB4MTYsICAweDIzLCAgMHgzZiwgIDB4ZmMsICAweGE4LCAgMHg4YywgIDB4NDksICAweDQ4LCAgMHhmZSwgIDB4ZGEsICAweDE3LCAgMHg2MiwgIDB4NDksCi0gIDB4ZmUsICAweDFjLCAgMHgxMCwgIDB4YTgsICAweDhjLCAgMHg4MCwgIDB4NDgsICAweGZlLCAgMHhkYSwgIDB4MTcsICAweDYyLCAgMHg4MCwgIDB4NzEsICAweDUwLCAgMHgyNiwgIDB4ZmUsCi0gIDB4NGQsICAweGY0LCAgMHgwMCwgIDB4ZjcsICAweDQ1LCAgMHgxMywgIDB4MDcsICAweGZlLCAgMHhiNCwgIDB4NTYsICAweGZlLCAgMHhjMywgIDB4NTgsICAweDAyLCAgMHg1MCwgIDB4MTMsCi0gIDB4MGQsICAweDAyLCAgMHg1MCwgIDB4M2UsICAweDc4LCAgMHg0ZiwgIDB4NDUsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweGE5LCAgMHgyNywgIDB4MjUsICAweGJlLCAgMHhmZSwgIDB4MDMsCi0gIDB4ZWEsICAweGZlLCAgMHg3ZSwgIDB4MDEsICAweDAxLCAgMHgwOCwgIDB4MTYsICAweGE5LCAgMHgyNywgIDB4MjUsICAweGZlLCAgMHhlOSwgIDB4MGEsICAweDAxLCAgMHgwOCwgIDB4MTYsCi0gIDB4YTksICAweDI3LCAgMHgyNSwgIDB4ZmUsICAweGU5LCAgMHgwYSwgIDB4ZmUsICAweDA1LCAgMHhlYSwgIDB4ZmUsICAweDdmLCAgMHgwMSwgIDB4MDEsICAweDA4LCAgMHgxNiwgIDB4YTksCi0gIDB4MjcsICAweDI1LCAgMHhmZSwgIDB4NjksICAweDA5LCAgMHhmZSwgIDB4MDIsICAweGVhLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHgwMSwgIDB4MDgsICAweDE2LCAgMHhhOSwgIDB4MjcsCi0gIDB4MjUsICAweGZlLCAgMHhlOCwgIDB4MDgsICAweDQ3LCAgMHhmZSwgIDB4ODEsICAweDAxLCAgMHgwMywgIDB4YjYsICAweDFlLCAgMHg4MywgIDB4MDEsICAweDM4LCAgMHgwNiwgIDB4MjQsCi0gIDB4MzEsICAweGEyLCAgMHg3OCwgIDB4ZjIsICAweDUzLCAgMHgwNywgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsICAweDNmLCAgMHhhMSwgIDB4NzgsICAweDAzLCAgMHg5YSwgIDB4MWUsCi0gIDB4ODMsICAweDAxLCAgMHgzOCwgIDB4MDYsICAweDEyLCAgMHgzMSwgIDB4ZjAsICAweDRmLCAgMHg0NSwgIDB4ZmUsICAweDkwLCAgMHgxMCwgIDB4ZmUsICAweDQwLCAgMHg1YSwgIDB4MjMsCi0gIDB4M2YsICAweGZiLCAgMHg4YywgIDB4NDksICAweDQ4LCAgMHhmZSwgIDB4YWEsICAweDE4LCAgMHg2MiwgIDB4NDksICAweDcxLCAgMHg4YywgIDB4ODAsICAweDQ4LCAgMHhmZSwgIDB4YWEsCi0gIDB4MTgsICAweDYyLCAgMHg4MCwgIDB4ZmUsICAweGI0LCAgMHg1NiwgIDB4ZmUsICAweDQwLCAgMHg1ZCwgIDB4MDEsICAweGM2LCAgMHgwMSwgIDB4ZmUsICAweGFjLCAgMHgxZCwgIDB4ZmUsCi0gIDB4MDIsICAweDE3LCAgMHhmZSwgIDB4YzgsICAweDQ1LCAgMHhmZSwgIDB4NWEsICAweGYwLCAgMHhmZSwgIDB4YzAsICAweDE4LCAgMHhmZSwgIDB4NDMsICAweDQ4LCAgMHgyZCwgIDB4OTMsCi0gIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsICAweGZlLCAgMHgwMCwgIDB4MTEsICAweGZlLCAgMHg0MCwgIDB4MTAsICAweDJkLCAgMHhiNCwgIDB4MzYsICAweGZlLCAgMHgzNCwgIDB4ZjQsCi0gIDB4MDQsICAweGZlLCAgMHgzNCwgIDB4MTAsICAweDJkLCAgMHhmZSwgIDB4MGIsICAweDAwLCAgMHgzNiwgIDB4NDYsICAweDYzLCAgMHhmZSwgIDB4MjgsICAweDEwLCAgMHhmZSwgIDB4YzAsCi0gIDB4NDksICAweGZmLCAgMHgwMiwgIDB4MDAsICAweDU0LCAgMHhiMiwgIDB4ZmUsICAweDkwLCAgMHgwMSwgIDB4NDgsICAweGZlLCAgMHhmYSwgIDB4MTgsICAweDQ1LCAgMHhmZSwgIDB4MWMsCi0gIDB4ZjQsICAweDNmLCAgMHhmMywgIDB4ZmUsICAweDQwLCAgMHhmNCwgIDB4OTYsICAweGZlLCAgMHg1NiwgIDB4ZjAsICAweGZlLCAgMHgwYywgIDB4MTksICAweGZlLCAgMHgwNCwgIDB4ZjQsCi0gIDB4NTgsICAweGZlLCAgMHg0MCwgIDB4ZjQsICAweDk0LCAgMHhmNiwgIDB4M2UsICAweDJkLCAgMHg5MywgIDB4NGUsICAweGQwLCAgMHgwZCwgIDB4MjEsICAweGZlLCAgMHg3ZiwgIDB4MDEsCi0gIDB4ZmUsICAweGM4LCAgMHg0NiwgIDB4ZmUsICAweDI0LCAgMHgxMywgIDB4OGMsICAweDAwLCAgMHg1ZCwgIDB4MjYsICAweDIxLCAgMHhmZSwgIDB4N2UsICAweDAxLCAgMHhmZSwgIDB4YzgsCi0gIDB4NDUsICAweGZlLCAgMHgxNCwgIDB4MTMsICAweDIxLCAgMHhmZSwgIDB4ODAsICAweDAxLCAgMHhmZSwgIDB4NDgsICAweDQ1LCAgMHhmYSwgIDB4MjEsICAweGZlLCAgMHg4MSwgIDB4MDEsCi0gIDB4ZmUsICAweGM4LCAgMHg0NCwgIDB4NGUsICAweDI2LCAgMHgwMiwgIDB4MTMsICAweDA3LCAgMHgwMiwgIDB4NzgsICAweDQ1LCAgMHg1MCwgIDB4MTMsICAweDBkLCAgMHgwMiwgIDB4MTQsCi0gIDB4MDcsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweGZlLCAgMHg4MiwgIDB4MTksICAweDE0LCAgMHgwZCwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4ZmUsICAweDgyLCAgMHgxOSwgIDB4MTQsCi0gIDB4MWQsICAweDAxLCAgMHgwOCwgIDB4MTcsICAweGZlLCAgMHg4MiwgIDB4MTksICAweDVmLCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDAyLCAgMHgxNCwgIDB4MDcsCi0gIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDE0LCAgMHgxZCwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDE0LCAgMHgwNywgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsCi0gIDB4ZmUsICAweDg5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4YzEsICAweDVmLCAgMHhmZSwgIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDAyLCAgMHg1MCwgIDB4MDIsCi0gIDB4MTQsICAweDA3LCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDdmLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDEyLCAgMHgwMSwgIDB4MDgsCi0gIDB4MTcsICAweDc0LCAgMHhmZSwgIDB4ODksICAweDQ5LCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4MTQsICAweDAwLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4ZmUsCi0gIDB4ODksICAweDRhLCAgMHgwMSwgIDB4MDgsICAweDE3LCAgMHg3NCwgIDB4ZmUsICAweDA5LCAgMHg0OSwgIDB4MDEsICAweDA4LCAgMHgxNywgIDB4NzQsICAweDVmLCAgMHhjYywgIDB4MDEsCi0gIDB4MDgsICAweDAyLCAgMHgyMSwgIDB4ZTQsICAweDA5LCAgMHgwNywgIDB4ZmUsICAweDRjLCAgMHgxMywgIDB4YzgsICAweDIwLCAgMHhlNCwgIDB4ZmUsICAweDQ5LCAgMHhmNCwgIDB4MDAsCi0gIDB4NGQsICAweDVmLCAgMHhhMSwgIDB4NWUsICAweGZlLCAgMHgwMSwgIDB4ZWMsICAweGZlLCAgMHgyNywgIDB4MDEsICAweGNjLCAgMHhmZiwgIDB4MDIsICAweDAwLCAgMHgxMCwgIDB4MmYsCi0gIDB4ZmUsICAweDNlLCAgMHgxYSwgIDB4MDEsICAweDQzLCAgMHgwOSwgIDB4ZmUsICAweGUzLCAgMHgwMCwgIDB4ZmUsICAweDIyLCAgMHgxMywgIDB4MTYsICAweGZlLCAgMHg2NCwgIDB4MWEsCi0gIDB4MjYsICAweDIwLCAgMHg5ZSwgIDB4MDEsICAweDQxLCAgMHgyMSwgIDB4OWUsICAweDA5LCAgMHgwNywgIDB4NWQsICAweDAxLCAgMHgwYywgIDB4NjEsICAweDA3LCAgMHg0NCwgIDB4MDIsCi0gIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHgwMCwgIDB4NDAsICAweGFhLCAgMHgwOSwgIDB4MWEsICAweGZlLCAgMHgxMiwgIDB4MTMsICAweDBhLCAgMHg5ZCwgIDB4MDEsCi0gIDB4MTgsICAweGFhLCAgMHgwYSwgIDB4NjcsICAweDAxLCAgMHhhMywgIDB4MDIsICAweDBhLCAgMHg5ZCwgIDB4MDEsICAweDE4LCAgMHhhYSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MWEsCi0gIDB4MDksICAweDFhLCAgMHg1ZCwgIDB4ZmUsICAweDQ1LCAgMHg1OCwgIDB4MDEsICAweGZlLCAgMHhiMiwgIDB4MTYsICAweGFhLCAgMHgwMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsCi0gIDB4YWEsICAweDBhLCAgMHg2NywgIDB4MDEsICAweGEzLCAgMHgwMiwgIDB4MGEsICAweDVhLCAgMHgwMSwgIDB4MTgsICAweDAxLCAgMHhmZSwgIDB4N2UsICAweDFlLCAgMHhmZSwgIDB4ODAsCi0gIDB4NGMsICAweGZlLCAgMHg0OSwgIDB4ZTQsICAweDFhLCAgMHhmZSwgIDB4MTIsICAweDEzLCAgMHgwYSwgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg0YywgIDB4MGEsCi0gIDB4NjcsICAweDAxLCAgMHg1YywgIDB4MDIsICAweDFjLCAgMHgxYSwgIDB4ODcsICAweDdjLCAgMHhlNSwgIDB4ZmUsICAweDE4LCAgMHhkZiwgIDB4ZmUsICAweDE5LCAgMHhkZSwgIDB4ZmUsCi0gIDB4MjQsICAweDFjLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHgyOCwgIDB4YjEsICAweGZlLCAgMHgwNCwgIDB4MWIsICAweDAxLCAgMHhmZSwgIDB4MmEsICAweDFjLCAgMHhmYSwgIDB4YjMsCi0gIDB4MjgsICAweDdjLCAgMHhmZSwgIDB4MmMsICAweDAxLCAgMHhmZSwgIDB4MmYsICAweDE5LCAgMHgwMiwgIDB4YzksICAweDJiLCAgMHhmZSwgIDB4ZjQsICAweDFhLCAgMHhmZSwgIDB4ZmEsCi0gIDB4MTAsICAweDFjLCAgMHgxYSwgIDB4ODcsICAweDAzLCAgMHhmZSwgIDB4NjQsICAweDAxLCAgMHhmZSwgIDB4MDAsICAweGY0LCAgMHgyNCwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4MDMsCi0gIDB4ZmUsICAweDY2LCAgMHgwMSwgIDB4ZmUsICAweDE5LCAgMHg1OCwgIDB4YjMsICAweDI0LCAgMHgwMSwgIDB4ZmUsICAweDBlLCAgMHgxZiwgIDB4ZmUsICAweDMwLCAgMHhmNCwgIDB4MDcsCi0gIDB4ZmUsICAweDNjLCAgMHg1MCwgIDB4N2MsICAweGZlLCAgMHgzOCwgIDB4MDAsICAweGZlLCAgMHgwZiwgIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDI0LCAgMHhiMSwgIDB4ZmUsCi0gIDB4NTAsICAweDFiLCAgMHhmZSwgIDB4ZDQsICAweDE0LCAgMHgzMSwgIDB4MDIsICAweGM5LCAgMHgyYiwgIDB4ZmUsICAweDI2LCAgMHgxYiwgIDB4ZmUsICAweGJhLCAgMHgxMCwgIDB4MWMsCi0gIDB4MWEsICAweDg3LCAgMHhmZSwgIDB4ODMsICAweDVhLCAgMHhmZSwgIDB4MTgsICAweGRmLCAgMHhmZSwgIDB4MTksICAweGRlLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg1NCwgIDB4YjEsCi0gIDB4ZmUsICAweDcyLCAgMHgxYiwgIDB4ZmUsICAweGIyLCAgMHgxNCwgIDB4ZmMsICAweGIzLCAgMHg1NCwgIDB4N2MsICAweDEyLCAgMHhmZSwgIDB4YWYsICAweDE5LCAgMHhmZSwgIDB4OTgsCi0gIDB4ZTcsICAweDAwLCAgMHgwMiwgIDB4YzksICAweDJiLCAgMHhmZSwgIDB4NjYsICAweDFiLCAgMHhmZSwgIDB4OGEsICAweDEwLCAgMHgxYywgIDB4MWEsICAweDg3LCAgMHg4YiwgIDB4MGYsCi0gIDB4ZmUsICAweDMwLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhiMCwgIDB4OTMsICAweDNhLCAgMHgwYiwgIDB4ZmUsICAweDE4LCAgMHg1OCwgIDB4ZmUsICAweDMyLCAgMHg5MCwgIDB4MDQsCi0gIDB4ZmUsICAweGIyLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHhmZSwgIDB4MTksICAweDU4LCAgMHgwZSwgIDB4YTgsICAweGIzLCAgMHg0YSwgIDB4N2MsICAweDEyLCAgMHhmZSwgIDB4MGYsCi0gIDB4NzksICAweGZlLCAgMHgxYywgIDB4ZjcsICAweDRhLCAgMHhiMSwgIDB4ZmUsICAweGM2LCAgMHgxYiwgIDB4ZmUsICAweDVlLCAgMHgxNCwgIDB4MzEsICAweDAyLCAgMHhjOSwgIDB4MmIsCi0gIDB4ZmUsICAweDk2LCAgMHgxYiwgIDB4NWMsICAweGZlLCAgMHgwMiwgIDB4ZjYsICAweDFhLCAgMHg4NywgIDB4ZmUsICAweDE4LCAgMHhmZSwgIDB4NmEsICAweGZlLCAgMHgxOSwgIDB4ZmUsCi0gIDB4NmIsICAweDAxLCAgMHhmZSwgIDB4MWUsICAweDFmLCAgMHhmZSwgIDB4MWQsICAweGY3LCAgMHg2NSwgIDB4YjEsICAweGZlLCAgMHhlZSwgIDB4MWIsICAweGZlLCAgMHgzNiwgIDB4MTQsCi0gIDB4ZmUsICAweDFjLCAgMHgxMywgIDB4YjMsICAweDY1LCAgMHgzZSwgIDB4ZmUsICAweDgzLCAgMHg1OCwgIDB4ZmUsICAweGFmLCAgMHgxOSwgIDB4ZmUsICAweDgwLCAgMHhlNywgIDB4MWEsCi0gIDB4ZmUsICAweDgxLCAgMHhlNywgIDB4MWEsICAweDE1LCAgMHhmZSwgIDB4ZGQsICAweDAwLCAgMHg3YSwgIDB4MzAsICAweDAyLCAgMHg3YSwgIDB4MzAsICAweGZlLCAgMHgxMiwgIDB4NDUsCi0gIDB4MmIsICAweGZlLCAgMHhkYywgIDB4MWIsICAweDFmLCAgMHgwNywgIDB4NDcsICAweGI1LCAgMHhjMywgIDB4MDUsICAweDM1LCAgMHhmZSwgIDB4MzksICAweGYwLCAgMHg3NSwgIDB4MjYsCi0gIDB4MDIsICAweGZlLCAgMHg3ZSwgIDB4MTgsICAweDIzLCAgMHgxZCwgIDB4MzYsICAweDEzLCAgMHgxMSwgIDB4MDIsICAweDg3LCAgMHgwMywgIDB4ZTMsICAweDIzLCAgMHgwNywgIDB4ZmUsCi0gIDB4ZWYsICAweDEyLCAgMHhmZSwgIDB4ZTEsICAweDEwLCAgMHg5MCwgIDB4MzQsICAweDYwLCAgMHhmZSwgIDB4MDIsICAweDgwLCAgMHgwOSwgIDB4NTYsICAweGZlLCAgMHgzYywgIDB4MTMsCi0gIDB4ZmUsICAweDgyLCAgMHgxNCwgIDB4ZmUsICAweDQyLCAgMHgxMywgIDB4NTEsICAweGZlLCAgMHgwNiwgIDB4ODMsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHhjYiwgIDB4ZmUsCi0gIDB4M2UsICAweDEyLCAgMHhmZSwgIDB4NDEsICAweDQ4LCAgMHhmZSwgIDB4NDUsICAweDQ4LCAgMHgwMSwgIDB4ZmUsICAweGIyLCAgMHgxNiwgIDB4ZmUsICAweDAwLCAgMHhjYywgIDB4Y2IsCi0gIDB4ZmUsICAweGYzLCAgMHgxMywgIDB4M2YsICAweDg5LCAgMHgwOSwgIDB4MWEsICAweGE1LCAgMHgwYSwgIDB4OWQsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDgwLCAgMHg0YywgIDB4MDEsCi0gIDB4ODUsICAweGZlLCAgMHgxNiwgIDB4MTAsICAweDA5LCAgMHg5YiwgIDB4NGUsICAweGZlLCAgMHg0MCwgIDB4MTQsICAweGZlLCAgMHgyNCwgIDB4MTIsICAweGZlLCAgMHgxNCwgIDB4NTYsCi0gIDB4ZmUsICAweGQ2LCAgMHhmMCwgIDB4ZmUsICAweDUyLCAgMHgxYywgIDB4MWMsICAweDBkLCAgMHgwMiwgIDB4ZmUsICAweDljLCAgMHhlNywgIDB4MGQsICAweDE5LCAgMHhmZSwgIDB4MTUsCi0gIDB4MDAsICAweDQwLCAgMHg4ZCwgIDB4MzAsICAweDAxLCAgMHhmNCwgIDB4MWMsICAweDA3LCAgMHgwMiwgIDB4NTEsICAweGZlLCAgMHgwNiwgIDB4ODMsICAweGZlLCAgMHgxOCwgIDB4ODAsCi0gIDB4NjEsICAweDI4LCAgMHg0NCwgIDB4MTUsICAweDU2LCAgMHgwMSwgIDB4ODUsICAweDFjLCAgMHgwNywgIDB4MDIsICAweGZlLCAgMHgzOCwgIDB4OTAsICAweGZlLCAgMHhiYSwgIDB4OTAsCi0gIDB4OTEsICAweGRlLCAgMHg3ZSwgIDB4ZGYsICAweGZlLCAgMHg0OCwgIDB4NTUsICAweDMxLCAgMHhmZSwgIDB4YzksICAweDU1LCAgMHgwMiwgIDB4MjEsICAweGI5LCAgMHg4OCwgIDB4MjAsCi0gIDB4YjksICAweDAyLCAgMHgwYSwgIDB4YmEsICAweDAxLCAgMHgxOCwgIDB4ZmUsICAweDQxLCAgMHg0OCwgIDB4MGEsICAweDU3LCAgMHgwMSwgIDB4MTgsICAweGZlLCAgMHg0OSwgIDB4NDQsCi0gIDB4MWIsICAweGZlLCAgMHgxZSwgIDB4MWQsICAweDg4LCAgMHg4OSwgIDB4MDIsICAweDBhLCAgMHg1YSwgIDB4MDEsICAweDE4LCAgMHgwOSwgIDB4MWEsICAweGE0LCAgMHgwYSwgIDB4NjcsCi0gIDB4MDEsICAweGEzLCAgMHgwYSwgIDB4NTcsICAweDAxLCAgMHgxOCwgIDB4ODgsICAweDg5LCAgMHgwMiwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4MWQsICAweDdiLCAgMHhmZSwgIDB4NTIsCi0gIDB4MWQsICAweDAzLCAgMHhmZSwgIDB4OTAsICAweDAwLCAgMHhmZSwgIDB4M2EsICAweDQ1LCAgMHhmZSwgIDB4MmMsICAweDEwLCAgMHhmZSwgIDB4NGUsICAweGU0LCAgMHhkZCwgIDB4N2IsCi0gIDB4ZmUsICAweDY0LCAgMHgxZCwgIDB4MDMsICAweGZlLCAgMHg5MiwgIDB4MDAsICAweGQxLCAgMHgxMiwgIDB4ZmUsICAweDFhLCAgMHgxMCwgIDB4ZmUsICAweDRlLCAgMHhlNCwgIDB4ZmUsCi0gIDB4MGIsICAweDAwLCAgMHg3YiwgIDB4ZmUsICAweDc2LCAgMHgxZCwgIDB4MDMsICAweGZlLCAgMHg5NCwgIDB4MDAsICAweGQxLCAgMHgyNCwgIDB4ZmUsICAweDA4LCAgMHgxMCwgIDB4MDMsCi0gIDB4ZmUsICAweDk2LCAgMHgwMCwgIDB4ZDEsICAweDYzLCAgMHhmZSwgIDB4NGUsICAweDQ1LCAgMHg4MywgIDB4Y2EsICAweGZmLCAgMHgwNCwgIDB4NjgsICAweDU0LCAgMHhmZSwgIDB4ZjEsCi0gIDB4MTAsICAweDIzLCAgMHg0OSwgIDB4ZmUsICAweDA4LCAgMHgxYywgIDB4ZmUsICAweDY3LCAgMHgxOSwgIDB4ZmUsICAweDBhLCAgMHgxYywgIDB4ZmUsICAweDFhLCAgMHhmNCwgIDB4ZmUsCi0gIDB4MDAsICAweDA0LCAgMHg4MywgIDB4YjIsICAweDFkLCAgMHg0OCwgIDB4ZmUsICAweGFhLCAgMHgxZCwgIDB4MTMsICAweDFkLCAgMHgwMiwgIDB4MDksICAweDkyLCAgMHhmZSwgIDB4NWEsCi0gIDB4ZjAsICAweGZlLCAgMHhiYSwgIDB4MWQsICAweDJlLCAgMHg5MywgIDB4ZmUsICAweDM0LCAgMHgxMCwgIDB4MDksICAweDEyLCAgMHhmZSwgIDB4NWEsICAweGYwLCAgMHhmZSwgIDB4YzgsCi0gIDB4MWQsICAweDJlLCAgMHhiNCwgIDB4ZmUsICAweDI2LCAgMHgxMCwgIDB4MDksICAweDFkLCAgMHgzNiwgIDB4MmUsICAweDYzLCAgMHhmZSwgIDB4MWEsICAweDEwLCAgMHgwOSwgIDB4MGQsCi0gIDB4MzYsICAweDJlLCAgMHg5NCwgIDB4ZjIsICAweDA5LCAgMHgwNywgIDB4MzYsICAweDJlLCAgMHg5NSwgIDB4YTEsICAweGM4LCAgMHgwMiwgIDB4MWYsICAweDkzLCAgMHgwMSwgIDB4NDIsCi0gIDB4ZmUsICAweDA0LCAgMHhmZSwgIDB4OTksICAweDAzLCAgMHg5YywgIDB4OGIsICAweDAyLCAgMHgyYSwgIDB4ZmUsICAweDFjLCAgMHgxZSwgIDB4ZmUsICAweDE0LCAgMHhmMCwgIDB4MDgsCi0gIDB4MmYsICAweGZlLCAgMHgwYywgIDB4MWUsICAweDJhLCAgMHhmZSwgIDB4MWMsICAweDFlLCAgMHg4ZiwgIDB4ZmUsICAweDFjLCAgMHgxZSwgIDB4ZmUsICAweDgyLCAgMHhmMCwgIDB4ZmUsCi0gIDB4MTAsICAweDFlLCAgMHgwMiwgIDB4MGYsICAweDNmLCAgMHgwNCwgIDB4ZmUsICAweDgwLCAgMHg4MywgIDB4MzMsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MTgsCi0gIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4OTgsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgwMiwgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODIsCi0gIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA2LCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4NiwgIDB4ODMsICAweDMzLCAgMHgwYiwgIDB4MGUsCi0gIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MWIsICAweDgwLCAgMHgwNCwgIDB4ZmUsICAweDliLCAgMHg4MywgIDB4MzMsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MDQsCi0gIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODQsICAweDgzLCAgMHgzMywgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHg4MCwgIDB4ODAsICAweDA0LCAgMHhmZSwgIDB4ODAsCi0gIDB4ODMsICAweGZlLCAgMHhjOSwgIDB4NDcsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4MTksICAweDgxLCAgMHgwNCwgIDB4ZmUsICAweDk5LCAgMHg4MywgIDB4ZmUsCi0gIDB4Y2EsICAweDQ3LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA2LCAgMHg4MywgIDB4MDQsICAweGZlLCAgMHg4NiwgIDB4ODMsICAweGZlLCAgMHhjZSwgIDB4NDcsCi0gIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgyYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4YWMsICAweDkzLCAgMHgzYSwgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsCi0gIDB4ZmUsICAweGFlLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHhhZSwgIDB4OTMsICAweDc5LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDA4LCAgMHg5MCwgIDB4MDQsCi0gIDB4ZmUsICAweDg4LCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDBmLCAgMHhmZSwgIDB4OGEsICAweDkwLCAgMHgwNCwgIDB4ZmUsICAweDhhLCAgMHg5MywgIDB4NzksCi0gIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsICAweGZlLCAgMHgwYywgIDB4OTAsICAweDA0LCAgMHhmZSwgIDB4OGMsICAweDkzLCAgMHgzYSwgIDB4MGIsICAweDBlLCAgMHgwMiwgIDB4MGYsCi0gIDB4ZmUsICAweDhlLCAgMHg5MCwgIDB4MDQsICAweGZlLCAgMHg4ZSwgIDB4OTMsICAweDc5LCAgMHgwYiwgIDB4MGUsICAweDAyLCAgMHgwZiwgIDB4ZmUsICAweDNjLCAgMHg5MCwgIDB4MDQsCi0gIDB4ZmUsICAweGJjLCAgMHg5MywgIDB4M2EsICAweDBiLCAgMHgwZSwgIDB4MDIsICAweDhiLCAgMHgwZiwgIDB4ZmUsICAweDAzLCAgMHg4MCwgIDB4MDQsICAweGZlLCAgMHg4MywgIDB4ODMsCi0gIDB4MzMsICAweDBiLCAgMHg3NywgIDB4MGUsICAweGE4LCAgMHgwMiwgIDB4ZmYsICAweDY2LCAgMHgwMCwgIDB4MDAsCitzdGF0aWMgdW5zaWduZWQgY2hhciBfYWR2X2FzYzM4QzE2MDBfYnVmW10gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHhmMiwgMHgwMCwgMHgxNiwgMHgwMCwgMHhmYywgMHgwMCwgMHgxMCwgMHgwMCwgMHhmMCwKKwkweDE4LCAweGU0LCAweDAxLCAweDAwLAorCTB4MDQsIDB4MWUsIDB4NDgsIDB4ZTQsIDB4MDMsIDB4ZjYsIDB4ZjcsIDB4MTMsIDB4MmUsIDB4MWUsIDB4MDIsIDB4MDAsCisJMHgwNywgMHgxNywgMHhjMCwgMHg1ZiwKKwkweDAwLCAweGZhLCAweGZmLCAweGZmLCAweDA0LCAweDAwLCAweDAwLCAweGY2LCAweDA5LCAweGU3LCAweDgyLCAweGU3LAorCTB4ODUsIDB4ZjAsIDB4ODYsIDB4ZjAsCisJMHg0ZSwgMHgxMCwgMHg5ZSwgMHhlNywgMHhmZiwgMHgwMCwgMHg1NSwgMHhmMCwgMHgwMSwgMHhmNiwgMHgwMywgMHgwMCwKKwkweDk4LCAweDU3LCAweDAxLCAweGU2LAorCTB4MDAsIDB4ZWEsIDB4MDAsIDB4ZWMsIDB4MDEsIDB4ZmEsIDB4MTgsIDB4ZjQsIDB4MDgsIDB4MDAsIDB4ZjAsIDB4MWQsCisJMHgzOCwgMHg1NCwgMHgzMiwgMHhmMCwKKwkweDEwLCAweDAwLCAweGMyLCAweDBlLCAweDFlLCAweGYwLCAweGQ1LCAweGYwLCAweGJjLCAweDAwLCAweDRiLCAweGU0LAorCTB4MDAsIDB4ZTYsIDB4YjEsIDB4ZjAsCisJMHhiNCwgMHgwMCwgMHgwMiwgMHgxMywgMHgzZSwgMHgxYywgMHhjOCwgMHg0NywgMHgzZSwgMHgwMCwgMHhkOCwgMHgwMSwKKwkweDA2LCAweDEzLCAweDBjLCAweDFjLAorCTB4NWUsIDB4MWUsIDB4MDAsIDB4NTcsIDB4YzgsIDB4NTcsIDB4MDEsIDB4ZmMsIDB4YmMsIDB4MGUsIDB4YTIsIDB4MTIsCisJMHhiOSwgMHg1NCwgMHgwMCwgMHg4MCwKKwkweDYyLCAweDBhLCAweDVhLCAweDEyLCAweGM4LCAweDE1LCAweDNlLCAweDFlLCAweDE4LCAweDQwLCAweGJkLCAweDU2LAorCTB4MDMsIDB4ZTYsIDB4MDEsIDB4ZWEsCisJMHg1YywgMHhmMCwgMHgwZiwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2YywgMHgwMSwgMHg2ZSwgMHgwMSwgMHgwNCwgMHgxMiwKKwkweDA0LCAweDEzLCAweGJiLCAweDU1LAorCTB4M2MsIDB4NTYsIDB4M2UsIDB4NTcsIDB4MDMsIDB4NTgsIDB4NGEsIDB4ZTQsIDB4NDAsIDB4MDAsIDB4YjYsIDB4MDAsCisJMHhiYiwgMHgwMCwgMHhjMCwgMHgwMCwKKwkweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDNlLCAweDAxLCAweDU4LCAweDBhLCAweDQ0LCAweDEwLCAweDBhLCAweDEyLAorCTB4NGMsIDB4MWMsIDB4NGUsIDB4MWMsCisJMHgwMiwgMHg0YSwgMHgzMCwgMHhlNCwgMHgwNSwgMHhlNiwgMHgwYywgMHgwMCwgMHgzYywgMHgwMCwgMHg4MCwgMHgwMCwKKwkweDI0LCAweDAxLCAweDNjLCAweDAxLAorCTB4NjgsIDB4MDEsIDB4NmEsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzYsIDB4MDEsCisJMHg3OCwgMHgwMSwgMHg3YywgMHgwMSwKKwkweGM2LCAweDBlLCAweDBjLCAweDEwLCAweGFjLCAweDEyLCAweGFlLCAweDEyLCAweDE2LCAweDFhLCAweDMyLCAweDFjLAorCTB4NmUsIDB4MWUsIDB4MDIsIDB4NDgsCisJMHgzYSwgMHg1NSwgMHhjOSwgMHg1NywgMHgwMiwgMHhlZSwgMHg1YiwgMHhmMCwgMHgwMywgMHhmNywgMHgwNiwgMHhmNywKKwkweDAzLCAweGZjLCAweDA2LCAweDAwLAorCTB4MWUsIDB4MDAsIDB4YmUsIDB4MDAsIDB4ZTEsIDB4MDAsIDB4MGMsIDB4MTIsIDB4MTgsIDB4MWEsIDB4NzAsIDB4MWEsCisJMHgzMCwgMHgxYywgMHgzOCwgMHgxYywKKwkweDEwLCAweDQ0LCAweDAwLCAweDRjLCAweGIwLCAweDU3LCAweDQwLCAweDVjLCAweDRkLCAweGU0LCAweDA0LCAweGVhLAorCTB4NWQsIDB4ZjAsIDB4YTcsIDB4ZjAsCisJMHgwNCwgMHhmNiwgMHgwMiwgMHhmYywgMHgwNSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgxOSwgMHgwMCwgMHgzMiwgMHgwMCwKKwkweDMzLCAweDAwLCAweDM0LCAweDAwLAorCTB4MzYsIDB4MDAsIDB4OTgsIDB4MDAsIDB4OWUsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MjAsIDB4MDEsIDB4NGUsIDB4MDEsCisJMHg3OSwgMHgwMSwgMHgzYywgMHgwOSwKKwkweDY4LCAweDBkLCAweDAyLCAweDEwLCAweDA0LCAweDEwLCAweDNhLCAweDEwLCAweDA4LCAweDEyLCAweDBhLCAweDEzLAorCTB4NDAsIDB4MTYsIDB4NTAsIDB4MTYsCisJMHgwMCwgMHgxNywgMHg0YSwgMHgxOSwgMHgwMCwgMHg0ZSwgMHgwMCwgMHg1NCwgMHgwMSwgMHg1OCwgMHgwMCwgMHhkYywKKwkweDA1LCAweGYwLCAweDA5LCAweGYwLAorCTB4NTksIDB4ZjAsIDB4YjgsIDB4ZjAsIDB4NDgsIDB4ZjQsIDB4MGUsIDB4ZjcsIDB4MGEsIDB4MDAsIDB4OWIsIDB4MDAsCisJMHg5YywgMHgwMCwgMHhhNCwgMHgwMCwKKwkweGI1LCAweDAwLCAweGJhLCAweDAwLCAweGQwLCAweDAwLCAweGU3LCAweDAwLCAweGYwLCAweDAzLCAweDY5LCAweDA4LAorCTB4ZTksIDB4MDksIDB4NWMsIDB4MGMsCisJMHhiNiwgMHgxMiwgMHhiYywgMHgxOSwgMHhkOCwgMHgxYiwgMHgyMCwgMHgxYywgMHgzNCwgMHgxYywgMHgzNiwgMHgxYywKKwkweDQyLCAweDFkLCAweDA4LCAweDQ0LAorCTB4MzgsIDB4NDQsIDB4OTEsIDB4NDQsIDB4MGEsIDB4NDUsIDB4NDgsIDB4NDYsIDB4ODksIDB4NDgsIDB4NjgsIDB4NTQsCisJMHg4MywgMHg1NSwgMHg4MywgMHg1OSwKKwkweDMxLCAweGU0LCAweDAyLCAweGU2LCAweDA3LCAweGYwLCAweDA4LCAweGYwLCAweDBiLCAweGYwLCAweDBjLCAweGYwLAorCTB4NGIsIDB4ZjQsIDB4MDQsIDB4ZjgsCisJMHgwNSwgMHhmOCwgMHgwMiwgMHhmYSwgMHgwMywgMHhmYSwgMHgwNCwgMHhmYywgMHgwNSwgMHhmYywgMHgwNywgMHgwMCwKKwkweGE4LCAweDAwLCAweGFhLCAweDAwLAorCTB4YjksIDB4MDAsIDB4ZTAsIDB4MDAsIDB4ZTUsIDB4MDAsIDB4MjIsIDB4MDEsIDB4MjYsIDB4MDEsIDB4NjAsIDB4MDEsCisJMHg3YSwgMHgwMSwgMHg4MiwgMHgwMSwKKwkweGM4LCAweDAxLCAweGNhLCAweDAxLCAweDg2LCAweDAyLCAweDZhLCAweDAzLCAweDE4LCAweDA1LCAweGIyLCAweDA3LAorCTB4NjgsIDB4MDgsIDB4MTAsIDB4MGQsCisJMHgwNiwgMHgxMCwgMHgwYSwgMHgxMCwgMHgwZSwgMHgxMCwgMHgxMiwgMHgxMCwgMHg2MCwgMHgxMCwgMHhlZCwgMHgxMCwKKwkweGYzLCAweDEwLCAweDA2LCAweDEyLAorCTB4MTAsIDB4MTIsIDB4MWUsIDB4MTIsIDB4MGMsIDB4MTMsIDB4MGUsIDB4MTMsIDB4MTAsIDB4MTMsIDB4ZmUsIDB4OWMsCisJMHhmMCwgMHgzNSwgMHgwNSwgMHhmZSwKKwkweGVjLCAweDBlLCAweGZmLCAweDEwLCAweDAwLCAweDAwLCAweGU5LCAweGZlLCAweDM0LCAweDFmLCAweDAwLCAweGU4LAorCTB4ZmUsIDB4ODgsIDB4MDEsIDB4ZmYsCisJMHgwMywgMHgwMCwgMHgwMCwgMHhmZSwgMHg5MywgMHgxNSwgMHhmZSwgMHgwZiwgMHgwNSwgMHhmZiwgMHgzOCwgMHgwMCwKKwkweDAwLCAweGZlLCAweDU3LCAweDI0LAorCTB4MDAsIDB4ZmUsIDB4NGMsIDB4MDAsIDB4NjUsIDB4ZmYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MWEsIDB4ZmYsIDB4MDksCisJMHgwMCwgMHgwMCwgMHhmZiwgMHgwOCwKKwkweDAxLCAweDAxLCAweGZmLCAweDA4LCAweGZmLCAweGZmLCAweGZmLCAweDI3LCAweDAwLCAweDAwLCAweGZmLCAweDEwLAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MTMsCisJMHgwMCwgMHgwMCwgMHhmZSwgMHg3OCwgMHg1NiwgMHhmZSwgMHgzNCwgMHgxMiwgMHhmZiwgMHgyMSwgMHgwMCwgMHgwMCwKKwkweGZlLCAweDA0LCAweGY3LCAweGU4LAorCTB4MzcsIDB4N2QsIDB4MGQsIDB4MDEsIDB4ZmUsIDB4NGEsIDB4MTEsIDB4ZmUsIDB4MDQsIDB4ZjcsIDB4ZTgsIDB4N2QsCisJMHgwZCwgMHg1MSwgMHgzNywgMHhmZSwKKwkweDNkLCAweGYwLCAweGZlLCAweDBjLCAweDAyLCAweGZlLCAweDIwLCAweGYwLCAweGJjLCAweGZlLCAweDkxLCAweGYwLAorCTB4ZmUsIDB4ZjgsIDB4MDEsIDB4ZmUsCisJMHg5MCwgMHhmMCwgMHhmZSwgMHhmOCwgMHgwMSwgMHhmZSwgMHg4ZiwgMHhmMCwgMHhiYywgMHgwMywgMHg2NywgMHg0ZCwKKwkweDA1LCAweGZlLCAweDA4LCAweDBmLAorCTB4MDEsIDB4ZmUsIDB4NzgsIDB4MGYsIDB4ZmUsIDB4ZGQsIDB4MTIsIDB4MDUsIDB4ZmUsIDB4MGUsIDB4MDMsIDB4ZmUsCisJMHgyOCwgMHgxYywgMHgwMywgMHhmZSwKKwkweGE2LCAweDAwLCAweGZlLCAweGQxLCAweDEyLCAweDNlLCAweDIyLCAweGZlLCAweGE2LCAweDAwLCAweGFjLCAweGZlLAorCTB4NDgsIDB4ZjAsIDB4ZmUsIDB4OTAsCisJMHgwMiwgMHhmZSwgMHg0OSwgMHhmMCwgMHhmZSwgMHhhYSwgMHgwMiwgMHhmZSwgMHg0YSwgMHhmMCwgMHhmZSwgMHhjOCwKKwkweDAyLCAweGZlLCAweDQ2LCAweGYwLAorCTB4ZmUsIDB4NWEsIDB4MDIsIDB4ZmUsIDB4NDcsIDB4ZjAsIDB4ZmUsIDB4NjAsIDB4MDIsIDB4ZmUsIDB4NDMsIDB4ZjAsCisJMHhmZSwgMHg0ZSwgMHgwMiwgMHhmZSwKKwkweDQ0LCAweGYwLCAweGZlLCAweDUyLCAweDAyLCAweGZlLCAweDQ1LCAweGYwLCAweGZlLCAweDU2LCAweDAyLCAweDFjLAorCTB4MGQsIDB4YTIsIDB4MWMsIDB4MDcsCisJMHgyMiwgMHhiNywgMHgwNSwgMHgzNSwgMHhmZSwgMHgwMCwgMHgxYywgMHhmZSwgMHhmMSwgMHgxMCwgMHhmZSwgMHgwMiwKKwkweDFjLCAweGY1LCAweGZlLCAweDFlLAorCTB4MWMsIDB4ZmUsIDB4ZTksIDB4MTAsIDB4MDEsIDB4NWYsIDB4ZmUsIDB4ZTcsIDB4MTAsIDB4ZmUsIDB4MDYsIDB4ZmMsCisJMHhkZSwgMHgwYSwgMHg4MSwgMHgwMSwKKwkweGEzLCAweDA1LCAweDM1LCAweDFmLCAweDk1LCAweDQ3LCAweGI4LCAweDAxLCAweGZlLCAweGU0LCAweDExLCAweDBhLAorCTB4ODEsIDB4MDEsIDB4NWMsIDB4ZmUsCisJMHhiZCwgMHgxMCwgMHgwYSwgMHg4MSwgMHgwMSwgMHg1YywgMHhmZSwgMHhhZCwgMHgxMCwgMHhmZSwgMHgxNiwgMHgxYywKKwkweGZlLCAweDU4LCAweDFjLCAweDFjLAorCTB4MDcsIDB4MjIsIDB4YjcsIDB4MzcsIDB4MmEsIDB4MzUsIDB4ZmUsIDB4M2QsIDB4ZjAsIDB4ZmUsIDB4MGMsIDB4MDIsCisJMHgyYiwgMHhmZSwgMHg5ZSwgMHgwMiwKKwkweGZlLCAweDVhLCAweDFjLCAweGZlLCAweDEyLCAweDFjLCAweGZlLCAweDE0LCAweDFjLCAweDFmLCAweGZlLCAweDMwLAorCTB4MDAsIDB4NDcsIDB4YjgsIDB4MDEsCisJMHhmZSwgMHhkNCwgMHgxMSwgMHgxYywgMHgwNywgMHgyMiwgMHhiNywgMHgwNSwgMHhlOSwgMHgyMSwgMHgyYywgMHgwOSwKKwkweDFhLCAweDMxLCAweGZlLCAweDY5LAorCTB4MTAsIDB4MWMsIDB4MDcsIDB4MjIsIDB4YjcsIDB4ZmUsIDB4MDQsIDB4ZWMsIDB4MmMsIDB4NjAsIDB4MDEsIDB4ZmUsCisJMHgxZSwgMHgxZSwgMHgyMCwgMHgyYywKKwkweGZlLCAweDA1LCAweGY2LCAweGRlLCAweDAxLCAweGZlLCAweDYyLCAweDFiLCAweDAxLCAweDBjLCAweDYxLCAweDRhLAorCTB4NDQsIDB4MTUsIDB4NTYsIDB4NTEsCisJMHgwMSwgMHhmZSwgMHg5ZSwgMHgxZSwgMHgwMSwgMHhmZSwgMHg5NiwgMHgxYSwgMHgwNSwgMHgzNSwgMHgwYSwgMHg1NywKKwkweDAxLCAweDE4LCAweDA5LCAweDAwLAorCTB4MzYsIDB4MDEsIDB4ODUsIDB4ZmUsIDB4MTgsIDB4MTAsIDB4ZmUsIDB4NDEsIDB4NTgsIDB4MGEsIDB4YmEsIDB4MDEsCisJMHgxOCwgMHhmZSwgMHhjOCwgMHg1NCwKKwkweDdiLCAweGZlLCAweDFjLCAweDAzLCAweDAxLCAweGZlLCAweDk2LCAweDFhLCAweDA1LCAweDM1LCAweDM3LCAweDYwLAorCTB4ZmUsIDB4MDIsIDB4ZTgsIDB4MzAsCisJMHhmZSwgMHhiZiwgMHg1NywgMHhmZSwgMHg5ZSwgMHg0MywgMHhmZSwgMHg3NywgMHg1NywgMHhmZSwgMHgyNywgMHhmMCwKKwkweGZlLCAweGU0LCAweDAxLCAweGZlLAorCTB4MDcsIDB4NGIsIDB4ZmUsIDB4MjAsIDB4ZjAsIDB4YmMsIDB4ZmUsIDB4NDAsIDB4MWMsIDB4MmEsIDB4ZWIsIDB4ZmUsCisJMHgyNiwgMHhmMCwgMHhmZSwgMHg2NiwKKwkweDAzLCAweGZlLCAweGEwLCAweGYwLCAweGZlLCAweDU0LCAweDAzLCAweGZlLCAweDExLCAweGYwLCAweGJjLCAweGZlLAorCTB4ZWYsIDB4MTAsIDB4ZmUsIDB4OWYsCisJMHhmMCwgMHhmZSwgMHg3NCwgMHgwMywgMHhmZSwgMHg0NiwgMHgxYywgMHgxOSwgMHhmZSwgMHgxMSwgMHgwMCwgMHgwNSwKKwkweDcwLCAweDM3LCAweGZlLCAweDQ4LAorCTB4MWMsIDB4ZmUsIDB4NDYsIDB4MWMsIDB4MDEsIDB4MGMsIDB4MDYsIDB4MjgsIDB4ZmUsIDB4MTgsIDB4MTMsIDB4MjYsCisJMHgyMSwgMHhiOSwgMHhjNywgMHgyMCwKKwkweGI5LCAweDBhLCAweDU3LCAweDAxLCAweDE4LCAweGM3LCAweDg5LCAweDAxLCAweGZlLCAweGM4LCAweDFhLCAweDE1LAorCTB4ZTEsIDB4MmEsIDB4ZWIsIDB4ZmUsCisJMHgwMSwgMHhmMCwgMHhlYiwgMHhmZSwgMHg4MiwgMHhmMCwgMHhmZSwgMHhhNCwgMHgwMywgMHhmZSwgMHg5YywgMHgzMiwKKwkweDE1LCAweGZlLCAweGU0LCAweDAwLAorCTB4MmYsIDB4ZmUsIDB4YjYsIDB4MDMsIDB4MmEsIDB4M2MsIDB4MTYsIDB4ZmUsIDB4YzYsIDB4MDMsIDB4MDEsIDB4NDEsCisJMHhmZSwgMHgwNiwgMHhmMCwgMHhmZSwKKwkweGQ2LCAweDAzLCAweGFmLCAweGEwLCAweGZlLCAweDBhLCAweGYwLCAweGZlLCAweGEyLCAweDA3LCAweDA1LCAweDI5LAorCTB4MDMsIDB4ODEsIDB4MWUsIDB4MWIsCisJMHhmZSwgMHgyNCwgMHgwNSwgMHgxZiwgMHg2MywgMHgwMSwgMHg0MiwgMHg4ZiwgMHhmZSwgMHg3MCwgMHgwMiwgMHgwNSwKKwkweGVhLCAweGZlLCAweDQ2LCAweDFjLAorCTB4MzcsIDB4N2QsIDB4MWQsIDB4ZmUsIDB4NjcsIDB4MWIsIDB4ZmUsIDB4YmYsIDB4NTcsIDB4ZmUsIDB4NzcsIDB4NTcsCisJMHhmZSwgMHg0OCwgMHgxYywgMHg3NSwKKwkweDAxLCAweGE2LCAweDg2LCAweDBhLCAweDU3LCAweDAxLCAweDE4LCAweDA5LCAweDAwLCAweDFiLCAweGVjLCAweDBhLAorCTB4ZTEsIDB4MDEsIDB4MTgsIDB4NzcsCisJMHg1MCwgMHg0MCwgMHg4ZCwgMHgzMCwgMHgwMywgMHg4MSwgMHgxZSwgMHhmOCwgMHgxZiwgMHg2MywgMHgwMSwgMHg0MiwKKwkweDhmLCAweGZlLCAweDcwLCAweDAyLAorCTB4MDUsIDB4ZWEsIDB4ZDcsIDB4OTksIDB4ZDgsIDB4OWMsIDB4MmEsIDB4MjksIDB4MmYsIDB4ZmUsIDB4NGUsIDB4MDQsCisJMHgxNiwgMHhmZSwgMHg0YSwgMHgwNCwKKwkweDdlLCAweGZlLCAweGEwLCAweDAwLCAweGZlLCAweDliLCAweDU3LCAweGZlLCAweDU0LCAweDEyLCAweDMyLCAweGZmLAorCTB4MDIsIDB4MDAsIDB4MTAsIDB4MDEsCisJMHgwOCwgMHgxNiwgMHhmZSwgMHgwMiwgMHgwNSwgMHgzMiwgMHgwMSwgMHgwOCwgMHgxNiwgMHgyOSwgMHgyNywgMHgyNSwKKwkweGVlLCAweGZlLCAweDRjLCAweDQ0LAorCTB4ZmUsIDB4NTgsIDB4MTIsIDB4NTAsIDB4ZmUsIDB4NDQsIDB4NDgsIDB4MTMsIDB4MzQsIDB4ZmUsIDB4NGMsIDB4NTQsCisJMHg3YiwgMHhlYywgMHg2MCwgMHg4ZCwKKwkweDMwLCAweDAxLCAweGZlLCAweDRlLCAweDFlLCAweGZlLCAweDQ4LCAweDQ3LCAweGZlLCAweDdjLCAweDEzLCAweDAxLAorCTB4MGMsIDB4MDYsIDB4MjgsIDB4ZmUsCisJMHgzMiwgMHgxMywgMHgwMSwgMHg0MywgMHgwOSwgMHg5YiwgMHhmZSwgMHg2OCwgMHgxMywgMHhmZSwgMHgyNiwgMHgxMCwKKwkweDEzLCAweDM0LCAweGZlLCAweDRjLAorCTB4NTQsIDB4N2IsIDB4ZWMsIDB4MDEsIDB4ZmUsIDB4NGUsIDB4MWUsIDB4ZmUsIDB4NDgsIDB4NDcsIDB4ZmUsIDB4NTQsCisJMHgxMywgMHgwMSwgMHgwYywgMHgwNiwKKwkweDI4LCAweGE1LCAweDAxLCAweDQzLCAweDA5LCAweDliLCAweGZlLCAweDQwLCAweDEzLCAweDAxLCAweDBjLCAweDA2LAorCTB4MjgsIDB4ZjksIDB4MWYsIDB4N2YsCisJMHgwMSwgMHgwYywgMHgwNiwgMHgwNywgMHg0ZCwgMHgxZiwgMHhmZSwgMHgwZCwgMHgwMCwgMHgwMSwgMHg0MiwgMHg4ZiwKKwkweGZlLCAweGE0LCAweDBlLCAweDA1LAorCTB4MjksIDB4MzIsIDB4MTUsIDB4ZmUsIDB4ZTYsIDB4MDAsIDB4MGYsIDB4ZmUsIDB4MWMsIDB4OTAsIDB4MDQsIDB4ZmUsCisJMHg5YywgMHg5MywgMHgzYSwgMHgwYiwKKwkweDBlLCAweDhiLCAweDAyLCAweDFmLCAweDdmLCAweDAxLCAweDQyLCAweDA1LCAweDM1LCAweGZlLCAweDQyLCAweDViLAorCTB4N2QsIDB4MWQsIDB4ZmUsIDB4NDYsCisJMHg1OSwgMHhmZSwgMHhiZiwgMHg1NywgMHhmZSwgMHg3NywgMHg1NywgMHgwZiwgMHhmZSwgMHg4NywgMHg4MCwgMHgwNCwKKwkweGZlLCAweDg3LCAweDgzLCAweGZlLAorCTB4YzksIDB4NDcsIDB4MGIsIDB4MGUsIDB4ZDAsIDB4NjUsIDB4MDEsIDB4MGMsIDB4MDYsIDB4MGQsIDB4ZmUsIDB4OTgsCisJMHgxMywgMHgwZiwgMHhmZSwgMHgyMCwKKwkweDgwLCAweDA0LCAweGZlLCAweGEwLCAweDgzLCAweDMzLCAweDBiLCAweDBlLCAweDA5LCAweDFkLCAweGZlLCAweDg0LAorCTB4MTIsIDB4MDEsIDB4MzgsIDB4MDYsCisJMHgwNywgMHhmZSwgMHg3MCwgMHgxMywgMHgwMywgMHhmZSwgMHhhMiwgMHgwMCwgMHgxZSwgMHgxYiwgMHhmZSwgMHhkYSwKKwkweDA1LCAweGQwLCAweDU0LCAweDAxLAorCTB4MzgsIDB4MDYsIDB4MGQsIDB4ZmUsIDB4NTgsIDB4MTMsIDB4MDMsIDB4ZmUsIDB4YTAsIDB4MDAsIDB4MWUsIDB4ZmUsCisJMHg1MCwgMHgxMiwgMHg1ZSwgMHhmZiwKKwkweDAyLCAweDAwLCAweDEwLCAweDJmLCAweGZlLCAweDkwLCAweDA1LCAweDJhLCAweDNjLCAweGNjLCAweGZmLCAweDAyLAorCTB4MDAsIDB4MTAsIDB4MmYsIDB4ZmUsCisJMHg5ZSwgMHgwNSwgMHgxNywgMHhmZSwgMHhmNCwgMHgwNSwgMHgxNSwgMHhmZSwgMHhlMywgMHgwMCwgMHgyNiwgMHgwMSwKKwkweDM4LCAweGZlLCAweDRhLCAweGYwLAorCTB4ZmUsIDB4YzAsIDB4MDUsIDB4ZmUsIDB4NDksIDB4ZjAsIDB4ZmUsIDB4YmEsIDB4MDUsIDB4NzEsIDB4MmUsIDB4ZmUsCisJMHgyMSwgMHgwMCwgMHhmMSwgMHgyZSwKKwkweGZlLCAweDIyLCAweDAwLCAweGEyLCAweDJlLCAweDRhLCAweGZlLCAweDA5LCAweDQ4LCAweGZmLCAweDAyLCAweDAwLAorCTB4MTAsIDB4MmYsIDB4ZmUsIDB4ZDAsCisJMHgwNSwgMHgxNywgMHhmZSwgMHhmNCwgMHgwNSwgMHhmZSwgMHhlMiwgMHgwOCwgMHgwMSwgMHgzOCwgMHgwNiwgMHhmZSwKKwkweDFjLCAweDAwLCAweDRkLCAweDAxLAorCTB4YTcsIDB4MmUsIDB4MDcsIDB4MjAsIDB4ZTQsIDB4NDcsIDB4ZmUsIDB4MjcsIDB4MDEsIDB4MDEsIDB4MGMsIDB4MDYsCisJMHgyOCwgMHhmZSwgMHgyNCwgMHgxMiwKKwkweDNlLCAweDAxLCAweDg0LCAweDFmLCAweDdmLCAweDAxLCAweDBjLCAweDA2LCAweDA3LCAweDRkLCAweDFmLCAweGZlLAorCTB4MGQsIDB4MDAsIDB4MDEsIDB4NDIsCisJMHg4ZiwgMHhmZSwgMHhhNCwgMHgwZSwgMHgwNSwgMHgyOSwgMHgwMywgMHhlNiwgMHgxZSwgMHhmZSwgMHhjYSwgMHgxMywKKwkweDAzLCAweGI2LCAweDFlLCAweGZlLAorCTB4NDAsIDB4MTIsIDB4MDMsIDB4NjYsIDB4MWUsIDB4ZmUsIDB4MzgsIDB4MTMsIDB4M2UsIDB4MDEsIDB4ODQsIDB4MTcsCisJMHhmZSwgMHg3MiwgMHgwNiwgMHgwYSwKKwkweDA3LCAweDAxLCAweDM4LCAweDA2LCAweDI0LCAweGZlLCAweDAyLCAweDEyLCAweDRmLCAweDAxLCAweGZlLCAweDU2LAorCTB4MTksIDB4MTYsIDB4ZmUsIDB4NjgsCisJMHgwNiwgMHgxNSwgMHg4MiwgMHgwMSwgMHg0MSwgMHgxNSwgMHhlMiwgMHgwMywgMHg2NiwgMHg4YSwgMHgxMCwgMHg2NiwKKwkweDAzLCAweDlhLCAweDFlLCAweGZlLAorCTB4NzAsIDB4MTIsIDB4MDMsIDB4NTUsIDB4MWUsIDB4ZmUsIDB4NjgsIDB4MTMsIDB4MDEsIDB4YzYsIDB4MDksIDB4MTIsCisJMHg0OCwgMHhmZSwgMHg5MiwgMHgwNiwKKwkweDJlLCAweDEyLCAweDAxLCAweGZlLCAweGFjLCAweDFkLCAweGZlLCAweDQzLCAweDQ4LCAweDYyLCAweDgwLCAweDEzLAorCTB4NTgsIDB4ZmYsIDB4MDIsIDB4MDAsCisJMHg1NywgMHg1MiwgMHhhZCwgMHgyMywgMHgzZiwgMHg0ZSwgMHg2MiwgMHg0OSwgMHgzZSwgMHgwMSwgMHg4NCwgMHgxNywKKwkweGZlLCAweGVhLCAweDA2LCAweDAxLAorCTB4MzgsIDB4MDYsIDB4MTIsIDB4ZjcsIDB4NDUsIDB4MGEsIDB4OTUsIDB4MDEsIDB4ZmUsIDB4ODQsIDB4MTksIDB4MTYsCisJMHhmZSwgMHhlMCwgMHgwNiwgMHgxNSwKKwkweDgyLCAweDAxLCAweDQxLCAweDE1LCAweGUyLCAweDAzLCAweDU1LCAweDhhLCAweDEwLCAweDU1LCAweDFjLCAweDA3LAorCTB4MDEsIDB4ODQsIDB4ZmUsIDB4YWUsCisJMHgxMCwgMHgwMywgMHg2ZiwgMHgxZSwgMHhmZSwgMHg5ZSwgMHgxMywgMHgzZSwgMHgwMSwgMHg4NCwgMHgwMywgMHg5YSwKKwkweDFlLCAweGZlLCAweDFhLCAweDEyLAorCTB4MDEsIDB4MzgsIDB4MDYsIDB4MTIsIDB4ZmMsIDB4MDEsIDB4YzYsIDB4MDEsIDB4ZmUsIDB4YWMsIDB4MWQsIDB4ZmUsCisJMHg0MywgMHg0OCwgMHg2MiwgMHg4MCwKKwkweGYwLCAweDQ1LCAweDBhLCAweDk1LCAweDAzLCAweGI2LCAweDFlLCAweGY4LCAweDAxLCAweDM4LCAweDA2LCAweDI0LAorCTB4MzYsIDB4ZmUsIDB4MDIsIDB4ZjYsCisJMHgwNywgMHg3MSwgMHg3OCwgMHg4YywgMHgwMCwgMHg0ZCwgMHg2MiwgMHg0OSwgMHgzZSwgMHgyZCwgMHg5MywgMHg0ZSwKKwkweGQwLCAweDBkLCAweDE3LCAweGZlLAorCTB4OWEsIDB4MDcsIDB4MDEsIDB4ZmUsIDB4YzAsIDB4MTksIDB4MTYsIDB4ZmUsIDB4OTAsIDB4MDcsIDB4MjYsIDB4MjAsCisJMHg5ZSwgMHgxNSwgMHg4MiwgMHgwMSwKKwkweDQxLCAweDE1LCAweGUyLCAweDIxLCAweDllLCAweDA5LCAweDA3LCAweGZiLCAweDAzLCAweGU2LCAweGZlLCAweDU4LAorCTB4NTcsIDB4MTAsIDB4ZTYsIDB4MDUsCisJMHhmZSwgMHgyYSwgMHgwNiwgMHgwMywgMHg2ZiwgMHg4YSwgMHgxMCwgMHg2ZiwgMHgxYywgMHgwNywgMHgwMSwgMHg4NCwKKwkweGZlLCAweDljLCAweDMyLCAweDVmLAorCTB4NzUsIDB4MDEsIDB4YTYsIDB4ODYsIDB4MTUsIDB4ZmUsIDB4ZTIsIDB4MDAsIDB4MmYsIDB4ZWQsIDB4MmEsIDB4M2MsCisJMHhmZSwgMHgwYSwgMHhmMCwgMHhmZSwKKwkweGNlLCAweDA3LCAweGFlLCAweGZlLCAweDk2LCAweDA4LCAweGZlLCAweDA2LCAweGYwLCAweGZlLCAweDllLCAweDA4LAorCTB4YWYsIDB4YTAsIDB4MDUsIDB4MjksCisJMHgwMSwgMHgwYywgMHgwNiwgMHgwZCwgMHhmZSwgMHgyZSwgMHgxMiwgMHgxNCwgMHgxZCwgMHgwMSwgMHgwOCwgMHgxNCwKKwkweDAwLCAweDAxLCAweDA4LCAweDE0LAorCTB4MDAsIDB4MDEsIDB4MDgsIDB4MTQsIDB4MDAsIDB4MDEsIDB4MDgsIDB4ZmUsIDB4OTksIDB4YTQsIDB4MDEsIDB4MDgsCisJMHgxNCwgMHgwMCwgMHgwNSwgMHhmZSwKKwkweGM2LCAweDA5LCAweDAxLCAweDc2LCAweDA2LCAweDEyLCAweGZlLCAweDNhLCAweDEyLCAweDAxLCAweDBjLCAweDA2LAorCTB4MTIsIDB4ZmUsIDB4MzAsIDB4MTMsCisJMHgxNCwgMHhmZSwgMHgxYiwgMHgwMCwgMHgwMSwgMHgwOCwgMHgxNCwgMHgwMCwgMHgwMSwgMHgwOCwgMHgxNCwgMHgwMCwKKwkweDAxLCAweDA4LCAweDE0LCAweDAwLAorCTB4MDEsIDB4MDgsIDB4MTQsIDB4MDcsIDB4MDEsIDB4MDgsIDB4MTQsIDB4MDAsIDB4MDUsIDB4ZWYsIDB4N2MsIDB4NGEsCisJMHg3OCwgMHg0ZiwgMHgwZiwgMHhmZSwKKwkweDlhLCAweDgxLCAweDA0LCAweGZlLCAweDlhLCAweDgzLCAweGZlLCAweGNiLCAweDQ3LCAweDBiLCAweDBlLCAweDJkLAorCTB4MjgsIDB4NDgsIDB4ZmUsIDB4NmMsCisJMHgwOCwgMHgwYSwgMHgyOCwgMHhmZSwgMHgwOSwgMHg2ZiwgMHhjYSwgMHhmZSwgMHhjYSwgMHg0NSwgMHhmZSwgMHgzMiwKKwkweDEyLCAweDUzLCAweDYzLCAweDRlLAorCTB4N2MsIDB4OTcsIDB4MmYsIDB4ZmUsIDB4N2UsIDB4MDgsIDB4MmEsIDB4M2MsIDB4ZmUsIDB4MGEsIDB4ZjAsIDB4ZmUsCisJMHg2YywgMHgwOCwgMHhhZiwgMHhhMCwKKwkweGFlLCAweGZlLCAweDk2LCAweDA4LCAweDA1LCAweDI5LCAweDAxLCAweDQxLCAweDA1LCAweGVkLCAweDE0LCAweDI0LAorCTB4MDUsIDB4ZWQsIDB4ZmUsIDB4OWMsCisJMHhmNywgMHg5ZiwgMHgwMSwgMHhmZSwgMHhhZSwgMHgxZSwgMHhmZSwgMHgxOCwgMHg1OCwgMHgwMSwgMHhmZSwgMHhiZSwKKwkweDFlLCAweGZlLCAweDk5LCAweDU4LAorCTB4ZmUsIDB4NzgsIDB4MTgsIDB4ZmUsIDB4ZjksIDB4MTgsIDB4OGUsIDB4ZmUsIDB4MTYsIDB4MDksIDB4MTAsIDB4NmEsCisJMHgyMiwgMHg2YiwgMHgwMSwgMHgwYywKKwkweDYxLCAweDU0LCAweDQ0LCAweDIxLCAweDJjLCAweDA5LCAweDFhLCAweGY4LCAweDc3LCAweDAxLCAweGZlLCAweDdlLAorCTB4MWUsIDB4NDcsIDB4MmMsIDB4N2EsCisJMHgzMCwgMHhmMCwgMHhmZSwgMHg4MywgMHhlNywgMHhmZSwgMHgzZiwgMHgwMCwgMHg3MSwgMHhmZSwgMHgwMywgMHg0MCwKKwkweDAxLCAweDBjLCAweDYxLCAweDY1LAorCTB4NDQsIDB4MDEsIDB4YzIsIDB4YzgsIDB4ZmUsIDB4MWYsIDB4NDAsIDB4MjAsIDB4NmUsIDB4MDEsIDB4ZmUsIDB4NmEsCisJMHgxNiwgMHhmZSwgMHgwOCwgMHg1MCwKKwkweGZlLCAweDhhLCAweDUwLCAweGZlLCAweDQ0LCAweDUxLCAweGZlLCAweGM2LCAweDUxLCAweGZlLCAweDEwLCAweDEwLAorCTB4MDEsIDB4ZmUsIDB4Y2UsIDB4MWUsCisJMHgwMSwgMHhmZSwgMHhkZSwgMHgxZSwgMHgxMCwgMHg2OCwgMHgyMiwgMHg2OSwgMHgwMSwgMHhmZSwgMHhlZSwgMHgxZSwKKwkweDAxLCAweGZlLCAweGZlLCAweDFlLAorCTB4ZmUsIDB4NDAsIDB4NTAsIDB4ZmUsIDB4YzIsIDB4NTAsIDB4MTAsIDB4NGIsIDB4MjIsIDB4NGMsIDB4ZmUsIDB4OGEsCisJMHgxMCwgMHgwMSwgMHgwYywgMHgwNiwKKwkweDU0LCAweGZlLCAweDUwLCAweDEyLCAweDAxLCAweGZlLCAweGFlLCAweDFlLCAweDAxLCAweGZlLCAweGJlLCAweDFlLAorCTB4MTAsIDB4NmEsIDB4MjIsIDB4NmIsCisJMHgwMSwgMHgwYywgMHgwNiwgMHg2NSwgMHg0ZSwgMHgwMSwgMHhjMiwgMHgwZiwgMHhmZSwgMHgxZiwgMHg4MCwgMHgwNCwKKwkweGZlLCAweDlmLCAweDgzLCAweDMzLAorCTB4MGIsIDB4MGUsIDB4MjAsIDB4NmUsIDB4MGYsIDB4ZmUsIDB4NDQsIDB4OTAsIDB4MDQsIDB4ZmUsIDB4YzQsIDB4OTMsCisJMHgzYSwgMHgwYiwgMHhmZSwgMHhjNiwKKwkweDkwLCAweDA0LCAweGZlLCAweGM2LCAweDkzLCAweDc5LCAweDBiLCAweDBlLCAweDEwLCAweDZjLCAweDIyLCAweDZkLAorCTB4MDEsIDB4ZmUsIDB4Y2UsIDB4MWUsCisJMHgwMSwgMHhmZSwgMHhkZSwgMHgxZSwgMHgxMCwgMHg2OCwgMHgyMiwgMHg2OSwgMHgwZiwgMHhmZSwgMHg0MCwgMHg5MCwKKwkweDA0LCAweGZlLCAweGMwLCAweDkzLAorCTB4M2EsIDB4MGIsIDB4ZmUsIDB4YzIsIDB4OTAsIDB4MDQsIDB4ZmUsIDB4YzIsIDB4OTMsIDB4NzksIDB4MGIsIDB4MGUsCisJMHgxMCwgMHg0YiwgMHgyMiwgMHg0YywKKwkweDEwLCAweDY0LCAweDIyLCAweDM0LCAweDAxLCAweDBjLCAweDYxLCAweDI0LCAweDQ0LCAweDM3LCAweDEzLCAweGZlLAorCTB4NGUsIDB4MTEsIDB4MmYsIDB4ZmUsCisJMHhkZSwgMHgwOSwgMHhmZSwgMHg5ZSwgMHhmMCwgMHhmZSwgMHhmMiwgMHgwOSwgMHhmZSwgMHgwMSwgMHg0OCwgMHgxYiwKKwkweDNjLCAweDM3LCAweDg4LCAweGY1LAorCTB4ZDQsIDB4ZmUsIDB4MWUsIDB4MGEsIDB4ZDUsIDB4ZmUsIDB4NDIsIDB4MGEsIDB4ZDIsIDB4ZmUsIDB4MWUsIDB4MGEsCisJMHhkMywgMHhmZSwgMHg0MiwgMHgwYSwKKwkweGFlLCAweGZlLCAweDEyLCAweDBhLCAweGZlLCAweDA2LCAweGYwLCAweGZlLCAweDE4LCAweDBhLCAweGFmLCAweGEwLAorCTB4MDUsIDB4MjksIDB4MDEsIDB4NDEsCisJMHhmZSwgMHhjMSwgMHgxMCwgMHgxNCwgMHgyNCwgMHhmZSwgMHhjMSwgMHgxMCwgMHgwMSwgMHg3NiwgMHgwNiwgMHgwNywKKwkweGZlLCAweDE0LCAweDEyLCAweDAxLAorCTB4NzYsIDB4MDYsIDB4MGQsIDB4NWQsIDB4MDEsIDB4MGMsIDB4MDYsIDB4MGQsIDB4ZmUsIDB4NzQsIDB4MTIsIDB4ZmUsCisJMHgyZSwgMHgxYywgMHgwNSwgMHhmZSwKKwkweDFhLCAweDBjLCAweDAxLCAweDc2LCAweDA2LCAweDA3LCAweDVkLCAweDAxLCAweDc2LCAweDA2LCAweDBkLCAweDQxLAorCTB4ZmUsIDB4MmMsIDB4MWMsIDB4ZmUsCisJMHhhYSwgMHhmMCwgMHhmZSwgMHhjZSwgMHgwYSwgMHhmZSwgMHhhYywgMHhmMCwgMHhmZSwgMHg2NiwgMHgwYSwgMHhmZSwKKwkweDkyLCAweDEwLCAweGM0LCAweGY2LAorCTB4ZmUsIDB4YWQsIDB4ZjAsIDB4ZmUsIDB4NzIsIDB4MGEsIDB4MDUsIDB4ZmUsIDB4MWEsIDB4MGMsIDB4YzUsIDB4ZmUsCisJMHhlNywgMHgxMCwgMHhmZSwgMHgyYiwKKwkweGYwLCAweGJmLCAweGZlLCAweDZiLCAweDE4LCAweDIzLCAweGZlLCAweDAwLCAweGZlLCAweGZlLCAweDFjLCAweDEyLAorCTB4YWMsIDB4ZmUsIDB4ZDIsIDB4ZjAsCisJMHhiZiwgMHhmZSwgMHg3NiwgMHgxOCwgMHgyMywgMHgxZCwgMHgxYiwgMHhiZiwgMHgwMywgMHhlMywgMHgyMywgMHgwNywKKwkweDFiLCAweGJmLCAweGQ0LCAweDViLAorCTB4ZDUsIDB4NWIsIDB4ZDIsIDB4NWIsIDB4ZDMsIDB4NWIsIDB4YzQsIDB4YzUsIDB4ZmUsIDB4YTksIDB4MTAsIDB4NzUsCisJMHg1ZSwgMHgzMiwgMHgxZiwgMHg3ZiwKKwkweDAxLCAweDQyLCAweDE5LCAweGZlLCAweDM1LCAweDAwLCAweGZlLCAweDAxLCAweGYwLCAweDcwLCAweDE5LCAweDk4LAorCTB4MDUsIDB4NzAsIDB4ZmUsIDB4NzQsCisJMHgxOCwgMHgyMywgMHhmZSwgMHgwMCwgMHhmOCwgMHgxYiwgMHg1YiwgMHg3ZCwgMHgxMiwgMHgwMSwgMHhmZSwgMHg3OCwKKwkweDBmLCAweDRkLCAweDAxLCAweGZlLAorCTB4OTYsIDB4MWEsIDB4MjEsIDB4MzAsIDB4NzcsIDB4N2QsIDB4MWQsIDB4MDUsIDB4NWIsIDB4MDEsIDB4MGMsIDB4MDYsCisJMHgwZCwgMHgyYiwgMHhmZSwgMHhlMiwKKwkweDBiLCAweDAxLCAweDBjLCAweDA2LCAweDU0LCAweGZlLCAweGE2LCAweDEyLCAweDAxLCAweDBjLCAweDA2LCAweDI0LAorCTB4ZmUsIDB4ODgsIDB4MTMsIDB4MjEsCisJMHg2ZSwgMHhjNywgMHgwMSwgMHhmZSwgMHgxZSwgMHgxZiwgMHgwZiwgMHhmZSwgMHg4MywgMHg4MCwgMHgwNCwgMHhmZSwKKwkweDgzLCAweDgzLCAweGZlLCAweGM5LAorCTB4NDcsIDB4MGIsIDB4MGUsIDB4ZmUsIDB4YzgsIDB4NDQsIDB4ZmUsIDB4NDIsIDB4MTMsIDB4MGYsIDB4ZmUsIDB4MDQsCisJMHg5MSwgMHgwNCwgMHhmZSwgMHg4NCwKKwkweDkzLCAweGZlLCAweGNhLCAweDU3LCAweDBiLCAweGZlLCAweDg2LCAweDkxLCAweDA0LCAweGZlLCAweDg2LCAweDkzLAorCTB4ZmUsIDB4Y2IsIDB4NTcsIDB4MGIsCisJMHgwZSwgMHg3YSwgMHgzMCwgMHhmZSwgMHg0MCwgMHg1OSwgMHhmZSwgMHhjMSwgMHg1OSwgMHg4ZSwgMHg0MCwgMHgwMywKKwkweDZhLCAweDNiLCAweDZiLCAweDEwLAorCTB4OTcsIDB4MjIsIDB4OTgsIDB4ZDksIDB4NmEsIDB4ZGEsIDB4NmIsIDB4MDEsIDB4YzIsIDB4YzgsIDB4N2EsIDB4MzAsCisJMHgyMCwgMHg2ZSwgMHhkYiwgMHg2NCwKKwkweGRjLCAweDM0LCAweDkxLCAweDZjLCAweDdlLCAweDZkLCAweGZlLCAweDQ0LCAweDU1LCAweGZlLCAweGU1LCAweDU1LAorCTB4ZmUsIDB4MDQsIDB4ZmEsIDB4NjQsCisJMHhmZSwgMHgwNSwgMHhmYSwgMHgzNCwgMHgwMSwgMHhmZSwgMHg2YSwgMHgxNiwgMHhhMywgMHgyNiwgMHgxMCwgMHg5NywKKwkweDEwLCAweDk4LCAweDkxLCAweDZjLAorCTB4N2UsIDB4NmQsIDB4ZmUsIDB4MTQsIDB4MTAsIDB4MDEsIDB4MGMsIDB4MDYsIDB4MjQsIDB4MWIsIDB4NDAsIDB4OTEsCisJMHg0YiwgMHg3ZSwgMHg0YywgMHgwMSwKKwkweDBjLCAweDA2LCAweGZlLCAweGY3LCAweDAwLCAweDQ0LCAweDAzLCAweDY4LCAweDNiLCAweDY5LCAweGZlLCAweDEwLAorCTB4NTgsIDB4ZmUsIDB4OTEsIDB4NTgsCisJMHhmZSwgMHgxNCwgMHg1OSwgMHhmZSwgMHg5NSwgMHg1OSwgMHgwNSwgMHg1YiwgMHgwMSwgMHgwYywgMHgwNiwgMHgyNCwKKwkweDFiLCAweDQwLCAweDAxLCAweDBjLAorCTB4MDYsIDB4ZmUsIDB4ZjcsIDB4MDAsIDB4NDQsIDB4NzgsIDB4MDEsIDB4ZmUsIDB4OGUsIDB4MWUsIDB4NGYsIDB4MGYsCisJMHhmZSwgMHgxMCwgMHg5MCwgMHgwNCwKKwkweGZlLCAweDkwLCAweDkzLCAweDNhLCAweDBiLCAweGZlLCAweDkyLCAweDkwLCAweDA0LCAweGZlLCAweDkyLCAweDkzLAorCTB4NzksIDB4MGIsIDB4MGUsIDB4ZmUsCisJMHhiZCwgMHgxMCwgMHgwMSwgMHg0MywgMHgwOSwgMHhiYiwgMHgxYiwgMHhmZSwgMHg2ZSwgMHgwYSwgMHgxNSwgMHhiYiwKKwkweDAxLCAweDBjLCAweDA2LCAweDBkLAorCTB4ZmUsIDB4MTQsIDB4MTMsIDB4MDMsIDB4NGIsIDB4M2IsIDB4NGMsIDB4OGUsIDB4ZmUsIDB4NmUsIDB4MGEsIDB4ZmUsCisJMHgwYywgMHg1OCwgMHhmZSwgMHg4ZCwKKwkweDU4LCAweDA1LCAweDViLCAweDI2LCAweDNlLCAweDBmLCAweGZlLCAweDE5LCAweDgwLCAweDA0LCAweGZlLCAweDk5LAorCTB4ODMsIDB4MzMsIDB4MGIsIDB4MGUsCisJMHhmZSwgMHhlNSwgMHgxMCwgMHgwMSwgMHgwYywgMHgwNiwgMHgwZCwgMHhmZSwgMHgxYSwgMHgxMiwgMHhmZSwgMHg2YywKKwkweDE5LCAweGZlLCAweDE5LCAweDQxLAorCTB4ZmUsIDB4NmIsIDB4MTgsIDB4YWMsIDB4ZmUsIDB4ZDEsIDB4ZjAsIDB4ZWYsIDB4MWYsIDB4OTIsIDB4MDEsIDB4NDIsCisJMHgxOSwgMHhmZSwgMHg0NCwgMHgwMCwKKwkweGZlLCAweDkwLCAweDEwLCAweGZlLCAweDZjLCAweDE5LCAweGQ5LCAweDRiLCAweGZlLCAweGVkLCAweDE5LCAweGRhLAorCTB4NGMsIDB4ZmUsIDB4MGMsIDB4NTEsCisJMHhmZSwgMHg4ZSwgMHg1MSwgMHhmZSwgMHg2YiwgMHgxOCwgMHgyMywgMHhmZSwgMHgwMCwgMHhmZiwgMHgzMSwgMHhmZSwKKwkweDc2LCAweDEwLCAweGFjLCAweGZlLAorCTB4ZDIsIDB4ZjAsIDB4ZmUsIDB4YmEsIDB4MGMsIDB4ZmUsIDB4NzYsIDB4MTgsIDB4MjMsIDB4MWQsIDB4NWQsIDB4MDMsCisJMHhlMywgMHgyMywgMHgwNywgMHhmZSwKKwkweDA4LCAweDEzLCAweDE5LCAweGZlLCAweDE2LCAweDAwLCAweDA1LCAweDcwLCAweGZlLCAweGQxLCAweGYwLCAweGZlLAorCTB4Y2MsIDB4MGMsIDB4MWYsIDB4OTIsCisJMHgwMSwgMHg0MiwgMHgxOSwgMHhmZSwgMHgxNywgMHgwMCwgMHg1YywgMHhmZSwgMHhjZSwgMHhmMCwgMHhmZSwgMHhkMiwKKwkweDBjLCAweGZlLCAweDNlLCAweDEwLAorCTB4ZmUsIDB4Y2QsIDB4ZjAsIDB4ZmUsIDB4ZGUsIDB4MGMsIDB4MTksIDB4ZmUsIDB4MjIsIDB4MDAsIDB4MDUsIDB4NzAsCisJMHhmZSwgMHhjYiwgMHhmMCwgMHhmZSwKKwkweGVhLCAweDBjLCAweDE5LCAweGZlLCAweDI0LCAweDAwLCAweDA1LCAweDcwLCAweGZlLCAweGQwLCAweGYwLCAweGZlLAorCTB4ZjQsIDB4MGMsIDB4MTksIDB4OTQsCisJMHhmZSwgMHgxYywgMHgxMCwgMHhmZSwgMHhjZiwgMHhmMCwgMHhmZSwgMHhmZSwgMHgwYywgMHgxOSwgMHg0YSwgMHhmMywKKwkweGZlLCAweGNjLCAweGYwLCAweGVmLAorCTB4MDEsIDB4NzYsIDB4MDYsIDB4MjQsIDB4NGQsIDB4MTksIDB4ZmUsIDB4MTIsIDB4MDAsIDB4MzcsIDB4MTMsIDB4ZmUsCisJMHg0ZSwgMHgxMSwgMHgyZiwgMHhmZSwKKwkweDE2LCAweDBkLCAweGZlLCAweDllLCAweGYwLCAweGZlLCAweDJhLCAweDBkLCAweGZlLCAweDAxLCAweDQ4LCAweDFiLAorCTB4M2MsIDB4MzcsIDB4ODgsIDB4ZjUsCisJMHhkNCwgMHgyOSwgMHhkNSwgMHgyOSwgMHhkMiwgMHgyOSwgMHhkMywgMHgyOSwgMHgzNywgMHhmZSwgMHg5YywgMHgzMiwKKwkweDJmLCAweGZlLCAweDNlLCAweDBkLAorCTB4MmEsIDB4M2MsIDB4YWUsIDB4ZmUsIDB4NjIsIDB4MGQsIDB4YWYsIDB4YTAsIDB4ZDQsIDB4OWYsIDB4ZDUsIDB4OWYsCisJMHhkMiwgMHg5ZiwgMHhkMywgMHg5ZiwKKwkweDA1LCAweDI5LCAweDAxLCAweDQxLCAweGZlLCAweGQzLCAweDEwLCAweDE1LCAweGZlLCAweGU4LCAweDAwLCAweGM0LAorCTB4YzUsIDB4NzUsIDB4ZDcsIDB4OTksCisJMHhkOCwgMHg5YywgMHhmZSwgMHg4OSwgMHhmMCwgMHgyOSwgMHgyNywgMHgyNSwgMHhiZSwgMHhkNywgMHg5OSwgMHhkOCwKKwkweDljLCAweDJmLCAweGZlLCAweDhjLAorCTB4MGQsIDB4MTYsIDB4MjksIDB4MjcsIDB4MjUsIDB4YmQsIDB4ZmUsIDB4MDEsIDB4NDgsIDB4YTQsIDB4MTksIDB4ZmUsCisJMHg0MiwgMHgwMCwgMHgwNSwgMHg3MCwKKwkweDkwLCAweDA3LCAweGZlLCAweDgxLCAweDQ5LCAweDFiLCAweGZlLCAweDY0LCAweDBlLCAweDAxLCAweDBjLCAweDA2LAorCTB4MGQsIDB4ZmUsIDB4NDQsIDB4MTMsCisJMHgxOSwgMHgwMCwgMHgyZCwgMHgwZCwgMHhmZSwgMHg1NCwgMHgxMiwgMHgyZCwgMHhmZSwgMHgyOCwgMHgwMCwgMHgyYiwKKwkweGZlLCAweGRhLCAweDBlLCAweDBhLAorCTB4NTcsIDB4MDEsIDB4MTgsIDB4MDksIDB4MDAsIDB4MzYsIDB4NDYsIDB4ZmUsIDB4MjgsIDB4MDAsIDB4ZmUsIDB4ZmEsCisJMHgxMCwgMHgwMSwgMHhmZSwgMHhmNCwKKwkweDFjLCAweDAxLCAweGZlLCAweDAwLCAweDFkLCAweDBhLCAweGJhLCAweDAxLCAweGZlLCAweDU4LCAweDEwLCAweDQwLAorCTB4MTUsIDB4NTYsIDB4MDEsIDB4ODUsCisJMHgwNSwgMHgzNSwgMHgxOSwgMHhmZSwgMHg0NCwgMHgwMCwgMHgyZCwgMHgwZCwgMHhmNywgMHg0NiwgMHgwZCwgMHhmZSwKKwkweGNjLCAweDEwLCAweDAxLCAweGE3LAorCTB4NDYsIDB4MGQsIDB4ZmUsIDB4YzIsIDB4MTAsIDB4MDEsIDB4YTcsIDB4MGYsIDB4ZmUsIDB4MTksIDB4ODIsIDB4MDQsCisJMHhmZSwgMHg5OSwgMHg4MywgMHhmZSwKKwkweGNjLCAweDQ3LCAweDBiLCAweDBlLCAweGZlLCAweDM0LCAweDQ2LCAweGE1LCAweDQ2LCAweDBkLCAweDE5LCAweGZlLAorCTB4NDMsIDB4MDAsIDB4ZmUsIDB4YTIsCisJMHgxMCwgMHgwMSwgMHgwYywgMHg2MSwgMHgwZCwgMHg0NCwgMHgwMSwgMHhmZSwgMHhmNCwgMHgxYywgMHgwMSwgMHhmZSwKKwkweDAwLCAweDFkLCAweDQwLCAweDE1LAorCTB4NTYsIDB4MDEsIDB4ODUsIDB4N2QsIDB4MGQsIDB4NDAsIDB4NTEsIDB4MDEsIDB4ZmUsIDB4OWUsIDB4MWUsIDB4MDUsCisJMHhmZSwgMHgzYSwgMHgwMywgMHgwMSwKKwkweDBjLCAweDA2LCAweDBkLCAweDVkLCAweDQ2LCAweDBkLCAweDE5LCAweDAwLCAweGZlLCAweDYyLCAweDEwLCAweDAxLAorCTB4NzYsIDB4MDYsIDB4MTIsIDB4ZmUsCisJMHg1YywgMHgxMiwgMHgwMSwgMHgwYywgMHgwNiwgMHgxMiwgMHhmZSwgMHg1MiwgMHgxMywgMHhmZSwgMHgxYywgMHgxYywKKwkweGZlLCAweDlkLCAweGYwLCAweGZlLAorCTB4OGUsIDB4MGUsIDB4ZmUsIDB4MWMsIDB4MWMsIDB4ZmUsIDB4OWQsIDB4ZjAsIDB4ZmUsIDB4OTQsIDB4MGUsIDB4MDEsCisJMHgwYywgMHg2MSwgMHgxMiwgMHg0NCwKKwkweGZlLCAweDlmLCAweDEwLCAweDE5LCAweGZlLCAweDE1LCAweDAwLCAweGZlLCAweDA0LCAweGU2LCAweDBkLCAweDRmLAorCTB4ZmUsIDB4MmUsIDB4MTAsIDB4MTksCisJMHhmZSwgMHgxMywgMHgwMCwgMHhmZSwgMHgxMCwgMHgxMCwgMHgxOSwgMHhmZSwgMHg0NywgMHgwMCwgMHhmMSwgMHgxOSwKKwkweGZlLCAweDQxLCAweDAwLCAweGEyLAorCTB4MTksIDB4ZmUsIDB4MjQsIDB4MDAsIDB4ODYsIDB4YzQsIDB4YzUsIDB4NzUsIDB4MDMsIDB4ODEsIDB4MWUsIDB4MmIsCisJMHhlYSwgMHg0ZiwgMHhmZSwgMHgwNCwKKwkweGU2LCAweDEyLCAweGZlLCAweDlkLCAweDQxLCAweGZlLCAweDFjLCAweDQyLCAweDQwLCAweDAxLCAweGY0LCAweDA1LAorCTB4MzUsIDB4ZmUsIDB4MTIsIDB4MWMsCisJMHgxZiwgMHgwZCwgMHg0NywgMHhiNSwgMHhjMywgMHgxZiwgMHhmZSwgMHgzMSwgMHgwMCwgMHg0NywgMHhiOCwgMHgwMSwKKwkweGZlLCAweGQ0LCAweDExLCAweDA1LAorCTB4ZTksIDB4NTEsIDB4ZmUsIDB4MDYsIDB4ZWMsIDB4ZTAsIDB4ZmUsIDB4MGUsIDB4NDcsIDB4NDYsIDB4MjgsIDB4ZmUsCisJMHhjZSwgMHg0NSwgMHgzMSwgMHg1MSwKKwkweGZlLCAweDA2LCAweGVhLCAweGUwLCAweGZlLCAweDQ3LCAweDRiLCAweDQ1LCAweGZlLCAweDc1LCAweDU3LCAweDAzLAorCTB4NjcsIDB4ZmUsIDB4OTgsIDB4NTYsCisJMHhmZSwgMHgzOCwgMHgxMiwgMHgwYSwgMHg1YSwgMHgwMSwgMHgxOCwgMHhmZSwgMHg0NCwgMHg0OCwgMHg2MCwgMHgwMSwKKwkweDBjLCAweDA2LCAweDI4LCAweGZlLAorCTB4MTgsIDB4MTMsIDB4MGEsIDB4NTcsIDB4MDEsIDB4MTgsIDB4M2UsIDB4ZmUsIDB4NDEsIDB4NTgsIDB4MGEsIDB4YmEsCisJMHhmZSwgMHhmYSwgMHgxNCwgMHhmZSwKKwkweDQ5LCAweDU0LCAweGIwLCAweGZlLCAweDVlLCAweDBmLCAweDA1LCAweGZlLCAweDNhLCAweDAzLCAweDBhLCAweDY3LAorCTB4ZmUsIDB4ZTAsIDB4MTQsIDB4ZmUsCisJMHgwZSwgMHg0NywgMHg0NiwgMHgyOCwgMHhmZSwgMHhjZSwgMHg0NSwgMHgzMSwgMHg1MSwgMHhmZSwgMHhjZSwgMHg0NywKKwkweGZlLCAweGFkLCAweDEzLCAweDA1LAorCTB4MzUsIDB4MjEsIDB4MmMsIDB4MDksIDB4MWEsIDB4ZmUsIDB4OTgsIDB4MTIsIDB4MjYsIDB4MjAsIDB4OTYsIDB4MjAsCisJMHhlNywgMHhmZSwgMHgwOCwgMHgxYywKKwkweGZlLCAweDdjLCAweDE5LCAweGZlLCAweGZkLCAweDE5LCAweGZlLCAweDBhLCAweDFjLCAweDAzLCAweGU1LCAweGZlLAorCTB4NDgsIDB4NTUsIDB4YTUsIDB4M2IsCisJMHhmZSwgMHg2MiwgMHgwMSwgMHhmZSwgMHhjOSwgMHg1NSwgMHgzMSwgMHhmZSwgMHg3NCwgMHgxMCwgMHgwMSwgMHhmZSwKKwkweGYwLCAweDFhLCAweDAzLCAweGZlLAorCTB4MzgsIDB4MDEsIDB4M2IsIDB4ZmUsIDB4M2EsIDB4MDEsIDB4OGUsIDB4ZmUsIDB4MWUsIDB4MTAsIDB4ZmUsIDB4MDIsCisJMHhlYywgMHhlNywgMHg1MywgMHgwMCwKKwkweDM2LCAweGZlLCAweDA0LCAweGVjLCAweDJjLCAweDYwLCAweGZlLCAweDA1LCAweGY2LCAweGZlLCAweDM0LCAweDAxLAorCTB4MDEsIDB4ZmUsIDB4NjIsIDB4MWIsCisJMHgwMSwgMHhmZSwgMHhjZSwgMHgxZSwgMHhiMiwgMHgxMSwgMHhmZSwgMHgxOCwgMHgxMywgMHhjYSwgMHhmZSwgMHgwMiwKKwkweGVhLCAweGU3LCAweDUzLCAweDkyLAorCTB4ZmUsIDB4YzMsIDB4MTMsIDB4MWYsIDB4MTIsIDB4NDcsIDB4YjUsIDB4YzMsIDB4ZmUsIDB4MmEsIDB4MTAsIDB4MDMsCisJMHhmZSwgMHgzOCwgMHgwMSwgMHgyMywKKwkweGZlLCAweGYwLCAweGZmLCAweDEwLCAweGU1LCAweDAzLCAweGZlLCAweDNhLCAweDAxLCAweDEwLCAweGZlLCAweDYyLAorCTB4MDEsIDB4MDEsIDB4ZmUsIDB4MWUsCisJMHgxZSwgMHgyMCwgMHgyYywgMHgxNSwgMHg1NiwgMHgwMSwgMHhmZSwgMHg5ZSwgMHgxZSwgMHgxMywgMHgwNywgMHgwMiwKKwkweDI2LCAweDAyLCAweDIxLCAweDk2LAorCTB4YzcsIDB4MjAsIDB4OTYsIDB4MDksIDB4OTIsIDB4ZmUsIDB4NzksIDB4MTMsIDB4MWYsIDB4MWQsIDB4NDcsIDB4YjUsCisJMHhjMywgMHhmZSwgMHhlMSwgMHgxMCwKKwkweGNmLCAweGZlLCAweDAzLCAweGRjLCAweGZlLCAweDczLCAweDU3LCAweGZlLCAweDgwLCAweDVkLCAweDAyLCAweGNmLAorCTB4ZmUsIDB4MDMsIDB4ZGMsIDB4ZmUsCisJMHg1YiwgMHg1NywgMHhmZSwgMHg4MCwgMHg1ZCwgMHgwMiwgMHhmZSwgMHgwMywgMHg1NywgMHhjZiwgMHgyNiwgMHhmZSwKKwkweDAwLCAweGNjLCAweDAyLCAweGZlLAorCTB4MDMsIDB4NTcsIDB4Y2YsIDB4ODksIDB4MDIsIDB4MDEsIDB4MGMsIDB4MDYsIDB4NGEsIDB4ZmUsIDB4NGUsIDB4MTMsCisJMHgwZiwgMHhmZSwgMHgxYywgMHg4MCwKKwkweDA0LCAweGZlLCAweDljLCAweDgzLCAweDMzLCAweDBiLCAweDBlLCAweDA5LCAweDA3LCAweGZlLCAweDNhLCAweDEzLAorCTB4MGYsIDB4ZmUsIDB4MWUsIDB4ODAsCisJMHgwNCwgMHhmZSwgMHg5ZSwgMHg4MywgMHgzMywgMHgwYiwgMHgwZSwgMHhmZSwgMHgyYSwgMHgxMywgMHgwZiwgMHhmZSwKKwkweDFkLCAweDgwLCAweDA0LCAweGZlLAorCTB4OWQsIDB4ODMsIDB4ZmUsIDB4ZjksIDB4MTMsIDB4MGUsIDB4ZmUsIDB4MWMsIDB4MTMsIDB4MDEsIDB4ZmUsIDB4ZWUsCisJMHgxZSwgMHhhYywgMHhmZSwgMHgxNCwKKwkweDEzLCAweDAxLCAweGZlLCAweGZlLCAweDFlLCAweGZlLCAweDgxLCAweDU4LCAweGZhLCAweDAxLCAweGZlLCAweDBlLAorCTB4MWYsIDB4ZmUsIDB4MzAsIDB4ZjQsCisJMHgwZCwgMHhmZSwgMHgzYywgMHg1MCwgMHhhMiwgMHgwMSwgMHhmZSwgMHg5MiwgMHgxYiwgMHgwMSwgMHg0MywgMHgwOSwKKwkweDU2LCAweGZiLCAweDAxLCAweGZlLAorCTB4YzgsIDB4MWEsIDB4MDEsIDB4MGMsIDB4MDYsIDB4MjgsIDB4YTQsIDB4MDEsIDB4ZmUsIDB4ZjQsIDB4MWMsIDB4MDEsCisJMHhmZSwgMHgwMCwgMHgxZCwgMHgxNSwKKwkweGZlLCAweGU5LCAweDAwLCAweDAxLCAweDBjLCAweDA2LCAweDRhLCAweGZlLCAweDRlLCAweDEzLCAweDAxLCAweGZlLAorCTB4MjIsIDB4MWIsIDB4ZmUsIDB4MWUsCisJMHgxYywgMHgwZiwgMHhmZSwgMHgxNCwgMHg5MCwgMHgwNCwgMHhmZSwgMHg5NCwgMHg5MywgMHgzYSwgMHgwYiwgMHhmZSwKKwkweDk2LCAweDkwLCAweDA0LCAweGZlLAorCTB4OTYsIDB4OTMsIDB4NzksIDB4MGIsIDB4MGUsIDB4MTAsIDB4ZmUsIDB4NjQsIDB4MDEsIDB4MjIsIDB4ZmUsIDB4NjYsCisJMHgwMSwgMHgwMSwgMHgwYywgMHgwNiwKKwkweDY1LCAweGY5LCAweDBmLCAweGZlLCAweDAzLCAweDgwLCAweDA0LCAweGZlLCAweDgzLCAweDgzLCAweDMzLCAweDBiLAorCTB4MGUsIDB4NzcsIDB4ZmUsIDB4MDEsCisJMHhlYywgMHgyYywgMHhmZSwgMHg4MCwgMHg0MCwgMHgyMCwgMHgyYywgMHg3YSwgMHgzMCwgMHgxNSwgMHhkZiwgMHg0MCwKKwkweDIxLCAweDJjLCAweGZlLCAweDAwLAorCTB4NDAsIDB4OGQsIDB4MmMsIDB4MDIsIDB4ZmUsIDB4MDgsIDB4MWMsIDB4MDMsIDB4ZmUsIDB4YWMsIDB4MDAsIDB4ZmUsCisJMHgwNiwgMHg1OCwgMHgwMywgMHhmZSwKKwkweGFlLCAweDAwLCAweGZlLCAweDA3LCAweDU4LCAweDAzLCAweGZlLCAweGIwLCAweDAwLCAweGZlLCAweDA4LCAweDU4LAorCTB4MDMsIDB4ZmUsIDB4YjIsIDB4MDAsCisJMHhmZSwgMHgwOSwgMHg1OCwgMHhmZSwgMHgwYSwgMHgxYywgMHgyZSwgMHg0OSwgMHgyMCwgMHhlMCwgMHgyNiwgMHgxMCwKKwkweDY2LCAweDEwLCAweDU1LCAweDEwLAorCTB4NmYsIDB4MTMsIDB4NTcsIDB4NTIsIDB4NGYsIDB4MWMsIDB4MjgsIDB4ZmUsIDB4OTAsIDB4NGQsIDB4ZmUsIDB4OTEsCisJMHg1NCwgMHgyYiwgMHhmZSwgMHg4OCwKKwkweDExLCAweDQ2LCAweDFhLCAweDEzLCAweDVhLCAweDUyLCAweDFjLCAweDRhLCAweGZlLCAweDkwLCAweDRkLCAweGZlLAorCTB4OTEsIDB4NTQsIDB4MmIsIDB4ZmUsCisJMHg5ZSwgMHgxMSwgMHgyZSwgMHgxYSwgMHgyMCwgMHgyYywgMHg5MCwgMHgzNCwgMHg2MCwgMHgyMSwgMHgyYywgMHhmZSwKKwkweDAwLCAweDQwLCAweDhkLCAweDJjLAorCTB4MTUsIDB4ZGYsIDB4ZmUsIDB4MTQsIDB4NTYsIDB4ZmUsIDB4ZDYsIDB4ZjAsIDB4ZmUsIDB4YjIsIDB4MTEsIDB4ZmUsCisJMHgxMiwgMHgxYywgMHg3NSwgMHhmZSwKKwkweDE0LCAweDFjLCAweGZlLCAweDEwLCAweDFjLCAweGZlLCAweDE4LCAweDFjLCAweDAyLCAweDUxLCAweGZlLCAweDBjLAorCTB4MTQsIDB4ZmUsIDB4MGUsIDB4NDcsCisJMHhmZSwgMHgwNywgMHhlNiwgMHgyOCwgMHhmZSwgMHhjZSwgMHg0NywgMHhmZSwgMHhmNSwgMHgxMywgMHgwMiwgMHgwMSwKKwkweGE3LCAweDkwLCAweDM0LCAweDYwLAorCTB4ZmUsIDB4MDYsIDB4ODAsIDB4ZmUsIDB4NDgsIDB4NDcsIDB4ZmUsIDB4NDIsIDB4MTMsIDB4ZmUsIDB4MDIsIDB4ODAsCisJMHgwOSwgMHg1NiwgMHhmZSwgMHgzNCwKKwkweDEzLCAweDBhLCAweDVhLCAweDAxLCAweDE4LCAweGNiLCAweGZlLCAweDM2LCAweDEyLCAweGZlLCAweDQxLCAweDQ4LAorCTB4ZmUsIDB4NDUsIDB4NDgsIDB4MDEsCisJMHhmZSwgMHhiMiwgMHgxNiwgMHhmZSwgMHgwMCwgMHhjYywgMHhjYiwgMHhmZSwgMHhmMywgMHgxMywgMHgzZiwgMHg4OSwKKwkweDA5LCAweDFhLCAweGE1LCAweDBhLAorCTB4OWQsIDB4MDEsIDB4MTgsIDB4ZmUsIDB4ODAsIDB4NWMsIDB4MDEsIDB4ODUsIDB4ZjIsIDB4MDksIDB4OWIsIDB4YTQsCisJMHhmZSwgMHgxNCwgMHg1NiwgMHhmZSwKKwkweGQ2LCAweGYwLCAweGZlLCAweGVjLCAweDExLCAweDAyLCAweGZlLCAweDQ0LCAweDU4LCAweDc3LCAweGZlLCAweDAxLAorCTB4ZWMsIDB4YjgsIDB4ZmUsIDB4OWUsCisJMHg0MCwgMHhmZSwgMHg5ZCwgMHhlNywgMHgwMCwgMHhmZSwgMHg5YywgMHhlNywgMHgxMiwgMHg4ZCwgMHgzMCwgMHgwMSwKKwkweGY0LCAweGZlLCAweGRkLCAweDEwLAorCTB4MzcsIDB4ZDcsIDB4OTksIDB4ZDgsIDB4OWMsIDB4MjcsIDB4MjUsIDB4ZWUsIDB4MDksIDB4MTIsIDB4ZmUsIDB4NDgsCisJMHgxMiwgMHgwOSwgMHgwZCwgMHhmZSwKKwkweDU2LCAweDEyLCAweDA5LCAweDFkLCAweGZlLCAweDMwLCAweDEyLCAweDA5LCAweGRkLCAweDFiLCAweGZlLCAweGM0LAorCTB4MTMsIDB4MDksIDB4ZmUsIDB4MjMsCisJMHgwMCwgMHgxYiwgMHhmZSwgMHhkMCwgMHgxMywgMHgwOSwgMHgwNywgMHgxYiwgMHhmZSwgMHgzNCwgMHgxNCwgMHgwOSwKKwkweDI0LCAweGZlLCAweDEyLCAweDEyLAorCTB4MDksIDB4MDAsIDB4MWIsIDB4MjksIDB4MWYsIDB4ZGQsIDB4MDEsIDB4NDIsIDB4YTEsIDB4MzIsIDB4MDEsIDB4MDgsCisJMHhhZSwgMHg0MSwgMHgwMiwgMHgzMiwKKwkweGZlLCAweDYyLCAweDA4LCAweDBhLCAweGUxLCAweDAxLCAweGZlLCAweDU4LCAweDEwLCAweDE1LCAweDliLCAweDA1LAorCTB4MzUsIDB4MzIsIDB4MDEsIDB4NDMsCisJMHgwOSwgMHhiYiwgMHhmZSwgMHhkNywgMHgxMywgMHg5MSwgMHg0YiwgMHg3ZSwgMHg0YywgMHg4ZSwgMHhmZSwgMHg4MCwKKwkweDEzLCAweDAxLCAweDBjLCAweDA2LAorCTB4NTQsIDB4ZmUsIDB4NzIsIDB4MTIsIDB4ZGIsIDB4NjQsIDB4ZGMsIDB4MzQsIDB4ZmUsIDB4NDQsIDB4NTUsIDB4ZmUsCisJMHhlNSwgMHg1NSwgMHhiMCwgMHhmZSwKKwkweDRhLCAweDEzLCAweDIxLCAweDZlLCAweGZlLCAweDI2LCAweDEzLCAweDAzLCAweDk3LCAweDNiLCAweDk4LCAweDhlLAorCTB4ZmUsIDB4YjYsIDB4MGUsIDB4MTAsCisJMHg2YSwgMHgyMiwgMHg2YiwgMHgyNiwgMHgxMCwgMHg5NywgMHgxMCwgMHg5OCwgMHgwMSwgMHhjMiwgMHgyZSwgMHg0OSwKKwkweDg4LCAweDIwLCAweDZlLCAweDAxLAorCTB4ZmUsIDB4NmEsIDB4MTYsIDB4ZGIsIDB4NjQsIDB4ZGMsIDB4MzQsIDB4ZmUsIDB4MDQsIDB4NTUsIDB4ZmUsIDB4YTUsCisJMHg1NSwgMHhmZSwgMHgwNCwgMHhmYSwKKwkweDY0LCAweGZlLCAweDA1LCAweGZhLCAweDM0LCAweGZlLCAweDhmLCAweDEwLCAweDAzLCAweDZjLCAweDNiLCAweDZkLAorCTB4ZmUsIDB4NDAsIDB4NTYsIDB4ZmUsCisJMHhlMSwgMHg1NiwgMHgxMCwgMHg2YywgMHgyMiwgMHg2ZCwgMHg3MSwgMHhkYiwgMHg2NCwgMHhkYywgMHgzNCwgMHhmZSwKKwkweDQ0LCAweDU1LCAweGZlLCAweGU1LAorCTB4NTUsIDB4MDMsIDB4NjgsIDB4M2IsIDB4NjksIDB4ZmUsIDB4MDAsIDB4NTYsIDB4ZmUsIDB4YTEsIDB4NTYsIDB4MTAsCisJMHg2OCwgMHgyMiwgMHg2OSwgMHgwMSwKKwkweDBjLCAweDA2LCAweDU0LCAweGY5LCAweDIxLCAweDZlLCAweGZlLCAweDFmLCAweDQwLCAweDAzLCAweDZhLCAweDNiLAorCTB4NmIsIDB4ZmUsIDB4MmMsIDB4NTAsCisJMHhmZSwgMHhhZSwgMHg1MCwgMHgwMywgMHg2YywgMHgzYiwgMHg2ZCwgMHhmZSwgMHg0NCwgMHg1MCwgMHhmZSwgMHhjNiwKKwkweDUwLCAweDAzLCAweDY4LCAweDNiLAorCTB4NjksIDB4ZmUsIDB4MDgsIDB4NTAsIDB4ZmUsIDB4OGEsIDB4NTAsIDB4MDMsIDB4NGIsIDB4M2IsIDB4NGMsIDB4ZmUsCisJMHg0MCwgMHg1MCwgMHhmZSwgMHhjMiwKKwkweDUwLCAweDA1LCAweDczLCAweDJlLCAweDA3LCAweDIwLCAweDllLCAweDA1LCAweDcyLCAweDMyLCAweDAxLCAweDA4LAorCTB4MTYsIDB4M2QsIDB4MjcsIDB4MjUsCisJMHhlZSwgMHgwOSwgMHgwNywgMHgyYiwgMHgzZCwgMHgwMSwgMHg0MywgMHgwOSwgMHhiYiwgMHgyYiwgMHg3MiwgMHgwMSwKKwkweGE2LCAweDIzLCAweDNmLCAweDFiLAorCTB4M2QsIDB4MDEsIDB4MGMsIDB4MDYsIDB4MGQsIDB4ZmUsIDB4MWUsIDB4MTMsIDB4OTEsIDB4NGIsIDB4N2UsIDB4NGMsCisJMHhmZSwgMHgwYSwgMHg1NSwgMHgzMSwKKwkweGZlLCAweDhiLCAweDU1LCAweGQ5LCAweDRiLCAweGRhLCAweDRjLCAweGZlLCAweDBjLCAweDUxLCAweGZlLCAweDhlLAorCTB4NTEsIDB4MDUsIDB4NzIsIDB4MDEsCisJMHhmZSwgMHg4ZSwgMHgxZSwgMHhjYSwgMHhmZSwgMHgxOSwgMHg0MSwgMHgwNSwgMHg3MiwgMHgzMiwgMHgwMSwgMHgwOCwKKwkweDJhLCAweDNjLCAweDE2LCAweGMwLAorCTB4MjcsIDB4MjUsIDB4YmUsIDB4MmQsIDB4MWQsIDB4YzAsIDB4MmQsIDB4MGQsIDB4ODMsIDB4MmQsIDB4N2YsIDB4MWIsCisJMHhmZSwgMHg2NiwgMHgxNSwgMHgwNSwKKwkweDNkLCAweDAxLCAweDA4LCAweDJhLCAweDNjLCAweDE2LCAweGMwLCAweDI3LCAweDI1LCAweGJkLCAweDA5LCAweDFkLAorCTB4MmIsIDB4M2QsIDB4MDEsIDB4MDgsCisJMHgxNiwgMHhjMCwgMHgyNywgMHgyNSwgMHhmZSwgMHhlOCwgMHgwOSwgMHhmZSwgMHhjMiwgMHg0OSwgMHg1MCwgMHgwMywKKwkweGI2LCAweDFlLCAweDgzLCAweDAxLAorCTB4MzgsIDB4MDYsIDB4MjQsIDB4MzEsIDB4YTEsIDB4ZmUsIDB4YmIsIDB4NDUsIDB4MmQsIDB4MDAsIDB4YTQsIDB4NDYsCisJMHgwNywgMHg5MCwgMHgzZiwgMHgwMSwKKwkweGZlLCAweGY4LCAweDE1LCAweDAxLCAweGE2LCAweDg2LCAweGZlLCAweDRiLCAweDQ1LCAweGZlLCAweDIwLCAweDEzLAorCTB4MDEsIDB4NDMsIDB4MDksIDB4ODIsCisJMHhmZSwgMHgxNiwgMHgxMywgMHgwMywgMHg5YSwgMHgxZSwgMHg1ZCwgMHgwMywgMHg1NSwgMHgxZSwgMHgzMSwgMHg1ZSwKKwkweDA1LCAweDcyLCAweGZlLCAweGMwLAorCTB4NWQsIDB4MDEsIDB4YTcsIDB4ZmUsIDB4MDMsIDB4MTcsIDB4MDMsIDB4NjYsIDB4OGEsIDB4MTAsIDB4NjYsIDB4NWUsCisJMHgzMiwgMHgwMSwgMHgwOCwgMHgxNywKKwkweDczLCAweDAxLCAweGZlLCAweDU2LCAweDE5LCAweDA1LCAweDczLCAweDAxLCAweDA4LCAweDJhLCAweDNjLCAweDE2LAorCTB4M2QsIDB4MjcsIDB4MjUsIDB4YmQsCisJMHgwOSwgMHgwNywgMHgyYiwgMHgzZCwgMHgwMSwgMHhmZSwgMHhiZSwgMHgxNiwgMHhmZSwgMHg0MiwgMHg1OCwgMHhmZSwKKwkweGU4LCAweDE0LCAweDAxLCAweGE2LAorCTB4ODYsIDB4ZmUsIDB4NGEsIDB4ZjQsIDB4MGQsIDB4MWIsIDB4M2QsIDB4ZmUsIDB4NGEsIDB4ZjQsIDB4MDcsIDB4ZmUsCisJMHgwZSwgMHgxMiwgMHgwMSwgMHg0MywKKwkweDA5LCAweDgyLCAweDRlLCAweDA1LCAweDcyLCAweDAzLCAweDU1LCAweDhhLCAweDEwLCAweDU1LCAweDVlLCAweDMyLAorCTB4MDEsIDB4MDgsIDB4MTcsIDB4NzMsCisJMHgwMSwgMHhmZSwgMHg4NCwgMHgxOSwgMHgwNSwgMHg3MywgMHgwMSwgMHgwOCwgMHgyYSwgMHgzYywgMHgxNiwgMHgzZCwKKwkweDI3LCAweDI1LCAweGJkLCAweDA5LAorCTB4MTIsIDB4MmIsIDB4M2QsIDB4MDEsIDB4ZmUsIDB4ZTgsIDB4MTcsIDB4OGIsIDB4ZmUsIDB4YWEsIDB4MTQsIDB4ZmUsCisJMHhiNiwgMHgxNCwgMHg4NiwgMHhhOCwKKwkweGIyLCAweDBkLCAweDFiLCAweDNkLCAweGIyLCAweDA3LCAweGZlLCAweDBlLCAweDEyLCAweDAxLCAweDQzLCAweDA5LAorCTB4ODIsIDB4NGUsIDB4MDUsIDB4NzIsCisJMHgwMywgMHg2ZiwgMHg4YSwgMHgxMCwgMHg2ZiwgMHg1ZSwgMHgzMiwgMHgwMSwgMHgwOCwgMHgxNywgMHg3MywgMHgwMSwKKwkweGZlLCAweGMwLCAweDE5LCAweDA1LAorCTB4NzMsIDB4MTMsIDB4MDcsIDB4MmYsIDB4ZmUsIDB4Y2MsIDB4MTUsIDB4MTcsIDB4ZmUsIDB4ZTIsIDB4MTUsIDB4NWYsCisJMHhjYywgMHgwMSwgMHgwOCwgMHgyNiwKKwkweDVmLCAweDAyLCAweDhmLCAweGZlLCAweGRlLCAweDE1LCAweDJhLCAweGZlLCAweGRlLCAweDE1LCAweDE2LCAweGZlLAorCTB4Y2MsIDB4MTUsIDB4NWUsIDB4MzIsCisJMHgwMSwgMHgwOCwgMHhmZSwgMHhkNSwgMHgxMCwgMHgxMywgMHg1OCwgMHhmZiwgMHgwMiwgMHgwMCwgMHg1NywgMHg1MiwKKwkweGFkLCAweDIzLCAweGZlLCAweGZmLAorCTB4N2YsIDB4ZmUsIDB4MzAsIDB4NTYsIDB4ZmUsIDB4MDAsIDB4NWMsIDB4MDIsIDB4MTMsIDB4NTgsIDB4ZmYsIDB4MDIsCisJMHgwMCwgMHg1NywgMHg1MiwgMHhhZCwKKwkweDIzLCAweDNmLCAweGZlLCAweDMwLCAweDU2LCAweGZlLCAweDAwLCAweDVjLCAweDAyLCAweDEzLCAweDU4LCAweGZmLAorCTB4MDIsIDB4MDAsIDB4NTcsIDB4NTIsCisJMHhhZCwgMHgwMiwgMHgxMywgMHg1OCwgMHhmZiwgMHgwMiwgMHgwMCwgMHg1NywgMHg1MiwgMHhmZSwgMHgwMCwgMHg1ZSwKKwkweDAyLCAweDEzLCAweDU4LCAweGZmLAorCTB4MDIsIDB4MDAsIDB4NTcsIDB4NTIsIDB4YWQsIDB4ZmUsIDB4MGIsIDB4NTgsIDB4MDIsIDB4MGEsIDB4NjYsIDB4MDEsCisJMHg1YywgMHgwYSwgMHg1NSwgMHgwMSwKKwkweDVjLCAweDBhLCAweDZmLCAweDAxLCAweDVjLCAweDAyLCAweDAxLCAweGZlLCAweDFlLCAweDFmLCAweDIzLCAweDFhLAorCTB4ZmYsIDB4MDMsIDB4MDAsIDB4NTQsCisJMHhmZSwgMHgwMCwgMHhmNCwgMHgyNCwgMHg1MiwgMHgwZiwgMHhmZSwgMHgwMCwgMHg3YywgMHgwNCwgMHhmZSwgMHgwNywKKwkweDdjLCAweDNhLCAweDBiLCAweDBlLAorCTB4ZmUsIDB4MDAsIDB4NzEsIDB4ZmUsIDB4ZjksIDB4MTgsIDB4ZmUsIDB4N2EsIDB4MTksIDB4ZmUsIDB4ZmIsIDB4MTksCisJMHhmZSwgMHgxYSwgMHhmNywgMHgwMCwKKwkweGZlLCAweDFiLCAweGY3LCAweDAwLCAweDdhLCAweDMwLCAweDEwLCAweDY4LCAweDIyLCAweDY5LCAweGQ5LCAweDZjLAorCTB4ZGEsIDB4NmQsIDB4MDIsIDB4ZmUsCisJMHg2MiwgMHgwOCwgMHhmZSwgMHg4MiwgMHg0YSwgMHhmZSwgMHhlMSwgMHgxYSwgMHhmZSwgMHg4MywgMHg1YSwgMHg3NywKKwkweDAyLCAweDAxLCAweGM2LCAweGZlLAorCTB4NDIsIDB4NDgsIDB4NGYsIDB4NTAsIDB4NDUsIDB4MDEsIDB4MDgsIDB4MTYsIDB4ZmUsIDB4ZTAsIDB4MTcsIDB4MjcsCisJMHgyNSwgMHhiZSwgMHgwMSwgMHgwOCwKKwkweDE2LCAweGZlLCAweGUwLCAweDE3LCAweDI3LCAweDI1LCAweGZlLCAweGU4LCAweDBhLCAweGZlLCAweGMxLCAweDU5LAorCTB4MDMsIDB4OWEsIDB4MWUsIDB4ZmUsCisJMHhkYSwgMHgxMiwgMHgwMSwgMHgzOCwgMHgwNiwgMHgxMiwgMHhmZSwgMHhkMCwgMHgxMywgMHgyNiwgMHg1MywgMHgxMiwKKwkweDQ4LCAweGZlLCAweDA4LCAweDE3LAorCTB4ZDEsIDB4MTIsIDB4NTMsIDB4MTIsIDB4ZmUsIDB4MWUsIDB4MTMsIDB4MmQsIDB4YjQsIDB4N2IsIDB4ZmUsIDB4MjYsCisJMHgxNywgMHg0ZCwgMHgxMywgMHgwNywKKwkweDFjLCAweGI0LCAweDkwLCAweDA0LCAweGZlLCAweDc4LCAweDEwLCAweGZmLCAweDAyLCAweDgzLCAweDU1LCAweGYxLAorCTB4ZmYsIDB4MDIsIDB4ODMsIDB4NTUsCisJMHg1MywgMHgxZCwgMHhmZSwgMHgxMiwgMHgxMywgMHhkNiwgMHhmZSwgMHgzMCwgMHgwMCwgMHhiMCwgMHhmZSwgMHg4MCwKKwkweDE3LCAweDFjLCAweDYzLCAweDEzLAorCTB4MDcsIDB4ZmUsIDB4NTYsIDB4MTAsIDB4NTMsIDB4MGQsIDB4ZmUsIDB4MTYsIDB4MTMsIDB4ZDYsIDB4ZmUsIDB4NjQsCisJMHgwMCwgMHhiMCwgMHhmZSwgMHg4MCwKKwkweDE3LCAweDBhLCAweGZlLCAweDY0LCAweDAwLCAweDFjLCAweDk0LCAweDEzLCAweDA3LCAweGZlLCAweDI4LCAweDEwLAorCTB4NTMsIDB4MDcsIDB4ZmUsIDB4NjAsCisJMHgxMywgMHhkNiwgMHhmZSwgMHhjOCwgMHgwMCwgMHhiMCwgMHhmZSwgMHg4MCwgMHgxNywgMHgwYSwgMHhmZSwgMHhjOCwKKwkweDAwLCAweDFjLCAweDk1LCAweDEzLAorCTB4MDcsIDB4NzEsIDB4ZDYsIDB4ZmUsIDB4OTAsIDB4MDEsIDB4NDgsIDB4ZmUsIDB4OGMsIDB4MTcsIDB4NDUsIDB4ZjMsCisJMHhmZSwgMHg0MywgMHhmNCwgMHg5NiwKKwkweGZlLCAweDU2LCAweGYwLCAweGZlLCAweDllLCAweDE3LCAweGZlLCAweDA0LCAweGY0LCAweDU4LCAweGZlLCAweDQzLAorCTB4ZjQsIDB4OTQsIDB4ZjYsIDB4OGIsCisJMHgwMSwgMHhmZSwgMHgyNCwgMHgxNiwgMHgyMywgMHgzZiwgMHhmYywgMHhhOCwgMHg4YywgMHg0OSwgMHg0OCwgMHhmZSwKKwkweGRhLCAweDE3LCAweDYyLCAweDQ5LAorCTB4ZmUsIDB4MWMsIDB4MTAsIDB4YTgsIDB4OGMsIDB4ODAsIDB4NDgsIDB4ZmUsIDB4ZGEsIDB4MTcsIDB4NjIsIDB4ODAsCisJMHg3MSwgMHg1MCwgMHgyNiwgMHhmZSwKKwkweDRkLCAweGY0LCAweDAwLCAweGY3LCAweDQ1LCAweDEzLCAweDA3LCAweGZlLCAweGI0LCAweDU2LCAweGZlLCAweGMzLAorCTB4NTgsIDB4MDIsIDB4NTAsIDB4MTMsCisJMHgwZCwgMHgwMiwgMHg1MCwgMHgzZSwgMHg3OCwgMHg0ZiwgMHg0NSwgMHgwMSwgMHgwOCwgMHgxNiwgMHhhOSwgMHgyNywKKwkweDI1LCAweGJlLCAweGZlLCAweDAzLAorCTB4ZWEsIDB4ZmUsIDB4N2UsIDB4MDEsIDB4MDEsIDB4MDgsIDB4MTYsIDB4YTksIDB4MjcsIDB4MjUsIDB4ZmUsIDB4ZTksCisJMHgwYSwgMHgwMSwgMHgwOCwgMHgxNiwKKwkweGE5LCAweDI3LCAweDI1LCAweGZlLCAweGU5LCAweDBhLCAweGZlLCAweDA1LCAweGVhLCAweGZlLCAweDdmLCAweDAxLAorCTB4MDEsIDB4MDgsIDB4MTYsIDB4YTksCisJMHgyNywgMHgyNSwgMHhmZSwgMHg2OSwgMHgwOSwgMHhmZSwgMHgwMiwgMHhlYSwgMHhmZSwgMHg4MCwgMHgwMSwgMHgwMSwKKwkweDA4LCAweDE2LCAweGE5LCAweDI3LAorCTB4MjUsIDB4ZmUsIDB4ZTgsIDB4MDgsIDB4NDcsIDB4ZmUsIDB4ODEsIDB4MDEsIDB4MDMsIDB4YjYsIDB4MWUsIDB4ODMsCisJMHgwMSwgMHgzOCwgMHgwNiwgMHgyNCwKKwkweDMxLCAweGEyLCAweDc4LCAweGYyLCAweDUzLCAweDA3LCAweDM2LCAweGZlLCAweDM0LCAweGY0LCAweDNmLCAweGExLAorCTB4NzgsIDB4MDMsIDB4OWEsIDB4MWUsCisJMHg4MywgMHgwMSwgMHgzOCwgMHgwNiwgMHgxMiwgMHgzMSwgMHhmMCwgMHg0ZiwgMHg0NSwgMHhmZSwgMHg5MCwgMHgxMCwKKwkweGZlLCAweDQwLCAweDVhLCAweDIzLAorCTB4M2YsIDB4ZmIsIDB4OGMsIDB4NDksIDB4NDgsIDB4ZmUsIDB4YWEsIDB4MTgsIDB4NjIsIDB4NDksIDB4NzEsIDB4OGMsCisJMHg4MCwgMHg0OCwgMHhmZSwgMHhhYSwKKwkweDE4LCAweDYyLCAweDgwLCAweGZlLCAweGI0LCAweDU2LCAweGZlLCAweDQwLCAweDVkLCAweDAxLCAweGM2LCAweDAxLAorCTB4ZmUsIDB4YWMsIDB4MWQsIDB4ZmUsCisJMHgwMiwgMHgxNywgMHhmZSwgMHhjOCwgMHg0NSwgMHhmZSwgMHg1YSwgMHhmMCwgMHhmZSwgMHhjMCwgMHgxOCwgMHhmZSwKKwkweDQzLCAweDQ4LCAweDJkLCAweDkzLAorCTB4MzYsIDB4ZmUsIDB4MzQsIDB4ZjQsIDB4ZmUsIDB4MDAsIDB4MTEsIDB4ZmUsIDB4NDAsIDB4MTAsIDB4MmQsIDB4YjQsCisJMHgzNiwgMHhmZSwgMHgzNCwgMHhmNCwKKwkweDA0LCAweGZlLCAweDM0LCAweDEwLCAweDJkLCAweGZlLCAweDBiLCAweDAwLCAweDM2LCAweDQ2LCAweDYzLCAweGZlLAorCTB4MjgsIDB4MTAsIDB4ZmUsIDB4YzAsCisJMHg0OSwgMHhmZiwgMHgwMiwgMHgwMCwgMHg1NCwgMHhiMiwgMHhmZSwgMHg5MCwgMHgwMSwgMHg0OCwgMHhmZSwgMHhmYSwKKwkweDE4LCAweDQ1LCAweGZlLCAweDFjLAorCTB4ZjQsIDB4M2YsIDB4ZjMsIDB4ZmUsIDB4NDAsIDB4ZjQsIDB4OTYsIDB4ZmUsIDB4NTYsIDB4ZjAsIDB4ZmUsIDB4MGMsCisJMHgxOSwgMHhmZSwgMHgwNCwgMHhmNCwKKwkweDU4LCAweGZlLCAweDQwLCAweGY0LCAweDk0LCAweGY2LCAweDNlLCAweDJkLCAweDkzLCAweDRlLCAweGQwLCAweDBkLAorCTB4MjEsIDB4ZmUsIDB4N2YsIDB4MDEsCisJMHhmZSwgMHhjOCwgMHg0NiwgMHhmZSwgMHgyNCwgMHgxMywgMHg4YywgMHgwMCwgMHg1ZCwgMHgyNiwgMHgyMSwgMHhmZSwKKwkweDdlLCAweDAxLCAweGZlLCAweGM4LAorCTB4NDUsIDB4ZmUsIDB4MTQsIDB4MTMsIDB4MjEsIDB4ZmUsIDB4ODAsIDB4MDEsIDB4ZmUsIDB4NDgsIDB4NDUsIDB4ZmEsCisJMHgyMSwgMHhmZSwgMHg4MSwgMHgwMSwKKwkweGZlLCAweGM4LCAweDQ0LCAweDRlLCAweDI2LCAweDAyLCAweDEzLCAweDA3LCAweDAyLCAweDc4LCAweDQ1LCAweDUwLAorCTB4MTMsIDB4MGQsIDB4MDIsIDB4MTQsCisJMHgwNywgMHgwMSwgMHgwOCwgMHgxNywgMHhmZSwgMHg4MiwgMHgxOSwgMHgxNCwgMHgwZCwgMHgwMSwgMHgwOCwgMHgxNywKKwkweGZlLCAweDgyLCAweDE5LCAweDE0LAorCTB4MWQsIDB4MDEsIDB4MDgsIDB4MTcsIDB4ZmUsIDB4ODIsIDB4MTksIDB4NWYsIDB4ZmUsIDB4ODksIDB4NDksIDB4MDEsCisJMHgwOCwgMHgwMiwgMHgxNCwgMHgwNywKKwkweDAxLCAweDA4LCAweDE3LCAweGMxLCAweDE0LCAweDFkLCAweDAxLCAweDA4LCAweDE3LCAweGMxLCAweDE0LCAweDA3LAorCTB4MDEsIDB4MDgsIDB4MTcsIDB4YzEsCisJMHhmZSwgMHg4OSwgMHg0OSwgMHgwMSwgMHgwOCwgMHgxNywgMHhjMSwgMHg1ZiwgMHhmZSwgMHg4OSwgMHg0YSwgMHgwMSwKKwkweDA4LCAweDAyLCAweDUwLCAweDAyLAorCTB4MTQsIDB4MDcsIDB4MDEsIDB4MDgsIDB4MTcsIDB4NzQsIDB4MTQsIDB4N2YsIDB4MDEsIDB4MDgsIDB4MTcsIDB4NzQsCisJMHgxNCwgMHgxMiwgMHgwMSwgMHgwOCwKKwkweDE3LCAweDc0LCAweGZlLCAweDg5LCAweDQ5LCAweDAxLCAweDA4LCAweDE3LCAweDc0LCAweDE0LCAweDAwLCAweDAxLAorCTB4MDgsIDB4MTcsIDB4NzQsIDB4ZmUsCisJMHg4OSwgMHg0YSwgMHgwMSwgMHgwOCwgMHgxNywgMHg3NCwgMHhmZSwgMHgwOSwgMHg0OSwgMHgwMSwgMHgwOCwgMHgxNywKKwkweDc0LCAweDVmLCAweGNjLCAweDAxLAorCTB4MDgsIDB4MDIsIDB4MjEsIDB4ZTQsIDB4MDksIDB4MDcsIDB4ZmUsIDB4NGMsIDB4MTMsIDB4YzgsIDB4MjAsIDB4ZTQsCisJMHhmZSwgMHg0OSwgMHhmNCwgMHgwMCwKKwkweDRkLCAweDVmLCAweGExLCAweDVlLCAweGZlLCAweDAxLCAweGVjLCAweGZlLCAweDI3LCAweDAxLCAweGNjLCAweGZmLAorCTB4MDIsIDB4MDAsIDB4MTAsIDB4MmYsCisJMHhmZSwgMHgzZSwgMHgxYSwgMHgwMSwgMHg0MywgMHgwOSwgMHhmZSwgMHhlMywgMHgwMCwgMHhmZSwgMHgyMiwgMHgxMywKKwkweDE2LCAweGZlLCAweDY0LCAweDFhLAorCTB4MjYsIDB4MjAsIDB4OWUsIDB4MDEsIDB4NDEsIDB4MjEsIDB4OWUsIDB4MDksIDB4MDcsIDB4NWQsIDB4MDEsIDB4MGMsCisJMHg2MSwgMHgwNywgMHg0NCwgMHgwMiwKKwkweDBhLCAweDVhLCAweDAxLCAweDE4LCAweGZlLCAweDAwLCAweDQwLCAweGFhLCAweDA5LCAweDFhLCAweGZlLCAweDEyLAorCTB4MTMsIDB4MGEsIDB4OWQsIDB4MDEsCisJMHgxOCwgMHhhYSwgMHgwYSwgMHg2NywgMHgwMSwgMHhhMywgMHgwMiwgMHgwYSwgMHg5ZCwgMHgwMSwgMHgxOCwgMHhhYSwKKwkweGZlLCAweDgwLCAweGU3LCAweDFhLAorCTB4MDksIDB4MWEsIDB4NWQsIDB4ZmUsIDB4NDUsIDB4NTgsIDB4MDEsIDB4ZmUsIDB4YjIsIDB4MTYsIDB4YWEsIDB4MDIsCisJMHgwYSwgMHg1YSwgMHgwMSwgMHgxOCwKKwkweGFhLCAweDBhLCAweDY3LCAweDAxLCAweGEzLCAweDAyLCAweDBhLCAweDVhLCAweDAxLCAweDE4LCAweDAxLCAweGZlLAorCTB4N2UsIDB4MWUsIDB4ZmUsIDB4ODAsCisJMHg0YywgMHhmZSwgMHg0OSwgMHhlNCwgMHgxYSwgMHhmZSwgMHgxMiwgMHgxMywgMHgwYSwgMHg5ZCwgMHgwMSwgMHgxOCwKKwkweGZlLCAweDgwLCAweDRjLCAweDBhLAorCTB4NjcsIDB4MDEsIDB4NWMsIDB4MDIsIDB4MWMsIDB4MWEsIDB4ODcsIDB4N2MsIDB4ZTUsIDB4ZmUsIDB4MTgsIDB4ZGYsCisJMHhmZSwgMHgxOSwgMHhkZSwgMHhmZSwKKwkweDI0LCAweDFjLCAweGZlLCAweDFkLCAweGY3LCAweDI4LCAweGIxLCAweGZlLCAweDA0LCAweDFiLCAweDAxLCAweGZlLAorCTB4MmEsIDB4MWMsIDB4ZmEsIDB4YjMsCisJMHgyOCwgMHg3YywgMHhmZSwgMHgyYywgMHgwMSwgMHhmZSwgMHgyZiwgMHgxOSwgMHgwMiwgMHhjOSwgMHgyYiwgMHhmZSwKKwkweGY0LCAweDFhLCAweGZlLCAweGZhLAorCTB4MTAsIDB4MWMsIDB4MWEsIDB4ODcsIDB4MDMsIDB4ZmUsIDB4NjQsIDB4MDEsIDB4ZmUsIDB4MDAsIDB4ZjQsIDB4MjQsCisJMHhmZSwgMHgxOCwgMHg1OCwgMHgwMywKKwkweGZlLCAweDY2LCAweDAxLCAweGZlLCAweDE5LCAweDU4LCAweGIzLCAweDI0LCAweDAxLCAweGZlLCAweDBlLCAweDFmLAorCTB4ZmUsIDB4MzAsIDB4ZjQsIDB4MDcsCisJMHhmZSwgMHgzYywgMHg1MCwgMHg3YywgMHhmZSwgMHgzOCwgMHgwMCwgMHhmZSwgMHgwZiwgMHg3OSwgMHhmZSwgMHgxYywKKwkweGY3LCAweDI0LCAweGIxLCAweGZlLAorCTB4NTAsIDB4MWIsIDB4ZmUsIDB4ZDQsIDB4MTQsIDB4MzEsIDB4MDIsIDB4YzksIDB4MmIsIDB4ZmUsIDB4MjYsIDB4MWIsCisJMHhmZSwgMHhiYSwgMHgxMCwgMHgxYywKKwkweDFhLCAweDg3LCAweGZlLCAweDgzLCAweDVhLCAweGZlLCAweDE4LCAweGRmLCAweGZlLCAweDE5LCAweGRlLCAweGZlLAorCTB4MWQsIDB4ZjcsIDB4NTQsIDB4YjEsCisJMHhmZSwgMHg3MiwgMHgxYiwgMHhmZSwgMHhiMiwgMHgxNCwgMHhmYywgMHhiMywgMHg1NCwgMHg3YywgMHgxMiwgMHhmZSwKKwkweGFmLCAweDE5LCAweGZlLCAweDk4LAorCTB4ZTcsIDB4MDAsIDB4MDIsIDB4YzksIDB4MmIsIDB4ZmUsIDB4NjYsIDB4MWIsIDB4ZmUsIDB4OGEsIDB4MTAsIDB4MWMsCisJMHgxYSwgMHg4NywgMHg4YiwgMHgwZiwKKwkweGZlLCAweDMwLCAweDkwLCAweDA0LCAweGZlLCAweGIwLCAweDkzLCAweDNhLCAweDBiLCAweGZlLCAweDE4LCAweDU4LAorCTB4ZmUsIDB4MzIsIDB4OTAsIDB4MDQsCisJMHhmZSwgMHhiMiwgMHg5MywgMHgzYSwgMHgwYiwgMHhmZSwgMHgxOSwgMHg1OCwgMHgwZSwgMHhhOCwgMHhiMywgMHg0YSwKKwkweDdjLCAweDEyLCAweGZlLCAweDBmLAorCTB4NzksIDB4ZmUsIDB4MWMsIDB4ZjcsIDB4NGEsIDB4YjEsIDB4ZmUsIDB4YzYsIDB4MWIsIDB4ZmUsIDB4NWUsIDB4MTQsCisJMHgzMSwgMHgwMiwgMHhjOSwgMHgyYiwKKwkweGZlLCAweDk2LCAweDFiLCAweDVjLCAweGZlLCAweDAyLCAweGY2LCAweDFhLCAweDg3LCAweGZlLCAweDE4LCAweGZlLAorCTB4NmEsIDB4ZmUsIDB4MTksIDB4ZmUsCisJMHg2YiwgMHgwMSwgMHhmZSwgMHgxZSwgMHgxZiwgMHhmZSwgMHgxZCwgMHhmNywgMHg2NSwgMHhiMSwgMHhmZSwgMHhlZSwKKwkweDFiLCAweGZlLCAweDM2LCAweDE0LAorCTB4ZmUsIDB4MWMsIDB4MTMsIDB4YjMsIDB4NjUsIDB4M2UsIDB4ZmUsIDB4ODMsIDB4NTgsIDB4ZmUsIDB4YWYsIDB4MTksCisJMHhmZSwgMHg4MCwgMHhlNywgMHgxYSwKKwkweGZlLCAweDgxLCAweGU3LCAweDFhLCAweDE1LCAweGZlLCAweGRkLCAweDAwLCAweDdhLCAweDMwLCAweDAyLCAweDdhLAorCTB4MzAsIDB4ZmUsIDB4MTIsIDB4NDUsCisJMHgyYiwgMHhmZSwgMHhkYywgMHgxYiwgMHgxZiwgMHgwNywgMHg0NywgMHhiNSwgMHhjMywgMHgwNSwgMHgzNSwgMHhmZSwKKwkweDM5LCAweGYwLCAweDc1LCAweDI2LAorCTB4MDIsIDB4ZmUsIDB4N2UsIDB4MTgsIDB4MjMsIDB4MWQsIDB4MzYsIDB4MTMsIDB4MTEsIDB4MDIsIDB4ODcsIDB4MDMsCisJMHhlMywgMHgyMywgMHgwNywgMHhmZSwKKwkweGVmLCAweDEyLCAweGZlLCAweGUxLCAweDEwLCAweDkwLCAweDM0LCAweDYwLCAweGZlLCAweDAyLCAweDgwLCAweDA5LAorCTB4NTYsIDB4ZmUsIDB4M2MsIDB4MTMsCisJMHhmZSwgMHg4MiwgMHgxNCwgMHhmZSwgMHg0MiwgMHgxMywgMHg1MSwgMHhmZSwgMHgwNiwgMHg4MywgMHgwYSwgMHg1YSwKKwkweDAxLCAweDE4LCAweGNiLCAweGZlLAorCTB4M2UsIDB4MTIsIDB4ZmUsIDB4NDEsIDB4NDgsIDB4ZmUsIDB4NDUsIDB4NDgsIDB4MDEsIDB4ZmUsIDB4YjIsIDB4MTYsCisJMHhmZSwgMHgwMCwgMHhjYywgMHhjYiwKKwkweGZlLCAweGYzLCAweDEzLCAweDNmLCAweDg5LCAweDA5LCAweDFhLCAweGE1LCAweDBhLCAweDlkLCAweDAxLCAweDE4LAorCTB4ZmUsIDB4ODAsIDB4NGMsIDB4MDEsCisJMHg4NSwgMHhmZSwgMHgxNiwgMHgxMCwgMHgwOSwgMHg5YiwgMHg0ZSwgMHhmZSwgMHg0MCwgMHgxNCwgMHhmZSwgMHgyNCwKKwkweDEyLCAweGZlLCAweDE0LCAweDU2LAorCTB4ZmUsIDB4ZDYsIDB4ZjAsIDB4ZmUsIDB4NTIsIDB4MWMsIDB4MWMsIDB4MGQsIDB4MDIsIDB4ZmUsIDB4OWMsIDB4ZTcsCisJMHgwZCwgMHgxOSwgMHhmZSwgMHgxNSwKKwkweDAwLCAweDQwLCAweDhkLCAweDMwLCAweDAxLCAweGY0LCAweDFjLCAweDA3LCAweDAyLCAweDUxLCAweGZlLCAweDA2LAorCTB4ODMsIDB4ZmUsIDB4MTgsIDB4ODAsCisJMHg2MSwgMHgyOCwgMHg0NCwgMHgxNSwgMHg1NiwgMHgwMSwgMHg4NSwgMHgxYywgMHgwNywgMHgwMiwgMHhmZSwgMHgzOCwKKwkweDkwLCAweGZlLCAweGJhLCAweDkwLAorCTB4OTEsIDB4ZGUsIDB4N2UsIDB4ZGYsIDB4ZmUsIDB4NDgsIDB4NTUsIDB4MzEsIDB4ZmUsIDB4YzksIDB4NTUsIDB4MDIsCisJMHgyMSwgMHhiOSwgMHg4OCwgMHgyMCwKKwkweGI5LCAweDAyLCAweDBhLCAweGJhLCAweDAxLCAweDE4LCAweGZlLCAweDQxLCAweDQ4LCAweDBhLCAweDU3LCAweDAxLAorCTB4MTgsIDB4ZmUsIDB4NDksIDB4NDQsCisJMHgxYiwgMHhmZSwgMHgxZSwgMHgxZCwgMHg4OCwgMHg4OSwgMHgwMiwgMHgwYSwgMHg1YSwgMHgwMSwgMHgxOCwgMHgwOSwKKwkweDFhLCAweGE0LCAweDBhLCAweDY3LAorCTB4MDEsIDB4YTMsIDB4MGEsIDB4NTcsIDB4MDEsIDB4MTgsIDB4ODgsIDB4ODksIDB4MDIsIDB4ZmUsIDB4NGUsIDB4ZTQsCisJMHgxZCwgMHg3YiwgMHhmZSwgMHg1MiwKKwkweDFkLCAweDAzLCAweGZlLCAweDkwLCAweDAwLCAweGZlLCAweDNhLCAweDQ1LCAweGZlLCAweDJjLCAweDEwLCAweGZlLAorCTB4NGUsIDB4ZTQsIDB4ZGQsIDB4N2IsCisJMHhmZSwgMHg2NCwgMHgxZCwgMHgwMywgMHhmZSwgMHg5MiwgMHgwMCwgMHhkMSwgMHgxMiwgMHhmZSwgMHgxYSwgMHgxMCwKKwkweGZlLCAweDRlLCAweGU0LCAweGZlLAorCTB4MGIsIDB4MDAsIDB4N2IsIDB4ZmUsIDB4NzYsIDB4MWQsIDB4MDMsIDB4ZmUsIDB4OTQsIDB4MDAsIDB4ZDEsIDB4MjQsCisJMHhmZSwgMHgwOCwgMHgxMCwgMHgwMywKKwkweGZlLCAweDk2LCAweDAwLCAweGQxLCAweDYzLCAweGZlLCAweDRlLCAweDQ1LCAweDgzLCAweGNhLCAweGZmLCAweDA0LAorCTB4NjgsIDB4NTQsIDB4ZmUsIDB4ZjEsCisJMHgxMCwgMHgyMywgMHg0OSwgMHhmZSwgMHgwOCwgMHgxYywgMHhmZSwgMHg2NywgMHgxOSwgMHhmZSwgMHgwYSwgMHgxYywKKwkweGZlLCAweDFhLCAweGY0LCAweGZlLAorCTB4MDAsIDB4MDQsIDB4ODMsIDB4YjIsIDB4MWQsIDB4NDgsIDB4ZmUsIDB4YWEsIDB4MWQsIDB4MTMsIDB4MWQsIDB4MDIsCisJMHgwOSwgMHg5MiwgMHhmZSwgMHg1YSwKKwkweGYwLCAweGZlLCAweGJhLCAweDFkLCAweDJlLCAweDkzLCAweGZlLCAweDM0LCAweDEwLCAweDA5LCAweDEyLCAweGZlLAorCTB4NWEsIDB4ZjAsIDB4ZmUsIDB4YzgsCisJMHgxZCwgMHgyZSwgMHhiNCwgMHhmZSwgMHgyNiwgMHgxMCwgMHgwOSwgMHgxZCwgMHgzNiwgMHgyZSwgMHg2MywgMHhmZSwKKwkweDFhLCAweDEwLCAweDA5LCAweDBkLAorCTB4MzYsIDB4MmUsIDB4OTQsIDB4ZjIsIDB4MDksIDB4MDcsIDB4MzYsIDB4MmUsIDB4OTUsIDB4YTEsIDB4YzgsIDB4MDIsCisJMHgxZiwgMHg5MywgMHgwMSwgMHg0MiwKKwkweGZlLCAweDA0LCAweGZlLCAweDk5LCAweDAzLCAweDljLCAweDhiLCAweDAyLCAweDJhLCAweGZlLCAweDFjLCAweDFlLAorCTB4ZmUsIDB4MTQsIDB4ZjAsIDB4MDgsCisJMHgyZiwgMHhmZSwgMHgwYywgMHgxZSwgMHgyYSwgMHhmZSwgMHgxYywgMHgxZSwgMHg4ZiwgMHhmZSwgMHgxYywgMHgxZSwKKwkweGZlLCAweDgyLCAweGYwLCAweGZlLAorCTB4MTAsIDB4MWUsIDB4MDIsIDB4MGYsIDB4M2YsIDB4MDQsIDB4ZmUsIDB4ODAsIDB4ODMsIDB4MzMsIDB4MGIsIDB4MGUsCisJMHgwMiwgMHgwZiwgMHhmZSwgMHgxOCwKKwkweDgwLCAweDA0LCAweGZlLCAweDk4LCAweDgzLCAweDMzLCAweDBiLCAweDBlLCAweDAyLCAweDBmLCAweGZlLCAweDAyLAorCTB4ODAsIDB4MDQsIDB4ZmUsIDB4ODIsCisJMHg4MywgMHgzMywgMHgwYiwgMHgwZSwgMHgwMiwgMHgwZiwgMHhmZSwgMHgwNiwgMHg4MCwgMHgwNCwgMHhmZSwgMHg4NiwKKwkweDgzLCAweDMzLCAweDBiLCAweDBlLAorCTB4MDIsIDB4MGYsIDB4ZmUsIDB4MWIsIDB4ODAsIDB4MDQsIDB4ZmUsIDB4OWIsIDB4ODMsIDB4MzMsIDB4MGIsIDB4MGUsCisJMHgwMiwgMHgwZiwgMHhmZSwgMHgwNCwKKwkweDgwLCAweDA0LCAweGZlLCAweDg0LCAweDgzLCAweDMzLCAweDBiLCAweDBlLCAweDAyLCAweDBmLCAweGZlLCAweDgwLAorCTB4ODAsIDB4MDQsIDB4ZmUsIDB4ODAsCisJMHg4MywgMHhmZSwgMHhjOSwgMHg0NywgMHgwYiwgMHgwZSwgMHgwMiwgMHgwZiwgMHhmZSwgMHgxOSwgMHg4MSwgMHgwNCwKKwkweGZlLCAweDk5LCAweDgzLCAweGZlLAorCTB4Y2EsIDB4NDcsIDB4MGIsIDB4MGUsIDB4MDIsIDB4MGYsIDB4ZmUsIDB4MDYsIDB4ODMsIDB4MDQsIDB4ZmUsIDB4ODYsCisJMHg4MywgMHhmZSwgMHhjZSwgMHg0NywKKwkweDBiLCAweDBlLCAweDAyLCAweDBmLCAweGZlLCAweDJjLCAweDkwLCAweDA0LCAweGZlLCAweGFjLCAweDkzLCAweDNhLAorCTB4MGIsIDB4MGUsIDB4MDIsIDB4MGYsCisJMHhmZSwgMHhhZSwgMHg5MCwgMHgwNCwgMHhmZSwgMHhhZSwgMHg5MywgMHg3OSwgMHgwYiwgMHgwZSwgMHgwMiwgMHgwZiwKKwkweGZlLCAweDA4LCAweDkwLCAweDA0LAorCTB4ZmUsIDB4ODgsIDB4OTMsIDB4M2EsIDB4MGIsIDB4MGUsIDB4MDIsIDB4MGYsIDB4ZmUsIDB4OGEsIDB4OTAsIDB4MDQsCisJMHhmZSwgMHg4YSwgMHg5MywgMHg3OSwKKwkweDBiLCAweDBlLCAweDAyLCAweDBmLCAweGZlLCAweDBjLCAweDkwLCAweDA0LCAweGZlLCAweDhjLCAweDkzLCAweDNhLAorCTB4MGIsIDB4MGUsIDB4MDIsIDB4MGYsCisJMHhmZSwgMHg4ZSwgMHg5MCwgMHgwNCwgMHhmZSwgMHg4ZSwgMHg5MywgMHg3OSwgMHgwYiwgMHgwZSwgMHgwMiwgMHgwZiwKKwkweGZlLCAweDNjLCAweDkwLCAweDA0LAorCTB4ZmUsIDB4YmMsIDB4OTMsIDB4M2EsIDB4MGIsIDB4MGUsIDB4MDIsIDB4OGIsIDB4MGYsIDB4ZmUsIDB4MDMsIDB4ODAsCisJMHgwNCwgMHhmZSwgMHg4MywgMHg4MywKKwkweDMzLCAweDBiLCAweDc3LCAweDBlLCAweGE4LCAweDAyLCAweGZmLCAweDY2LCAweDAwLCAweDAwLAogfTsKIAotU1RBVElDIHVuc2lnbmVkIHNob3J0IF9hZHZfYXNjMzhDMTYwMF9zaXplID0KLSAgICAgICAgc2l6ZW9mKF9hZHZfYXNjMzhDMTYwMF9idWYpOyAvKiAweDE2NzMgKi8KLVNUQVRJQyBBRFZfRENOVCBfYWR2X2FzYzM4QzE2MDBfY2hrc3VtID0KLSAgICAgICAgMHgwNjA0RUY3N1VMOyAvKiBFeHBhbmRlZCBsaXR0bGUtZW5kaWFuIGNoZWNrc3VtLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IF9hZHZfYXNjMzhDMTYwMF9zaXplID0gc2l6ZW9mKF9hZHZfYXNjMzhDMTYwMF9idWYpOwkvKiAweDE2NzMgKi8KK3N0YXRpYyBBRFZfRENOVCBfYWR2X2FzYzM4QzE2MDBfY2hrc3VtID0gMHgwNjA0RUY3N1VMOwkvKiBFeHBhbmRlZCBsaXR0bGUtZW5kaWFuIGNoZWNrc3VtLiAqLwogCiAvKiBhX2luaXQuYyAqLwogLyoKQEAgLTE0MDQ5LDM0MCArMTM4NDcsMzQwIEBACiAgKiBvbiBiaWctZW5kaWFuIHBsYXRmb3JtcyBzbyBjaGFyIGZpZWxkcyByZWFkIGFzIHdvcmRzIGFyZSBhY3R1YWxseSBiZWluZwogICogdW5zd2FwcGVkIG9uIGJpZy1lbmRpYW4gcGxhdGZvcm1zLgogICovCi1TVEFUSUMgQURWRUVQXzM1NTBfQ09ORklHCi1EZWZhdWx0XzM1NTBfRUVQUk9NX0NvbmZpZyBfX2luaXRkYXRhID0gewotICAgIEFEVl9FRVBST01fQklPU19FTkFCTEUsICAgICAvKiBjZmdfbHN3ICovCi0gICAgMHgwMDAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGNmZ19tc3cgKi8KLSAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogZGlzY19lbmFibGUgKi8KLSAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogd2R0cl9hYmxlICovCi0gICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIHNkdHJfYWJsZSAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydF9tb3RvciAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiB0YWdxbmdfYWJsZSAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiBiaW9zX3NjYW4gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbV90b2xlcmFudCAqLwotICAgIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGVyX3Njc2lfaWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19ib290X2RlbGF5ICovCi0gICAgMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjc2lfcmVzZXRfZGVsYXkgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19pZF9sdW4gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpb24gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQxICovCi0gICAgMHhGRkU3LCAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfY3RybCAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiB1bHRyYV9hYmxlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkMiAqLwotICAgIEFTQ19ERUZfTUFYX0hPU1RfUU5HLCAgICAgICAvKiBtYXhfaG9zdF9xbmcgKi8KLSAgICBBU0NfREVGX01BWF9EVkNfUU5HLCAgICAgICAgLyogbWF4X2R2Y19xbmcgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHZjX2NudGwgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVnX2ZpeCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfbnVtYmVyX3dvcmQxICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcmlhbF9udW1iZXJfd29yZDIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsX251bWJlcl93b3JkMyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja19zdW0gKi8KLSAgICB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfSwgLyogb2VtX25hbWVbMTZdICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR2Y19lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZHZfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2X2Vycl9hZGRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkX2R2Y19lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZWRfYWR2X2Vycl9hZGRyICovCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bV9vZl9lcnIgKi8KK3N0YXRpYyBBRFZFRVBfMzU1MF9DT05GSUcgRGVmYXVsdF8zNTUwX0VFUFJPTV9Db25maWcgX19pbml0ZGF0YSA9IHsKKwlBRFZfRUVQUk9NX0JJT1NfRU5BQkxFLAkvKiBjZmdfbHN3ICovCisJMHgwMDAwLAkJCS8qIGNmZ19tc3cgKi8KKwkweEZGRkYsCQkJLyogZGlzY19lbmFibGUgKi8KKwkweEZGRkYsCQkJLyogd2R0cl9hYmxlICovCisJMHhGRkZGLAkJCS8qIHNkdHJfYWJsZSAqLworCTB4RkZGRiwJCQkvKiBzdGFydF9tb3RvciAqLworCTB4RkZGRiwJCQkvKiB0YWdxbmdfYWJsZSAqLworCTB4RkZGRiwJCQkvKiBiaW9zX3NjYW4gKi8KKwkwLAkJCS8qIHNjYW1fdG9sZXJhbnQgKi8KKwk3LAkJCS8qIGFkYXB0ZXJfc2NzaV9pZCAqLworCTAsCQkJLyogYmlvc19ib290X2RlbGF5ICovCisJMywJCQkvKiBzY3NpX3Jlc2V0X2RlbGF5ICovCisJMCwJCQkvKiBiaW9zX2lkX2x1biAqLworCTAsCQkJLyogdGVybWluYXRpb24gKi8KKwkwLAkJCS8qIHJlc2VydmVkMSAqLworCTB4RkZFNywJCQkvKiBiaW9zX2N0cmwgKi8KKwkweEZGRkYsCQkJLyogdWx0cmFfYWJsZSAqLworCTAsCQkJLyogcmVzZXJ2ZWQyICovCisJQVNDX0RFRl9NQVhfSE9TVF9RTkcsCS8qIG1heF9ob3N0X3FuZyAqLworCUFTQ19ERUZfTUFYX0RWQ19RTkcsCS8qIG1heF9kdmNfcW5nICovCisJMCwJCQkvKiBkdmNfY250bCAqLworCTAsCQkJLyogYnVnX2ZpeCAqLworCTAsCQkJLyogc2VyaWFsX251bWJlcl93b3JkMSAqLworCTAsCQkJLyogc2VyaWFsX251bWJlcl93b3JkMiAqLworCTAsCQkJLyogc2VyaWFsX251bWJlcl93b3JkMyAqLworCTAsCQkJLyogY2hlY2tfc3VtICovCisJezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJLAkJCS8qIG9lbV9uYW1lWzE2XSAqLworCTAsCQkJLyogZHZjX2Vycl9jb2RlICovCisJMCwJCQkvKiBhZHZfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIGFkdl9lcnJfYWRkciAqLworCTAsCQkJLyogc2F2ZWRfZHZjX2Vycl9jb2RlICovCisJMCwJCQkvKiBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIHNhdmVkX2Fkdl9lcnJfYWRkciAqLworCTAJCQkvKiBudW1fb2ZfZXJyICovCiB9OwogCi1TVEFUSUMgQURWRUVQXzM1NTBfQ09ORklHCi1BRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyIF9faW5pdGRhdGEgPSB7Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNmZ19sc3cgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2ZnX21zdyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtZGlzY19lbmFibGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2R0cl9hYmxlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNkdHJfYWJsZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydF9tb3RvciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWdxbmdfYWJsZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW9zX3NjYW4gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbV90b2xlcmFudCAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGVyX3Njc2lfaWQgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19ib290X2RlbGF5ICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjc2lfcmVzZXRfZGVsYXkgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmlvc19pZF9sdW4gKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpb24gKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQxICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpb3NfY3RybCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bHRyYV9hYmxlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkMiAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhfaG9zdF9xbmcgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4X2R2Y19xbmcgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHZjX2NudGwgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVnX2ZpeCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfbnVtYmVyX3dvcmQxICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcmlhbF9udW1iZXJfd29yZDIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsX251bWJlcl93b3JkMyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja19zdW0gKi8KLSAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogb2VtX25hbWVbMTZdICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR2Y19lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZHZfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWR2X2Vycl9hZGRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkX2R2Y19lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZWRfYWR2X2Vycl9hZGRyICovCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bV9vZl9lcnIgKi8KK3N0YXRpYyBBRFZFRVBfMzU1MF9DT05GSUcgQURWRUVQXzM1NTBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0geworCTAsCQkJLyogY2ZnX2xzdyAqLworCTAsCQkJLyogY2ZnX21zdyAqLworCTAsCQkJLyogLWRpc2NfZW5hYmxlICovCisJMCwJCQkvKiB3ZHRyX2FibGUgKi8KKwkwLAkJCS8qIHNkdHJfYWJsZSAqLworCTAsCQkJLyogc3RhcnRfbW90b3IgKi8KKwkwLAkJCS8qIHRhZ3FuZ19hYmxlICovCisJMCwJCQkvKiBiaW9zX3NjYW4gKi8KKwkwLAkJCS8qIHNjYW1fdG9sZXJhbnQgKi8KKwkxLAkJCS8qIGFkYXB0ZXJfc2NzaV9pZCAqLworCTEsCQkJLyogYmlvc19ib290X2RlbGF5ICovCisJMSwJCQkvKiBzY3NpX3Jlc2V0X2RlbGF5ICovCisJMSwJCQkvKiBiaW9zX2lkX2x1biAqLworCTEsCQkJLyogdGVybWluYXRpb24gKi8KKwkxLAkJCS8qIHJlc2VydmVkMSAqLworCTAsCQkJLyogYmlvc19jdHJsICovCisJMCwJCQkvKiB1bHRyYV9hYmxlICovCisJMCwJCQkvKiByZXNlcnZlZDIgKi8KKwkxLAkJCS8qIG1heF9ob3N0X3FuZyAqLworCTEsCQkJLyogbWF4X2R2Y19xbmcgKi8KKwkwLAkJCS8qIGR2Y19jbnRsICovCisJMCwJCQkvKiBidWdfZml4ICovCisJMCwJCQkvKiBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisJMCwJCQkvKiBzZXJpYWxfbnVtYmVyX3dvcmQyICovCisJMCwJCQkvKiBzZXJpYWxfbnVtYmVyX3dvcmQzICovCisJMCwJCQkvKiBjaGVja19zdW0gKi8KKwl7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0KKwksCQkJLyogb2VtX25hbWVbMTZdICovCisJMCwJCQkvKiBkdmNfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIGFkdl9lcnJfY29kZSAqLworCTAsCQkJLyogYWR2X2Vycl9hZGRyICovCisJMCwJCQkvKiBzYXZlZF9kdmNfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIHNhdmVkX2Fkdl9lcnJfY29kZSAqLworCTAsCQkJLyogc2F2ZWRfYWR2X2Vycl9hZGRyICovCisJMAkJCS8qIG51bV9vZl9lcnIgKi8KIH07CiAKLVNUQVRJQyBBRFZFRVBfMzhDMDgwMF9DT05GSUcKLURlZmF1bHRfMzhDMDgwMF9FRVBST01fQ29uZmlnIF9faW5pdGRhdGEgPSB7Ci0gICAgQURWX0VFUFJPTV9CSU9TX0VOQUJMRSwgICAgIC8qIDAwIGNmZ19sc3cgKi8KLSAgICAweDAwMDAsICAgICAgICAgICAgICAgICAgICAgLyogMDEgY2ZnX21zdyAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMiBkaXNjX2VuYWJsZSAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwMyB3ZHRyX2FibGUgKi8KLSAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMDQgc2R0cl9zcGVlZDEgKi8KLSAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDUgc3RhcnRfbW90b3IgKi8KLSAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDYgdGFncW5nX2FibGUgKi8KLSAgICAweEZGRkYsICAgICAgICAgICAgICAgICAgICAgLyogMDcgYmlvc19zY2FuICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KLSAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDkgYWRhcHRlcl9zY3NpX2lkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfYm9vdF9kZWxheSAqLwotICAgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfaWRfbHVuICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIHRlcm1pbmF0aW9uX3NlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLwotICAgIDB4RkZFNywgICAgICAgICAgICAgICAgICAgICAvKiAxMiBiaW9zX2N0cmwgKi8KLSAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2R0cl9zcGVlZDIgKi8KLSAgICAweDQ0NDQsICAgICAgICAgICAgICAgICAgICAgLyogMTQgc2R0cl9zcGVlZDMgKi8KLSAgICBBU0NfREVGX01BWF9IT1NUX1FORywgICAgICAgLyogMTUgbWF4X2hvc3RfcW5nICovCi0gICAgQVNDX0RFRl9NQVhfRFZDX1FORywgICAgICAgIC8qICAgIG1heF9kdmNfcW5nICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGR2Y19jbnRsICovCi0gICAgMHg0NDQ0LCAgICAgICAgICAgICAgICAgICAgIC8qIDE3IHNkdHJfc3BlZWQ0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIGNoZWNrX3N1bSAqLwotICAgIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9LCAvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgZHZjX2Vycl9jb2RlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGFkdl9lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBhZHZfZXJyX2FkZHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTYgY2lzcHRyX2xzdyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NyBjaXNwcnRfbXN3ICovCi0gICAgUENJX1ZFTkRPUl9JRF9BU1AsICAgICAgICAgIC8qIDU4IHN1YnN5c3ZpZCAqLwotICAgIFBDSV9ERVZJQ0VfSURfMzhDMDgwMF9SRVYxLCAvKiA1OSBzdWJzeXNpZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiByZXNlcnZlZCAqLwotICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyByZXNlcnZlZCAqLworc3RhdGljIEFEVkVFUF8zOEMwODAwX0NPTkZJRyBEZWZhdWx0XzM4QzA4MDBfRUVQUk9NX0NvbmZpZyBfX2luaXRkYXRhID0geworCUFEVl9FRVBST01fQklPU19FTkFCTEUsCS8qIDAwIGNmZ19sc3cgKi8KKwkweDAwMDAsCQkJLyogMDEgY2ZnX21zdyAqLworCTB4RkZGRiwJCQkvKiAwMiBkaXNjX2VuYWJsZSAqLworCTB4RkZGRiwJCQkvKiAwMyB3ZHRyX2FibGUgKi8KKwkweDQ0NDQsCQkJLyogMDQgc2R0cl9zcGVlZDEgKi8KKwkweEZGRkYsCQkJLyogMDUgc3RhcnRfbW90b3IgKi8KKwkweEZGRkYsCQkJLyogMDYgdGFncW5nX2FibGUgKi8KKwkweEZGRkYsCQkJLyogMDcgYmlvc19zY2FuICovCisJMCwJCQkvKiAwOCBzY2FtX3RvbGVyYW50ICovCisJNywJCQkvKiAwOSBhZGFwdGVyX3Njc2lfaWQgKi8KKwkwLAkJCS8qICAgIGJpb3NfYm9vdF9kZWxheSAqLworCTMsCQkJLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLworCTAsCQkJLyogICAgYmlvc19pZF9sdW4gKi8KKwkwLAkJCS8qIDExIHRlcm1pbmF0aW9uX3NlICovCisJMCwJCQkvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KKwkweEZGRTcsCQkJLyogMTIgYmlvc19jdHJsICovCisJMHg0NDQ0LAkJCS8qIDEzIHNkdHJfc3BlZWQyICovCisJMHg0NDQ0LAkJCS8qIDE0IHNkdHJfc3BlZWQzICovCisJQVNDX0RFRl9NQVhfSE9TVF9RTkcsCS8qIDE1IG1heF9ob3N0X3FuZyAqLworCUFTQ19ERUZfTUFYX0RWQ19RTkcsCS8qICAgIG1heF9kdmNfcW5nICovCisJMCwJCQkvKiAxNiBkdmNfY250bCAqLworCTB4NDQ0NCwJCQkvKiAxNyBzZHRyX3NwZWVkNCAqLworCTAsCQkJLyogMTggc2VyaWFsX251bWJlcl93b3JkMSAqLworCTAsCQkJLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLworCTAsCQkJLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLworCTAsCQkJLyogMjEgY2hlY2tfc3VtICovCisJezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJLAkJCS8qIDIyLTI5IG9lbV9uYW1lWzE2XSAqLworCTAsCQkJLyogMzAgZHZjX2Vycl9jb2RlICovCisJMCwJCQkvKiAzMSBhZHZfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIDMyIGFkdl9lcnJfYWRkciAqLworCTAsCQkJLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCisJMCwJCQkvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIDM1IHNhdmVkX2Fkdl9lcnJfYWRkciAqLworCTAsCQkJLyogMzYgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDM3IHJlc2VydmVkICovCisJMCwJCQkvKiAzOCByZXNlcnZlZCAqLworCTAsCQkJLyogMzkgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQwIHJlc2VydmVkICovCisJMCwJCQkvKiA0MSByZXNlcnZlZCAqLworCTAsCQkJLyogNDIgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQzIHJlc2VydmVkICovCisJMCwJCQkvKiA0NCByZXNlcnZlZCAqLworCTAsCQkJLyogNDUgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ2IHJlc2VydmVkICovCisJMCwJCQkvKiA0NyByZXNlcnZlZCAqLworCTAsCQkJLyogNDggcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ5IHJlc2VydmVkICovCisJMCwJCQkvKiA1MCByZXNlcnZlZCAqLworCTAsCQkJLyogNTEgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDUyIHJlc2VydmVkICovCisJMCwJCQkvKiA1MyByZXNlcnZlZCAqLworCTAsCQkJLyogNTQgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDU1IHJlc2VydmVkICovCisJMCwJCQkvKiA1NiBjaXNwdHJfbHN3ICovCisJMCwJCQkvKiA1NyBjaXNwcnRfbXN3ICovCisJUENJX1ZFTkRPUl9JRF9BU1AsCS8qIDU4IHN1YnN5c3ZpZCAqLworCVBDSV9ERVZJQ0VfSURfMzhDMDgwMF9SRVYxLAkvKiA1OSBzdWJzeXNpZCAqLworCTAsCQkJLyogNjAgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDYxIHJlc2VydmVkICovCisJMCwJCQkvKiA2MiByZXNlcnZlZCAqLworCTAJCQkvKiA2MyByZXNlcnZlZCAqLwogfTsKIAotU1RBVElDIEFEVkVFUF8zOEMwODAwX0NPTkZJRwotQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0gewotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMCBjZmdfbHN3ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxIGNmZ19tc3cgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDIgZGlzY19lbmFibGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDMgd2R0cl9hYmxlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0IHNkdHJfc3BlZWQxICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1IHN0YXJ0X21vdG9yICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2IHRhZ3FuZ19hYmxlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA3IGJpb3Nfc2NhbiAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOCBzY2FtX3RvbGVyYW50ICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2Jvb3RfZGVsYXkgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBiaW9zX2lkX2x1biAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMSB0ZXJtaW5hdGlvbl9zZSAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTIgYmlvc19jdHJsICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzIHNkdHJfc3BlZWQyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0IHNkdHJfc3BlZWQzICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1IG1heF9ob3N0X3FuZyAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBtYXhfZHZjX3FuZyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBkdmNfY250bCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNyBzZHRyX3NwZWVkNCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOCBzZXJpYWxfbnVtYmVyX3dvcmQxICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE5IHNlcmlhbF9udW1iZXJfd29yZDIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMSBjaGVja19zdW0gKi8KLSAgICB7IDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEgfSwgLyogMjItMjkgb2VtX25hbWVbMTZdICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMwIGR2Y19lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMSBhZHZfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYWR2X2Vycl9hZGRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMzIHNhdmVkX2R2Y19lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzUgc2F2ZWRfYWR2X2Vycl9hZGRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM3IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM4IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM5IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQwIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQxIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQyIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ0IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ1IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ2IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ3IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ5IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUwIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUxIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUyIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUzIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU0IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU1IHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU2IGNpc3B0cl9sc3cgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTcgY2lzcHJ0X21zdyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OCBzdWJzeXN2aWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTkgc3Vic3lzaWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjAgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjEgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjIgcmVzZXJ2ZWQgKi8KLSAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjMgcmVzZXJ2ZWQgKi8KK3N0YXRpYyBBRFZFRVBfMzhDMDgwMF9DT05GSUcgQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhciBfX2luaXRkYXRhID0geworCTAsCQkJLyogMDAgY2ZnX2xzdyAqLworCTAsCQkJLyogMDEgY2ZnX21zdyAqLworCTAsCQkJLyogMDIgZGlzY19lbmFibGUgKi8KKwkwLAkJCS8qIDAzIHdkdHJfYWJsZSAqLworCTAsCQkJLyogMDQgc2R0cl9zcGVlZDEgKi8KKwkwLAkJCS8qIDA1IHN0YXJ0X21vdG9yICovCisJMCwJCQkvKiAwNiB0YWdxbmdfYWJsZSAqLworCTAsCQkJLyogMDcgYmlvc19zY2FuICovCisJMCwJCQkvKiAwOCBzY2FtX3RvbGVyYW50ICovCisJMSwJCQkvKiAwOSBhZGFwdGVyX3Njc2lfaWQgKi8KKwkxLAkJCS8qICAgIGJpb3NfYm9vdF9kZWxheSAqLworCTEsCQkJLyogMTAgc2NzaV9yZXNldF9kZWxheSAqLworCTEsCQkJLyogICAgYmlvc19pZF9sdW4gKi8KKwkxLAkJCS8qIDExIHRlcm1pbmF0aW9uX3NlICovCisJMSwJCQkvKiAgICB0ZXJtaW5hdGlvbl9sdmQgKi8KKwkwLAkJCS8qIDEyIGJpb3NfY3RybCAqLworCTAsCQkJLyogMTMgc2R0cl9zcGVlZDIgKi8KKwkwLAkJCS8qIDE0IHNkdHJfc3BlZWQzICovCisJMSwJCQkvKiAxNSBtYXhfaG9zdF9xbmcgKi8KKwkxLAkJCS8qICAgIG1heF9kdmNfcW5nICovCisJMCwJCQkvKiAxNiBkdmNfY250bCAqLworCTAsCQkJLyogMTcgc2R0cl9zcGVlZDQgKi8KKwkwLAkJCS8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KKwkwLAkJCS8qIDE5IHNlcmlhbF9udW1iZXJfd29yZDIgKi8KKwkwLAkJCS8qIDIwIHNlcmlhbF9udW1iZXJfd29yZDMgKi8KKwkwLAkJCS8qIDIxIGNoZWNrX3N1bSAqLworCXsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfQorCSwJCQkvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KKwkwLAkJCS8qIDMwIGR2Y19lcnJfY29kZSAqLworCTAsCQkJLyogMzEgYWR2X2Vycl9jb2RlICovCisJMCwJCQkvKiAzMiBhZHZfZXJyX2FkZHIgKi8KKwkwLAkJCS8qIDMzIHNhdmVkX2R2Y19lcnJfY29kZSAqLworCTAsCQkJLyogMzQgc2F2ZWRfYWR2X2Vycl9jb2RlICovCisJMCwJCQkvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KKwkwLAkJCS8qIDM2IHJlc2VydmVkICovCisJMCwJCQkvKiAzNyByZXNlcnZlZCAqLworCTAsCQkJLyogMzggcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDM5IHJlc2VydmVkICovCisJMCwJCQkvKiA0MCByZXNlcnZlZCAqLworCTAsCQkJLyogNDEgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQyIHJlc2VydmVkICovCisJMCwJCQkvKiA0MyByZXNlcnZlZCAqLworCTAsCQkJLyogNDQgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ1IHJlc2VydmVkICovCisJMCwJCQkvKiA0NiByZXNlcnZlZCAqLworCTAsCQkJLyogNDcgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ4IHJlc2VydmVkICovCisJMCwJCQkvKiA0OSByZXNlcnZlZCAqLworCTAsCQkJLyogNTAgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDUxIHJlc2VydmVkICovCisJMCwJCQkvKiA1MiByZXNlcnZlZCAqLworCTAsCQkJLyogNTMgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDU0IHJlc2VydmVkICovCisJMCwJCQkvKiA1NSByZXNlcnZlZCAqLworCTAsCQkJLyogNTYgY2lzcHRyX2xzdyAqLworCTAsCQkJLyogNTcgY2lzcHJ0X21zdyAqLworCTAsCQkJLyogNTggc3Vic3lzdmlkICovCisJMCwJCQkvKiA1OSBzdWJzeXNpZCAqLworCTAsCQkJLyogNjAgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDYxIHJlc2VydmVkICovCisJMCwJCQkvKiA2MiByZXNlcnZlZCAqLworCTAJCQkvKiA2MyByZXNlcnZlZCAqLwogfTsKIAotU1RBVElDIEFEVkVFUF8zOEMxNjAwX0NPTkZJRwotRGVmYXVsdF8zOEMxNjAwX0VFUFJPTV9Db25maWcgX19pbml0ZGF0YSA9IHsKLSAgICBBRFZfRUVQUk9NX0JJT1NfRU5BQkxFLCAgICAgLyogMDAgY2ZnX2xzdyAqLwotICAgIDB4MDAwMCwgICAgICAgICAgICAgICAgICAgICAvKiAwMSBjZmdfbXN3ICovCi0gICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIDAyIGRpc2NfZW5hYmxlICovCi0gICAgMHhGRkZGLCAgICAgICAgICAgICAgICAgICAgIC8qIDAzIHdkdHJfYWJsZSAqLwotICAgIDB4NTU1NSwgICAgICAgICAgICAgICAgICAgICAvKiAwNCBzZHRyX3NwZWVkMSAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwNSBzdGFydF9tb3RvciAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwNiB0YWdxbmdfYWJsZSAqLwotICAgIDB4RkZGRiwgICAgICAgICAgICAgICAgICAgICAvKiAwNyBiaW9zX3NjYW4gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDggc2NhbV90b2xlcmFudCAqLwotICAgIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOSBhZGFwdGVyX3Njc2lfaWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgYmlvc19ib290X2RlbGF5ICovCi0gICAgMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwIHNjc2lfcmVzZXRfZGVsYXkgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgYmlvc19pZF9sdW4gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTEgdGVybWluYXRpb25fc2UgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgdGVybWluYXRpb25fbHZkICovCi0gICAgMHhGRkU3LCAgICAgICAgICAgICAgICAgICAgIC8qIDEyIGJpb3NfY3RybCAqLwotICAgIDB4NTU1NSwgICAgICAgICAgICAgICAgICAgICAvKiAxMyBzZHRyX3NwZWVkMiAqLwotICAgIDB4NTU1NSwgICAgICAgICAgICAgICAgICAgICAvKiAxNCBzZHRyX3NwZWVkMyAqLwotICAgIEFTQ19ERUZfTUFYX0hPU1RfUU5HLCAgICAgICAvKiAxNSBtYXhfaG9zdF9xbmcgKi8KLSAgICBBU0NfREVGX01BWF9EVkNfUU5HLCAgICAgICAgLyogICAgbWF4X2R2Y19xbmcgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgZHZjX2NudGwgKi8KLSAgICAweDU1NTUsICAgICAgICAgICAgICAgICAgICAgLyogMTcgc2R0cl9zcGVlZDQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTggc2VyaWFsX251bWJlcl93b3JkMSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOSBzZXJpYWxfbnVtYmVyX3dvcmQyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwIHNlcmlhbF9udW1iZXJfd29yZDMgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjEgY2hlY2tfc3VtICovCi0gICAgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0sIC8qIDIyLTI5IG9lbV9uYW1lWzE2XSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMCBkdmNfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzEgYWR2X2Vycl9jb2RlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIGFkdl9lcnJfYWRkciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMyBzYXZlZF9kdmNfZXJyX2NvZGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzQgc2F2ZWRfYWR2X2Vycl9jb2RlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1IHNhdmVkX2Fkdl9lcnJfYWRkciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNiByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNyByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzOCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzOSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MiByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0MyByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NiByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0NyByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1MCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1MSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1MiByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1MyByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NiBjaXNwdHJfbHN3ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU3IGNpc3BydF9tc3cgKi8KLSAgICBQQ0lfVkVORE9SX0lEX0FTUCwgICAgICAgICAgLyogNTggc3Vic3lzdmlkICovCi0gICAgUENJX0RFVklDRV9JRF8zOEMxNjAwX1JFVjEsIC8qIDU5IHN1YnN5c2lkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYwIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYxIHJlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYyIHJlc2VydmVkICovCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYzIHJlc2VydmVkICovCitzdGF0aWMgQURWRUVQXzM4QzE2MDBfQ09ORklHIERlZmF1bHRfMzhDMTYwMF9FRVBST01fQ29uZmlnIF9faW5pdGRhdGEgPSB7CisJQURWX0VFUFJPTV9CSU9TX0VOQUJMRSwJLyogMDAgY2ZnX2xzdyAqLworCTB4MDAwMCwJCQkvKiAwMSBjZmdfbXN3ICovCisJMHhGRkZGLAkJCS8qIDAyIGRpc2NfZW5hYmxlICovCisJMHhGRkZGLAkJCS8qIDAzIHdkdHJfYWJsZSAqLworCTB4NTU1NSwJCQkvKiAwNCBzZHRyX3NwZWVkMSAqLworCTB4RkZGRiwJCQkvKiAwNSBzdGFydF9tb3RvciAqLworCTB4RkZGRiwJCQkvKiAwNiB0YWdxbmdfYWJsZSAqLworCTB4RkZGRiwJCQkvKiAwNyBiaW9zX3NjYW4gKi8KKwkwLAkJCS8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KKwk3LAkJCS8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLworCTAsCQkJLyogICAgYmlvc19ib290X2RlbGF5ICovCisJMywJCQkvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCisJMCwJCQkvKiAgICBiaW9zX2lkX2x1biAqLworCTAsCQkJLyogMTEgdGVybWluYXRpb25fc2UgKi8KKwkwLAkJCS8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLworCTB4RkZFNywJCQkvKiAxMiBiaW9zX2N0cmwgKi8KKwkweDU1NTUsCQkJLyogMTMgc2R0cl9zcGVlZDIgKi8KKwkweDU1NTUsCQkJLyogMTQgc2R0cl9zcGVlZDMgKi8KKwlBU0NfREVGX01BWF9IT1NUX1FORywJLyogMTUgbWF4X2hvc3RfcW5nICovCisJQVNDX0RFRl9NQVhfRFZDX1FORywJLyogICAgbWF4X2R2Y19xbmcgKi8KKwkwLAkJCS8qIDE2IGR2Y19jbnRsICovCisJMHg1NTU1LAkJCS8qIDE3IHNkdHJfc3BlZWQ0ICovCisJMCwJCQkvKiAxOCBzZXJpYWxfbnVtYmVyX3dvcmQxICovCisJMCwJCQkvKiAxOSBzZXJpYWxfbnVtYmVyX3dvcmQyICovCisJMCwJCQkvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCisJMCwJCQkvKiAyMSBjaGVja19zdW0gKi8KKwl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKwksCQkJLyogMjItMjkgb2VtX25hbWVbMTZdICovCisJMCwJCQkvKiAzMCBkdmNfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIDMxIGFkdl9lcnJfY29kZSAqLworCTAsCQkJLyogMzIgYWR2X2Vycl9hZGRyICovCisJMCwJCQkvKiAzMyBzYXZlZF9kdmNfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLworCTAsCQkJLyogMzUgc2F2ZWRfYWR2X2Vycl9hZGRyICovCisJMCwJCQkvKiAzNiByZXNlcnZlZCAqLworCTAsCQkJLyogMzcgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDM4IHJlc2VydmVkICovCisJMCwJCQkvKiAzOSByZXNlcnZlZCAqLworCTAsCQkJLyogNDAgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQxIHJlc2VydmVkICovCisJMCwJCQkvKiA0MiByZXNlcnZlZCAqLworCTAsCQkJLyogNDMgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ0IHJlc2VydmVkICovCisJMCwJCQkvKiA0NSByZXNlcnZlZCAqLworCTAsCQkJLyogNDYgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ3IHJlc2VydmVkICovCisJMCwJCQkvKiA0OCByZXNlcnZlZCAqLworCTAsCQkJLyogNDkgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDUwIHJlc2VydmVkICovCisJMCwJCQkvKiA1MSByZXNlcnZlZCAqLworCTAsCQkJLyogNTIgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDUzIHJlc2VydmVkICovCisJMCwJCQkvKiA1NCByZXNlcnZlZCAqLworCTAsCQkJLyogNTUgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDU2IGNpc3B0cl9sc3cgKi8KKwkwLAkJCS8qIDU3IGNpc3BydF9tc3cgKi8KKwlQQ0lfVkVORE9SX0lEX0FTUCwJLyogNTggc3Vic3lzdmlkICovCisJUENJX0RFVklDRV9JRF8zOEMxNjAwX1JFVjEsCS8qIDU5IHN1YnN5c2lkICovCisJMCwJCQkvKiA2MCByZXNlcnZlZCAqLworCTAsCQkJLyogNjEgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDYyIHJlc2VydmVkICovCisJMAkJCS8qIDYzIHJlc2VydmVkICovCiB9OwogCi1TVEFUSUMgQURWRUVQXzM4QzE2MDBfQ09ORklHCi1BRFZFRVBfMzhDMTYwMF9Db25maWdfRmllbGRfSXNDaGFyIF9faW5pdGRhdGEgPSB7Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwIGNmZ19sc3cgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDEgY2ZnX21zdyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMiBkaXNjX2VuYWJsZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMyB3ZHRyX2FibGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDQgc2R0cl9zcGVlZDEgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDUgc3RhcnRfbW90b3IgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDYgdGFncW5nX2FibGUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDcgYmlvc19zY2FuICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDkgYWRhcHRlcl9zY3NpX2lkICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfYm9vdF9kZWxheSAqLwotICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGJpb3NfaWRfbHVuICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExIHRlcm1pbmF0aW9uX3NlICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMiBiaW9zX2N0cmwgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgc2R0cl9zcGVlZDIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTQgc2R0cl9zcGVlZDMgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgbWF4X2hvc3RfcW5nICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIG1heF9kdmNfcW5nICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGR2Y19jbnRsICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE3IHNkdHJfc3BlZWQ0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4IHNlcmlhbF9udW1iZXJfd29yZDEgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMCBzZXJpYWxfbnVtYmVyX3dvcmQzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxIGNoZWNrX3N1bSAqLwotICAgIHsgMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSB9LCAvKiAyMi0yOSBvZW1fbmFtZVsxNl0gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgZHZjX2Vycl9jb2RlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMxIGFkdl9lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBhZHZfZXJyX2FkZHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM0IHNhdmVkX2Fkdl9lcnJfY29kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBzYXZlZF9hZHZfZXJyX2FkZHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzcgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzggcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzkgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDAgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDEgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDIgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDMgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDUgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDYgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDcgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDggcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDkgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTEgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTMgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTQgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTUgcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTYgY2lzcHRyX2xzdyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1NyBjaXNwcnRfbXN3ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDU4IHN1YnN5c3ZpZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1OSBzdWJzeXNpZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MCByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MSByZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MiByZXNlcnZlZCAqLwotICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2MyByZXNlcnZlZCAqLworc3RhdGljIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyBBRFZFRVBfMzhDMTYwMF9Db25maWdfRmllbGRfSXNDaGFyIF9faW5pdGRhdGEgPSB7CisJMCwJCQkvKiAwMCBjZmdfbHN3ICovCisJMCwJCQkvKiAwMSBjZmdfbXN3ICovCisJMCwJCQkvKiAwMiBkaXNjX2VuYWJsZSAqLworCTAsCQkJLyogMDMgd2R0cl9hYmxlICovCisJMCwJCQkvKiAwNCBzZHRyX3NwZWVkMSAqLworCTAsCQkJLyogMDUgc3RhcnRfbW90b3IgKi8KKwkwLAkJCS8qIDA2IHRhZ3FuZ19hYmxlICovCisJMCwJCQkvKiAwNyBiaW9zX3NjYW4gKi8KKwkwLAkJCS8qIDA4IHNjYW1fdG9sZXJhbnQgKi8KKwkxLAkJCS8qIDA5IGFkYXB0ZXJfc2NzaV9pZCAqLworCTEsCQkJLyogICAgYmlvc19ib290X2RlbGF5ICovCisJMSwJCQkvKiAxMCBzY3NpX3Jlc2V0X2RlbGF5ICovCisJMSwJCQkvKiAgICBiaW9zX2lkX2x1biAqLworCTEsCQkJLyogMTEgdGVybWluYXRpb25fc2UgKi8KKwkxLAkJCS8qICAgIHRlcm1pbmF0aW9uX2x2ZCAqLworCTAsCQkJLyogMTIgYmlvc19jdHJsICovCisJMCwJCQkvKiAxMyBzZHRyX3NwZWVkMiAqLworCTAsCQkJLyogMTQgc2R0cl9zcGVlZDMgKi8KKwkxLAkJCS8qIDE1IG1heF9ob3N0X3FuZyAqLworCTEsCQkJLyogICAgbWF4X2R2Y19xbmcgKi8KKwkwLAkJCS8qIDE2IGR2Y19jbnRsICovCisJMCwJCQkvKiAxNyBzZHRyX3NwZWVkNCAqLworCTAsCQkJLyogMTggc2VyaWFsX251bWJlcl93b3JkMSAqLworCTAsCQkJLyogMTkgc2VyaWFsX251bWJlcl93b3JkMiAqLworCTAsCQkJLyogMjAgc2VyaWFsX251bWJlcl93b3JkMyAqLworCTAsCQkJLyogMjEgY2hlY2tfc3VtICovCisJezEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9CisJLAkJCS8qIDIyLTI5IG9lbV9uYW1lWzE2XSAqLworCTAsCQkJLyogMzAgZHZjX2Vycl9jb2RlICovCisJMCwJCQkvKiAzMSBhZHZfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIDMyIGFkdl9lcnJfYWRkciAqLworCTAsCQkJLyogMzMgc2F2ZWRfZHZjX2Vycl9jb2RlICovCisJMCwJCQkvKiAzNCBzYXZlZF9hZHZfZXJyX2NvZGUgKi8KKwkwLAkJCS8qIDM1IHNhdmVkX2Fkdl9lcnJfYWRkciAqLworCTAsCQkJLyogMzYgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDM3IHJlc2VydmVkICovCisJMCwJCQkvKiAzOCByZXNlcnZlZCAqLworCTAsCQkJLyogMzkgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQwIHJlc2VydmVkICovCisJMCwJCQkvKiA0MSByZXNlcnZlZCAqLworCTAsCQkJLyogNDIgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQzIHJlc2VydmVkICovCisJMCwJCQkvKiA0NCByZXNlcnZlZCAqLworCTAsCQkJLyogNDUgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ2IHJlc2VydmVkICovCisJMCwJCQkvKiA0NyByZXNlcnZlZCAqLworCTAsCQkJLyogNDggcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDQ5IHJlc2VydmVkICovCisJMCwJCQkvKiA1MCByZXNlcnZlZCAqLworCTAsCQkJLyogNTEgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDUyIHJlc2VydmVkICovCisJMCwJCQkvKiA1MyByZXNlcnZlZCAqLworCTAsCQkJLyogNTQgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDU1IHJlc2VydmVkICovCisJMCwJCQkvKiA1NiBjaXNwdHJfbHN3ICovCisJMCwJCQkvKiA1NyBjaXNwcnRfbXN3ICovCisJMCwJCQkvKiA1OCBzdWJzeXN2aWQgKi8KKwkwLAkJCS8qIDU5IHN1YnN5c2lkICovCisJMCwJCQkvKiA2MCByZXNlcnZlZCAqLworCTAsCQkJLyogNjEgcmVzZXJ2ZWQgKi8KKwkwLAkJCS8qIDYyIHJlc2VydmVkICovCisJMAkJCS8qIDYzIHJlc2VydmVkICovCiB9OwogCiAvKgpAQCAtMTQzOTMsMTM2ICsxNDE5MSwxMjggQEAKICAqIEZvciBhIG5vbi1mYXRhbCBlcnJvciByZXR1cm4gYSB3YXJuaW5nIGNvZGUuIElmIHRoZXJlIGFyZSBubyB3YXJuaW5ncwogICogdGhlbiAwIGlzIHJldHVybmVkLgogICovCi1TVEFUSUMgaW50IF9faW5pdAotQWR2SW5pdEdldENvbmZpZyhBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3N0YXRpYyBpbnQgX19pbml0IEFkdkluaXRHZXRDb25maWcoQURWX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgdXNob3J0ICAgICAgd2Fybl9jb2RlOwotICAgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOwotICAgIHVjaGFyICAgICAgIHBjaV9jbWRfcmVnOwotICAgIGludCAgICAgICAgIHN0YXR1czsKKwl1c2hvcnQgd2Fybl9jb2RlOworCUFkdlBvcnRBZGRyIGlvcF9iYXNlOworCXVjaGFyIHBjaV9jbWRfcmVnOworCWludCBzdGF0dXM7CiAKLSAgICB3YXJuX2NvZGUgPSAwOwotICAgIGFzY19kdmMtPmVycl9jb2RlID0gMDsKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCXdhcm5fY29kZSA9IDA7CisJYXNjX2R2Yy0+ZXJyX2NvZGUgPSAwOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CiAKLSAgICAvKgotICAgICAqIFBDSSBDb21tYW5kIFJlZ2lzdGVyCi0gICAgICoKLSAgICAgKiBOb3RlOiBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZyBkZWZpbml0aW9uICgweDAwMDcpIGluY2x1ZGVzCi0gICAgICogSS9PIFNwYWNlIENvbnRyb2wsIE1lbW9yeSBTcGFjZSBDb250cm9sIGFuZCBCdXMgTWFzdGVyIENvbnRyb2wgYml0cy4KLSAgICAgKi8KKwkvKgorCSAqIFBDSSBDb21tYW5kIFJlZ2lzdGVyCisJICoKKwkgKiBOb3RlOiBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZyBkZWZpbml0aW9uICgweDAwMDcpIGluY2x1ZGVzCisJICogSS9PIFNwYWNlIENvbnRyb2wsIE1lbW9yeSBTcGFjZSBDb250cm9sIGFuZCBCdXMgTWFzdGVyIENvbnRyb2wgYml0cy4KKwkgKi8KIAotICAgIGlmICgoKHBjaV9jbWRfcmVnID0gRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpKQotICAgICAgICAgJiBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZykKLSAgICAgICAgIT0gQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCi0gICAgewotICAgICAgICBwY2lfY21kX3JlZyB8PSBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZzsKKwlpZiAoKChwY2lfY21kX3JlZyA9IER2Y0FkdlJlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsCisJCQkJCQkgICAgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKSkKKwkgICAgICYgQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCisJICAgICE9IEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nKSB7CisJCXBjaV9jbWRfcmVnIHw9IEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nOwogCi0gICAgICAgIER2Y0FkdldyaXRlUENJQ29uZmlnQnl0ZShhc2NfZHZjLAotICAgICAgICAgICAgICAgIEFzY1BDSUNvbmZpZ0NvbW1hbmRSZWdpc3RlciwgcGNpX2NtZF9yZWcpOworCQlEdmNBZHZXcml0ZVBDSUNvbmZpZ0J5dGUoYXNjX2R2YywKKwkJCQkJIEFzY1BDSUNvbmZpZ0NvbW1hbmRSZWdpc3RlciwKKwkJCQkJIHBjaV9jbWRfcmVnKTsKIAotICAgICAgICBpZiAoKChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdDb21tYW5kUmVnaXN0ZXIpKQotICAgICAgICAgICAgICYgQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpCi0gICAgICAgICAgICAhPSBBc2NQQ0lDbWRSZWdCaXRzX0J1c01hc3RlcmluZykKLSAgICAgICAgewotICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAoKChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZQorCQkgICAgICAoYXNjX2R2YywgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKSkKKwkJICAgICAmIEFzY1BDSUNtZFJlZ0JpdHNfQnVzTWFzdGVyaW5nKQorCQkgICAgIT0gQXNjUENJQ21kUmVnQml0c19CdXNNYXN0ZXJpbmcpIHsKKwkJCXdhcm5fY29kZSB8PSBBU0NfV0FSTl9TRVRfUENJX0NPTkZJR19TUEFDRTsKKwkJfQorCX0KIAotICAgIC8qCi0gICAgICogUENJIExhdGVuY3kgVGltZXIKLSAgICAgKgotICAgICAqIElmIHRoZSAibGF0ZW5jeSB0aW1lciIgcmVnaXN0ZXIgaXMgMHgyMCBvciBhYm92ZSwgdGhlbiB3ZSBkb24ndCBuZWVkCi0gICAgICogdG8gY2hhbmdlIGl0LiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gMHgyMCAoaS5lLiBzZXQgaXQgdG8gMHgyMCBpZiBpdAotICAgICAqIGNvbWVzIHVwIGxlc3MgdGhhbiAweDIwKS4KLSAgICAgKi8KLSAgICBpZiAoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8IDB4MjApIHsKLSAgICAgICAgRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwgMHgyMCk7Ci0gICAgICAgIGlmIChEdmNBZHZSZWFkUENJQ29uZmlnQnl0ZShhc2NfZHZjLCBBc2NQQ0lDb25maWdMYXRlbmN5VGltZXIpIDwgMHgyMCkKLSAgICAgICAgewotICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX1NFVF9QQ0lfQ09ORklHX1NQQUNFOwotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogUENJIExhdGVuY3kgVGltZXIKKwkgKgorCSAqIElmIHRoZSAibGF0ZW5jeSB0aW1lciIgcmVnaXN0ZXIgaXMgMHgyMCBvciBhYm92ZSwgdGhlbiB3ZSBkb24ndCBuZWVkCisJICogdG8gY2hhbmdlIGl0LiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gMHgyMCAoaS5lLiBzZXQgaXQgdG8gMHgyMCBpZiBpdAorCSAqIGNvbWVzIHVwIGxlc3MgdGhhbiAweDIwKS4KKwkgKi8KKwlpZiAoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8IDB4MjApIHsKKwkJRHZjQWR2V3JpdGVQQ0lDb25maWdCeXRlKGFzY19kdmMsIEFzY1BDSUNvbmZpZ0xhdGVuY3lUaW1lciwKKwkJCQkJIDB4MjApOworCQlpZiAoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnTGF0ZW5jeVRpbWVyKSA8CisJCSAgICAweDIwKSB7CisJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fU0VUX1BDSV9DT05GSUdfU1BBQ0U7CisJCX0KKwl9CiAKLSAgICAvKgotICAgICAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBDb21tYW5kIFJlZ2lzdGVyCi0gICAgICogIlBhcml0eSBFcnJvciBSZXNwb25zZSBDb250cm9sIiBCaXQuIElmIHRoZSBiaXQgaXMgY2xlYXIgKDApLAotICAgICAqIGluIEFkdkluaXRBc2MzNTUwLzM4QzA4MDBEcml2ZXIoKSB0ZWxsIHRoZSBtaWNyb2NvZGUgdG8gaWdub3JlCi0gICAgICogRE1BIHBhcml0eSBlcnJvcnMuCi0gICAgICovCi0gICAgYXNjX2R2Yy0+Y2ZnLT5jb250cm9sX2ZsYWcgPSAwOwotICAgIGlmICgoKER2Y0FkdlJlYWRQQ0lDb25maWdCeXRlKGFzY19kdmMsIEFzY1BDSUNvbmZpZ0NvbW1hbmRSZWdpc3RlcikKLSAgICAgICAgICYgQXNjUENJQ21kUmVnQml0c19QYXJFcnJSZXNwQ3RybCkpID09IDApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5jZmctPmNvbnRyb2xfZmxhZyB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7Ci0gICAgfQorCS8qCisJICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIFBDSSBDb25maWd1cmF0aW9uIENvbW1hbmQgUmVnaXN0ZXIKKwkgKiAiUGFyaXR5IEVycm9yIFJlc3BvbnNlIENvbnRyb2wiIEJpdC4gSWYgdGhlIGJpdCBpcyBjbGVhciAoMCksCisJICogaW4gQWR2SW5pdEFzYzM1NTAvMzhDMDgwMERyaXZlcigpIHRlbGwgdGhlIG1pY3JvY29kZSB0byBpZ25vcmUKKwkgKiBETUEgcGFyaXR5IGVycm9ycy4KKwkgKi8KKwlhc2NfZHZjLT5jZmctPmNvbnRyb2xfZmxhZyA9IDA7CisJaWYgKCgoRHZjQWR2UmVhZFBDSUNvbmZpZ0J5dGUoYXNjX2R2YywgQXNjUENJQ29uZmlnQ29tbWFuZFJlZ2lzdGVyKQorCSAgICAgICYgQXNjUENJQ21kUmVnQml0c19QYXJFcnJSZXNwQ3RybCkpID09IDApIHsKKwkJYXNjX2R2Yy0+Y2ZnLT5jb250cm9sX2ZsYWcgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOworCX0KIAotICAgIGFzY19kdmMtPmNmZy0+bGliX3ZlcnNpb24gPSAoQURWX0xJQl9WRVJTSU9OX01BSk9SIDw8IDgpIHwKLSAgICAgIEFEVl9MSUJfVkVSU0lPTl9NSU5PUjsKLSAgICBhc2NfZHZjLT5jZmctPmNoaXBfdmVyc2lvbiA9Ci0gICAgICBBZHZHZXRDaGlwVmVyc2lvbihpb3BfYmFzZSwgYXNjX2R2Yy0+YnVzX3R5cGUpOworCWFzY19kdmMtPmNmZy0+bGliX3ZlcnNpb24gPSAoQURWX0xJQl9WRVJTSU9OX01BSk9SIDw8IDgpIHwKKwkgICAgQURWX0xJQl9WRVJTSU9OX01JTk9SOworCWFzY19kdmMtPmNmZy0+Y2hpcF92ZXJzaW9uID0KKwkgICAgQWR2R2V0Q2hpcFZlcnNpb24oaW9wX2Jhc2UsIGFzY19kdmMtPmJ1c190eXBlKTsKIAotICAgIEFTQ19EQkcyKDEsICJBZHZJbml0R2V0Q29uZmlnOiBpb3BiX2NoaXBfaWRfMTogMHgleCAweCV4XG4iLAotICAgICAgICAodXNob3J0KSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0NISVBfSURfMSksCi0gICAgICAgICh1c2hvcnQpIEFEVl9DSElQX0lEX0JZVEUpOworCUFTQ19EQkcyKDEsICJBZHZJbml0R2V0Q29uZmlnOiBpb3BiX2NoaXBfaWRfMTogMHgleCAweCV4XG4iLAorCQkgKHVzaG9ydClBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0NISVBfSURfMSksCisJCSAodXNob3J0KUFEVl9DSElQX0lEX0JZVEUpOwogCi0gICAgQVNDX0RCRzIoMSwgIkFkdkluaXRHZXRDb25maWc6IGlvcHdfY2hpcF9pZF8wOiAweCV4IDB4JXhcbiIsCi0gICAgICAgICh1c2hvcnQpIEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ0hJUF9JRF8wKSwKLSAgICAgICAgKHVzaG9ydCkgQURWX0NISVBfSURfV09SRCk7CisJQVNDX0RCRzIoMSwgIkFkdkluaXRHZXRDb25maWc6IGlvcHdfY2hpcF9pZF8wOiAweCV4IDB4JXhcbiIsCisJCSAodXNob3J0KUFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ0hJUF9JRF8wKSwKKwkJICh1c2hvcnQpQURWX0NISVBfSURfV09SRCk7CiAKLSAgICAvKgotICAgICAqIFJlc2V0IHRoZSBjaGlwIHRvIHN0YXJ0IGFuZCBhbGxvdyByZWdpc3RlciB3cml0ZXMuCi0gICAgICovCi0gICAgaWYgKEFkdkZpbmRTaWduYXR1cmUoaW9wX2Jhc2UpID09IDApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSA9IEFTQ19JRVJSX0JBRF9TSUdOQVRVUkU7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIGEgdmFsaWQgc2V0dGluZy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzU1MCAmJgotICAgICAgICAgICAgYXNjX2R2Yy0+Y2hpcF90eXBlICE9IEFEVl9DSElQX0FTQzM4QzA4MDAgJiYKLSAgICAgICAgICAgIGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7Ci0gICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgICAgICB9CisJLyoKKwkgKiBSZXNldCB0aGUgY2hpcCB0byBzdGFydCBhbmQgYWxsb3cgcmVnaXN0ZXIgd3JpdGVzLgorCSAqLworCWlmIChBZHZGaW5kU2lnbmF0dXJlKGlvcF9iYXNlKSA9PSAwKSB7CisJCWFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX1NJR05BVFVSRTsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIGEgdmFsaWQgc2V0dGluZy4KKwkJICovCisJCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzU1MCAmJgorCQkgICAgYXNjX2R2Yy0+Y2hpcF90eXBlICE9IEFEVl9DSElQX0FTQzM4QzA4MDAgJiYKKwkJICAgIGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzOEMxNjAwKSB7CisJCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7CisJCQlyZXR1cm4gQURWX0VSUk9SOworCQl9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogUmVzZXQgQ2hpcC4KLSAgICAgICAgICovCi0gICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0NUUkxfUkVHLAotICAgICAgICAgICAgQURWX0NUUkxfUkVHX0NNRF9SRVNFVCk7Ci0gICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKLSAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ1RSTF9SRUcsCi0gICAgICAgICAgICBBRFZfQ1RSTF9SRUdfQ01EX1dSX0lPX1JFRyk7CisJCS8qCisJCSAqIFJlc2V0IENoaXAuCisJCSAqLworCQlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DVFJMX1JFRywKKwkJCQkgICAgIEFEVl9DVFJMX1JFR19DTURfUkVTRVQpOworCQlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7CisJCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0NUUkxfUkVHLAorCQkJCSAgICAgQURWX0NUUkxfUkVHX0NNRF9XUl9JT19SRUcpOwogCi0gICAgICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBBZHZJbml0RnJvbTM4QzE2MDBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMwODAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHN0YXR1cyA9IEFkdkluaXRGcm9tMzhDMDgwMEVFUChhc2NfZHZjKSkgPT0gQURWX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHN0YXR1cyA9IEFkdkluaXRGcm9tMzU1MEVFUChhc2NfZHZjKSkgPT0gQURWX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2Fybl9jb2RlIHw9IHN0YXR1czsKLSAgICB9CisJCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkgeworCQkJaWYgKChzdGF0dXMgPQorCQkJICAgICBBZHZJbml0RnJvbTM4QzE2MDBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikgeworCQkJCXJldHVybiBBRFZfRVJST1I7CisJCQl9CisJCX0gZWxzZSBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJCWlmICgoc3RhdHVzID0KKwkJCSAgICAgQWR2SW5pdEZyb20zOEMwODAwRUVQKGFzY19kdmMpKSA9PSBBRFZfRVJST1IpIHsKKwkJCQlyZXR1cm4gQURWX0VSUk9SOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChzdGF0dXMgPSBBZHZJbml0RnJvbTM1NTBFRVAoYXNjX2R2YykpID09IEFEVl9FUlJPUikgeworCQkJCXJldHVybiBBRFZfRVJST1I7CisJCQl9CisJCX0KKwkJd2Fybl9jb2RlIHw9IHN0YXR1czsKKwl9CiAKLSAgICByZXR1cm4gd2Fybl9jb2RlOworCXJldHVybiB3YXJuX2NvZGU7CiB9CiAKIC8qCkBAIC0xNDUzNSw1NzQgKzE0MzI1LDU2MyBAQAogICoKICAqIE5lZWRlZCBhZnRlciBpbml0aWFsaXphdGlvbiBmb3IgZXJyb3IgcmVjb3ZlcnkuCiAgKi8KLVNUQVRJQyBpbnQKLUFkdkluaXRBc2MzNTUwRHJpdmVyKEFEVl9EVkNfVkFSICphc2NfZHZjKQorc3RhdGljIGludCBBZHZJbml0QXNjMzU1MERyaXZlcihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBBZHZQb3J0QWRkciBpb3BfYmFzZTsKLSAgICB1c2hvcnQgICAgICB3YXJuX2NvZGU7Ci0gICAgQURWX0RDTlQgICAgc3VtOwotICAgIGludCAgICAgICAgIGJlZ2luX2FkZHI7Ci0gICAgaW50ICAgICAgICAgZW5kX2FkZHI7Ci0gICAgdXNob3J0ICAgICAgY29kZV9zdW07Ci0gICAgaW50ICAgICAgICAgd29yZDsKLSAgICBpbnQgICAgICAgICBqOwotICAgIGludCAgICAgICAgIGFkdl9hc2MzNTUwX2V4cGFuZGVkX3NpemU7Ci0gICAgQURWX0NBUlJfVCAgKmNhcnJwOwotICAgIEFEVl9EQ05UICAgIGNvbnRpZ19sZW47Ci0gICAgQURWX1NEQ05UICAgYnVmX3NpemU7Ci0gICAgQURWX1BBRERSICAgY2Fycl9wYWRkcjsKLSAgICBpbnQgICAgICAgICBpOwotICAgIHVzaG9ydCAgICAgIHNjc2lfY2ZnMTsKLSAgICB1Y2hhciAgICAgICB0aWQ7Ci0gICAgdXNob3J0ICAgICAgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4vMl07IC8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLwotICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSA9IDAsIHNkdHJfYWJsZSwgdGFncW5nX2FibGU7Ci0gICAgdWNoYXIgICAgICAgbWF4X2NtZFtBRFZfTUFYX1RJRCArIDFdOworCUFkdlBvcnRBZGRyIGlvcF9iYXNlOworCXVzaG9ydCB3YXJuX2NvZGU7CisJQURWX0RDTlQgc3VtOworCWludCBiZWdpbl9hZGRyOworCWludCBlbmRfYWRkcjsKKwl1c2hvcnQgY29kZV9zdW07CisJaW50IHdvcmQ7CisJaW50IGo7CisJaW50IGFkdl9hc2MzNTUwX2V4cGFuZGVkX3NpemU7CisJQURWX0NBUlJfVCAqY2FycnA7CisJQURWX0RDTlQgY29udGlnX2xlbjsKKwlBRFZfU0RDTlQgYnVmX3NpemU7CisJQURWX1BBRERSIGNhcnJfcGFkZHI7CisJaW50IGk7CisJdXNob3J0IHNjc2lfY2ZnMTsKKwl1Y2hhciB0aWQ7CisJdXNob3J0IGJpb3NfbWVtW0FTQ19NQ19CSU9TTEVOIC8gMl07CS8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLworCXVzaG9ydCB3ZHRyX2FibGUgPSAwLCBzZHRyX2FibGUsIHRhZ3FuZ19hYmxlOworCXVjaGFyIG1heF9jbWRbQURWX01BWF9USUQgKyAxXTsKIAotICAgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZXJyb3IsIGRvbid0IGNvbnRpbnVlLiAqLwotICAgIGlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBlcnJvciwgZG9uJ3QgY29udGludWUuICovCisJaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApIHsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CiAKLSAgICAvKgotICAgICAqIFRoZSBjYWxsZXIgbXVzdCBzZXQgJ2NoaXBfdHlwZScgdG8gQURWX0NISVBfQVNDMzU1MC4KLSAgICAgKi8KLSAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlICE9IEFEVl9DSElQX0FTQzM1NTApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCS8qCisJICogVGhlIGNhbGxlciBtdXN0IHNldCAnY2hpcF90eXBlJyB0byBBRFZfQ0hJUF9BU0MzNTUwLgorCSAqLworCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzU1MCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgd2Fybl9jb2RlID0gMDsKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCXdhcm5fY29kZSA9IDA7CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKIAotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24gYmVmb3JlIHdyaXRpbmcgdGhlIG1pY3JvY29kZS4KLSAgICAgKiBUaGUgQklPUyBtYXkgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHVzaW5nIGl0cyBSSVNDIExSQU0gcmVnaW9uCi0gICAgICogc28gaXRzIHJlZ2lvbiBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZC4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoaXMgY29kZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiwgd2hpY2ggaXMgY3VycmVudGx5IHRydWUsCi0gICAgICogdGhhdCBhIGNoaXAgcmVzZXQgZG9lcyBub3QgY2xlYXIgUklTQyBMUkFNLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCi0gICAgewotICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwgYmlvc19tZW1baV0pOwotICAgIH0KKwkvKgorCSAqIFNhdmUgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uIGJlZm9yZSB3cml0aW5nIHRoZSBtaWNyb2NvZGUuCisJICogVGhlIEJJT1MgbWF5IGFscmVhZHkgYmUgbG9hZGVkIGFuZCB1c2luZyBpdHMgUklTQyBMUkFNIHJlZ2lvbgorCSAqIHNvIGl0cyByZWdpb24gbXVzdCBiZSBzYXZlZCBhbmQgcmVzdG9yZWQuCisJICoKKwkgKiBOb3RlOiBUaGlzIGNvZGUgbWFrZXMgdGhlIGFzc3VtcHRpb24sIHdoaWNoIGlzIGN1cnJlbnRseSB0cnVlLAorCSAqIHRoYXQgYSBjaGlwIHJlc2V0IGRvZXMgbm90IGNsZWFyIFJJU0MgTFJBTS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4gLyAyOyBpKyspIHsKKwkJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU01FTSArICgyICogaSksCisJCQkJYmlvc19tZW1baV0pOworCX0KIAotICAgIC8qCi0gICAgICogU2F2ZSBjdXJyZW50IHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCi0gICAgICovCi0gICAgaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkvMl0gPT0gMHg1NUFBKQotICAgIHsKLSAgICAgICAgdXNob3J0ICBiaW9zX3ZlcnNpb24sIG1ham9yLCBtaW5vcjsKKwkvKgorCSAqIFNhdmUgY3VycmVudCBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorCSAqLworCWlmIChiaW9zX21lbVsoQVNDX01DX0JJT1NfU0lHTkFUVVJFIC0gQVNDX01DX0JJT1NNRU0pIC8gMl0gPT0gMHg1NUFBKSB7CisJCXVzaG9ydCBiaW9zX3ZlcnNpb24sIG1ham9yLCBtaW5vcjsKIAotICAgICAgICBiaW9zX3ZlcnNpb24gPSBiaW9zX21lbVsoQVNDX01DX0JJT1NfVkVSU0lPTiAtIEFTQ19NQ19CSU9TTUVNKS8yXTsKLSAgICAgICAgbWFqb3IgPSAoYmlvc192ZXJzaW9uICA+PiAxMikgJiAweEY7Ci0gICAgICAgIG1pbm9yID0gKGJpb3NfdmVyc2lvbiAgPj4gOCkgJiAweEY7Ci0gICAgICAgIGlmIChtYWpvciA8IDMgfHwgKG1ham9yID09IDMgJiYgbWlub3IgPT0gMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEJJT1MgMy4xIGFuZCBlYXJsaWVyIGxvY2F0aW9uIG9mICd3ZHRyX2FibGUnIHZhcmlhYmxlLiAqLwotICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCAweDEyMCwgd2R0cl9hYmxlKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7Ci0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKLSAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCi0gICAgewotICAgICAgICBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKLSAgICAgICAgICAgIG1heF9jbWRbdGlkXSk7Ci0gICAgfQorCQliaW9zX3ZlcnNpb24gPQorCQkgICAgYmlvc19tZW1bKEFTQ19NQ19CSU9TX1ZFUlNJT04gLSBBU0NfTUNfQklPU01FTSkgLyAyXTsKKwkJbWFqb3IgPSAoYmlvc192ZXJzaW9uID4+IDEyKSAmIDB4RjsKKwkJbWlub3IgPSAoYmlvc192ZXJzaW9uID4+IDgpICYgMHhGOworCQlpZiAobWFqb3IgPCAzIHx8IChtYWpvciA9PSAzICYmIG1pbm9yID09IDEpKSB7CisJCQkvKiBCSU9TIDMuMSBhbmQgZWFybGllciBsb2NhdGlvbiBvZiAnd2R0cl9hYmxlJyB2YXJpYWJsZS4gKi8KKwkJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgMHgxMjAsIHdkdHJfYWJsZSk7CisJCX0gZWxzZSB7CisJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisJCX0KKwl9CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisJZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKSB7CisJCUFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorCQkJCW1heF9jbWRbdGlkXSk7CisJfQogCi0gICAgLyoKLSAgICAgKiBMb2FkIHRoZSBNaWNyb2NvZGUKLSAgICAgKgotICAgICAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCAwKTsKLSAgICAvKiBBc3N1bWUgdGhlIGZvbGxvd2luZyBjb21wcmVzc2VkIGZvcm1hdCBvZiB0aGUgbWljcm9jb2RlIGJ1ZmZlcjoKLSAgICAgKgotICAgICAqICAyNTQgd29yZCAoNTA4IGJ5dGUpIHRhYmxlIGluZGV4ZWQgYnkgYnl0ZSBjb2RlIGZvbGxvd2VkCi0gICAgICogIGJ5IHRoZSBmb2xsb3dpbmcgYnl0ZSBjb2RlczoKLSAgICAgKgotICAgICAqICAgIDEtQnl0ZSBDb2RlOgotICAgICAqICAgICAgMDA6IEVtaXQgd29yZCAwIGluIHRhYmxlLgotICAgICAqICAgICAgMDE6IEVtaXQgd29yZCAxIGluIHRhYmxlLgotICAgICAqICAgICAgLgotICAgICAqICAgICAgRkQ6IEVtaXQgd29yZCAyNTMgaW4gdGFibGUuCi0gICAgICoKLSAgICAgKiAgICBNdWx0aS1CeXRlIENvZGU6Ci0gICAgICogICAgICBGRSBXVyBXVzogKDMgYnl0ZSBjb2RlKSBXb3JkIHRvIGVtaXQgaXMgdGhlIG5leHQgd29yZCBXVyBXVy4KLSAgICAgKiAgICAgIEZGIEJCIFdXIFdXOiAoNCBieXRlIGNvZGUpIEVtaXQgQkIgY291bnQgdGltZXMgbmV4dCB3b3JkIFdXIFdXLgotICAgICAqLwotICAgIHdvcmQgPSAwOwotICAgIGZvciAoaSA9IDI1MyAqIDI7IGkgPCBfYWR2X2FzYzM1NTBfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKF9hZHZfYXNjMzU1MF9idWZbaV0gPT0gMHhmZikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IF9hZHZfYXNjMzU1MF9idWZbaSArIDFdOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZltpICsgM10gPDwgOCkgfAotICAgICAgICAgICAgICAgIF9hZHZfYXNjMzU1MF9idWZbaSArIDJdKSk7Ci0gICAgICAgICAgICAgICAgd29yZCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSAzOwotICAgICAgICB9IGVsc2UgaWYgKF9hZHZfYXNjMzU1MF9idWZbaV0gPT0gMHhmZSkKLSAgICAgICAgewotICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKLSAgICAgICAgICAgICAgICBfYWR2X2FzYzM1NTBfYnVmW2kgKyAyXSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZltpICsgMV0pKTsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIHdvcmQrKzsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCi0gICAgICAgICAgICAgICAgX2Fkdl9hc2MzNTUwX2J1ZlsoX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDIpICsgMV0gPDwgOCkgfAotICAgICAgICAgICAgICAgIF9hZHZfYXNjMzU1MF9idWZbX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDJdKSk7Ci0gICAgICAgICAgICB3b3JkKys7Ci0gICAgICAgIH0KLSAgICB9CisJLyoKKwkgKiBMb2FkIHRoZSBNaWNyb2NvZGUKKwkgKgorCSAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgorCSAqLworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCAwKTsKKwkvKiBBc3N1bWUgdGhlIGZvbGxvd2luZyBjb21wcmVzc2VkIGZvcm1hdCBvZiB0aGUgbWljcm9jb2RlIGJ1ZmZlcjoKKwkgKgorCSAqICAyNTQgd29yZCAoNTA4IGJ5dGUpIHRhYmxlIGluZGV4ZWQgYnkgYnl0ZSBjb2RlIGZvbGxvd2VkCisJICogIGJ5IHRoZSBmb2xsb3dpbmcgYnl0ZSBjb2RlczoKKwkgKgorCSAqICAgIDEtQnl0ZSBDb2RlOgorCSAqICAgICAgMDA6IEVtaXQgd29yZCAwIGluIHRhYmxlLgorCSAqICAgICAgMDE6IEVtaXQgd29yZCAxIGluIHRhYmxlLgorCSAqICAgICAgLgorCSAqICAgICAgRkQ6IEVtaXQgd29yZCAyNTMgaW4gdGFibGUuCisJICoKKwkgKiAgICBNdWx0aS1CeXRlIENvZGU6CisJICogICAgICBGRSBXVyBXVzogKDMgYnl0ZSBjb2RlKSBXb3JkIHRvIGVtaXQgaXMgdGhlIG5leHQgd29yZCBXVyBXVy4KKwkgKiAgICAgIEZGIEJCIFdXIFdXOiAoNCBieXRlIGNvZGUpIEVtaXQgQkIgY291bnQgdGltZXMgbmV4dCB3b3JkIFdXIFdXLgorCSAqLworCXdvcmQgPSAwOworCWZvciAoaSA9IDI1MyAqIDI7IGkgPCBfYWR2X2FzYzM1NTBfc2l6ZTsgaSsrKSB7CisJCWlmIChfYWR2X2FzYzM1NTBfYnVmW2ldID09IDB4ZmYpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBfYWR2X2FzYzM1NTBfYnVmW2kgKyAxXTsgaisrKSB7CisJCQkJQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKwkJCQkJCQkJICAgIF9hZHZfYXNjMzU1MF9idWYKKwkJCQkJCQkJICAgIFtpICsKKwkJCQkJCQkJICAgICAzXSA8PCA4KSB8CisJCQkJCQkJCSAgIF9hZHZfYXNjMzU1MF9idWYKKwkJCQkJCQkJICAgW2kgKyAyXSkpOworCQkJCXdvcmQrKzsKKwkJCX0KKwkJCWkgKz0gMzsKKwkJfSBlbHNlIGlmIChfYWR2X2FzYzM1NTBfYnVmW2ldID09IDB4ZmUpIHsKKwkJCUFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisJCQkJCQkJICAgIF9hZHZfYXNjMzU1MF9idWZbaSArCisJCQkJCQkJCQkgICAgIDJdCisJCQkJCQkJICAgIDw8IDgpIHwKKwkJCQkJCQkgICBfYWR2X2FzYzM1NTBfYnVmW2kgKworCQkJCQkJCQkJICAgIDFdKSk7CisJCQlpICs9IDI7CisJCQl3b3JkKys7CisJCX0gZWxzZSB7CisJCQlBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorCQkJCQkJCSAgICBfYWR2X2FzYzM1NTBfYnVmWyhfYWR2X2FzYzM1NTBfYnVmW2ldICogMikgKyAxXSA8PCA4KSB8IF9hZHZfYXNjMzU1MF9idWZbX2Fkdl9hc2MzNTUwX2J1ZltpXSAqIDJdKSk7CisJCQl3b3JkKys7CisJCX0KKwl9CiAKLSAgICAvKgotICAgICAqIFNldCAnd29yZCcgZm9yIGxhdGVyIHVzZSB0byBjbGVhciB0aGUgcmVzdCBvZiBtZW1vcnkgYW5kIHNhdmUKLSAgICAgKiB0aGUgZXhwYW5kZWQgbWNvZGUgc2l6ZS4KLSAgICAgKi8KLSAgICB3b3JkICo9IDI7Ci0gICAgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZSA9IHdvcmQ7CisJLyoKKwkgKiBTZXQgJ3dvcmQnIGZvciBsYXRlciB1c2UgdG8gY2xlYXIgdGhlIHJlc3Qgb2YgbWVtb3J5IGFuZCBzYXZlCisJICogdGhlIGV4cGFuZGVkIG1jb2RlIHNpemUuCisJICovCisJd29yZCAqPSAyOworCWFkdl9hc2MzNTUwX2V4cGFuZGVkX3NpemUgPSB3b3JkOwogCi0gICAgLyoKLSAgICAgKiBDbGVhciB0aGUgcmVzdCBvZiBBU0MtMzU1MCBJbnRlcm5hbCBSQU0gKDhLQikuCi0gICAgICovCi0gICAgZm9yICg7IHdvcmQgPCBBRFZfMzU1MF9NRU1TSVpFOyB3b3JkICs9IDIpCi0gICAgewotICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgMCk7Ci0gICAgfQorCS8qCisJICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM1NTAgSW50ZXJuYWwgUkFNICg4S0IpLgorCSAqLworCWZvciAoOyB3b3JkIDwgQURWXzM1NTBfTUVNU0laRTsgd29yZCArPSAyKSB7CisJCUFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgotICAgICAqLwotICAgIHN1bSA9IDA7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCS8qCisJICogVmVyaWZ5IHRoZSBtaWNyb2NvZGUgY2hlY2tzdW0uCisJICovCisJc3VtID0gMDsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgMCk7CiAKLSAgICBmb3IgKHdvcmQgPSAwOyB3b3JkIDwgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZTsgd29yZCArPSAyKQotICAgIHsKLSAgICAgICAgc3VtICs9IEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpOwotICAgIH0KKwlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgYWR2X2FzYzM1NTBfZXhwYW5kZWRfc2l6ZTsgd29yZCArPSAyKSB7CisJCXN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKwl9CiAKLSAgICBpZiAoc3VtICE9IF9hZHZfYXNjMzU1MF9jaGtzdW0pCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCWlmIChzdW0gIT0gX2Fkdl9hc2MzNTUwX2Noa3N1bSkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9NQ09ERV9DSEtTVU07CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgLyoKLSAgICAgKiBSZXN0b3JlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4vMjsgaSsrKQotICAgIHsKLSAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7Ci0gICAgfQorCS8qCisJICogUmVzdG9yZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24uCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTQ19NQ19CSU9TTEVOIC8gMjsgaSsrKSB7CisJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwKKwkJCQkgYmlvc19tZW1baV0pOworCX0KIAotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIGFuZCB3cml0ZSB0aGUgbWljcm9jb2RlIGNvZGUgY2hlY2tzdW0gdG8gdGhlIG1pY3JvY29kZQotICAgICAqIGNvZGUgY2hlY2tzdW0gbG9jYXRpb24gQVNDX01DX0NPREVfQ0hLX1NVTSAoMHgyQykuCi0gICAgICovCi0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9CRUdJTl9BRERSLCBiZWdpbl9hZGRyKTsKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0VORF9BRERSLCBlbmRfYWRkcik7Ci0gICAgY29kZV9zdW0gPSAwOwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCBiZWdpbl9hZGRyKTsKLSAgICBmb3IgKHdvcmQgPSBiZWdpbl9hZGRyOyB3b3JkIDwgZW5kX2FkZHI7IHdvcmQgKz0gMikKLSAgICB7Ci0gICAgICAgIGNvZGVfc3VtICs9IEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpOwotICAgIH0KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9DSEtfU1VNLCBjb2RlX3N1bSk7CisJLyoKKwkgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSB0byB0aGUgbWljcm9jb2RlCisJICogY29kZSBjaGVja3N1bSBsb2NhdGlvbiBBU0NfTUNfQ09ERV9DSEtfU1VNICgweDJDKS4KKwkgKi8KKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIGJlZ2luX2FkZHIpOworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfRU5EX0FERFIsIGVuZF9hZGRyKTsKKwljb2RlX3N1bSA9IDA7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIGJlZ2luX2FkZHIpOworCWZvciAod29yZCA9IGJlZ2luX2FkZHI7IHdvcmQgPCBlbmRfYWRkcjsgd29yZCArPSAyKSB7CisJCWNvZGVfc3VtICs9IEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpOworCX0KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9DSEtfU1VNLCBjb2RlX3N1bSk7CiAKLSAgICAvKgotICAgICAqIFJlYWQgYW5kIHNhdmUgbWljcm9jb2RlIHZlcnNpb24gYW5kIGRhdGUuCi0gICAgICovCi0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9EQVRFLCBhc2NfZHZjLT5jZmctPm1jb2RlX2RhdGUpOwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1ZFUlNJT05fTlVNLCBhc2NfZHZjLT5jZmctPm1jb2RlX3ZlcnNpb24pOworCS8qCisJICogUmVhZCBhbmQgc2F2ZSBtaWNyb2NvZGUgdmVyc2lvbiBhbmQgZGF0ZS4KKwkgKi8KKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX0RBVEUsCisJCQlhc2NfZHZjLT5jZmctPm1jb2RlX2RhdGUpOworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1ZFUlNJT05fTlVNLAorCQkJYXNjX2R2Yy0+Y2ZnLT5tY29kZV92ZXJzaW9uKTsKIAotICAgIC8qCi0gICAgICogU2V0IHRoZSBjaGlwIHR5cGUgdG8gaW5kaWNhdGUgdGhlIEFTQzM1NTAuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NISVBfVFlQRSwgQURWX0NISVBfQVNDMzU1MCk7CisJLyoKKwkgKiBTZXQgdGhlIGNoaXAgdHlwZSB0byBpbmRpY2F0ZSB0aGUgQVNDMzU1MC4KKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ0hJUF9UWVBFLCBBRFZfQ0hJUF9BU0MzNTUwKTsKIAotICAgIC8qCi0gICAgICogSWYgdGhlIFBDSSBDb25maWd1cmF0aW9uIENvbW1hbmQgUmVnaXN0ZXIgIlBhcml0eSBFcnJvciBSZXNwb25zZQotICAgICAqIENvbnRyb2wiIEJpdCB3YXMgY2xlYXIgKDApLCB0aGVuIHNldCB0aGUgbWljcm9jb2RlIHZhcmlhYmxlCi0gICAgICogJ2NvbnRyb2xfZmxhZycgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSIGZsYWcgdG8gdGVsbCB0aGUgbWljcm9jb2RlCi0gICAgICogdG8gaWdub3JlIERNQSBwYXJpdHkgZXJyb3JzLgotICAgICAqLwotICAgIGlmIChhc2NfZHZjLT5jZmctPmNvbnRyb2xfZmxhZyAmIENPTlRST0xfRkxBR19JR05PUkVfUEVSUikKLSAgICB7Ci0gICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7Ci0gICAgICAgIHdvcmQgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOwotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlciAiUGFyaXR5IEVycm9yIFJlc3BvbnNlCisJICogQ29udHJvbCIgQml0IHdhcyBjbGVhciAoMCksIHRoZW4gc2V0IHRoZSBtaWNyb2NvZGUgdmFyaWFibGUKKwkgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIgZmxhZyB0byB0ZWxsIHRoZSBtaWNyb2NvZGUKKwkgKiB0byBpZ25vcmUgRE1BIHBhcml0eSBlcnJvcnMuCisJICovCisJaWYgKGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnICYgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSKSB7CisJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7CisJCXdvcmQgfD0gQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSOworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKwl9CiAKLSAgICAvKgotICAgICAqIEZvciBBU0MtMzU1MCwgc2V0dGluZyB0aGUgU1RBUlRfQ1RMX0VNRlUgWzM6Ml0gYml0cyBzZXRzIGEgRklGTwotICAgICAqIHRocmVzaG9sZCBvZiAxMjggYnl0ZXMuIFRoaXMgcmVnaXN0ZXIgaXMgb25seSBhY2Nlc3NpYmxlIHRvIHRoZSBob3N0LgotICAgICAqLwotICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0RNQV9DRkcwLAotICAgICAgICBTVEFSVF9DVExfRU1GVSB8IFJFQURfQ01EX01STSk7CisJLyoKKwkgKiBGb3IgQVNDLTM1NTAsIHNldHRpbmcgdGhlIFNUQVJUX0NUTF9FTUZVIFszOjJdIGJpdHMgc2V0cyBhIEZJRk8KKwkgKiB0aHJlc2hvbGQgb2YgMTI4IGJ5dGVzLiBUaGlzIHJlZ2lzdGVyIGlzIG9ubHkgYWNjZXNzaWJsZSB0byB0aGUgaG9zdC4KKwkgKi8KKwlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9ETUFfQ0ZHMCwKKwkJCSAgICAgU1RBUlRfQ1RMX0VNRlUgfCBSRUFEX0NNRF9NUk0pOwogCi0gICAgLyoKLSAgICAgKiBNaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgV0RUUiwgU0RUUiwgYW5kIGNvbW1hbmQgdGFnCi0gICAgICogcXVldWluZyB3aWxsIGJlIHNldCBpbiBBZHZJbnF1aXJ5SGFuZGxpbmcoKSBiYXNlZCBvbiB3aGF0IGEKLSAgICAgKiBkZXZpY2UgcmVwb3J0cyBpdCBpcyBjYXBhYmxlIG9mIGluIElucXVpcnkgYnl0ZSA3LgotICAgICAqCi0gICAgICogSWYgU0NTSSBCdXMgUmVzZXRzIGhhdmUgYmVlbiBkaXNhYmxlZCwgdGhlbiBkaXJlY3RseSBzZXQKLSAgICAgKiBTRFRSIGFuZCBXRFRSIGZyb20gdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uLiBUaGlzIHdpbGwgYWxsb3cKLSAgICAgKiB0aGUgQklPUyBhbmQgd2FybSBib290IHRvIHdvcmsgd2l0aG91dCBhIFNDU0kgYnVzIGhhbmcgb24KLSAgICAgKiB0aGUgSW5xdWlyeSBjYXVzZWQgYnkgaG9zdCBhbmQgdGFyZ2V0IG1pc21hdGNoZWQgRFRSIHZhbHVlcy4KLSAgICAgKiBXaXRob3V0IHRoZSBTQ1NJIEJ1cyBSZXNldCwgYmVmb3JlIGFuIElucXVpcnkgYSBkZXZpY2UgY2FuJ3QKLSAgICAgKiBiZSBhc3N1bWVkIHRvIGJlIGluIEFzeW5jaHJvbm91cywgTmFycm93IG1vZGUuCi0gICAgICovCi0gICAgaWYgKChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpID09IDApCi0gICAgewotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCBhc2NfZHZjLT53ZHRyX2FibGUpOwotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBhc2NfZHZjLT5zZHRyX2FibGUpOwotICAgIH0KKwkvKgorCSAqIE1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBXRFRSLCBTRFRSLCBhbmQgY29tbWFuZCB0YWcKKwkgKiBxdWV1aW5nIHdpbGwgYmUgc2V0IGluIEFkdklucXVpcnlIYW5kbGluZygpIGJhc2VkIG9uIHdoYXQgYQorCSAqIGRldmljZSByZXBvcnRzIGl0IGlzIGNhcGFibGUgb2YgaW4gSW5xdWlyeSBieXRlIDcuCisJICoKKwkgKiBJZiBTQ1NJIEJ1cyBSZXNldHMgaGF2ZSBiZWVuIGRpc2FibGVkLCB0aGVuIGRpcmVjdGx5IHNldAorCSAqIFNEVFIgYW5kIFdEVFIgZnJvbSB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBhbGxvdworCSAqIHRoZSBCSU9TIGFuZCB3YXJtIGJvb3QgdG8gd29yayB3aXRob3V0IGEgU0NTSSBidXMgaGFuZyBvbgorCSAqIHRoZSBJbnF1aXJ5IGNhdXNlZCBieSBob3N0IGFuZCB0YXJnZXQgbWlzbWF0Y2hlZCBEVFIgdmFsdWVzLgorCSAqIFdpdGhvdXQgdGhlIFNDU0kgQnVzIFJlc2V0LCBiZWZvcmUgYW4gSW5xdWlyeSBhIGRldmljZSBjYW4ndAorCSAqIGJlIGFzc3VtZWQgdG8gYmUgaW4gQXN5bmNocm9ub3VzLCBOYXJyb3cgbW9kZS4KKwkgKi8KKwlpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykgPT0gMCkgeworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLAorCQkJCSBhc2NfZHZjLT53ZHRyX2FibGUpOworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLAorCQkJCSBhc2NfZHZjLT5zZHRyX2FibGUpOworCX0KIAotICAgIC8qCi0gICAgICogU2V0IG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBTRFRSX1NQRUVEMSwgU0RUUl9TUEVFRDIsCi0gICAgICogU0RUUl9TUEVFRDMsIGFuZCBTRFRSX1NQRUVENCBiYXNlZCBvbiB0aGUgVUxUUkEgRUVQUk9NIHBlciBUSUQKLSAgICAgKiBiaXRtYXNrLiBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIFNEVFIgc3BlZWQgbmVnb3RpYXRlZAotICAgICAqIHdpdGggYSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBUaGUgU0RUUiBwZXIgVElEIGJpdG1hc2sgb3ZlcnJpZGVzIHRoZSBTRFRSX1NQRUVEMSwgU0RUUl9TUEVFRDIsCi0gICAgICogU0RUUl9TUEVFRDMsIGFuZCBTRFRSX1NQRUVENCB2YWx1ZXMgc28gaXQgaXMgc2FmZSB0byBzZXQgdGhlbQotICAgICAqIHdpdGhvdXQgZGV0ZXJtaW5pbmcgaGVyZSB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgU0RUUi4KLSAgICAgKgotICAgICAqIDQtYml0IHNwZWVkICBTRFRSIHNwZWVkIG5hbWUKLSAgICAgKiA9PT09PT09PT09PSAgPT09PT09PT09PT09PT09Ci0gICAgICogMDAwMGIgKDB4MCkgIFNEVFIgZGlzYWJsZWQKLSAgICAgKiAwMDAxYiAoMHgxKSAgNSBNaHoKLSAgICAgKiAwMDEwYiAoMHgyKSAgMTAgTWh6Ci0gICAgICogMDAxMWIgKDB4MykgIDIwIE1oeiAoVWx0cmEpCi0gICAgICogMDEwMGIgKDB4NCkgIDQwIE1oeiAoTFZEL1VsdHJhMikKLSAgICAgKiAwMTAxYiAoMHg1KSAgODAgTWh6IChMVkQyL1VsdHJhMykKLSAgICAgKiAwMTEwYiAoMHg2KSAgVW5kZWZpbmVkCi0gICAgICogLgotICAgICAqIDExMTFiICgweEYpICBVbmRlZmluZWQKLSAgICAgKi8KLSAgICB3b3JkID0gMDsKLSAgICBmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspCi0gICAgewotICAgICAgICBpZiAoQURWX1RJRF9UT19USURNQVNLKHRpZCkgJiBhc2NfZHZjLT51bHRyYV9hYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgVWx0cmEgc3BlZWQgZm9yIFRJRCAndGlkJy4gKi8KLSAgICAgICAgICAgIHdvcmQgfD0gKDB4MyA8PCAoNCAqICh0aWQgJSA0KSkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2V0IEZhc3Qgc3BlZWQgZm9yIFRJRCAndGlkJy4gKi8KLSAgICAgICAgICAgIHdvcmQgfD0gKDB4MiA8PCAoNCAqICh0aWQgJSA0KSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aWQgPT0gMykgLyogQ2hlY2sgaWYgZG9uZSB3aXRoIHNkdHJfc3BlZWQxLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDEsIHdvcmQpOwotICAgICAgICAgICAgd29yZCA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAodGlkID09IDcpIC8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMi4gKi8KLSAgICAgICAgewotICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQyLCB3b3JkKTsKLSAgICAgICAgICAgIHdvcmQgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSAxMSkgLyogQ2hlY2sgaWYgZG9uZSB3aXRoIHNkdHJfc3BlZWQzLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDMsIHdvcmQpOwotICAgICAgICAgICAgd29yZCA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAodGlkID09IDE1KSAvKiBDaGVjayBpZiBkb25lIHdpdGggc2R0cl9zcGVlZDQuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVENCwgd29yZCk7Ci0gICAgICAgICAgICAvKiBFbmQgb2YgbG9vcC4gKi8KLSAgICAgICAgfQotICAgIH0KKwkvKgorCSAqIFNldCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorCSAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgYmFzZWQgb24gdGhlIFVMVFJBIEVFUFJPTSBwZXIgVElECisJICogYml0bWFzay4gVGhlc2UgdmFsdWVzIGRldGVybWluZSB0aGUgbWF4aW11bSBTRFRSIHNwZWVkIG5lZ290aWF0ZWQKKwkgKiB3aXRoIGEgZGV2aWNlLgorCSAqCisJICogVGhlIFNEVFIgcGVyIFRJRCBiaXRtYXNrIG92ZXJyaWRlcyB0aGUgU0RUUl9TUEVFRDEsIFNEVFJfU1BFRUQyLAorCSAqIFNEVFJfU1BFRUQzLCBhbmQgU0RUUl9TUEVFRDQgdmFsdWVzIHNvIGl0IGlzIHNhZmUgdG8gc2V0IHRoZW0KKwkgKiB3aXRob3V0IGRldGVybWluaW5nIGhlcmUgd2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIFNEVFIuCisJICoKKwkgKiA0LWJpdCBzcGVlZCAgU0RUUiBzcGVlZCBuYW1lCisJICogPT09PT09PT09PT0gID09PT09PT09PT09PT09PQorCSAqIDAwMDBiICgweDApICBTRFRSIGRpc2FibGVkCisJICogMDAwMWIgKDB4MSkgIDUgTWh6CisJICogMDAxMGIgKDB4MikgIDEwIE1oegorCSAqIDAwMTFiICgweDMpICAyMCBNaHogKFVsdHJhKQorCSAqIDAxMDBiICgweDQpICA0MCBNaHogKExWRC9VbHRyYTIpCisJICogMDEwMWIgKDB4NSkgIDgwIE1oeiAoTFZEMi9VbHRyYTMpCisJICogMDExMGIgKDB4NikgIFVuZGVmaW5lZAorCSAqIC4KKwkgKiAxMTExYiAoMHhGKSAgVW5kZWZpbmVkCisJICovCisJd29yZCA9IDA7CisJZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKSB7CisJCWlmIChBRFZfVElEX1RPX1RJRE1BU0sodGlkKSAmIGFzY19kdmMtPnVsdHJhX2FibGUpIHsKKwkJCS8qIFNldCBVbHRyYSBzcGVlZCBmb3IgVElEICd0aWQnLiAqLworCQkJd29yZCB8PSAoMHgzIDw8ICg0ICogKHRpZCAlIDQpKSk7CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgRmFzdCBzcGVlZCBmb3IgVElEICd0aWQnLiAqLworCQkJd29yZCB8PSAoMHgyIDw8ICg0ICogKHRpZCAlIDQpKSk7CisJCX0KKwkJaWYgKHRpZCA9PSAzKSB7CS8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMS4gKi8KKwkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMSwgd29yZCk7CisJCQl3b3JkID0gMDsKKwkJfSBlbHNlIGlmICh0aWQgPT0gNykgewkvKiBDaGVjayBpZiBkb25lIHdpdGggc2R0cl9zcGVlZDIuICovCisJCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDIsIHdvcmQpOworCQkJd29yZCA9IDA7CisJCX0gZWxzZSBpZiAodGlkID09IDExKSB7CS8qIENoZWNrIGlmIGRvbmUgd2l0aCBzZHRyX3NwZWVkMy4gKi8KKwkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMywgd29yZCk7CisJCQl3b3JkID0gMDsKKwkJfSBlbHNlIGlmICh0aWQgPT0gMTUpIHsJLyogQ2hlY2sgaWYgZG9uZSB3aXRoIHNkdHJfc3BlZWQ0LiAqLworCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQ0LCB3b3JkKTsKKwkJCS8qIEVuZCBvZiBsb29wLiAqLworCQl9CisJfQogCi0gICAgLyoKLSAgICAgKiBTZXQgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZSBmb3IgdGhlIGRpc2Nvbm5lY3QgcGVyIFRJRCBiaXRtYXNrLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ESVNDX0VOQUJMRSwgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisJLyoKKwkgKiBTZXQgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZSBmb3IgdGhlIGRpc2Nvbm5lY3QgcGVyIFRJRCBiaXRtYXNrLgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ESVNDX0VOQUJMRSwKKwkJCSBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKIAotICAgIC8qCi0gICAgICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KLSAgICAgKgotICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCi0gICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCi0gICAgICAgIFBBUklUWV9FTiB8IFFVRVVFXzEyOCB8IFNFTF9UTU9fTE9ORyB8IE9VUl9JRF9FTiB8Ci0gICAgICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CisJLyoKKwkgKiBTZXQgU0NTSV9DRkcwIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcwIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKwkgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMCwKKwkJCSBQQVJJVFlfRU4gfCBRVUVVRV8xMjggfCBTRUxfVE1PX0xPTkcgfCBPVVJfSURfRU4gfAorCQkJIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CiAKLSAgICAvKgotICAgICAqIERldGVybWluZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCi0gICAgICoKLSAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCisJLyoKKwkgKiBEZXRlcm1pbmUgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKwkgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorCSAqLwogCi0gICAgLyogUmVhZCBjdXJyZW50IFNDU0lfQ0ZHMSBSZWdpc3RlciB2YWx1ZS4gKi8KLSAgICBzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CisJLyogUmVhZCBjdXJyZW50IFNDU0lfQ0ZHMSBSZWdpc3RlciB2YWx1ZS4gKi8KKwlzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CiAKLSAgICAvKgotICAgICAqIElmIGFsbCB0aHJlZSBjb25uZWN0b3JzIGFyZSBpbiB1c2UsIHJldHVybiBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBpZiAoKHNjc2lfY2ZnMSAmIENBQkxFX0lMTEVHQUxfQSkgPT0gMCB8fAotICAgICAgICAoc2NzaV9jZmcxICYgQ0FCTEVfSUxMRUdBTF9CKSA9PSAwKQotICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0lMTEVHQUxfQ09OTkVDVElPTjsKLSAgICAgICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCS8qCisJICogSWYgYWxsIHRocmVlIGNvbm5lY3RvcnMgYXJlIGluIHVzZSwgcmV0dXJuIGFuIGVycm9yLgorCSAqLworCWlmICgoc2NzaV9jZmcxICYgQ0FCTEVfSUxMRUdBTF9BKSA9PSAwIHx8CisJICAgIChzY3NpX2NmZzEgJiBDQUJMRV9JTExFR0FMX0IpID09IDApIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfSUxMRUdBTF9DT05ORUNUSU9OOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KIAotICAgIC8qCi0gICAgICogSWYgdGhlIGludGVybmFsIG5hcnJvdyBjYWJsZSBpcyByZXZlcnNlZCBhbGwgb2YgdGhlIFNDU0lfQ1RSTAotICAgICAqIHJlZ2lzdGVyIHNpZ25hbHMgd2lsbCBiZSBzZXQuIENoZWNrIGZvciBhbmQgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgICogdGhpcyBjb25kaXRpb24gaXMgZm91bmQuCi0gICAgICovCi0gICAgaWYgKChBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ1RSTCkgJiAweDNGMDcpID09IDB4M0YwNykKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1JFVkVSU0VEX0NBQkxFOwotICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgIH0KKwkvKgorCSAqIElmIHRoZSBpbnRlcm5hbCBuYXJyb3cgY2FibGUgaXMgcmV2ZXJzZWQgYWxsIG9mIHRoZSBTQ1NJX0NUUkwKKwkgKiByZWdpc3RlciBzaWduYWxzIHdpbGwgYmUgc2V0LiBDaGVjayBmb3IgYW5kIHJldHVybiBhbiBlcnJvciBpZgorCSAqIHRoaXMgY29uZGl0aW9uIGlzIGZvdW5kLgorCSAqLworCWlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NUUkwpICYgMHgzRjA3KSA9PSAweDNGMDcpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEU7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgLyoKLSAgICAgKiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50aWFsIGJvYXJkIGFuZCBhIHNpbmdsZS1lbmRlZCBkZXZpY2UKLSAgICAgKiBpcyBhdHRhY2hlZCB0byBvbmUgb2YgdGhlIGNvbm5lY3RvcnMsIHJldHVybiBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBpZiAoKHNjc2lfY2ZnMSAmIERJRkZfTU9ERSkgJiYgKHNjc2lfY2ZnMSAmIERJRkZfU0VOU0UpID09IDApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9TSU5HTEVfRU5EX0RFVklDRTsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50aWFsIGJvYXJkIGFuZCBhIHNpbmdsZS1lbmRlZCBkZXZpY2UKKwkgKiBpcyBhdHRhY2hlZCB0byBvbmUgb2YgdGhlIGNvbm5lY3RvcnMsIHJldHVybiBhbiBlcnJvci4KKwkgKi8KKwlpZiAoKHNjc2lfY2ZnMSAmIERJRkZfTU9ERSkgJiYgKHNjc2lfY2ZnMSAmIERJRkZfU0VOU0UpID09IDApIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfU0lOR0xFX0VORF9ERVZJQ0U7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgLyoKLSAgICAgKiBJZiBhdXRvbWF0aWMgdGVybWluYXRpb24gY29udHJvbCBpcyBlbmFibGVkLCB0aGVuIHNldCB0aGUKLSAgICAgKiB0ZXJtaW5hdGlvbiB2YWx1ZSBiYXNlZCBvbiBhIHRhYmxlIGxpc3RlZCBpbiBhX2NvbmRvci5oLgotICAgICAqCi0gICAgICogSWYgbWFudWFsIHRlcm1pbmF0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBFRVBST00gc2V0dGluZwotICAgICAqIHRoZW4gJ3Rlcm1pbmF0aW9uJyB3YXMgc2V0LXVwIGluIEFkdkluaXRGcm9tMzU1MEVFUFJPTSgpIGFuZAotICAgICAqIGlzIHJlYWR5IHRvIGJlICdvcmVkJyBpbnRvIFNDU0lfQ0ZHMS4KLSAgICAgKi8KLSAgICBpZiAoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9PSAwKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHNvZnR3YXJlIGFsd2F5cyBjb250cm9scyB0ZXJtaW5hdGlvbiBieSBzZXR0aW5nIFRFUk1fQ1RMX1NFTC4KLSAgICAgICAgICogSWYgVEVSTV9DVExfU0VMIHdlcmUgc2V0IHRvIDAsIHRoZSBoYXJkd2FyZSB3b3VsZCBzZXQgdGVybWluYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IFRFUk1fQ1RMX1NFTDsKKwkvKgorCSAqIElmIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQsIHRoZW4gc2V0IHRoZQorCSAqIHRlcm1pbmF0aW9uIHZhbHVlIGJhc2VkIG9uIGEgdGFibGUgbGlzdGVkIGluIGFfY29uZG9yLmguCisJICoKKwkgKiBJZiBtYW51YWwgdGVybWluYXRpb24gd2FzIHNwZWNpZmllZCB3aXRoIGFuIEVFUFJPTSBzZXR0aW5nCisJICogdGhlbiAndGVybWluYXRpb24nIHdhcyBzZXQtdXAgaW4gQWR2SW5pdEZyb20zNTUwRUVQUk9NKCkgYW5kCisJICogaXMgcmVhZHkgdG8gYmUgJ29yZWQnIGludG8gU0NTSV9DRkcxLgorCSAqLworCWlmIChhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID09IDApIHsKKwkJLyoKKwkJICogVGhlIHNvZnR3YXJlIGFsd2F5cyBjb250cm9scyB0ZXJtaW5hdGlvbiBieSBzZXR0aW5nIFRFUk1fQ1RMX1NFTC4KKwkJICogSWYgVEVSTV9DVExfU0VMIHdlcmUgc2V0IHRvIDAsIHRoZSBoYXJkd2FyZSB3b3VsZCBzZXQgdGVybWluYXRpb24uCisJCSAqLworCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IFRFUk1fQ1RMX1NFTDsKIAotICAgICAgICBzd2l0Y2goc2NzaV9jZmcxICYgQ0FCTEVfREVURUNUKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBURVJNX0NUTF9IOiBvbiwgVEVSTV9DVExfTDogb24gKi8KLSAgICAgICAgICAgIGNhc2UgMHgzOiBjYXNlIDB4NzogY2FzZSAweEI6IGNhc2UgMHhEOiBjYXNlIDB4RTogY2FzZSAweEY6Ci0gICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSAoVEVSTV9DVExfSCB8IFRFUk1fQ1RMX0wpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlzd2l0Y2ggKHNjc2lfY2ZnMSAmIENBQkxFX0RFVEVDVCkgeworCQkJLyogVEVSTV9DVExfSDogb24sIFRFUk1fQ1RMX0w6IG9uICovCisJCWNhc2UgMHgzOgorCQljYXNlIDB4NzoKKwkJY2FzZSAweEI6CisJCWNhc2UgMHhEOgorCQljYXNlIDB4RToKKwkJY2FzZSAweEY6CisJCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IChURVJNX0NUTF9IIHwgVEVSTV9DVExfTCk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgLyogVEVSTV9DVExfSDogb24sIFRFUk1fQ1RMX0w6IG9mZiAqLwotICAgICAgICAgICAgY2FzZSAweDE6IGNhc2UgMHg1OiBjYXNlIDB4OTogY2FzZSAweEE6IGNhc2UgMHhDOgotICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9DVExfSDsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCS8qIFRFUk1fQ1RMX0g6IG9uLCBURVJNX0NUTF9MOiBvZmYgKi8KKwkJY2FzZSAweDE6CisJCWNhc2UgMHg1OgorCQljYXNlIDB4OToKKwkJY2FzZSAweEE6CisJCWNhc2UgMHhDOgorCQkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX0NUTF9IOworCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIC8qIFRFUk1fQ1RMX0g6IG9mZiwgVEVSTV9DVExfTDogb2ZmICovCi0gICAgICAgICAgICBjYXNlIDB4MjogY2FzZSAweDY6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9CisJCQkvKiBURVJNX0NUTF9IOiBvZmYsIFRFUk1fQ1RMX0w6IG9mZiAqLworCQljYXNlIDB4MjoKKwkJY2FzZSAweDY6CisJCQlicmVhazsKKwkJfQorCX0KIAotICAgIC8qCi0gICAgICogQ2xlYXIgYW55IHNldCBURVJNX0NUTF9IIGFuZCBURVJNX0NUTF9MIGJpdHMuCi0gICAgICovCi0gICAgc2NzaV9jZmcxICY9IH5URVJNX0NUTDsKKwkvKgorCSAqIENsZWFyIGFueSBzZXQgVEVSTV9DVExfSCBhbmQgVEVSTV9DVExfTCBiaXRzLgorCSAqLworCXNjc2lfY2ZnMSAmPSB+VEVSTV9DVEw7CiAKLSAgICAvKgotICAgICAqIEludmVydCB0aGUgVEVSTV9DVExfSCBhbmQgVEVSTV9DVExfTCBiaXRzIGFuZCB0aGVuCi0gICAgICogc2V0ICdzY3NpX2NmZzEnLiBUaGUgVEVSTV9QT0wgYml0IGRvZXMgbm90IG5lZWQgdG8gYmUKLSAgICAgKiByZWZlcmVuY2VkLCBiZWNhdXNlIHRoZSBoYXJkd2FyZSBpbnRlcm5hbGx5IGludmVydHMKLSAgICAgKiB0aGUgVGVybWluYXRpb24gSGlnaCBhbmQgTG93IGJpdHMgaWYgVEVSTV9QT0wgaXMgc2V0LgotICAgICAqLwotICAgIHNjc2lfY2ZnMSB8PSAoVEVSTV9DVExfU0VMIHwgKH5hc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9DVEwpKTsKKwkvKgorCSAqIEludmVydCB0aGUgVEVSTV9DVExfSCBhbmQgVEVSTV9DVExfTCBiaXRzIGFuZCB0aGVuCisJICogc2V0ICdzY3NpX2NmZzEnLiBUaGUgVEVSTV9QT0wgYml0IGRvZXMgbm90IG5lZWQgdG8gYmUKKwkgKiByZWZlcmVuY2VkLCBiZWNhdXNlIHRoZSBoYXJkd2FyZSBpbnRlcm5hbGx5IGludmVydHMKKwkgKiB0aGUgVGVybWluYXRpb24gSGlnaCBhbmQgTG93IGJpdHMgaWYgVEVSTV9QT0wgaXMgc2V0LgorCSAqLworCXNjc2lfY2ZnMSB8PSAoVEVSTV9DVExfU0VMIHwgKH5hc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9DVEwpKTsKIAotICAgIC8qCi0gICAgICogU2V0IFNDU0lfQ0ZHMSBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQotICAgICAqCi0gICAgICogU2V0IGZpbHRlciB2YWx1ZSBhbmQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbAotICAgICAqIGJpdHMgaW4gdGhlIE1pY3JvY29kZSBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCi0gICAgICoKLSAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0NTSV9DRkcxLAotICAgICAgICBGTFRSX0RJU0FCTEUgfCBzY3NpX2NmZzEpOworCS8qCisJICogU2V0IFNDU0lfQ0ZHMSBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogU2V0IGZpbHRlciB2YWx1ZSBhbmQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbAorCSAqIGJpdHMgaW4gdGhlIE1pY3JvY29kZSBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCisJICoKKwkgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorCSAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0NTSV9DRkcxLAorCQkJIEZMVFJfRElTQUJMRSB8IHNjc2lfY2ZnMSk7CiAKLSAgICAvKgotICAgICAqIFNldCBNRU1fQ0ZHIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlCi0gICAgICoKLSAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBNRU1fQ0ZHIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKLSAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgotICAgICAqCi0gICAgICogTUVNX0NGRyBtYXkgYmUgYWNjZXNzZWQgYXMgYSB3b3JkIG9yIGJ5dGUsIGJ1dCBvbmx5IGJpdHMgMC03Ci0gICAgICogYXJlIGRlZmluZWQuCi0gICAgICoKLSAgICAgKiBBU0MtMzU1MCBoYXMgOEtCIGludGVybmFsIG1lbW9yeS4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAotICAgICAgICBCSU9TX0VOIHwgUkFNX1NaXzhLQik7CisJLyoKKwkgKiBTZXQgTUVNX0NGRyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgTUVNX0NGRyByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisJICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKwkgKgorCSAqIE1FTV9DRkcgbWF5IGJlIGFjY2Vzc2VkIGFzIGEgd29yZCBvciBieXRlLCBidXQgb25seSBiaXRzIDAtNworCSAqIGFyZSBkZWZpbmVkLgorCSAqCisJICogQVNDLTM1NTAgaGFzIDhLQiBpbnRlcm5hbCBtZW1vcnkuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfTUVNX0NGRywKKwkJCSBCSU9TX0VOIHwgUkFNX1NaXzhLQik7CiAKLSAgICAvKgotICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQotICAgICAqCi0gICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCi0gICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKwkvKgorCSAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorCSAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisJCQkgQURWX1RJRF9UT19USURNQVNLKGFzY19kdmMtPmNoaXBfc2NzaV9pZCkpOwogCi0gICAgLyoKLSAgICAgKiBCdWlsZCBjYXJyaWVyIGZyZWVsaXN0LgotICAgICAqCi0gICAgICogRHJpdmVyIG11c3QgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCAnY2Fycmllcl9idWYnLgotICAgICAqLwotICAgIEFTQ19BU1NFUlQoYXNjX2R2Yy0+Y2Fycmllcl9idWYgIT0gTlVMTCk7CisJLyoKKwkgKiBCdWlsZCBjYXJyaWVyIGZyZWVsaXN0LgorCSAqCisJICogRHJpdmVyIG11c3QgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCAnY2Fycmllcl9idWYnLgorCSAqLworCUFTQ19BU1NFUlQoYXNjX2R2Yy0+Y2Fycmllcl9idWYgIT0gTlVMTCk7CiAKLSAgICBjYXJycCA9IChBRFZfQ0FSUl9UICopIEFEVl8xNkJBTElHTihhc2NfZHZjLT5jYXJyaWVyX2J1Zik7Ci0gICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IE5VTEw7Ci0gICAgaWYgKGNhcnJwID09IChBRFZfQ0FSUl9UICopIGFzY19kdmMtPmNhcnJpZXJfYnVmKQotICAgIHsKLSAgICAgICAgYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFIC0gc2l6ZW9mKEFEVl9DQVJSX1QpOwotICAgIH0KKwljYXJycCA9IChBRFZfQ0FSUl9UICopIEFEVl8xNkJBTElHTihhc2NfZHZjLT5jYXJyaWVyX2J1Zik7CisJYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IE5VTEw7CisJaWYgKGNhcnJwID09IChBRFZfQ0FSUl9UICopIGFzY19kdmMtPmNhcnJpZXJfYnVmKSB7CisJCWJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRTsKKwl9IGVsc2UgeworCQlidWZfc2l6ZSA9IEFEVl9DQVJSSUVSX0JVRlNJWkUgLSBzaXplb2YoQURWX0NBUlJfVCk7CisJfQogCi0gICAgZG8gewotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY2FycmllciAnY2FycnAnLgotICAgICAgICAgKi8KLSAgICAgICAgY29udGlnX2xlbiA9IHNpemVvZihBRFZfQ0FSUl9UKTsKLSAgICAgICAgY2Fycl9wYWRkciA9IGNwdV90b19sZTMyKER2Y0dldFBoeUFkZHIoYXNjX2R2YywgTlVMTCwgKHVjaGFyICopIGNhcnJwLAotICAgICAgICAgICAgKEFEVl9TRENOVCAqKSAmY29udGlnX2xlbiwgQURWX0lTX0NBUlJJRVJfRkxBRykpOworCWRvIHsKKwkJLyoKKwkJICogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNhcnJpZXIgJ2NhcnJwJy4KKwkJICovCisJCWNvbnRpZ19sZW4gPSBzaXplb2YoQURWX0NBUlJfVCk7CisJCWNhcnJfcGFkZHIgPQorCQkgICAgY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcgorCQkJCShhc2NfZHZjLCBOVUxMLCAodWNoYXIgKiljYXJycCwKKwkJCQkgKEFEVl9TRENOVCAqKSZjb250aWdfbGVuLAorCQkJCSBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CiAKLSAgICAgICAgYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCQlidWZfc2l6ZSAtPSBzaXplb2YoQURWX0NBUlJfVCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIGN1cnJlbnQgY2FycmllciBpcyBub3QgcGh5c2ljYWxseSBjb250aWd1b3VzLCB0aGVuCi0gICAgICAgICAqIG1heWJlIHRoZXJlIHdhcyBhIHBhZ2UgY3Jvc3NpbmcuIFRyeSB0aGUgbmV4dCBjYXJyaWVyIGFsaWduZWQKLSAgICAgICAgICogc3RhcnQgYWRkcmVzcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChjb250aWdfbGVuIDwgc2l6ZW9mKEFEVl9DQVJSX1QpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXJycCsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgY2FycmllciBpcyBub3QgcGh5c2ljYWxseSBjb250aWd1b3VzLCB0aGVuCisJCSAqIG1heWJlIHRoZXJlIHdhcyBhIHBhZ2UgY3Jvc3NpbmcuIFRyeSB0aGUgbmV4dCBjYXJyaWVyIGFsaWduZWQKKwkJICogc3RhcnQgYWRkcmVzcy4KKwkJICovCisJCWlmIChjb250aWdfbGVuIDwgc2l6ZW9mKEFEVl9DQVJSX1QpKSB7CisJCQljYXJycCsrOworCQkJY29udGludWU7CisJCX0KIAotICAgICAgICBjYXJycC0+Y2Fycl9wYSA9IGNhcnJfcGFkZHI7Ci0gICAgICAgIGNhcnJwLT5jYXJyX3ZhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihjYXJycCkpOworCQljYXJycC0+Y2Fycl9wYSA9IGNhcnJfcGFkZHI7CisJCWNhcnJwLT5jYXJyX3ZhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihjYXJycCkpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluc2VydCB0aGUgY2FycmllciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmVlbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIGNhcnJwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkpOwotICAgICAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gY2FycnA7CisJCS8qCisJCSAqIEluc2VydCB0aGUgY2FycmllciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmVlbGlzdC4KKwkJICovCisJCWNhcnJwLT5uZXh0X3ZwYSA9CisJCSAgICBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKwkJYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOwogCi0gICAgICAgIGNhcnJwKys7Ci0gICAgfQotICAgIHdoaWxlIChidWZfc2l6ZSA+IDApOworCQljYXJycCsrOworCX0KKwl3aGlsZSAoYnVmX3NpemUgPiAwKTsKIAotICAgIC8qCi0gICAgICogU2V0LXVwIHRoZSBIb3N0LT5SSVNDIEluaXRpYXRvciBDb21tYW5kIFF1ZXVlIChJQ1EpLgotICAgICAqLworCS8qCisJICogU2V0LXVwIHRoZSBIb3N0LT5SSVNDIEluaXRpYXRvciBDb21tYW5kIFF1ZXVlIChJQ1EpLgorCSAqLwogCi0gICAgaWYgKChhc2NfZHZjLT5pY3Ffc3AgPSBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfTk9fQ0FSUklFUjsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9Ci0gICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IChBRFZfQ0FSUl9UICopCi0gICAgICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUoYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSkpOworCWlmICgoYXNjX2R2Yy0+aWNxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KKwlhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKwkgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhKSk7CiAKLSAgICAvKgotICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGlzc3VlZCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgc3RvcHBlciBjYXJyaWVyLgotICAgICAqLwotICAgIGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisJLyoKKwkgKiBUaGUgZmlyc3QgY29tbWFuZCBpc3N1ZWQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIHN0b3BwZXIgY2Fycmllci4KKwkgKi8KKwlhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOwogCi0gICAgLyoKLSAgICAgKiBTZXQgUklTQyBJQ1EgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KLSAgICAgKi8KLSAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lDUSwgYXNjX2R2Yy0+aWNxX3NwLT5jYXJyX3BhKTsKKwkvKgorCSAqIFNldCBSSVNDIElDUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorCSAqLworCUFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSUNRLCBhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpOwogCi0gICAgLyoKLSAgICAgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgotICAgICAqLwotICAgIGlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQotICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQotICAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CisJLyoKKwkgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgorCSAqLworCWlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KKwlhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKwkgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CiAKLSAgICAvKgotICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGNvbXBsZXRlZCBieSB0aGUgUklTQyB3aWxsIGJlIHBsYWNlZCBpbgotICAgICAqIHRoZSBzdG9wcGVyLgotICAgICAqCi0gICAgICogTm90ZTogU2V0ICduZXh0X3ZwYScgdG8gQVNDX0NRX1NUT1BQRVIuIFdoZW4gdGhlIHJlcXVlc3QgaXMKLSAgICAgKiBjb21wbGV0ZWQgdGhlIFJJU0Mgd2lsbCBzZXQgdGhlIEFTQ19SUV9TVE9QUEVSIGJpdC4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCS8qCisJICogVGhlIGZpcnN0IGNvbW1hbmQgY29tcGxldGVkIGJ5IHRoZSBSSVNDIHdpbGwgYmUgcGxhY2VkIGluCisJICogdGhlIHN0b3BwZXIuCisJICoKKwkgKiBOb3RlOiBTZXQgJ25leHRfdnBhJyB0byBBU0NfQ1FfU1RPUFBFUi4gV2hlbiB0aGUgcmVxdWVzdCBpcworCSAqIGNvbXBsZXRlZCB0aGUgUklTQyB3aWxsIHNldCB0aGUgQVNDX1JRX1NUT1BQRVIgYml0LgorCSAqLworCWFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CiAKLSAgICAvKgotICAgICAqIFNldCBSSVNDIElSUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgotICAgICAqLwotICAgIEFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSVJRLCBhc2NfZHZjLT5pcnFfc3AtPmNhcnJfcGEpOwotICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQgPSAwOworCS8qCisJICogU2V0IFJJU0MgSVJRIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgdmFsdWUuCisJICovCisJQWR2V3JpdGVEV29yZExyYW1Ob1N3YXAoaW9wX2Jhc2UsIEFTQ19NQ19JUlEsIGFzY19kdmMtPmlycV9zcC0+Y2Fycl9wYSk7CisJYXNjX2R2Yy0+Y2Fycl9wZW5kaW5nX2NudCA9IDA7CiAKLSAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9JTlRSX0VOQUJMRVMsCi0gICAgICAgIChBRFZfSU5UUl9FTkFCTEVfSE9TVF9JTlRSIHwgQURWX0lOVFJfRU5BQkxFX0dMT0JBTF9JTlRSKSk7CisJQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfSU5UUl9FTkFCTEVTLAorCQkJICAgICAoQURWX0lOVFJfRU5BQkxFX0hPU1RfSU5UUiB8CisJCQkgICAgICBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKIAotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOwogCi0gICAgLyogZmluYWxseSwgZmluYWxseSwgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZSAqLwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfUlVOKTsKKwkvKiBmaW5hbGx5LCBmaW5hbGx5LCBnZW50bGVtZW4sIHN0YXJ0IHlvdXIgZW5naW5lICovCisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUklTQ19DU1IsIEFEVl9SSVNDX0NTUl9SVU4pOwogCi0gICAgLyoKLSAgICAgKiBSZXNldCB0aGUgU0NTSSBCdXMgaWYgdGhlIEVFUFJPTSBpbmRpY2F0ZXMgdGhhdCBTQ1NJIEJ1cwotICAgICAqIFJlc2V0cyBzaG91bGQgYmUgcGVyZm9ybWVkLiBUaGUgUklTQyBoYXMgdG8gYmUgcnVubmluZwotICAgICAqIHRvIGlzc3VlIGEgU0NTSSBCdXMgUmVzZXQuCi0gICAgICovCi0gICAgaWYgKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZSBCSU9TIFNpZ25hdHVyZSBpcyBwcmVzZW50IGluIG1lbW9yeSwgcmVzdG9yZSB0aGUKLSAgICAgICAgICogQklPUyBIYW5kc2hha2UgQ29uZmlndXJhdGlvbiBUYWJsZSBhbmQgZG8gbm90IHBlcmZvcm0KLSAgICAgICAgICogYSBTQ1NJIEJ1cyBSZXNldC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChiaW9zX21lbVsoQVNDX01DX0JJT1NfU0lHTkFUVVJFIC0gQVNDX01DX0JJT1NNRU0pLzJdID09IDB4NTVBQSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJlc3RvcmUgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKLSAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7Ci0gICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKLSAgICAgICAgICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFEVl9NQVhfVElEOyB0aWQrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZHZXcml0ZUJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCi0gICAgICAgICAgICAgICAgICAgIG1heF9jbWRbdGlkXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQWR2UmVzZXRTQihhc2NfZHZjKSAhPSBBRFZfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3YXJuX2NvZGUgPSBBU0NfV0FSTl9CVVNSRVNFVF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkvKgorCSAqIFJlc2V0IHRoZSBTQ1NJIEJ1cyBpZiB0aGUgRUVQUk9NIGluZGljYXRlcyB0aGF0IFNDU0kgQnVzCisJICogUmVzZXRzIHNob3VsZCBiZSBwZXJmb3JtZWQuIFRoZSBSSVNDIGhhcyB0byBiZSBydW5uaW5nCisJICogdG8gaXNzdWUgYSBTQ1NJIEJ1cyBSZXNldC4KKwkgKi8KKwlpZiAoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKSB7CisJCS8qCisJCSAqIElmIHRoZSBCSU9TIFNpZ25hdHVyZSBpcyBwcmVzZW50IGluIG1lbW9yeSwgcmVzdG9yZSB0aGUKKwkJICogQklPUyBIYW5kc2hha2UgQ29uZmlndXJhdGlvbiBUYWJsZSBhbmQgZG8gbm90IHBlcmZvcm0KKwkJICogYSBTQ1NJIEJ1cyBSZXNldC4KKwkJICovCisJCWlmIChiaW9zX21lbVsoQVNDX01DX0JJT1NfU0lHTkFUVVJFIC0gQVNDX01DX0JJT1NNRU0pIC8gMl0gPT0KKwkJICAgIDB4NTVBQSkgeworCQkJLyoKKwkJCSAqIFJlc3RvcmUgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKwkJCSAqLworCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKwkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisJCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsCisJCQkJCSB0YWdxbmdfYWJsZSk7CisJCQlmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspIHsKKwkJCQlBZHZXcml0ZUJ5dGVMcmFtKGlvcF9iYXNlLAorCQkJCQkJIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKwkJCQkJCSBtYXhfY21kW3RpZF0pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKEFkdlJlc2V0U0IoYXNjX2R2YykgIT0gQURWX1RSVUUpIHsKKwkJCQl3YXJuX2NvZGUgPSBBU0NfV0FSTl9CVVNSRVNFVF9FUlJPUjsKKwkJCX0KKwkJfQorCX0KIAotICAgIHJldHVybiB3YXJuX2NvZGU7CisJcmV0dXJuIHdhcm5fY29kZTsKIH0KIAogLyoKQEAgLTE1MTE1LDYxOSArMTQ4OTQsNjEwIEBACiAgKgogICogTmVlZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uIGZvciBlcnJvciByZWNvdmVyeS4KICAqLwotU1RBVElDIGludAotQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoQURWX0RWQ19WQVIgKmFzY19kdmMpCitzdGF0aWMgaW50IEFkdkluaXRBc2MzOEMwODAwRHJpdmVyKEFEVl9EVkNfVkFSICphc2NfZHZjKQogewotICAgIEFkdlBvcnRBZGRyIGlvcF9iYXNlOwotICAgIHVzaG9ydCAgICAgIHdhcm5fY29kZTsKLSAgICBBRFZfRENOVCAgICBzdW07Ci0gICAgaW50ICAgICAgICAgYmVnaW5fYWRkcjsKLSAgICBpbnQgICAgICAgICBlbmRfYWRkcjsKLSAgICB1c2hvcnQgICAgICBjb2RlX3N1bTsKLSAgICBpbnQgICAgICAgICB3b3JkOwotICAgIGludCAgICAgICAgIGo7Ci0gICAgaW50ICAgICAgICAgYWR2X2FzYzM4QzA4MDBfZXhwYW5kZWRfc2l6ZTsKLSAgICBBRFZfQ0FSUl9UICAqY2FycnA7Ci0gICAgQURWX0RDTlQgICAgY29udGlnX2xlbjsKLSAgICBBRFZfU0RDTlQgICBidWZfc2l6ZTsKLSAgICBBRFZfUEFERFIgICBjYXJyX3BhZGRyOwotICAgIGludCAgICAgICAgIGk7Ci0gICAgdXNob3J0ICAgICAgc2NzaV9jZmcxOwotICAgIHVjaGFyICAgICAgIGJ5dGU7Ci0gICAgdWNoYXIgICAgICAgdGlkOwotICAgIHVzaG9ydCAgICAgIGJpb3NfbWVtW0FTQ19NQ19CSU9TTEVOLzJdOyAvKiBCSU9TIFJJU0MgTWVtb3J5IDB4NDAtMHg4Ri4gKi8KLSAgICB1c2hvcnQgICAgICB3ZHRyX2FibGUsIHNkdHJfYWJsZSwgdGFncW5nX2FibGU7Ci0gICAgdWNoYXIgICAgICAgbWF4X2NtZFtBRFZfTUFYX1RJRCArIDFdOworCUFkdlBvcnRBZGRyIGlvcF9iYXNlOworCXVzaG9ydCB3YXJuX2NvZGU7CisJQURWX0RDTlQgc3VtOworCWludCBiZWdpbl9hZGRyOworCWludCBlbmRfYWRkcjsKKwl1c2hvcnQgY29kZV9zdW07CisJaW50IHdvcmQ7CisJaW50IGo7CisJaW50IGFkdl9hc2MzOEMwODAwX2V4cGFuZGVkX3NpemU7CisJQURWX0NBUlJfVCAqY2FycnA7CisJQURWX0RDTlQgY29udGlnX2xlbjsKKwlBRFZfU0RDTlQgYnVmX3NpemU7CisJQURWX1BBRERSIGNhcnJfcGFkZHI7CisJaW50IGk7CisJdXNob3J0IHNjc2lfY2ZnMTsKKwl1Y2hhciBieXRlOworCXVjaGFyIHRpZDsKKwl1c2hvcnQgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4gLyAyXTsJLyogQklPUyBSSVNDIE1lbW9yeSAweDQwLTB4OEYuICovCisJdXNob3J0IHdkdHJfYWJsZSwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKKwl1Y2hhciBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CiAKLSAgICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGVycm9yLCBkb24ndCBjb250aW51ZS4gKi8KLSAgICBpZiAoYXNjX2R2Yy0+ZXJyX2NvZGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCS8qIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZXJyb3IsIGRvbid0IGNvbnRpbnVlLiAqLworCWlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKSB7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgLyoKLSAgICAgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIEFEVl9DSElQX0FTQzM4QzA4MDAuCi0gICAgICovCi0gICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzOEMwODAwKQotICAgIHsKLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgPSBBU0NfSUVSUl9CQURfQ0hJUFRZUEU7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCS8qCisJICogVGhlIGNhbGxlciBtdXN0IHNldCAnY2hpcF90eXBlJyB0byBBRFZfQ0hJUF9BU0MzOEMwODAwLgorCSAqLworCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgIT0gQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSA9IEFTQ19JRVJSX0JBRF9DSElQVFlQRTsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CiAKLSAgICB3YXJuX2NvZGUgPSAwOwotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJd2Fybl9jb2RlID0gMDsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwogCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbiBiZWZvcmUgd3JpdGluZyB0aGUgbWljcm9jb2RlLgotICAgICAqIFRoZSBCSU9TIG1heSBhbHJlYWR5IGJlIGxvYWRlZCBhbmQgdXNpbmcgaXRzIFJJU0MgTFJBTSByZWdpb24KLSAgICAgKiBzbyBpdHMgcmVnaW9uIG11c3QgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkLgotICAgICAqCi0gICAgICogTm90ZTogVGhpcyBjb2RlIG1ha2VzIHRoZSBhc3N1bXB0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgdHJ1ZSwKLSAgICAgKiB0aGF0IGEgY2hpcCByZXNldCBkb2VzIG5vdCBjbGVhciBSSVNDIExSQU0uCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IEFTQ19NQ19CSU9TTEVOLzI7IGkrKykKLSAgICB7Ci0gICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLCBiaW9zX21lbVtpXSk7Ci0gICAgfQorCS8qCisJICogU2F2ZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24gYmVmb3JlIHdyaXRpbmcgdGhlIG1pY3JvY29kZS4KKwkgKiBUaGUgQklPUyBtYXkgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHVzaW5nIGl0cyBSSVNDIExSQU0gcmVnaW9uCisJICogc28gaXRzIHJlZ2lvbiBtdXN0IGJlIHNhdmVkIGFuZCByZXN0b3JlZC4KKwkgKgorCSAqIE5vdGU6IFRoaXMgY29kZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiwgd2hpY2ggaXMgY3VycmVudGx5IHRydWUsCisJICogdGhhdCBhIGNoaXAgcmVzZXQgZG9lcyBub3QgY2xlYXIgUklTQyBMUkFNLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTiAvIDI7IGkrKykgeworCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwKKwkJCQliaW9zX21lbVtpXSk7CisJfQogCi0gICAgLyoKLSAgICAgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KLSAgICAgKi8KLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7Ci0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7Ci0gICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQotICAgIHsKLSAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCi0gICAgICAgICAgICBtYXhfY21kW3RpZF0pOwotICAgIH0KKwkvKgorCSAqIFNhdmUgY3VycmVudCBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorCSAqLworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspIHsKKwkJQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisJCQkJbWF4X2NtZFt0aWRdKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFJBTSBCSVNUIChSQU0gQnVpbHQtSW4gU2VsZiBUZXN0KQotICAgICAqCi0gICAgICogQWRkcmVzcyA6IEkvTyBiYXNlICsgb2Zmc2V0IDB4MzhoIHJlZ2lzdGVyIChieXRlKS4KLSAgICAgKiBGdW5jdGlvbjogQml0IDctNihSVykgOiBSQU0gbW9kZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgTW9kZSAgIDogMHgwMAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBQcmUtdGVzdCBNb2RlIDogMHg0MAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBSQU0gVGVzdCBNb2RlIDogMHg4MAotICAgICAqICAgICAgICAgICBCaXQgNSAgICAgICA6IHVudXNlZAotICAgICAqICAgICAgICAgICBCaXQgNChSTykgICA6IERvbmUgYml0Ci0gICAgICogICAgICAgICAgIEJpdCAzLTAoUk8pIDogU3RhdHVzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3QgRXJyb3IgICAgOiAweDA4Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEludF9SQU0gRXJyb3IgOiAweDA0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFJJU0MgRXJyb3IgICAgOiAweDAyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFNDU0kgRXJyb3IgICAgOiAweDAxCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vIEVycm9yICAgICAgOiAweDAwCi0gICAgICoKLSAgICAgKiBOb3RlOiBSQU0gQklTVCBjb2RlIHNob3VsZCBiZSBwdXQgcmlnaHQgaGVyZSwgYmVmb3JlIGxvYWRpbmcgdGhlCi0gICAgICogbWljcm9jb2RlIGFuZCBhZnRlciBzYXZpbmcgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uLgotICAgICAqLworCS8qCisJICogUkFNIEJJU1QgKFJBTSBCdWlsdC1JbiBTZWxmIFRlc3QpCisJICoKKwkgKiBBZGRyZXNzIDogSS9PIGJhc2UgKyBvZmZzZXQgMHgzOGggcmVnaXN0ZXIgKGJ5dGUpLgorCSAqIEZ1bmN0aW9uOiBCaXQgNy02KFJXKSA6IFJBTSBtb2RlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBNb2RlICAgOiAweDAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIFByZS10ZXN0IE1vZGUgOiAweDQwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIFJBTSBUZXN0IE1vZGUgOiAweDgwCisJICogICAgICAgICAgIEJpdCA1ICAgICAgIDogdW51c2VkCisJICogICAgICAgICAgIEJpdCA0KFJPKSAgIDogRG9uZSBiaXQKKwkgKiAgICAgICAgICAgQml0IDMtMChSTykgOiBTdGF0dXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdCBFcnJvciAgICA6IDB4MDgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW50X1JBTSBFcnJvciA6IDB4MDQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUklTQyBFcnJvciAgICA6IDB4MDIKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSSBFcnJvciAgICA6IDB4MDEKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gRXJyb3IgICAgICA6IDB4MDAKKwkgKgorCSAqIE5vdGU6IFJBTSBCSVNUIGNvZGUgc2hvdWxkIGJlIHB1dCByaWdodCBoZXJlLCBiZWZvcmUgbG9hZGluZyB0aGUKKwkgKiBtaWNyb2NvZGUgYW5kIGFmdGVyIHNhdmluZyB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24uCisJICovCiAKLSAgICAvKgotICAgICAqIExSQU0gUHJlLXRlc3QKLSAgICAgKgotICAgICAqIFdyaXRlIFBSRV9URVNUX01PREUgKDB4NDApIHRvIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciAxMCBtaWxsaXNlY29uZHMuCi0gICAgICogSWYgRG9uZSBiaXQgbm90IHNldCBvciBsb3cgbmliYmxlIG5vdCBQUkVfVEVTVF9WQUxVRSAoMHgwNSksIHJldHVybgotICAgICAqIGFuIGVycm9yLiBSZXNldCB0byBOT1JNQUxfTU9ERSAoMHgwMCkgYW5kIGRvIGFnYWluLiBJZiBjYW5ub3QgcmVzZXQKLSAgICAgKiB0byBOT1JNQUxfTU9ERSwgcmV0dXJuIGFuIGVycm9yIHRvby4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIFBSRV9URVNUX01PREUpOwotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KLSAgICAgICAgYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOwotICAgICAgICBpZiAoKGJ5dGUgJiBSQU1fVEVTVF9ET05FKSA9PSAwIHx8IChieXRlICYgMHgwRikgIT0gUFJFX1RFU1RfVkFMVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7Ci0gICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgICAgICB9CisJLyoKKwkgKiBMUkFNIFByZS10ZXN0CisJICoKKwkgKiBXcml0ZSBQUkVfVEVTVF9NT0RFICgweDQwKSB0byByZWdpc3RlciBhbmQgd2FpdCBmb3IgMTAgbWlsbGlzZWNvbmRzLgorCSAqIElmIERvbmUgYml0IG5vdCBzZXQgb3IgbG93IG5pYmJsZSBub3QgUFJFX1RFU1RfVkFMVUUgKDB4MDUpLCByZXR1cm4KKwkgKiBhbiBlcnJvci4gUmVzZXQgdG8gTk9STUFMX01PREUgKDB4MDApIGFuZCBkbyBhZ2Fpbi4gSWYgY2Fubm90IHJlc2V0CisJICogdG8gTk9STUFMX01PREUsIHJldHVybiBhbiBlcnJvciB0b28uCisJICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUFJFX1RFU1RfTU9ERSk7CisJCUR2Y1NsZWVwTWlsbGlTZWNvbmQoMTApOwkvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSByZWFkaW5nIGJhY2suICovCisJCWJ5dGUgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKTsKKwkJaWYgKChieXRlICYgUkFNX1RFU1RfRE9ORSkgPT0gMAorCQkgICAgfHwgKGJ5dGUgJiAweDBGKSAhPSBQUkVfVEVTVF9WQUxVRSkgeworCQkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9QUkVfVEVTVDsKKwkJCXJldHVybiBBRFZfRVJST1I7CisJCX0KIAotICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOwotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KLSAgICAgICAgaWYgKEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpCi0gICAgICAgICAgICAhPSBOT1JNQUxfVkFMVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7Ci0gICAgICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQorCQlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOworCQlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsJLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgcmVhZGluZyBiYWNrLiAqLworCQlpZiAoQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCkKKwkJICAgICE9IE5PUk1BTF9WQUxVRSkgeworCQkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9QUkVfVEVTVDsKKwkJCXJldHVybiBBRFZfRVJST1I7CisJCX0KKwl9CiAKLSAgICAvKgotICAgICAqIExSQU0gVGVzdCAtIEl0IHRha2VzIGFib3V0IDEuNSBtcyB0byBydW4gdGhyb3VnaCB0aGUgdGVzdC4KLSAgICAgKgotICAgICAqIFdyaXRlIFJBTV9URVNUX01PREUgKDB4ODApIHRvIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciAxMCBtaWxsaXNlY29uZHMuCi0gICAgICogSWYgRG9uZSBiaXQgbm90IHNldCBvciBTdGF0dXMgbm90IDAsIHNhdmUgcmVnaXN0ZXIgYnl0ZSwgc2V0IHRoZQotICAgICAqIGVycl9jb2RlLCBhbmQgcmV0dXJuIGFuIGVycm9yLgotICAgICAqLwotICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNULCBSQU1fVEVTVF9NT0RFKTsKLSAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsgIC8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIGNoZWNraW5nIHN0YXR1cy4gKi8KKwkvKgorCSAqIExSQU0gVGVzdCAtIEl0IHRha2VzIGFib3V0IDEuNSBtcyB0byBydW4gdGhyb3VnaCB0aGUgdGVzdC4KKwkgKgorCSAqIFdyaXRlIFJBTV9URVNUX01PREUgKDB4ODApIHRvIHJlZ2lzdGVyIGFuZCB3YWl0IGZvciAxMCBtaWxsaXNlY29uZHMuCisJICogSWYgRG9uZSBiaXQgbm90IHNldCBvciBTdGF0dXMgbm90IDAsIHNhdmUgcmVnaXN0ZXIgYnl0ZSwgc2V0IHRoZQorCSAqIGVycl9jb2RlLCBhbmQgcmV0dXJuIGFuIGVycm9yLgorCSAqLworCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNULCBSQU1fVEVTVF9NT0RFKTsKKwlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsJLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgY2hlY2tpbmcgc3RhdHVzLiAqLwogCi0gICAgYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOwotICAgIGlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAgfHwgKGJ5dGUgJiBSQU1fVEVTVF9TVEFUVVMpICE9IDApCi0gICAgewotICAgICAgICAvKiBHZXQgaGVyZSBpZiBEb25lIGJpdCBub3Qgc2V0IG9yIFN0YXR1cyBub3QgMC4gKi8KLSAgICAgICAgYXNjX2R2Yy0+YmlzdF9lcnJfY29kZSA9IGJ5dGU7ICAvKiBmb3IgQklPUyBkaXNwbGF5IG1lc3NhZ2UgKi8KLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9SQU1fVEVTVDsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJYnl0ZSA9IEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpOworCWlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAgfHwgKGJ5dGUgJiBSQU1fVEVTVF9TVEFUVVMpICE9IDApIHsKKwkJLyogR2V0IGhlcmUgaWYgRG9uZSBiaXQgbm90IHNldCBvciBTdGF0dXMgbm90IDAuICovCisJCWFzY19kdmMtPmJpc3RfZXJyX2NvZGUgPSBieXRlOwkvKiBmb3IgQklPUyBkaXNwbGF5IG1lc3NhZ2UgKi8KKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfQklTVF9SQU1fVEVTVDsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CiAKLSAgICAvKiBXZSBuZWVkIHRvIHJlc2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgYWZ0ZXIgTFJBTSB0ZXN0IHBhc3Nlcy4gKi8KLSAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOworCS8qIFdlIG5lZWQgdG8gcmVzZXQgYmFjayB0byBub3JtYWwgbW9kZSBhZnRlciBMUkFNIHRlc3QgcGFzc2VzLiAqLworCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNULCBOT1JNQUxfTU9ERSk7CiAKLSAgICAvKgotICAgICAqIExvYWQgdGhlIE1pY3JvY29kZQotICAgICAqCi0gICAgICogV3JpdGUgdGhlIG1pY3JvY29kZSBpbWFnZSB0byBSSVNDIG1lbW9yeSBzdGFydGluZyBhdCBhZGRyZXNzIDAuCi0gICAgICoKLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgMCk7CisJLyoKKwkgKiBMb2FkIHRoZSBNaWNyb2NvZGUKKwkgKgorCSAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgorCSAqCisJICovCisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOwogCi0gICAgLyogQXNzdW1lIHRoZSBmb2xsb3dpbmcgY29tcHJlc3NlZCBmb3JtYXQgb2YgdGhlIG1pY3JvY29kZSBidWZmZXI6Ci0gICAgICoKLSAgICAgKiAgMjU0IHdvcmQgKDUwOCBieXRlKSB0YWJsZSBpbmRleGVkIGJ5IGJ5dGUgY29kZSBmb2xsb3dlZAotICAgICAqICBieSB0aGUgZm9sbG93aW5nIGJ5dGUgY29kZXM6Ci0gICAgICoKLSAgICAgKiAgICAxLUJ5dGUgQ29kZToKLSAgICAgKiAgICAgIDAwOiBFbWl0IHdvcmQgMCBpbiB0YWJsZS4KLSAgICAgKiAgICAgIDAxOiBFbWl0IHdvcmQgMSBpbiB0YWJsZS4KLSAgICAgKiAgICAgIC4KLSAgICAgKiAgICAgIEZEOiBFbWl0IHdvcmQgMjUzIGluIHRhYmxlLgotICAgICAqCi0gICAgICogICAgTXVsdGktQnl0ZSBDb2RlOgotICAgICAqICAgICAgRkUgV1cgV1c6ICgzIGJ5dGUgY29kZSkgV29yZCB0byBlbWl0IGlzIHRoZSBuZXh0IHdvcmQgV1cgV1cuCi0gICAgICogICAgICBGRiBCQiBXVyBXVzogKDQgYnl0ZSBjb2RlKSBFbWl0IEJCIGNvdW50IHRpbWVzIG5leHQgd29yZCBXVyBXVy4KLSAgICAgKi8KLSAgICB3b3JkID0gMDsKLSAgICBmb3IgKGkgPSAyNTMgKiAyOyBpIDwgX2Fkdl9hc2MzOEMwODAwX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChfYWR2X2FzYzM4QzA4MDBfYnVmW2ldID09IDB4ZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaSArIDNdIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZltpICsgMl0pKTsKLSAgICAgICAgICAgICAgICB3b3JkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpICs9IDM7Ci0gICAgICAgIH0gZWxzZSBpZiAoX2Fkdl9hc2MzOEMwODAwX2J1ZltpXSA9PSAweGZlKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQotICAgICAgICAgICAgICAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaSArIDJdIDw8IDgpIHwKLSAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXSkpOwotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgd29yZCsrOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKLSAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzA4MDBfYnVmWyhfYWR2X2FzYzM4QzA4MDBfYnVmW2ldICogMikgKyAxXSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZltfYWR2X2FzYzM4QzA4MDBfYnVmW2ldICogMl0pKTsKLSAgICAgICAgICAgIHdvcmQrKzsKLSAgICAgICAgfQotICAgIH0KKwkvKiBBc3N1bWUgdGhlIGZvbGxvd2luZyBjb21wcmVzc2VkIGZvcm1hdCBvZiB0aGUgbWljcm9jb2RlIGJ1ZmZlcjoKKwkgKgorCSAqICAyNTQgd29yZCAoNTA4IGJ5dGUpIHRhYmxlIGluZGV4ZWQgYnkgYnl0ZSBjb2RlIGZvbGxvd2VkCisJICogIGJ5IHRoZSBmb2xsb3dpbmcgYnl0ZSBjb2RlczoKKwkgKgorCSAqICAgIDEtQnl0ZSBDb2RlOgorCSAqICAgICAgMDA6IEVtaXQgd29yZCAwIGluIHRhYmxlLgorCSAqICAgICAgMDE6IEVtaXQgd29yZCAxIGluIHRhYmxlLgorCSAqICAgICAgLgorCSAqICAgICAgRkQ6IEVtaXQgd29yZCAyNTMgaW4gdGFibGUuCisJICoKKwkgKiAgICBNdWx0aS1CeXRlIENvZGU6CisJICogICAgICBGRSBXVyBXVzogKDMgYnl0ZSBjb2RlKSBXb3JkIHRvIGVtaXQgaXMgdGhlIG5leHQgd29yZCBXVyBXVy4KKwkgKiAgICAgIEZGIEJCIFdXIFdXOiAoNCBieXRlIGNvZGUpIEVtaXQgQkIgY291bnQgdGltZXMgbmV4dCB3b3JkIFdXIFdXLgorCSAqLworCXdvcmQgPSAwOworCWZvciAoaSA9IDI1MyAqIDI7IGkgPCBfYWR2X2FzYzM4QzA4MDBfc2l6ZTsgaSsrKSB7CisJCWlmIChfYWR2X2FzYzM4QzA4MDBfYnVmW2ldID09IDB4ZmYpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBfYWR2X2FzYzM4QzA4MDBfYnVmW2kgKyAxXTsgaisrKSB7CisJCQkJQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKwkJCQkJCQkJICAgIF9hZHZfYXNjMzhDMDgwMF9idWYKKwkJCQkJCQkJICAgIFtpICsKKwkJCQkJCQkJICAgICAzXSA8PCA4KSB8CisJCQkJCQkJCSAgIF9hZHZfYXNjMzhDMDgwMF9idWYKKwkJCQkJCQkJICAgW2kgKyAyXSkpOworCQkJCXdvcmQrKzsKKwkJCX0KKwkJCWkgKz0gMzsKKwkJfSBlbHNlIGlmIChfYWR2X2FzYzM4QzA4MDBfYnVmW2ldID09IDB4ZmUpIHsKKwkJCUFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisJCQkJCQkJICAgIF9hZHZfYXNjMzhDMDgwMF9idWYKKwkJCQkJCQkgICAgW2kgKworCQkJCQkJCSAgICAgMl0gPDwgOCkgfAorCQkJCQkJCSAgIF9hZHZfYXNjMzhDMDgwMF9idWZbaQorCQkJCQkJCQkJICAgICAgICsKKwkJCQkJCQkJCSAgICAgICAxXSkpOworCQkJaSArPSAyOworCQkJd29yZCsrOworCQl9IGVsc2UgeworCQkJQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKKwkJCQkJCQkgICAgX2Fkdl9hc2MzOEMwODAwX2J1ZlsoX2Fkdl9hc2MzOEMwODAwX2J1ZltpXSAqIDIpICsgMV0gPDwgOCkgfCBfYWR2X2FzYzM4QzA4MDBfYnVmW19hZHZfYXNjMzhDMDgwMF9idWZbaV0gKiAyXSkpOworCQkJd29yZCsrOworCQl9CisJfQogCi0gICAgLyoKLSAgICAgKiBTZXQgJ3dvcmQnIGZvciBsYXRlciB1c2UgdG8gY2xlYXIgdGhlIHJlc3Qgb2YgbWVtb3J5IGFuZCBzYXZlCi0gICAgICogdGhlIGV4cGFuZGVkIG1jb2RlIHNpemUuCi0gICAgICovCi0gICAgd29yZCAqPSAyOwotICAgIGFkdl9hc2MzOEMwODAwX2V4cGFuZGVkX3NpemUgPSB3b3JkOworCS8qCisJICogU2V0ICd3b3JkJyBmb3IgbGF0ZXIgdXNlIHRvIGNsZWFyIHRoZSByZXN0IG9mIG1lbW9yeSBhbmQgc2F2ZQorCSAqIHRoZSBleHBhbmRlZCBtY29kZSBzaXplLgorCSAqLworCXdvcmQgKj0gMjsKKwlhZHZfYXNjMzhDMDgwMF9leHBhbmRlZF9zaXplID0gd29yZDsKIAotICAgIC8qCi0gICAgICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM4QzA4MDAgSW50ZXJuYWwgUkFNICgxNktCKS4KLSAgICAgKi8KLSAgICBmb3IgKDsgd29yZCA8IEFEVl8zOEMwODAwX01FTVNJWkU7IHdvcmQgKz0gMikKLSAgICB7Ci0gICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKLSAgICB9CisJLyoKKwkgKiBDbGVhciB0aGUgcmVzdCBvZiBBU0MtMzhDMDgwMCBJbnRlcm5hbCBSQU0gKDE2S0IpLgorCSAqLworCWZvciAoOyB3b3JkIDwgQURWXzM4QzA4MDBfTUVNU0laRTsgd29yZCArPSAyKSB7CisJCUFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAwKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgotICAgICAqLwotICAgIHN1bSA9IDA7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCS8qCisJICogVmVyaWZ5IHRoZSBtaWNyb2NvZGUgY2hlY2tzdW0uCisJICovCisJc3VtID0gMDsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgMCk7CiAKLSAgICBmb3IgKHdvcmQgPSAwOyB3b3JkIDwgYWR2X2FzYzM4QzA4MDBfZXhwYW5kZWRfc2l6ZTsgd29yZCArPSAyKQotICAgIHsKLSAgICAgICAgc3VtICs9IEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpOwotICAgIH0KLSAgICBBU0NfREJHMigxLCAiQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXI6IHdvcmQgJWQsIGkgJWRcbiIsIHdvcmQsIGkpOworCWZvciAod29yZCA9IDA7IHdvcmQgPCBhZHZfYXNjMzhDMDgwMF9leHBhbmRlZF9zaXplOyB3b3JkICs9IDIpIHsKKwkJc3VtICs9IEFkdlJlYWRXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UpOworCX0KKwlBU0NfREJHMigxLCAiQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXI6IHdvcmQgJWQsIGkgJWRcbiIsIHdvcmQsIGkpOwogCi0gICAgQVNDX0RCRzIoMSwKLSAgICAgICAgIkFkdkluaXRBc2MzOEMwODAwRHJpdmVyOiBzdW0gMHglbHgsIF9hZHZfYXNjMzhDMDgwMF9jaGtzdW0gMHglbHhcbiIsCi0gICAgICAgICh1bG9uZykgc3VtLCAodWxvbmcpIF9hZHZfYXNjMzhDMDgwMF9jaGtzdW0pOworCUFTQ19EQkcyKDEsCisJCSAiQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXI6IHN1bSAweCVseCwgX2Fkdl9hc2MzOEMwODAwX2Noa3N1bSAweCVseFxuIiwKKwkJICh1bG9uZylzdW0sICh1bG9uZylfYWR2X2FzYzM4QzA4MDBfY2hrc3VtKTsKIAotICAgIGlmIChzdW0gIT0gX2Fkdl9hc2MzOEMwODAwX2Noa3N1bSkKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX01DT0RFX0NIS1NVTTsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJaWYgKHN1bSAhPSBfYWR2X2FzYzM4QzA4MDBfY2hrc3VtKSB7CisJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX01DT0RFX0NIS1NVTTsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CiAKLSAgICAvKgotICAgICAqIFJlc3RvcmUgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTi8yOyBpKyspCi0gICAgewotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU01FTSArICgyICogaSksIGJpb3NfbWVtW2ldKTsKLSAgICB9CisJLyoKKwkgKiBSZXN0b3JlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4gLyAyOyBpKyspIHsKKwkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLAorCQkJCSBiaW9zX21lbVtpXSk7CisJfQogCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBtaWNyb2NvZGUgY29kZSBjaGVja3N1bSB0byB0aGUgbWljcm9jb2RlCi0gICAgICogY29kZSBjaGVja3N1bSBsb2NhdGlvbiBBU0NfTUNfQ09ERV9DSEtfU1VNICgweDJDKS4KLSAgICAgKi8KLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIGJlZ2luX2FkZHIpOwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfRU5EX0FERFIsIGVuZF9hZGRyKTsKLSAgICBjb2RlX3N1bSA9IDA7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIGJlZ2luX2FkZHIpOwotICAgIGZvciAod29yZCA9IGJlZ2luX2FkZHI7IHdvcmQgPCBlbmRfYWRkcjsgd29yZCArPSAyKQotICAgIHsKLSAgICAgICAgY29kZV9zdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7Ci0gICAgfQotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0NIS19TVU0sIGNvZGVfc3VtKTsKKwkvKgorCSAqIENhbGN1bGF0ZSBhbmQgd3JpdGUgdGhlIG1pY3JvY29kZSBjb2RlIGNoZWNrc3VtIHRvIHRoZSBtaWNyb2NvZGUKKwkgKiBjb2RlIGNoZWNrc3VtIGxvY2F0aW9uIEFTQ19NQ19DT0RFX0NIS19TVU0gKDB4MkMpLgorCSAqLworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgYmVnaW5fYWRkcik7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9FTkRfQUREUiwgZW5kX2FkZHIpOworCWNvZGVfc3VtID0gMDsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgYmVnaW5fYWRkcik7CisJZm9yICh3b3JkID0gYmVnaW5fYWRkcjsgd29yZCA8IGVuZF9hZGRyOyB3b3JkICs9IDIpIHsKKwkJY29kZV9zdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7CisJfQorCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0NIS19TVU0sIGNvZGVfc3VtKTsKIAotICAgIC8qCi0gICAgICogUmVhZCBtaWNyb2NvZGUgdmVyc2lvbiBhbmQgZGF0ZS4KLSAgICAgKi8KLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX0RBVEUsIGFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSk7Ci0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9OVU0sIGFzY19kdmMtPmNmZy0+bWNvZGVfdmVyc2lvbik7CisJLyoKKwkgKiBSZWFkIG1pY3JvY29kZSB2ZXJzaW9uIGFuZCBkYXRlLgorCSAqLworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1ZFUlNJT05fREFURSwKKwkJCWFzY19kdmMtPmNmZy0+bWNvZGVfZGF0ZSk7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9OVU0sCisJCQlhc2NfZHZjLT5jZmctPm1jb2RlX3ZlcnNpb24pOwogCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGNoaXAgdHlwZSB0byBpbmRpY2F0ZSB0aGUgQVNDMzhDMDgwMC4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ0hJUF9UWVBFLCBBRFZfQ0hJUF9BU0MzOEMwODAwKTsKKwkvKgorCSAqIFNldCB0aGUgY2hpcCB0eXBlIHRvIGluZGljYXRlIHRoZSBBU0MzOEMwODAwLgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DSElQX1RZUEUsIEFEVl9DSElQX0FTQzM4QzA4MDApOwogCi0gICAgLyoKLSAgICAgKiBXcml0ZSAxIHRvIGJpdCAxNCAnRElTX1RFUk1fRFJWJyBpbiB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyLgotICAgICAqIFdoZW4gRElTX1RFUk1fRFJWIHNldCB0byAxLCBDX0RFVFszOjBdIHdpbGwgcmVmbGVjdCBjdXJyZW50Ci0gICAgICogY2FibGUgZGV0ZWN0aW9uIGFuZCB0aGVuIHdlIGFyZSBhYmxlIHRvIHJlYWQgQ19ERVRbMzowXS4KLSAgICAgKgotICAgICAqIE5vdGU6IFdlIHdpbGwgcmVzZXQgRElTX1RFUk1fRFJWIHRvIDAgaW4gdGhlICdTZXQgU0NTSV9DRkcxCi0gICAgICogTWljcm9jb2RlIERlZmF1bHQgVmFsdWUnIHNlY3Rpb24gYmVsb3cuCi0gICAgICovCi0gICAgc2NzaV9jZmcxID0gQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEpOwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxIHwgRElTX1RFUk1fRFJWKTsKKwkvKgorCSAqIFdyaXRlIDEgdG8gYml0IDE0ICdESVNfVEVSTV9EUlYnIGluIHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIuCisJICogV2hlbiBESVNfVEVSTV9EUlYgc2V0IHRvIDEsIENfREVUWzM6MF0gd2lsbCByZWZsZWN0IGN1cnJlbnQKKwkgKiBjYWJsZSBkZXRlY3Rpb24gYW5kIHRoZW4gd2UgYXJlIGFibGUgdG8gcmVhZCBDX0RFVFszOjBdLgorCSAqCisJICogTm90ZTogV2Ugd2lsbCByZXNldCBESVNfVEVSTV9EUlYgdG8gMCBpbiB0aGUgJ1NldCBTQ1NJX0NGRzEKKwkgKiBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZScgc2VjdGlvbiBiZWxvdy4KKwkgKi8KKwlzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxLAorCQkJICAgICBzY3NpX2NmZzEgfCBESVNfVEVSTV9EUlYpOwogCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgUENJIENvbmZpZ3VyYXRpb24gQ29tbWFuZCBSZWdpc3RlciAiUGFyaXR5IEVycm9yIFJlc3BvbnNlCi0gICAgICogQ29udHJvbCIgQml0IHdhcyBjbGVhciAoMCksIHRoZW4gc2V0IHRoZSBtaWNyb2NvZGUgdmFyaWFibGUKLSAgICAgKiAnY29udHJvbF9mbGFnJyBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIgZmxhZyB0byB0ZWxsIHRoZSBtaWNyb2NvZGUKLSAgICAgKiB0byBpZ25vcmUgRE1BIHBhcml0eSBlcnJvcnMuCi0gICAgICovCi0gICAgaWYgKGFzY19kdmMtPmNmZy0+Y29udHJvbF9mbGFnICYgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSKQotICAgIHsKLSAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKLSAgICAgICAgd29yZCB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7Ci0gICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOwotICAgIH0KKwkvKgorCSAqIElmIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBDb21tYW5kIFJlZ2lzdGVyICJQYXJpdHkgRXJyb3IgUmVzcG9uc2UKKwkgKiBDb250cm9sIiBCaXQgd2FzIGNsZWFyICgwKSwgdGhlbiBzZXQgdGhlIG1pY3JvY29kZSB2YXJpYWJsZQorCSAqICdjb250cm9sX2ZsYWcnIENPTlRST0xfRkxBR19JR05PUkVfUEVSUiBmbGFnIHRvIHRlbGwgdGhlIG1pY3JvY29kZQorCSAqIHRvIGlnbm9yZSBETUEgcGFyaXR5IGVycm9ycy4KKwkgKi8KKwlpZiAoYXNjX2R2Yy0+Y2ZnLT5jb250cm9sX2ZsYWcgJiBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIpIHsKKwkJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKKwkJd29yZCB8PSBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlI7CisJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworCX0KIAotICAgIC8qCi0gICAgICogRm9yIEFTQy0zOEMwODAwLCBzZXQgRklGT19USFJFU0hfODBCIFs2OjRdIGJpdHMgYW5kIFNUQVJUX0NUTF9USCBbMzoyXQotICAgICAqIGJpdHMgZm9yIHRoZSBkZWZhdWx0IEZJRk8gdGhyZXNob2xkLgotICAgICAqCi0gICAgICogTm90ZTogQVNDLTM4QzA4MDAgRklGTyB0aHJlc2hvbGQgaGFzIGJlZW4gY2hhbmdlZCB0byAyNTYgYnl0ZXMuCi0gICAgICoKLSAgICAgKiBGb3IgRE1BIEVycmF0YSAjNCBzZXQgdGhlIEJDX1RIUkVTSF9FTkIgYml0LgotICAgICAqLwotICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0RNQV9DRkcwLAotICAgICAgICBCQ19USFJFU0hfRU5CIHwgRklGT19USFJFU0hfODBCIHwgU1RBUlRfQ1RMX1RIIHwgUkVBRF9DTURfTVJNKTsKKwkvKgorCSAqIEZvciBBU0MtMzhDMDgwMCwgc2V0IEZJRk9fVEhSRVNIXzgwQiBbNjo0XSBiaXRzIGFuZCBTVEFSVF9DVExfVEggWzM6Ml0KKwkgKiBiaXRzIGZvciB0aGUgZGVmYXVsdCBGSUZPIHRocmVzaG9sZC4KKwkgKgorCSAqIE5vdGU6IEFTQy0zOEMwODAwIEZJRk8gdGhyZXNob2xkIGhhcyBiZWVuIGNoYW5nZWQgdG8gMjU2IGJ5dGVzLgorCSAqCisJICogRm9yIERNQSBFcnJhdGEgIzQgc2V0IHRoZSBCQ19USFJFU0hfRU5CIGJpdC4KKwkgKi8KKwlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9ETUFfQ0ZHMCwKKwkJCSAgICAgQkNfVEhSRVNIX0VOQiB8IEZJRk9fVEhSRVNIXzgwQiB8IFNUQVJUX0NUTF9USCB8CisJCQkgICAgIFJFQURfQ01EX01STSk7CiAKLSAgICAvKgotICAgICAqIE1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBXRFRSLCBTRFRSLCBhbmQgY29tbWFuZCB0YWcKLSAgICAgKiBxdWV1aW5nIHdpbGwgYmUgc2V0IGluIEFkdklucXVpcnlIYW5kbGluZygpIGJhc2VkIG9uIHdoYXQgYQotICAgICAqIGRldmljZSByZXBvcnRzIGl0IGlzIGNhcGFibGUgb2YgaW4gSW5xdWlyeSBieXRlIDcuCi0gICAgICoKLSAgICAgKiBJZiBTQ1NJIEJ1cyBSZXNldHMgaGF2ZSBiZWVuIGRpc2FibGVkLCB0aGVuIGRpcmVjdGx5IHNldAotICAgICAqIFNEVFIgYW5kIFdEVFIgZnJvbSB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBhbGxvdwotICAgICAqIHRoZSBCSU9TIGFuZCB3YXJtIGJvb3QgdG8gd29yayB3aXRob3V0IGEgU0NTSSBidXMgaGFuZyBvbgotICAgICAqIHRoZSBJbnF1aXJ5IGNhdXNlZCBieSBob3N0IGFuZCB0YXJnZXQgbWlzbWF0Y2hlZCBEVFIgdmFsdWVzLgotICAgICAqIFdpdGhvdXQgdGhlIFNDU0kgQnVzIFJlc2V0LCBiZWZvcmUgYW4gSW5xdWlyeSBhIGRldmljZSBjYW4ndAotICAgICAqIGJlIGFzc3VtZWQgdG8gYmUgaW4gQXN5bmNocm9ub3VzLCBOYXJyb3cgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykgPT0gMCkKLSAgICB7Ci0gICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGFzY19kdmMtPndkdHJfYWJsZSk7Ci0gICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIGFzY19kdmMtPnNkdHJfYWJsZSk7Ci0gICAgfQorCS8qCisJICogTWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIFdEVFIsIFNEVFIsIGFuZCBjb21tYW5kIHRhZworCSAqIHF1ZXVpbmcgd2lsbCBiZSBzZXQgaW4gQWR2SW5xdWlyeUhhbmRsaW5nKCkgYmFzZWQgb24gd2hhdCBhCisJICogZGV2aWNlIHJlcG9ydHMgaXQgaXMgY2FwYWJsZSBvZiBpbiBJbnF1aXJ5IGJ5dGUgNy4KKwkgKgorCSAqIElmIFNDU0kgQnVzIFJlc2V0cyBoYXZlIGJlZW4gZGlzYWJsZWQsIHRoZW4gZGlyZWN0bHkgc2V0CisJICogU0RUUiBhbmQgV0RUUiBmcm9tIHRoZSBFRVBST00gY29uZmlndXJhdGlvbi4gVGhpcyB3aWxsIGFsbG93CisJICogdGhlIEJJT1MgYW5kIHdhcm0gYm9vdCB0byB3b3JrIHdpdGhvdXQgYSBTQ1NJIGJ1cyBoYW5nIG9uCisJICogdGhlIElucXVpcnkgY2F1c2VkIGJ5IGhvc3QgYW5kIHRhcmdldCBtaXNtYXRjaGVkIERUUiB2YWx1ZXMuCisJICogV2l0aG91dCB0aGUgU0NTSSBCdXMgUmVzZXQsIGJlZm9yZSBhbiBJbnF1aXJ5IGEgZGV2aWNlIGNhbid0CisJICogYmUgYXNzdW1lZCB0byBiZSBpbiBBc3luY2hyb25vdXMsIE5hcnJvdyBtb2RlLgorCSAqLworCWlmICgoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKSA9PSAwKSB7CisJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsCisJCQkJIGFzY19kdmMtPndkdHJfYWJsZSk7CisJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsCisJCQkJIGFzY19kdmMtPnNkdHJfYWJsZSk7CisJfQogCi0gICAgLyoKLSAgICAgKiBTZXQgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIERJU0MgYW5kIFNEVFJfU1BFRUQxLAotICAgICAqIFNEVFJfU1BFRUQyLCBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IGJhc2VkIG9uIHRoZSBFRVBST00KLSAgICAgKiBjb25maWd1cmF0aW9uIHZhbHVlcy4KLSAgICAgKgotICAgICAqIFRoZSBTRFRSIHBlciBUSUQgYml0bWFzayBvdmVycmlkZXMgdGhlIFNEVFJfU1BFRUQxLCBTRFRSX1NQRUVEMiwKLSAgICAgKiBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IHZhbHVlcyBzbyBpdCBpcyBzYWZlIHRvIHNldCB0aGVtCi0gICAgICogd2l0aG91dCBkZXRlcm1pbmluZyBoZXJlIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBTRFRSLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ESVNDX0VOQUJMRSwgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQxLCBhc2NfZHZjLT5zZHRyX3NwZWVkMSk7Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQyLCBhc2NfZHZjLT5zZHRyX3NwZWVkMik7Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQzLCBhc2NfZHZjLT5zZHRyX3NwZWVkMyk7Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQ0LCBhc2NfZHZjLT5zZHRyX3NwZWVkNCk7CisJLyoKKwkgKiBTZXQgbWljcm9jb2RlIG9wZXJhdGluZyB2YXJpYWJsZXMgZm9yIERJU0MgYW5kIFNEVFJfU1BFRUQxLAorCSAqIFNEVFJfU1BFRUQyLCBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IGJhc2VkIG9uIHRoZSBFRVBST00KKwkgKiBjb25maWd1cmF0aW9uIHZhbHVlcy4KKwkgKgorCSAqIFRoZSBTRFRSIHBlciBUSUQgYml0bWFzayBvdmVycmlkZXMgdGhlIFNEVFJfU1BFRUQxLCBTRFRSX1NQRUVEMiwKKwkgKiBTRFRSX1NQRUVEMywgYW5kIFNEVFJfU1BFRUQ0IHZhbHVlcyBzbyBpdCBpcyBzYWZlIHRvIHNldCB0aGVtCisJICogd2l0aG91dCBkZXRlcm1pbmluZyBoZXJlIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBTRFRSLgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ESVNDX0VOQUJMRSwKKwkJCSBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlKTsKKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDEsIGFzY19kdmMtPnNkdHJfc3BlZWQxKTsKKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDIsIGFzY19kdmMtPnNkdHJfc3BlZWQyKTsKKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDMsIGFzY19kdmMtPnNkdHJfc3BlZWQzKTsKKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9TUEVFRDQsIGFzY19kdmMtPnNkdHJfc3BlZWQ0KTsKIAotICAgIC8qCi0gICAgICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KLSAgICAgKgotICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCi0gICAgICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCi0gICAgICAgIFBBUklUWV9FTiB8IFFVRVVFXzEyOCB8IFNFTF9UTU9fTE9ORyB8IE9VUl9JRF9FTiB8Ci0gICAgICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CisJLyoKKwkgKiBTZXQgU0NTSV9DRkcwIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcwIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKwkgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMCwKKwkJCSBQQVJJVFlfRU4gfCBRVUVVRV8xMjggfCBTRUxfVE1PX0xPTkcgfCBPVVJfSURfRU4gfAorCQkJIGFzY19kdmMtPmNoaXBfc2NzaV9pZCk7CiAKLSAgICAvKgotICAgICAqIERldGVybWluZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCi0gICAgICoKLSAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCisJLyoKKwkgKiBEZXRlcm1pbmUgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKwkgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorCSAqLwogCi0gICAgLyogUmVhZCBjdXJyZW50IFNDU0lfQ0ZHMSBSZWdpc3RlciB2YWx1ZS4gKi8KLSAgICBzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CisJLyogUmVhZCBjdXJyZW50IFNDU0lfQ0ZHMSBSZWdpc3RlciB2YWx1ZS4gKi8KKwlzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7CiAKLSAgICAvKgotICAgICAqIElmIHRoZSBpbnRlcm5hbCBuYXJyb3cgY2FibGUgaXMgcmV2ZXJzZWQgYWxsIG9mIHRoZSBTQ1NJX0NUUkwKLSAgICAgKiByZWdpc3RlciBzaWduYWxzIHdpbGwgYmUgc2V0LiBDaGVjayBmb3IgYW5kIHJldHVybiBhbiBlcnJvciBpZgotICAgICAqIHRoaXMgY29uZGl0aW9uIGlzIGZvdW5kLgotICAgICAqLwotICAgIGlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NUUkwpICYgMHgzRjA3KSA9PSAweDNGMDcpCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9SRVZFUlNFRF9DQUJMRTsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgaW50ZXJuYWwgbmFycm93IGNhYmxlIGlzIHJldmVyc2VkIGFsbCBvZiB0aGUgU0NTSV9DVFJMCisJICogcmVnaXN0ZXIgc2lnbmFscyB3aWxsIGJlIHNldC4gQ2hlY2sgZm9yIGFuZCByZXR1cm4gYW4gZXJyb3IgaWYKKwkgKiB0aGlzIGNvbmRpdGlvbiBpcyBmb3VuZC4KKwkgKi8KKwlpZiAoKEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DVFJMKSAmIDB4M0YwNykgPT0gMHgzRjA3KSB7CisJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX1JFVkVSU0VEX0NBQkxFOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KIAotICAgIC8qCi0gICAgICogQWxsIGtpbmQgb2YgY29tYmluYXRpb25zIG9mIGRldmljZXMgYXR0YWNoZWQgdG8gb25lIG9mIGZvdXIgY29ubmVjdG9ycwotICAgICAqIGFyZSBhY2NlcHRhYmxlIGV4Y2VwdCBIVkQgZGV2aWNlIGF0dGFjaGVkLiBGb3IgZXhhbXBsZSwgTFZEIGRldmljZSBjYW4KLSAgICAgKiBiZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3Igd2hpbGUgU0UgZGV2aWNlIGF0dGFjaGVkIHRvIExWRCBjb25uZWN0b3IuCi0gICAgICogSWYgTFZEIGRldmljZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3IsIGl0IG9ubHkgcnVucyB1cCB0byBVbHRyYSBzcGVlZC4KLSAgICAgKgotICAgICAqIElmIGFuIEhWRCBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gb25lIG9mIExWRCBjb25uZWN0b3JzLCByZXR1cm4gYW4gZXJyb3IuCi0gICAgICogSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBIVkQgZGV2aWNlIGF0dGFjaGVkIHRvIFNFIGNvbm5lY3RvcnMuCi0gICAgICovCi0gICAgaWYgKHNjc2lfY2ZnMSAmIEhWRCkKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0hWRF9ERVZJQ0U7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCS8qCisJICogQWxsIGtpbmQgb2YgY29tYmluYXRpb25zIG9mIGRldmljZXMgYXR0YWNoZWQgdG8gb25lIG9mIGZvdXIgY29ubmVjdG9ycworCSAqIGFyZSBhY2NlcHRhYmxlIGV4Y2VwdCBIVkQgZGV2aWNlIGF0dGFjaGVkLiBGb3IgZXhhbXBsZSwgTFZEIGRldmljZSBjYW4KKwkgKiBiZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3Igd2hpbGUgU0UgZGV2aWNlIGF0dGFjaGVkIHRvIExWRCBjb25uZWN0b3IuCisJICogSWYgTFZEIGRldmljZSBhdHRhY2hlZCB0byBTRSBjb25uZWN0b3IsIGl0IG9ubHkgcnVucyB1cCB0byBVbHRyYSBzcGVlZC4KKwkgKgorCSAqIElmIGFuIEhWRCBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gb25lIG9mIExWRCBjb25uZWN0b3JzLCByZXR1cm4gYW4gZXJyb3IuCisJICogSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBIVkQgZGV2aWNlIGF0dGFjaGVkIHRvIFNFIGNvbm5lY3RvcnMuCisJICovCisJaWYgKHNjc2lfY2ZnMSAmIEhWRCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9IVkRfREVWSUNFOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KIAotICAgIC8qCi0gICAgICogSWYgZWl0aGVyIFNFIG9yIExWRCBhdXRvbWF0aWMgdGVybWluYXRpb24gY29udHJvbCBpcyBlbmFibGVkLCB0aGVuCi0gICAgICogc2V0IHRoZSB0ZXJtaW5hdGlvbiB2YWx1ZSBiYXNlZCBvbiBhIHRhYmxlIGxpc3RlZCBpbiBhX2NvbmRvci5oLgotICAgICAqCi0gICAgICogSWYgbWFudWFsIHRlcm1pbmF0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBFRVBST00gc2V0dGluZyB0aGVuCi0gICAgICogJ3Rlcm1pbmF0aW9uJyB3YXMgc2V0LXVwIGluIEFkdkluaXRGcm9tMzhDMDgwMEVFUFJPTSgpIGFuZCBpcyByZWFkeSB0bwotICAgICAqIGJlICdvcmVkJyBpbnRvIFNDU0lfQ0ZHMS4KLSAgICAgKi8KLSAgICBpZiAoKGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gJiBURVJNX1NFKSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogU0UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZC4gKi8KLSAgICAgICAgc3dpdGNoKHNjc2lfY2ZnMSAmIENfREVUX1NFKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBURVJNX1NFX0hJOiBvbiwgVEVSTV9TRV9MTzogb24gKi8KLSAgICAgICAgICAgIGNhc2UgMHgxOiBjYXNlIDB4MjogY2FzZSAweDM6Ci0gICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX1NFOwotICAgICAgICAgICAgICAgIGJyZWFrOworCS8qCisJICogSWYgZWl0aGVyIFNFIG9yIExWRCBhdXRvbWF0aWMgdGVybWluYXRpb24gY29udHJvbCBpcyBlbmFibGVkLCB0aGVuCisJICogc2V0IHRoZSB0ZXJtaW5hdGlvbiB2YWx1ZSBiYXNlZCBvbiBhIHRhYmxlIGxpc3RlZCBpbiBhX2NvbmRvci5oLgorCSAqCisJICogSWYgbWFudWFsIHRlcm1pbmF0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBFRVBST00gc2V0dGluZyB0aGVuCisJICogJ3Rlcm1pbmF0aW9uJyB3YXMgc2V0LXVwIGluIEFkdkluaXRGcm9tMzhDMDgwMEVFUFJPTSgpIGFuZCBpcyByZWFkeSB0bworCSAqIGJlICdvcmVkJyBpbnRvIFNDU0lfQ0ZHMS4KKwkgKi8KKwlpZiAoKGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gJiBURVJNX1NFKSA9PSAwKSB7CisJCS8qIFNFIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCisJCXN3aXRjaCAoc2NzaV9jZmcxICYgQ19ERVRfU0UpIHsKKwkJCS8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvbiAqLworCQljYXNlIDB4MToKKwkJY2FzZSAweDI6CisJCWNhc2UgMHgzOgorCQkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX1NFOworCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIC8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KLSAgICAgICAgICAgIGNhc2UgMHgwOgotICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRV9ISTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKwkJCS8qIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KKwkJY2FzZSAweDA6CisJCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IFRFUk1fU0VfSEk7CisJCQlicmVhazsKKwkJfQorCX0KIAotICAgIGlmICgoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fTFZEKSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogTFZEIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCi0gICAgICAgIHN3aXRjaChzY3NpX2NmZzEgJiBDX0RFVF9MVkQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRFUk1fTFZEX0hJOiBvbiwgVEVSTV9MVkRfTE86IG9uICovCi0gICAgICAgICAgICBjYXNlIDB4NDogY2FzZSAweDg6IGNhc2UgMHhDOgotICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9MVkQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJaWYgKChhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9MVkQpID09IDApIHsKKwkJLyogTFZEIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCisJCXN3aXRjaCAoc2NzaV9jZmcxICYgQ19ERVRfTFZEKSB7CisJCQkvKiBURVJNX0xWRF9ISTogb24sIFRFUk1fTFZEX0xPOiBvbiAqLworCQljYXNlIDB4NDoKKwkJY2FzZSAweDg6CisJCWNhc2UgMHhDOgorCQkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX0xWRDsKKwkJCWJyZWFrOwogCi0gICAgICAgICAgICAvKiBURVJNX0xWRF9ISTogb2ZmLCBURVJNX0xWRF9MTzogb2ZmICovCi0gICAgICAgICAgICBjYXNlIDB4MDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKwkJCS8qIFRFUk1fTFZEX0hJOiBvZmYsIFRFUk1fTFZEX0xPOiBvZmYgKi8KKwkJY2FzZSAweDA6CisJCQlicmVhazsKKwkJfQorCX0KIAotICAgIC8qCi0gICAgICogQ2xlYXIgYW55IHNldCBURVJNX1NFIGFuZCBURVJNX0xWRCBiaXRzLgotICAgICAqLwotICAgIHNjc2lfY2ZnMSAmPSAoflRFUk1fU0UgJiB+VEVSTV9MVkQpOworCS8qCisJICogQ2xlYXIgYW55IHNldCBURVJNX1NFIGFuZCBURVJNX0xWRCBiaXRzLgorCSAqLworCXNjc2lfY2ZnMSAmPSAoflRFUk1fU0UgJiB+VEVSTV9MVkQpOwogCi0gICAgLyoKLSAgICAgKiBJbnZlcnQgdGhlIFRFUk1fU0UgYW5kIFRFUk1fTFZEIGJpdHMgYW5kIHRoZW4gc2V0ICdzY3NpX2NmZzEnLgotICAgICAqLwotICAgIHNjc2lfY2ZnMSB8PSAofmFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gJiAweEYwKTsKKwkvKgorCSAqIEludmVydCB0aGUgVEVSTV9TRSBhbmQgVEVSTV9MVkQgYml0cyBhbmQgdGhlbiBzZXQgJ3Njc2lfY2ZnMScuCisJICovCisJc2NzaV9jZmcxIHw9ICh+YXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIDB4RjApOwogCi0gICAgLyoKLSAgICAgKiBDbGVhciBCSUdfRU5ESUFOLCBESVNfVEVSTV9EUlYsIFRlcm1pbmF0b3IgUG9sYXJpdHkgYW5kIEhWRC9MVkQvU0UgYml0cwotICAgICAqIGFuZCBzZXQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbCBiaXRzIGluIHRoZSBNaWNyb2NvZGUKLSAgICAgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCi0gICAgICovCi0gICAgc2NzaV9jZmcxICY9ICh+QklHX0VORElBTiAmIH5ESVNfVEVSTV9EUlYgJiB+VEVSTV9QT0wgJiB+SFZEX0xWRF9TRSk7CisJLyoKKwkgKiBDbGVhciBCSUdfRU5ESUFOLCBESVNfVEVSTV9EUlYsIFRlcm1pbmF0b3IgUG9sYXJpdHkgYW5kIEhWRC9MVkQvU0UgYml0cworCSAqIGFuZCBzZXQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbCBiaXRzIGluIHRoZSBNaWNyb2NvZGUKKwkgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCisJICovCisJc2NzaV9jZmcxICY9ICh+QklHX0VORElBTiAmIH5ESVNfVEVSTV9EUlYgJiB+VEVSTV9QT0wgJiB+SFZEX0xWRF9TRSk7CiAKLSAgICAvKgotICAgICAqIFNldCBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKLSAgICAgKgotICAgICAqIFNldCBwb3NzaWJseSBtb2RpZmllZCB0ZXJtaW5hdGlvbiBjb250cm9sIGFuZCByZXNldCBESVNfVEVSTV9EUlYKLSAgICAgKiBiaXRzIGluIHRoZSBNaWNyb2NvZGUgU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgotICAgICAqCi0gICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKLSAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgotICAgICAqLwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKKwkvKgorCSAqIFNldCBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKwkgKgorCSAqIFNldCBwb3NzaWJseSBtb2RpZmllZCB0ZXJtaW5hdGlvbiBjb250cm9sIGFuZCByZXNldCBESVNfVEVSTV9EUlYKKwkgKiBiaXRzIGluIHRoZSBNaWNyb2NvZGUgU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKwkgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKIAotICAgIC8qCi0gICAgICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKLSAgICAgKgotICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICoKLSAgICAgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKLSAgICAgKiBhcmUgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEFTQy0zOEMwODAwIGhhcyAxNktCIGludGVybmFsIG1lbW9yeS4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAotICAgICAgICBCSU9TX0VOIHwgUkFNX1NaXzE2S0IpOworCS8qCisJICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKKwkgKgorCSAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorCSAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisJICoKKwkgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKKwkgKiBhcmUgZGVmaW5lZC4KKwkgKgorCSAqIEFTQy0zOEMwODAwIGhhcyAxNktCIGludGVybmFsIG1lbW9yeS4KKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAorCQkJIEJJT1NfRU4gfCBSQU1fU1pfMTZLQik7CiAKLSAgICAvKgotICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQotICAgICAqCi0gICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCi0gICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKwkvKgorCSAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorCSAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisJCQkgQURWX1RJRF9UT19USURNQVNLKGFzY19kdmMtPmNoaXBfc2NzaV9pZCkpOwogCi0gICAgLyoKLSAgICAgKiBCdWlsZCB0aGUgY2FycmllciBmcmVlbGlzdC4KLSAgICAgKgotICAgICAqIERyaXZlciBtdXN0IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBzZXQgJ2NhcnJpZXJfYnVmJy4KLSAgICAgKi8KLSAgICBBU0NfQVNTRVJUKGFzY19kdmMtPmNhcnJpZXJfYnVmICE9IE5VTEwpOworCS8qCisJICogQnVpbGQgdGhlIGNhcnJpZXIgZnJlZWxpc3QuCisJICoKKwkgKiBEcml2ZXIgbXVzdCBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSBhbmQgc2V0ICdjYXJyaWVyX2J1ZicuCisJICovCisJQVNDX0FTU0VSVChhc2NfZHZjLT5jYXJyaWVyX2J1ZiAhPSBOVUxMKTsKIAotICAgIGNhcnJwID0gKEFEVl9DQVJSX1QgKikgQURWXzE2QkFMSUdOKGFzY19kdmMtPmNhcnJpZXJfYnVmKTsKLSAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gTlVMTDsKLSAgICBpZiAoY2FycnAgPT0gKEFEVl9DQVJSX1QgKikgYXNjX2R2Yy0+Y2Fycmllcl9idWYpCi0gICAgewotICAgICAgICBidWZfc2l6ZSA9IEFEVl9DQVJSSUVSX0JVRlNJWkU7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICBidWZfc2l6ZSA9IEFEVl9DQVJSSUVSX0JVRlNJWkUgLSBzaXplb2YoQURWX0NBUlJfVCk7Ci0gICAgfQorCWNhcnJwID0gKEFEVl9DQVJSX1QgKikgQURWXzE2QkFMSUdOKGFzY19kdmMtPmNhcnJpZXJfYnVmKTsKKwlhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gTlVMTDsKKwlpZiAoY2FycnAgPT0gKEFEVl9DQVJSX1QgKikgYXNjX2R2Yy0+Y2Fycmllcl9idWYpIHsKKwkJYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFOworCX0gZWxzZSB7CisJCWJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRSAtIHNpemVvZihBRFZfQ0FSUl9UKTsKKwl9CiAKLSAgICBkbyB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgY2FycmllciAnY2FycnAnLgotICAgICAgICAgKi8KLSAgICAgICAgY29udGlnX2xlbiA9IHNpemVvZihBRFZfQ0FSUl9UKTsKLSAgICAgICAgY2Fycl9wYWRkciA9IGNwdV90b19sZTMyKER2Y0dldFBoeUFkZHIoYXNjX2R2YywgTlVMTCwgKHVjaGFyICopIGNhcnJwLAotICAgICAgICAgICAgKEFEVl9TRENOVCAqKSAmY29udGlnX2xlbiwgQURWX0lTX0NBUlJJRVJfRkxBRykpOworCWRvIHsKKwkJLyoKKwkJICogR2V0IHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBjYXJyaWVyICdjYXJycCcuCisJCSAqLworCQljb250aWdfbGVuID0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCQljYXJyX3BhZGRyID0KKwkJICAgIGNwdV90b19sZTMyKER2Y0dldFBoeUFkZHIKKwkJCQkoYXNjX2R2YywgTlVMTCwgKHVjaGFyICopY2FycnAsCisJCQkJIChBRFZfU0RDTlQgKikmY29udGlnX2xlbiwKKwkJCQkgQURWX0lTX0NBUlJJRVJfRkxBRykpOwogCi0gICAgICAgIGJ1Zl9zaXplIC09IHNpemVvZihBRFZfQ0FSUl9UKTsKKwkJYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZSBjdXJyZW50IGNhcnJpZXIgaXMgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywgdGhlbgotICAgICAgICAgKiBtYXliZSB0aGVyZSB3YXMgYSBwYWdlIGNyb3NzaW5nLiBUcnkgdGhlIG5leHQgY2FycmllciBhbGlnbmVkCi0gICAgICAgICAqIHN0YXJ0IGFkZHJlc3MuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoY29udGlnX2xlbiA8IHNpemVvZihBRFZfQ0FSUl9UKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FycnArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IGNhcnJpZXIgaXMgbm90IHBoeXNpY2FsbHkgY29udGlndW91cywgdGhlbgorCQkgKiBtYXliZSB0aGVyZSB3YXMgYSBwYWdlIGNyb3NzaW5nLiBUcnkgdGhlIG5leHQgY2FycmllciBhbGlnbmVkCisJCSAqIHN0YXJ0IGFkZHJlc3MuCisJCSAqLworCQlpZiAoY29udGlnX2xlbiA8IHNpemVvZihBRFZfQ0FSUl9UKSkgeworCQkJY2FycnArKzsKKwkJCWNvbnRpbnVlOworCQl9CiAKLSAgICAgICAgY2FycnAtPmNhcnJfcGEgPSBjYXJyX3BhZGRyOwotICAgICAgICBjYXJycC0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoY2FycnApKTsKKwkJY2FycnAtPmNhcnJfcGEgPSBjYXJyX3BhZGRyOworCQljYXJycC0+Y2Fycl92YSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoY2FycnApKTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBJbnNlcnQgdGhlIGNhcnJpZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZWxpc3QuCi0gICAgICAgICAqLwotICAgICAgICBjYXJycC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKLSAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOworCQkvKgorCQkgKiBJbnNlcnQgdGhlIGNhcnJpZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZWxpc3QuCisJCSAqLworCQljYXJycC0+bmV4dF92cGEgPQorCQkgICAgY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSk7CisJCWFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBjYXJycDsKIAotICAgICAgICBjYXJycCsrOwotICAgIH0KLSAgICB3aGlsZSAoYnVmX3NpemUgPiAwKTsKKwkJY2FycnArKzsKKwl9CisJd2hpbGUgKGJ1Zl9zaXplID4gMCk7CiAKLSAgICAvKgotICAgICAqIFNldC11cCB0aGUgSG9zdC0+UklTQyBJbml0aWF0b3IgQ29tbWFuZCBRdWV1ZSAoSUNRKS4KLSAgICAgKi8KKwkvKgorCSAqIFNldC11cCB0aGUgSG9zdC0+UklTQyBJbml0aWF0b3IgQ29tbWFuZCBRdWV1ZSAoSUNRKS4KKwkgKi8KIAotICAgIGlmICgoYXNjX2R2Yy0+aWNxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQotICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQotICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEpKTsKKwlpZiAoKGFzY19kdmMtPmljcV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfTk9fQ0FSUklFUjsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CisJYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IChBRFZfQ0FSUl9UICopCisJICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUoYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSkpOwogCi0gICAgLyoKLSAgICAgKiBUaGUgZmlyc3QgY29tbWFuZCBpc3N1ZWQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIHN0b3BwZXIgY2Fycmllci4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCS8qCisJICogVGhlIGZpcnN0IGNvbW1hbmQgaXNzdWVkIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBzdG9wcGVyIGNhcnJpZXIuCisJICovCisJYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKIAotICAgIC8qCi0gICAgICogU2V0IFJJU0MgSUNRIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgdmFsdWUuCi0gICAgICogY2Fycl9wYSBpcyBMRSwgbXVzdCBiZSBuYXRpdmUgYmVmb3JlIHdyaXRlCi0gICAgICovCi0gICAgQWR2V3JpdGVEV29yZExyYW1Ob1N3YXAoaW9wX2Jhc2UsIEFTQ19NQ19JQ1EsIGFzY19kdmMtPmljcV9zcC0+Y2Fycl9wYSk7CisJLyoKKwkgKiBTZXQgUklTQyBJQ1EgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KKwkgKiBjYXJyX3BhIGlzIExFLCBtdXN0IGJlIG5hdGl2ZSBiZWZvcmUgd3JpdGUKKwkgKi8KKwlBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lDUSwgYXNjX2R2Yy0+aWNxX3NwLT5jYXJyX3BhKTsKIAotICAgIC8qCi0gICAgICogU2V0LXVwIHRoZSBSSVNDLT5Ib3N0IEluaXRpYXRvciBSZXNwb25zZSBRdWV1ZSAoSVJRKS4KLSAgICAgKi8KLSAgICBpZiAoKGFzY19kdmMtPmlycV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOwotICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgIH0KLSAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKLSAgICAgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CisJLyoKKwkgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgorCSAqLworCWlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9OT19DQVJSSUVSOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KKwlhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gKEFEVl9DQVJSX1QgKikKKwkgICAgQURWX1UzMl9UT19WQUREUihsZTMyX3RvX2NwdShhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhKSk7CiAKLSAgICAvKgotICAgICAqIFRoZSBmaXJzdCBjb21tYW5kIGNvbXBsZXRlZCBieSB0aGUgUklTQyB3aWxsIGJlIHBsYWNlZCBpbgotICAgICAqIHRoZSBzdG9wcGVyLgotICAgICAqCi0gICAgICogTm90ZTogU2V0ICduZXh0X3ZwYScgdG8gQVNDX0NRX1NUT1BQRVIuIFdoZW4gdGhlIHJlcXVlc3QgaXMKLSAgICAgKiBjb21wbGV0ZWQgdGhlIFJJU0Mgd2lsbCBzZXQgdGhlIEFTQ19SUV9TVE9QUEVSIGJpdC4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5pcnFfc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCS8qCisJICogVGhlIGZpcnN0IGNvbW1hbmQgY29tcGxldGVkIGJ5IHRoZSBSSVNDIHdpbGwgYmUgcGxhY2VkIGluCisJICogdGhlIHN0b3BwZXIuCisJICoKKwkgKiBOb3RlOiBTZXQgJ25leHRfdnBhJyB0byBBU0NfQ1FfU1RPUFBFUi4gV2hlbiB0aGUgcmVxdWVzdCBpcworCSAqIGNvbXBsZXRlZCB0aGUgUklTQyB3aWxsIHNldCB0aGUgQVNDX1JRX1NUT1BQRVIgYml0LgorCSAqLworCWFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CiAKLSAgICAvKgotICAgICAqIFNldCBSSVNDIElSUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgotICAgICAqCi0gICAgICogY2Fycl9wYSBpcyBMRSwgbXVzdCBiZSBuYXRpdmUgYmVmb3JlIHdyaXRlICoKLSAgICAgKi8KLSAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKLSAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKKwkvKgorCSAqIFNldCBSSVNDIElSUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLgorCSAqCisJICogY2Fycl9wYSBpcyBMRSwgbXVzdCBiZSBuYXRpdmUgYmVmb3JlIHdyaXRlICoKKwkgKi8KKwlBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKwlhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKIAotICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKLSAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKKwlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9JTlRSX0VOQUJMRVMsCisJCQkgICAgIChBRFZfSU5UUl9FTkFCTEVfSE9TVF9JTlRSIHwKKwkJCSAgICAgIEFEVl9JTlRSX0VOQUJMRV9HTE9CQUxfSU5UUikpOwogCi0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9CRUdJTl9BRERSLCB3b3JkKTsKLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19QQywgd29yZCk7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9CRUdJTl9BRERSLCB3b3JkKTsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19QQywgd29yZCk7CiAKLSAgICAvKiBmaW5hbGx5LCBmaW5hbGx5LCBnZW50bGVtZW4sIHN0YXJ0IHlvdXIgZW5naW5lICovCi0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUklTQ19DU1IsIEFEVl9SSVNDX0NTUl9SVU4pOworCS8qIGZpbmFsbHksIGZpbmFsbHksIGdlbnRsZW1lbiwgc3RhcnQgeW91ciBlbmdpbmUgKi8KKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SSVNDX0NTUiwgQURWX1JJU0NfQ1NSX1JVTik7CiAKLSAgICAvKgotICAgICAqIFJlc2V0IHRoZSBTQ1NJIEJ1cyBpZiB0aGUgRUVQUk9NIGluZGljYXRlcyB0aGF0IFNDU0kgQnVzCi0gICAgICogUmVzZXRzIHNob3VsZCBiZSBwZXJmb3JtZWQuIFRoZSBSSVNDIGhhcyB0byBiZSBydW5uaW5nCi0gICAgICogdG8gaXNzdWUgYSBTQ1NJIEJ1cyBSZXNldC4KLSAgICAgKi8KLSAgICBpZiAoYXNjX2R2Yy0+Ymlvc19jdHJsICYgQklPU19DVFJMX1JFU0VUX1NDU0lfQlVTKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIEJJT1MgU2lnbmF0dXJlIGlzIHByZXNlbnQgaW4gbWVtb3J5LCByZXN0b3JlIHRoZQotICAgICAgICAgKiBCSU9TIEhhbmRzaGFrZSBDb25maWd1cmF0aW9uIFRhYmxlIGFuZCBkbyBub3QgcGVyZm9ybQotICAgICAgICAgKiBhIFNDU0kgQnVzIFJlc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkvMl0gPT0gMHg1NUFBKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmVzdG9yZSBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOwotICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKLSAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19UQUdRTkdfQUJMRSwgdGFncW5nX2FibGUpOwotICAgICAgICAgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkdldyaXRlQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgbWF4X2NtZFt0aWRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChBZHZSZXNldFNCKGFzY19kdmMpICE9IEFEVl9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdhcm5fY29kZSA9IEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogUmVzZXQgdGhlIFNDU0kgQnVzIGlmIHRoZSBFRVBST00gaW5kaWNhdGVzIHRoYXQgU0NTSSBCdXMKKwkgKiBSZXNldHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIFJJU0MgaGFzIHRvIGJlIHJ1bm5pbmcKKwkgKiB0byBpc3N1ZSBhIFNDU0kgQnVzIFJlc2V0LgorCSAqLworCWlmIChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpIHsKKwkJLyoKKwkJICogSWYgdGhlIEJJT1MgU2lnbmF0dXJlIGlzIHByZXNlbnQgaW4gbWVtb3J5LCByZXN0b3JlIHRoZQorCQkgKiBCSU9TIEhhbmRzaGFrZSBDb25maWd1cmF0aW9uIFRhYmxlIGFuZCBkbyBub3QgcGVyZm9ybQorCQkgKiBhIFNDU0kgQnVzIFJlc2V0LgorCQkgKi8KKwkJaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkgLyAyXSA9PQorCQkgICAgMHg1NUFBKSB7CisJCQkvKgorCQkJICogUmVzdG9yZSBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorCQkJICovCisJCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKKwkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19UQUdRTkdfQUJMRSwKKwkJCQkJIHRhZ3FuZ19hYmxlKTsKKwkJCWZvciAodGlkID0gMDsgdGlkIDw9IEFEVl9NQVhfVElEOyB0aWQrKykgeworCQkJCUFkdldyaXRlQnl0ZUxyYW0oaW9wX2Jhc2UsCisJCQkJCQkgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorCQkJCQkJIG1heF9jbWRbdGlkXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoQWR2UmVzZXRTQihhc2NfZHZjKSAhPSBBRFZfVFJVRSkgeworCQkJCXdhcm5fY29kZSA9IEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SOworCQkJfQorCQl9CisJfQogCi0gICAgcmV0dXJuIHdhcm5fY29kZTsKKwlyZXR1cm4gd2Fybl9jb2RlOwogfQogCiAvKgpAQCAtMTU3NDAsNjMwICsxNTUxMCw2MTcgQEAKICAqCiAgKiBOZWVkZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gZm9yIGVycm9yIHJlY292ZXJ5LgogICovCi1TVEFUSUMgaW50Ci1BZHZJbml0QXNjMzhDMTYwMERyaXZlcihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3N0YXRpYyBpbnQgQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoQURWX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgd2Fybl9jb2RlOwotICAgIEFEVl9EQ05UICAgIHN1bTsKLSAgICBpbnQgICAgICAgICBiZWdpbl9hZGRyOwotICAgIGludCAgICAgICAgIGVuZF9hZGRyOwotICAgIHVzaG9ydCAgICAgIGNvZGVfc3VtOwotICAgIGxvbmcgICAgICAgIHdvcmQ7Ci0gICAgaW50ICAgICAgICAgajsKLSAgICBpbnQgICAgICAgICBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplOwotICAgIEFEVl9DQVJSX1QgICpjYXJycDsKLSAgICBBRFZfRENOVCAgICBjb250aWdfbGVuOwotICAgIEFEVl9TRENOVCAgIGJ1Zl9zaXplOwotICAgIEFEVl9QQUREUiAgIGNhcnJfcGFkZHI7Ci0gICAgaW50ICAgICAgICAgaTsKLSAgICB1c2hvcnQgICAgICBzY3NpX2NmZzE7Ci0gICAgdWNoYXIgICAgICAgYnl0ZTsKLSAgICB1Y2hhciAgICAgICB0aWQ7Ci0gICAgdXNob3J0ICAgICAgYmlvc19tZW1bQVNDX01DX0JJT1NMRU4vMl07IC8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLwotICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCBwcHJfYWJsZSwgdGFncW5nX2FibGU7Ci0gICAgdWNoYXIgICAgICAgbWF4X2NtZFtBU0NfTUFYX1RJRCArIDFdOworCUFkdlBvcnRBZGRyIGlvcF9iYXNlOworCXVzaG9ydCB3YXJuX2NvZGU7CisJQURWX0RDTlQgc3VtOworCWludCBiZWdpbl9hZGRyOworCWludCBlbmRfYWRkcjsKKwl1c2hvcnQgY29kZV9zdW07CisJbG9uZyB3b3JkOworCWludCBqOworCWludCBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplOworCUFEVl9DQVJSX1QgKmNhcnJwOworCUFEVl9EQ05UIGNvbnRpZ19sZW47CisJQURWX1NEQ05UIGJ1Zl9zaXplOworCUFEVl9QQUREUiBjYXJyX3BhZGRyOworCWludCBpOworCXVzaG9ydCBzY3NpX2NmZzE7CisJdWNoYXIgYnl0ZTsKKwl1Y2hhciB0aWQ7CisJdXNob3J0IGJpb3NfbWVtW0FTQ19NQ19CSU9TTEVOIC8gMl07CS8qIEJJT1MgUklTQyBNZW1vcnkgMHg0MC0weDhGLiAqLworCXVzaG9ydCB3ZHRyX2FibGUsIHNkdHJfYWJsZSwgcHByX2FibGUsIHRhZ3FuZ19hYmxlOworCXVjaGFyIG1heF9jbWRbQVNDX01BWF9USUQgKyAxXTsKIAotICAgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZXJyb3IsIGRvbid0IGNvbnRpbnVlLiAqLwotICAgIGlmIChhc2NfZHZjLT5lcnJfY29kZSAhPSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBlcnJvciwgZG9uJ3QgY29udGludWUuICovCisJaWYgKGFzY19kdmMtPmVycl9jb2RlICE9IDApIHsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CiAKLSAgICAvKgotICAgICAqIFRoZSBjYWxsZXIgbXVzdCBzZXQgJ2NoaXBfdHlwZScgdG8gQURWX0NISVBfQVNDMzhDMTYwMC4KLSAgICAgKi8KLSAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlICE9IEFEVl9DSElQX0FTQzM4QzE2MDApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSA9IEFTQ19JRVJSX0JBRF9DSElQVFlQRTsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJLyoKKwkgKiBUaGUgY2FsbGVyIG11c3Qgc2V0ICdjaGlwX3R5cGUnIHRvIEFEVl9DSElQX0FTQzM4QzE2MDAuCisJICovCisJaWYgKGFzY19kdmMtPmNoaXBfdHlwZSAhPSBBRFZfQ0hJUF9BU0MzOEMxNjAwKSB7CisJCWFzY19kdmMtPmVycl9jb2RlID0gQVNDX0lFUlJfQkFEX0NISVBUWVBFOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KIAotICAgIHdhcm5fY29kZSA9IDA7Ci0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwl3YXJuX2NvZGUgPSAwOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CiAKLSAgICAvKgotICAgICAqIFNhdmUgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uIGJlZm9yZSB3cml0aW5nIHRoZSBtaWNyb2NvZGUuCi0gICAgICogVGhlIEJJT1MgbWF5IGFscmVhZHkgYmUgbG9hZGVkIGFuZCB1c2luZyBpdHMgUklTQyBMUkFNIHJlZ2lvbgotICAgICAqIHNvIGl0cyByZWdpb24gbXVzdCBiZSBzYXZlZCBhbmQgcmVzdG9yZWQuCi0gICAgICoKLSAgICAgKiBOb3RlOiBUaGlzIGNvZGUgbWFrZXMgdGhlIGFzc3VtcHRpb24sIHdoaWNoIGlzIGN1cnJlbnRseSB0cnVlLAotICAgICAqIHRoYXQgYSBjaGlwIHJlc2V0IGRvZXMgbm90IGNsZWFyIFJJU0MgTFJBTS4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQVNDX01DX0JJT1NMRU4vMjsgaSsrKQotICAgIHsKLSAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU01FTSArICgyICogaSksIGJpb3NfbWVtW2ldKTsKLSAgICB9CisJLyoKKwkgKiBTYXZlIHRoZSBSSVNDIG1lbW9yeSBCSU9TIHJlZ2lvbiBiZWZvcmUgd3JpdGluZyB0aGUgbWljcm9jb2RlLgorCSAqIFRoZSBCSU9TIG1heSBhbHJlYWR5IGJlIGxvYWRlZCBhbmQgdXNpbmcgaXRzIFJJU0MgTFJBTSByZWdpb24KKwkgKiBzbyBpdHMgcmVnaW9uIG11c3QgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkLgorCSAqCisJICogTm90ZTogVGhpcyBjb2RlIG1ha2VzIHRoZSBhc3N1bXB0aW9uLCB3aGljaCBpcyBjdXJyZW50bHkgdHJ1ZSwKKwkgKiB0aGF0IGEgY2hpcCByZXNldCBkb2VzIG5vdCBjbGVhciBSSVNDIExSQU0uCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTQ19NQ19CSU9TTEVOIC8gMjsgaSsrKSB7CisJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NNRU0gKyAoMiAqIGkpLAorCQkJCWJpb3NfbWVtW2ldKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFNhdmUgY3VycmVudCBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgotICAgICAqLwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7Ci0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfUFBSX0FCTEUsIHBwcl9hYmxlKTsKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19UQUdRTkdfQUJMRSwgdGFncW5nX2FibGUpOwotICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFTQ19NQVhfVElEOyB0aWQrKykKLSAgICB7Ci0gICAgICAgIEFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAotICAgICAgICAgICAgbWF4X2NtZFt0aWRdKTsKLSAgICB9CisJLyoKKwkgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KKwkgKi8KKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7CisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIHRhZ3FuZ19hYmxlKTsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8PSBBU0NfTUFYX1RJRDsgdGlkKyspIHsKKwkJQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisJCQkJbWF4X2NtZFt0aWRdKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFJBTSBCSVNUIChCdWlsdC1JbiBTZWxmIFRlc3QpCi0gICAgICoKLSAgICAgKiBBZGRyZXNzIDogSS9PIGJhc2UgKyBvZmZzZXQgMHgzOGggcmVnaXN0ZXIgKGJ5dGUpLgotICAgICAqIEZ1bmN0aW9uOiBCaXQgNy02KFJXKSA6IFJBTSBtb2RlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBNb2RlICAgOiAweDAwCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFByZS10ZXN0IE1vZGUgOiAweDQwCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFJBTSBUZXN0IE1vZGUgOiAweDgwCi0gICAgICogICAgICAgICAgIEJpdCA1ICAgICAgIDogdW51c2VkCi0gICAgICogICAgICAgICAgIEJpdCA0KFJPKSAgIDogRG9uZSBiaXQKLSAgICAgKiAgICAgICAgICAgQml0IDMtMChSTykgOiBTdGF0dXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdCBFcnJvciAgICA6IDB4MDgKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW50X1JBTSBFcnJvciA6IDB4MDQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUklTQyBFcnJvciAgICA6IDB4MDIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0NTSSBFcnJvciAgICA6IDB4MDEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gRXJyb3IgICAgICA6IDB4MDAKLSAgICAgKgotICAgICAqIE5vdGU6IFJBTSBCSVNUIGNvZGUgc2hvdWxkIGJlIHB1dCByaWdodCBoZXJlLCBiZWZvcmUgbG9hZGluZyB0aGUKLSAgICAgKiBtaWNyb2NvZGUgYW5kIGFmdGVyIHNhdmluZyB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24uCi0gICAgICovCisJLyoKKwkgKiBSQU0gQklTVCAoQnVpbHQtSW4gU2VsZiBUZXN0KQorCSAqCisJICogQWRkcmVzcyA6IEkvTyBiYXNlICsgb2Zmc2V0IDB4MzhoIHJlZ2lzdGVyIChieXRlKS4KKwkgKiBGdW5jdGlvbjogQml0IDctNihSVykgOiBSQU0gbW9kZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgTW9kZSAgIDogMHgwMAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBQcmUtdGVzdCBNb2RlIDogMHg0MAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBSQU0gVGVzdCBNb2RlIDogMHg4MAorCSAqICAgICAgICAgICBCaXQgNSAgICAgICA6IHVudXNlZAorCSAqICAgICAgICAgICBCaXQgNChSTykgICA6IERvbmUgYml0CisJICogICAgICAgICAgIEJpdCAzLTAoUk8pIDogU3RhdHVzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3QgRXJyb3IgICAgOiAweDA4CisJICogICAgICAgICAgICAgICAgICAgICAgICAgIEludF9SQU0gRXJyb3IgOiAweDA0CisJICogICAgICAgICAgICAgICAgICAgICAgICAgIFJJU0MgRXJyb3IgICAgOiAweDAyCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIFNDU0kgRXJyb3IgICAgOiAweDAxCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vIEVycm9yICAgICAgOiAweDAwCisJICoKKwkgKiBOb3RlOiBSQU0gQklTVCBjb2RlIHNob3VsZCBiZSBwdXQgcmlnaHQgaGVyZSwgYmVmb3JlIGxvYWRpbmcgdGhlCisJICogbWljcm9jb2RlIGFuZCBhZnRlciBzYXZpbmcgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uLgorCSAqLwogCi0gICAgLyoKLSAgICAgKiBMUkFNIFByZS10ZXN0Ci0gICAgICoKLSAgICAgKiBXcml0ZSBQUkVfVEVTVF9NT0RFICgweDQwKSB0byByZWdpc3RlciBhbmQgd2FpdCBmb3IgMTAgbWlsbGlzZWNvbmRzLgotICAgICAqIElmIERvbmUgYml0IG5vdCBzZXQgb3IgbG93IG5pYmJsZSBub3QgUFJFX1RFU1RfVkFMVUUgKDB4MDUpLCByZXR1cm4KLSAgICAgKiBhbiBlcnJvci4gUmVzZXQgdG8gTk9STUFMX01PREUgKDB4MDApIGFuZCBkbyBhZ2Fpbi4gSWYgY2Fubm90IHJlc2V0Ci0gICAgICogdG8gTk9STUFMX01PREUsIHJldHVybiBhbiBlcnJvciB0b28uCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICB7Ci0gICAgICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNULCBQUkVfVEVTVF9NT0RFKTsKLSAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSByZWFkaW5nIGJhY2suICovCi0gICAgICAgIGJ5dGUgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKTsKLSAgICAgICAgaWYgKChieXRlICYgUkFNX1RFU1RfRE9ORSkgPT0gMCB8fCAoYnl0ZSAmIDB4MEYpICE9IFBSRV9URVNUX1ZBTFVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUOwotICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICAgICAgfQorCS8qCisJICogTFJBTSBQcmUtdGVzdAorCSAqCisJICogV3JpdGUgUFJFX1RFU1RfTU9ERSAoMHg0MCkgdG8gcmVnaXN0ZXIgYW5kIHdhaXQgZm9yIDEwIG1pbGxpc2Vjb25kcy4KKwkgKiBJZiBEb25lIGJpdCBub3Qgc2V0IG9yIGxvdyBuaWJibGUgbm90IFBSRV9URVNUX1ZBTFVFICgweDA1KSwgcmV0dXJuCisJICogYW4gZXJyb3IuIFJlc2V0IHRvIE5PUk1BTF9NT0RFICgweDAwKSBhbmQgZG8gYWdhaW4uIElmIGNhbm5vdCByZXNldAorCSAqIHRvIE5PUk1BTF9NT0RFLCByZXR1cm4gYW4gZXJyb3IgdG9vLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIFBSRV9URVNUX01PREUpOworCQlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwKTsJLyogV2FpdCBmb3IgMTBtcyBiZWZvcmUgcmVhZGluZyBiYWNrLiAqLworCQlieXRlID0gQWR2UmVhZEJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCk7CisJCWlmICgoYnl0ZSAmIFJBTV9URVNUX0RPTkUpID09IDAKKwkJICAgIHx8IChieXRlICYgMHgwRikgIT0gUFJFX1RFU1RfVkFMVUUpIHsKKwkJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7CisJCQlyZXR1cm4gQURWX0VSUk9SOworCQl9CiAKLSAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIE5PUk1BTF9NT0RFKTsKLSAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSByZWFkaW5nIGJhY2suICovCi0gICAgICAgIGlmIChBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKQotICAgICAgICAgICAgIT0gTk9STUFMX1ZBTFVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9CSVNUX1BSRV9URVNUOwotICAgICAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KKwkJQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIE5PUk1BTF9NT0RFKTsKKwkJRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7CS8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIHJlYWRpbmcgYmFjay4gKi8KKwkJaWYgKEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QpCisJCSAgICAhPSBOT1JNQUxfVkFMVUUpIHsKKwkJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUFJFX1RFU1Q7CisJCQlyZXR1cm4gQURWX0VSUk9SOworCQl9CisJfQogCi0gICAgLyoKLSAgICAgKiBMUkFNIFRlc3QgLSBJdCB0YWtlcyBhYm91dCAxLjUgbXMgdG8gcnVuIHRocm91Z2ggdGhlIHRlc3QuCi0gICAgICoKLSAgICAgKiBXcml0ZSBSQU1fVEVTVF9NT0RFICgweDgwKSB0byByZWdpc3RlciBhbmQgd2FpdCBmb3IgMTAgbWlsbGlzZWNvbmRzLgotICAgICAqIElmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLCBzYXZlIHJlZ2lzdGVyIGJ5dGUsIHNldCB0aGUKLSAgICAgKiBlcnJfY29kZSwgYW5kIHJldHVybiBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUkFNX1RFU1RfTU9ERSk7Ci0gICAgRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7ICAvKiBXYWl0IGZvciAxMG1zIGJlZm9yZSBjaGVja2luZyBzdGF0dXMuICovCisJLyoKKwkgKiBMUkFNIFRlc3QgLSBJdCB0YWtlcyBhYm91dCAxLjUgbXMgdG8gcnVuIHRocm91Z2ggdGhlIHRlc3QuCisJICoKKwkgKiBXcml0ZSBSQU1fVEVTVF9NT0RFICgweDgwKSB0byByZWdpc3RlciBhbmQgd2FpdCBmb3IgMTAgbWlsbGlzZWNvbmRzLgorCSAqIElmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLCBzYXZlIHJlZ2lzdGVyIGJ5dGUsIHNldCB0aGUKKwkgKiBlcnJfY29kZSwgYW5kIHJldHVybiBhbiBlcnJvci4KKwkgKi8KKwlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgUkFNX1RFU1RfTU9ERSk7CisJRHZjU2xlZXBNaWxsaVNlY29uZCgxMCk7CS8qIFdhaXQgZm9yIDEwbXMgYmVmb3JlIGNoZWNraW5nIHN0YXR1cy4gKi8KIAotICAgIGJ5dGUgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKTsKLSAgICBpZiAoKGJ5dGUgJiBSQU1fVEVTVF9ET05FKSA9PSAwIHx8IChieXRlICYgUkFNX1RFU1RfU1RBVFVTKSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogR2V0IGhlcmUgaWYgRG9uZSBiaXQgbm90IHNldCBvciBTdGF0dXMgbm90IDAuICovCi0gICAgICAgIGFzY19kdmMtPmJpc3RfZXJyX2NvZGUgPSBieXRlOyAgLyogZm9yIEJJT1MgZGlzcGxheSBtZXNzYWdlICovCi0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUkFNX1RFU1Q7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQorCWJ5dGUgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1JBTV9CSVNUKTsKKwlpZiAoKGJ5dGUgJiBSQU1fVEVTVF9ET05FKSA9PSAwIHx8IChieXRlICYgUkFNX1RFU1RfU1RBVFVTKSAhPSAwKSB7CisJCS8qIEdldCBoZXJlIGlmIERvbmUgYml0IG5vdCBzZXQgb3IgU3RhdHVzIG5vdCAwLiAqLworCQlhc2NfZHZjLT5iaXN0X2Vycl9jb2RlID0gYnl0ZTsJLyogZm9yIEJJT1MgZGlzcGxheSBtZXNzYWdlICovCisJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX0JJU1RfUkFNX1RFU1Q7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgLyogV2UgbmVlZCB0byByZXNldCBiYWNrIHRvIG5vcm1hbCBtb2RlIGFmdGVyIExSQU0gdGVzdCBwYXNzZXMuICovCi0gICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfUkFNX0JJU1QsIE5PUk1BTF9NT0RFKTsKKwkvKiBXZSBuZWVkIHRvIHJlc2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgYWZ0ZXIgTFJBTSB0ZXN0IHBhc3Nlcy4gKi8KKwlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9SQU1fQklTVCwgTk9STUFMX01PREUpOwogCi0gICAgLyoKLSAgICAgKiBMb2FkIHRoZSBNaWNyb2NvZGUKLSAgICAgKgotICAgICAqIFdyaXRlIHRoZSBtaWNyb2NvZGUgaW1hZ2UgdG8gUklTQyBtZW1vcnkgc3RhcnRpbmcgYXQgYWRkcmVzcyAwLgotICAgICAqCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOworCS8qCisJICogTG9hZCB0aGUgTWljcm9jb2RlCisJICoKKwkgKiBXcml0ZSB0aGUgbWljcm9jb2RlIGltYWdlIHRvIFJJU0MgbWVtb3J5IHN0YXJ0aW5nIGF0IGFkZHJlc3MgMC4KKwkgKgorCSAqLworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCAwKTsKIAotICAgIC8qCi0gICAgICogQXNzdW1lIHRoZSBmb2xsb3dpbmcgY29tcHJlc3NlZCBmb3JtYXQgb2YgdGhlIG1pY3JvY29kZSBidWZmZXI6Ci0gICAgICoKLSAgICAgKiAgMjU0IHdvcmQgKDUwOCBieXRlKSB0YWJsZSBpbmRleGVkIGJ5IGJ5dGUgY29kZSBmb2xsb3dlZAotICAgICAqICBieSB0aGUgZm9sbG93aW5nIGJ5dGUgY29kZXM6Ci0gICAgICoKLSAgICAgKiAgICAxLUJ5dGUgQ29kZToKLSAgICAgKiAgICAgIDAwOiBFbWl0IHdvcmQgMCBpbiB0YWJsZS4KLSAgICAgKiAgICAgIDAxOiBFbWl0IHdvcmQgMSBpbiB0YWJsZS4KLSAgICAgKiAgICAgIC4KLSAgICAgKiAgICAgIEZEOiBFbWl0IHdvcmQgMjUzIGluIHRhYmxlLgotICAgICAqCi0gICAgICogICAgTXVsdGktQnl0ZSBDb2RlOgotICAgICAqICAgICAgRkUgV1cgV1c6ICgzIGJ5dGUgY29kZSkgV29yZCB0byBlbWl0IGlzIHRoZSBuZXh0IHdvcmQgV1cgV1cuCi0gICAgICogICAgICBGRiBCQiBXVyBXVzogKDQgYnl0ZSBjb2RlKSBFbWl0IEJCIGNvdW50IHRpbWVzIG5leHQgd29yZCBXVyBXVy4KLSAgICAgKi8KLSAgICB3b3JkID0gMDsKLSAgICBmb3IgKGkgPSAyNTMgKiAyOyBpIDwgX2Fkdl9hc2MzOEMxNjAwX3NpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChfYWR2X2FzYzM4QzE2MDBfYnVmW2ldID09IDB4ZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBfYWR2X2FzYzM4QzE2MDBfYnVmW2kgKyAxXTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzE2MDBfYnVmW2kgKyAzXSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzE2MDBfYnVmW2kgKyAyXSkpOwotICAgICAgICAgICAgICAgIHdvcmQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgaSArPSAzOwotICAgICAgICB9IGVsc2UgaWYgKF9hZHZfYXNjMzhDMTYwMF9idWZbaV0gPT0gMHhmZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzE2MDBfYnVmW2kgKyAyXSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzE2MDBfYnVmW2kgKyAxXSkpOwotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgd29yZCsrOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQWR2V3JpdGVXb3JkQXV0b0luY0xyYW0oaW9wX2Jhc2UsICgoKHVzaG9ydCkKLSAgICAgICAgICAgICAgICAgX2Fkdl9hc2MzOEMxNjAwX2J1ZlsoX2Fkdl9hc2MzOEMxNjAwX2J1ZltpXSAqIDIpICsgMV0gPDwgOCkgfAotICAgICAgICAgICAgICAgICBfYWR2X2FzYzM4QzE2MDBfYnVmW19hZHZfYXNjMzhDMTYwMF9idWZbaV0gKiAyXSkpOwotICAgICAgICAgICAgd29yZCsrOwotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogQXNzdW1lIHRoZSBmb2xsb3dpbmcgY29tcHJlc3NlZCBmb3JtYXQgb2YgdGhlIG1pY3JvY29kZSBidWZmZXI6CisJICoKKwkgKiAgMjU0IHdvcmQgKDUwOCBieXRlKSB0YWJsZSBpbmRleGVkIGJ5IGJ5dGUgY29kZSBmb2xsb3dlZAorCSAqICBieSB0aGUgZm9sbG93aW5nIGJ5dGUgY29kZXM6CisJICoKKwkgKiAgICAxLUJ5dGUgQ29kZToKKwkgKiAgICAgIDAwOiBFbWl0IHdvcmQgMCBpbiB0YWJsZS4KKwkgKiAgICAgIDAxOiBFbWl0IHdvcmQgMSBpbiB0YWJsZS4KKwkgKiAgICAgIC4KKwkgKiAgICAgIEZEOiBFbWl0IHdvcmQgMjUzIGluIHRhYmxlLgorCSAqCisJICogICAgTXVsdGktQnl0ZSBDb2RlOgorCSAqICAgICAgRkUgV1cgV1c6ICgzIGJ5dGUgY29kZSkgV29yZCB0byBlbWl0IGlzIHRoZSBuZXh0IHdvcmQgV1cgV1cuCisJICogICAgICBGRiBCQiBXVyBXVzogKDQgYnl0ZSBjb2RlKSBFbWl0IEJCIGNvdW50IHRpbWVzIG5leHQgd29yZCBXVyBXVy4KKwkgKi8KKwl3b3JkID0gMDsKKwlmb3IgKGkgPSAyNTMgKiAyOyBpIDwgX2Fkdl9hc2MzOEMxNjAwX3NpemU7IGkrKykgeworCQlpZiAoX2Fkdl9hc2MzOEMxNjAwX2J1ZltpXSA9PSAweGZmKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgX2Fkdl9hc2MzOEMxNjAwX2J1ZltpICsgMV07IGorKykgeworCQkJCUFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisJCQkJCQkJCSAgICBfYWR2X2FzYzM4QzE2MDBfYnVmCisJCQkJCQkJCSAgICBbaSArCisJCQkJCQkJCSAgICAgM10gPDwgOCkgfAorCQkJCQkJCQkgICBfYWR2X2FzYzM4QzE2MDBfYnVmCisJCQkJCQkJCSAgIFtpICsgMl0pKTsKKwkJCQl3b3JkKys7CisJCQl9CisJCQlpICs9IDM7CisJCX0gZWxzZSBpZiAoX2Fkdl9hc2MzOEMxNjAwX2J1ZltpXSA9PSAweGZlKSB7CisJCQlBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgKCgodXNob3J0KQorCQkJCQkJCSAgICBfYWR2X2FzYzM4QzE2MDBfYnVmCisJCQkJCQkJICAgIFtpICsKKwkJCQkJCQkgICAgIDJdIDw8IDgpIHwKKwkJCQkJCQkgICBfYWR2X2FzYzM4QzE2MDBfYnVmW2kKKwkJCQkJCQkJCSAgICAgICArCisJCQkJCQkJCQkgICAgICAgMV0pKTsKKwkJCWkgKz0gMjsKKwkJCXdvcmQrKzsKKwkJfSBlbHNlIHsKKwkJCUFkdldyaXRlV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlLCAoKCh1c2hvcnQpCisJCQkJCQkJICAgIF9hZHZfYXNjMzhDMTYwMF9idWZbKF9hZHZfYXNjMzhDMTYwMF9idWZbaV0gKiAyKSArIDFdIDw8IDgpIHwgX2Fkdl9hc2MzOEMxNjAwX2J1ZltfYWR2X2FzYzM4QzE2MDBfYnVmW2ldICogMl0pKTsKKwkJCXdvcmQrKzsKKwkJfQorCX0KIAotICAgIC8qCi0gICAgICogU2V0ICd3b3JkJyBmb3IgbGF0ZXIgdXNlIHRvIGNsZWFyIHRoZSByZXN0IG9mIG1lbW9yeSBhbmQgc2F2ZQotICAgICAqIHRoZSBleHBhbmRlZCBtY29kZSBzaXplLgotICAgICAqLwotICAgIHdvcmQgKj0gMjsKLSAgICBhZHZfYXNjMzhDMTYwMF9leHBhbmRlZF9zaXplID0gd29yZDsKKwkvKgorCSAqIFNldCAnd29yZCcgZm9yIGxhdGVyIHVzZSB0byBjbGVhciB0aGUgcmVzdCBvZiBtZW1vcnkgYW5kIHNhdmUKKwkgKiB0aGUgZXhwYW5kZWQgbWNvZGUgc2l6ZS4KKwkgKi8KKwl3b3JkICo9IDI7CisJYWR2X2FzYzM4QzE2MDBfZXhwYW5kZWRfc2l6ZSA9IHdvcmQ7CiAKLSAgICAvKgotICAgICAqIENsZWFyIHRoZSByZXN0IG9mIEFTQy0zOEMxNjAwIEludGVybmFsIFJBTSAoMzJLQikuCi0gICAgICovCi0gICAgZm9yICg7IHdvcmQgPCBBRFZfMzhDMTYwMF9NRU1TSVpFOyB3b3JkICs9IDIpCi0gICAgewotICAgICAgICBBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgMCk7Ci0gICAgfQorCS8qCisJICogQ2xlYXIgdGhlIHJlc3Qgb2YgQVNDLTM4QzE2MDAgSW50ZXJuYWwgUkFNICgzMktCKS4KKwkgKi8KKwlmb3IgKDsgd29yZCA8IEFEVl8zOEMxNjAwX01FTVNJWkU7IHdvcmQgKz0gMikgeworCQlBZHZXcml0ZVdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSwgMCk7CisJfQogCi0gICAgLyoKLSAgICAgKiBWZXJpZnkgdGhlIG1pY3JvY29kZSBjaGVja3N1bS4KLSAgICAgKi8KLSAgICBzdW0gPSAwOwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCAwKTsKKwkvKgorCSAqIFZlcmlmeSB0aGUgbWljcm9jb2RlIGNoZWNrc3VtLgorCSAqLworCXN1bSA9IDA7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUkFNX0FERFIsIDApOwogCi0gICAgZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzOEMxNjAwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikKLSAgICB7Ci0gICAgICAgIHN1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKLSAgICB9CisJZm9yICh3b3JkID0gMDsgd29yZCA8IGFkdl9hc2MzOEMxNjAwX2V4cGFuZGVkX3NpemU7IHdvcmQgKz0gMikgeworCQlzdW0gKz0gQWR2UmVhZFdvcmRBdXRvSW5jTHJhbShpb3BfYmFzZSk7CisJfQogCi0gICAgaWYgKHN1bSAhPSBfYWR2X2FzYzM4QzE2MDBfY2hrc3VtKQotICAgIHsKLSAgICAgICAgYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfTUNPREVfQ0hLU1VNOwotICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgIH0KKwlpZiAoc3VtICE9IF9hZHZfYXNjMzhDMTYwMF9jaGtzdW0pIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfTUNPREVfQ0hLU1VNOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KIAotICAgIC8qCi0gICAgICogUmVzdG9yZSB0aGUgUklTQyBtZW1vcnkgQklPUyByZWdpb24uCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IEFTQ19NQ19CSU9TTEVOLzI7IGkrKykKLSAgICB7Ci0gICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TTUVNICsgKDIgKiBpKSwgYmlvc19tZW1baV0pOwotICAgIH0KKwkvKgorCSAqIFJlc3RvcmUgdGhlIFJJU0MgbWVtb3J5IEJJT1MgcmVnaW9uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU0NfTUNfQklPU0xFTiAvIDI7IGkrKykgeworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU01FTSArICgyICogaSksCisJCQkJIGJpb3NfbWVtW2ldKTsKKwl9CiAKLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSBhbmQgd3JpdGUgdGhlIG1pY3JvY29kZSBjb2RlIGNoZWNrc3VtIHRvIHRoZSBtaWNyb2NvZGUKLSAgICAgKiBjb2RlIGNoZWNrc3VtIGxvY2F0aW9uIEFTQ19NQ19DT0RFX0NIS19TVU0gKDB4MkMpLgotICAgICAqLwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgYmVnaW5fYWRkcik7Ci0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9FTkRfQUREUiwgZW5kX2FkZHIpOwotICAgIGNvZGVfc3VtID0gMDsKLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SQU1fQUREUiwgYmVnaW5fYWRkcik7Ci0gICAgZm9yICh3b3JkID0gYmVnaW5fYWRkcjsgd29yZCA8IGVuZF9hZGRyOyB3b3JkICs9IDIpCi0gICAgewotICAgICAgICBjb2RlX3N1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKLSAgICB9Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQ0hLX1NVTSwgY29kZV9zdW0pOworCS8qCisJICogQ2FsY3VsYXRlIGFuZCB3cml0ZSB0aGUgbWljcm9jb2RlIGNvZGUgY2hlY2tzdW0gdG8gdGhlIG1pY3JvY29kZQorCSAqIGNvZGUgY2hlY2tzdW0gbG9jYXRpb24gQVNDX01DX0NPREVfQ0hLX1NVTSAoMHgyQykuCisJICovCisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09ERV9CRUdJTl9BRERSLCBiZWdpbl9hZGRyKTsKKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0VORF9BRERSLCBlbmRfYWRkcik7CisJY29kZV9zdW0gPSAwOworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JBTV9BRERSLCBiZWdpbl9hZGRyKTsKKwlmb3IgKHdvcmQgPSBiZWdpbl9hZGRyOyB3b3JkIDwgZW5kX2FkZHI7IHdvcmQgKz0gMikgeworCQljb2RlX3N1bSArPSBBZHZSZWFkV29yZEF1dG9JbmNMcmFtKGlvcF9iYXNlKTsKKwl9CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQ0hLX1NVTSwgY29kZV9zdW0pOwogCi0gICAgLyoKLSAgICAgKiBSZWFkIG1pY3JvY29kZSB2ZXJzaW9uIGFuZCBkYXRlLgotICAgICAqLwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1ZFUlNJT05fREFURSwgYXNjX2R2Yy0+Y2ZnLT5tY29kZV9kYXRlKTsKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX05VTSwgYXNjX2R2Yy0+Y2ZnLT5tY29kZV92ZXJzaW9uKTsKKwkvKgorCSAqIFJlYWQgbWljcm9jb2RlIHZlcnNpb24gYW5kIGRhdGUuCisJICovCisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVkVSU0lPTl9EQVRFLAorCQkJYXNjX2R2Yy0+Y2ZnLT5tY29kZV9kYXRlKTsKKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19WRVJTSU9OX05VTSwKKwkJCWFzY19kdmMtPmNmZy0+bWNvZGVfdmVyc2lvbik7CiAKLSAgICAvKgotICAgICAqIFNldCB0aGUgY2hpcCB0eXBlIHRvIGluZGljYXRlIHRoZSBBU0MzOEMxNjAwLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DSElQX1RZUEUsIEFEVl9DSElQX0FTQzM4QzE2MDApOworCS8qCisJICogU2V0IHRoZSBjaGlwIHR5cGUgdG8gaW5kaWNhdGUgdGhlIEFTQzM4QzE2MDAuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NISVBfVFlQRSwgQURWX0NISVBfQVNDMzhDMTYwMCk7CiAKLSAgICAvKgotICAgICAqIFdyaXRlIDEgdG8gYml0IDE0ICdESVNfVEVSTV9EUlYnIGluIHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIuCi0gICAgICogV2hlbiBESVNfVEVSTV9EUlYgc2V0IHRvIDEsIENfREVUWzM6MF0gd2lsbCByZWZsZWN0IGN1cnJlbnQKLSAgICAgKiBjYWJsZSBkZXRlY3Rpb24gYW5kIHRoZW4gd2UgYXJlIGFibGUgdG8gcmVhZCBDX0RFVFszOjBdLgotICAgICAqCi0gICAgICogTm90ZTogV2Ugd2lsbCByZXNldCBESVNfVEVSTV9EUlYgdG8gMCBpbiB0aGUgJ1NldCBTQ1NJX0NGRzEKLSAgICAgKiBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZScgc2VjdGlvbiBiZWxvdy4KLSAgICAgKi8KLSAgICBzY3NpX2NmZzEgPSBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1NDU0lfQ0ZHMSk7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxLCBzY3NpX2NmZzEgfCBESVNfVEVSTV9EUlYpOworCS8qCisJICogV3JpdGUgMSB0byBiaXQgMTQgJ0RJU19URVJNX0RSVicgaW4gdGhlIFNDU0lfQ0ZHMSByZWdpc3Rlci4KKwkgKiBXaGVuIERJU19URVJNX0RSViBzZXQgdG8gMSwgQ19ERVRbMzowXSB3aWxsIHJlZmxlY3QgY3VycmVudAorCSAqIGNhYmxlIGRldGVjdGlvbiBhbmQgdGhlbiB3ZSBhcmUgYWJsZSB0byByZWFkIENfREVUWzM6MF0uCisJICoKKwkgKiBOb3RlOiBXZSB3aWxsIHJlc2V0IERJU19URVJNX0RSViB0byAwIGluIHRoZSAnU2V0IFNDU0lfQ0ZHMQorCSAqIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlJyBzZWN0aW9uIGJlbG93LgorCSAqLworCXNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEsCisJCQkgICAgIHNjc2lfY2ZnMSB8IERJU19URVJNX0RSVik7CiAKLSAgICAvKgotICAgICAqIElmIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBDb21tYW5kIFJlZ2lzdGVyICJQYXJpdHkgRXJyb3IgUmVzcG9uc2UKLSAgICAgKiBDb250cm9sIiBCaXQgd2FzIGNsZWFyICgwKSwgdGhlbiBzZXQgdGhlIG1pY3JvY29kZSB2YXJpYWJsZQotICAgICAqICdjb250cm9sX2ZsYWcnIENPTlRST0xfRkxBR19JR05PUkVfUEVSUiBmbGFnIHRvIHRlbGwgdGhlIG1pY3JvY29kZQotICAgICAqIHRvIGlnbm9yZSBETUEgcGFyaXR5IGVycm9ycy4KLSAgICAgKi8KLSAgICBpZiAoYXNjX2R2Yy0+Y2ZnLT5jb250cm9sX2ZsYWcgJiBDT05UUk9MX0ZMQUdfSUdOT1JFX1BFUlIpCi0gICAgewotICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOwotICAgICAgICB3b3JkIHw9IENPTlRST0xfRkxBR19JR05PUkVfUEVSUjsKLSAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7Ci0gICAgfQorCS8qCisJICogSWYgdGhlIFBDSSBDb25maWd1cmF0aW9uIENvbW1hbmQgUmVnaXN0ZXIgIlBhcml0eSBFcnJvciBSZXNwb25zZQorCSAqIENvbnRyb2wiIEJpdCB3YXMgY2xlYXIgKDApLCB0aGVuIHNldCB0aGUgbWljcm9jb2RlIHZhcmlhYmxlCisJICogJ2NvbnRyb2xfZmxhZycgQ09OVFJPTF9GTEFHX0lHTk9SRV9QRVJSIGZsYWcgdG8gdGVsbCB0aGUgbWljcm9jb2RlCisJICogdG8gaWdub3JlIERNQSBwYXJpdHkgZXJyb3JzLgorCSAqLworCWlmIChhc2NfZHZjLT5jZmctPmNvbnRyb2xfZmxhZyAmIENPTlRST0xfRkxBR19JR05PUkVfUEVSUikgeworCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworCQl3b3JkIHw9IENPTlRST0xfRkxBR19JR05PUkVfUEVSUjsKKwkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7CisJfQogCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgQklPUyBjb250cm9sIGZsYWcgQUlQUCAoQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uCi0gICAgICogUGhhc2UgUHJvdGVjdGlvbikgZGlzYWJsZSBiaXQgaXMgbm90IHNldCwgdGhlbiBzZXQgdGhlIGZpcm13YXJlCi0gICAgICogJ2NvbnRyb2xfZmxhZycgQ09OVFJPTF9GTEFHX0VOQUJMRV9BSVBQIGJpdCB0byBlbmFibGUKLSAgICAgKiBBSVBQIGNoZWNraW5nIGFuZCBlbmNvZGluZy4KLSAgICAgKi8KLSAgICBpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9BSVBQX0RJUykgPT0gMCkKLSAgICB7Ci0gICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7Ci0gICAgICAgIHdvcmQgfD0gQ09OVFJPTF9GTEFHX0VOQUJMRV9BSVBQOwotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQ09OVFJPTF9GTEFHLCB3b3JkKTsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgQklPUyBjb250cm9sIGZsYWcgQUlQUCAoQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uCisJICogUGhhc2UgUHJvdGVjdGlvbikgZGlzYWJsZSBiaXQgaXMgbm90IHNldCwgdGhlbiBzZXQgdGhlIGZpcm13YXJlCisJICogJ2NvbnRyb2xfZmxhZycgQ09OVFJPTF9GTEFHX0VOQUJMRV9BSVBQIGJpdCB0byBlbmFibGUKKwkgKiBBSVBQIGNoZWNraW5nIGFuZCBlbmNvZGluZy4KKwkgKi8KKwlpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9BSVBQX0RJUykgPT0gMCkgeworCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT05UUk9MX0ZMQUcsIHdvcmQpOworCQl3b3JkIHw9IENPTlRST0xfRkxBR19FTkFCTEVfQUlQUDsKKwkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPTlRST0xfRkxBRywgd29yZCk7CisJfQogCi0gICAgLyoKLSAgICAgKiBGb3IgQVNDLTM4QzE2MDAgdXNlIERNQV9DRkcwIGRlZmF1bHQgdmFsdWVzOiBGSUZPX1RIUkVTSF84MEIgWzY6NF0sCi0gICAgICogYW5kIFNUQVJUX0NUTF9USCBbMzoyXS4KLSAgICAgKi8KLSAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9ETUFfQ0ZHMCwKLSAgICAgICAgRklGT19USFJFU0hfODBCIHwgU1RBUlRfQ1RMX1RIIHwgUkVBRF9DTURfTVJNKTsKKwkvKgorCSAqIEZvciBBU0MtMzhDMTYwMCB1c2UgRE1BX0NGRzAgZGVmYXVsdCB2YWx1ZXM6IEZJRk9fVEhSRVNIXzgwQiBbNjo0XSwKKwkgKiBhbmQgU1RBUlRfQ1RMX1RIIFszOjJdLgorCSAqLworCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0RNQV9DRkcwLAorCQkJICAgICBGSUZPX1RIUkVTSF84MEIgfCBTVEFSVF9DVExfVEggfCBSRUFEX0NNRF9NUk0pOwogCi0gICAgLyoKLSAgICAgKiBNaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcyBmb3IgV0RUUiwgU0RUUiwgYW5kIGNvbW1hbmQgdGFnCi0gICAgICogcXVldWluZyB3aWxsIGJlIHNldCBpbiBBZHZJbnF1aXJ5SGFuZGxpbmcoKSBiYXNlZCBvbiB3aGF0IGEKLSAgICAgKiBkZXZpY2UgcmVwb3J0cyBpdCBpcyBjYXBhYmxlIG9mIGluIElucXVpcnkgYnl0ZSA3LgotICAgICAqCi0gICAgICogSWYgU0NTSSBCdXMgUmVzZXRzIGhhdmUgYmVlbiBkaXNhYmxlZCwgdGhlbiBkaXJlY3RseSBzZXQKLSAgICAgKiBTRFRSIGFuZCBXRFRSIGZyb20gdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uLiBUaGlzIHdpbGwgYWxsb3cKLSAgICAgKiB0aGUgQklPUyBhbmQgd2FybSBib290IHRvIHdvcmsgd2l0aG91dCBhIFNDU0kgYnVzIGhhbmcgb24KLSAgICAgKiB0aGUgSW5xdWlyeSBjYXVzZWQgYnkgaG9zdCBhbmQgdGFyZ2V0IG1pc21hdGNoZWQgRFRSIHZhbHVlcy4KLSAgICAgKiBXaXRob3V0IHRoZSBTQ1NJIEJ1cyBSZXNldCwgYmVmb3JlIGFuIElucXVpcnkgYSBkZXZpY2UgY2FuJ3QKLSAgICAgKiBiZSBhc3N1bWVkIHRvIGJlIGluIEFzeW5jaHJvbm91cywgTmFycm93IG1vZGUuCi0gICAgICovCi0gICAgaWYgKChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpID09IDApCi0gICAgewotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCBhc2NfZHZjLT53ZHRyX2FibGUpOwotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBhc2NfZHZjLT5zZHRyX2FibGUpOwotICAgIH0KKwkvKgorCSAqIE1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBXRFRSLCBTRFRSLCBhbmQgY29tbWFuZCB0YWcKKwkgKiBxdWV1aW5nIHdpbGwgYmUgc2V0IGluIEFkdklucXVpcnlIYW5kbGluZygpIGJhc2VkIG9uIHdoYXQgYQorCSAqIGRldmljZSByZXBvcnRzIGl0IGlzIGNhcGFibGUgb2YgaW4gSW5xdWlyeSBieXRlIDcuCisJICoKKwkgKiBJZiBTQ1NJIEJ1cyBSZXNldHMgaGF2ZSBiZWVuIGRpc2FibGVkLCB0aGVuIGRpcmVjdGx5IHNldAorCSAqIFNEVFIgYW5kIFdEVFIgZnJvbSB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBhbGxvdworCSAqIHRoZSBCSU9TIGFuZCB3YXJtIGJvb3QgdG8gd29yayB3aXRob3V0IGEgU0NTSSBidXMgaGFuZyBvbgorCSAqIHRoZSBJbnF1aXJ5IGNhdXNlZCBieSBob3N0IGFuZCB0YXJnZXQgbWlzbWF0Y2hlZCBEVFIgdmFsdWVzLgorCSAqIFdpdGhvdXQgdGhlIFNDU0kgQnVzIFJlc2V0LCBiZWZvcmUgYW4gSW5xdWlyeSBhIGRldmljZSBjYW4ndAorCSAqIGJlIGFzc3VtZWQgdG8gYmUgaW4gQXN5bmNocm9ub3VzLCBOYXJyb3cgbW9kZS4KKwkgKi8KKwlpZiAoKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykgPT0gMCkgeworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLAorCQkJCSBhc2NfZHZjLT53ZHRyX2FibGUpOworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLAorCQkJCSBhc2NfZHZjLT5zZHRyX2FibGUpOworCX0KIAotICAgIC8qCi0gICAgICogU2V0IG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBESVNDIGFuZCBTRFRSX1NQRUVEMSwKLSAgICAgKiBTRFRSX1NQRUVEMiwgU0RUUl9TUEVFRDMsIGFuZCBTRFRSX1NQRUVENCBiYXNlZCBvbiB0aGUgRUVQUk9NCi0gICAgICogY29uZmlndXJhdGlvbiB2YWx1ZXMuCi0gICAgICoKLSAgICAgKiBUaGUgU0RUUiBwZXIgVElEIGJpdG1hc2sgb3ZlcnJpZGVzIHRoZSBTRFRSX1NQRUVEMSwgU0RUUl9TUEVFRDIsCi0gICAgICogU0RUUl9TUEVFRDMsIGFuZCBTRFRSX1NQRUVENCB2YWx1ZXMgc28gaXQgaXMgc2FmZSB0byBzZXQgdGhlbQotICAgICAqIHdpdGhvdXQgZGV0ZXJtaW5pbmcgaGVyZSB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgU0RUUi4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfRElTQ19FTkFCTEUsIGFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUpOwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMSwgYXNjX2R2Yy0+c2R0cl9zcGVlZDEpOwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMiwgYXNjX2R2Yy0+c2R0cl9zcGVlZDIpOwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVEMywgYXNjX2R2Yy0+c2R0cl9zcGVlZDMpOwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX1NQRUVENCwgYXNjX2R2Yy0+c2R0cl9zcGVlZDQpOworCS8qCisJICogU2V0IG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIGZvciBESVNDIGFuZCBTRFRSX1NQRUVEMSwKKwkgKiBTRFRSX1NQRUVEMiwgU0RUUl9TUEVFRDMsIGFuZCBTRFRSX1NQRUVENCBiYXNlZCBvbiB0aGUgRUVQUk9NCisJICogY29uZmlndXJhdGlvbiB2YWx1ZXMuCisJICoKKwkgKiBUaGUgU0RUUiBwZXIgVElEIGJpdG1hc2sgb3ZlcnJpZGVzIHRoZSBTRFRSX1NQRUVEMSwgU0RUUl9TUEVFRDIsCisJICogU0RUUl9TUEVFRDMsIGFuZCBTRFRSX1NQRUVENCB2YWx1ZXMgc28gaXQgaXMgc2FmZSB0byBzZXQgdGhlbQorCSAqIHdpdGhvdXQgZGV0ZXJtaW5pbmcgaGVyZSB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgU0RUUi4KKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfRElTQ19FTkFCTEUsCisJCQkgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSk7CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQxLCBhc2NfZHZjLT5zZHRyX3NwZWVkMSk7CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQyLCBhc2NfZHZjLT5zZHRyX3NwZWVkMik7CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQzLCBhc2NfZHZjLT5zZHRyX3NwZWVkMyk7CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfU1BFRUQ0LCBhc2NfZHZjLT5zZHRyX3NwZWVkNCk7CiAKLSAgICAvKgotICAgICAqIFNldCBTQ1NJX0NGRzAgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCi0gICAgICoKLSAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzAgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0NTSV9DRkcwLAotICAgICAgICBQQVJJVFlfRU4gfCBRVUVVRV8xMjggfCBTRUxfVE1PX0xPTkcgfCBPVVJfSURfRU4gfAotICAgICAgICBhc2NfZHZjLT5jaGlwX3Njc2lfaWQpOworCS8qCisJICogU2V0IFNDU0lfQ0ZHMCBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZS4KKwkgKgorCSAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIFNDU0lfQ0ZHMCByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisJICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9TQ1NJX0NGRzAsCisJCQkgUEFSSVRZX0VOIHwgUVVFVUVfMTI4IHwgU0VMX1RNT19MT05HIHwgT1VSX0lEX0VOIHwKKwkJCSBhc2NfZHZjLT5jaGlwX3Njc2lfaWQpOwogCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlLgotICAgICAqCi0gICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKLSAgICAgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgotICAgICAqCi0gICAgICogRWFjaCBBU0MtMzhDMTYwMCBmdW5jdGlvbiBoYXMgb25seSB0d28gY2FibGUgZGV0ZWN0IGJpdHMuCi0gICAgICogVGhlIGJ1cyBtb2RlIG92ZXJyaWRlIGJpdHMgYXJlIGluIElPUEJfU09GVF9PVkVSX1dSLgotICAgICAqLwotICAgIHNjc2lfY2ZnMSA9IEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfU0NTSV9DRkcxKTsKKwkvKgorCSAqIENhbGN1bGF0ZSBTQ1NJX0NGRzEgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUuCisJICoKKwkgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorCSAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisJICoKKwkgKiBFYWNoIEFTQy0zOEMxNjAwIGZ1bmN0aW9uIGhhcyBvbmx5IHR3byBjYWJsZSBkZXRlY3QgYml0cy4KKwkgKiBUaGUgYnVzIG1vZGUgb3ZlcnJpZGUgYml0cyBhcmUgaW4gSU9QQl9TT0ZUX09WRVJfV1IuCisJICovCisJc2NzaV9jZmcxID0gQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NGRzEpOwogCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgY2FibGUgaXMgcmV2ZXJzZWQgYWxsIG9mIHRoZSBTQ1NJX0NUUkwgcmVnaXN0ZXIgc2lnbmFscwotICAgICAqIHdpbGwgYmUgc2V0LiBDaGVjayBmb3IgYW5kIHJldHVybiBhbiBlcnJvciBpZiB0aGlzIGNvbmRpdGlvbiBpcwotICAgICAqIGZvdW5kLgotICAgICAqLwotICAgIGlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NUUkwpICYgMHgzRjA3KSA9PSAweDNGMDcpCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9SRVZFUlNFRF9DQUJMRTsKLSAgICAgICAgcmV0dXJuIEFEVl9FUlJPUjsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgY2FibGUgaXMgcmV2ZXJzZWQgYWxsIG9mIHRoZSBTQ1NJX0NUUkwgcmVnaXN0ZXIgc2lnbmFscworCSAqIHdpbGwgYmUgc2V0LiBDaGVjayBmb3IgYW5kIHJldHVybiBhbiBlcnJvciBpZiB0aGlzIGNvbmRpdGlvbiBpcworCSAqIGZvdW5kLgorCSAqLworCWlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19TQ1NJX0NUUkwpICYgMHgzRjA3KSA9PSAweDNGMDcpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfUkVWRVJTRURfQ0FCTEU7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQogCi0gICAgLyoKLSAgICAgKiBFYWNoIEFTQy0zOEMxNjAwIGZ1bmN0aW9uIGhhcyB0d28gY29ubmVjdG9ycy4gT25seSBhbiBIVkQgZGV2aWNlCi0gICAgICogY2FuIG5vdCBiZSBjb25uZWN0ZWQgdG8gZWl0aGVyIGNvbm5lY3Rvci4gQW4gTFZEIGRldmljZSBvciBTRSBkZXZpY2UKLSAgICAgKiBtYXkgYmUgY29ubmVjdGVkIHRvIGVpdGhlciBjb25uZWNvci4gSWYgYW4gU0UgZGV2aWNlIGlzIGNvbm5lY3RlZCwKLSAgICAgKiB0aGVuIGF0IG1vc3QgVWx0cmEgc3BlZWQgKDIwIE1oeikgY2FuIGJlIHVzZWQgb24gYm90aCBjb25uZWN0b3JzLgotICAgICAqCi0gICAgICogSWYgYW4gSFZEIGRldmljZSBpcyBhdHRhY2hlZCwgcmV0dXJuIGFuIGVycm9yLgotICAgICAqLwotICAgIGlmIChzY3NpX2NmZzEgJiBIVkQpCi0gICAgewotICAgICAgICBhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9IVkRfREVWSUNFOwotICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgIH0KKwkvKgorCSAqIEVhY2ggQVNDLTM4QzE2MDAgZnVuY3Rpb24gaGFzIHR3byBjb25uZWN0b3JzLiBPbmx5IGFuIEhWRCBkZXZpY2UKKwkgKiBjYW4gbm90IGJlIGNvbm5lY3RlZCB0byBlaXRoZXIgY29ubmVjdG9yLiBBbiBMVkQgZGV2aWNlIG9yIFNFIGRldmljZQorCSAqIG1heSBiZSBjb25uZWN0ZWQgdG8gZWl0aGVyIGNvbm5lY29yLiBJZiBhbiBTRSBkZXZpY2UgaXMgY29ubmVjdGVkLAorCSAqIHRoZW4gYXQgbW9zdCBVbHRyYSBzcGVlZCAoMjAgTWh6KSBjYW4gYmUgdXNlZCBvbiBib3RoIGNvbm5lY3RvcnMuCisJICoKKwkgKiBJZiBhbiBIVkQgZGV2aWNlIGlzIGF0dGFjaGVkLCByZXR1cm4gYW4gZXJyb3IuCisJICovCisJaWYgKHNjc2lfY2ZnMSAmIEhWRCkgeworCQlhc2NfZHZjLT5lcnJfY29kZSB8PSBBU0NfSUVSUl9IVkRfREVWSUNFOworCQlyZXR1cm4gQURWX0VSUk9SOworCX0KIAotICAgIC8qCi0gICAgICogRWFjaCBmdW5jdGlvbiBpbiB0aGUgQVNDLTM4QzE2MDAgdXNlcyBvbmx5IHRoZSBTRSBjYWJsZSBkZXRlY3QgYW5kCi0gICAgICogdGVybWluYXRpb24gYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGNvbm5lY3RvcnMgZm9yIGVhY2ggZnVuY3Rpb24uIEVhY2gKLSAgICAgKiBmdW5jdGlvbiBtYXkgdXNlIGVpdGhlciBMVkQgb3IgU0UgbW9kZS4gQ29ycmVzcG9uZGluZyB0aGUgU0UgYXV0b21hdGljCi0gICAgICogdGVybWluYXRpb24gY29udHJvbCBFRVBST00gYml0cyBhcmUgdXNlZCBmb3IgZWFjaCBmdW5jdGlvbi4gRWFjaAotICAgICAqIGZ1bmN0aW9uIGhhcyBpdHMgb3duIEVFUFJPTS4gSWYgU0UgYXV0b21hdGljIGNvbnRyb2wgaXMgZW5hYmxlZCBmb3IKLSAgICAgKiB0aGUgZnVuY3Rpb24sIHRoZW4gc2V0IHRoZSB0ZXJtaW5hdGlvbiB2YWx1ZSBiYXNlZCBvbiBhIHRhYmxlIGxpc3RlZAotICAgICAqIGluIGFfY29uZG9yLmguCi0gICAgICoKLSAgICAgKiBJZiBtYW51YWwgdGVybWluYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBFRVBST00gZm9yIHRoZSBmdW5jdGlvbiwKLSAgICAgKiB0aGVuICd0ZXJtaW5hdGlvbicgd2FzIHNldC11cCBpbiBBc2NJbml0RnJvbTM4QzE2MDBFRVBST00oKSBhbmQgaXMKLSAgICAgKiByZWFkeSB0byBiZSAnb3JlZCcgaW50byBTQ1NJX0NGRzEuCi0gICAgICovCi0gICAgaWYgKChhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9TRSkgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIFNFIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBjb250cm9sIGlzIGVuYWJsZWQuICovCi0gICAgICAgIHN3aXRjaChzY3NpX2NmZzEgJiBDX0RFVF9TRSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVEVSTV9TRV9ISTogb24sIFRFUk1fU0VfTE86IG9uICovCi0gICAgICAgICAgICBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgotICAgICAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkvKgorCSAqIEVhY2ggZnVuY3Rpb24gaW4gdGhlIEFTQy0zOEMxNjAwIHVzZXMgb25seSB0aGUgU0UgY2FibGUgZGV0ZWN0IGFuZAorCSAqIHRlcm1pbmF0aW9uIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBjb25uZWN0b3JzIGZvciBlYWNoIGZ1bmN0aW9uLiBFYWNoCisJICogZnVuY3Rpb24gbWF5IHVzZSBlaXRoZXIgTFZEIG9yIFNFIG1vZGUuIENvcnJlc3BvbmRpbmcgdGhlIFNFIGF1dG9tYXRpYworCSAqIHRlcm1pbmF0aW9uIGNvbnRyb2wgRUVQUk9NIGJpdHMgYXJlIHVzZWQgZm9yIGVhY2ggZnVuY3Rpb24uIEVhY2gKKwkgKiBmdW5jdGlvbiBoYXMgaXRzIG93biBFRVBST00uIElmIFNFIGF1dG9tYXRpYyBjb250cm9sIGlzIGVuYWJsZWQgZm9yCisJICogdGhlIGZ1bmN0aW9uLCB0aGVuIHNldCB0aGUgdGVybWluYXRpb24gdmFsdWUgYmFzZWQgb24gYSB0YWJsZSBsaXN0ZWQKKwkgKiBpbiBhX2NvbmRvci5oLgorCSAqCisJICogSWYgbWFudWFsIHRlcm1pbmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgRUVQUk9NIGZvciB0aGUgZnVuY3Rpb24sCisJICogdGhlbiAndGVybWluYXRpb24nIHdhcyBzZXQtdXAgaW4gQXNjSW5pdEZyb20zOEMxNjAwRUVQUk9NKCkgYW5kIGlzCisJICogcmVhZHkgdG8gYmUgJ29yZWQnIGludG8gU0NTSV9DRkcxLgorCSAqLworCWlmICgoYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fU0UpID09IDApIHsKKwkJLyogU0UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGNvbnRyb2wgaXMgZW5hYmxlZC4gKi8KKwkJc3dpdGNoIChzY3NpX2NmZzEgJiBDX0RFVF9TRSkgeworCQkJLyogVEVSTV9TRV9ISTogb24sIFRFUk1fU0VfTE86IG9uICovCisJCWNhc2UgMHgxOgorCQljYXNlIDB4MjoKKwkJY2FzZSAweDM6CisJCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uIHw9IFRFUk1fU0U7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSAweDA6Ci0gICAgICAgICAgICAgICAgaWYgKEFTQ19QQ0lfSUQyRlVOQyhhc2NfZHZjLT5jZmctPnBjaV9zbG90X2luZm8pID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiAwIC0gVEVSTV9TRV9ISTogb2ZmLCBURVJNX1NFX0xPOiBvZmYgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gMSAtIFRFUk1fU0VfSEk6IG9uLCBURVJNX1NFX0xPOiBvZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiB8PSBURVJNX1NFX0hJOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KKwkJY2FzZSAweDA6CisJCQlpZiAoQVNDX1BDSV9JRDJGVU5DKGFzY19kdmMtPmNmZy0+cGNpX3Nsb3RfaW5mbykgPT0gMCkgeworCQkJCS8qIEZ1bmN0aW9uIDAgLSBURVJNX1NFX0hJOiBvZmYsIFRFUk1fU0VfTE86IG9mZiAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBGdW5jdGlvbiAxIC0gVEVSTV9TRV9ISTogb24sIFRFUk1fU0VfTE86IG9mZiAqLworCQkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gfD0gVEVSTV9TRV9ISTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQogCi0gICAgLyoKLSAgICAgKiBDbGVhciBhbnkgc2V0IFRFUk1fU0UgYml0cy4KLSAgICAgKi8KLSAgICBzY3NpX2NmZzEgJj0gflRFUk1fU0U7CisJLyoKKwkgKiBDbGVhciBhbnkgc2V0IFRFUk1fU0UgYml0cy4KKwkgKi8KKwlzY3NpX2NmZzEgJj0gflRFUk1fU0U7CiAKLSAgICAvKgotICAgICAqIEludmVydCB0aGUgVEVSTV9TRSBiaXRzIGFuZCB0aGVuIHNldCAnc2NzaV9jZmcxJy4KLSAgICAgKi8KLSAgICBzY3NpX2NmZzEgfD0gKH5hc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uICYgVEVSTV9TRSk7CisJLyoKKwkgKiBJbnZlcnQgdGhlIFRFUk1fU0UgYml0cyBhbmQgdGhlbiBzZXQgJ3Njc2lfY2ZnMScuCisJICovCisJc2NzaV9jZmcxIHw9ICh+YXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiAmIFRFUk1fU0UpOwogCi0gICAgLyoKLSAgICAgKiBDbGVhciBCaWcgRW5kaWFuIGFuZCBUZXJtaW5hdG9yIFBvbGFyaXR5IGJpdHMgYW5kIHNldCBwb3NzaWJseQotICAgICAqIG1vZGlmaWVkIHRlcm1pbmF0aW9uIGNvbnRyb2wgYml0cyBpbiB0aGUgTWljcm9jb2RlIFNDU0lfQ0ZHMQotICAgICAqIFJlZ2lzdGVyIFZhbHVlLgotICAgICAqCi0gICAgICogQmlnIEVuZGlhbiBiaXQgaXMgbm90IHVzZWQgZXZlbiBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgotICAgICAqLwotICAgIHNjc2lfY2ZnMSAmPSAofkJJR19FTkRJQU4gJiB+RElTX1RFUk1fRFJWICYgflRFUk1fUE9MKTsKKwkvKgorCSAqIENsZWFyIEJpZyBFbmRpYW4gYW5kIFRlcm1pbmF0b3IgUG9sYXJpdHkgYml0cyBhbmQgc2V0IHBvc3NpYmx5CisJICogbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbCBiaXRzIGluIHRoZSBNaWNyb2NvZGUgU0NTSV9DRkcxCisJICogUmVnaXN0ZXIgVmFsdWUuCisJICoKKwkgKiBCaWcgRW5kaWFuIGJpdCBpcyBub3QgdXNlZCBldmVuIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMuCisJICovCisJc2NzaV9jZmcxICY9ICh+QklHX0VORElBTiAmIH5ESVNfVEVSTV9EUlYgJiB+VEVSTV9QT0wpOwogCi0gICAgLyoKLSAgICAgKiBTZXQgU0NTSV9DRkcxIE1pY3JvY29kZSBEZWZhdWx0IFZhbHVlCi0gICAgICoKLSAgICAgKiBTZXQgcG9zc2libHkgbW9kaWZpZWQgdGVybWluYXRpb24gY29udHJvbCBiaXRzIGluIHRoZSBNaWNyb2NvZGUKLSAgICAgKiBTQ1NJX0NGRzEgUmVnaXN0ZXIgVmFsdWUuCi0gICAgICoKLSAgICAgKiBUaGUgbWljcm9jb2RlIHdpbGwgc2V0IHRoZSBTQ1NJX0NGRzEgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0NTSV9DRkcxLCBzY3NpX2NmZzEpOworCS8qCisJICogU2V0IFNDU0lfQ0ZHMSBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogU2V0IHBvc3NpYmx5IG1vZGlmaWVkIHRlcm1pbmF0aW9uIGNvbnRyb2wgYml0cyBpbiB0aGUgTWljcm9jb2RlCisJICogU0NTSV9DRkcxIFJlZ2lzdGVyIFZhbHVlLgorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0NTSV9DRkcxIHJlZ2lzdGVyIHVzaW5nIHRoaXMgdmFsdWUKKwkgKiBhZnRlciBpdCBpcyBzdGFydGVkIGJlbG93LgorCSAqLworCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX1NDU0lfQ0ZHMSwgc2NzaV9jZmcxKTsKIAotICAgIC8qCi0gICAgICogU2V0IE1FTV9DRkcgTWljcm9jb2RlIERlZmF1bHQgVmFsdWUKLSAgICAgKgotICAgICAqIFRoZSBtaWNyb2NvZGUgd2lsbCBzZXQgdGhlIE1FTV9DRkcgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICoKLSAgICAgKiBNRU1fQ0ZHIG1heSBiZSBhY2Nlc3NlZCBhcyBhIHdvcmQgb3IgYnl0ZSwgYnV0IG9ubHkgYml0cyAwLTcKLSAgICAgKiBhcmUgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEFTQy0zOEMxNjAwIGhhcyAzMktCIGludGVybmFsIG1lbW9yeS4KLSAgICAgKgotICAgICAqIFhYWCAtIFNpbmNlIEFTQzM4QzE2MDAgUmV2LjMgaGFzIGEgTG9jYWwgUkFNIGZhaWx1cmUgaXNzdWUsIHdlIGNvbWUKLSAgICAgKiBvdXQgYSBzcGVjaWFsIDE2SyBBZHYgTGlicmFyeSBhbmQgTWljcm9jb2RlIHZlcnNpb24uIEFmdGVyIHRoZSBpc3N1ZQotICAgICAqIHJlc29sdmVkLCB3ZSBzaG91bGQgdHVybiBiYWNrIHRvIHRoZSAzMksgc3VwcG9ydC4gQm90aCBhX2NvbmRvci5oIGFuZAotICAgICAqIG1jb2RlLnNhcyBmaWxlcyBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KLSAgICAgKgotICAgICAqIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX01FTV9DRkcsCi0gICAgICogIEJJT1NfRU4gfCBSQU1fU1pfMzJLQik7Ci0gICAgICovCi0gICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19ERUZBVUxUX01FTV9DRkcsIEJJT1NfRU4gfCBSQU1fU1pfMTZLQik7CisJLyoKKwkgKiBTZXQgTUVNX0NGRyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgTUVNX0NGRyByZWdpc3RlciB1c2luZyB0aGlzIHZhbHVlCisJICogYWZ0ZXIgaXQgaXMgc3RhcnRlZCBiZWxvdy4KKwkgKgorCSAqIE1FTV9DRkcgbWF5IGJlIGFjY2Vzc2VkIGFzIGEgd29yZCBvciBieXRlLCBidXQgb25seSBiaXRzIDAtNworCSAqIGFyZSBkZWZpbmVkLgorCSAqCisJICogQVNDLTM4QzE2MDAgaGFzIDMyS0IgaW50ZXJuYWwgbWVtb3J5LgorCSAqCisJICogWFhYIC0gU2luY2UgQVNDMzhDMTYwMCBSZXYuMyBoYXMgYSBMb2NhbCBSQU0gZmFpbHVyZSBpc3N1ZSwgd2UgY29tZQorCSAqIG91dCBhIHNwZWNpYWwgMTZLIEFkdiBMaWJyYXJ5IGFuZCBNaWNyb2NvZGUgdmVyc2lvbi4gQWZ0ZXIgdGhlIGlzc3VlCisJICogcmVzb2x2ZWQsIHdlIHNob3VsZCB0dXJuIGJhY2sgdG8gdGhlIDMySyBzdXBwb3J0LiBCb3RoIGFfY29uZG9yLmggYW5kCisJICogbWNvZGUuc2FzIGZpbGVzIGFsc28gbmVlZCB0byBiZSB1cGRhdGVkLgorCSAqCisJICogQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfTUVNX0NGRywKKwkgKiAgQklPU19FTiB8IFJBTV9TWl8zMktCKTsKKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfREVGQVVMVF9NRU1fQ0ZHLAorCQkJIEJJT1NfRU4gfCBSQU1fU1pfMTZLQik7CiAKLSAgICAvKgotICAgICAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQotICAgICAqCi0gICAgICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQotICAgICAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCi0gICAgICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjLT5jaGlwX3Njc2lfaWQpKTsKKwkvKgorCSAqIFNldCBTRUxfTUFTSyBNaWNyb2NvZGUgRGVmYXVsdCBWYWx1ZQorCSAqCisJICogVGhlIG1pY3JvY29kZSB3aWxsIHNldCB0aGUgU0VMX01BU0sgcmVnaXN0ZXIgdXNpbmcgdGhpcyB2YWx1ZQorCSAqIGFmdGVyIGl0IGlzIHN0YXJ0ZWQgYmVsb3cuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0RFRkFVTFRfU0VMX01BU0ssCisJCQkgQURWX1RJRF9UT19USURNQVNLKGFzY19kdmMtPmNoaXBfc2NzaV9pZCkpOwogCi0gICAgLyoKLSAgICAgKiBCdWlsZCB0aGUgY2FycmllciBmcmVlbGlzdC4KLSAgICAgKgotICAgICAqIERyaXZlciBtdXN0IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBzZXQgJ2NhcnJpZXJfYnVmJy4KLSAgICAgKi8KKwkvKgorCSAqIEJ1aWxkIHRoZSBjYXJyaWVyIGZyZWVsaXN0LgorCSAqCisJICogRHJpdmVyIG11c3QgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCAnY2Fycmllcl9idWYnLgorCSAqLwogCi0gICAgQVNDX0FTU0VSVChhc2NfZHZjLT5jYXJyaWVyX2J1ZiAhPSBOVUxMKTsKKwlBU0NfQVNTRVJUKGFzY19kdmMtPmNhcnJpZXJfYnVmICE9IE5VTEwpOwogCi0gICAgY2FycnAgPSAoQURWX0NBUlJfVCAqKSBBRFZfMTZCQUxJR04oYXNjX2R2Yy0+Y2Fycmllcl9idWYpOwotICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBOVUxMOwotICAgIGlmIChjYXJycCA9PSAoQURWX0NBUlJfVCAqKSBhc2NfZHZjLT5jYXJyaWVyX2J1ZikKLSAgICB7Ci0gICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIGJ1Zl9zaXplID0gQURWX0NBUlJJRVJfQlVGU0laRSAtIHNpemVvZihBRFZfQ0FSUl9UKTsKLSAgICB9CisJY2FycnAgPSAoQURWX0NBUlJfVCAqKSBBRFZfMTZCQUxJR04oYXNjX2R2Yy0+Y2Fycmllcl9idWYpOworCWFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBOVUxMOworCWlmIChjYXJycCA9PSAoQURWX0NBUlJfVCAqKSBhc2NfZHZjLT5jYXJyaWVyX2J1ZikgeworCQlidWZfc2l6ZSA9IEFEVl9DQVJSSUVSX0JVRlNJWkU7CisJfSBlbHNlIHsKKwkJYnVmX3NpemUgPSBBRFZfQ0FSUklFUl9CVUZTSVpFIC0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCX0KIAotICAgIGRvIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBjYXJyaWVyICdjYXJycCcuCi0gICAgICAgICAqLwotICAgICAgICBjb250aWdfbGVuID0gc2l6ZW9mKEFEVl9DQVJSX1QpOwotICAgICAgICBjYXJyX3BhZGRyID0gY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcihhc2NfZHZjLCBOVUxMLCAodWNoYXIgKikgY2FycnAsCi0gICAgICAgICAgICAoQURWX1NEQ05UICopICZjb250aWdfbGVuLCBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CisJZG8geworCQkvKgorCQkgKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIGNhcnJpZXIgJ2NhcnJwJy4KKwkJICovCisJCWNvbnRpZ19sZW4gPSBzaXplb2YoQURWX0NBUlJfVCk7CisJCWNhcnJfcGFkZHIgPQorCQkgICAgY3B1X3RvX2xlMzIoRHZjR2V0UGh5QWRkcgorCQkJCShhc2NfZHZjLCBOVUxMLCAodWNoYXIgKiljYXJycCwKKwkJCQkgKEFEVl9TRENOVCAqKSZjb250aWdfbGVuLAorCQkJCSBBRFZfSVNfQ0FSUklFUl9GTEFHKSk7CiAKLSAgICAgICAgYnVmX3NpemUgLT0gc2l6ZW9mKEFEVl9DQVJSX1QpOworCQlidWZfc2l6ZSAtPSBzaXplb2YoQURWX0NBUlJfVCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIGN1cnJlbnQgY2FycmllciBpcyBub3QgcGh5c2ljYWxseSBjb250aWd1b3VzLCB0aGVuCi0gICAgICAgICAqIG1heWJlIHRoZXJlIHdhcyBhIHBhZ2UgY3Jvc3NpbmcuIFRyeSB0aGUgbmV4dCBjYXJyaWVyIGFsaWduZWQKLSAgICAgICAgICogc3RhcnQgYWRkcmVzcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChjb250aWdfbGVuIDwgc2l6ZW9mKEFEVl9DQVJSX1QpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXJycCsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgY2FycmllciBpcyBub3QgcGh5c2ljYWxseSBjb250aWd1b3VzLCB0aGVuCisJCSAqIG1heWJlIHRoZXJlIHdhcyBhIHBhZ2UgY3Jvc3NpbmcuIFRyeSB0aGUgbmV4dCBjYXJyaWVyIGFsaWduZWQKKwkJICogc3RhcnQgYWRkcmVzcy4KKwkJICovCisJCWlmIChjb250aWdfbGVuIDwgc2l6ZW9mKEFEVl9DQVJSX1QpKSB7CisJCQljYXJycCsrOworCQkJY29udGludWU7CisJCX0KIAotICAgICAgICBjYXJycC0+Y2Fycl9wYSA9IGNhcnJfcGFkZHI7Ci0gICAgICAgIGNhcnJwLT5jYXJyX3ZhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihjYXJycCkpOworCQljYXJycC0+Y2Fycl9wYSA9IGNhcnJfcGFkZHI7CisJCWNhcnJwLT5jYXJyX3ZhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihjYXJycCkpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluc2VydCB0aGUgY2FycmllciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmVlbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIGNhcnJwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFEVl9WQUREUl9UT19VMzIoYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkpOwotICAgICAgICBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0ID0gY2FycnA7CisJCS8qCisJCSAqIEluc2VydCB0aGUgY2FycmllciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmVlbGlzdC4KKwkJICovCisJCWNhcnJwLT5uZXh0X3ZwYSA9CisJCSAgICBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKKwkJYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGNhcnJwOwogCi0gICAgICAgIGNhcnJwKys7Ci0gICAgfQotICAgIHdoaWxlIChidWZfc2l6ZSA+IDApOworCQljYXJycCsrOworCX0KKwl3aGlsZSAoYnVmX3NpemUgPiAwKTsKIAotICAgIC8qCi0gICAgICogU2V0LXVwIHRoZSBIb3N0LT5SSVNDIEluaXRpYXRvciBDb21tYW5kIFF1ZXVlIChJQ1EpLgotICAgICAqLwotICAgIGlmICgoYXNjX2R2Yy0+aWNxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQotICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQotICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEpKTsKKwkvKgorCSAqIFNldC11cCB0aGUgSG9zdC0+UklTQyBJbml0aWF0b3IgQ29tbWFuZCBRdWV1ZSAoSUNRKS4KKwkgKi8KKwlpZiAoKGFzY19kdmMtPmljcV9zcCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpIHsKKwkJYXNjX2R2Yy0+ZXJyX2NvZGUgfD0gQVNDX0lFUlJfTk9fQ0FSUklFUjsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CisJYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IChBRFZfQ0FSUl9UICopCisJICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUoYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSkpOwogCi0gICAgLyoKLSAgICAgKiBUaGUgZmlyc3QgY29tbWFuZCBpc3N1ZWQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIHN0b3BwZXIgY2Fycmllci4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5pY3Ffc3AtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOworCS8qCisJICogVGhlIGZpcnN0IGNvbW1hbmQgaXNzdWVkIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBzdG9wcGVyIGNhcnJpZXIuCisJICovCisJYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKIAotICAgIC8qCi0gICAgICogU2V0IFJJU0MgSUNRIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgdmFsdWUuIEluaXRpYWxpemUgdGhlCi0gICAgICogQ09NTUEgcmVnaXN0ZXIgdG8gdGhlIHNhbWUgdmFsdWUgb3RoZXJ3aXNlIHRoZSBSSVNDIHdpbGwKLSAgICAgKiBwcmVtYXR1cmVseSBkZXRlY3QgYSBjb21tYW5kIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lDUSwgYXNjX2R2Yy0+aWNxX3NwLT5jYXJyX3BhKTsKLSAgICBBZHZXcml0ZURXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUERXX0NPTU1BLAotICAgICAgICBsZTMyX3RvX2NwdShhc2NfZHZjLT5pY3Ffc3AtPmNhcnJfcGEpKTsKKwkvKgorCSAqIFNldCBSSVNDIElDUSBwaHlzaWNhbCBhZGRyZXNzIHN0YXJ0IHZhbHVlLiBJbml0aWFsaXplIHRoZQorCSAqIENPTU1BIHJlZ2lzdGVyIHRvIHRoZSBzYW1lIHZhbHVlIG90aGVyd2lzZSB0aGUgUklTQyB3aWxsCisJICogcHJlbWF0dXJlbHkgZGV0ZWN0IGEgY29tbWFuZCBpcyBhdmFpbGFibGUuCisJICovCisJQWR2V3JpdGVEV29yZExyYW1Ob1N3YXAoaW9wX2Jhc2UsIEFTQ19NQ19JQ1EsIGFzY19kdmMtPmljcV9zcC0+Y2Fycl9wYSk7CisJQWR2V3JpdGVEV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BEV19DT01NQSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KGFzY19kdmMtPmljcV9zcC0+Y2Fycl9wYSkpOwogCi0gICAgLyoKLSAgICAgKiBTZXQtdXAgdGhlIFJJU0MtPkhvc3QgSW5pdGlhdG9yIFJlc3BvbnNlIFF1ZXVlIChJUlEpLgotICAgICAqLwotICAgIGlmICgoYXNjX2R2Yy0+aXJxX3NwID0gYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7Ci0gICAgICAgIHJldHVybiBBRFZfRVJST1I7Ci0gICAgfQotICAgIGFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQotICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEpKTsKKwkvKgorCSAqIFNldC11cCB0aGUgUklTQy0+SG9zdCBJbml0aWF0b3IgUmVzcG9uc2UgUXVldWUgKElSUSkuCisJICovCisJaWYgKChhc2NfZHZjLT5pcnFfc3AgPSBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSA9PSBOVUxMKSB7CisJCWFzY19kdmMtPmVycl9jb2RlIHw9IEFTQ19JRVJSX05PX0NBUlJJRVI7CisJCXJldHVybiBBRFZfRVJST1I7CisJfQorCWFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorCSAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEpKTsKIAotICAgIC8qCi0gICAgICogVGhlIGZpcnN0IGNvbW1hbmQgY29tcGxldGVkIGJ5IHRoZSBSSVNDIHdpbGwgYmUgcGxhY2VkIGluCi0gICAgICogdGhlIHN0b3BwZXIuCi0gICAgICoKLSAgICAgKiBOb3RlOiBTZXQgJ25leHRfdnBhJyB0byBBU0NfQ1FfU1RPUFBFUi4gV2hlbiB0aGUgcmVxdWVzdCBpcwotICAgICAqIGNvbXBsZXRlZCB0aGUgUklTQyB3aWxsIHNldCB0aGUgQVNDX1JRX1NUT1BQRVIgYml0LgotICAgICAqLwotICAgIGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisJLyoKKwkgKiBUaGUgZmlyc3QgY29tbWFuZCBjb21wbGV0ZWQgYnkgdGhlIFJJU0Mgd2lsbCBiZSBwbGFjZWQgaW4KKwkgKiB0aGUgc3RvcHBlci4KKwkgKgorCSAqIE5vdGU6IFNldCAnbmV4dF92cGEnIHRvIEFTQ19DUV9TVE9QUEVSLiBXaGVuIHRoZSByZXF1ZXN0IGlzCisJICogY29tcGxldGVkIHRoZSBSSVNDIHdpbGwgc2V0IHRoZSBBU0NfUlFfU1RPUFBFUiBiaXQuCisJICovCisJYXNjX2R2Yy0+aXJxX3NwLT5uZXh0X3ZwYSA9IGNwdV90b19sZTMyKEFTQ19DUV9TVE9QUEVSKTsKIAotICAgIC8qCi0gICAgICogU2V0IFJJU0MgSVJRIHBoeXNpY2FsIGFkZHJlc3Mgc3RhcnQgdmFsdWUuCi0gICAgICovCi0gICAgQWR2V3JpdGVEV29yZExyYW1Ob1N3YXAoaW9wX2Jhc2UsIEFTQ19NQ19JUlEsIGFzY19kdmMtPmlycV9zcC0+Y2Fycl9wYSk7Ci0gICAgYXNjX2R2Yy0+Y2Fycl9wZW5kaW5nX2NudCA9IDA7CisJLyoKKwkgKiBTZXQgUklTQyBJUlEgcGh5c2ljYWwgYWRkcmVzcyBzdGFydCB2YWx1ZS4KKwkgKi8KKwlBZHZXcml0ZURXb3JkTHJhbU5vU3dhcChpb3BfYmFzZSwgQVNDX01DX0lSUSwgYXNjX2R2Yy0+aXJxX3NwLT5jYXJyX3BhKTsKKwlhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ID0gMDsKIAotICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfRU5BQkxFUywKLSAgICAgICAgKEFEVl9JTlRSX0VOQUJMRV9IT1NUX0lOVFIgfCBBRFZfSU5UUl9FTkFCTEVfR0xPQkFMX0lOVFIpKTsKLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19DT0RFX0JFR0lOX0FERFIsIHdvcmQpOwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1BDLCB3b3JkKTsKKwlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9JTlRSX0VOQUJMRVMsCisJCQkgICAgIChBRFZfSU5UUl9FTkFCTEVfSE9TVF9JTlRSIHwKKwkJCSAgICAgIEFEVl9JTlRSX0VOQUJMRV9HTE9CQUxfSU5UUikpOworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0NPREVfQkVHSU5fQUREUiwgd29yZCk7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUEMsIHdvcmQpOwogCi0gICAgLyogZmluYWxseSwgZmluYWxseSwgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZSAqLwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfUlVOKTsKKwkvKiBmaW5hbGx5LCBmaW5hbGx5LCBnZW50bGVtZW4sIHN0YXJ0IHlvdXIgZW5naW5lICovCisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfUklTQ19DU1IsIEFEVl9SSVNDX0NTUl9SVU4pOwogCi0gICAgLyoKLSAgICAgKiBSZXNldCB0aGUgU0NTSSBCdXMgaWYgdGhlIEVFUFJPTSBpbmRpY2F0ZXMgdGhhdCBTQ1NJIEJ1cwotICAgICAqIFJlc2V0cyBzaG91bGQgYmUgcGVyZm9ybWVkLiBUaGUgUklTQyBoYXMgdG8gYmUgcnVubmluZwotICAgICAqIHRvIGlzc3VlIGEgU0NTSSBCdXMgUmVzZXQuCi0gICAgICovCi0gICAgaWYgKGFzY19kdmMtPmJpb3NfY3RybCAmIEJJT1NfQ1RSTF9SRVNFVF9TQ1NJX0JVUykKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZSBCSU9TIFNpZ25hdHVyZSBpcyBwcmVzZW50IGluIG1lbW9yeSwgcmVzdG9yZSB0aGUKLSAgICAgICAgICogcGVyIFRJRCBtaWNyb2NvZGUgb3BlcmF0aW5nIHZhcmlhYmxlcy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChiaW9zX21lbVsoQVNDX01DX0JJT1NfU0lHTkFUVVJFIC0gQVNDX01DX0JJT1NNRU0pLzJdID09IDB4NTVBQSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJlc3RvcmUgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKLSAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7Ci0gICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfUFBSX0FCTEUsIHBwcl9hYmxlKTsKLSAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19UQUdRTkdfQUJMRSwgdGFncW5nX2FibGUpOwotICAgICAgICAgICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQVNDX01BWF9USUQ7IHRpZCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkdldyaXRlQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgbWF4X2NtZFt0aWRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChBZHZSZXNldFNCKGFzY19kdmMpICE9IEFEVl9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdhcm5fY29kZSA9IEFTQ19XQVJOX0JVU1JFU0VUX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogUmVzZXQgdGhlIFNDU0kgQnVzIGlmIHRoZSBFRVBST00gaW5kaWNhdGVzIHRoYXQgU0NTSSBCdXMKKwkgKiBSZXNldHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIFJJU0MgaGFzIHRvIGJlIHJ1bm5pbmcKKwkgKiB0byBpc3N1ZSBhIFNDU0kgQnVzIFJlc2V0LgorCSAqLworCWlmIChhc2NfZHZjLT5iaW9zX2N0cmwgJiBCSU9TX0NUUkxfUkVTRVRfU0NTSV9CVVMpIHsKKwkJLyoKKwkJICogSWYgdGhlIEJJT1MgU2lnbmF0dXJlIGlzIHByZXNlbnQgaW4gbWVtb3J5LCByZXN0b3JlIHRoZQorCQkgKiBwZXIgVElEIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzLgorCQkgKi8KKwkJaWYgKGJpb3NfbWVtWyhBU0NfTUNfQklPU19TSUdOQVRVUkUgLSBBU0NfTUNfQklPU01FTSkgLyAyXSA9PQorCQkgICAgMHg1NUFBKSB7CisJCQkvKgorCQkJICogUmVzdG9yZSBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorCQkJICovCisJCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCB3ZHRyX2FibGUpOworCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKKwkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgcHByX2FibGUpOworCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLAorCQkJCQkgdGFncW5nX2FibGUpOworCQkJZm9yICh0aWQgPSAwOyB0aWQgPD0gQVNDX01BWF9USUQ7IHRpZCsrKSB7CisJCQkJQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwKKwkJCQkJCSBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCisJCQkJCQkgbWF4X2NtZFt0aWRdKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChBZHZSZXNldFNCKGFzY19kdmMpICE9IEFEVl9UUlVFKSB7CisJCQkJd2Fybl9jb2RlID0gQVNDX1dBUk5fQlVTUkVTRVRfRVJST1I7CisJCQl9CisJCX0KKwl9CiAKLSAgICByZXR1cm4gd2Fybl9jb2RlOworCXJldHVybiB3YXJuX2NvZGU7CiB9CiAKIC8qCkBAIC0xNjM3OCwxNjQgKzE2MTM1LDE0NiBAQAogICoKICAqIE5vdGU6IENoaXAgaXMgc3RvcHBlZCBvbiBlbnRyeS4KICAqLwotU1RBVElDIGludCBfX2luaXQKLUFkdkluaXRGcm9tMzU1MEVFUChBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3N0YXRpYyBpbnQgX19pbml0IEFkdkluaXRGcm9tMzU1MEVFUChBRFZfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBBZHZQb3J0QWRkciAgICAgICAgIGlvcF9iYXNlOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgd2Fybl9jb2RlOwotICAgIEFEVkVFUF8zNTUwX0NPTkZJRyAgZWVwX2NvbmZpZzsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisJQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IHdhcm5fY29kZTsKKwlBRFZFRVBfMzU1MF9DT05GSUcgZWVwX2NvbmZpZzsKKwlpbnQgaTsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKIAotICAgIHdhcm5fY29kZSA9IDA7CisJd2Fybl9jb2RlID0gMDsKIAotICAgIC8qCi0gICAgICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBhIGJhZCBjaGVja3N1bSBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBpZiAoQWR2R2V0MzU1MEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpICE9IGVlcF9jb25maWcuY2hlY2tfc3VtKQotICAgIHsKLSAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9DSEtTVU07CisJLyoKKwkgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorCSAqCisJICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorCSAqLworCWlmIChBZHZHZXQzNTUwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0gZWVwX2NvbmZpZy5jaGVja19zdW0pIHsKKwkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9DSEtTVU07CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IEVFUFJPTSBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoQURWRUVQXzM1NTBfQ09ORklHKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAqKCh1Y2hhciAqKSAmZWVwX2NvbmZpZyArIGkpID0KLSAgICAgICAgICAgICAgICAqKCh1Y2hhciAqKSAmRGVmYXVsdF8zNTUwX0VFUFJPTV9Db25maWcgKyBpKTsKLSAgICAgICAgfQorCQkvKgorCQkgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzU1MF9DT05GSUcpOyBpKyspIHsKKwkJCSooKHVjaGFyICopJmVlcF9jb25maWcgKyBpKSA9CisJCQkgICAgKigodWNoYXIgKikmRGVmYXVsdF8zNTUwX0VFUFJPTV9Db25maWcgKyBpKTsKKwkJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFzc3VtZSB0aGUgNiBieXRlIGJvYXJkIHNlcmlhbCBudW1iZXIgdGhhdCB3YXMgcmVhZAotICAgICAgICAgKiBmcm9tIEVFUFJPTSBpcyBjb3JyZWN0IGV2ZW4gaWYgdGhlIEVFUFJPTSBjaGVja3N1bQotICAgICAgICAgKiBmYWlsZWQuCi0gICAgICAgICAqLwotICAgICAgICBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDMgPQotICAgICAgICAgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAxKTsKKwkJLyoKKwkJICogQXNzdW1lIHRoZSA2IGJ5dGUgYm9hcmQgc2VyaWFsIG51bWJlciB0aGF0IHdhcyByZWFkCisJCSAqIGZyb20gRUVQUk9NIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgRUVQUk9NIGNoZWNrc3VtCisJCSAqIGZhaWxlZC4KKwkJICovCisJCWVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMyA9CisJCSAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDEpOwogCi0gICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMiA9Ci0gICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDIpOworCQllZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDIgPQorCQkgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAyKTsKIAotICAgICAgICBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDEgPQotICAgICAgICAgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAzKTsKKwkJZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKwkJICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMyk7CiAKLSAgICAgICAgQWR2U2V0MzU1MEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpOwotICAgIH0KLSAgICAvKgotICAgICAqIFNldCBBU0NfRFZDX1ZBUiBhbmQgQVNDX0RWQ19DRkcgdmFyaWFibGVzIGZyb20gdGhlCi0gICAgICogRUVQUk9NIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcmVhZC4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgdGhlIG1hcHBpbmcgb2YgRUVQUk9NIGZpZWxkcyB0byBBZHYgTGlicmFyeSBmaWVsZHMuCi0gICAgICovCi0gICAgYXNjX2R2Yy0+d2R0cl9hYmxlID0gZWVwX2NvbmZpZy53ZHRyX2FibGU7Ci0gICAgYXNjX2R2Yy0+c2R0cl9hYmxlID0gZWVwX2NvbmZpZy5zZHRyX2FibGU7Ci0gICAgYXNjX2R2Yy0+dWx0cmFfYWJsZSA9IGVlcF9jb25maWcudWx0cmFfYWJsZTsKLSAgICBhc2NfZHZjLT50YWdxbmdfYWJsZSA9IGVlcF9jb25maWcudGFncW5nX2FibGU7Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSA9IGVlcF9jb25maWcuZGlzY19lbmFibGU7Ci0gICAgYXNjX2R2Yy0+bWF4X2hvc3RfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7Ci0gICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9kdmNfcW5nOwotICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCA9IChlZXBfY29uZmlnLmFkYXB0ZXJfc2NzaV9pZCAmIEFEVl9NQVhfVElEKTsKLSAgICBhc2NfZHZjLT5zdGFydF9tb3RvciA9IGVlcF9jb25maWcuc3RhcnRfbW90b3I7Ci0gICAgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID0gZWVwX2NvbmZpZy5zY3NpX3Jlc2V0X2RlbGF5OwotICAgIGFzY19kdmMtPmJpb3NfY3RybCA9IGVlcF9jb25maWcuYmlvc19jdHJsOwotICAgIGFzY19kdmMtPm5vX3NjYW0gPSBlZXBfY29uZmlnLnNjYW1fdG9sZXJhbnQ7Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwxID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxOwotICAgIGFzY19kdmMtPmNmZy0+c2VyaWFsMiA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMjsKLSAgICBhc2NfZHZjLT5jZmctPnNlcmlhbDMgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDM7CisJCUFkdlNldDM1NTBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKKwl9CisJLyoKKwkgKiBTZXQgQVNDX0RWQ19WQVIgYW5kIEFTQ19EVkNfQ0ZHIHZhcmlhYmxlcyBmcm9tIHRoZQorCSAqIEVFUFJPTSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHJlYWQuCisJICoKKwkgKiBUaGlzIGlzIHRoZSBtYXBwaW5nIG9mIEVFUFJPTSBmaWVsZHMgdG8gQWR2IExpYnJhcnkgZmllbGRzLgorCSAqLworCWFzY19kdmMtPndkdHJfYWJsZSA9IGVlcF9jb25maWcud2R0cl9hYmxlOworCWFzY19kdmMtPnNkdHJfYWJsZSA9IGVlcF9jb25maWcuc2R0cl9hYmxlOworCWFzY19kdmMtPnVsdHJhX2FibGUgPSBlZXBfY29uZmlnLnVsdHJhX2FibGU7CisJYXNjX2R2Yy0+dGFncW5nX2FibGUgPSBlZXBfY29uZmlnLnRhZ3FuZ19hYmxlOworCWFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLmRpc2NfZW5hYmxlOworCWFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworCWFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKwlhc2NfZHZjLT5jaGlwX3Njc2lfaWQgPSAoZWVwX2NvbmZpZy5hZGFwdGVyX3Njc2lfaWQgJiBBRFZfTUFYX1RJRCk7CisJYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBlZXBfY29uZmlnLnN0YXJ0X21vdG9yOworCWFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IGVlcF9jb25maWcuc2NzaV9yZXNldF9kZWxheTsKKwlhc2NfZHZjLT5iaW9zX2N0cmwgPSBlZXBfY29uZmlnLmJpb3NfY3RybDsKKwlhc2NfZHZjLT5ub19zY2FtID0gZWVwX2NvbmZpZy5zY2FtX3RvbGVyYW50OworCWFzY19kdmMtPmNmZy0+c2VyaWFsMSA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMTsKKwlhc2NfZHZjLT5jZmctPnNlcmlhbDIgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDI7CisJYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwzID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQzOwogCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGhvc3QgbWF4aW11bSBxdWV1aW5nIChtYXguIDI1MywgbWluLiAxNikgYW5kIHRoZSBwZXIgZGV2aWNlCi0gICAgICogbWF4aW11bSBxdWV1aW5nIChtYXguIDYzLCBtaW4uIDQpLgotICAgICAqLwotICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA+IEFTQ19ERUZfTUFYX0hPU1RfUU5HKQotICAgIHsKLSAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKLSAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nIDwgQVNDX0RFRl9NSU5fSE9TVF9RTkcpCi0gICAgewotICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCi0gICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01JTl9IT1NUX1FORzsKLSAgICAgICAgfQotICAgIH0KKwkvKgorCSAqIFNldCB0aGUgaG9zdCBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gMjUzLCBtaW4uIDE2KSBhbmQgdGhlIHBlciBkZXZpY2UKKwkgKiBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gNjMsIG1pbi4gNCkuCisJICovCisJaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID4gQVNDX0RFRl9NQVhfSE9TVF9RTkcpIHsKKwkJZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKwl9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nIDwgQVNDX0RFRl9NSU5fSE9TVF9RTkcpIHsKKwkJLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworCQlpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPT0gMCkgeworCQkJZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKwkJfSBlbHNlIHsKKwkJCWVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NSU5fSE9TVF9RTkc7CisJCX0KKwl9CiAKLSAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IEFTQ19ERUZfTUFYX0RWQ19RTkcpCi0gICAgewotICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKLSAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPCBBU0NfREVGX01JTl9EVkNfUU5HKQotICAgIHsKLSAgICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLwotICAgICAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01JTl9EVkNfUU5HOwotICAgICAgICB9Ci0gICAgfQorCWlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gQVNDX0RFRl9NQVhfRFZDX1FORykgeworCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKwl9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPCBBU0NfREVGX01JTl9EVkNfUU5HKSB7CisJCS8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KKwkJaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPT0gMCkgeworCQkJZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUFYX0RWQ19RTkc7CisJCX0gZWxzZSB7CisJCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NSU5fRFZDX1FORzsKKwkJfQorCX0KIAotICAgIC8qCi0gICAgICogSWYgJ21heF9kdmNfcW5nJyBpcyBncmVhdGVyIHRoYW4gJ21heF9ob3N0X3FuZycsIHRoZW4KLSAgICAgKiBzZXQgJ21heF9kdmNfcW5nJyB0byAnbWF4X2hvc3RfcW5nJy4KLSAgICAgKi8KLSAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IGVlcF9jb25maWcubWF4X2hvc3RfcW5nKQotICAgIHsKLSAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOwotICAgIH0KKwkvKgorCSAqIElmICdtYXhfZHZjX3FuZycgaXMgZ3JlYXRlciB0aGFuICdtYXhfaG9zdF9xbmcnLCB0aGVuCisJICogc2V0ICdtYXhfZHZjX3FuZycgdG8gJ21heF9ob3N0X3FuZycuCisJICovCisJaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBlZXBfY29uZmlnLm1heF9ob3N0X3FuZykgeworCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisJfQogCi0gICAgLyoKLSAgICAgKiBTZXQgQURWX0RWQ19WQVIgJ21heF9ob3N0X3FuZycgYW5kIEFEVl9EVkNfVkFSICdtYXhfZHZjX3FuZycKLSAgICAgKiB2YWx1ZXMgYmFzZWQgb24gcG9zc2libHkgYWRqdXN0ZWQgRUVQUk9NIHZhbHVlcy4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKLSAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisJLyoKKwkgKiBTZXQgQURWX0RWQ19WQVIgJ21heF9ob3N0X3FuZycgYW5kIEFEVl9EVkNfVkFSICdtYXhfZHZjX3FuZycKKwkgKiB2YWx1ZXMgYmFzZWQgb24gcG9zc2libHkgYWRqdXN0ZWQgRUVQUk9NIHZhbHVlcy4KKwkgKi8KKwlhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKwlhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CiAKKwkvKgorCSAqIElmIHRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBpcyBzZXQgdG8gYXV0b21hdGljICgwKSwgdGhlbiBzZXQKKwkgKiB0aGUgQURWX0RWQ19DRkcgJ3Rlcm1pbmF0aW9uJyBmaWVsZCB0byBhdXRvbWF0aWMgYWxzby4KKwkgKgorCSAqIElmIHRoZSB0ZXJtaW5hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIG5vbi16ZXJvICd0ZXJtaW5hdGlvbicKKwkgKiB2YWx1ZSBjaGVjayB0aGF0IGEgbGVnYWwgdmFsdWUgaXMgc2V0IGFuZCBzZXQgdGhlIEFEVl9EVkNfQ0ZHCisJICogJ3Rlcm1pbmF0aW9uJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgorCSAqLworCWlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDApIHsKKwkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IDA7CS8qIGF1dG8gdGVybWluYXRpb24gKi8KKwl9IGVsc2UgeworCQkvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvZmYuICovCisJCWlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDEpIHsKKwkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSBURVJNX0NUTF9TRUw7CiAKLSAgICAvKgotICAgICAqIElmIHRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBpcyBzZXQgdG8gYXV0b21hdGljICgwKSwgdGhlbiBzZXQKLSAgICAgKiB0aGUgQURWX0RWQ19DRkcgJ3Rlcm1pbmF0aW9uJyBmaWVsZCB0byBhdXRvbWF0aWMgYWxzby4KLSAgICAgKgotICAgICAqIElmIHRoZSB0ZXJtaW5hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIG5vbi16ZXJvICd0ZXJtaW5hdGlvbicKLSAgICAgKiB2YWx1ZSBjaGVjayB0aGF0IGEgbGVnYWwgdmFsdWUgaXMgc2V0IGFuZCBzZXQgdGhlIEFEVl9EVkNfQ0ZHCi0gICAgICogJ3Rlcm1pbmF0aW9uJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gMDsgICAgLyogYXV0byB0ZXJtaW5hdGlvbiAqLwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb2ZmLiAqLwotICAgICAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gVEVSTV9DVExfU0VMOworCQkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisJCX0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAyKSB7CisJCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gVEVSTV9DVExfU0VMIHwgVEVSTV9DVExfSDsKIAotICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KLSAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSBURVJNX0NUTF9TRUwgfCBURVJNX0NUTF9IOworCQkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KKwkJfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uID09IDMpIHsKKwkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPQorCQkJICAgIFRFUk1fQ1RMX1NFTCB8IFRFUk1fQ1RMX0ggfCBURVJNX0NUTF9MOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4gVXNlCisJCQkgKiBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KKwkJCSAqLworCQkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IDA7CisJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OOworCQl9CisJfQogCi0gICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvbiAvIGhpZ2ggb24uICovCi0gICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbiA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gVEVSTV9DVExfU0VMIHwgVEVSTV9DVExfSCB8IFRFUk1fQ1RMX0w7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIEVFUFJPTSAndGVybWluYXRpb24nIGZpZWxkIGNvbnRhaW5zIGEgYmFkIHZhbHVlLiBVc2UKLSAgICAgICAgICAgICAqIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBpbnN0ZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gMDsKLSAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gd2Fybl9jb2RlOworCXJldHVybiB3YXJuX2NvZGU7CiB9CiAKIC8qCkBAIC0xNjU1MCwyMjUgKzE2Mjg5LDE5NSBAQAogICoKICAqIE5vdGU6IENoaXAgaXMgc3RvcHBlZCBvbiBlbnRyeS4KICAqLwotU1RBVElDIGludCBfX2luaXQKLUFkdkluaXRGcm9tMzhDMDgwMEVFUChBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3N0YXRpYyBpbnQgX19pbml0IEFkdkluaXRGcm9tMzhDMDgwMEVFUChBRFZfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBBZHZQb3J0QWRkciAgICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgICAgIHdhcm5fY29kZTsKLSAgICBBRFZFRVBfMzhDMDgwMF9DT05GSUcgICAgZWVwX2NvbmZpZzsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICB1Y2hhciAgICAgICAgICAgICAgICAgICAgdGlkLCB0ZXJtaW5hdGlvbjsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgc2R0cl9zcGVlZCA9IDA7CisJQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IHdhcm5fY29kZTsKKwlBRFZFRVBfMzhDMDgwMF9DT05GSUcgZWVwX2NvbmZpZzsKKwlpbnQgaTsKKwl1Y2hhciB0aWQsIHRlcm1pbmF0aW9uOworCXVzaG9ydCBzZHRyX3NwZWVkID0gMDsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKIAotICAgIHdhcm5fY29kZSA9IDA7CisJd2Fybl9jb2RlID0gMDsKIAotICAgIC8qCi0gICAgICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBhIGJhZCBjaGVja3N1bSBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBpZiAoQWR2R2V0MzhDMDgwMEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpICE9IGVlcF9jb25maWcuY2hlY2tfc3VtKQotICAgIHsKLSAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9DSEtTVU07CisJLyoKKwkgKiBSZWFkIHRoZSBib2FyZCdzIEVFUFJPTSBjb25maWd1cmF0aW9uLgorCSAqCisJICogU2V0IGRlZmF1bHQgdmFsdWVzIGlmIGEgYmFkIGNoZWNrc3VtIGlzIGZvdW5kLgorCSAqLworCWlmIChBZHZHZXQzOEMwODAwRUVQQ29uZmlnKGlvcF9iYXNlLCAmZWVwX2NvbmZpZykgIT0KKwkgICAgZWVwX2NvbmZpZy5jaGVja19zdW0pIHsKKwkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9DSEtTVU07CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IEVFUFJPTSBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoQURWRUVQXzM4QzA4MDBfQ09ORklHKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAqKCh1Y2hhciAqKSAmZWVwX2NvbmZpZyArIGkpID0KLSAgICAgICAgICAgICAgICAqKCh1Y2hhciAqKSAmRGVmYXVsdF8zOEMwODAwX0VFUFJPTV9Db25maWcgKyBpKTsKLSAgICAgICAgfQorCQkvKgorCQkgKiBTZXQgRUVQUk9NIGRlZmF1bHQgdmFsdWVzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihBRFZFRVBfMzhDMDgwMF9DT05GSUcpOyBpKyspIHsKKwkJCSooKHVjaGFyICopJmVlcF9jb25maWcgKyBpKSA9CisJCQkgICAgKigodWNoYXIgKikmRGVmYXVsdF8zOEMwODAwX0VFUFJPTV9Db25maWcgKyBpKTsKKwkJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFzc3VtZSB0aGUgNiBieXRlIGJvYXJkIHNlcmlhbCBudW1iZXIgdGhhdCB3YXMgcmVhZAotICAgICAgICAgKiBmcm9tIEVFUFJPTSBpcyBjb3JyZWN0IGV2ZW4gaWYgdGhlIEVFUFJPTSBjaGVja3N1bQotICAgICAgICAgKiBmYWlsZWQuCi0gICAgICAgICAqLwotICAgICAgICBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDMgPQotICAgICAgICAgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAxKTsKKwkJLyoKKwkJICogQXNzdW1lIHRoZSA2IGJ5dGUgYm9hcmQgc2VyaWFsIG51bWJlciB0aGF0IHdhcyByZWFkCisJCSAqIGZyb20gRUVQUk9NIGlzIGNvcnJlY3QgZXZlbiBpZiB0aGUgRUVQUk9NIGNoZWNrc3VtCisJCSAqIGZhaWxlZC4KKwkJICovCisJCWVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMyA9CisJCSAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDEpOwogCi0gICAgICAgIGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMiA9Ci0gICAgICAgICAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDIpOworCQllZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDIgPQorCQkgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAyKTsKIAotICAgICAgICBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDEgPQotICAgICAgICAgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAzKTsKKwkJZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKwkJICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMyk7CiAKLSAgICAgICAgQWR2U2V0MzhDMDgwMEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpOwotICAgIH0KLSAgICAvKgotICAgICAqIFNldCBBRFZfRFZDX1ZBUiBhbmQgQURWX0RWQ19DRkcgdmFyaWFibGVzIGZyb20gdGhlCi0gICAgICogRUVQUk9NIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcmVhZC4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgdGhlIG1hcHBpbmcgb2YgRUVQUk9NIGZpZWxkcyB0byBBZHYgTGlicmFyeSBmaWVsZHMuCi0gICAgICovCi0gICAgYXNjX2R2Yy0+d2R0cl9hYmxlID0gZWVwX2NvbmZpZy53ZHRyX2FibGU7Ci0gICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDEgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQxOwotICAgIGFzY19kdmMtPnNkdHJfc3BlZWQyID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMjsKLSAgICBhc2NfZHZjLT5zZHRyX3NwZWVkMyA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDM7Ci0gICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDQgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQ0OwotICAgIGFzY19kdmMtPnRhZ3FuZ19hYmxlID0gZWVwX2NvbmZpZy50YWdxbmdfYWJsZTsKLSAgICBhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy5kaXNjX2VuYWJsZTsKLSAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKLSAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7Ci0gICAgYXNjX2R2Yy0+Y2hpcF9zY3NpX2lkID0gKGVlcF9jb25maWcuYWRhcHRlcl9zY3NpX2lkICYgQURWX01BWF9USUQpOwotICAgIGFzY19kdmMtPnN0YXJ0X21vdG9yID0gZWVwX2NvbmZpZy5zdGFydF9tb3RvcjsKLSAgICBhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSBlZXBfY29uZmlnLnNjc2lfcmVzZXRfZGVsYXk7Ci0gICAgYXNjX2R2Yy0+Ymlvc19jdHJsID0gZWVwX2NvbmZpZy5iaW9zX2N0cmw7Ci0gICAgYXNjX2R2Yy0+bm9fc2NhbSA9IGVlcF9jb25maWcuc2NhbV90b2xlcmFudDsKLSAgICBhc2NfZHZjLT5jZmctPnNlcmlhbDEgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDE7Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwyID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQyOwotICAgIGFzY19kdmMtPmNmZy0+c2VyaWFsMyA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMzsKKwkJQWR2U2V0MzhDMDgwMEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpOworCX0KKwkvKgorCSAqIFNldCBBRFZfRFZDX1ZBUiBhbmQgQURWX0RWQ19DRkcgdmFyaWFibGVzIGZyb20gdGhlCisJICogRUVQUk9NIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcmVhZC4KKwkgKgorCSAqIFRoaXMgaXMgdGhlIG1hcHBpbmcgb2YgRUVQUk9NIGZpZWxkcyB0byBBZHYgTGlicmFyeSBmaWVsZHMuCisJICovCisJYXNjX2R2Yy0+d2R0cl9hYmxlID0gZWVwX2NvbmZpZy53ZHRyX2FibGU7CisJYXNjX2R2Yy0+c2R0cl9zcGVlZDEgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQxOworCWFzY19kdmMtPnNkdHJfc3BlZWQyID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMjsKKwlhc2NfZHZjLT5zZHRyX3NwZWVkMyA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDM7CisJYXNjX2R2Yy0+c2R0cl9zcGVlZDQgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQ0OworCWFzY19kdmMtPnRhZ3FuZ19hYmxlID0gZWVwX2NvbmZpZy50YWdxbmdfYWJsZTsKKwlhc2NfZHZjLT5jZmctPmRpc2NfZW5hYmxlID0gZWVwX2NvbmZpZy5kaXNjX2VuYWJsZTsKKwlhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKwlhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisJYXNjX2R2Yy0+Y2hpcF9zY3NpX2lkID0gKGVlcF9jb25maWcuYWRhcHRlcl9zY3NpX2lkICYgQURWX01BWF9USUQpOworCWFzY19kdmMtPnN0YXJ0X21vdG9yID0gZWVwX2NvbmZpZy5zdGFydF9tb3RvcjsKKwlhc2NfZHZjLT5zY3NpX3Jlc2V0X3dhaXQgPSBlZXBfY29uZmlnLnNjc2lfcmVzZXRfZGVsYXk7CisJYXNjX2R2Yy0+Ymlvc19jdHJsID0gZWVwX2NvbmZpZy5iaW9zX2N0cmw7CisJYXNjX2R2Yy0+bm9fc2NhbSA9IGVlcF9jb25maWcuc2NhbV90b2xlcmFudDsKKwlhc2NfZHZjLT5jZmctPnNlcmlhbDEgPSBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDE7CisJYXNjX2R2Yy0+Y2ZnLT5zZXJpYWwyID0gZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQyOworCWFzY19kdmMtPmNmZy0+c2VyaWFsMyA9IGVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMzsKIAotICAgIC8qCi0gICAgICogRm9yIGV2ZXJ5IFRhcmdldCBJRCBpZiBhbnkgb2YgaXRzICdzZHRyX3NwZWVkWzEyMzRdJyBiaXRzCi0gICAgICogYXJlIHNldCwgdGhlbiBzZXQgYW4gJ3NkdHJfYWJsZScgYml0IGZvciBpdC4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5zZHRyX2FibGUgPSAwOwotICAgIGZvciAodGlkID0gMDsgdGlkIDw9IEFEVl9NQVhfVElEOyB0aWQrKykKLSAgICB7Ci0gICAgICAgIGlmICh0aWQgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQxOwotICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDI7Ci0gICAgICAgIH0gZWxzZSBpZiAodGlkID09IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMzsKLSAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gMTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkNDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2R0cl9zcGVlZCAmIEFEVl9NQVhfVElEKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5zZHRyX2FibGUgfD0gKDEgPDwgdGlkKTsKLSAgICAgICAgfQotICAgICAgICBzZHRyX3NwZWVkID4+PSA0OwotICAgIH0KKwkvKgorCSAqIEZvciBldmVyeSBUYXJnZXQgSUQgaWYgYW55IG9mIGl0cyAnc2R0cl9zcGVlZFsxMjM0XScgYml0cworCSAqIGFyZSBzZXQsIHRoZW4gc2V0IGFuICdzZHRyX2FibGUnIGJpdCBmb3IgaXQuCisJICovCisJYXNjX2R2Yy0+c2R0cl9hYmxlID0gMDsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8PSBBRFZfTUFYX1RJRDsgdGlkKyspIHsKKwkJaWYgKHRpZCA9PSAwKSB7CisJCQlzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDE7CisJCX0gZWxzZSBpZiAodGlkID09IDQpIHsKKwkJCXNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMjsKKwkJfSBlbHNlIGlmICh0aWQgPT0gOCkgeworCQkJc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQzOworCQl9IGVsc2UgaWYgKHRpZCA9PSAxMikgeworCQkJc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQ0OworCQl9CisJCWlmIChzZHRyX3NwZWVkICYgQURWX01BWF9USUQpIHsKKwkJCWFzY19kdmMtPnNkdHJfYWJsZSB8PSAoMSA8PCB0aWQpOworCQl9CisJCXNkdHJfc3BlZWQgPj49IDQ7CisJfQogCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGhvc3QgbWF4aW11bSBxdWV1aW5nIChtYXguIDI1MywgbWluLiAxNikgYW5kIHRoZSBwZXIgZGV2aWNlCi0gICAgICogbWF4aW11bSBxdWV1aW5nIChtYXguIDYzLCBtaW4uIDQpLgotICAgICAqLwotICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA+IEFTQ19ERUZfTUFYX0hPU1RfUU5HKQotICAgIHsKLSAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKLSAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nIDwgQVNDX0RFRl9NSU5fSE9TVF9RTkcpCi0gICAgewotICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCi0gICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01JTl9IT1NUX1FORzsKLSAgICAgICAgfQotICAgIH0KKwkvKgorCSAqIFNldCB0aGUgaG9zdCBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gMjUzLCBtaW4uIDE2KSBhbmQgdGhlIHBlciBkZXZpY2UKKwkgKiBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gNjMsIG1pbi4gNCkuCisJICovCisJaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID4gQVNDX0RFRl9NQVhfSE9TVF9RTkcpIHsKKwkJZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKwl9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nIDwgQVNDX0RFRl9NSU5fSE9TVF9RTkcpIHsKKwkJLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworCQlpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPT0gMCkgeworCQkJZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01BWF9IT1NUX1FORzsKKwkJfSBlbHNlIHsKKwkJCWVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NSU5fSE9TVF9RTkc7CisJCX0KKwl9CiAKLSAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IEFTQ19ERUZfTUFYX0RWQ19RTkcpCi0gICAgewotICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKLSAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPCBBU0NfREVGX01JTl9EVkNfUU5HKQotICAgIHsKLSAgICAgICAgLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLwotICAgICAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01JTl9EVkNfUU5HOwotICAgICAgICB9Ci0gICAgfQorCWlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gQVNDX0RFRl9NQVhfRFZDX1FORykgeworCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKwl9IGVsc2UgaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPCBBU0NfREVGX01JTl9EVkNfUU5HKSB7CisJCS8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KKwkJaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPT0gMCkgeworCQkJZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUFYX0RWQ19RTkc7CisJCX0gZWxzZSB7CisJCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NSU5fRFZDX1FORzsKKwkJfQorCX0KIAotICAgIC8qCi0gICAgICogSWYgJ21heF9kdmNfcW5nJyBpcyBncmVhdGVyIHRoYW4gJ21heF9ob3N0X3FuZycsIHRoZW4KLSAgICAgKiBzZXQgJ21heF9kdmNfcW5nJyB0byAnbWF4X2hvc3RfcW5nJy4KLSAgICAgKi8KLSAgICBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IGVlcF9jb25maWcubWF4X2hvc3RfcW5nKQotICAgIHsKLSAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOwotICAgIH0KKwkvKgorCSAqIElmICdtYXhfZHZjX3FuZycgaXMgZ3JlYXRlciB0aGFuICdtYXhfaG9zdF9xbmcnLCB0aGVuCisJICogc2V0ICdtYXhfZHZjX3FuZycgdG8gJ21heF9ob3N0X3FuZycuCisJICovCisJaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBlZXBfY29uZmlnLm1heF9ob3N0X3FuZykgeworCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7CisJfQogCi0gICAgLyoKLSAgICAgKiBTZXQgQURWX0RWQ19WQVIgJ21heF9ob3N0X3FuZycgYW5kIEFEVl9EVkNfVkFSICdtYXhfZHZjX3FuZycKLSAgICAgKiB2YWx1ZXMgYmFzZWQgb24gcG9zc2libHkgYWRqdXN0ZWQgRUVQUk9NIHZhbHVlcy4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKLSAgICBhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CisJLyoKKwkgKiBTZXQgQURWX0RWQ19WQVIgJ21heF9ob3N0X3FuZycgYW5kIEFEVl9EVkNfVkFSICdtYXhfZHZjX3FuZycKKwkgKiB2YWx1ZXMgYmFzZWQgb24gcG9zc2libHkgYWRqdXN0ZWQgRUVQUk9NIHZhbHVlcy4KKwkgKi8KKwlhc2NfZHZjLT5tYXhfaG9zdF9xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKwlhc2NfZHZjLT5tYXhfZHZjX3FuZyA9IGVlcF9jb25maWcubWF4X2R2Y19xbmc7CiAKLSAgICAvKgotICAgICAqIElmIHRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBpcyBzZXQgdG8gYXV0b21hdGljICgwKSwgdGhlbiBzZXQKLSAgICAgKiB0aGUgQURWX0RWQ19DRkcgJ3Rlcm1pbmF0aW9uJyBmaWVsZCB0byBhdXRvbWF0aWMgYWxzby4KLSAgICAgKgotICAgICAqIElmIHRoZSB0ZXJtaW5hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIG5vbi16ZXJvICd0ZXJtaW5hdGlvbicKLSAgICAgKiB2YWx1ZSBjaGVjayB0aGF0IGEgbGVnYWwgdmFsdWUgaXMgc2V0IGFuZCBzZXQgdGhlIEFEVl9EVkNfQ0ZHCi0gICAgICogJ3Rlcm1pbmF0aW9uJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDApCi0gICAgewotICAgICAgICB0ZXJtaW5hdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF1dG8gdGVybWluYXRpb24gZm9yIFNFICovCi0gICAgfSBlbHNlCi0gICAgewotICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvZmYuICovCi0gICAgICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gMDsKKwkvKgorCSAqIElmIHRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uJyBmaWVsZCBpcyBzZXQgdG8gYXV0b21hdGljICgwKSwgdGhlbiBzZXQKKwkgKiB0aGUgQURWX0RWQ19DRkcgJ3Rlcm1pbmF0aW9uJyBmaWVsZCB0byBhdXRvbWF0aWMgYWxzby4KKwkgKgorCSAqIElmIHRoZSB0ZXJtaW5hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIG5vbi16ZXJvICd0ZXJtaW5hdGlvbicKKwkgKiB2YWx1ZSBjaGVjayB0aGF0IGEgbGVnYWwgdmFsdWUgaXMgc2V0IGFuZCBzZXQgdGhlIEFEVl9EVkNfQ0ZHCisJICogJ3Rlcm1pbmF0aW9uJyBmaWVsZCBhcHByb3ByaWF0ZWx5LgorCSAqLworCWlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDApIHsKKwkJdGVybWluYXRpb24gPSAwOwkvKiBhdXRvIHRlcm1pbmF0aW9uIGZvciBTRSAqLworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KKwkJaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMSkgeworCQkJdGVybWluYXRpb24gPSAwOwogCi0gICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9uLiAqLwotICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgdGVybWluYXRpb24gPSBURVJNX1NFX0hJOworCQkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisJCX0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAyKSB7CisJCQl0ZXJtaW5hdGlvbiA9IFRFUk1fU0VfSEk7CiAKLSAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KLSAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gVEVSTV9TRTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgRUVQUk9NICd0ZXJtaW5hdGlvbl9zZScgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCi0gICAgICAgICAgICAgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRlcm1pbmF0aW9uID0gMDsKLSAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047Ci0gICAgICAgIH0KLSAgICB9CisJCQkvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLworCQl9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMykgeworCQkJdGVybWluYXRpb24gPSBURVJNX1NFOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX3NlJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4KKwkJCSAqIFVzZSBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KKwkJCSAqLworCQkJdGVybWluYXRpb24gPSAwOworCQkJd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9URVJNSU5BVElPTjsKKwkJfQorCX0KIAotICAgIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAwKQotICAgIHsKLSAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOyAvKiBhdXRvIHRlcm1pbmF0aW9uIGZvciBMVkQgKi8KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KLSAgICAgICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKKwlpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMCkgeworCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb247CS8qIGF1dG8gdGVybWluYXRpb24gZm9yIExWRCAqLworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KKwkJaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDEpIHsKKwkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKIAotICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KLSAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb24gfCBURVJNX0xWRF9ISTsKKwkJCS8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9uLiAqLworCQl9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDIpIHsKKwkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbiB8IFRFUk1fTFZEX0hJOwogCi0gICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvbiAvIGhpZ2ggb24uICovCi0gICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9Ci0gICAgICAgICAgICAgICAgdGVybWluYXRpb24gfCBURVJNX0xWRDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgRUVQUk9NICd0ZXJtaW5hdGlvbl9sdmQnIGZpZWxkIGNvbnRhaW5zIGEgYmFkIHZhbHVlLgotICAgICAgICAgICAgICogVXNlIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBpbnN0ZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb247Ci0gICAgICAgICAgICB3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OOwotICAgICAgICB9Ci0gICAgfQorCQkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KKwkJfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAzKSB7CisJCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb24gfCBURVJNX0xWRDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgRUVQUk9NICd0ZXJtaW5hdGlvbl9sdmQnIGZpZWxkIGNvbnRhaW5zIGEgYmFkIHZhbHVlLgorCQkJICogVXNlIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBpbnN0ZWFkLgorCQkJICovCisJCQlhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb247CisJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OOworCQl9CisJfQogCi0gICAgcmV0dXJuIHdhcm5fY29kZTsKKwlyZXR1cm4gd2Fybl9jb2RlOwogfQogCiAvKgpAQCAtMTY3ODMsMjY1ICsxNjQ5MiwyNDAgQEAKICAqCiAgKiBOb3RlOiBDaGlwIGlzIHN0b3BwZWQgb24gZW50cnkuCiAgKi8KLVNUQVRJQyBpbnQgX19pbml0Ci1BZHZJbml0RnJvbTM4QzE2MDBFRVAoQURWX0RWQ19WQVIgKmFzY19kdmMpCitzdGF0aWMgaW50IF9faW5pdCBBZHZJbml0RnJvbTM4QzE2MDBFRVAoQURWX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgQWR2UG9ydEFkZHIgICAgICAgICAgICAgIGlvcF9iYXNlOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgICAgICB3YXJuX2NvZGU7Ci0gICAgQURWRUVQXzM4QzE2MDBfQ09ORklHICAgIGVlcF9jb25maWc7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICAgICAgIHRpZCwgdGVybWluYXRpb247Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAgICAgIHNkdHJfc3BlZWQgPSAwOworCUFkdlBvcnRBZGRyIGlvcF9iYXNlOworCXVzaG9ydCB3YXJuX2NvZGU7CisJQURWRUVQXzM4QzE2MDBfQ09ORklHIGVlcF9jb25maWc7CisJaW50IGk7CisJdWNoYXIgdGlkLCB0ZXJtaW5hdGlvbjsKKwl1c2hvcnQgc2R0cl9zcGVlZCA9IDA7CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CiAKLSAgICB3YXJuX2NvZGUgPSAwOworCXdhcm5fY29kZSA9IDA7CiAKLSAgICAvKgotICAgICAqIFJlYWQgdGhlIGJvYXJkJ3MgRUVQUk9NIGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBTZXQgZGVmYXVsdCB2YWx1ZXMgaWYgYSBiYWQgY2hlY2tzdW0gaXMgZm91bmQuCi0gICAgICovCi0gICAgaWYgKEFkdkdldDM4QzE2MDBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKSAhPSBlZXBfY29uZmlnLmNoZWNrX3N1bSkKLSAgICB7Ci0gICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNOworCS8qCisJICogUmVhZCB0aGUgYm9hcmQncyBFRVBST00gY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIFNldCBkZWZhdWx0IHZhbHVlcyBpZiBhIGJhZCBjaGVja3N1bSBpcyBmb3VuZC4KKwkgKi8KKwlpZiAoQWR2R2V0MzhDMTYwMEVFUENvbmZpZyhpb3BfYmFzZSwgJmVlcF9jb25maWcpICE9CisJICAgIGVlcF9jb25maWcuY2hlY2tfc3VtKSB7CisJCXdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNldCBFRVBST00gZGVmYXVsdCB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEFEVkVFUF8zOEMxNjAwX0NPTkZJRyk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPT0gMSAmJiBBU0NfUENJX0lEMkZVTkMoYXNjX2R2Yy0+Y2ZnLT5wY2lfc2xvdF9pbmZvKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2V0IEZ1bmN0aW9uIDEgRUVQUk9NIFdvcmQgMCBNU0IKLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIENsZWFyIHRoZSBCSU9TX0VOQUJMRSAoYml0IDE0KSBhbmQgSU5UQUIgKGJpdCAxMSkKLSAgICAgICAgICAgICAgICAgKiBFRVBST00gYml0cy4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIERpc2FibGUgQml0IDE0IChCSU9TX0VOQUJMRSkgdG8gZml4IFNQQVJDIFVsdHJhIDYwIGFuZAotICAgICAgICAgICAgICAgICAqIG9sZCBNYWMgc3lzdGVtIGJvb3RpbmcgcHJvYmxlbS4gVGhlIEV4cGFuc2lvbiBST00gbXVzdAotICAgICAgICAgICAgICAgICAqIGJlIGRpc2FibGVkIGluIEZ1bmN0aW9uIDEgZm9yIHRoZXNlIHN5c3RlbXMuCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAqKCh1Y2hhciAqKSAmZWVwX2NvbmZpZyArIGkpID0KLSAgICAgICAgICAgICAgICAoKCooKHVjaGFyICopICZEZWZhdWx0XzM4QzE2MDBfRUVQUk9NX0NvbmZpZyArIGkpKSAmCi0gICAgICAgICAgICAgICAgICAgICh+KCgoQURWX0VFUFJPTV9CSU9TX0VOQUJMRSB8IEFEVl9FRVBST01fSU5UQUIpID4+IDgpICYKLSAgICAgICAgICAgICAgICAgICAgIDB4RkYpKSk7CisJCS8qCisJCSAqIFNldCBFRVBST00gZGVmYXVsdCB2YWx1ZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEFEVkVFUF8zOEMxNjAwX0NPTkZJRyk7IGkrKykgeworCQkJaWYgKGkgPT0gMQorCQkJICAgICYmIEFTQ19QQ0lfSUQyRlVOQyhhc2NfZHZjLT5jZmctPnBjaV9zbG90X2luZm8pICE9CisJCQkgICAgMCkgeworCQkJCS8qCisJCQkJICogU2V0IEZ1bmN0aW9uIDEgRUVQUk9NIFdvcmQgMCBNU0IKKwkJCQkgKgorCQkJCSAqIENsZWFyIHRoZSBCSU9TX0VOQUJMRSAoYml0IDE0KSBhbmQgSU5UQUIgKGJpdCAxMSkKKwkJCQkgKiBFRVBST00gYml0cy4KKwkJCQkgKgorCQkJCSAqIERpc2FibGUgQml0IDE0IChCSU9TX0VOQUJMRSkgdG8gZml4IFNQQVJDIFVsdHJhIDYwIGFuZAorCQkJCSAqIG9sZCBNYWMgc3lzdGVtIGJvb3RpbmcgcHJvYmxlbS4gVGhlIEV4cGFuc2lvbiBST00gbXVzdAorCQkJCSAqIGJlIGRpc2FibGVkIGluIEZ1bmN0aW9uIDEgZm9yIHRoZXNlIHN5c3RlbXMuCisJCQkJICoKKwkJCQkgKi8KKwkJCQkqKCh1Y2hhciAqKSZlZXBfY29uZmlnICsgaSkgPQorCQkJCSAgICAoKCoKKwkJCQkgICAgICAoKHVjaGFyICopJkRlZmF1bHRfMzhDMTYwMF9FRVBST01fQ29uZmlnCisJCQkJICAgICAgICsKKwkJCQkgICAgICAgaSkpICYKKwkJCQkgICAgICh+CisJCQkJICAgICAgKCgoQURWX0VFUFJPTV9CSU9TX0VOQUJMRSB8CisJCQkJCSBBRFZfRUVQUk9NX0lOVEFCKSA+PiA4KSAmIDB4RkYpKSk7CiAKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFNldCB0aGUgSU5UQUIgKGJpdCAxMSkgaWYgdGhlIEdQSU8gMCBpbnB1dCBpbmRpY2F0ZXMKLSAgICAgICAgICAgICAgICAgKiB0aGUgRnVuY3Rpb24gMSBpbnRlcnJ1cHQgbGluZSBpcyB3aXJlZCB0byBJTlRBLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogU2V0L0NsZWFyIEJpdCAxMSAoSU5UQUIpIGZyb20gdGhlIEdQSU8gYml0IDAgaW5wdXQ6Ci0gICAgICAgICAgICAgICAgICogICAxIC0gRnVuY3Rpb24gMSBpbnRlcnJ1cHQgbGluZSB3aXJlZCB0byBJTlQgQS4KLSAgICAgICAgICAgICAgICAgKiAgIDAgLSBGdW5jdGlvbiAxIGludGVycnVwdCBsaW5lIHdpcmVkIHRvIElOVCBCLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogTm90ZTogQWRhcHRlciBib2FyZHMgYWx3YXlzIGhhdmUgRnVuY3Rpb24gMCB3aXJlZCB0byBJTlRBLgotICAgICAgICAgICAgICAgICAqIFB1dCBhbGwgNSBHUElPIGJpdHMgaW4gaW5wdXQgbW9kZSBhbmQgdGhlbiByZWFkCi0gICAgICAgICAgICAgICAgICogdGhlaXIgaW5wdXQgdmFsdWVzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0dQSU9fQ05UTCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFkdlJlYWRCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfR1BJT19EQVRBKSAmIDB4MDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiAxIGludGVycnVwdCB3aXJlZCB0byBJTlRBOyBTZXQgRUVQUk9NIGJpdC4gKi8KLSAgICAgICAgICAgICAgICAqKCh1Y2hhciAqKSAmZWVwX2NvbmZpZyArIGkpIHw9Ci0gICAgICAgICAgICAgICAgICAgICgoQURWX0VFUFJPTV9JTlRBQiA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKCh1Y2hhciAqKSAmZWVwX2NvbmZpZyArIGkpID0KLSAgICAgICAgICAgICAgICAqKCh1Y2hhciAqKSAmRGVmYXVsdF8zOEMxNjAwX0VFUFJPTV9Db25maWcgKyBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCQkJCS8qCisJCQkJICogU2V0IHRoZSBJTlRBQiAoYml0IDExKSBpZiB0aGUgR1BJTyAwIGlucHV0IGluZGljYXRlcworCQkJCSAqIHRoZSBGdW5jdGlvbiAxIGludGVycnVwdCBsaW5lIGlzIHdpcmVkIHRvIElOVEEuCisJCQkJICoKKwkJCQkgKiBTZXQvQ2xlYXIgQml0IDExIChJTlRBQikgZnJvbSB0aGUgR1BJTyBiaXQgMCBpbnB1dDoKKwkJCQkgKiAgIDEgLSBGdW5jdGlvbiAxIGludGVycnVwdCBsaW5lIHdpcmVkIHRvIElOVCBBLgorCQkJCSAqICAgMCAtIEZ1bmN0aW9uIDEgaW50ZXJydXB0IGxpbmUgd2lyZWQgdG8gSU5UIEIuCisJCQkJICoKKwkJCQkgKiBOb3RlOiBBZGFwdGVyIGJvYXJkcyBhbHdheXMgaGF2ZSBGdW5jdGlvbiAwIHdpcmVkIHRvIElOVEEuCisJCQkJICogUHV0IGFsbCA1IEdQSU8gYml0cyBpbiBpbnB1dCBtb2RlIGFuZCB0aGVuIHJlYWQKKwkJCQkgKiB0aGVpciBpbnB1dCB2YWx1ZXMuCisJCQkJICovCisJCQkJQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfR1BJT19DTlRMLAorCQkJCQkJICAgICAwKTsKKwkJCQlpZiAoQWR2UmVhZEJ5dGVSZWdpc3RlcgorCQkJCSAgICAoaW9wX2Jhc2UsIElPUEJfR1BJT19EQVRBKSAmIDB4MDEpIHsKKwkJCQkJLyogRnVuY3Rpb24gMSBpbnRlcnJ1cHQgd2lyZWQgdG8gSU5UQTsgU2V0IEVFUFJPTSBiaXQuICovCisJCQkJCSooKHVjaGFyICopJmVlcF9jb25maWcgKyBpKSB8PQorCQkJCQkgICAgKChBRFZfRUVQUk9NX0lOVEFCID4+IDgpICYgMHhGRik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqKCh1Y2hhciAqKSZlZXBfY29uZmlnICsgaSkgPQorCQkJCSAgICAqKCh1Y2hhciAqKSZEZWZhdWx0XzM4QzE2MDBfRUVQUk9NX0NvbmZpZworCQkJCSAgICAgICsgaSk7CisJCQl9CisJCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBBc3N1bWUgdGhlIDYgYnl0ZSBib2FyZCBzZXJpYWwgbnVtYmVyIHRoYXQgd2FzIHJlYWQKLSAgICAgICAgICogZnJvbSBFRVBST00gaXMgY29ycmVjdCBldmVuIGlmIHRoZSBFRVBST00gY2hlY2tzdW0KLSAgICAgICAgICogZmFpbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQzID0KLSAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMSk7CisJCS8qCisJCSAqIEFzc3VtZSB0aGUgNiBieXRlIGJvYXJkIHNlcmlhbCBudW1iZXIgdGhhdCB3YXMgcmVhZAorCQkgKiBmcm9tIEVFUFJPTSBpcyBjb3JyZWN0IGV2ZW4gaWYgdGhlIEVFUFJPTSBjaGVja3N1bQorCQkgKiBmYWlsZWQuCisJCSAqLworCQllZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDMgPQorCQkgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAxKTsKIAotICAgICAgICBlZXBfY29uZmlnLnNlcmlhbF9udW1iZXJfd29yZDIgPQotICAgICAgICAgICAgQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIEFEVl9FRVBfRFZDX0NGR19FTkQgLSAyKTsKKwkJZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQyID0KKwkJICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMik7CiAKLSAgICAgICAgZWVwX2NvbmZpZy5zZXJpYWxfbnVtYmVyX3dvcmQxID0KLSAgICAgICAgICAgIEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBBRFZfRUVQX0RWQ19DRkdfRU5EIC0gMyk7CisJCWVlcF9jb25maWcuc2VyaWFsX251bWJlcl93b3JkMSA9CisJCSAgICBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgQURWX0VFUF9EVkNfQ0ZHX0VORCAtIDMpOwogCi0gICAgICAgIEFkdlNldDM4QzE2MDBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKLSAgICB9CisJCUFkdlNldDM4QzE2MDBFRVBDb25maWcoaW9wX2Jhc2UsICZlZXBfY29uZmlnKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFNldCBBU0NfRFZDX1ZBUiBhbmQgQVNDX0RWQ19DRkcgdmFyaWFibGVzIGZyb20gdGhlCi0gICAgICogRUVQUk9NIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcmVhZC4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgdGhlIG1hcHBpbmcgb2YgRUVQUk9NIGZpZWxkcyB0byBBZHYgTGlicmFyeSBmaWVsZHMuCi0gICAgICovCi0gICAgYXNjX2R2Yy0+d2R0cl9hYmxlID0gZWVwX2NvbmZpZy53ZHRyX2FibGU7Ci0gICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDEgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQxOwotICAgIGFzY19kdmMtPnNkdHJfc3BlZWQyID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMjsKLSAgICBhc2NfZHZjLT5zZHRyX3NwZWVkMyA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDM7Ci0gICAgYXNjX2R2Yy0+c2R0cl9zcGVlZDQgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQ0OwotICAgIGFzY19kdmMtPnBwcl9hYmxlID0gMDsKLSAgICBhc2NfZHZjLT50YWdxbmdfYWJsZSA9IGVlcF9jb25maWcudGFncW5nX2FibGU7Ci0gICAgYXNjX2R2Yy0+Y2ZnLT5kaXNjX2VuYWJsZSA9IGVlcF9jb25maWcuZGlzY19lbmFibGU7Ci0gICAgYXNjX2R2Yy0+bWF4X2hvc3RfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7Ci0gICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9kdmNfcW5nOwotICAgIGFzY19kdmMtPmNoaXBfc2NzaV9pZCA9IChlZXBfY29uZmlnLmFkYXB0ZXJfc2NzaV9pZCAmIEFTQ19NQVhfVElEKTsKLSAgICBhc2NfZHZjLT5zdGFydF9tb3RvciA9IGVlcF9jb25maWcuc3RhcnRfbW90b3I7Ci0gICAgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ID0gZWVwX2NvbmZpZy5zY3NpX3Jlc2V0X2RlbGF5OwotICAgIGFzY19kdmMtPmJpb3NfY3RybCA9IGVlcF9jb25maWcuYmlvc19jdHJsOwotICAgIGFzY19kdmMtPm5vX3NjYW0gPSBlZXBfY29uZmlnLnNjYW1fdG9sZXJhbnQ7CisJLyoKKwkgKiBTZXQgQVNDX0RWQ19WQVIgYW5kIEFTQ19EVkNfQ0ZHIHZhcmlhYmxlcyBmcm9tIHRoZQorCSAqIEVFUFJPTSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHJlYWQuCisJICoKKwkgKiBUaGlzIGlzIHRoZSBtYXBwaW5nIG9mIEVFUFJPTSBmaWVsZHMgdG8gQWR2IExpYnJhcnkgZmllbGRzLgorCSAqLworCWFzY19kdmMtPndkdHJfYWJsZSA9IGVlcF9jb25maWcud2R0cl9hYmxlOworCWFzY19kdmMtPnNkdHJfc3BlZWQxID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkMTsKKwlhc2NfZHZjLT5zZHRyX3NwZWVkMiA9IGVlcF9jb25maWcuc2R0cl9zcGVlZDI7CisJYXNjX2R2Yy0+c2R0cl9zcGVlZDMgPSBlZXBfY29uZmlnLnNkdHJfc3BlZWQzOworCWFzY19kdmMtPnNkdHJfc3BlZWQ0ID0gZWVwX2NvbmZpZy5zZHRyX3NwZWVkNDsKKwlhc2NfZHZjLT5wcHJfYWJsZSA9IDA7CisJYXNjX2R2Yy0+dGFncW5nX2FibGUgPSBlZXBfY29uZmlnLnRhZ3FuZ19hYmxlOworCWFzY19kdmMtPmNmZy0+ZGlzY19lbmFibGUgPSBlZXBfY29uZmlnLmRpc2NfZW5hYmxlOworCWFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworCWFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKwlhc2NfZHZjLT5jaGlwX3Njc2lfaWQgPSAoZWVwX2NvbmZpZy5hZGFwdGVyX3Njc2lfaWQgJiBBU0NfTUFYX1RJRCk7CisJYXNjX2R2Yy0+c3RhcnRfbW90b3IgPSBlZXBfY29uZmlnLnN0YXJ0X21vdG9yOworCWFzY19kdmMtPnNjc2lfcmVzZXRfd2FpdCA9IGVlcF9jb25maWcuc2NzaV9yZXNldF9kZWxheTsKKwlhc2NfZHZjLT5iaW9zX2N0cmwgPSBlZXBfY29uZmlnLmJpb3NfY3RybDsKKwlhc2NfZHZjLT5ub19zY2FtID0gZWVwX2NvbmZpZy5zY2FtX3RvbGVyYW50OwogCi0gICAgLyoKLSAgICAgKiBGb3IgZXZlcnkgVGFyZ2V0IElEIGlmIGFueSBvZiBpdHMgJ3NkdHJfc3BlZWRbMTIzNF0nIGJpdHMKLSAgICAgKiBhcmUgc2V0LCB0aGVuIHNldCBhbiAnc2R0cl9hYmxlJyBiaXQgZm9yIGl0LgotICAgICAqLwotICAgIGFzY19kdmMtPnNkdHJfYWJsZSA9IDA7Ci0gICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQVNDX01BWF9USUQ7IHRpZCsrKQotICAgIHsKLSAgICAgICAgaWYgKHRpZCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDE7Ci0gICAgICAgIH0gZWxzZSBpZiAodGlkID09IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMjsKLSAgICAgICAgfSBlbHNlIGlmICh0aWQgPT0gOCkKLSAgICAgICAgewotICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQzOwotICAgICAgICB9IGVsc2UgaWYgKHRpZCA9PSAxMikKLSAgICAgICAgewotICAgICAgICAgICAgc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQ0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZHRyX3NwZWVkICYgQVNDX01BWF9USUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPnNkdHJfYWJsZSB8PSAoMSA8PCB0aWQpOwotICAgICAgICB9Ci0gICAgICAgIHNkdHJfc3BlZWQgPj49IDQ7Ci0gICAgfQorCS8qCisJICogRm9yIGV2ZXJ5IFRhcmdldCBJRCBpZiBhbnkgb2YgaXRzICdzZHRyX3NwZWVkWzEyMzRdJyBiaXRzCisJICogYXJlIHNldCwgdGhlbiBzZXQgYW4gJ3NkdHJfYWJsZScgYml0IGZvciBpdC4KKwkgKi8KKwlhc2NfZHZjLT5zZHRyX2FibGUgPSAwOworCWZvciAodGlkID0gMDsgdGlkIDw9IEFTQ19NQVhfVElEOyB0aWQrKykgeworCQlpZiAodGlkID09IDApIHsKKwkJCXNkdHJfc3BlZWQgPSBhc2NfZHZjLT5zZHRyX3NwZWVkMTsKKwkJfSBlbHNlIGlmICh0aWQgPT0gNCkgeworCQkJc2R0cl9zcGVlZCA9IGFzY19kdmMtPnNkdHJfc3BlZWQyOworCQl9IGVsc2UgaWYgKHRpZCA9PSA4KSB7CisJCQlzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDM7CisJCX0gZWxzZSBpZiAodGlkID09IDEyKSB7CisJCQlzZHRyX3NwZWVkID0gYXNjX2R2Yy0+c2R0cl9zcGVlZDQ7CisJCX0KKwkJaWYgKHNkdHJfc3BlZWQgJiBBU0NfTUFYX1RJRCkgeworCQkJYXNjX2R2Yy0+c2R0cl9hYmxlIHw9ICgxIDw8IHRpZCk7CisJCX0KKwkJc2R0cl9zcGVlZCA+Pj0gNDsKKwl9CiAKLSAgICAvKgotICAgICAqIFNldCB0aGUgaG9zdCBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gMjUzLCBtaW4uIDE2KSBhbmQgdGhlIHBlciBkZXZpY2UKLSAgICAgKiBtYXhpbXVtIHF1ZXVpbmcgKG1heC4gNjMsIG1pbi4gNCkuCi0gICAgICovCi0gICAgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID4gQVNDX0RFRl9NQVhfSE9TVF9RTkcpCi0gICAgewotICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOwotICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPCBBU0NfREVGX01JTl9IT1NUX1FORykKLSAgICB7Ci0gICAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCBhc3N1bWUgaXQgaXMgdW5pbml0aWFsaXplZC4gKi8KLSAgICAgICAgaWYgKGVlcF9jb25maWcubWF4X2hvc3RfcW5nID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2hvc3RfcW5nID0gQVNDX0RFRl9NQVhfSE9TVF9RTkc7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUlOX0hPU1RfUU5HOwotICAgICAgICB9Ci0gICAgfQorCS8qCisJICogU2V0IHRoZSBob3N0IG1heGltdW0gcXVldWluZyAobWF4LiAyNTMsIG1pbi4gMTYpIGFuZCB0aGUgcGVyIGRldmljZQorCSAqIG1heGltdW0gcXVldWluZyAobWF4LiA2MywgbWluLiA0KS4KKwkgKi8KKwlpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPiBBU0NfREVGX01BWF9IT1NUX1FORykgeworCQllZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOworCX0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPCBBU0NfREVGX01JTl9IT1NUX1FORykgeworCQkvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCisJCWlmIChlZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9PSAwKSB7CisJCQllZXBfY29uZmlnLm1heF9ob3N0X3FuZyA9IEFTQ19ERUZfTUFYX0hPU1RfUU5HOworCQl9IGVsc2UgeworCQkJZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcgPSBBU0NfREVGX01JTl9IT1NUX1FORzsKKwkJfQorCX0KIAotICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gQVNDX0RFRl9NQVhfRFZDX1FORykKLSAgICB7Ci0gICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOwotICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA8IEFTQ19ERUZfTUlOX0RWQ19RTkcpCi0gICAgewotICAgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgemVybywgYXNzdW1lIGl0IGlzIHVuaW5pdGlhbGl6ZWQuICovCi0gICAgICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9IEFTQ19ERUZfTUlOX0RWQ19RTkc7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKGVlcF9jb25maWcubWF4X2R2Y19xbmcgPiBBU0NfREVGX01BWF9EVkNfUU5HKSB7CisJCWVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01BWF9EVkNfUU5HOworCX0gZWxzZSBpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA8IEFTQ19ERUZfTUlOX0RWQ19RTkcpIHsKKwkJLyogSWYgdGhlIHZhbHVlIGlzIHplcm8sIGFzc3VtZSBpdCBpcyB1bmluaXRpYWxpemVkLiAqLworCQlpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA9PSAwKSB7CisJCQllZXBfY29uZmlnLm1heF9kdmNfcW5nID0gQVNDX0RFRl9NQVhfRFZDX1FORzsKKwkJfSBlbHNlIHsKKwkJCWVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBBU0NfREVGX01JTl9EVkNfUU5HOworCQl9CisJfQogCi0gICAgLyoKLSAgICAgKiBJZiAnbWF4X2R2Y19xbmcnIGlzIGdyZWF0ZXIgdGhhbiAnbWF4X2hvc3RfcW5nJywgdGhlbgotICAgICAqIHNldCAnbWF4X2R2Y19xbmcnIHRvICdtYXhfaG9zdF9xbmcnLgotICAgICAqLwotICAgIGlmIChlZXBfY29uZmlnLm1heF9kdmNfcW5nID4gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmcpCi0gICAgewotICAgICAgICBlZXBfY29uZmlnLm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfaG9zdF9xbmc7Ci0gICAgfQorCS8qCisJICogSWYgJ21heF9kdmNfcW5nJyBpcyBncmVhdGVyIHRoYW4gJ21heF9ob3N0X3FuZycsIHRoZW4KKwkgKiBzZXQgJ21heF9kdmNfcW5nJyB0byAnbWF4X2hvc3RfcW5nJy4KKwkgKi8KKwlpZiAoZWVwX2NvbmZpZy5tYXhfZHZjX3FuZyA+IGVlcF9jb25maWcubWF4X2hvc3RfcW5nKSB7CisJCWVlcF9jb25maWcubWF4X2R2Y19xbmcgPSBlZXBfY29uZmlnLm1heF9ob3N0X3FuZzsKKwl9CiAKLSAgICAvKgotICAgICAqIFNldCBBU0NfRFZDX1ZBUiAnbWF4X2hvc3RfcW5nJyBhbmQgQVNDX0RWQ19WQVIgJ21heF9kdmNfcW5nJwotICAgICAqIHZhbHVlcyBiYXNlZCBvbiBwb3NzaWJseSBhZGp1c3RlZCBFRVBST00gdmFsdWVzLgotICAgICAqLwotICAgIGFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOwotICAgIGFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKKwkvKgorCSAqIFNldCBBU0NfRFZDX1ZBUiAnbWF4X2hvc3RfcW5nJyBhbmQgQVNDX0RWQ19WQVIgJ21heF9kdmNfcW5nJworCSAqIHZhbHVlcyBiYXNlZCBvbiBwb3NzaWJseSBhZGp1c3RlZCBFRVBST00gdmFsdWVzLgorCSAqLworCWFzY19kdmMtPm1heF9ob3N0X3FuZyA9IGVlcF9jb25maWcubWF4X2hvc3RfcW5nOworCWFzY19kdmMtPm1heF9kdmNfcW5nID0gZWVwX2NvbmZpZy5tYXhfZHZjX3FuZzsKIAotICAgIC8qCi0gICAgICogSWYgdGhlIEVFUFJPTSAndGVybWluYXRpb24nIGZpZWxkIGlzIHNldCB0byBhdXRvbWF0aWMgKDApLCB0aGVuIHNldAotICAgICAqIHRoZSBBU0NfRFZDX0NGRyAndGVybWluYXRpb24nIGZpZWxkIHRvIGF1dG9tYXRpYyBhbHNvLgotICAgICAqCi0gICAgICogSWYgdGhlIHRlcm1pbmF0aW9uIGlzIHNwZWNpZmllZCB3aXRoIGEgbm9uLXplcm8gJ3Rlcm1pbmF0aW9uJwotICAgICAqIHZhbHVlIGNoZWNrIHRoYXQgYSBsZWdhbCB2YWx1ZSBpcyBzZXQgYW5kIHNldCB0aGUgQVNDX0RWQ19DRkcKLSAgICAgKiAndGVybWluYXRpb24nIGZpZWxkIGFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMCkKLSAgICB7Ci0gICAgICAgIHRlcm1pbmF0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXV0byB0ZXJtaW5hdGlvbiBmb3IgU0UgKi8KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9mZi4gKi8KLSAgICAgICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgdGVybWluYXRpb24gPSAwOworCS8qCisJICogSWYgdGhlIEVFUFJPTSAndGVybWluYXRpb24nIGZpZWxkIGlzIHNldCB0byBhdXRvbWF0aWMgKDApLCB0aGVuIHNldAorCSAqIHRoZSBBU0NfRFZDX0NGRyAndGVybWluYXRpb24nIGZpZWxkIHRvIGF1dG9tYXRpYyBhbHNvLgorCSAqCisJICogSWYgdGhlIHRlcm1pbmF0aW9uIGlzIHNwZWNpZmllZCB3aXRoIGEgbm9uLXplcm8gJ3Rlcm1pbmF0aW9uJworCSAqIHZhbHVlIGNoZWNrIHRoYXQgYSBsZWdhbCB2YWx1ZSBpcyBzZXQgYW5kIHNldCB0aGUgQVNDX0RWQ19DRkcKKwkgKiAndGVybWluYXRpb24nIGZpZWxkIGFwcHJvcHJpYXRlbHkuCisJICovCisJaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMCkgeworCQl0ZXJtaW5hdGlvbiA9IDA7CS8qIGF1dG8gdGVybWluYXRpb24gZm9yIFNFICovCisJfSBlbHNlIHsKKwkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb2ZmLiAqLworCQlpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAxKSB7CisJCQl0ZXJtaW5hdGlvbiA9IDA7CiAKLSAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCi0gICAgICAgIH0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZXJtaW5hdGlvbiA9IFRFUk1fU0VfSEk7CisJCQkvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb2ZmIC8gaGlnaCBvbi4gKi8KKwkJfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX3NlID09IDIpIHsKKwkJCXRlcm1pbmF0aW9uID0gVEVSTV9TRV9ISTsKIAotICAgICAgICAvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLwotICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fc2UgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgdGVybWluYXRpb24gPSBURVJNX1NFOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX3NlJyBmaWVsZCBjb250YWlucyBhIGJhZCB2YWx1ZS4KLSAgICAgICAgICAgICAqIFVzZSBhdXRvbWF0aWMgdGVybWluYXRpb24gaW5zdGVhZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdGVybWluYXRpb24gPSAwOwotICAgICAgICAgICAgd2Fybl9jb2RlIHw9IEFTQ19XQVJOX0VFUFJPTV9URVJNSU5BVElPTjsKLSAgICAgICAgfQotICAgIH0KKwkJCS8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvbiAvIGhpZ2ggb24uICovCisJCX0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9zZSA9PSAzKSB7CisJCQl0ZXJtaW5hdGlvbiA9IFRFUk1fU0U7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIEVFUFJPTSAndGVybWluYXRpb25fc2UnIGZpZWxkIGNvbnRhaW5zIGEgYmFkIHZhbHVlLgorCQkJICogVXNlIGF1dG9tYXRpYyB0ZXJtaW5hdGlvbiBpbnN0ZWFkLgorCQkJICovCisJCQl0ZXJtaW5hdGlvbiA9IDA7CisJCQl3YXJuX2NvZGUgfD0gQVNDX1dBUk5fRUVQUk9NX1RFUk1JTkFUSU9OOworCQl9CisJfQogCi0gICAgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDApCi0gICAgewotICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0gdGVybWluYXRpb247IC8qIGF1dG8gdGVybWluYXRpb24gZm9yIExWRCAqLwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb2ZmLiAqLwotICAgICAgICBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOworCWlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAwKSB7CisJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsJLyogYXV0byB0ZXJtaW5hdGlvbiBmb3IgTFZEICovCisJfSBlbHNlIHsKKwkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb2ZmLiAqLworCQlpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMSkgeworCQkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uOwogCi0gICAgICAgIC8qIEVuYWJsZSBtYW51YWwgY29udHJvbCB3aXRoIGxvdyBvZmYgLyBoaWdoIG9uLiAqLwotICAgICAgICB9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbiB8IFRFUk1fTFZEX0hJOworCQkJLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9mZiAvIGhpZ2ggb24uICovCisJCX0gZWxzZSBpZiAoZWVwX2NvbmZpZy50ZXJtaW5hdGlvbl9sdmQgPT0gMikgeworCQkJYXNjX2R2Yy0+Y2ZnLT50ZXJtaW5hdGlvbiA9IHRlcm1pbmF0aW9uIHwgVEVSTV9MVkRfSEk7CiAKLSAgICAgICAgLyogRW5hYmxlIG1hbnVhbCBjb250cm9sIHdpdGggbG93IG9uIC8gaGlnaCBvbi4gKi8KLSAgICAgICAgfSBlbHNlIGlmIChlZXBfY29uZmlnLnRlcm1pbmF0aW9uX2x2ZCA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc2NfZHZjLT5jZmctPnRlcm1pbmF0aW9uID0KLSAgICAgICAgICAgICAgICB0ZXJtaW5hdGlvbiB8IFRFUk1fTFZEOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX2x2ZCcgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCi0gICAgICAgICAgICAgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKLSAgICAgICAgICAgIHdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047Ci0gICAgICAgIH0KLSAgICB9CisJCQkvKiBFbmFibGUgbWFudWFsIGNvbnRyb2wgd2l0aCBsb3cgb24gLyBoaWdoIG9uLiAqLworCQl9IGVsc2UgaWYgKGVlcF9jb25maWcudGVybWluYXRpb25fbHZkID09IDMpIHsKKwkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbiB8IFRFUk1fTFZEOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBFRVBST00gJ3Rlcm1pbmF0aW9uX2x2ZCcgZmllbGQgY29udGFpbnMgYSBiYWQgdmFsdWUuCisJCQkgKiBVc2UgYXV0b21hdGljIHRlcm1pbmF0aW9uIGluc3RlYWQuCisJCQkgKi8KKwkJCWFzY19kdmMtPmNmZy0+dGVybWluYXRpb24gPSB0ZXJtaW5hdGlvbjsKKwkJCXdhcm5fY29kZSB8PSBBU0NfV0FSTl9FRVBST01fVEVSTUlOQVRJT047CisJCX0KKwl9CiAKLSAgICByZXR1cm4gd2Fybl9jb2RlOworCXJldHVybiB3YXJuX2NvZGU7CiB9CiAKIC8qCkBAIC0xNzA0OSw0NSArMTY3MzMsNDIgQEAKICAqCiAgKiBSZXR1cm4gYSBjaGVja3N1bSBiYXNlZCBvbiB0aGUgRUVQUk9NIGNvbmZpZ3VyYXRpb24gcmVhZC4KICAqLwotU1RBVElDIHVzaG9ydCBfX2luaXQKK3N0YXRpYyB1c2hvcnQgX19pbml0CiBBZHZHZXQzNTUwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLCBBRFZFRVBfMzU1MF9DT05GSUcgKmNmZ19idWYpCiB7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICB3dmFsLCBjaGtzdW07Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAqd2J1ZjsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGVlcF9hZGRyOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgKmNoYXJmaWVsZHM7CisJdXNob3J0IHd2YWwsIGNoa3N1bTsKKwl1c2hvcnQgKndidWY7CisJaW50IGVlcF9hZGRyOworCXVzaG9ydCAqY2hhcmZpZWxkczsKIAotICAgIGNoYXJmaWVsZHMgPSAodXNob3J0ICopICZBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyOwotICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7Ci0gICAgY2hrc3VtID0gMDsKKwljaGFyZmllbGRzID0gKHVzaG9ydCAqKSZBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyOworCXdidWYgPSAodXNob3J0ICopY2ZnX2J1ZjsKKwljaGtzdW0gPSAwOwogCi0gICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKLSAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsKLSAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKLSAgICB7Ci0gICAgICAgIHd2YWwgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOwotICAgICAgICBjaGtzdW0gKz0gd3ZhbDsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLwotICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgewotICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSh3dmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICp3YnVmID0gd3ZhbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBSZWFkIGNoZWNrc3VtIHdvcmQuICovCi0gICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOwotICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCWZvciAoZWVwX2FkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47CisJICAgICBlZXBfYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7IGVlcF9hZGRyKyssIHdidWYrKykgeworCQl3dmFsID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKKwkJY2hrc3VtICs9IHd2YWw7CS8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KKwkJaWYgKCpjaGFyZmllbGRzKyspIHsKKwkJCSp3YnVmID0gbGUxNl90b19jcHUod3ZhbCk7CisJCX0gZWxzZSB7CisJCQkqd2J1ZiA9IHd2YWw7CisJCX0KKwl9CisJLyogUmVhZCBjaGVja3N1bSB3b3JkLiAqLworCSp3YnVmID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKKwl3YnVmKys7CisJY2hhcmZpZWxkcysrOwogCi0gICAgLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCi0gICAgZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKLSAgICAgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOwotICAgICAgICAgZWVwX2FkZHIrKywgd2J1ZisrKQotICAgIHsKLSAgICAgICAgKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOwotICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgewotICAgICAgICAgICAgKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNoa3N1bTsKKwkvKiBSZWFkIHJlc3Qgb2YgRUVQUk9NIG5vdCBjb3ZlcmVkIGJ5IHRoZSBjaGVja3N1bS4gKi8KKwlmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOworCSAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7IGVlcF9hZGRyKyssIHdidWYrKykgeworCQkqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisJCWlmICgqY2hhcmZpZWxkcysrKSB7CisJCQkqd2J1ZiA9IGxlMTZfdG9fY3B1KCp3YnVmKTsKKwkJfQorCX0KKwlyZXR1cm4gY2hrc3VtOwogfQogCiAvKgpAQCAtMTcwOTUsNDYgKzE2Nzc2LDQyIEBACiAgKgogICogUmV0dXJuIGEgY2hlY2tzdW0gYmFzZWQgb24gdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uIHJlYWQuCiAgKi8KLVNUQVRJQyB1c2hvcnQgX19pbml0Ci1BZHZHZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKmNmZ19idWYpCitzdGF0aWMgdXNob3J0IF9faW5pdAorQWR2R2V0MzhDMDgwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwgQURWRUVQXzM4QzA4MDBfQ09ORklHICpjZmdfYnVmKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgd3ZhbCwgY2hrc3VtOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgKndidWY7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBlZXBfYWRkcjsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICpjaGFyZmllbGRzOworCXVzaG9ydCB3dmFsLCBjaGtzdW07CisJdXNob3J0ICp3YnVmOworCWludCBlZXBfYWRkcjsKKwl1c2hvcnQgKmNoYXJmaWVsZHM7CiAKLSAgICBjaGFyZmllbGRzID0gKHVzaG9ydCAqKSAmQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKLSAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOwotICAgIGNoa3N1bSA9IDA7CisJY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikmQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKwl3YnVmID0gKHVzaG9ydCAqKWNmZ19idWY7CisJY2hrc3VtID0gMDsKIAotICAgIGZvciAoZWVwX2FkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47Ci0gICAgICAgICBlZXBfYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7Ci0gICAgICAgICBlZXBfYWRkcisrLCB3YnVmKyspCi0gICAgewotICAgICAgICB3dmFsID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKLSAgICAgICAgY2hrc3VtICs9IHd2YWw7IC8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KLSAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKLSAgICAgICAgICAgICp3YnVmID0gbGUxNl90b19jcHUod3ZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqd2J1ZiA9IHd2YWw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogUmVhZCBjaGVja3N1bSB3b3JkLiAqLwotICAgICp3YnVmID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKLSAgICB3YnVmKys7IGNoYXJmaWVsZHMrKzsKKwlmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworCSAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOyBlZXBfYWRkcisrLCB3YnVmKyspIHsKKwkJd3ZhbCA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisJCWNoa3N1bSArPSB3dmFsOwkvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisJCWlmICgqY2hhcmZpZWxkcysrKSB7CisJCQkqd2J1ZiA9IGxlMTZfdG9fY3B1KHd2YWwpOworCQl9IGVsc2UgeworCQkJKndidWYgPSB3dmFsOworCQl9CisJfQorCS8qIFJlYWQgY2hlY2tzdW0gd29yZC4gKi8KKwkqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisJd2J1ZisrOworCWNoYXJmaWVsZHMrKzsKIAotICAgIC8qIFJlYWQgcmVzdCBvZiBFRVBST00gbm90IGNvdmVyZWQgYnkgdGhlIGNoZWNrc3VtLiAqLwotICAgIGZvciAoZWVwX2FkZHIgPSBBRFZfRUVQX0RWQ19DVExfQkVHSU47Ci0gICAgICAgICBlZXBfYWRkciA8IEFEVl9FRVBfTUFYX1dPUkRfQUREUjsKLSAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKLSAgICB7Ci0gICAgICAgICp3YnVmID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKLSAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKLSAgICAgICAgICAgICp3YnVmID0gbGUxNl90b19jcHUoKndidWYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGtzdW07CisJLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCisJZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKwkgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOyBlZXBfYWRkcisrLCB3YnVmKyspIHsKKwkJKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworCQlpZiAoKmNoYXJmaWVsZHMrKykgeworCQkJKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7CisJCX0KKwl9CisJcmV0dXJuIGNoa3N1bTsKIH0KIAogLyoKQEAgLTE3MTQyLDgxICsxNjgxOSw3NCBAQAogICoKICAqIFJldHVybiBhIGNoZWNrc3VtIGJhc2VkIG9uIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiByZWFkLgogICovCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQWR2R2V0MzhDMTYwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzE2MDBfQ09ORklHICpjZmdfYnVmKQorc3RhdGljIHVzaG9ydCBfX2luaXQKK0FkdkdldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqY2ZnX2J1ZikKIHsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIHd2YWwsIGNoa3N1bTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICp3YnVmOwotICAgIGludCAgICAgICAgICAgICAgICAgZWVwX2FkZHI7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAqY2hhcmZpZWxkczsKKwl1c2hvcnQgd3ZhbCwgY2hrc3VtOworCXVzaG9ydCAqd2J1ZjsKKwlpbnQgZWVwX2FkZHI7CisJdXNob3J0ICpjaGFyZmllbGRzOwogCi0gICAgY2hhcmZpZWxkcyA9ICh1c2hvcnQqKSAmQURWRUVQXzM4QzE2MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKLSAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOwotICAgIGNoa3N1bSA9IDA7CisJY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikmQURWRUVQXzM4QzE2MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKwl3YnVmID0gKHVzaG9ydCAqKWNmZ19idWY7CisJY2hrc3VtID0gMDsKIAotICAgIGZvciAoZWVwX2FkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47Ci0gICAgICAgICBlZXBfYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7Ci0gICAgICAgICBlZXBfYWRkcisrLCB3YnVmKyspCi0gICAgewotICAgICAgICB3dmFsID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKLSAgICAgICAgY2hrc3VtICs9IHd2YWw7IC8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KLSAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKLSAgICAgICAgICAgICp3YnVmID0gbGUxNl90b19jcHUod3ZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqd2J1ZiA9IHd2YWw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogUmVhZCBjaGVja3N1bSB3b3JkLiAqLwotICAgICp3YnVmID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKLSAgICB3YnVmKys7IGNoYXJmaWVsZHMrKzsKKwlmb3IgKGVlcF9hZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworCSAgICAgZWVwX2FkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOyBlZXBfYWRkcisrLCB3YnVmKyspIHsKKwkJd3ZhbCA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisJCWNoa3N1bSArPSB3dmFsOwkvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisJCWlmICgqY2hhcmZpZWxkcysrKSB7CisJCQkqd2J1ZiA9IGxlMTZfdG9fY3B1KHd2YWwpOworCQl9IGVsc2UgeworCQkJKndidWYgPSB3dmFsOworCQl9CisJfQorCS8qIFJlYWQgY2hlY2tzdW0gd29yZC4gKi8KKwkqd2J1ZiA9IEFkdlJlYWRFRVBXb3JkKGlvcF9iYXNlLCBlZXBfYWRkcik7CisJd2J1ZisrOworCWNoYXJmaWVsZHMrKzsKIAotICAgIC8qIFJlYWQgcmVzdCBvZiBFRVBST00gbm90IGNvdmVyZWQgYnkgdGhlIGNoZWNrc3VtLiAqLwotICAgIGZvciAoZWVwX2FkZHIgPSBBRFZfRUVQX0RWQ19DVExfQkVHSU47Ci0gICAgICAgICBlZXBfYWRkciA8IEFEVl9FRVBfTUFYX1dPUkRfQUREUjsKLSAgICAgICAgIGVlcF9hZGRyKyssIHdidWYrKykKLSAgICB7Ci0gICAgICAgICp3YnVmID0gQWR2UmVhZEVFUFdvcmQoaW9wX2Jhc2UsIGVlcF9hZGRyKTsKLSAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKLSAgICAgICAgICAgICp3YnVmID0gbGUxNl90b19jcHUoKndidWYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGtzdW07CisJLyogUmVhZCByZXN0IG9mIEVFUFJPTSBub3QgY292ZXJlZCBieSB0aGUgY2hlY2tzdW0uICovCisJZm9yIChlZXBfYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKwkgICAgIGVlcF9hZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOyBlZXBfYWRkcisrLCB3YnVmKyspIHsKKwkJKndidWYgPSBBZHZSZWFkRUVQV29yZChpb3BfYmFzZSwgZWVwX2FkZHIpOworCQlpZiAoKmNoYXJmaWVsZHMrKykgeworCQkJKndidWYgPSBsZTE2X3RvX2NwdSgqd2J1Zik7CisJCX0KKwl9CisJcmV0dXJuIGNoa3N1bTsKIH0KIAogLyoKICAqIFJlYWQgdGhlIEVFUFJPTSBmcm9tIHNwZWNpZmllZCBsb2NhdGlvbgogICovCi1TVEFUSUMgdXNob3J0IF9faW5pdAotQWR2UmVhZEVFUFdvcmQoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIGludCBlZXBfd29yZF9hZGRyKQorc3RhdGljIHVzaG9ydCBfX2luaXQgQWR2UmVhZEVFUFdvcmQoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIGludCBlZXBfd29yZF9hZGRyKQogewotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwKLSAgICAgICAgQVNDX0VFUF9DTURfUkVBRCB8IGVlcF93b3JkX2FkZHIpOwotICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOwotICAgIHJldHVybiBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEpOworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwKKwkJCSAgICAgQVNDX0VFUF9DTURfUkVBRCB8IGVlcF93b3JkX2FkZHIpOworCUFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCXJldHVybiBBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEpOwogfQogCiAvKgogICogV2FpdCBmb3IgRUVQUk9NIGNvbW1hbmQgdG8gY29tcGxldGUKICAqLwotU1RBVElDIHZvaWQgX19pbml0Ci1BZHZXYWl0RUVQQ21kKEFkdlBvcnRBZGRyIGlvcF9iYXNlKQorc3RhdGljIHZvaWQgX19pbml0IEFkdldhaXRFRVBDbWQoQWR2UG9ydEFkZHIgaW9wX2Jhc2UpCiB7Ci0gICAgaW50IGVlcF9kZWxheV9tczsKKwlpbnQgZWVwX2RlbGF5X21zOwogCi0gICAgZm9yIChlZXBfZGVsYXlfbXMgPSAwOyBlZXBfZGVsYXlfbXMgPCBBRFZfRUVQX0RFTEFZX01TOyBlZXBfZGVsYXlfbXMrKykKLSAgICB7Ci0gICAgICAgIGlmIChBZHZSZWFkV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCkgJiBBU0NfRUVQX0NNRF9ET05FKQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKDEpOwotICAgIH0KLSAgICBpZiAoKEFkdlJlYWRXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01EKSAmIEFTQ19FRVBfQ01EX0RPTkUpID09IDApCi0gICAgewotICAgICAgICBBU0NfQVNTRVJUKDApOwotICAgIH0KLSAgICByZXR1cm47CisJZm9yIChlZXBfZGVsYXlfbXMgPSAwOyBlZXBfZGVsYXlfbXMgPCBBRFZfRUVQX0RFTEFZX01TOyBlZXBfZGVsYXlfbXMrKykgeworCQlpZiAoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQpICYKKwkJICAgIEFTQ19FRVBfQ01EX0RPTkUpIHsKKwkJCWJyZWFrOworCQl9CisJCUR2Y1NsZWVwTWlsbGlTZWNvbmQoMSk7CisJfQorCWlmICgoQWR2UmVhZFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQpICYgQVNDX0VFUF9DTURfRE9ORSkgPT0KKwkgICAgMCkgeworCQlBU0NfQVNTRVJUKDApOworCX0KKwlyZXR1cm47CiB9CiAKIC8qCkBAIC0xNzIyNSwyMDEgKzE2ODk1LDIwMiBAQAogdm9pZCBfX2luaXQKIEFkdlNldDM1NTBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIEFEVkVFUF8zNTUwX0NPTkZJRyAqY2ZnX2J1ZikKIHsKLSAgICB1c2hvcnQgKndidWY7Ci0gICAgdXNob3J0IGFkZHIsIGNoa3N1bTsKLSAgICB1c2hvcnQgKmNoYXJmaWVsZHM7CisJdXNob3J0ICp3YnVmOworCXVzaG9ydCBhZGRyLCBjaGtzdW07CisJdXNob3J0ICpjaGFyZmllbGRzOwogCi0gICAgd2J1ZiA9ICh1c2hvcnQgKikgY2ZnX2J1ZjsKLSAgICBjaGFyZmllbGRzID0gKHVzaG9ydCAqKSAmQURWRUVQXzM1NTBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKLSAgICBjaGtzdW0gPSAwOworCXdidWYgPSAodXNob3J0ICopY2ZnX2J1ZjsKKwljaGFyZmllbGRzID0gKHVzaG9ydCAqKSZBRFZFRVBfMzU1MF9Db25maWdfRmllbGRfSXNDaGFyOworCWNoa3N1bSA9IDA7CiAKLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0FCTEUpOwotICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7CisJQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CiAKLSAgICAvKgotICAgICAqIFdyaXRlIEVFUFJPTSBmcm9tIHdvcmQgMCB0byB3b3JkIDIwLgotICAgICAqLwotICAgIGZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKLSAgICAgICAgIGFkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOyBhZGRyKyssIHdidWYrKykKLSAgICB7Ci0gICAgICAgIHVzaG9ydCB3b3JkOworCS8qCisJICogV3JpdGUgRUVQUk9NIGZyb20gd29yZCAwIHRvIHdvcmQgMjAuCisJICovCisJZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOworCSAgICAgYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7IGFkZHIrKywgd2J1ZisrKSB7CisJCXVzaG9ydCB3b3JkOwogCi0gICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7Ci0gICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd29yZCA9ICp3YnVmOwotICAgICAgICB9Ci0gICAgICAgIGNoa3N1bSArPSAqd2J1ZjsgLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLwotICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKLSAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOwotICAgICAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKLSAgICAgICAgRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRUVQX0RFTEFZX01TKTsKLSAgICB9CisJCWlmICgqY2hhcmZpZWxkcysrKSB7CisJCQl3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOworCQl9IGVsc2UgeworCQkJd29yZCA9ICp3YnVmOworCQl9CisJCWNoa3N1bSArPSAqd2J1ZjsJLyogQ2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBmcm9tIHdvcmQgdmFsdWVzLiAqLworCQlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKKwkJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELAorCQkJCSAgICAgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKwkJQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisJCUR2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0VFUF9ERUxBWV9NUyk7CisJfQogCi0gICAgLyoKLSAgICAgKiBXcml0ZSBFRVBST00gY2hlY2tzdW0gYXQgd29yZCAyMS4KLSAgICAgKi8KLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCBjaGtzdW0pOwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKLSAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKLSAgICB3YnVmKys7IGNoYXJmaWVsZHMrKzsKKwkvKgorCSAqIFdyaXRlIEVFUFJPTSBjaGVja3N1bSBhdCB3b3JkIDIxLgorCSAqLworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIGNoa3N1bSk7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworCUFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCXdidWYrKzsKKwljaGFyZmllbGRzKys7CiAKLSAgICAvKgotICAgICAqIFdyaXRlIEVFUFJPTSBPRU0gbmFtZSBhdCB3b3JkcyAyMiB0byAyOS4KLSAgICAgKi8KLSAgICBmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DVExfQkVHSU47Ci0gICAgICAgICBhZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOyBhZGRyKyssIHdidWYrKykKLSAgICB7Ci0gICAgICAgIHVzaG9ydCB3b3JkOworCS8qCisJICogV3JpdGUgRUVQUk9NIE9FTSBuYW1lIGF0IHdvcmRzIDIyIHRvIDI5LgorCSAqLworCWZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKKwkgICAgIGFkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7IGFkZHIrKywgd2J1ZisrKSB7CisJCXVzaG9ydCB3b3JkOwogCi0gICAgICAgIGlmICgqY2hhcmZpZWxkcysrKSB7Ci0gICAgICAgICAgICB3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd29yZCA9ICp3YnVmOwotICAgICAgICB9Ci0gICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOwotICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7Ci0gICAgICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOwotICAgIH0KLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUpOwotICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOwotICAgIHJldHVybjsKKwkJaWYgKCpjaGFyZmllbGRzKyspIHsKKwkJCXdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisJCX0gZWxzZSB7CisJCQl3b3JkID0gKndidWY7CisJCX0KKwkJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7CisJCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwKKwkJCQkgICAgIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisJCUFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCX0KKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0RJU0FCTEUpOworCUFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCXJldHVybjsKIH0KIAogLyoKICAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCiAgKi8KIHZvaWQgX19pbml0Ci1BZHZTZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKmNmZ19idWYpCitBZHZTZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLCBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKmNmZ19idWYpCiB7Ci0gICAgdXNob3J0ICp3YnVmOwotICAgIHVzaG9ydCAqY2hhcmZpZWxkczsKLSAgICB1c2hvcnQgYWRkciwgY2hrc3VtOworCXVzaG9ydCAqd2J1ZjsKKwl1c2hvcnQgKmNoYXJmaWVsZHM7CisJdXNob3J0IGFkZHIsIGNoa3N1bTsKIAotICAgIHdidWYgPSAodXNob3J0ICopIGNmZ19idWY7Ci0gICAgY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikgJkFEVkVFUF8zOEMwODAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7Ci0gICAgY2hrc3VtID0gMDsKKwl3YnVmID0gKHVzaG9ydCAqKWNmZ19idWY7CisJY2hhcmZpZWxkcyA9ICh1c2hvcnQgKikmQURWRUVQXzM4QzA4MDBfQ29uZmlnX0ZpZWxkX0lzQ2hhcjsKKwljaGtzdW0gPSAwOwogCi0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9BQkxFKTsKLSAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFX0FCTEUpOworCUFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOwogCi0gICAgLyoKLSAgICAgKiBXcml0ZSBFRVBST00gZnJvbSB3b3JkIDAgdG8gd29yZCAyMC4KLSAgICAgKi8KLSAgICBmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47Ci0gICAgICAgICBhZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsgYWRkcisrLCB3YnVmKyspCi0gICAgewotICAgICAgICB1c2hvcnQgd29yZDsKKwkvKgorCSAqIFdyaXRlIEVFUFJPTSBmcm9tIHdvcmQgMCB0byB3b3JkIDIwLgorCSAqLworCWZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NGR19CRUdJTjsKKwkgICAgIGFkZHIgPCBBRFZfRUVQX0RWQ19DRkdfRU5EOyBhZGRyKyssIHdidWYrKykgeworCQl1c2hvcnQgd29yZDsKIAotICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgewotICAgICAgICAgICAgd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdvcmQgPSAqd2J1ZjsKLSAgICAgICAgfQotICAgICAgICBjaGtzdW0gKz0gKndidWY7IC8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KLSAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7Ci0gICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKLSAgICAgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7Ci0gICAgICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoQURWX0VFUF9ERUxBWV9NUyk7Ci0gICAgfQorCQlpZiAoKmNoYXJmaWVsZHMrKykgeworCQkJd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKwkJfSBlbHNlIHsKKwkJCXdvcmQgPSAqd2J1ZjsKKwkJfQorCQljaGtzdW0gKz0gKndidWY7CS8qIENoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgZnJvbSB3b3JkIHZhbHVlcy4gKi8KKwkJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7CisJCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwKKwkJCQkgICAgIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisJCUFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOworCQlEdmNTbGVlcE1pbGxpU2Vjb25kKEFEVl9FRVBfREVMQVlfTVMpOworCX0KIAotICAgIC8qCi0gICAgICogV3JpdGUgRUVQUk9NIGNoZWNrc3VtIGF0IHdvcmQgMjEuCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgY2hrc3VtKTsKLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7Ci0gICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7Ci0gICAgd2J1ZisrOyBjaGFyZmllbGRzKys7CisJLyoKKwkgKiBXcml0ZSBFRVBST00gY2hlY2tzdW0gYXQgd29yZCAyMS4KKwkgKi8KKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCBjaGtzdW0pOworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKwlBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKwl3YnVmKys7CisJY2hhcmZpZWxkcysrOwogCi0gICAgLyoKLSAgICAgKiBXcml0ZSBFRVBST00gT0VNIG5hbWUgYXQgd29yZHMgMjIgdG8gMjkuCi0gICAgICovCi0gICAgZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOwotICAgICAgICAgYWRkciA8IEFEVl9FRVBfTUFYX1dPUkRfQUREUjsgYWRkcisrLCB3YnVmKyspCi0gICAgewotICAgICAgICB1c2hvcnQgd29yZDsKKwkvKgorCSAqIFdyaXRlIEVFUFJPTSBPRU0gbmFtZSBhdCB3b3JkcyAyMiB0byAyOS4KKwkgKi8KKwlmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DVExfQkVHSU47CisJICAgICBhZGRyIDwgQURWX0VFUF9NQVhfV09SRF9BRERSOyBhZGRyKyssIHdidWYrKykgeworCQl1c2hvcnQgd29yZDsKIAotICAgICAgICBpZiAoKmNoYXJmaWVsZHMrKykgewotICAgICAgICAgICAgd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdvcmQgPSAqd2J1ZjsKLSAgICAgICAgfQotICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKLSAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOwotICAgICAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKLSAgICB9Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKLSAgICBBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKLSAgICByZXR1cm47CisJCWlmICgqY2hhcmZpZWxkcysrKSB7CisJCQl3b3JkID0gY3B1X3RvX2xlMTYoKndidWYpOworCQl9IGVsc2UgeworCQkJd29yZCA9ICp3YnVmOworCQl9CisJCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOworCQlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsCisJCQkJICAgICBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworCQlBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKwl9CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9ESVNBQkxFKTsKKwlBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKwlyZXR1cm47CiB9CiAKIC8qCiAgKiBXcml0ZSB0aGUgRUVQUk9NIGZyb20gJ2NmZ19idWYnLgogICovCiB2b2lkIF9faW5pdAotQWR2U2V0MzhDMTYwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQURWRUVQXzM4QzE2MDBfQ09ORklHICpjZmdfYnVmKQorQWR2U2V0MzhDMTYwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwgQURWRUVQXzM4QzE2MDBfQ09ORklHICpjZmdfYnVmKQogewotICAgIHVzaG9ydCAgICAgICAgICAgICAgKndidWY7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICAqY2hhcmZpZWxkczsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIGFkZHIsIGNoa3N1bTsKKwl1c2hvcnQgKndidWY7CisJdXNob3J0ICpjaGFyZmllbGRzOworCXVzaG9ydCBhZGRyLCBjaGtzdW07CiAKLSAgICB3YnVmID0gKHVzaG9ydCAqKSBjZmdfYnVmOwotICAgIGNoYXJmaWVsZHMgPSAodXNob3J0ICopICZBRFZFRVBfMzhDMTYwMF9Db25maWdfRmllbGRfSXNDaGFyOwotICAgIGNoa3N1bSA9IDA7CisJd2J1ZiA9ICh1c2hvcnQgKiljZmdfYnVmOworCWNoYXJmaWVsZHMgPSAodXNob3J0ICopJkFEVkVFUF8zOEMxNjAwX0NvbmZpZ19GaWVsZF9Jc0NoYXI7CisJY2hrc3VtID0gMDsKIAotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfQUJMRSk7Ci0gICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURV9BQkxFKTsKKwlBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKIAotICAgIC8qCi0gICAgICogV3JpdGUgRUVQUk9NIGZyb20gd29yZCAwIHRvIHdvcmQgMjAuCi0gICAgICovCi0gICAgZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ0ZHX0JFR0lOOwotICAgICAgICAgYWRkciA8IEFEVl9FRVBfRFZDX0NGR19FTkQ7IGFkZHIrKywgd2J1ZisrKQotICAgIHsKLSAgICAgICAgdXNob3J0IHdvcmQ7CisJLyoKKwkgKiBXcml0ZSBFRVBST00gZnJvbSB3b3JkIDAgdG8gd29yZCAyMC4KKwkgKi8KKwlmb3IgKGFkZHIgPSBBRFZfRUVQX0RWQ19DRkdfQkVHSU47CisJICAgICBhZGRyIDwgQURWX0VFUF9EVkNfQ0ZHX0VORDsgYWRkcisrLCB3YnVmKyspIHsKKwkJdXNob3J0IHdvcmQ7CiAKLSAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKLSAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3b3JkID0gKndidWY7Ci0gICAgICAgIH0KLSAgICAgICAgY2hrc3VtICs9ICp3YnVmOyAvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCi0gICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOwotICAgICAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7Ci0gICAgICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOwotICAgICAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKEFEVl9FRVBfREVMQVlfTVMpOwotICAgIH0KKwkJaWYgKCpjaGFyZmllbGRzKyspIHsKKwkJCXdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7CisJCX0gZWxzZSB7CisJCQl3b3JkID0gKndidWY7CisJCX0KKwkJY2hrc3VtICs9ICp3YnVmOwkvKiBDaGVja3N1bSBpcyBjYWxjdWxhdGVkIGZyb20gd29yZCB2YWx1ZXMuICovCisJCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIHdvcmQpOworCQlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsCisJCQkJICAgICBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOworCQlBZHZXYWl0RUVQQ21kKGlvcF9iYXNlKTsKKwkJRHZjU2xlZXBNaWxsaVNlY29uZChBRFZfRUVQX0RFTEFZX01TKTsKKwl9CiAKLSAgICAvKgotICAgICAqIFdyaXRlIEVFUFJPTSBjaGVja3N1bSBhdCB3b3JkIDIxLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0RBVEEsIGNoa3N1bSk7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELCBBU0NfRUVQX0NNRF9XUklURSB8IGFkZHIpOwotICAgIEFkdldhaXRFRVBDbWQoaW9wX2Jhc2UpOwotICAgIHdidWYrKzsgY2hhcmZpZWxkcysrOworCS8qCisJICogV3JpdGUgRUVQUk9NIGNoZWNrc3VtIGF0IHdvcmQgMjEuCisJICovCisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgY2hrc3VtKTsKKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9DTUQsIEFTQ19FRVBfQ01EX1dSSVRFIHwgYWRkcik7CisJQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisJd2J1ZisrOworCWNoYXJmaWVsZHMrKzsKIAotICAgIC8qCi0gICAgICogV3JpdGUgRUVQUk9NIE9FTSBuYW1lIGF0IHdvcmRzIDIyIHRvIDI5LgotICAgICAqLwotICAgIGZvciAoYWRkciA9IEFEVl9FRVBfRFZDX0NUTF9CRUdJTjsKLSAgICAgICAgIGFkZHIgPCBBRFZfRUVQX01BWF9XT1JEX0FERFI7IGFkZHIrKywgd2J1ZisrKQotICAgIHsKLSAgICAgICAgdXNob3J0IHdvcmQ7CisJLyoKKwkgKiBXcml0ZSBFRVBST00gT0VNIG5hbWUgYXQgd29yZHMgMjIgdG8gMjkuCisJICovCisJZm9yIChhZGRyID0gQURWX0VFUF9EVkNfQ1RMX0JFR0lOOworCSAgICAgYWRkciA8IEFEVl9FRVBfTUFYX1dPUkRfQUREUjsgYWRkcisrLCB3YnVmKyspIHsKKwkJdXNob3J0IHdvcmQ7CiAKLSAgICAgICAgaWYgKCpjaGFyZmllbGRzKyspIHsKLSAgICAgICAgICAgIHdvcmQgPSBjcHVfdG9fbGUxNigqd2J1Zik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3b3JkID0gKndidWY7Ci0gICAgICAgIH0KLSAgICAgICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfREFUQSwgd29yZCk7Ci0gICAgICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKLSAgICAgICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7Ci0gICAgfQotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfRElTQUJMRSk7Ci0gICAgQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7Ci0gICAgcmV0dXJuOworCQlpZiAoKmNoYXJmaWVsZHMrKykgeworCQkJd29yZCA9IGNwdV90b19sZTE2KCp3YnVmKTsKKwkJfSBlbHNlIHsKKwkJCXdvcmQgPSAqd2J1ZjsKKwkJfQorCQlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19FRV9EQVRBLCB3b3JkKTsKKwkJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfRUVfQ01ELAorCQkJCSAgICAgQVNDX0VFUF9DTURfV1JJVEUgfCBhZGRyKTsKKwkJQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisJfQorCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0VFX0NNRCwgQVNDX0VFUF9DTURfV1JJVEVfRElTQUJMRSk7CisJQWR2V2FpdEVFUENtZChpb3BfYmFzZSk7CisJcmV0dXJuOwogfQogCiAvKiBhX2FkdmxpYi5jICovCkBAIC0xNzQ0NCwxMjYgKzE3MTE1LDEyMCBAQAogICogICAgICBBRFZfRVJST1IoLTEpIC0gIEludmFsaWQgQURWX1NDU0lfUkVRX1EgcmVxdWVzdCBzdHJ1Y3R1cmUKICAqICAgICAgICAgICAgICAgICAgICAgICBob3N0IElDIGVycm9yLgogICovCi1TVEFUSUMgaW50Ci1BZHZFeGVTY3NpUXVldWUoQURWX0RWQ19WQVIgKmFzY19kdmMsCi0gICAgICAgICAgICAgICAgQURWX1NDU0lfUkVRX1EgKnNjc2lxKQorc3RhdGljIGludCBBZHZFeGVTY3NpUXVldWUoQURWX0RWQ19WQVIgKmFzY19kdmMsIEFEVl9TQ1NJX1JFUV9RICpzY3NpcSkKIHsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICAgIGxhc3RfaW50X2xldmVsOwotICAgIEFkdlBvcnRBZGRyICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgQURWX0RDTlQgICAgICAgICAgICAgICByZXFfc2l6ZTsKLSAgICBBRFZfUEFERFIgICAgICAgICAgICAgIHJlcV9wYWRkcjsKLSAgICBBRFZfQ0FSUl9UICAgICAgICAgICAgICpuZXdfY2FycnA7CisJdWxvbmcgbGFzdF9pbnRfbGV2ZWw7CisJQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisJQURWX0RDTlQgcmVxX3NpemU7CisJQURWX1BBRERSIHJlcV9wYWRkcjsKKwlBRFZfQ0FSUl9UICpuZXdfY2FycnA7CiAKLSAgICBBU0NfQVNTRVJUKHNjc2lxICE9IE5VTEwpOyAvKiAnc2NzaXEnIHNob3VsZCBuZXZlciBiZSBOVUxMLiAqLworCUFTQ19BU1NFUlQoc2NzaXEgIT0gTlVMTCk7CS8qICdzY3NpcScgc2hvdWxkIG5ldmVyIGJlIE5VTEwuICovCiAKLSAgICAvKgotICAgICAqIFRoZSBBRFZfU0NTSV9SRVFfUSAndGFyZ2V0X2lkJyBmaWVsZCBzaG91bGQgbmV2ZXIgZXhjZWVkIEFEVl9NQVhfVElELgotICAgICAqLwotICAgIGlmIChzY3NpcS0+dGFyZ2V0X2lkID4gQURWX01BWF9USUQpCi0gICAgewotICAgICAgICBzY3NpcS0+aG9zdF9zdGF0dXMgPSBRSFNUQV9NX0lOVkFMSURfREVWSUNFOwotICAgICAgICBzY3NpcS0+ZG9uZV9zdGF0dXMgPSBRRF9XSVRIX0VSUk9SOwotICAgICAgICByZXR1cm4gQURWX0VSUk9SOwotICAgIH0KKwkvKgorCSAqIFRoZSBBRFZfU0NTSV9SRVFfUSAndGFyZ2V0X2lkJyBmaWVsZCBzaG91bGQgbmV2ZXIgZXhjZWVkIEFEVl9NQVhfVElELgorCSAqLworCWlmIChzY3NpcS0+dGFyZ2V0X2lkID4gQURWX01BWF9USUQpIHsKKwkJc2NzaXEtPmhvc3Rfc3RhdHVzID0gUUhTVEFfTV9JTlZBTElEX0RFVklDRTsKKwkJc2NzaXEtPmRvbmVfc3RhdHVzID0gUURfV0lUSF9FUlJPUjsKKwkJcmV0dXJuIEFEVl9FUlJPUjsKKwl9CiAKLSAgICBpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CiAKLSAgICBsYXN0X2ludF9sZXZlbCA9IER2Y0VudGVyQ3JpdGljYWwoKTsKKwlsYXN0X2ludF9sZXZlbCA9IER2Y0VudGVyQ3JpdGljYWwoKTsKIAotICAgIC8qCi0gICAgICogQWxsb2NhdGUgYSBjYXJyaWVyIGVuc3VyaW5nIGF0IGxlYXN0IG9uZSBjYXJyaWVyIGFsd2F5cwotICAgICAqIHJlbWFpbnMgb24gdGhlIGZyZWVsaXN0IGFuZCBpbml0aWFsaXplIGZpZWxkcy4KLSAgICAgKi8KLSAgICBpZiAoKG5ld19jYXJycCA9IGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpID09IE5VTEwpCi0gICAgewotICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOwotICAgICAgIHJldHVybiBBRFZfQlVTWTsKLSAgICB9Ci0gICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IChBRFZfQ0FSUl9UICopCi0gICAgICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUobmV3X2NhcnJwLT5uZXh0X3ZwYSkpOwotICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQrKzsKKwkvKgorCSAqIEFsbG9jYXRlIGEgY2FycmllciBlbnN1cmluZyBhdCBsZWFzdCBvbmUgY2FycmllciBhbHdheXMKKwkgKiByZW1haW5zIG9uIHRoZSBmcmVlbGlzdCBhbmQgaW5pdGlhbGl6ZSBmaWVsZHMuCisJICovCisJaWYgKChuZXdfY2FycnAgPSBhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSA9PSBOVUxMKSB7CisJCUR2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworCQlyZXR1cm4gQURWX0JVU1k7CisJfQorCWFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSAoQURWX0NBUlJfVCAqKQorCSAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KG5ld19jYXJycC0+bmV4dF92cGEpKTsKKwlhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250Kys7CiAKLSAgICAvKgotICAgICAqIFNldCB0aGUgY2FycmllciB0byBiZSBhIHN0b3BwZXIgYnkgc2V0dGluZyAnbmV4dF92cGEnCi0gICAgICogdG8gdGhlIHN0b3BwZXIgdmFsdWUuIFRoZSBjdXJyZW50IHN0b3BwZXIgd2lsbCBiZSBjaGFuZ2VkCi0gICAgICogYmVsb3cgdG8gcG9pbnQgdG8gdGhlIG5ldyBzdG9wcGVyLgotICAgICAqLwotICAgIG5ld19jYXJycC0+bmV4dF92cGEgPSBjcHVfdG9fbGUzMihBU0NfQ1FfU1RPUFBFUik7CisJLyoKKwkgKiBTZXQgdGhlIGNhcnJpZXIgdG8gYmUgYSBzdG9wcGVyIGJ5IHNldHRpbmcgJ25leHRfdnBhJworCSAqIHRvIHRoZSBzdG9wcGVyIHZhbHVlLiBUaGUgY3VycmVudCBzdG9wcGVyIHdpbGwgYmUgY2hhbmdlZAorCSAqIGJlbG93IHRvIHBvaW50IHRvIHRoZSBuZXcgc3RvcHBlci4KKwkgKi8KKwluZXdfY2FycnAtPm5leHRfdnBhID0gY3B1X3RvX2xlMzIoQVNDX0NRX1NUT1BQRVIpOwogCi0gICAgLyoKLSAgICAgKiBDbGVhciB0aGUgQURWX1NDU0lfUkVRX1EgZG9uZSBmbGFnLgotICAgICAqLwotICAgIHNjc2lxLT5hX2ZsYWcgJj0gfkFEVl9TQ1NJUV9ET05FOworCS8qCisJICogQ2xlYXIgdGhlIEFEVl9TQ1NJX1JFUV9RIGRvbmUgZmxhZy4KKwkgKi8KKwlzY3NpcS0+YV9mbGFnICY9IH5BRFZfU0NTSVFfRE9ORTsKIAotICAgIHJlcV9zaXplID0gc2l6ZW9mKEFEVl9TQ1NJX1JFUV9RKTsKLSAgICByZXFfcGFkZHIgPSBEdmNHZXRQaHlBZGRyKGFzY19kdmMsIHNjc2lxLCAodWNoYXIgKikgc2NzaXEsCi0gICAgICAgIChBRFZfU0RDTlQgKikgJnJlcV9zaXplLCBBRFZfSVNfU0NTSVFfRkxBRyk7CisJcmVxX3NpemUgPSBzaXplb2YoQURWX1NDU0lfUkVRX1EpOworCXJlcV9wYWRkciA9IER2Y0dldFBoeUFkZHIoYXNjX2R2Yywgc2NzaXEsICh1Y2hhciAqKXNjc2lxLAorCQkJCSAgKEFEVl9TRENOVCAqKSZyZXFfc2l6ZSwgQURWX0lTX1NDU0lRX0ZMQUcpOwogCi0gICAgQVNDX0FTU0VSVChBRFZfMzJCQUxJR04ocmVxX3BhZGRyKSA9PSByZXFfcGFkZHIpOwotICAgIEFTQ19BU1NFUlQocmVxX3NpemUgPj0gc2l6ZW9mKEFEVl9TQ1NJX1JFUV9RKSk7CisJQVNDX0FTU0VSVChBRFZfMzJCQUxJR04ocmVxX3BhZGRyKSA9PSByZXFfcGFkZHIpOworCUFTQ19BU1NFUlQocmVxX3NpemUgPj0gc2l6ZW9mKEFEVl9TQ1NJX1JFUV9RKSk7CiAKLSAgICAvKiBXYWl0IGZvciBhc3NlcnRpb24gYmVmb3JlIG1ha2luZyBsaXR0bGUtZW5kaWFuICovCi0gICAgcmVxX3BhZGRyID0gY3B1X3RvX2xlMzIocmVxX3BhZGRyKTsKKwkvKiBXYWl0IGZvciBhc3NlcnRpb24gYmVmb3JlIG1ha2luZyBsaXR0bGUtZW5kaWFuICovCisJcmVxX3BhZGRyID0gY3B1X3RvX2xlMzIocmVxX3BhZGRyKTsKIAotICAgIC8qIFNhdmUgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzcyBvZiBBRFZfU0NTSV9SRVFfUSBhbmQgY2Fycmllci4gKi8KLSAgICBzY3NpcS0+c2NzaXFfcHRyID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihzY3NpcSkpOwotICAgIHNjc2lxLT5zY3NpcV9ycHRyID0gcmVxX3BhZGRyOworCS8qIFNhdmUgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzcyBvZiBBRFZfU0NTSV9SRVFfUSBhbmQgY2Fycmllci4gKi8KKwlzY3NpcS0+c2NzaXFfcHRyID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihzY3NpcSkpOworCXNjc2lxLT5zY3NpcV9ycHRyID0gcmVxX3BhZGRyOwogCi0gICAgc2NzaXEtPmNhcnJfdmEgPSBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmljcV9zcCkpOwotICAgIC8qCi0gICAgICogRXZlcnkgQURWX0NBUlJfVC5jYXJyX3BhIGlzIGJ5dGUgc3dhcHBlZCB0byBsaXR0bGUtZW5kaWFuCi0gICAgICogb3JkZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLgotICAgICAqLwotICAgIHNjc2lxLT5jYXJyX3BhID0gYXNjX2R2Yy0+aWNxX3NwLT5jYXJyX3BhOworCXNjc2lxLT5jYXJyX3ZhID0gY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihhc2NfZHZjLT5pY3Ffc3ApKTsKKwkvKgorCSAqIEV2ZXJ5IEFEVl9DQVJSX1QuY2Fycl9wYSBpcyBieXRlIHN3YXBwZWQgdG8gbGl0dGxlLWVuZGlhbgorCSAqIG9yZGVyIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlzY3NpcS0+Y2Fycl9wYSA9IGFzY19kdmMtPmljcV9zcC0+Y2Fycl9wYTsKIAotICAgLyoKLSAgICAqIFVzZSB0aGUgY3VycmVudCBzdG9wcGVyIHRvIHNlbmQgdGhlIEFEVl9TQ1NJX1JFUV9RIGNvbW1hbmQgdG8KLSAgICAqIHRoZSBtaWNyb2NvZGUuIFRoZSBuZXdseSBhbGxvY2F0ZWQgc3RvcHBlciB3aWxsIGJlY29tZSB0aGUgbmV3Ci0gICAgKiBzdG9wcGVyLgotICAgICovCi0gICAgYXNjX2R2Yy0+aWNxX3NwLT5hcmVxX3ZwYSA9IHJlcV9wYWRkcjsKKwkvKgorCSAqIFVzZSB0aGUgY3VycmVudCBzdG9wcGVyIHRvIHNlbmQgdGhlIEFEVl9TQ1NJX1JFUV9RIGNvbW1hbmQgdG8KKwkgKiB0aGUgbWljcm9jb2RlLiBUaGUgbmV3bHkgYWxsb2NhdGVkIHN0b3BwZXIgd2lsbCBiZWNvbWUgdGhlIG5ldworCSAqIHN0b3BwZXIuCisJICovCisJYXNjX2R2Yy0+aWNxX3NwLT5hcmVxX3ZwYSA9IHJlcV9wYWRkcjsKIAotICAgIC8qCi0gICAgICogU2V0IHRoZSAnbmV4dF92cGEnIHBvaW50ZXIgZm9yIHRoZSBvbGQgc3RvcHBlciB0byBiZSB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXcgc3RvcHBlci4gVGhlIFJJU0MgY2FuIG9ubHkKLSAgICAgKiBmb2xsb3cgcGh5c2ljYWwgYWRkcmVzc2VzLgotICAgICAqLwotICAgIGFzY19kdmMtPmljcV9zcC0+bmV4dF92cGEgPSBuZXdfY2FycnAtPmNhcnJfcGE7CisJLyoKKwkgKiBTZXQgdGhlICduZXh0X3ZwYScgcG9pbnRlciBmb3IgdGhlIG9sZCBzdG9wcGVyIHRvIGJlIHRoZQorCSAqIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5ldyBzdG9wcGVyLiBUaGUgUklTQyBjYW4gb25seQorCSAqIGZvbGxvdyBwaHlzaWNhbCBhZGRyZXNzZXMuCisJICovCisJYXNjX2R2Yy0+aWNxX3NwLT5uZXh0X3ZwYSA9IG5ld19jYXJycC0+Y2Fycl9wYTsKIAotICAgIC8qCi0gICAgICogU2V0IHRoZSBob3N0IGFkYXB0ZXIgc3RvcHBlciBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBuZXcgY2Fycmllci4KLSAgICAgKi8KLSAgICBhc2NfZHZjLT5pY3Ffc3AgPSBuZXdfY2FycnA7CisJLyoKKwkgKiBTZXQgdGhlIGhvc3QgYWRhcHRlciBzdG9wcGVyIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG5ldyBjYXJyaWVyLgorCSAqLworCWFzY19kdmMtPmljcV9zcCA9IG5ld19jYXJycDsKIAotICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCB8fAotICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRpY2tsZSB0aGUgUklTQyB0byB0ZWxsIGl0IHRvIHJlYWQgaXRzIENvbW1hbmQgUXVldWUgSGVhZCBwb2ludGVyLgotICAgICAgICAgKi8KLSAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX0EpOwotICAgICAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDbGVhciB0aGUgdGlja2xlIHZhbHVlLiBJbiB0aGUgQVNDLTM1NTAgdGhlIFJJU0MgZmxhZwotICAgICAgICAgICAgICogY29tbWFuZCAnY2xyX3RpY2tsZV9hJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAotICAgICAgICAgICAgICogdmFsdWUgaXMgY2xlYXJlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTm90aWZ5IHRoZSBSSVNDIGEgY2FycmllciBpcyByZWFkeSBieSB3cml0aW5nIHRoZSBwaHlzaWNhbAotICAgICAgICAgKiBhZGRyZXNzIG9mIHRoZSBuZXcgY2FycmllciBzdG9wcGVyIHRvIHRoZSBDT01NQSByZWdpc3Rlci4KLSAgICAgICAgICovCi0gICAgICAgIEFkdldyaXRlRFdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QRFdfQ09NTUEsCi0gICAgICAgICAgICAgICAgbGUzMl90b19jcHUobmV3X2NhcnJwLT5jYXJyX3BhKSk7Ci0gICAgfQorCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCB8fAorCSAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQkvKgorCQkgKiBUaWNrbGUgdGhlIFJJU0MgdG8gdGVsbCBpdCB0byByZWFkIGl0cyBDb21tYW5kIFF1ZXVlIEhlYWQgcG9pbnRlci4KKwkJICovCisJCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1RJQ0tMRSwgQURWX1RJQ0tMRV9BKTsKKwkJaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCQkvKgorCQkJICogQ2xlYXIgdGhlIHRpY2tsZSB2YWx1ZS4gSW4gdGhlIEFTQy0zNTUwIHRoZSBSSVNDIGZsYWcKKwkJCSAqIGNvbW1hbmQgJ2Nscl90aWNrbGVfYScgZG9lcyBub3Qgd29yayB1bmxlc3MgdGhlIGhvc3QKKwkJCSAqIHZhbHVlIGlzIGNsZWFyZWQuCisJCQkgKi8KKwkJCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1RJQ0tMRSwKKwkJCQkJICAgICBBRFZfVElDS0xFX05PUCk7CisJCX0KKwl9IGVsc2UgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKSB7CisJCS8qCisJCSAqIE5vdGlmeSB0aGUgUklTQyBhIGNhcnJpZXIgaXMgcmVhZHkgYnkgd3JpdGluZyB0aGUgcGh5c2ljYWwKKwkJICogYWRkcmVzcyBvZiB0aGUgbmV3IGNhcnJpZXIgc3RvcHBlciB0byB0aGUgQ09NTUEgcmVnaXN0ZXIuCisJCSAqLworCQlBZHZXcml0ZURXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUERXX0NPTU1BLAorCQkJCSAgICAgIGxlMzJfdG9fY3B1KG5ld19jYXJycC0+Y2Fycl9wYSkpOworCX0KIAotICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworCUR2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOwogCi0gICAgcmV0dXJuIEFEVl9TVUNDRVNTOworCXJldHVybiBBRFZfU1VDQ0VTUzsKIH0KIAogLyoKQEAgLTE3NTc1LDQyICsxNzI0MCwzOSBAQAogICogICAgICBBRFZfRVJST1IoLTEpIC0gTWljcm9jb2RlIGNvbW1hbmQgdGltZWQtb3V0LiBNaWNyb2NvZGUgb3IgSUMKICAqICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBodW5nIHdoaWNoIHJlcXVpcmVzIGRyaXZlciByZWNvdmVyeS4KICAqLwotU1RBVElDIGludAotQWR2UmVzZXRTQihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3N0YXRpYyBpbnQgQWR2UmVzZXRTQihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKIHsKLSAgICBpbnQgICAgICAgICBzdGF0dXM7CisJaW50IHN0YXR1czsKIAotICAgIC8qCi0gICAgICogU2VuZCB0aGUgU0NTSSBCdXMgUmVzZXQgaWRsZSBzdGFydCBpZGxlIGNvbW1hbmQgd2hpY2ggYXNzZXJ0cwotICAgICAqIHRoZSBTQ1NJIEJ1cyBSZXNldCBzaWduYWwuCi0gICAgICovCi0gICAgc3RhdHVzID0gQWR2U2VuZElkbGVDbWQoYXNjX2R2YywgKHVzaG9ydCkgSURMRV9DTURfU0NTSV9SRVNFVF9TVEFSVCwgMEwpOwotICAgIGlmIChzdGF0dXMgIT0gQURWX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKwkvKgorCSAqIFNlbmQgdGhlIFNDU0kgQnVzIFJlc2V0IGlkbGUgc3RhcnQgaWRsZSBjb21tYW5kIHdoaWNoIGFzc2VydHMKKwkgKiB0aGUgU0NTSSBCdXMgUmVzZXQgc2lnbmFsLgorCSAqLworCXN0YXR1cyA9IEFkdlNlbmRJZGxlQ21kKGFzY19kdmMsICh1c2hvcnQpSURMRV9DTURfU0NTSV9SRVNFVF9TVEFSVCwgMEwpOworCWlmIChzdGF0dXMgIT0gQURWX1RSVUUpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLSAgICAvKgotICAgICAqIERlbGF5IGZvciB0aGUgc3BlY2lmaWVkIFNDU0kgQnVzIFJlc2V0IGhvbGQgdGltZS4KLSAgICAgKgotICAgICAqIFRoZSBob2xkIHRpbWUgZGVsYXkgaXMgZG9uZSBvbiB0aGUgaG9zdCBiZWNhdXNlIHRoZSBSSVNDIGhhcyBubwotICAgICAqIG1pY3Jvc2Vjb25kIGFjY3VyYXRlIHRpbWVyLgotICAgICAqLwotICAgIER2Y0RlbGF5TWljcm9TZWNvbmQoYXNjX2R2YywgKHVzaG9ydCkgQVNDX1NDU0lfUkVTRVRfSE9MRF9USU1FX1VTKTsKKwkvKgorCSAqIERlbGF5IGZvciB0aGUgc3BlY2lmaWVkIFNDU0kgQnVzIFJlc2V0IGhvbGQgdGltZS4KKwkgKgorCSAqIFRoZSBob2xkIHRpbWUgZGVsYXkgaXMgZG9uZSBvbiB0aGUgaG9zdCBiZWNhdXNlIHRoZSBSSVNDIGhhcyBubworCSAqIG1pY3Jvc2Vjb25kIGFjY3VyYXRlIHRpbWVyLgorCSAqLworCUR2Y0RlbGF5TWljcm9TZWNvbmQoYXNjX2R2YywgKHVzaG9ydClBU0NfU0NTSV9SRVNFVF9IT0xEX1RJTUVfVVMpOwogCi0gICAgLyoKLSAgICAgKiBTZW5kIHRoZSBTQ1NJIEJ1cyBSZXNldCBlbmQgaWRsZSBjb21tYW5kIHdoaWNoIGRlLWFzc2VydHMKLSAgICAgKiB0aGUgU0NTSSBCdXMgUmVzZXQgc2lnbmFsIGFuZCBwdXJnZXMgYW55IHBlbmRpbmcgcmVxdWVzdHMuCi0gICAgICovCi0gICAgc3RhdHVzID0gQWR2U2VuZElkbGVDbWQoYXNjX2R2YywgKHVzaG9ydCkgSURMRV9DTURfU0NTSV9SRVNFVF9FTkQsIDBMKTsKLSAgICBpZiAoc3RhdHVzICE9IEFEVl9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9CisJLyoKKwkgKiBTZW5kIHRoZSBTQ1NJIEJ1cyBSZXNldCBlbmQgaWRsZSBjb21tYW5kIHdoaWNoIGRlLWFzc2VydHMKKwkgKiB0aGUgU0NTSSBCdXMgUmVzZXQgc2lnbmFsIGFuZCBwdXJnZXMgYW55IHBlbmRpbmcgcmVxdWVzdHMuCisJICovCisJc3RhdHVzID0gQWR2U2VuZElkbGVDbWQoYXNjX2R2YywgKHVzaG9ydClJRExFX0NNRF9TQ1NJX1JFU0VUX0VORCwgMEwpOworCWlmIChzdGF0dXMgIT0gQURWX1RSVUUpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLSAgICBEdmNTbGVlcE1pbGxpU2Vjb25kKChBRFZfRENOVCkgYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ICogMTAwMCk7CisJRHZjU2xlZXBNaWxsaVNlY29uZCgoQURWX0RDTlQpYXNjX2R2Yy0+c2NzaV9yZXNldF93YWl0ICogMTAwMCk7CiAKLSAgICByZXR1cm4gc3RhdHVzOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0xNzYyMCw5OSArMTcyODIsODkgQEAKICAqICAgICAgQURWX1RSVUUoMSkgLSAgIENoaXAgcmUtaW5pdGlhbGl6YXRpb24gYW5kIFNDU0kgQnVzIFJlc2V0IHN1Y2Nlc3NmdWwuCiAgKiAgICAgIEFEVl9GQUxTRSgwKSAtICBDaGlwIHJlLWluaXRpYWxpemF0aW9uIGFuZCBTQ1NJIEJ1cyBSZXNldCBmYWlsdXJlLgogICovCi1TVEFUSUMgaW50Ci1BZHZSZXNldENoaXBBbmRTQihBRFZfRFZDX1ZBUiAqYXNjX2R2YykKK3N0YXRpYyBpbnQgQWR2UmVzZXRDaGlwQW5kU0IoQURWX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgaW50ICAgICAgICAgc3RhdHVzOwotICAgIHVzaG9ydCAgICAgIHdkdHJfYWJsZSwgc2R0cl9hYmxlLCB0YWdxbmdfYWJsZTsKLSAgICB1c2hvcnQgICAgICBwcHJfYWJsZSA9IDA7Ci0gICAgdWNoYXIgICAgICAgdGlkLCBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07Ci0gICAgQWR2UG9ydEFkZHIgaW9wX2Jhc2U7Ci0gICAgdXNob3J0ICAgICAgYmlvc19zaWc7CisJaW50IHN0YXR1czsKKwl1c2hvcnQgd2R0cl9hYmxlLCBzZHRyX2FibGUsIHRhZ3FuZ19hYmxlOworCXVzaG9ydCBwcHJfYWJsZSA9IDA7CisJdWNoYXIgdGlkLCBtYXhfY21kW0FEVl9NQVhfVElEICsgMV07CisJQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisJdXNob3J0IGJpb3Nfc2lnOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwogCi0gICAgLyoKLSAgICAgKiBTYXZlIGN1cnJlbnQgcGVyIFRJRCBuZWdvdGlhdGVkIHZhbHVlcy4KLSAgICAgKi8KLSAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7Ci0gICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOwotICAgIGlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkKLSAgICB7Ci0gICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7Ci0gICAgfQotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7Ci0gICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQotICAgIHsKLSAgICAgICAgQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCi0gICAgICAgICAgICBtYXhfY21kW3RpZF0pOwotICAgIH0KKwkvKgorCSAqIFNhdmUgY3VycmVudCBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgorCSAqLworCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKwlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIHNkdHJfYWJsZSk7CisJaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKSB7CisJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1BQUl9BQkxFLCBwcHJfYWJsZSk7CisJfQorCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisJZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKSB7CisJCUFkdlJlYWRCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAorCQkJCW1heF9jbWRbdGlkXSk7CisJfQogCi0gICAgLyoKLSAgICAgKiBGb3JjZSB0aGUgQWR2SW5pdEFzYzM1NTAvMzhDMDgwMERyaXZlcigpIGZ1bmN0aW9uIHRvCi0gICAgICogcGVyZm9ybSBhIFNDU0kgQnVzIFJlc2V0IGJ5IGNsZWFyaW5nIHRoZSBCSU9TIHNpZ25hdHVyZSB3b3JkLgotICAgICAqIFRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgYXNzdW1lcyBhIFNDU0kgQnVzIFJlc2V0IGlzIG5vdAotICAgICAqIG5lZWRlZCBpZiB0aGUgQklPUyBzaWduYXR1cmUgd29yZCBpcyBwcmVzZW50LgotICAgICAqLwotICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NfU0lHTkFUVVJFLCBiaW9zX3NpZyk7Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0JJT1NfU0lHTkFUVVJFLCAwKTsKKwkvKgorCSAqIEZvcmNlIHRoZSBBZHZJbml0QXNjMzU1MC8zOEMwODAwRHJpdmVyKCkgZnVuY3Rpb24gdG8KKwkgKiBwZXJmb3JtIGEgU0NTSSBCdXMgUmVzZXQgYnkgY2xlYXJpbmcgdGhlIEJJT1Mgc2lnbmF0dXJlIHdvcmQuCisJICogVGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBhc3N1bWVzIGEgU0NTSSBCdXMgUmVzZXQgaXMgbm90CisJICogbmVlZGVkIGlmIHRoZSBCSU9TIHNpZ25hdHVyZSB3b3JkIGlzIHByZXNlbnQuCisJICovCisJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU19TSUdOQVRVUkUsIGJpb3Nfc2lnKTsKKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU19TSUdOQVRVUkUsIDApOwogCi0gICAgLyoKLSAgICAgKiBTdG9wIGNoaXAgYW5kIHJlc2V0IGl0LgotICAgICAqLwotICAgIEFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX1JJU0NfQ1NSLCBBRFZfUklTQ19DU1JfU1RPUCk7Ci0gICAgQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ1RSTF9SRUcsIEFEVl9DVFJMX1JFR19DTURfUkVTRVQpOwotICAgIER2Y1NsZWVwTWlsbGlTZWNvbmQoMTAwKTsKLSAgICBBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19DVFJMX1JFRywgQURWX0NUUkxfUkVHX0NNRF9XUl9JT19SRUcpOworCS8qCisJICogU3RvcCBjaGlwIGFuZCByZXNldCBpdC4KKwkgKi8KKwlBZHZXcml0ZVdvcmRSZWdpc3Rlcihpb3BfYmFzZSwgSU9QV19SSVNDX0NTUiwgQURWX1JJU0NfQ1NSX1NUT1ApOworCUFkdldyaXRlV29yZFJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BXX0NUUkxfUkVHLCBBRFZfQ1RSTF9SRUdfQ01EX1JFU0VUKTsKKwlEdmNTbGVlcE1pbGxpU2Vjb25kKDEwMCk7CisJQWR2V3JpdGVXb3JkUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUFdfQ1RSTF9SRUcsCisJCQkgICAgIEFEVl9DVFJMX1JFR19DTURfV1JfSU9fUkVHKTsKIAotICAgIC8qCi0gICAgICogUmVzZXQgQWR2IExpYnJhcnkgZXJyb3IgY29kZSwgaWYgYW55LCBhbmQgdHJ5Ci0gICAgICogcmUtaW5pdGlhbGl6aW5nIHRoZSBjaGlwLgotICAgICAqLwotICAgIGFzY19kdmMtPmVycl9jb2RlID0gMDsKLSAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzE2MDApCi0gICAgewotICAgICAgICBzdGF0dXMgPSBBZHZJbml0QXNjMzhDMTYwMERyaXZlcihhc2NfZHZjKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApCi0gICAgewotICAgICAgICBzdGF0dXMgPSBBZHZJbml0QXNjMzhDMDgwMERyaXZlcihhc2NfZHZjKTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IEFkdkluaXRBc2MzNTUwRHJpdmVyKGFzY19kdmMpOwotICAgIH0KKwkvKgorCSAqIFJlc2V0IEFkdiBMaWJyYXJ5IGVycm9yIGNvZGUsIGlmIGFueSwgYW5kIHRyeQorCSAqIHJlLWluaXRpYWxpemluZyB0aGUgY2hpcC4KKwkgKi8KKwlhc2NfZHZjLT5lcnJfY29kZSA9IDA7CisJaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzOEMxNjAwKSB7CisJCXN0YXR1cyA9IEFkdkluaXRBc2MzOEMxNjAwRHJpdmVyKGFzY19kdmMpOworCX0gZWxzZSBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJc3RhdHVzID0gQWR2SW5pdEFzYzM4QzA4MDBEcml2ZXIoYXNjX2R2Yyk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQWR2SW5pdEFzYzM1NTBEcml2ZXIoYXNjX2R2Yyk7CisJfQogCi0gICAgLyogVHJhbnNsYXRlIGluaXRpYWxpemF0aW9uIHJldHVybiB2YWx1ZSB0byBzdGF0dXMgdmFsdWUuICovCi0gICAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gQURWX1RSVUU7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICBzdGF0dXMgPSBBRFZfRkFMU0U7Ci0gICAgfQorCS8qIFRyYW5zbGF0ZSBpbml0aWFsaXphdGlvbiByZXR1cm4gdmFsdWUgdG8gc3RhdHVzIHZhbHVlLiAqLworCWlmIChzdGF0dXMgPT0gMCkgeworCQlzdGF0dXMgPSBBRFZfVFJVRTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBBRFZfRkFMU0U7CisJfQogCi0gICAgLyoKLSAgICAgKiBSZXN0b3JlIHRoZSBCSU9TIHNpZ25hdHVyZSB3b3JkLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19CSU9TX1NJR05BVFVSRSwgYmlvc19zaWcpOworCS8qCisJICogUmVzdG9yZSB0aGUgQklPUyBzaWduYXR1cmUgd29yZC4KKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfQklPU19TSUdOQVRVUkUsIGJpb3Nfc2lnKTsKIAotICAgIC8qCi0gICAgICogUmVzdG9yZSBwZXIgVElEIG5lZ290aWF0ZWQgdmFsdWVzLgotICAgICAqLwotICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIHdkdHJfYWJsZSk7Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgc2R0cl9hYmxlKTsKLSAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzE2MDApCi0gICAgewotICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfUFBSX0FCTEUsIHBwcl9hYmxlKTsKLSAgICB9Ci0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7Ci0gICAgZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKQotICAgIHsKLSAgICAgICAgQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwgQVNDX01DX05VTUJFUl9PRl9NQVhfQ01EICsgdGlkLAotICAgICAgICAgICAgbWF4X2NtZFt0aWRdKTsKLSAgICB9CisJLyoKKwkgKiBSZXN0b3JlIHBlciBUSUQgbmVnb3RpYXRlZCB2YWx1ZXMuCisJICovCisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1dEVFJfQUJMRSwgd2R0cl9hYmxlKTsKKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBzZHRyX2FibGUpOworCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCkgeworCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfUFBSX0FCTEUsIHBwcl9hYmxlKTsKKwl9CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCB0YWdxbmdfYWJsZSk7CisJZm9yICh0aWQgPSAwOyB0aWQgPD0gQURWX01BWF9USUQ7IHRpZCsrKSB7CisJCUFkdldyaXRlQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKwkJCQkgbWF4X2NtZFt0aWRdKTsKKwl9CiAKLSAgICByZXR1cm4gc3RhdHVzOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0xNzczNCwxNTggKzE3Mzg2LDE1MSBAQAogICogICBBRFZfVFJVRSgxKSAtIGludGVycnVwdCB3YXMgcGVuZGluZwogICogICBBRFZfRkFMU0UoMCkgLSBubyBpbnRlcnJ1cHQgd2FzIHBlbmRpbmcKICAqLwotU1RBVElDIGludAotQWR2SVNSKEFEVl9EVkNfVkFSICphc2NfZHZjKQorc3RhdGljIGludCBBZHZJU1IoQURWX0RWQ19WQVIgKmFzY19kdmMpCiB7Ci0gICAgQWR2UG9ydEFkZHIgICAgICAgICAgICAgICAgIGlvcF9iYXNlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgICAgICAgICBpbnRfc3RhdDsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2JpdDsKLSAgICBBRFZfQ0FSUl9UICAgICAgICAgICAgICAgICAgKmZyZWVfY2FycnA7Ci0gICAgQURWX1ZBRERSICAgICAgICAgICAgICAgICAgIGlycV9uZXh0X3ZwYTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgQURWX1NDU0lfUkVRX1EgICAgICAgICAgICAgICpzY3NpcTsKKwlBZHZQb3J0QWRkciBpb3BfYmFzZTsKKwl1Y2hhciBpbnRfc3RhdDsKKwl1c2hvcnQgdGFyZ2V0X2JpdDsKKwlBRFZfQ0FSUl9UICpmcmVlX2NhcnJwOworCUFEVl9WQUREUiBpcnFfbmV4dF92cGE7CisJaW50IGZsYWdzOworCUFEVl9TQ1NJX1JFUV9RICpzY3NpcTsKIAotICAgIGZsYWdzID0gRHZjRW50ZXJDcml0aWNhbCgpOworCWZsYWdzID0gRHZjRW50ZXJDcml0aWNhbCgpOwogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKKwlpb3BfYmFzZSA9IGFzY19kdmMtPmlvcF9iYXNlOwogCi0gICAgLyogUmVhZGluZyB0aGUgcmVnaXN0ZXIgY2xlYXJzIHRoZSBpbnRlcnJ1cHQuICovCi0gICAgaW50X3N0YXQgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfU1RBVFVTX1JFRyk7CisJLyogUmVhZGluZyB0aGUgcmVnaXN0ZXIgY2xlYXJzIHRoZSBpbnRlcnJ1cHQuICovCisJaW50X3N0YXQgPSBBZHZSZWFkQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX0lOVFJfU1RBVFVTX1JFRyk7CiAKLSAgICBpZiAoKGludF9zdGF0ICYgKEFEVl9JTlRSX1NUQVRVU19JTlRSQSB8IEFEVl9JTlRSX1NUQVRVU19JTlRSQiB8Ci0gICAgICAgICBBRFZfSU5UUl9TVEFUVVNfSU5UUkMpKSA9PSAwKQotICAgIHsKLSAgICAgICAgRHZjTGVhdmVDcml0aWNhbChmbGFncyk7Ci0gICAgICAgIHJldHVybiBBRFZfRkFMU0U7Ci0gICAgfQorCWlmICgoaW50X3N0YXQgJiAoQURWX0lOVFJfU1RBVFVTX0lOVFJBIHwgQURWX0lOVFJfU1RBVFVTX0lOVFJCIHwKKwkJCSBBRFZfSU5UUl9TVEFUVVNfSU5UUkMpKSA9PSAwKSB7CisJCUR2Y0xlYXZlQ3JpdGljYWwoZmxhZ3MpOworCQlyZXR1cm4gQURWX0ZBTFNFOworCX0KIAotICAgIC8qCi0gICAgICogTm90aWZ5IHRoZSBkcml2ZXIgb2YgYW4gYXN5bmNocm9ub3VzIG1pY3JvY29kZSBjb25kaXRpb24gYnkKLSAgICAgKiBjYWxsaW5nIHRoZSBBRFZfRFZDX1ZBUi5hc3luY19jYWxsYmFjayBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uCi0gICAgICogaXMgcGFzc2VkIHRoZSBtaWNyb2NvZGUgQVNDX01DX0lOVFJCX0NPREUgYnl0ZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpZiAoaW50X3N0YXQgJiBBRFZfSU5UUl9TVEFUVVNfSU5UUkIpCi0gICAgewotICAgICAgICB1Y2hhciBpbnRyYl9jb2RlOworCS8qCisJICogTm90aWZ5IHRoZSBkcml2ZXIgb2YgYW4gYXN5bmNocm9ub3VzIG1pY3JvY29kZSBjb25kaXRpb24gYnkKKwkgKiBjYWxsaW5nIHRoZSBBRFZfRFZDX1ZBUi5hc3luY19jYWxsYmFjayBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uCisJICogaXMgcGFzc2VkIHRoZSBtaWNyb2NvZGUgQVNDX01DX0lOVFJCX0NPREUgYnl0ZSB2YWx1ZS4KKwkgKi8KKwlpZiAoaW50X3N0YXQgJiBBRFZfSU5UUl9TVEFUVVNfSU5UUkIpIHsKKwkJdWNoYXIgaW50cmJfY29kZTsKIAotICAgICAgICBBZHZSZWFkQnl0ZUxyYW0oaW9wX2Jhc2UsIEFTQ19NQ19JTlRSQl9DT0RFLCBpbnRyYl9jb2RlKTsKKwkJQWR2UmVhZEJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSU5UUkJfQ09ERSwgaW50cmJfY29kZSk7CiAKLSAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwIHx8Ci0gICAgICAgICAgICBhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGludHJiX2NvZGUgPT0gQURWX0FTWU5DX0NBUlJJRVJfUkVBRFlfRkFJTFVSRSAmJgotICAgICAgICAgICAgICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsIEFEVl9USUNLTEVfQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisJCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzU1MCB8fAorCQkgICAgYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzA4MDApIHsKKwkJCWlmIChpbnRyYl9jb2RlID09IEFEVl9BU1lOQ19DQVJSSUVSX1JFQURZX0ZBSUxVUkUgJiYKKwkJCSAgICBhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250ICE9IDApIHsKKwkJCQlBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsCisJCQkJCQkgICAgIEFEVl9USUNLTEVfQSk7CisJCQkJaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCQkJCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLAorCQkJCQkJCSAgICAgSU9QQl9USUNLTEUsCisJCQkJCQkJICAgICBBRFZfVElDS0xFX05PUCk7CisJCQkJfQorCQkJfQorCQl9CiAKLSAgICAgICAgaWYgKGFzY19kdmMtPmFzeW5jX2NhbGxiYWNrICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgqYXNjX2R2Yy0+YXN5bmNfY2FsbGJhY2spKGFzY19kdmMsIGludHJiX2NvZGUpOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAoYXNjX2R2Yy0+YXN5bmNfY2FsbGJhY2sgIT0gMCkgeworCQkJKCphc2NfZHZjLT5hc3luY19jYWxsYmFjaykgKGFzY19kdmMsIGludHJiX2NvZGUpOworCQl9CisJfQogCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgSVJRIHN0b3BwZXIgY2FycmllciBjb250YWlucyBhIGNvbXBsZXRlZCByZXF1ZXN0LgotICAgICAqLwotICAgIHdoaWxlICgoKGlycV9uZXh0X3ZwYSA9Ci0gICAgICAgICAgICAgbGUzMl90b19jcHUoYXNjX2R2Yy0+aXJxX3NwLT5uZXh0X3ZwYSkpICYgQVNDX1JRX0RPTkUpICE9IDApCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjb21wbGV0ZWQgQURWX1NDU0lfUkVRX1Egc3RydWN0dXJlLgotICAgICAgICAgKiBUaGUgUklTQyB3aWxsIGhhdmUgc2V0ICdhcmVxX3ZwYScgdG8gYSB2aXJ0dWFsIGFkZHJlc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBmaXJtd2FyZSB3aWxsIGhhdmUgY29waWVkIHRoZSBBU0NfU0NTSV9SRVFfUS5zY3NpcV9wdHIKLSAgICAgICAgICogZmllbGQgdG8gdGhlIGNhcnJpZXIgQURWX0NBUlJfVC5hcmVxX3ZwYSBmaWVsZC4gVGhlIGNvbnZlcnNpb24KLSAgICAgICAgICogYmVsb3cgY29tcGxlbWVudHMgdGhlIGNvbnZlcnNpb24gb2YgQVNDX1NDU0lfUkVRX1Euc2NzaXFfcHRyJwotICAgICAgICAgKiBpbiBBZHZFeGVTY3NpUXVldWUoKS4KLSAgICAgICAgICovCi0gICAgICAgIHNjc2lxID0gKEFEVl9TQ1NJX1JFUV9RICopCi0gICAgICAgICAgICBBRFZfVTMyX1RPX1ZBRERSKGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+YXJlcV92cGEpKTsKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBJUlEgc3RvcHBlciBjYXJyaWVyIGNvbnRhaW5zIGEgY29tcGxldGVkIHJlcXVlc3QuCisJICovCisJd2hpbGUgKCgoaXJxX25leHRfdnBhID0KKwkJIGxlMzJfdG9fY3B1KGFzY19kdmMtPmlycV9zcC0+bmV4dF92cGEpKSAmIEFTQ19SUV9ET05FKSAhPSAwKSB7CisJCS8qCisJCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNvbXBsZXRlZCBBRFZfU0NTSV9SRVFfUSBzdHJ1Y3R1cmUuCisJCSAqIFRoZSBSSVNDIHdpbGwgaGF2ZSBzZXQgJ2FyZXFfdnBhJyB0byBhIHZpcnR1YWwgYWRkcmVzcy4KKwkJICoKKwkJICogVGhlIGZpcm13YXJlIHdpbGwgaGF2ZSBjb3BpZWQgdGhlIEFTQ19TQ1NJX1JFUV9RLnNjc2lxX3B0cgorCQkgKiBmaWVsZCB0byB0aGUgY2FycmllciBBRFZfQ0FSUl9ULmFyZXFfdnBhIGZpZWxkLiBUaGUgY29udmVyc2lvbgorCQkgKiBiZWxvdyBjb21wbGVtZW50cyB0aGUgY29udmVyc2lvbiBvZiBBU0NfU0NTSV9SRVFfUS5zY3NpcV9wdHInCisJCSAqIGluIEFkdkV4ZVNjc2lRdWV1ZSgpLgorCQkgKi8KKwkJc2NzaXEgPSAoQURWX1NDU0lfUkVRX1EgKikKKwkJICAgIEFEVl9VMzJfVE9fVkFERFIobGUzMl90b19jcHUoYXNjX2R2Yy0+aXJxX3NwLT5hcmVxX3ZwYSkpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlcXVlc3QgZmluaXNoZWQgd2l0aCBnb29kIHN0YXR1cyBhbmQgdGhlIHF1ZXVlIHdhcyBub3QKLSAgICAgICAgICogRE1BZWQgdG8gaG9zdCBtZW1vcnkgYnkgdGhlIGZpcm13YXJlLiBTZXQgYWxsIHN0YXR1cyBmaWVsZHMKLSAgICAgICAgICogdG8gaW5kaWNhdGUgZ29vZCBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKGlycV9uZXh0X3ZwYSAmIEFTQ19SUV9HT09EKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY3NpcS0+ZG9uZV9zdGF0dXMgPSBRRF9OT19FUlJPUjsKLSAgICAgICAgICAgIHNjc2lxLT5ob3N0X3N0YXR1cyA9IHNjc2lxLT5zY3NpX3N0YXR1cyA9IDA7Ci0gICAgICAgICAgICBzY3NpcS0+ZGF0YV9jbnQgPSAwTDsKLSAgICAgICAgfQorCQkvKgorCQkgKiBSZXF1ZXN0IGZpbmlzaGVkIHdpdGggZ29vZCBzdGF0dXMgYW5kIHRoZSBxdWV1ZSB3YXMgbm90CisJCSAqIERNQWVkIHRvIGhvc3QgbWVtb3J5IGJ5IHRoZSBmaXJtd2FyZS4gU2V0IGFsbCBzdGF0dXMgZmllbGRzCisJCSAqIHRvIGluZGljYXRlIGdvb2Qgc3RhdHVzLgorCQkgKi8KKwkJaWYgKChpcnFfbmV4dF92cGEgJiBBU0NfUlFfR09PRCkgIT0gMCkgeworCQkJc2NzaXEtPmRvbmVfc3RhdHVzID0gUURfTk9fRVJST1I7CisJCQlzY3NpcS0+aG9zdF9zdGF0dXMgPSBzY3NpcS0+c2NzaV9zdGF0dXMgPSAwOworCQkJc2NzaXEtPmRhdGFfY250ID0gMEw7CisJCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBBZHZhbmNlIHRoZSBzdG9wcGVyIHBvaW50ZXIgdG8gdGhlIG5leHQgY2FycmllcgotICAgICAgICAgKiBpZ25vcmluZyB0aGUgbG93ZXIgZm91ciBiaXRzLiBGcmVlIHRoZSBwcmV2aW91cwotICAgICAgICAgKiBzdG9wcGVyIGNhcnJpZXIuCi0gICAgICAgICAqLwotICAgICAgICBmcmVlX2NhcnJwID0gYXNjX2R2Yy0+aXJxX3NwOwotICAgICAgICBhc2NfZHZjLT5pcnFfc3AgPSAoQURWX0NBUlJfVCAqKQotICAgICAgICAgICAgQURWX1UzMl9UT19WQUREUihBU0NfR0VUX0NBUlJQKGlycV9uZXh0X3ZwYSkpOworCQkvKgorCQkgKiBBZHZhbmNlIHRoZSBzdG9wcGVyIHBvaW50ZXIgdG8gdGhlIG5leHQgY2FycmllcgorCQkgKiBpZ25vcmluZyB0aGUgbG93ZXIgZm91ciBiaXRzLiBGcmVlIHRoZSBwcmV2aW91cworCQkgKiBzdG9wcGVyIGNhcnJpZXIuCisJCSAqLworCQlmcmVlX2NhcnJwID0gYXNjX2R2Yy0+aXJxX3NwOworCQlhc2NfZHZjLT5pcnFfc3AgPSAoQURWX0NBUlJfVCAqKQorCQkgICAgQURWX1UzMl9UT19WQUREUihBU0NfR0VUX0NBUlJQKGlycV9uZXh0X3ZwYSkpOwogCi0gICAgICAgIGZyZWVfY2FycnAtPm5leHRfdnBhID0KLSAgICAgICAgICAgICAgICBjcHVfdG9fbGUzMihBRFZfVkFERFJfVE9fVTMyKGFzY19kdmMtPmNhcnJfZnJlZWxpc3QpKTsKLSAgICAgICAgYXNjX2R2Yy0+Y2Fycl9mcmVlbGlzdCA9IGZyZWVfY2FycnA7Ci0gICAgICAgIGFzY19kdmMtPmNhcnJfcGVuZGluZ19jbnQtLTsKKwkJZnJlZV9jYXJycC0+bmV4dF92cGEgPQorCQkgICAgY3B1X3RvX2xlMzIoQURWX1ZBRERSX1RPX1UzMihhc2NfZHZjLT5jYXJyX2ZyZWVsaXN0KSk7CisJCWFzY19kdmMtPmNhcnJfZnJlZWxpc3QgPSBmcmVlX2NhcnJwOworCQlhc2NfZHZjLT5jYXJyX3BlbmRpbmdfY250LS07CiAKLSAgICAgICAgQVNDX0FTU0VSVChzY3NpcSAhPSBOVUxMKTsKLSAgICAgICAgdGFyZ2V0X2JpdCA9IEFEVl9USURfVE9fVElETUFTSyhzY3NpcS0+dGFyZ2V0X2lkKTsKKwkJQVNDX0FTU0VSVChzY3NpcSAhPSBOVUxMKTsKKwkJdGFyZ2V0X2JpdCA9IEFEVl9USURfVE9fVElETUFTSyhzY3NpcS0+dGFyZ2V0X2lkKTsKIAotICAgICAgICAvKgotICAgICAgICAgKiBDbGVhciByZXF1ZXN0IG1pY3JvY29kZSBjb250cm9sIGZsYWcuCi0gICAgICAgICAqLwotICAgICAgICBzY3NpcS0+Y250bCA9IDA7CisJCS8qCisJCSAqIENsZWFyIHJlcXVlc3QgbWljcm9jb2RlIGNvbnRyb2wgZmxhZy4KKwkJICovCisJCXNjc2lxLT5jbnRsID0gMDsKIAotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgY29tbWFuZCB0aGF0IGNvbXBsZXRlZCB3YXMgYSBTQ1NJIElOUVVJUlkgYW5kCi0gICAgICAgICAqIExVTiAwIHdhcyBzZW50IHRoZSBjb21tYW5kLCB0aGVuIHByb2Nlc3MgdGhlIElOUVVJUlkKLSAgICAgICAgICogY29tbWFuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGRldmljZS4KLSAgICAgICAgICoKLSAgICAgICAgICogTm90ZTogSWYgZGF0YSByZXR1cm5lZCB3ZXJlIGVpdGhlciBWUEQgb3IgQ21kRHQgZGF0YSwKLSAgICAgICAgICogZG9uJ3QgcHJvY2VzcyB0aGUgSU5RVUlSWSBjb21tYW5kIGluZm9ybWF0aW9uIGZvcgotICAgICAgICAgKiB0aGUgZGV2aWNlLCBvdGhlcndpc2UgbWF5IGVycm9uZW91c2x5IHNldCAqX2FibGUgYml0cy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzY3NpcS0+ZG9uZV9zdGF0dXMgPT0gUURfTk9fRVJST1IgJiYKLSAgICAgICAgICAgIHNjc2lxLT5jZGJbMF0gPT0gSU5RVUlSWSAmJgotICAgICAgICAgICAgc2NzaXEtPnRhcmdldF9sdW4gPT0gMCAmJgotICAgICAgICAgICAgKHNjc2lxLT5jZGJbMV0gJiBBRFZfSU5RX1JUTl9WUERfQU5EX0NNRERUKQotICAgICAgICAgICAgICAgID09IEFEVl9JTlFfUlROX1NURF9JTlFVSVJZX0RBVEEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkdklucXVpcnlIYW5kbGluZyhhc2NfZHZjLCBzY3NpcSk7Ci0gICAgICAgIH0KKwkJLyoKKwkJICogSWYgdGhlIGNvbW1hbmQgdGhhdCBjb21wbGV0ZWQgd2FzIGEgU0NTSSBJTlFVSVJZIGFuZAorCQkgKiBMVU4gMCB3YXMgc2VudCB0aGUgY29tbWFuZCwgdGhlbiBwcm9jZXNzIHRoZSBJTlFVSVJZCisJCSAqIGNvbW1hbmQgaW5mb3JtYXRpb24gZm9yIHRoZSBkZXZpY2UuCisJCSAqCisJCSAqIE5vdGU6IElmIGRhdGEgcmV0dXJuZWQgd2VyZSBlaXRoZXIgVlBEIG9yIENtZER0IGRhdGEsCisJCSAqIGRvbid0IHByb2Nlc3MgdGhlIElOUVVJUlkgY29tbWFuZCBpbmZvcm1hdGlvbiBmb3IKKwkJICogdGhlIGRldmljZSwgb3RoZXJ3aXNlIG1heSBlcnJvbmVvdXNseSBzZXQgKl9hYmxlIGJpdHMuCisJCSAqLworCQlpZiAoc2NzaXEtPmRvbmVfc3RhdHVzID09IFFEX05PX0VSUk9SICYmCisJCSAgICBzY3NpcS0+Y2RiWzBdID09IElOUVVJUlkgJiYKKwkJICAgIHNjc2lxLT50YXJnZXRfbHVuID09IDAgJiYKKwkJICAgIChzY3NpcS0+Y2RiWzFdICYgQURWX0lOUV9SVE5fVlBEX0FORF9DTUREVCkKKwkJICAgID09IEFEVl9JTlFfUlROX1NURF9JTlFVSVJZX0RBVEEpIHsKKwkJCUFkdklucXVpcnlIYW5kbGluZyhhc2NfZHZjLCBzY3NpcSk7CisJCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBOb3RpZnkgdGhlIGRyaXZlciBvZiB0aGUgY29tcGxldGVkIHJlcXVlc3QgYnkgcGFzc2luZwotICAgICAgICAgKiB0aGUgQURWX1NDU0lfUkVRX1EgcG9pbnRlciB0byBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICAgICAqLwotICAgICAgICBzY3NpcS0+YV9mbGFnIHw9IEFEVl9TQ1NJUV9ET05FOwotICAgICAgICAoKmFzY19kdmMtPmlzcl9jYWxsYmFjaykoYXNjX2R2Yywgc2NzaXEpOwotICAgICAgICAvKgotICAgICAgICAgKiBOb3RlOiBBZnRlciB0aGUgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgJ3Njc2lxJwotICAgICAgICAgKiBjYW4gbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEZhbGwgdGhyb3VnaCBhbmQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBjb21wbGV0ZWQKLSAgICAgICAgICogcmVxdWVzdHMuLi4KLSAgICAgICAgICovCisJCS8qCisJCSAqIE5vdGlmeSB0aGUgZHJpdmVyIG9mIHRoZSBjb21wbGV0ZWQgcmVxdWVzdCBieSBwYXNzaW5nCisJCSAqIHRoZSBBRFZfU0NTSV9SRVFfUSBwb2ludGVyIHRvIGl0cyBjYWxsYmFjayBmdW5jdGlvbi4KKwkJICovCisJCXNjc2lxLT5hX2ZsYWcgfD0gQURWX1NDU0lRX0RPTkU7CisJCSgqYXNjX2R2Yy0+aXNyX2NhbGxiYWNrKSAoYXNjX2R2Yywgc2NzaXEpOworCQkvKgorCQkgKiBOb3RlOiBBZnRlciB0aGUgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgJ3Njc2lxJworCQkgKiBjYW4gbm8gbG9uZ2VyIGJlIHJlZmVyZW5jZWQuCisJCSAqCisJCSAqIEZhbGwgdGhyb3VnaCBhbmQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBjb21wbGV0ZWQKKwkJICogcmVxdWVzdHMuLi4KKwkJICovCiAKLSAgICAgICAgLyoKLSAgICAgICAgICogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGluIGNhc2UgdGhlIGRyaXZlciBpbmFkdmVydGVudGx5Ci0gICAgICAgICAqIGVuYWJsZWQgaW50ZXJydXB0cyBpbiBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBEdmNFbnRlckNyaXRpY2FsKCkgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQsIGJlY2F1c2UKLSAgICAgICAgICogdGhlICdmbGFncycgc2F2ZWQgd2hlbiBBZHZJU1IoKSB3YXMgZmlyc3QgZW50ZXJlZCB3aWxsIGJlCi0gICAgICAgICAqIHVzZWQgdG8gcmVzdG9yZSB0aGUgaW50ZXJydXB0IGZsYWcgb24gZXhpdC4KLSAgICAgICAgICovCi0gICAgICAgICh2b2lkKSBEdmNFbnRlckNyaXRpY2FsKCk7Ci0gICAgfQotICAgIER2Y0xlYXZlQ3JpdGljYWwoZmxhZ3MpOwotICAgIHJldHVybiBBRFZfVFJVRTsKKwkJLyoKKwkJICogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGluIGNhc2UgdGhlIGRyaXZlciBpbmFkdmVydGVudGx5CisJCSAqIGVuYWJsZWQgaW50ZXJydXB0cyBpbiBpdHMgY2FsbGJhY2sgZnVuY3Rpb24uCisJCSAqCisJCSAqIFRoZSBEdmNFbnRlckNyaXRpY2FsKCkgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQsIGJlY2F1c2UKKwkJICogdGhlICdmbGFncycgc2F2ZWQgd2hlbiBBZHZJU1IoKSB3YXMgZmlyc3QgZW50ZXJlZCB3aWxsIGJlCisJCSAqIHVzZWQgdG8gcmVzdG9yZSB0aGUgaW50ZXJydXB0IGZsYWcgb24gZXhpdC4KKwkJICovCisJCSh2b2lkKUR2Y0VudGVyQ3JpdGljYWwoKTsKKwl9CisJRHZjTGVhdmVDcml0aWNhbChmbGFncyk7CisJcmV0dXJuIEFEVl9UUlVFOwogfQogCiAvKgpAQCAtMTc5MDIsNzEgKzE3NTQ3LDY3IEBACiAgKiAgIEFEVl9GQUxTRSAtIGNvbW1hbmQgZmFpbGVkCiAgKiAgIEFEVl9FUlJPUiAtIGNvbW1hbmQgdGltZWQgb3V0CiAgKi8KLVNUQVRJQyBpbnQKK3N0YXRpYyBpbnQKIEFkdlNlbmRJZGxlQ21kKEFEVl9EVkNfVkFSICphc2NfZHZjLAotICAgICAgICAgICAgICAgdXNob3J0IGlkbGVfY21kLAotICAgICAgICAgICAgICAgQURWX0RDTlQgaWRsZV9jbWRfcGFyYW1ldGVyKQorCSAgICAgICB1c2hvcnQgaWRsZV9jbWQsIEFEVl9EQ05UIGlkbGVfY21kX3BhcmFtZXRlcikKIHsKLSAgICB1bG9uZyAgICAgICBsYXN0X2ludF9sZXZlbDsKLSAgICBpbnQgICAgICAgICByZXN1bHQ7Ci0gICAgQURWX0RDTlQgICAgaSwgajsKLSAgICBBZHZQb3J0QWRkciBpb3BfYmFzZTsKKwl1bG9uZyBsYXN0X2ludF9sZXZlbDsKKwlpbnQgcmVzdWx0OworCUFEVl9EQ05UIGksIGo7CisJQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CiAKLSAgICBsYXN0X2ludF9sZXZlbCA9IER2Y0VudGVyQ3JpdGljYWwoKTsKKwlsYXN0X2ludF9sZXZlbCA9IER2Y0VudGVyQ3JpdGljYWwoKTsKIAotICAgIGlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKIAotICAgIC8qCi0gICAgICogQ2xlYXIgdGhlIGlkbGUgY29tbWFuZCBzdGF0dXMgd2hpY2ggaXMgc2V0IGJ5IHRoZSBtaWNyb2NvZGUKLSAgICAgKiB0byBhIG5vbi16ZXJvIHZhbHVlIHRvIGluZGljYXRlIHdoZW4gdGhlIGNvbW1hbmQgaXMgY29tcGxldGVkLgotICAgICAqIFRoZSBub24temVybyByZXN1bHQgaXMgb25lIG9mIHRoZSBJRExFX0NNRF9TVEFUVVNfKiB2YWx1ZXMKLSAgICAgKiBkZWZpbmVkIGluIGFfYWR2bGliLmguCi0gICAgICovCi0gICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0lETEVfQ01EX1NUQVRVUywgKHVzaG9ydCkgMCk7CisJLyoKKwkgKiBDbGVhciB0aGUgaWRsZSBjb21tYW5kIHN0YXR1cyB3aGljaCBpcyBzZXQgYnkgdGhlIG1pY3JvY29kZQorCSAqIHRvIGEgbm9uLXplcm8gdmFsdWUgdG8gaW5kaWNhdGUgd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQuCisJICogVGhlIG5vbi16ZXJvIHJlc3VsdCBpcyBvbmUgb2YgdGhlIElETEVfQ01EX1NUQVRVU18qIHZhbHVlcworCSAqIGRlZmluZWQgaW4gYV9hZHZsaWIuaC4KKwkgKi8KKwlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfU1RBVFVTLCAodXNob3J0KTApOwogCi0gICAgLyoKLSAgICAgKiBXcml0ZSB0aGUgaWRsZSBjb21tYW5kIHZhbHVlIGFmdGVyIHRoZSBpZGxlIGNvbW1hbmQgcGFyYW1ldGVyCi0gICAgICogaGFzIGJlZW4gd3JpdHRlbiB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uLiBJZiB0aGUgb3JkZXIgaXMgbm90Ci0gICAgICogZm9sbG93ZWQsIHRoZSBtaWNyb2NvZGUgbWF5IHByb2Nlc3MgdGhlIGlkbGUgY29tbWFuZCBiZWZvcmUgdGhlCi0gICAgICogcGFyYW1ldGVycyBoYXZlIGJlZW4gd3JpdHRlbiB0byBMUkFNLgotICAgICAqLwotICAgIEFkdldyaXRlRFdvcmRMcmFtTm9Td2FwKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfUEFSQU1FVEVSLAotICAgICAgICBjcHVfdG9fbGUzMihpZGxlX2NtZF9wYXJhbWV0ZXIpKTsKLSAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTUQsIGlkbGVfY21kKTsKKwkvKgorCSAqIFdyaXRlIHRoZSBpZGxlIGNvbW1hbmQgdmFsdWUgYWZ0ZXIgdGhlIGlkbGUgY29tbWFuZCBwYXJhbWV0ZXIKKwkgKiBoYXMgYmVlbiB3cml0dGVuIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24uIElmIHRoZSBvcmRlciBpcyBub3QKKwkgKiBmb2xsb3dlZCwgdGhlIG1pY3JvY29kZSBtYXkgcHJvY2VzcyB0aGUgaWRsZSBjb21tYW5kIGJlZm9yZSB0aGUKKwkgKiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiB3cml0dGVuIHRvIExSQU0uCisJICovCisJQWR2V3JpdGVEV29yZExyYW1Ob1N3YXAoaW9wX2Jhc2UsIEFTQ19NQ19JRExFX0NNRF9QQVJBTUVURVIsCisJCQkJY3B1X3RvX2xlMzIoaWRsZV9jbWRfcGFyYW1ldGVyKSk7CisJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX0lETEVfQ01ELCBpZGxlX2NtZCk7CiAKLSAgICAvKgotICAgICAqIFRpY2tsZSB0aGUgUklTQyB0byB0ZWxsIGl0IHRvIHByb2Nlc3MgdGhlIGlkbGUgY29tbWFuZC4KLSAgICAgKi8KLSAgICBBZHZXcml0ZUJ5dGVSZWdpc3Rlcihpb3BfYmFzZSwgSU9QQl9USUNLTEUsIEFEVl9USUNLTEVfQik7Ci0gICAgaWYgKGFzY19kdmMtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2xlYXIgdGhlIHRpY2tsZSB2YWx1ZS4gSW4gdGhlIEFTQy0zNTUwIHRoZSBSSVNDIGZsYWcKLSAgICAgICAgICogY29tbWFuZCAnY2xyX3RpY2tsZV9iJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAotICAgICAgICAgKiB2YWx1ZSBpcyBjbGVhcmVkLgotICAgICAgICAgKi8KLSAgICAgICAgQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7Ci0gICAgfQorCS8qCisJICogVGlja2xlIHRoZSBSSVNDIHRvIHRlbGwgaXQgdG8gcHJvY2VzcyB0aGUgaWRsZSBjb21tYW5kLgorCSAqLworCUFkdldyaXRlQnl0ZVJlZ2lzdGVyKGlvcF9iYXNlLCBJT1BCX1RJQ0tMRSwgQURWX1RJQ0tMRV9CKTsKKwlpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApIHsKKwkJLyoKKwkJICogQ2xlYXIgdGhlIHRpY2tsZSB2YWx1ZS4gSW4gdGhlIEFTQy0zNTUwIHRoZSBSSVNDIGZsYWcKKwkJICogY29tbWFuZCAnY2xyX3RpY2tsZV9iJyBkb2VzIG5vdCB3b3JrIHVubGVzcyB0aGUgaG9zdAorCQkgKiB2YWx1ZSBpcyBjbGVhcmVkLgorCQkgKi8KKwkJQWR2V3JpdGVCeXRlUmVnaXN0ZXIoaW9wX2Jhc2UsIElPUEJfVElDS0xFLCBBRFZfVElDS0xFX05PUCk7CisJfQogCi0gICAgLyogV2FpdCBmb3IgdXAgdG8gMTAwIG1pbGxpc2Vjb25kIGZvciB0aGUgaWRsZSBjb21tYW5kIHRvIHRpbWVvdXQuICovCi0gICAgZm9yIChpID0gMDsgaSA8IFNDU0lfV0FJVF8xMDBfTVNFQzsgaSsrKQotICAgIHsKLSAgICAgICAgLyogUG9sbCBvbmNlIGVhY2ggbWljcm9zZWNvbmQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFNDU0lfVVNfUEVSX01TRUM7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfSURMRV9DTURfU1RBVFVTLCByZXN1bHQpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIER2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEdmNEZWxheU1pY3JvU2Vjb25kKGFzY19kdmMsICh1c2hvcnQpIDEpOwotICAgICAgICB9Ci0gICAgfQorCS8qIFdhaXQgZm9yIHVwIHRvIDEwMCBtaWxsaXNlY29uZCBmb3IgdGhlIGlkbGUgY29tbWFuZCB0byB0aW1lb3V0LiAqLworCWZvciAoaSA9IDA7IGkgPCBTQ1NJX1dBSVRfMTAwX01TRUM7IGkrKykgeworCQkvKiBQb2xsIG9uY2UgZWFjaCBtaWNyb3NlY29uZCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiAqLworCQlmb3IgKGogPSAwOyBqIDwgU0NTSV9VU19QRVJfTVNFQzsgaisrKSB7CisJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19JRExFX0NNRF9TVEFUVVMsCisJCQkJCXJlc3VsdCk7CisJCQlpZiAocmVzdWx0ICE9IDApIHsKKwkJCQlEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJRHZjRGVsYXlNaWNyb1NlY29uZChhc2NfZHZjLCAodXNob3J0KTEpOworCQl9CisJfQogCi0gICAgQVNDX0FTU0VSVCgwKTsgLyogVGhlIGlkbGUgY29tbWFuZCBzaG91bGQgbmV2ZXIgdGltZW91dC4gKi8KLSAgICBEdmNMZWF2ZUNyaXRpY2FsKGxhc3RfaW50X2xldmVsKTsKLSAgICByZXR1cm4gQURWX0VSUk9SOworCUFTQ19BU1NFUlQoMCk7CQkvKiBUaGUgaWRsZSBjb21tYW5kIHNob3VsZCBuZXZlciB0aW1lb3V0LiAqLworCUR2Y0xlYXZlQ3JpdGljYWwobGFzdF9pbnRfbGV2ZWwpOworCXJldHVybiBBRFZfRVJST1I7CiB9CiAKIC8qCkBAIC0xNzk3NiwxNzkgKzE3NjE3LDE0MTUgQEAKICAqIG1pY3JvY29kZSBvcGVyYXRpbmcgdmFyaWFibGVzIHRoYXQgYWZmZWN0IFdEVFIsIFNEVFIsIGFuZCBUYWcKICAqIFF1ZXVpbmcuCiAgKi8KLVNUQVRJQyB2b2lkCi1BZHZJbnF1aXJ5SGFuZGxpbmcoCi0gICAgQURWX0RWQ19WQVIgICAgICAgICAgICAgICAgICphc2NfZHZjLAotICAgIEFEVl9TQ1NJX1JFUV9RICAgICAgICAgICAgICAqc2NzaXEpCitzdGF0aWMgdm9pZCBBZHZJbnF1aXJ5SGFuZGxpbmcoQURWX0RWQ19WQVIgKmFzY19kdmMsIEFEVl9TQ1NJX1JFUV9RICpzY3NpcSkKIHsKLSAgICBBZHZQb3J0QWRkciAgICAgICAgICAgICAgICAgaW9wX2Jhc2U7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICAgICAgICAgIHRpZDsKLSAgICBBRFZfU0NTSV9JTlFVSVJZICAgICAgICAgICAgKmlucTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgICAgdGlkbWFzazsKLSAgICB1c2hvcnQgICAgICAgICAgICAgICAgICAgICAgY2ZnX3dvcmQ7CisJQWR2UG9ydEFkZHIgaW9wX2Jhc2U7CisJdWNoYXIgdGlkOworCUFEVl9TQ1NJX0lOUVVJUlkgKmlucTsKKwl1c2hvcnQgdGlkbWFzazsKKwl1c2hvcnQgY2ZnX3dvcmQ7CiAKLSAgICAvKgotICAgICAqIEFkdklucXVpcnlIYW5kbGluZygpIHJlcXVpcmVzIHVwIHRvIElOUVVJUlkgaW5mb3JtYXRpb24gQnl0ZSA3Ci0gICAgICogdG8gYmUgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogSWYgbGVzcyB0aGFuIDggYnl0ZXMgb2YgSU5RVUlSWSBpbmZvcm1hdGlvbiB3ZXJlIHJlcXVlc3RlZCBvciBsZXNzCi0gICAgICogdGhhbiA4IGJ5dGVzIHdlcmUgdHJhbnNmZXJyZWQsIHRoZW4gcmV0dXJuLiBjZGJbNF0gaXMgdGhlIHJlcXVlc3QKLSAgICAgKiBsZW5ndGggYW5kIHRoZSBBRFZfU0NTSV9SRVFfUSAnZGF0YV9jbnQnIGZpZWxkIGlzIHNldCBieSB0aGUKLSAgICAgKiBtaWNyb2NvZGUgdG8gdGhlIHRyYW5zZmVyIHJlc2lkdWFsIGNvdW50LgotICAgICAqLworCS8qCisJICogQWR2SW5xdWlyeUhhbmRsaW5nKCkgcmVxdWlyZXMgdXAgdG8gSU5RVUlSWSBpbmZvcm1hdGlvbiBCeXRlIDcKKwkgKiB0byBiZSBhdmFpbGFibGUuCisJICoKKwkgKiBJZiBsZXNzIHRoYW4gOCBieXRlcyBvZiBJTlFVSVJZIGluZm9ybWF0aW9uIHdlcmUgcmVxdWVzdGVkIG9yIGxlc3MKKwkgKiB0aGFuIDggYnl0ZXMgd2VyZSB0cmFuc2ZlcnJlZCwgdGhlbiByZXR1cm4uIGNkYls0XSBpcyB0aGUgcmVxdWVzdAorCSAqIGxlbmd0aCBhbmQgdGhlIEFEVl9TQ1NJX1JFUV9RICdkYXRhX2NudCcgZmllbGQgaXMgc2V0IGJ5IHRoZQorCSAqIG1pY3JvY29kZSB0byB0aGUgdHJhbnNmZXIgcmVzaWR1YWwgY291bnQuCisJICovCiAKLSAgICBpZiAoc2NzaXEtPmNkYls0XSA8IDggfHwKLSAgICAgICAgKHNjc2lxLT5jZGJbNF0gLSBsZTMyX3RvX2NwdShzY3NpcS0+ZGF0YV9jbnQpKSA8IDgpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQorCWlmIChzY3NpcS0+Y2RiWzRdIDwgOCB8fAorCSAgICAoc2NzaXEtPmNkYls0XSAtIGxlMzJfdG9fY3B1KHNjc2lxLT5kYXRhX2NudCkpIDwgOCkgeworCQlyZXR1cm47CisJfQogCi0gICAgaW9wX2Jhc2UgPSBhc2NfZHZjLT5pb3BfYmFzZTsKLSAgICB0aWQgPSBzY3NpcS0+dGFyZ2V0X2lkOworCWlvcF9iYXNlID0gYXNjX2R2Yy0+aW9wX2Jhc2U7CisJdGlkID0gc2NzaXEtPnRhcmdldF9pZDsKIAotICAgIGlucSA9IChBRFZfU0NTSV9JTlFVSVJZICopIHNjc2lxLT52ZGF0YV9hZGRyOworCWlucSA9IChBRFZfU0NTSV9JTlFVSVJZICopIHNjc2lxLT52ZGF0YV9hZGRyOwogCi0gICAgLyoKLSAgICAgKiBXRFRSLCBTRFRSLCBhbmQgVGFnIFF1ZXVpbmcgY2Fubm90IGJlIGVuYWJsZWQgZm9yIG9sZCBkZXZpY2VzLgotICAgICAqLwotICAgIGlmIChBRFZfSU5RX1JFU1BPTlNFX0ZNVChpbnEpIDwgMiAmJiBBRFZfSU5RX0FOU0lfVkVSKGlucSkgPCAyKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSU5RVUlSWSBCeXRlIDcgSGFuZGxpbmcKLSAgICAgICAgICoKLSAgICAgICAgICogVXNlIGEgZGV2aWNlJ3MgSU5RVUlSWSBieXRlIDcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQKLSAgICAgICAgICogc3VwcG9ydHMgV0RUUiwgU0RUUiwgYW5kIFRhZyBRdWV1aW5nLiBJZiB0aGUgZmVhdHVyZQotICAgICAgICAgKiBpcyBlbmFibGVkIGluIHRoZSBFRVBST00gYW5kIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlCi0gICAgICAgICAqIGZlYXR1cmUsIHRoZW4gZW5hYmxlIGl0IGluIHRoZSBtaWNyb2NvZGUuCi0gICAgICAgICAqLworCS8qCisJICogV0RUUiwgU0RUUiwgYW5kIFRhZyBRdWV1aW5nIGNhbm5vdCBiZSBlbmFibGVkIGZvciBvbGQgZGV2aWNlcy4KKwkgKi8KKwlpZiAoQURWX0lOUV9SRVNQT05TRV9GTVQoaW5xKSA8IDIgJiYgQURWX0lOUV9BTlNJX1ZFUihpbnEpIDwgMikgeworCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSU5RVUlSWSBCeXRlIDcgSGFuZGxpbmcKKwkJICoKKwkJICogVXNlIGEgZGV2aWNlJ3MgSU5RVUlSWSBieXRlIDcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQKKwkJICogc3VwcG9ydHMgV0RUUiwgU0RUUiwgYW5kIFRhZyBRdWV1aW5nLiBJZiB0aGUgZmVhdHVyZQorCQkgKiBpcyBlbmFibGVkIGluIHRoZSBFRVBST00gYW5kIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlCisJCSAqIGZlYXR1cmUsIHRoZW4gZW5hYmxlIGl0IGluIHRoZSBtaWNyb2NvZGUuCisJCSAqLwogCi0gICAgICAgIHRpZG1hc2sgPSBBRFZfVElEX1RPX1RJRE1BU0sodGlkKTsKKwkJdGlkbWFzayA9IEFEVl9USURfVE9fVElETUFTSyh0aWQpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdpZGUgVHJhbnNmZXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIElmIHRoZSBFRVBST00gZW5hYmxlZCBXRFRSIGZvciB0aGUgZGV2aWNlIGFuZCB0aGUgZGV2aWNlCi0gICAgICAgICAqIHN1cHBvcnRzIHdpZGUgYnVzICgxNiBiaXQpIHRyYW5zZmVycywgdGhlbiB0dXJuIG9uIHRoZQotICAgICAgICAgKiBkZXZpY2UncyAnd2R0cl9hYmxlJyBiaXQgYW5kIHdyaXRlIHRoZSBuZXcgdmFsdWUgdG8gdGhlCi0gICAgICAgICAqIG1pY3JvY29kZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgoYXNjX2R2Yy0+d2R0cl9hYmxlICYgdGlkbWFzaykgJiYgQURWX0lOUV9XSURFMTYoaW5xKSkKLSAgICAgICAgewotICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLCBjZmdfd29yZCk7Ci0gICAgICAgICAgICBpZiAoKGNmZ193b3JkICYgdGlkbWFzaykgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjZmdfd29yZCB8PSB0aWRtYXNrOwotICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGNmZ193b3JkKTsKKwkJLyoKKwkJICogV2lkZSBUcmFuc2ZlcnMKKwkJICoKKwkJICogSWYgdGhlIEVFUFJPTSBlbmFibGVkIFdEVFIgZm9yIHRoZSBkZXZpY2UgYW5kIHRoZSBkZXZpY2UKKwkJICogc3VwcG9ydHMgd2lkZSBidXMgKDE2IGJpdCkgdHJhbnNmZXJzLCB0aGVuIHR1cm4gb24gdGhlCisJCSAqIGRldmljZSdzICd3ZHRyX2FibGUnIGJpdCBhbmQgd3JpdGUgdGhlIG5ldyB2YWx1ZSB0byB0aGUKKwkJICogbWljcm9jb2RlLgorCQkgKi8KKwkJaWYgKChhc2NfZHZjLT53ZHRyX2FibGUgJiB0aWRtYXNrKSAmJiBBRFZfSU5RX1dJREUxNihpbnEpKSB7CisJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0FCTEUsIGNmZ193b3JkKTsKKwkJCWlmICgoY2ZnX3dvcmQgJiB0aWRtYXNrKSA9PSAwKSB7CisJCQkJY2ZnX3dvcmQgfD0gdGlkbWFzazsKKwkJCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9BQkxFLAorCQkJCQkJIGNmZ193b3JkKTsKIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2xlYXIgdGhlIG1pY3JvY29kZSAiU0RUUiBuZWdvdGlhdGlvbiIgYW5kICJXRFRSCi0gICAgICAgICAgICAgICAgICogbmVnb3RpYXRpb24iIGRvbmUgaW5kaWNhdG9ycyBmb3IgdGhlIHRhcmdldCB0byBjYXVzZQotICAgICAgICAgICAgICAgICAqIGl0IHRvIG5lZ290aWF0ZSB3aXRoIHRoZSBuZXcgc2V0dGluZyBzZXQgYWJvdmUuCi0gICAgICAgICAgICAgICAgICogV0RUUiB3aGVuIGFjY2VwdGVkIGNhdXNlcyB0aGUgdGFyZ2V0IHRvIGVudGVyCi0gICAgICAgICAgICAgICAgICogYXN5bmNocm9ub3VzIG1vZGUsIHNvIFNEVFIgbXVzdCBiZSBuZWdvdGlhdGVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfRE9ORSwgY2ZnX3dvcmQpOwotICAgICAgICAgICAgICAgIGNmZ193b3JkICY9IH50aWRtYXNrOwotICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsIGNmZ193b3JkKTsKLSAgICAgICAgICAgICAgICBBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0RPTkUsIGNmZ193b3JkKTsKLSAgICAgICAgICAgICAgICBjZmdfd29yZCAmPSB+dGlkbWFzazsKLSAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9ET05FLCBjZmdfd29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCQkvKgorCQkJCSAqIENsZWFyIHRoZSBtaWNyb2NvZGUgIlNEVFIgbmVnb3RpYXRpb24iIGFuZCAiV0RUUgorCQkJCSAqIG5lZ290aWF0aW9uIiBkb25lIGluZGljYXRvcnMgZm9yIHRoZSB0YXJnZXQgdG8gY2F1c2UKKwkJCQkgKiBpdCB0byBuZWdvdGlhdGUgd2l0aCB0aGUgbmV3IHNldHRpbmcgc2V0IGFib3ZlLgorCQkJCSAqIFdEVFIgd2hlbiBhY2NlcHRlZCBjYXVzZXMgdGhlIHRhcmdldCB0byBlbnRlcgorCQkJCSAqIGFzeW5jaHJvbm91cyBtb2RlLCBzbyBTRFRSIG11c3QgYmUgbmVnb3RpYXRlZC4KKwkJCQkgKi8KKwkJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsCisJCQkJCQljZmdfd29yZCk7CisJCQkJY2ZnX3dvcmQgJj0gfnRpZG1hc2s7CisJCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfRE9ORSwKKwkJCQkJCSBjZmdfd29yZCk7CisJCQkJQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfV0RUUl9ET05FLAorCQkJCQkJY2ZnX3dvcmQpOworCQkJCWNmZ193b3JkICY9IH50aWRtYXNrOworCQkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19XRFRSX0RPTkUsCisJCQkJCQkgY2ZnX3dvcmQpOworCQkJfQorCQl9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogU3luY2hyb25vdXMgVHJhbnNmZXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIElmIHRoZSBFRVBST00gZW5hYmxlZCBTRFRSIGZvciB0aGUgZGV2aWNlIGFuZCB0aGUgZGV2aWNlCi0gICAgICAgICAqIHN1cHBvcnRzIHN5bmNocm9ub3VzIHRyYW5zZmVycywgdGhlbiB0dXJuIG9uIHRoZSBkZXZpY2UncwotICAgICAgICAgKiAnc2R0cl9hYmxlJyBiaXQuIFdyaXRlIHRoZSBuZXcgdmFsdWUgdG8gdGhlIG1pY3JvY29kZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgoYXNjX2R2Yy0+c2R0cl9hYmxlICYgdGlkbWFzaykgJiYgQURWX0lOUV9TWU5DKGlucSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfQUJMRSwgY2ZnX3dvcmQpOwotICAgICAgICAgICAgaWYgKChjZmdfd29yZCAmIHRpZG1hc2spID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2ZnX3dvcmQgfD0gdGlkbWFzazsKLSAgICAgICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLCBjZmdfd29yZCk7CisJCS8qCisJCSAqIFN5bmNocm9ub3VzIFRyYW5zZmVycworCQkgKgorCQkgKiBJZiB0aGUgRUVQUk9NIGVuYWJsZWQgU0RUUiBmb3IgdGhlIGRldmljZSBhbmQgdGhlIGRldmljZQorCQkgKiBzdXBwb3J0cyBzeW5jaHJvbm91cyB0cmFuc2ZlcnMsIHRoZW4gdHVybiBvbiB0aGUgZGV2aWNlJ3MKKwkJICogJ3NkdHJfYWJsZScgYml0LiBXcml0ZSB0aGUgbmV3IHZhbHVlIHRvIHRoZSBtaWNyb2NvZGUuCisJCSAqLworCQlpZiAoKGFzY19kdmMtPnNkdHJfYWJsZSAmIHRpZG1hc2spICYmIEFEVl9JTlFfU1lOQyhpbnEpKSB7CisJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0FCTEUsIGNmZ193b3JkKTsKKwkJCWlmICgoY2ZnX3dvcmQgJiB0aWRtYXNrKSA9PSAwKSB7CisJCQkJY2ZnX3dvcmQgfD0gdGlkbWFzazsKKwkJCQlBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9BQkxFLAorCQkJCQkJIGNmZ193b3JkKTsKIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2xlYXIgdGhlIG1pY3JvY29kZSAiU0RUUiBuZWdvdGlhdGlvbiIgZG9uZSBpbmRpY2F0b3IKLSAgICAgICAgICAgICAgICAgKiBmb3IgdGhlIHRhcmdldCB0byBjYXVzZSBpdCB0byBuZWdvdGlhdGUgd2l0aCB0aGUgbmV3Ci0gICAgICAgICAgICAgICAgICogc2V0dGluZyBzZXQgYWJvdmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfU0RUUl9ET05FLCBjZmdfd29yZCk7Ci0gICAgICAgICAgICAgICAgY2ZnX3dvcmQgJj0gfnRpZG1hc2s7Ci0gICAgICAgICAgICAgICAgQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfRE9ORSwgY2ZnX3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZSBJbnF1aXJ5IGRhdGEgaW5jbHVkZWQgZW5vdWdoIHNwYWNlIGZvciB0aGUgU1BJLTMKLSAgICAgICAgICogQ2xvY2tpbmcgZmllbGQsIHRoZW4gY2hlY2sgaWYgRFQgbW9kZSBpcyBzdXBwb3J0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYXNjX2R2Yy0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM4QzE2MDAgJiYKLSAgICAgICAgICAgIChzY3NpcS0+Y2RiWzRdID49IDU3IHx8Ci0gICAgICAgICAgICAoc2NzaXEtPmNkYls0XSAtIGxlMzJfdG9fY3B1KHNjc2lxLT5kYXRhX2NudCkpID49IDU3KSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFBQUiAoUGFyYWxsZWwgUHJvdG9jb2wgUmVxdWVzdCkgQ2FwYWJsZQotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgRFQgbW9kZSwgdGhlbiBpdCBtdXN0IGJlIFBQUiBjYXBhYmxlLgotICAgICAgICAgICAgICogVGhlIFBQUiBtZXNzYWdlIHdpbGwgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgU0RUUiBhbmQgV0RUUgotICAgICAgICAgICAgICogbWVzc2FnZXMgdG8gbmVnb3RpYXRlIHN5bmNocm9ub3VzIHNwZWVkIGFuZCBvZmZzZXQsIHRyYW5zZmVyCi0gICAgICAgICAgICAgKiB3aWR0aCwgYW5kIHByb3RvY29sIG9wdGlvbnMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBRFZfSU5RX0NMT0NLSU5HKGlucSkgJiBBRFZfSU5RX0NMT0NLSU5HX0RUX09OTFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfUFBSX0FCTEUsIGFzY19kdmMtPnBwcl9hYmxlKTsKLSAgICAgICAgICAgICAgICBhc2NfZHZjLT5wcHJfYWJsZSB8PSB0aWRtYXNrOwotICAgICAgICAgICAgICAgIEFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwgYXNjX2R2Yy0+cHByX2FibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisJCQkJLyoKKwkJCQkgKiBDbGVhciB0aGUgbWljcm9jb2RlICJTRFRSIG5lZ290aWF0aW9uIiBkb25lIGluZGljYXRvcgorCQkJCSAqIGZvciB0aGUgdGFyZ2V0IHRvIGNhdXNlIGl0IHRvIG5lZ290aWF0ZSB3aXRoIHRoZSBuZXcKKwkJCQkgKiBzZXR0aW5nIHNldCBhYm92ZS4KKwkJCQkgKi8KKwkJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19TRFRSX0RPTkUsCisJCQkJCQljZmdfd29yZCk7CisJCQkJY2ZnX3dvcmQgJj0gfnRpZG1hc2s7CisJCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1NEVFJfRE9ORSwKKwkJCQkJCSBjZmdfd29yZCk7CisJCQl9CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIElucXVpcnkgZGF0YSBpbmNsdWRlZCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBTUEktMworCQkgKiBDbG9ja2luZyBmaWVsZCwgdGhlbiBjaGVjayBpZiBEVCBtb2RlIGlzIHN1cHBvcnRlZC4KKwkJICovCisJCWlmIChhc2NfZHZjLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMTYwMCAmJgorCQkgICAgKHNjc2lxLT5jZGJbNF0gPj0gNTcgfHwKKwkJICAgICAoc2NzaXEtPmNkYls0XSAtIGxlMzJfdG9fY3B1KHNjc2lxLT5kYXRhX2NudCkpID49IDU3KSkgeworCQkJLyoKKwkJCSAqIFBQUiAoUGFyYWxsZWwgUHJvdG9jb2wgUmVxdWVzdCkgQ2FwYWJsZQorCQkJICoKKwkJCSAqIElmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgRFQgbW9kZSwgdGhlbiBpdCBtdXN0IGJlIFBQUiBjYXBhYmxlLgorCQkJICogVGhlIFBQUiBtZXNzYWdlIHdpbGwgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgU0RUUiBhbmQgV0RUUgorCQkJICogbWVzc2FnZXMgdG8gbmVnb3RpYXRlIHN5bmNocm9ub3VzIHNwZWVkIGFuZCBvZmZzZXQsIHRyYW5zZmVyCisJCQkgKiB3aWR0aCwgYW5kIHByb3RvY29sIG9wdGlvbnMuCisJCQkgKi8KKwkJCWlmIChBRFZfSU5RX0NMT0NLSU5HKGlucSkgJiBBRFZfSU5RX0NMT0NLSU5HX0RUX09OTFkpIHsKKwkJCQlBZHZSZWFkV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwKKwkJCQkJCWFzY19kdmMtPnBwcl9hYmxlKTsKKwkJCQlhc2NfZHZjLT5wcHJfYWJsZSB8PSB0aWRtYXNrOworCQkJCUFkdldyaXRlV29yZExyYW0oaW9wX2Jhc2UsIEFTQ19NQ19QUFJfQUJMRSwKKwkJCQkJCSBhc2NfZHZjLT5wcHJfYWJsZSk7CisJCQl9CisJCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgRUVQUk9NIGVuYWJsZWQgVGFnIFF1ZXVpbmcgZm9yIHRoZSBkZXZpY2UgYW5kIHRoZQotICAgICAgICAgKiBkZXZpY2Ugc3VwcG9ydHMgVGFnIFF1ZXVlaW5nLCB0aGVuIHR1cm4gb24gdGhlIGRldmljZSdzCi0gICAgICAgICAqICd0YWdxbmdfZW5hYmxlJyBiaXQgaW4gdGhlIG1pY3JvY29kZSBhbmQgc2V0IHRoZSBtaWNyb2NvZGUKLSAgICAgICAgICogbWF4aW11bSBjb21tYW5kIGNvdW50IHRvIHRoZSBBRFZfRFZDX1ZBUiAnbWF4X2R2Y19xbmcnCi0gICAgICAgICAqIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBUYWcgUXVldWluZyBpcyBkaXNhYmxlZCBmb3IgdGhlIEJJT1Mgd2hpY2ggcnVucyBpbiBwb2xsZWQKLSAgICAgICAgICogbW9kZSBhbmQgd291bGQgc2VlIG5vIGJlbmVmaXQgZnJvbSBUYWcgUXVldWluZy4gQWxzbyBieQotICAgICAgICAgKiBkaXNhYmxpbmcgVGFnIFF1ZXVpbmcgaW4gdGhlIEJJT1MgZGV2aWNlcyB3aXRoIFRhZyBRdWV1aW5nCi0gICAgICAgICAqIGJ1Z3Mgd2lsbCBhdCBsZWFzdCB3b3JrIHdpdGggdGhlIEJJT1MuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKGFzY19kdmMtPnRhZ3FuZ19hYmxlICYgdGlkbWFzaykgJiYgQURWX0lOUV9DTURfUVVFVUUoaW5xKSkKLSAgICAgICAgewotICAgICAgICAgICAgQWR2UmVhZFdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIGNmZ193b3JkKTsKLSAgICAgICAgICAgIGNmZ193b3JkIHw9IHRpZG1hc2s7Ci0gICAgICAgICAgICBBZHZXcml0ZVdvcmRMcmFtKGlvcF9iYXNlLCBBU0NfTUNfVEFHUU5HX0FCTEUsIGNmZ193b3JkKTsKKwkJLyoKKwkJICogSWYgdGhlIEVFUFJPTSBlbmFibGVkIFRhZyBRdWV1aW5nIGZvciB0aGUgZGV2aWNlIGFuZCB0aGUKKwkJICogZGV2aWNlIHN1cHBvcnRzIFRhZyBRdWV1ZWluZywgdGhlbiB0dXJuIG9uIHRoZSBkZXZpY2UncworCQkgKiAndGFncW5nX2VuYWJsZScgYml0IGluIHRoZSBtaWNyb2NvZGUgYW5kIHNldCB0aGUgbWljcm9jb2RlCisJCSAqIG1heGltdW0gY29tbWFuZCBjb3VudCB0byB0aGUgQURWX0RWQ19WQVIgJ21heF9kdmNfcW5nJworCQkgKiB2YWx1ZS4KKwkJICoKKwkJICogVGFnIFF1ZXVpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBCSU9TIHdoaWNoIHJ1bnMgaW4gcG9sbGVkCisJCSAqIG1vZGUgYW5kIHdvdWxkIHNlZSBubyBiZW5lZml0IGZyb20gVGFnIFF1ZXVpbmcuIEFsc28gYnkKKwkJICogZGlzYWJsaW5nIFRhZyBRdWV1aW5nIGluIHRoZSBCSU9TIGRldmljZXMgd2l0aCBUYWcgUXVldWluZworCQkgKiBidWdzIHdpbGwgYXQgbGVhc3Qgd29yayB3aXRoIHRoZSBCSU9TLgorCQkgKi8KKwkJaWYgKChhc2NfZHZjLT50YWdxbmdfYWJsZSAmIHRpZG1hc2spICYmIEFEVl9JTlFfQ01EX1FVRVVFKGlucSkpIHsKKwkJCUFkdlJlYWRXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLCBjZmdfd29yZCk7CisJCQljZmdfd29yZCB8PSB0aWRtYXNrOworCQkJQWR2V3JpdGVXb3JkTHJhbShpb3BfYmFzZSwgQVNDX01DX1RBR1FOR19BQkxFLAorCQkJCQkgY2ZnX3dvcmQpOwogCi0gICAgICAgICAgICBBZHZXcml0ZUJ5dGVMcmFtKGlvcF9iYXNlLCBBU0NfTUNfTlVNQkVSX09GX01BWF9DTUQgKyB0aWQsCi0gICAgICAgICAgICAgICAgYXNjX2R2Yy0+bWF4X2R2Y19xbmcpOwotICAgICAgICB9Ci0gICAgfQorCQkJQWR2V3JpdGVCeXRlTHJhbShpb3BfYmFzZSwKKwkJCQkJIEFTQ19NQ19OVU1CRVJfT0ZfTUFYX0NNRCArIHRpZCwKKwkJCQkJIGFzY19kdmMtPm1heF9kdmNfcW5nKTsKKwkJfQorCX0KIH0KKwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogCitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqX19kZXZpbml0CithZHZhbnN5c19ib2FyZF9mb3VuZChpbnQgaW9wLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBidXNfdHlwZSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJ1c190eXBlID09IEFTQ19JU19QQ0kgPyB0b19wY2lfZGV2KGRldikgOiBOVUxMOworCWFzY19ib2FyZF90ICpib2FyZHA7CisJQVNDX0RWQ19WQVIgKmFzY19kdmNfdmFycCA9IE5VTEw7CisJQURWX0RWQ19WQVIgKmFkdl9kdmNfdmFycCA9IE5VTEw7CisJYWR2X3NnYmxrX3QgKnNncCA9IE5VTEw7CisJaW50IHNoYXJlX2lycSA9IEZBTFNFOworCWludCBpb2xlbiA9IDA7CisJQURWX1BBRERSIHBjaV9tZW1vcnlfYWRkcmVzczsKKwlpbnQgd2Fybl9jb2RlLCBlcnJfY29kZTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBBZGFwdGVyIGZvdW5kLgorCSAqCisJICogUmVnaXN0ZXIgdGhlIGFkYXB0ZXIsIGdldCBpdHMgY29uZmlndXJhdGlvbiwgYW5kCisJICogaW5pdGlhbGl6ZSBpdC4KKwkgKi8KKwlBU0NfREJHKDIsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogc2NzaV9yZWdpc3RlcigpXG4iKTsKKwlzaG9zdCA9IHNjc2lfcmVnaXN0ZXIoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKGFzY19ib2FyZF90KSk7CisKKwlpZiAoIXNob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBTY3NpX0hvc3Qgb2YgZWFjaCBib2FyZCBmb3VuZC4gKi8KKwlhc2NfaG9zdFthc2NfYm9hcmRfY291bnQrK10gPSBzaG9zdDsKKworCS8qIEluaXRpYWxpemUgcHJpdmF0ZSBwZXIgYm9hcmQgZGF0YSAqLworCWJvYXJkcCA9IEFTQ19CT0FSRFAoc2hvc3QpOworCW1lbXNldChib2FyZHAsIDAsIHNpemVvZihhc2NfYm9hcmRfdCkpOworCWJvYXJkcC0+aWQgPSBhc2NfYm9hcmRfY291bnQgLSAxOworCisJLyogSW5pdGlhbGl6ZSBzcGlubG9jay4gKi8KKwlzcGluX2xvY2tfaW5pdCgmYm9hcmRwLT5sb2NrKTsKKworCS8qCisJICogSGFuZGxlIGJvdGggbmFycm93IGFuZCB3aWRlIGJvYXJkcy4KKwkgKgorCSAqIElmIGEgV2lkZSBib2FyZCB3YXMgZGV0ZWN0ZWQsIHNldCB0aGUgYm9hcmQgc3RydWN0dXJlCisJICogd2lkZSBib2FyZCBmbGFnLiBTZXQtdXAgdGhlIGJvYXJkIHN0cnVjdHVyZSBiYXNlZCBvbgorCSAqIHRoZSBib2FyZCB0eXBlLgorCSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoYnVzX3R5cGUgPT0gQVNDX0lTX1BDSSAmJgorCSAgICAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MFVXIHx8CisJICAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF8zOEMwODAwX1JFVjEgfHwKKwkgICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzM4QzE2MDBfUkVWMSkpIHsKKwkJYm9hcmRwLT5mbGFncyB8PSBBU0NfSVNfV0lERV9CT0FSRDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCQlBU0NfREJHKDEsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogbmFycm93IGJvYXJkXG4iKTsKKwkJYXNjX2R2Y192YXJwID0gJmJvYXJkcC0+ZHZjX3Zhci5hc2NfZHZjX3ZhcjsKKwkJYXNjX2R2Y192YXJwLT5idXNfdHlwZSA9IGJ1c190eXBlOworCQlhc2NfZHZjX3ZhcnAtPmRydl9wdHIgPSBib2FyZHA7CisJCWFzY19kdmNfdmFycC0+Y2ZnID0gJmJvYXJkcC0+ZHZjX2NmZy5hc2NfZHZjX2NmZzsKKwkJYXNjX2R2Y192YXJwLT5jZmctPm92ZXJydW5fYnVmID0gJm92ZXJydW5fYnVmWzBdOworCQlhc2NfZHZjX3ZhcnAtPmlvcF9iYXNlID0gaW9wOworCQlhc2NfZHZjX3ZhcnAtPmlzcl9jYWxsYmFjayA9IGFzY19pc3JfY2FsbGJhY2s7CisJfSBlbHNlIHsKKwkJQVNDX0RCRygxLCAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IHdpZGUgYm9hcmRcbiIpOworCQlhZHZfZHZjX3ZhcnAgPSAmYm9hcmRwLT5kdmNfdmFyLmFkdl9kdmNfdmFyOworCQlhZHZfZHZjX3ZhcnAtPmRydl9wdHIgPSBib2FyZHA7CisJCWFkdl9kdmNfdmFycC0+Y2ZnID0gJmJvYXJkcC0+ZHZjX2NmZy5hZHZfZHZjX2NmZzsKKwkJYWR2X2R2Y192YXJwLT5pc3JfY2FsbGJhY2sgPSBhZHZfaXNyX2NhbGxiYWNrOworCQlhZHZfZHZjX3ZhcnAtPmFzeW5jX2NhbGxiYWNrID0gYWR2X2FzeW5jX2NhbGxiYWNrOworI2lmZGVmIENPTkZJR19QQ0kKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FTUF9BQlA5NDBVVykgeworCQkJQVNDX0RCRygxLCAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IEFTQy0zNTUwXG4iKTsKKwkJCWFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID0gQURWX0NISVBfQVNDMzU1MDsKKwkJfSBlbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF8zOEMwODAwX1JFVjEpIHsKKwkJCUFTQ19EQkcoMSwgImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBBU0MtMzhDMDgwMFxuIik7CisJCQlhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9IEFEVl9DSElQX0FTQzM4QzA4MDA7CisJCX0gZWxzZSB7CisJCQlBU0NfREJHKDEsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogQVNDLTM4QzE2MDBcbiIpOworCQkJYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPSBBRFZfQ0hJUF9BU0MzOEMxNjAwOworCQl9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisJCS8qCisJCSAqIE1hcCB0aGUgYm9hcmQncyByZWdpc3RlcnMgaW50byB2aXJ0dWFsIG1lbW9yeSBmb3IKKwkJICogUENJIHNsYXZlIGFjY2Vzcy4gT25seSBtZW1vcnkgYWNjZXNzZXMgYXJlIHVzZWQgdG8KKwkJICogYWNjZXNzIHRoZSBib2FyZCdzIHJlZ2lzdGVycy4KKwkJICoKKwkJICogTm90ZTogVGhlIFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3MgaXMgbm90IGFsd2F5cworCQkgKiBwYWdlIGFsaWduZWQsIGJ1dCB0aGUgYWRkcmVzcyBwYXNzZWQgdG8gaW9yZW1hcCgpCisJCSAqIG11c3QgYmUgcGFnZSBhbGlnbmVkLiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlCisJCSAqIFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgd2lsbCBub3QgY3Jvc3MgYSBwYWdlCisJCSAqIGJvdW5kYXJ5LgorCQkgKi8KKwkJaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApIHsKKwkJCWlvbGVuID0gQURWXzM1NTBfSU9MRU47CisJCX0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQkJaW9sZW4gPSBBRFZfMzhDMDgwMF9JT0xFTjsKKwkJfSBlbHNlIHsKKwkJCWlvbGVuID0gQURWXzM4QzE2MDBfSU9MRU47CisJCX0KKyNpZmRlZiBDT05GSUdfUENJCisJCXBjaV9tZW1vcnlfYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwkJQVNDX0RCRzEoMSwKKwkJCSAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IHBjaV9tZW1vcnlfYWRkcmVzczogMHglbHhcbiIsCisJCQkgKHVsb25nKXBjaV9tZW1vcnlfYWRkcmVzcyk7CisJCWlmICgoYm9hcmRwLT5pb3JlbWFwX2FkZHIgPQorCQkgICAgIGlvcmVtYXAocGNpX21lbW9yeV9hZGRyZXNzICYgUEFHRV9NQVNLLCBQQUdFX1NJWkUpKSA9PSAwKSB7CisJCQlBU0NfUFJJTlQzCisJCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQ6IGlvcmVtYXAoJXgsICVkKSByZXR1cm5lZCBOVUxMXG4iLAorCQkJICAgICBib2FyZHAtPmlkLCBwY2lfbWVtb3J5X2FkZHJlc3MsIGlvbGVuKTsKKwkJCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJCQlhc2NfYm9hcmRfY291bnQtLTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCUFTQ19EQkcxKDEsCisJCQkgImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBpb3JlbWFwX2FkZHI6IDB4JWx4XG4iLAorCQkJICh1bG9uZylib2FyZHAtPmlvcmVtYXBfYWRkcik7CisJCWFkdl9kdmNfdmFycC0+aW9wX2Jhc2UgPSAoQWR2UG9ydEFkZHIpCisJCSAgICAoYm9hcmRwLT5pb3JlbWFwX2FkZHIgKworCQkgICAgIChwY2lfbWVtb3J5X2FkZHJlc3MgLSAocGNpX21lbW9yeV9hZGRyZXNzICYgUEFHRV9NQVNLKSkpOworCQlBU0NfREJHMSgxLAorCQkJICJhZHZhbnN5c19ib2FyZF9mb3VuZDogaW9wX2Jhc2U6IDB4JWx4XG4iLAorCQkJIGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCQkvKgorCQkgKiBFdmVuIHRob3VnaCBpdCBpc24ndCB1c2VkIHRvIGFjY2VzcyB3aWRlIGJvYXJkcywgb3RoZXIKKwkJICogdGhhbiBmb3IgdGhlIGRlYnVnIGxpbmUgYmVsb3csIHNhdmUgSS9PIFBvcnQgYWRkcmVzcyBzbworCQkgKiB0aGF0IGl0IGNhbiBiZSByZXBvcnRlZC4KKwkJICovCisJCWJvYXJkcC0+aW9wb3J0ID0gaW9wOworCisJCUFTQ19EQkcyKDEsCisJCQkgImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBpb3BiX2NoaXBfaWRfMSAweCV4LCBpb3B3X2NoaXBfaWRfMCAweCV4XG4iLAorCQkJICh1c2hvcnQpaW5wKGlvcCArIDEpLCAodXNob3J0KWlucHcoaW9wKSk7CisJfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkvKgorCSAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgcHJpbnRpbmcgaW5mb3JtYXRpb24gZnJvbQorCSAqIC9wcm9jL3Njc2kvYWR2YW5zeXMvWzAuLi5dLgorCSAqLworCWlmICgoYm9hcmRwLT5wcnRidWYgPSBrbWFsbG9jKEFTQ19QUlRCVUZfU0laRSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJQVNDX1BSSU5UMworCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQ6IGttYWxsb2MoJWQsICVkKSByZXR1cm5lZCBOVUxMXG4iLAorCQkgICAgIGJvYXJkcC0+aWQsIEFTQ19QUlRCVUZfU0laRSwgR0ZQX0FUT01JQyk7CisJCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJCWFzY19ib2FyZF9jb3VudC0tOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJYXNjX2R2Y192YXJwLT5jZmctPmRldiA9IGRldjsKKwkJLyoKKwkJICogU2V0IHRoZSBib2FyZCBidXMgdHlwZSBhbmQgUENJIElSUSBiZWZvcmUKKwkJICogY2FsbGluZyBBc2NJbml0R2V0Q29uZmlnKCkuCisJCSAqLworCQlzd2l0Y2ggKGFzY19kdmNfdmFycC0+YnVzX3R5cGUpIHsKKyNpZmRlZiBDT05GSUdfSVNBCisJCWNhc2UgQVNDX0lTX0lTQToKKwkJCXNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IFRSVUU7CisJCQlzaGFyZV9pcnEgPSBGQUxTRTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19JU19WTDoKKwkJCXNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IEZBTFNFOworCQkJc2hhcmVfaXJxID0gRkFMU0U7CisJCQlicmVhazsKKwkJY2FzZSBBU0NfSVNfRUlTQToKKwkJCXNob3N0LT51bmNoZWNrZWRfaXNhX2RtYSA9IEZBTFNFOworCQkJc2hhcmVfaXJxID0gVFJVRTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJCWNhc2UgQVNDX0lTX1BDSToKKwkJCXNob3N0LT5pcnEgPSBhc2NfZHZjX3ZhcnAtPmlycV9ubyA9IHBkZXYtPmlycTsKKwkJCWFzY19kdmNfdmFycC0+Y2ZnLT5wY2lfc2xvdF9pbmZvID0KKwkJCSAgICBBU0NfUENJX01LSUQocGRldi0+YnVzLT5udW1iZXIsCisJCQkJCSBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJCQkJCSBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworCQkJc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7CisJCQlzaGFyZV9pcnEgPSBUUlVFOworCQkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCQlkZWZhdWx0OgorCQkJQVNDX1BSSU5UMgorCQkJICAgICgiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IGJvYXJkICVkOiB1bmtub3duIGFkYXB0ZXIgdHlwZTogJWRcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIGFzY19kdmNfdmFycC0+YnVzX3R5cGUpOworCQkJc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID0gVFJVRTsKKwkJCXNoYXJlX2lycSA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlhZHZfZHZjX3ZhcnAtPmNmZy0+ZGV2ID0gZGV2OworCQkvKgorCQkgKiBGb3IgV2lkZSBib2FyZHMgc2V0IFBDSSBpbmZvcm1hdGlvbiBiZWZvcmUgY2FsbGluZworCQkgKiBBZHZJbml0R2V0Q29uZmlnKCkuCisJCSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJc2hvc3QtPmlycSA9IGFkdl9kdmNfdmFycC0+aXJxX25vID0gcGRldi0+aXJxOworCQlhZHZfZHZjX3ZhcnAtPmNmZy0+cGNpX3Nsb3RfaW5mbyA9CisJCSAgICBBU0NfUENJX01LSUQocGRldi0+YnVzLT5udW1iZXIsCisJCQkJIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKKwkJCQkgUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKKwkJc2hvc3QtPnVuY2hlY2tlZF9pc2FfZG1hID0gRkFMU0U7CisJCXNoYXJlX2lycSA9IFRSVUU7CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCX0KKworCS8qCisJICogUmVhZCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbi4KKwkgKi8KKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCS8qCisJCSAqIE5PVEU6IEFzY0luaXRHZXRDb25maWcoKSBtYXkgY2hhbmdlIHRoZSBib2FyZCdzCisJCSAqIGJ1c190eXBlIHZhbHVlLiBUaGUgYnVzX3R5cGUgdmFsdWUgc2hvdWxkIG5vCisJCSAqIGxvbmdlciBiZSB1c2VkLiBJZiB0aGUgYnVzX3R5cGUgZmllbGQgbXVzdCBiZQorCQkgKiByZWZlcmVuY2VkIG9ubHkgdXNlIHRoZSBiaXQtd2lzZSBBTkQgb3BlcmF0b3IgIiYiLgorCQkgKi8KKwkJQVNDX0RCRygyLCAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IEFzY0luaXRHZXRDb25maWcoKVxuIik7CisJCXN3aXRjaCAocmV0ID0gQXNjSW5pdEdldENvbmZpZyhhc2NfZHZjX3ZhcnApKSB7CisJCWNhc2UgMDoJLyogTm8gZXJyb3IgKi8KKwkJCWJyZWFrOworCQljYXNlIEFTQ19XQVJOX0lPX1BPUlRfUk9UQVRFOgorCQkJQVNDX1BSSU5UMQorCQkJICAgICgiQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IEkvTyBwb3J0IGFkZHJlc3MgbW9kaWZpZWRcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQpOworCQkJYnJlYWs7CisJCWNhc2UgQVNDX1dBUk5fQVVUT19DT05GSUc6CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogSS9PIHBvcnQgaW5jcmVtZW50IHN3aXRjaCBlbmFibGVkXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19XQVJOX0VFUFJPTV9DSEtTVU06CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJBc2NJbml0R2V0Q29uZmlnOiBib2FyZCAlZDogRUVQUk9NIGNoZWNrc3VtIGVycm9yXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19XQVJOX0lSUV9NT0RJRklFRDoKKwkJCUFTQ19QUklOVDEKKwkJCSAgICAoIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiBJUlEgbW9kaWZpZWRcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQpOworCQkJYnJlYWs7CisJCWNhc2UgQVNDX1dBUk5fQ01EX1FOR19DT05GTElDVDoKKwkJCUFTQ19QUklOVDEKKwkJCSAgICAoIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiB0YWcgcXVldWluZyBlbmFibGVkIHcvbyBkaXNjb25uZWN0c1xuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTQ19QUklOVDIKKwkJCSAgICAoIkFzY0luaXRHZXRDb25maWc6IGJvYXJkICVkOiB1bmtub3duIHdhcm5pbmc6IDB4JXhcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIHJldCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVycl9jb2RlID0gYXNjX2R2Y192YXJwLT5lcnJfY29kZSkgIT0gMCkgeworCQkJQVNDX1BSSU5UMworCQkJICAgICgiQXNjSW5pdEdldENvbmZpZzogYm9hcmQgJWQgZXJyb3I6IGluaXRfc3RhdGUgMHgleCwgZXJyX2NvZGUgMHgleFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCwKKwkJCSAgICAgYXNjX2R2Y192YXJwLT5pbml0X3N0YXRlLCBhc2NfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCUFTQ19EQkcoMiwgImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBBZHZJbml0R2V0Q29uZmlnKClcbiIpOworCQlpZiAoKHJldCA9IEFkdkluaXRHZXRDb25maWcoYWR2X2R2Y192YXJwKSkgIT0gMCkgeworCQkJQVNDX1BSSU5UMgorCQkJICAgICgiQWR2SW5pdEdldENvbmZpZzogYm9hcmQgJWQ6IHdhcm5pbmc6IDB4JXhcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIHJldCk7CisJCX0KKwkJaWYgKChlcnJfY29kZSA9IGFkdl9kdmNfdmFycC0+ZXJyX2NvZGUpICE9IDApIHsKKwkJCUFTQ19QUklOVDIKKwkJCSAgICAoIkFkdkluaXRHZXRDb25maWc6IGJvYXJkICVkIGVycm9yOiBlcnJfY29kZSAweCV4XG4iLAorCQkJICAgICBib2FyZHAtPmlkLCBhZHZfZHZjX3ZhcnAtPmVycl9jb2RlKTsKKwkJfQorCX0KKworCWlmIChlcnJfY29kZSAhPSAwKSB7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJa2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJCWFzY19ib2FyZF9jb3VudC0tOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIFNhdmUgdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZAorCSAqIGZyb20gL3Byb2Mvc2NzaS9hZHZhbnN5cy9bMC4uLl0uCisJICovCisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCisJCUFTQ0VFUF9DT05GSUcgKmVwOworCisJCS8qCisJCSAqIFNldCB0aGUgYWRhcHRlcidzIHRhcmdldCBpZCBiaXQgaW4gdGhlICdpbml0X3RpZG1hc2snIGZpZWxkLgorCQkgKi8KKwkJYm9hcmRwLT5pbml0X3RpZG1hc2sgfD0KKwkJICAgIEFEVl9USURfVE9fVElETUFTSyhhc2NfZHZjX3ZhcnAtPmNmZy0+Y2hpcF9zY3NpX2lkKTsKKworCQkvKgorCQkgKiBTYXZlIEVFUFJPTSBzZXR0aW5ncyBmb3IgdGhlIGJvYXJkLgorCQkgKi8KKwkJZXAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFzY19lZXA7CisKKwkJZXAtPmluaXRfc2R0ciA9IGFzY19kdmNfdmFycC0+Y2ZnLT5zZHRyX2VuYWJsZTsKKwkJZXAtPmRpc2NfZW5hYmxlID0gYXNjX2R2Y192YXJwLT5jZmctPmRpc2NfZW5hYmxlOworCQllcC0+dXNlX2NtZF9xbmcgPSBhc2NfZHZjX3ZhcnAtPmNmZy0+Y21kX3FuZ19lbmFibGVkOworCQlBU0NfRUVQX1NFVF9ETUFfU1BEKGVwLCBhc2NfZHZjX3ZhcnAtPmNmZy0+aXNhX2RtYV9zcGVlZCk7CisJCWVwLT5zdGFydF9tb3RvciA9IGFzY19kdmNfdmFycC0+c3RhcnRfbW90b3I7CisJCWVwLT5jbnRsID0gYXNjX2R2Y192YXJwLT5kdmNfY250bDsKKwkJZXAtPm5vX3NjYW0gPSBhc2NfZHZjX3ZhcnAtPm5vX3NjYW07CisJCWVwLT5tYXhfdG90YWxfcW5nID0gYXNjX2R2Y192YXJwLT5tYXhfdG90YWxfcW5nOworCQlBU0NfRUVQX1NFVF9DSElQX0lEKGVwLCBhc2NfZHZjX3ZhcnAtPmNmZy0+Y2hpcF9zY3NpX2lkKTsKKwkJLyogJ21heF90YWdfcW5nJyBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgZm9yIGV2ZXJ5IGRldmljZS4gKi8KKwkJZXAtPm1heF90YWdfcW5nID0gYXNjX2R2Y192YXJwLT5jZmctPm1heF90YWdfcW5nWzBdOworCQllcC0+YWRhcHRlcl9pbmZvWzBdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1swXTsKKwkJZXAtPmFkYXB0ZXJfaW5mb1sxXSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bMV07CisJCWVwLT5hZGFwdGVyX2luZm9bMl0gPSBhc2NfZHZjX3ZhcnAtPmNmZy0+YWRhcHRlcl9pbmZvWzJdOworCQllcC0+YWRhcHRlcl9pbmZvWzNdID0gYXNjX2R2Y192YXJwLT5jZmctPmFkYXB0ZXJfaW5mb1szXTsKKwkJZXAtPmFkYXB0ZXJfaW5mb1s0XSA9IGFzY19kdmNfdmFycC0+Y2ZnLT5hZGFwdGVyX2luZm9bNF07CisJCWVwLT5hZGFwdGVyX2luZm9bNV0gPSBhc2NfZHZjX3ZhcnAtPmNmZy0+YWRhcHRlcl9pbmZvWzVdOworCisJCS8qCisJCSAqIE1vZGlmeSBib2FyZCBjb25maWd1cmF0aW9uLgorCQkgKi8KKwkJQVNDX0RCRygyLCAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IEFzY0luaXRTZXRDb25maWcoKVxuIik7CisJCXN3aXRjaCAocmV0ID0gQXNjSW5pdFNldENvbmZpZyhhc2NfZHZjX3ZhcnApKSB7CisJCWNhc2UgMDoJLyogTm8gZXJyb3IuICovCisJCQlicmVhazsKKwkJY2FzZSBBU0NfV0FSTl9JT19QT1JUX1JPVEFURToKKwkJCUFTQ19QUklOVDEKKwkJCSAgICAoIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkOiBJL08gcG9ydCBhZGRyZXNzIG1vZGlmaWVkXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19XQVJOX0FVVE9fQ09ORklHOgorCQkJQVNDX1BSSU5UMQorCQkJICAgICgiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IEkvTyBwb3J0IGluY3JlbWVudCBzd2l0Y2ggZW5hYmxlZFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCk7CisJCQlicmVhazsKKwkJY2FzZSBBU0NfV0FSTl9FRVBST01fQ0hLU1VNOgorCQkJQVNDX1BSSU5UMQorCQkJICAgICgiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IEVFUFJPTSBjaGVja3N1bSBlcnJvclxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCk7CisJCQlicmVhazsKKwkJY2FzZSBBU0NfV0FSTl9JUlFfTU9ESUZJRUQ6CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogSVJRIG1vZGlmaWVkXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCWJyZWFrOworCQljYXNlIEFTQ19XQVJOX0NNRF9RTkdfQ09ORkxJQ1Q6CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJBc2NJbml0U2V0Q29uZmlnOiBib2FyZCAlZDogdGFnIHF1ZXVpbmcgdy9vIGRpc2Nvbm5lY3RzXG4iLAorCQkJICAgICBib2FyZHAtPmlkKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNDX1BSSU5UMgorCQkJICAgICgiQXNjSW5pdFNldENvbmZpZzogYm9hcmQgJWQ6IHVua25vd24gd2FybmluZzogMHgleFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCwgcmV0KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhc2NfZHZjX3ZhcnAtPmVycl9jb2RlICE9IDApIHsKKwkJCUFTQ19QUklOVDMKKwkJCSAgICAoIkFzY0luaXRTZXRDb25maWc6IGJvYXJkICVkIGVycm9yOiBpbml0X3N0YXRlIDB4JXgsIGVycl9jb2RlIDB4JXhcbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsCisJCQkgICAgIGFzY19kdmNfdmFycC0+aW5pdF9zdGF0ZSwgYXNjX2R2Y192YXJwLT5lcnJfY29kZSk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJCWtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCQkJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwkJCWFzY19ib2FyZF9jb3VudC0tOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBGaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSAnU2NzaV9Ib3N0JyBzdHJ1Y3R1cmUuCisJCSAqLworCQkvKiBBc2NJbml0U2V0Q29uZmlnKCkgd2lsbCBzZXQgdGhlIElSUSBmb3Igbm9uLVBDSSBib2FyZHMuICovCisJCWlmICgoYXNjX2R2Y192YXJwLT5idXNfdHlwZSAmIEFTQ19JU19QQ0kpID09IDApIHsKKwkJCXNob3N0LT5pcnEgPSBhc2NfZHZjX3ZhcnAtPmlycV9ubzsKKwkJfQorCX0gZWxzZSB7CisJCUFEVkVFUF8zNTUwX0NPTkZJRyAqZXBfMzU1MDsKKwkJQURWRUVQXzM4QzA4MDBfQ09ORklHICplcF8zOEMwODAwOworCQlBRFZFRVBfMzhDMTYwMF9DT05GSUcgKmVwXzM4QzE2MDA7CisKKwkJLyoKKwkJICogU2F2ZSBXaWRlIEVFUCBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09IEFEVl9DSElQX0FTQzM1NTApIHsKKwkJCWVwXzM1NTAgPSAmYm9hcmRwLT5lZXBfY29uZmlnLmFkdl8zNTUwX2VlcDsKKworCQkJZXBfMzU1MC0+YWRhcHRlcl9zY3NpX2lkID0gYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQ7CisJCQllcF8zNTUwLT5tYXhfaG9zdF9xbmcgPSBhZHZfZHZjX3ZhcnAtPm1heF9ob3N0X3FuZzsKKwkJCWVwXzM1NTAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKKwkJCWVwXzM1NTAtPnRlcm1pbmF0aW9uID0gYWR2X2R2Y192YXJwLT5jZmctPnRlcm1pbmF0aW9uOworCQkJZXBfMzU1MC0+ZGlzY19lbmFibGUgPSBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGlzY19lbmFibGU7CisJCQllcF8zNTUwLT5iaW9zX2N0cmwgPSBhZHZfZHZjX3ZhcnAtPmJpb3NfY3RybDsKKwkJCWVwXzM1NTAtPndkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+d2R0cl9hYmxlOworCQkJZXBfMzU1MC0+c2R0cl9hYmxlID0gYWR2X2R2Y192YXJwLT5zZHRyX2FibGU7CisJCQllcF8zNTUwLT51bHRyYV9hYmxlID0gYWR2X2R2Y192YXJwLT51bHRyYV9hYmxlOworCQkJZXBfMzU1MC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworCQkJZXBfMzU1MC0+c3RhcnRfbW90b3IgPSBhZHZfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOworCQkJZXBfMzU1MC0+c2NzaV9yZXNldF9kZWxheSA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5zY3NpX3Jlc2V0X3dhaXQ7CisJCQllcF8zNTUwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKwkJCSAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMTsKKwkJCWVwXzM1NTAtPnNlcmlhbF9udW1iZXJfd29yZDIgPQorCQkJICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOworCQkJZXBfMzU1MC0+c2VyaWFsX251bWJlcl93b3JkMyA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDM7CisJCX0gZWxzZSBpZiAoYWR2X2R2Y192YXJwLT5jaGlwX3R5cGUgPT0gQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQkJZXBfMzhDMDgwMCA9ICZib2FyZHAtPmVlcF9jb25maWcuYWR2XzM4QzA4MDBfZWVwOworCisJCQllcF8zOEMwODAwLT5hZGFwdGVyX3Njc2lfaWQgPQorCQkJICAgIGFkdl9kdmNfdmFycC0+Y2hpcF9zY3NpX2lkOworCQkJZXBfMzhDMDgwMC0+bWF4X2hvc3RfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7CisJCQllcF8zOEMwODAwLT5tYXhfZHZjX3FuZyA9IGFkdl9kdmNfdmFycC0+bWF4X2R2Y19xbmc7CisJCQllcF8zOEMwODAwLT50ZXJtaW5hdGlvbl9sdmQgPQorCQkJICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT50ZXJtaW5hdGlvbjsKKwkJCWVwXzM4QzA4MDAtPmRpc2NfZW5hYmxlID0KKwkJCSAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+ZGlzY19lbmFibGU7CisJCQllcF8zOEMwODAwLT5iaW9zX2N0cmwgPSBhZHZfZHZjX3ZhcnAtPmJpb3NfY3RybDsKKwkJCWVwXzM4QzA4MDAtPndkdHJfYWJsZSA9IGFkdl9kdmNfdmFycC0+d2R0cl9hYmxlOworCQkJZXBfMzhDMDgwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworCQkJZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDEgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQxOworCQkJZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDIgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQyOworCQkJZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDMgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQzOworCQkJZXBfMzhDMDgwMC0+c2R0cl9zcGVlZDQgPSBhZHZfZHZjX3ZhcnAtPnNkdHJfc3BlZWQ0OworCQkJZXBfMzhDMDgwMC0+dGFncW5nX2FibGUgPSBhZHZfZHZjX3ZhcnAtPnRhZ3FuZ19hYmxlOworCQkJZXBfMzhDMDgwMC0+c3RhcnRfbW90b3IgPSBhZHZfZHZjX3ZhcnAtPnN0YXJ0X21vdG9yOworCQkJZXBfMzhDMDgwMC0+c2NzaV9yZXNldF9kZWxheSA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5zY3NpX3Jlc2V0X3dhaXQ7CisJCQllcF8zOEMwODAwLT5zZXJpYWxfbnVtYmVyX3dvcmQxID0KKwkJCSAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMTsKKwkJCWVwXzM4QzA4MDAtPnNlcmlhbF9udW1iZXJfd29yZDIgPQorCQkJICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwyOworCQkJZXBfMzhDMDgwMC0+c2VyaWFsX251bWJlcl93b3JkMyA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDM7CisJCX0gZWxzZSB7CisJCQllcF8zOEMxNjAwID0gJmJvYXJkcC0+ZWVwX2NvbmZpZy5hZHZfMzhDMTYwMF9lZXA7CisKKwkJCWVwXzM4QzE2MDAtPmFkYXB0ZXJfc2NzaV9pZCA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQ7CisJCQllcF8zOEMxNjAwLT5tYXhfaG9zdF9xbmcgPSBhZHZfZHZjX3ZhcnAtPm1heF9ob3N0X3FuZzsKKwkJCWVwXzM4QzE2MDAtPm1heF9kdmNfcW5nID0gYWR2X2R2Y192YXJwLT5tYXhfZHZjX3FuZzsKKwkJCWVwXzM4QzE2MDAtPnRlcm1pbmF0aW9uX2x2ZCA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5jZmctPnRlcm1pbmF0aW9uOworCQkJZXBfMzhDMTYwMC0+ZGlzY19lbmFibGUgPQorCQkJICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5kaXNjX2VuYWJsZTsKKwkJCWVwXzM4QzE2MDAtPmJpb3NfY3RybCA9IGFkdl9kdmNfdmFycC0+Ymlvc19jdHJsOworCQkJZXBfMzhDMTYwMC0+d2R0cl9hYmxlID0gYWR2X2R2Y192YXJwLT53ZHRyX2FibGU7CisJCQllcF8zOEMxNjAwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7CisJCQllcF8zOEMxNjAwLT5zZHRyX3NwZWVkMSA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDE7CisJCQllcF8zOEMxNjAwLT5zZHRyX3NwZWVkMiA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDI7CisJCQllcF8zOEMxNjAwLT5zZHRyX3NwZWVkMyA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDM7CisJCQllcF8zOEMxNjAwLT5zZHRyX3NwZWVkNCA9IGFkdl9kdmNfdmFycC0+c2R0cl9zcGVlZDQ7CisJCQllcF8zOEMxNjAwLT50YWdxbmdfYWJsZSA9IGFkdl9kdmNfdmFycC0+dGFncW5nX2FibGU7CisJCQllcF8zOEMxNjAwLT5zdGFydF9tb3RvciA9IGFkdl9kdmNfdmFycC0+c3RhcnRfbW90b3I7CisJCQllcF8zOEMxNjAwLT5zY3NpX3Jlc2V0X2RlbGF5ID0KKwkJCSAgICBhZHZfZHZjX3ZhcnAtPnNjc2lfcmVzZXRfd2FpdDsKKwkJCWVwXzM4QzE2MDAtPnNlcmlhbF9udW1iZXJfd29yZDEgPQorCQkJICAgIGFkdl9kdmNfdmFycC0+Y2ZnLT5zZXJpYWwxOworCQkJZXBfMzhDMTYwMC0+c2VyaWFsX251bWJlcl93b3JkMiA9CisJCQkgICAgYWR2X2R2Y192YXJwLT5jZmctPnNlcmlhbDI7CisJCQllcF8zOEMxNjAwLT5zZXJpYWxfbnVtYmVyX3dvcmQzID0KKwkJCSAgICBhZHZfZHZjX3ZhcnAtPmNmZy0+c2VyaWFsMzsKKwkJfQorCisJCS8qCisJCSAqIFNldCB0aGUgYWRhcHRlcidzIHRhcmdldCBpZCBiaXQgaW4gdGhlICdpbml0X3RpZG1hc2snIGZpZWxkLgorCQkgKi8KKwkJYm9hcmRwLT5pbml0X3RpZG1hc2sgfD0KKwkJICAgIEFEVl9USURfVE9fVElETUFTSyhhZHZfZHZjX3ZhcnAtPmNoaXBfc2NzaV9pZCk7CisKKwkJLyoKKwkJICogRmluaXNoIGluaXRpYWxpemluZyB0aGUgJ1Njc2lfSG9zdCcgc3RydWN0dXJlLgorCQkgKi8KKwkJc2hvc3QtPmlycSA9IGFkdl9kdmNfdmFycC0+aXJxX25vOworCX0KKworCS8qCisJICogQ2hhbm5lbHMgYXJlIG51bWJlcmVkIGJlZ2lubmluZyB3aXRoIDAuIEZvciBBZHZhblN5cyBvbmUgaG9zdAorCSAqIHN0cnVjdHVyZSBzdXBwb3J0cyBvbmUgY2hhbm5lbC4gTXVsdGktY2hhbm5lbCBib2FyZHMgaGF2ZSBhCisJICogc2VwYXJhdGUgaG9zdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggY2hhbm5lbC4KKwkgKi8KKwlzaG9zdC0+bWF4X2NoYW5uZWwgPSAwOworCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJc2hvc3QtPm1heF9pZCA9IEFTQ19NQVhfVElEICsgMTsKKwkJc2hvc3QtPm1heF9sdW4gPSBBU0NfTUFYX0xVTiArIDE7CisKKwkJc2hvc3QtPmlvX3BvcnQgPSBhc2NfZHZjX3ZhcnAtPmlvcF9iYXNlOworCQlib2FyZHAtPmFzY19uX2lvX3BvcnQgPSBBU0NfSU9BRFJfR0FQOworCQlzaG9zdC0+dGhpc19pZCA9IGFzY19kdmNfdmFycC0+Y2ZnLT5jaGlwX3Njc2lfaWQ7CisKKwkJLyogU2V0IG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlcyB0aGUgYWRhcHRlciBjYW4gaGFuZGxlLiAqLworCQlzaG9zdC0+Y2FuX3F1ZXVlID0gYXNjX2R2Y192YXJwLT5tYXhfdG90YWxfcW5nOworCX0gZWxzZSB7CisJCXNob3N0LT5tYXhfaWQgPSBBRFZfTUFYX1RJRCArIDE7CisJCXNob3N0LT5tYXhfbHVuID0gQURWX01BWF9MVU4gKyAxOworCisJCS8qCisJCSAqIFNhdmUgdGhlIEkvTyBQb3J0IGFkZHJlc3MgYW5kIGxlbmd0aCBldmVuIHRob3VnaAorCQkgKiBJL08gcG9ydHMgYXJlIG5vdCB1c2VkIHRvIGFjY2VzcyBXaWRlIGJvYXJkcy4KKwkJICogSW5zdGVhZCB0aGUgV2lkZSBib2FyZHMgYXJlIGFjY2Vzc2VkIHdpdGgKKwkJICogUENJIE1lbW9yeSBNYXBwZWQgSS9PLgorCQkgKi8KKwkJc2hvc3QtPmlvX3BvcnQgPSBpb3A7CisJCWJvYXJkcC0+YXNjX25faW9fcG9ydCA9IGlvbGVuOworCisJCXNob3N0LT50aGlzX2lkID0gYWR2X2R2Y192YXJwLT5jaGlwX3Njc2lfaWQ7CisKKwkJLyogU2V0IG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlcyB0aGUgYWRhcHRlciBjYW4gaGFuZGxlLiAqLworCQlzaG9zdC0+Y2FuX3F1ZXVlID0gYWR2X2R2Y192YXJwLT5tYXhfaG9zdF9xbmc7CisJfQorCisJLyoKKwkgKiAnbl9pb19wb3J0JyBjdXJyZW50bHkgaXMgb25lIGJ5dGUuCisJICoKKwkgKiBTZXQgYSB2YWx1ZSB0byAnbl9pb19wb3J0JywgYnV0IG5ldmVyIHJlZmVyZW5jZWQgaXQgYmVjYXVzZQorCSAqIGl0IG1heSBiZSB0cnVuY2F0ZWQuCisJICovCisJc2hvc3QtPm5faW9fcG9ydCA9IGJvYXJkcC0+YXNjX25faW9fcG9ydCA8PSAyNTUgPworCSAgICBib2FyZHAtPmFzY19uX2lvX3BvcnQgOiAyNTU7CisKKwkvKgorCSAqIEZvbGxvd2luZyB2MS4zLjg5LCAnY21kX3Blcl9sdW4nIGlzIG5vIGxvbmdlciBuZWVkZWQKKwkgKiBhbmQgc2hvdWxkIGJlIHNldCB0byB6ZXJvLgorCSAqCisJICogQnV0IGJlY2F1c2Ugb2YgYSBidWcgaW50cm9kdWNlZCBpbiB2MS4zLjg5IGlmIHRoZSBkcml2ZXIgaXMKKwkgKiBjb21waWxlZCBhcyBhIG1vZHVsZSBhbmQgJ2NtZF9wZXJfbHVuJyBpcyB6ZXJvLCB0aGUgTWlkLUxldmVsCisJICogU0NTSSBmdW5jdGlvbiAnYWxsb2NhdGVfZGV2aWNlJyB3aWxsIHBhbmljLiBUbyBhbGxvdyB0aGUgZHJpdmVyCisJICogdG8gd29yayBhcyBhIG1vZHVsZSBpbiB0aGVzZSBrZXJuZWxzIHNldCAnY21kX3Blcl9sdW4nIHRvIDEuCisJICoKKwkgKiBOb3RlOiBUaGlzIGlzIHdyb25nLiAgY21kX3Blcl9sdW4gc2hvdWxkIGJlIHNldCB0byB0aGUgZGVwdGgKKwkgKiB5b3Ugd2FudCBvbiB1bnRhZ2dlZCBkZXZpY2VzIGFsd2F5cy4KKwkgI2lmZGVmIE1PRFVMRQorCSAqLworCXNob3N0LT5jbWRfcGVyX2x1biA9IDE7CisvKiAjZWxzZQorICAgICAgICAgICAgc2hvc3QtPmNtZF9wZXJfbHVuID0gMDsKKyNlbmRpZiAqLworCisJLyoKKwkgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzIHRoZQorCSAqIGFkYXB0ZXIgY2FuIGhhbmRsZS4KKwkgKi8KKwlpZiAoQVNDX05BUlJPV19CT0FSRChib2FyZHApKSB7CisJCS8qCisJCSAqIEFsbG93IHR3byBjb21tYW5kcyB3aXRoICdzZ190YWJsZXNpemUnIHNjYXR0ZXItZ2F0aGVyCisJCSAqIGVsZW1lbnRzIHRvIGJlIGV4ZWN1dGVkIHNpbXVsdGFuZW91c2x5LiBUaGlzIHZhbHVlIGlzCisJCSAqIHRoZSB0aGVvcmV0aWNhbCBoYXJkd2FyZSBsaW1pdC4gSXQgbWF5IGJlIGRlY3JlYXNlZAorCQkgKiBiZWxvdy4KKwkJICovCisJCXNob3N0LT5zZ190YWJsZXNpemUgPQorCQkgICAgKCgoYXNjX2R2Y192YXJwLT5tYXhfdG90YWxfcW5nIC0gMikgLyAyKSAqCisJCSAgICAgQVNDX1NHX0xJU1RfUEVSX1EpICsgMTsKKwl9IGVsc2UgeworCQlzaG9zdC0+c2dfdGFibGVzaXplID0gQURWX01BWF9TR19MSVNUOworCX0KKworCS8qCisJICogVGhlIHZhbHVlIG9mICdzZ190YWJsZXNpemUnIGNhbiBub3QgZXhjZWVkIHRoZSBTQ1NJCisJICogbWlkLWxldmVsIGRyaXZlciBkZWZpbml0aW9uIG9mIFNHX0FMTC4gU0dfQUxMIGFsc28KKwkgKiBtdXN0IG5vdCBiZSBleGNlZWRlZCwgYmVjYXVzZSBpdCBpcyB1c2VkIHRvIGRlZmluZSB0aGUKKwkgKiBzaXplIG9mIHRoZSBzY2F0dGVyLWdhdGhlciB0YWJsZSBpbiAnc3RydWN0IGFzY19zZ19oZWFkJy4KKwkgKi8KKwlpZiAoc2hvc3QtPnNnX3RhYmxlc2l6ZSA+IFNHX0FMTCkgeworCQlzaG9zdC0+c2dfdGFibGVzaXplID0gU0dfQUxMOworCX0KKworCUFTQ19EQkcxKDEsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogc2dfdGFibGVzaXplOiAlZFxuIiwgc2hvc3QtPnNnX3RhYmxlc2l6ZSk7CisKKwkvKiBCSU9TIHN0YXJ0IGFkZHJlc3MuICovCisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCQlzaG9zdC0+YmFzZSA9ICgodWxvbmcpCisJCQkgICAgIEFzY0dldENoaXBCaW9zQWRkcmVzcyhhc2NfZHZjX3ZhcnAtPgorCQkJCQkJICAgaW9wX2Jhc2UsCisJCQkJCQkgICBhc2NfZHZjX3ZhcnAtPmJ1c190eXBlKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRmlsbC1pbiBCSU9TIGJvYXJkIHZhcmlhYmxlcy4gVGhlIFdpZGUgQklPUyBzYXZlcworCQkgKiBpbmZvcm1hdGlvbiBpbiBMUkFNIHRoYXQgaXMgdXNlZCBieSB0aGUgZHJpdmVyLgorCQkgKi8KKwkJQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsCisJCQkJQklPU19TSUdOQVRVUkUsIGJvYXJkcC0+Ymlvc19zaWduYXR1cmUpOworCQlBZHZSZWFkV29yZExyYW0oYWR2X2R2Y192YXJwLT5pb3BfYmFzZSwKKwkJCQlCSU9TX1ZFUlNJT04sIGJvYXJkcC0+Ymlvc192ZXJzaW9uKTsKKwkJQWR2UmVhZFdvcmRMcmFtKGFkdl9kdmNfdmFycC0+aW9wX2Jhc2UsCisJCQkJQklPU19DT0RFU0VHLCBib2FyZHAtPmJpb3NfY29kZXNlZyk7CisJCUFkdlJlYWRXb3JkTHJhbShhZHZfZHZjX3ZhcnAtPmlvcF9iYXNlLAorCQkJCUJJT1NfQ09ERUxFTiwgYm9hcmRwLT5iaW9zX2NvZGVsZW4pOworCisJCUFTQ19EQkcyKDEsCisJCQkgImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBiaW9zX3NpZ25hdHVyZSAweCV4LCBiaW9zX3ZlcnNpb24gMHgleFxuIiwKKwkJCSBib2FyZHAtPmJpb3Nfc2lnbmF0dXJlLCBib2FyZHAtPmJpb3NfdmVyc2lvbik7CisKKwkJQVNDX0RCRzIoMSwKKwkJCSAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IGJpb3NfY29kZXNlZyAweCV4LCBiaW9zX2NvZGVsZW4gMHgleFxuIiwKKwkJCSBib2FyZHAtPmJpb3NfY29kZXNlZywgYm9hcmRwLT5iaW9zX2NvZGVsZW4pOworCisJCS8qCisJCSAqIElmIHRoZSBCSU9TIHNhdmVkIGEgdmFsaWQgc2lnbmF0dXJlLCB0aGVuIGZpbGwgaW4KKwkJICogdGhlIEJJT1MgY29kZSBzZWdtZW50IGJhc2UgYWRkcmVzcy4KKwkJICovCisJCWlmIChib2FyZHAtPmJpb3Nfc2lnbmF0dXJlID09IDB4NTVBQSkgeworCQkJLyoKKwkJCSAqIENvbnZlcnQgeDg2IHJlYWxtb2RlIGNvZGUgc2VnbWVudCB0byBhIGxpbmVhcgorCQkJICogYWRkcmVzcyBieSBzaGlmdGluZyBsZWZ0IDQuCisJCQkgKi8KKwkJCXNob3N0LT5iYXNlID0gKCh1bG9uZylib2FyZHAtPmJpb3NfY29kZXNlZyA8PCA0KTsKKwkJfSBlbHNlIHsKKwkJCXNob3N0LT5iYXNlID0gMDsKKwkJfQorCX0KKworCS8qCisJICogUmVnaXN0ZXIgQm9hcmQgUmVzb3VyY2VzIC0gSS9PIFBvcnQsIERNQSwgSVJRCisJICovCisKKwkvKgorCSAqIFJlZ2lzdGVyIEkvTyBwb3J0IHJhbmdlLgorCSAqCisJICogRm9yIFdpZGUgYm9hcmRzIHRoZSBJL08gcG9ydHMgYXJlIG5vdCB1c2VkIHRvIGFjY2VzcworCSAqIHRoZSBib2FyZCwgYnV0IHJlcXVlc3QgdGhlIHJlZ2lvbiBhbnl3YXkuCisJICoKKwkgKiAnc2hvc3QtPm5faW9fcG9ydCcgaXMgbm90IHJlZmVyZW5jZWQsIGJlY2F1c2UgaXQgbWF5IGJlIHRydW5jYXRlZC4KKwkgKi8KKwlBU0NfREJHMigyLAorCQkgImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiByZXF1ZXN0X3JlZ2lvbiBwb3J0IDB4JWx4LCBsZW4gMHgleFxuIiwKKwkJICh1bG9uZylzaG9zdC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKwlpZiAocmVxdWVzdF9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCwKKwkJCSAgICJhZHZhbnN5cyIpID09IE5VTEwpIHsKKwkJQVNDX1BSSU5UMworCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQ6IHJlcXVlc3RfcmVnaW9uKCkgZmFpbGVkLCBwb3J0IDB4JWx4LCBsZW4gMHgleFxuIiwKKwkJICAgICBib2FyZHAtPmlkLCAodWxvbmcpc2hvc3QtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJa2ZyZWUoYm9hcmRwLT5wcnRidWYpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJCWFzY19ib2FyZF9jb3VudC0tOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBSZWdpc3RlciBETUEgQ2hhbm5lbCBmb3IgTmFycm93IGJvYXJkcy4gKi8KKwlzaG9zdC0+ZG1hX2NoYW5uZWwgPSBOT19JU0FfRE1BOwkvKiBEZWZhdWx0IHRvIG5vIElTQSBETUEuICovCisjaWZkZWYgQ09ORklHX0lTQQorCWlmIChBU0NfTkFSUk9XX0JPQVJEKGJvYXJkcCkpIHsKKwkJLyogUmVnaXN0ZXIgRE1BIGNoYW5uZWwgZm9yIElTQSBidXMuICovCisJCWlmIChhc2NfZHZjX3ZhcnAtPmJ1c190eXBlICYgQVNDX0lTX0lTQSkgeworCQkJc2hvc3QtPmRtYV9jaGFubmVsID0gYXNjX2R2Y192YXJwLT5jZmctPmlzYV9kbWFfY2hhbm5lbDsKKwkJCWlmICgocmV0ID0KKwkJCSAgICAgcmVxdWVzdF9kbWEoc2hvc3QtPmRtYV9jaGFubmVsLCAiYWR2YW5zeXMiKSkgIT0gMCkgeworCQkJCUFTQ19QUklOVDMKKwkJCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQ6IHJlcXVlc3RfZG1hKCkgJWQgZmFpbGVkICVkXG4iLAorCQkJCSAgICAgYm9hcmRwLT5pZCwgc2hvc3QtPmRtYV9jaGFubmVsLCByZXQpOworCQkJCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LAorCQkJCQkgICAgICAgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCQkJCWtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCQkJCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJCQkJYXNjX2JvYXJkX2NvdW50LS07CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlBc2NFbmFibGVJc2FEbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisKKwkvKiBSZWdpc3RlciBJUlEgTnVtYmVyLiAqLworCUFTQ19EQkcxKDIsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogcmVxdWVzdF9pcnEoKSAlZFxuIiwgc2hvc3QtPmlycSk7CisJLyoKKwkgKiBJZiByZXF1ZXN0X2lycSgpIGZhaWxzIHdpdGggdGhlIElSUUZfRElTQUJMRUQgZmxhZyBzZXQsCisJICogdGhlbiB0cnkgYWdhaW4gd2l0aG91dCB0aGUgSVJRRl9ESVNBQkxFRCBmbGFnIHNldC4gVGhpcworCSAqIGFsbG93cyBJUlEgc2hhcmluZyB0byB3b3JrIGV2ZW4gd2l0aCBvdGhlciBkcml2ZXJzIHRoYXQKKwkgKiBkbyBub3Qgc2V0IHRoZSBJUlFGX0RJU0FCTEVEIGZsYWcuCisJICoKKwkgKiBJZiBJUlFGX0RJU0FCTEVEIGlzIG5vdCBzZXQsIHRoZW4gaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorCSAqIGJlZm9yZSB0aGUgZHJpdmVyIGludGVycnVwdCBmdW5jdGlvbiBpcyBjYWxsZWQuCisJICovCisJaWYgKCgocmV0ID0gcmVxdWVzdF9pcnEoc2hvc3QtPmlycSwgYWR2YW5zeXNfaW50ZXJydXB0LAorCQkJCUlSUUZfRElTQUJMRUQgfCAoc2hhcmVfaXJxID09CisJCQkJCQkgVFJVRSA/CisJCQkJCQkgSVJRRl9TSEFSRUQgOgorCQkJCQkJIDApLCAiYWR2YW5zeXMiLCBib2FyZHApKSAhPSAwKQorCSAgICAmJgorCSAgICAoKHJldCA9CisJICAgICAgcmVxdWVzdF9pcnEoc2hvc3QtPmlycSwgYWR2YW5zeXNfaW50ZXJydXB0LAorCQkJICAoc2hhcmVfaXJxID09IFRSVUUgPyBJUlFGX1NIQVJFRCA6IDApLAorCQkJICAiYWR2YW5zeXMiLCBib2FyZHApKSAhPSAwKSkgeworCQlpZiAocmV0ID09IC1FQlVTWSkgeworCQkJQVNDX1BSSU5UMgorCQkJICAgICgiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IGJvYXJkICVkOiByZXF1ZXN0X2lycSgpOiBJUlEgMHgleCBhbHJlYWR5IGluIHVzZS5cbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIHNob3N0LT5pcnEpOworCQl9IGVsc2UgaWYgKHJldCA9PSAtRUlOVkFMKSB7CisJCQlBU0NfUFJJTlQyCisJCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQ6IHJlcXVlc3RfaXJxKCk6IElSUSAweCV4IG5vdCB2YWxpZC5cbiIsCisJCQkgICAgIGJvYXJkcC0+aWQsIHNob3N0LT5pcnEpOworCQl9IGVsc2UgeworCQkJQVNDX1BSSU5UMworCQkJICAgICgiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IGJvYXJkICVkOiByZXF1ZXN0X2lycSgpOiBJUlEgMHgleCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCwgc2hvc3QtPmlycSwgcmV0KTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgYm9hcmRwLT5hc2Nfbl9pb19wb3J0KTsKKwkJaW91bm1hcChib2FyZHAtPmlvcmVtYXBfYWRkcik7CisJCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gTk9fSVNBX0RNQSkgeworCQkJZnJlZV9kbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKKwkJfQorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJCWtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCQlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOworCQlhc2NfYm9hcmRfY291bnQtLTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGJvYXJkIFJJU0MgY2hpcCBhbmQgZW5hYmxlIGludGVycnVwdHMuCisJICovCisJaWYgKEFTQ19OQVJST1dfQk9BUkQoYm9hcmRwKSkgeworCQlBU0NfREJHKDIsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogQXNjSW5pdEFzYzEwMDBEcml2ZXIoKVxuIik7CisJCXdhcm5fY29kZSA9IEFzY0luaXRBc2MxMDAwRHJpdmVyKGFzY19kdmNfdmFycCk7CisJCWVycl9jb2RlID0gYXNjX2R2Y192YXJwLT5lcnJfY29kZTsKKworCQlpZiAod2Fybl9jb2RlIHx8IGVycl9jb2RlKSB7CisJCQlBU0NfUFJJTlQ0CisJCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQgZXJyb3I6IGluaXRfc3RhdGUgMHgleCwgd2FybiAweCV4LCBlcnJvciAweCV4XG4iLAorCQkJICAgICBib2FyZHAtPmlkLAorCQkJICAgICBhc2NfZHZjX3ZhcnAtPmluaXRfc3RhdGUsIHdhcm5fY29kZSwgZXJyX2NvZGUpOworCQl9CisJfSBlbHNlIHsKKwkJQURWX0NBUlJfVCAqY2FycnA7CisJCWludCByZXFfY250ID0gMDsKKwkJYWR2X3JlcV90ICpyZXFwID0gTlVMTDsKKwkJaW50IHNnX2NudCA9IDA7CisKKwkJLyoKKwkJICogQWxsb2NhdGUgYnVmZmVyIGNhcnJpZXIgc3RydWN0dXJlcy4gVGhlIHRvdGFsIHNpemUKKwkJICogaXMgYWJvdXQgNCBLQiwgc28gYWxsb2NhdGUgYWxsIGF0IG9uY2UuCisJCSAqLworCQljYXJycCA9IChBRFZfQ0FSUl9UICopIGttYWxsb2MoQURWX0NBUlJJRVJfQlVGU0laRSwgR0ZQX0FUT01JQyk7CisJCUFTQ19EQkcxKDEsICJhZHZhbnN5c19ib2FyZF9mb3VuZDogY2FycnAgMHglbHhcbiIsICh1bG9uZyljYXJycCk7CisKKwkJaWYgKGNhcnJwID09IE5VTEwpIHsKKwkJCWdvdG8ga21hbGxvY19lcnJvcjsKKwkJfQorCisJCS8qCisJCSAqIEFsbG9jYXRlIHVwIHRvICdtYXhfaG9zdF9xbmcnIHJlcXVlc3Qgc3RydWN0dXJlcyBmb3IKKwkJICogdGhlIFdpZGUgYm9hcmQuIFRoZSB0b3RhbCBzaXplIGlzIGFib3V0IDE2IEtCLCBzbworCQkgKiBhbGxvY2F0ZSBhbGwgYXQgb25jZS4gSWYgdGhlIGFsbG9jYXRpb24gZmFpbHMgZGVjcmVtZW50CisJCSAqIGFuZCB0cnkgYWdhaW4uCisJCSAqLworCQlmb3IgKHJlcV9jbnQgPSBhZHZfZHZjX3ZhcnAtPm1heF9ob3N0X3FuZzsKKwkJICAgICByZXFfY250ID4gMDsgcmVxX2NudC0tKSB7CisKKwkJCXJlcXAgPSAoYWR2X3JlcV90ICopCisJCQkgICAga21hbGxvYyhzaXplb2YoYWR2X3JlcV90KSAqIHJlcV9jbnQsIEdGUF9BVE9NSUMpOworCisJCQlBU0NfREJHMygxLAorCQkJCSAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IHJlcXAgMHglbHgsIHJlcV9jbnQgJWQsIGJ5dGVzICVsdVxuIiwKKwkJCQkgKHVsb25nKXJlcXAsIHJlcV9jbnQsCisJCQkJICh1bG9uZylzaXplb2YoYWR2X3JlcV90KSAqIHJlcV9jbnQpOworCisJCQlpZiAocmVxcCAhPSBOVUxMKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHJlcXAgPT0gTlVMTCkgeworCQkJZ290byBrbWFsbG9jX2Vycm9yOworCQl9CisKKwkJLyoKKwkJICogQWxsb2NhdGUgdXAgdG8gQURWX1RPVF9TR19CTE9DSyByZXF1ZXN0IHN0cnVjdHVyZXMgZm9yCisJCSAqIHRoZSBXaWRlIGJvYXJkLiBFYWNoIHN0cnVjdHVyZSBpcyBhYm91dCAxMzYgYnl0ZXMuCisJCSAqLworCQlib2FyZHAtPmFkdl9zZ2Jsa3AgPSBOVUxMOworCQlmb3IgKHNnX2NudCA9IDA7IHNnX2NudCA8IEFEVl9UT1RfU0dfQkxPQ0s7IHNnX2NudCsrKSB7CisKKwkJCXNncCA9IChhZHZfc2dibGtfdCAqKQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKGFkdl9zZ2Jsa190KSwgR0ZQX0FUT01JQyk7CisKKwkJCWlmIChzZ3AgPT0gTlVMTCkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlzZ3AtPm5leHRfc2dibGtwID0gYm9hcmRwLT5hZHZfc2dibGtwOworCQkJYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwOworCisJCX0KKwkJQVNDX0RCRzMoMSwKKwkJCSAiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IHNnX2NudCAlZCAqICV1ID0gJXUgYnl0ZXNcbiIsCisJCQkgc2dfY250LCBzaXplb2YoYWR2X3NnYmxrX3QpLAorCQkJICh1bnNpZ25lZCkoc2l6ZW9mKGFkdl9zZ2Jsa190KSAqIHNnX2NudCkpOworCisJCS8qCisJCSAqIElmIG5vIHJlcXVlc3Qgc3RydWN0dXJlcyBvciBzY2F0dGVyLWdhdGhlciBzdHJ1Y3R1cmVzIGNvdWxkCisJCSAqIGJlIGFsbG9jYXRlZCwgdGhlbiByZXR1cm4gYW4gZXJyb3IuIE90aGVyd2lzZSBjb250aW51ZSB3aXRoCisJCSAqIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKyBrbWFsbG9jX2Vycm9yOgorCQlpZiAoY2FycnAgPT0gTlVMTCkgeworCQkJQVNDX1BSSU5UMQorCQkJICAgICgiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IGJvYXJkICVkIGVycm9yOiBmYWlsZWQgdG8ga21hbGxvYygpIGNhcnJpZXIgYnVmZmVyLlxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCk7CisJCQllcnJfY29kZSA9IEFEVl9FUlJPUjsKKwkJfSBlbHNlIGlmIChyZXFwID09IE5VTEwpIHsKKwkJCWtmcmVlKGNhcnJwKTsKKwkJCUFTQ19QUklOVDEKKwkJCSAgICAoImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBib2FyZCAlZCBlcnJvcjogZmFpbGVkIHRvIGttYWxsb2MoKSBhZHZfcmVxX3QgYnVmZmVyLlxuIiwKKwkJCSAgICAgYm9hcmRwLT5pZCk7CisJCQllcnJfY29kZSA9IEFEVl9FUlJPUjsKKwkJfSBlbHNlIGlmIChib2FyZHAtPmFkdl9zZ2Jsa3AgPT0gTlVMTCkgeworCQkJa2ZyZWUoY2FycnApOworCQkJa2ZyZWUocmVxcCk7CisJCQlBU0NfUFJJTlQxCisJCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQgZXJyb3I6IGZhaWxlZCB0byBrbWFsbG9jKCkgYWR2X3NnYmxrX3QgYnVmZmVycy5cbiIsCisJCQkgICAgIGJvYXJkcC0+aWQpOworCQkJZXJyX2NvZGUgPSBBRFZfRVJST1I7CisJCX0gZWxzZSB7CisKKwkJCS8qIFNhdmUgY2FycmllciBidWZmZXIgcG9pbnRlci4gKi8KKwkJCWJvYXJkcC0+b3JpZ19jYXJycCA9IGNhcnJwOworCisJCQkvKgorCQkJICogU2F2ZSBvcmlnaW5hbCBwb2ludGVyIGZvciBrZnJlZSgpIGluIGNhc2UgdGhlCisJCQkgKiBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUgYW5kIGNhbiBiZSB1bmxvYWRlZC4KKwkJCSAqLworCQkJYm9hcmRwLT5vcmlnX3JlcXAgPSByZXFwOworCisJCQlhZHZfZHZjX3ZhcnAtPmNhcnJpZXJfYnVmID0gY2FycnA7CisKKwkJCS8qCisJCQkgKiBQb2ludCAnYWR2X3JlcXAnIHRvIHRoZSByZXF1ZXN0IHN0cnVjdHVyZXMgYW5kCisJCQkgKiBsaW5rIHRoZW0gdG9nZXRoZXIuCisJCQkgKi8KKwkJCXJlcV9jbnQtLTsKKwkJCXJlcXBbcmVxX2NudF0ubmV4dF9yZXFwID0gTlVMTDsKKwkJCWZvciAoOyByZXFfY250ID4gMDsgcmVxX2NudC0tKSB7CisJCQkJcmVxcFtyZXFfY250IC0gMV0ubmV4dF9yZXFwID0gJnJlcXBbcmVxX2NudF07CisJCQl9CisJCQlib2FyZHAtPmFkdl9yZXFwID0gJnJlcXBbMF07CisKKwkJCWlmIChhZHZfZHZjX3ZhcnAtPmNoaXBfdHlwZSA9PSBBRFZfQ0hJUF9BU0MzNTUwKSB7CisJCQkJQVNDX0RCRygyLAorCQkJCQkiYWR2YW5zeXNfYm9hcmRfZm91bmQ6IEFkdkluaXRBc2MzNTUwRHJpdmVyKClcbiIpOworCQkJCXdhcm5fY29kZSA9IEFkdkluaXRBc2MzNTUwRHJpdmVyKGFkdl9kdmNfdmFycCk7CisJCQl9IGVsc2UgaWYgKGFkdl9kdmNfdmFycC0+Y2hpcF90eXBlID09CisJCQkJICAgQURWX0NISVBfQVNDMzhDMDgwMCkgeworCQkJCUFTQ19EQkcoMiwKKwkJCQkJImFkdmFuc3lzX2JvYXJkX2ZvdW5kOiBBZHZJbml0QXNjMzhDMDgwMERyaXZlcigpXG4iKTsKKwkJCQl3YXJuX2NvZGUgPQorCQkJCSAgICBBZHZJbml0QXNjMzhDMDgwMERyaXZlcihhZHZfZHZjX3ZhcnApOworCQkJfSBlbHNlIHsKKwkJCQlBU0NfREJHKDIsCisJCQkJCSJhZHZhbnN5c19ib2FyZF9mb3VuZDogQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoKVxuIik7CisJCQkJd2Fybl9jb2RlID0KKwkJCQkgICAgQWR2SW5pdEFzYzM4QzE2MDBEcml2ZXIoYWR2X2R2Y192YXJwKTsKKwkJCX0KKwkJCWVycl9jb2RlID0gYWR2X2R2Y192YXJwLT5lcnJfY29kZTsKKworCQkJaWYgKHdhcm5fY29kZSB8fCBlcnJfY29kZSkgeworCQkJCUFTQ19QUklOVDMKKwkJCQkgICAgKCJhZHZhbnN5c19ib2FyZF9mb3VuZDogYm9hcmQgJWQgZXJyb3I6IHdhcm4gMHgleCwgZXJyb3IgMHgleFxuIiwKKwkJCQkgICAgIGJvYXJkcC0+aWQsIHdhcm5fY29kZSwgZXJyX2NvZGUpOworCQkJfQorCQl9CisJfQorCisJaWYgKGVycl9jb2RlICE9IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7CisJCWlmIChBU0NfV0lERV9CT0FSRChib2FyZHApKSB7CisJCQlpb3VubWFwKGJvYXJkcC0+aW9yZW1hcF9hZGRyKTsKKwkJCWtmcmVlKGJvYXJkcC0+b3JpZ19jYXJycCk7CisJCQlib2FyZHAtPm9yaWdfY2FycnAgPSBOVUxMOworCQkJaWYgKGJvYXJkcC0+b3JpZ19yZXFwKSB7CisJCQkJa2ZyZWUoYm9hcmRwLT5vcmlnX3JlcXApOworCQkJCWJvYXJkcC0+b3JpZ19yZXFwID0gYm9hcmRwLT5hZHZfcmVxcCA9IE5VTEw7CisJCQl9CisJCQl3aGlsZSAoKHNncCA9IGJvYXJkcC0+YWR2X3NnYmxrcCkgIT0gTlVMTCkgeworCQkJCWJvYXJkcC0+YWR2X3NnYmxrcCA9IHNncC0+bmV4dF9zZ2Jsa3A7CisJCQkJa2ZyZWUoc2dwKTsKKwkJCX0KKwkJfQorCQlpZiAoc2hvc3QtPmRtYV9jaGFubmVsICE9IE5PX0lTQV9ETUEpIHsKKwkJCWZyZWVfZG1hKHNob3N0LT5kbWFfY2hhbm5lbCk7CisJCX0KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCQlrZnJlZShib2FyZHAtPnBydGJ1Zik7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwkJZnJlZV9pcnEoc2hvc3QtPmlycSwgYm9hcmRwKTsKKwkJc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKKwkJYXNjX2JvYXJkX2NvdW50LS07CisJCXJldHVybiBOVUxMOworCX0KKwlBU0NfREJHX1BSVF9TQ1NJX0hPU1QoMiwgc2hvc3QpOworCisJcmV0dXJuIHNob3N0OworfQorCisvKgorICogYWR2YW5zeXNfZGV0ZWN0KCkKKyAqCisgKiBEZXRlY3QgZnVuY3Rpb24gZm9yIEFkdmFuU3lzIGFkYXB0ZXJzLgorICoKKyAqIEFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB0aGUgaG9zdCBkcml2ZXIncyBzY3NpX2hvc3RzIGVudHJ5LgorICoKKyAqIFJldHVybiBudW1iZXIgb2YgYWRhcHRlcnMgZm91bmQuCisgKgorICogTm90ZTogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgc3lzdGVtIGluaXRpYWxpemF0aW9uCisgKiBpdCBtdXN0IG5vdCBjYWxsIFNDU0kgbWlkLWxldmVsIGZ1bmN0aW9ucyBpbmNsdWRpbmcgc2NzaV9tYWxsb2MoKQorICogYW5kIHNjc2lfZnJlZSgpLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhZHZhbnN5c19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKK3sKKwlzdGF0aWMgaW50IGRldGVjdF9jYWxsZWQgPSBBU0NfRkFMU0U7CisJaW50IGlvcDsKKwlpbnQgYnVzOworCWludCBpb3BvcnQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisjaWZkZWYgQ09ORklHX1BDSQorCWludCBwY2lfaW5pdF9zZWFyY2ggPSAwOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlcFtBU0NfTlVNX0JPQVJEX1NVUFBPUlRFRF07CisJaW50IHBjaV9jYXJkX2NudF9tYXggPSAwOworCWludCBwY2lfY2FyZF9jbnQgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlpbnQgcGNpX2RldmljZV9pZF9jbnQgPSAwOworCXVuc2lnbmVkIGludCBwY2lfZGV2aWNlX2lkW0FTQ19QQ0lfREVWSUNFX0lEX0NOVF0gPSB7CisJCVBDSV9ERVZJQ0VfSURfQVNQXzEyMDBBLAorCQlQQ0lfREVWSUNFX0lEX0FTUF9BQlA5NDAsCisJCVBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MFUsCisJCVBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MFVXLAorCQlQQ0lfREVWSUNFX0lEXzM4QzA4MDBfUkVWMSwKKwkJUENJX0RFVklDRV9JRF8zOEMxNjAwX1JFVjEKKwl9OworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworCWlmIChkZXRlY3RfY2FsbGVkID09IEFTQ19GQUxTRSkgeworCQlkZXRlY3RfY2FsbGVkID0gQVNDX1RSVUU7CisJfSBlbHNlIHsKKwkJcHJpbnRrCisJCSAgICAoIkFkdmFuU3lzIFNDU0k6IGFkdmFuc3lzX2RldGVjdCgpIG11bHRpcGxlIGNhbGxzIGlnbm9yZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlBU0NfREJHKDEsICJhZHZhbnN5c19kZXRlY3Q6IGJlZ2luXG4iKTsKKworCWFzY19ib2FyZF9jb3VudCA9IDA7CisKKwkvKgorCSAqIElmIEkvTyBwb3J0IHByb2JpbmcgaGFzIGJlZW4gbW9kaWZpZWQsIHRoZW4gdmVyaWZ5IGFuZAorCSAqIGNsZWFuLXVwIHRoZSAnYXNjX2lvcG9ydCcgbGlzdC4KKwkgKi8KKwlpZiAoYXNjX2lvcGZsYWcgPT0gQVNDX1RSVUUpIHsKKwkJZm9yIChpb3BvcnQgPSAwOyBpb3BvcnQgPCBBU0NfTlVNX0lPUE9SVF9QUk9CRTsgaW9wb3J0KyspIHsKKwkJCUFTQ19EQkcyKDEsICJhZHZhbnN5c19kZXRlY3Q6IGFzY19pb3BvcnRbJWRdIDB4JXhcbiIsCisJCQkJIGlvcG9ydCwgYXNjX2lvcG9ydFtpb3BvcnRdKTsKKwkJCWlmIChhc2NfaW9wb3J0W2lvcG9ydF0gIT0gMCkgeworCQkJCWZvciAoaW9wID0gMDsgaW9wIDwgQVNDX0lPQURSX1RBQkxFX01BWF9JWDsKKwkJCQkgICAgIGlvcCsrKSB7CisJCQkJCWlmIChfYXNjX2RlZl9pb3BfYmFzZVtpb3BdID09CisJCQkJCSAgICBhc2NfaW9wb3J0W2lvcG9ydF0pIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChpb3AgPT0gQVNDX0lPQURSX1RBQkxFX01BWF9JWCkgeworCQkJCQlwcmludGsKKwkJCQkJICAgICgiQWR2YW5TeXMgU0NTSTogc3BlY2lmaWVkIEkvTyBQb3J0IDB4JVggaXMgaW52YWxpZFxuIiwKKwkJCQkJICAgICBhc2NfaW9wb3J0W2lvcG9ydF0pOworCQkJCQlhc2NfaW9wb3J0W2lvcG9ydF0gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlpb3BvcnQgPSAwOworCX0KKworCWZvciAoYnVzID0gMDsgYnVzIDwgQVNDX05VTV9CVVM7IGJ1cysrKSB7CisKKwkJQVNDX0RCRzIoMSwgImFkdmFuc3lzX2RldGVjdDogYnVzIHNlYXJjaCB0eXBlICVkICglcylcbiIsCisJCQkgYnVzLCBhc2NfYnVzX25hbWVbYnVzXSk7CisJCWlvcCA9IDA7CisKKwkJd2hpbGUgKGFzY19ib2FyZF9jb3VudCA8IEFTQ19OVU1fQk9BUkRfU1VQUE9SVEVEKSB7CisKKwkJCUFTQ19EQkcxKDIsICJhZHZhbnN5c19kZXRlY3Q6IGFzY19ib2FyZF9jb3VudCAlZFxuIiwKKwkJCQkgYXNjX2JvYXJkX2NvdW50KTsKKworCQkJc3dpdGNoIChhc2NfYnVzW2J1c10pIHsKKwkJCWNhc2UgQVNDX0lTX0lTQToKKwkJCWNhc2UgQVNDX0lTX1ZMOgorI2lmZGVmIENPTkZJR19JU0EKKwkJCQlpZiAoYXNjX2lvcGZsYWcgPT0gQVNDX0ZBTFNFKSB7CisJCQkJCWlvcCA9CisJCQkJCSAgICBBc2NTZWFyY2hJT1BvcnRBZGRyKGlvcCwKKwkJCQkJCQkJYXNjX2J1c1tidXNdKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBJU0EgYW5kIFZMIEkvTyBwb3J0IHNjYW5uaW5nIGhhcyBlaXRoZXIgYmVlbgorCQkJCQkgKiBlbGltaW5hdGVkIG9yIGxpbWl0ZWQgdG8gc2VsZWN0ZWQgcG9ydHMgb24KKwkJCQkJICogdGhlIExJTE8gY29tbWFuZCBsaW5lLCAvZXRjL2xpbG8uY29uZiwgb3IKKwkJCQkJICogYnkgc2V0dGluZyB2YXJpYWJsZXMgd2hlbiB0aGUgbW9kdWxlIHdhcyBsb2FkZWQuCisJCQkJCSAqLworCQkJCQlBU0NfREJHKDEsCisJCQkJCQkiYWR2YW5zeXNfZGV0ZWN0OiBJL08gcG9ydCBzY2FubmluZyBtb2RpZmllZFxuIik7CisgaW9wb3J0X3RyeV9hZ2FpbjoKKwkJCQkJaW9wID0gMDsKKwkJCQkJZm9yICg7IGlvcG9ydCA8IEFTQ19OVU1fSU9QT1JUX1BST0JFOworCQkJCQkgICAgIGlvcG9ydCsrKSB7CisJCQkJCQlpZiAoKGlvcCA9CisJCQkJCQkgICAgIGFzY19pb3BvcnRbaW9wb3J0XSkgIT0gMCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChpb3ApIHsKKwkJCQkJCUFTQ19EQkcxKDEsCisJCQkJCQkJICJhZHZhbnN5c19kZXRlY3Q6IHByb2JpbmcgSS9PIHBvcnQgMHgleC4uLlxuIiwKKwkJCQkJCQkgaW9wKTsKKwkJCQkJCWlmICghcmVxdWVzdF9yZWdpb24KKwkJCQkJCSAgICAoaW9wLCBBU0NfSU9BRFJfR0FQLAorCQkJCQkJICAgICAiYWR2YW5zeXMiKSkgeworCQkJCQkJCXByaW50aworCQkJCQkJCSAgICAoIkFkdmFuU3lzIFNDU0k6IHNwZWNpZmllZCBJL08gUG9ydCAweCVYIGlzIGJ1c3lcbiIsCisJCQkJCQkJICAgICBpb3ApOworCQkJCQkJCS8qIERvbid0IHRyeSB0aGlzIEkvTyBwb3J0IHR3aWNlLiAqLworCQkJCQkJCWFzY19pb3BvcnRbaW9wb3J0XSA9IDA7CisJCQkJCQkJZ290byBpb3BvcnRfdHJ5X2FnYWluOworCQkJCQkJfSBlbHNlIGlmIChBc2NGaW5kU2lnbmF0dXJlKGlvcCkKKwkJCQkJCQkgICA9PSBBU0NfRkFMU0UpIHsKKwkJCQkJCQlwcmludGsKKwkJCQkJCQkgICAgKCJBZHZhblN5cyBTQ1NJOiBzcGVjaWZpZWQgSS9PIFBvcnQgMHglWCBoYXMgbm8gYWRhcHRlclxuIiwKKwkJCQkJCQkgICAgIGlvcCk7CisJCQkJCQkJLyogRG9uJ3QgdHJ5IHRoaXMgSS9PIHBvcnQgdHdpY2UuICovCisJCQkJCQkJcmVsZWFzZV9yZWdpb24oaW9wLAorCQkJCQkJCQkgICAgICAgQVNDX0lPQURSX0dBUCk7CisJCQkJCQkJYXNjX2lvcG9ydFtpb3BvcnRdID0gMDsKKwkJCQkJCQlnb3RvIGlvcG9ydF90cnlfYWdhaW47CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qCisJCQkJCQkJICogSWYgdGhpcyBpc24ndCBhbiBJU0EgYm9hcmQsIHRoZW4gaXQgbXVzdCBiZQorCQkJCQkJCSAqIGEgVkwgYm9hcmQuIElmIGN1cnJlbnRseSBsb29raW5nIGFuIElTQQorCQkJCQkJCSAqIGJvYXJkIGlzIGJlaW5nIGxvb2tlZCBmb3IgdGhlbiB0cnkgZm9yCisJCQkJCQkJICogYW5vdGhlciBJU0EgYm9hcmQgaW4gJ2FzY19pb3BvcnQnLgorCQkJCQkJCSAqLworCQkJCQkJCWlmIChhc2NfYnVzW2J1c10gPT0KKwkJCQkJCQkgICAgQVNDX0lTX0lTQQorCQkJCQkJCSAgICAmJgorCQkJCQkJCSAgICAoQXNjR2V0Q2hpcFZlcnNpb24KKwkJCQkJCQkgICAgIChpb3AsCisJCQkJCQkJICAgICAgQVNDX0lTX0lTQSkgJgorCQkJCQkJCSAgICAgQVNDX0NISVBfVkVSX0lTQV9CSVQpCisJCQkJCQkJICAgID09IDApIHsKKwkJCQkJCQkJLyoKKwkJCQkJCQkJICogRG9uJ3QgY2xlYXIgJ2FzY19pb3BvcnRbaW9wb3J0XScuIFRyeQorCQkJCQkJCQkgKiB0aGlzIGJvYXJkIGFnYWluIGZvciBWTC4gSW5jcmVtZW50CisJCQkJCQkJCSAqICdpb3BvcnQnIHBhc3QgdGhpcyBib2FyZC4KKwkJCQkJCQkJICovCisJCQkJCQkJCWlvcG9ydCsrOworCQkJCQkJCQlyZWxlYXNlX3JlZ2lvbgorCQkJCQkJCQkgICAgKGlvcCwKKwkJCQkJCQkJICAgICBBU0NfSU9BRFJfR0FQKTsKKwkJCQkJCQkJZ290byBpb3BvcnRfdHJ5X2FnYWluOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8qCisJCQkJCQkgKiBUaGlzIGJvYXJkIGFwcGVhcnMgZ29vZCwgZG9uJ3QgdHJ5IHRoZSBJL08gcG9ydAorCQkJCQkJICogYWdhaW4gYnkgY2xlYXJpbmcgaXRzIHZhbHVlLiBJbmNyZW1lbnQgJ2lvcG9ydCcKKwkJCQkJCSAqIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisJCQkJCQkgKi8KKwkJCQkJCWFzY19pb3BvcnRbaW9wb3J0KytdID0gMDsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvKiBDT05GSUdfSVNBICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQVNDX0lTX0VJU0E6CisjaWZkZWYgQ09ORklHX0lTQQorCQkJCWlvcCA9IEFzY1NlYXJjaElPUG9ydEFkZHIoaW9wLCBhc2NfYnVzW2J1c10pOworI2VuZGlmIC8qIENPTkZJR19JU0EgKi8KKwkJCQlicmVhazsKKworCQkJY2FzZSBBU0NfSVNfUENJOgorI2lmZGVmIENPTkZJR19QQ0kKKwkJCQlpZiAocGNpX2luaXRfc2VhcmNoID09IDApIHsKKwkJCQkJaW50IGksIGo7CisKKwkJCQkJcGNpX2luaXRfc2VhcmNoID0gMTsKKworCQkJCQkvKiBGaW5kIGFsbCBQQ0kgY2FyZHMuICovCisJCQkJCXdoaWxlIChwY2lfZGV2aWNlX2lkX2NudCA8CisJCQkJCSAgICAgICBBU0NfUENJX0RFVklDRV9JRF9DTlQpIHsKKwkJCQkJCWlmICgocGRldiA9CisJCQkJCQkgICAgIHBjaV9maW5kX2RldmljZQorCQkJCQkJICAgICAoUENJX1ZFTkRPUl9JRF9BU1AsCisJCQkJCQkgICAgICBwY2lfZGV2aWNlX2lkCisJCQkJCQkgICAgICBbcGNpX2RldmljZV9pZF9jbnRdLAorCQkJCQkJICAgICAgcGRldikpID09IE5VTEwpIHsKKwkJCQkJCQlwY2lfZGV2aWNlX2lkX2NudCsrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UKKwkJCQkJCQkgICAgKHBkZXYpID09IDApIHsKKwkJCQkJCQkJcGNpX2RldmljZXAKKwkJCQkJCQkJICAgIFtwY2lfY2FyZF9jbnRfbWF4KytdCisJCQkJCQkJCSAgICA9IHBkZXY7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogU29ydCBQQ0kgY2FyZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IFBDSSBCdXMsIFNsb3QsCisJCQkJCSAqIGFuZCBEZXZpY2UgTnVtYmVyLgorCQkJCQkgKi8KKwkJCQkJZm9yIChpID0gMDsgaSA8IHBjaV9jYXJkX2NudF9tYXggLSAxOworCQkJCQkgICAgIGkrKykgeworCQkJCQkJZm9yIChqID0gaSArIDE7CisJCQkJCQkgICAgIGogPCBwY2lfY2FyZF9jbnRfbWF4OworCQkJCQkJICAgICBqKyspIHsKKwkJCQkJCQlpZiAoKHBjaV9kZXZpY2VwW2pdLT4KKwkJCQkJCQkgICAgIGJ1cy0+bnVtYmVyIDwKKwkJCQkJCQkgICAgIHBjaV9kZXZpY2VwW2ldLT4KKwkJCQkJCQkgICAgIGJ1cy0+bnVtYmVyKQorCQkJCQkJCSAgICB8fAorCQkJCQkJCSAgICAoKHBjaV9kZXZpY2VwW2pdLT4KKwkJCQkJCQkgICAgICBidXMtPm51bWJlciA9PQorCQkJCQkJCSAgICAgIHBjaV9kZXZpY2VwW2ldLT4KKwkJCQkJCQkgICAgICBidXMtPm51bWJlcikKKwkJCQkJCQkgICAgICYmCisJCQkJCQkJICAgICAocGNpX2RldmljZXBbal0tPgorCQkJCQkJCSAgICAgIGRldmZuIDwKKwkJCQkJCQkgICAgICBwY2lfZGV2aWNlcFtpXS0+CisJCQkJCQkJICAgICAgZGV2Zm4pKSkgeworCQkJCQkJCQlwZGV2ID0KKwkJCQkJCQkJICAgIHBjaV9kZXZpY2VwCisJCQkJCQkJCSAgICBbaV07CisJCQkJCQkJCXBjaV9kZXZpY2VwW2ldID0KKwkJCQkJCQkJICAgIHBjaV9kZXZpY2VwCisJCQkJCQkJCSAgICBbal07CisJCQkJCQkJCXBjaV9kZXZpY2VwW2pdID0KKwkJCQkJCQkJICAgIHBkZXY7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcGNpX2NhcmRfY250ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwY2lfY2FyZF9jbnQrKzsKKwkJCQl9CisKKwkJCQlpZiAocGNpX2NhcmRfY250ID09IHBjaV9jYXJkX2NudF9tYXgpIHsKKwkJCQkJaW9wID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlwZGV2ID0gcGNpX2RldmljZXBbcGNpX2NhcmRfY250XTsKKworCQkJCQlBU0NfREJHMigyLAorCQkJCQkJICJhZHZhbnN5c19kZXRlY3Q6IGRldmZuICVkLCBidXMgbnVtYmVyICVkXG4iLAorCQkJCQkJIHBkZXYtPmRldmZuLAorCQkJCQkJIHBkZXYtPmJ1cy0+bnVtYmVyKTsKKwkJCQkJaW9wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQkJCQlBU0NfREJHMigxLAorCQkJCQkJICJhZHZhbnN5c19kZXRlY3Q6IHZlbmRvcklEICVYLCBkZXZpY2VJRCAlWFxuIiwKKwkJCQkJCSBwZGV2LT52ZW5kb3IsCisJCQkJCQkgcGRldi0+ZGV2aWNlKTsKKwkJCQkJQVNDX0RCRzIoMiwKKwkJCQkJCSAiYWR2YW5zeXNfZGV0ZWN0OiBpb3AgJVgsIGlycUxpbmUgJWRcbiIsCisJCQkJCQkgaW9wLCBwZGV2LT5pcnEpOworCQkJCX0KKwkJCQlpZiAocGRldikKKwkJCQkJZGV2ID0gJnBkZXYtPmRldjsKKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlBU0NfUFJJTlQxCisJCQkJICAgICgiYWR2YW5zeXNfZGV0ZWN0OiB1bmtub3duIGJ1cyB0eXBlOiAlZFxuIiwKKwkJCQkgICAgIGFzY19idXNbYnVzXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlBU0NfREJHMSgxLCAiYWR2YW5zeXNfZGV0ZWN0OiBpb3AgMHgleFxuIiwgaW9wKTsKKworCQkJLyoKKwkJCSAqIEFkYXB0ZXIgbm90IGZvdW5kLCB0cnkgbmV4dCBidXMgdHlwZS4KKwkJCSAqLworCQkJaWYgKGlvcCA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWFkdmFuc3lzX2JvYXJkX2ZvdW5kKGlvcCwgZGV2LCBhc2NfYnVzW2J1c10pOworCQl9CisJfQorCisJQVNDX0RCRzEoMSwgImFkdmFuc3lzX2RldGVjdDogZG9uZTogYXNjX2JvYXJkX2NvdW50ICVkXG4iLAorCQkgYXNjX2JvYXJkX2NvdW50KTsKKwlyZXR1cm4gYXNjX2JvYXJkX2NvdW50OworfQorCisvKgorICogYWR2YW5zeXNfcmVsZWFzZSgpCisgKgorICogUmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHNpbmdsZSBBZHZhblN5cyBhZGFwdGVyLgorICovCitzdGF0aWMgaW50IGFkdmFuc3lzX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJYXNjX2JvYXJkX3QgKmJvYXJkcDsKKworCUFTQ19EQkcoMSwgImFkdmFuc3lzX3JlbGVhc2U6IGJlZ2luXG4iKTsKKwlib2FyZHAgPSBBU0NfQk9BUkRQKHNob3N0KTsKKwlmcmVlX2lycShzaG9zdC0+aXJxLCBib2FyZHApOworCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gTk9fSVNBX0RNQSkgeworCQlBU0NfREJHKDEsICJhZHZhbnN5c19yZWxlYXNlOiBmcmVlX2RtYSgpXG4iKTsKKwkJZnJlZV9kbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKKwl9CisJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIGJvYXJkcC0+YXNjX25faW9fcG9ydCk7CisJaWYgKEFTQ19XSURFX0JPQVJEKGJvYXJkcCkpIHsKKwkJYWR2X3NnYmxrX3QgKnNncCA9IE5VTEw7CisKKwkJaW91bm1hcChib2FyZHAtPmlvcmVtYXBfYWRkcik7CisJCWtmcmVlKGJvYXJkcC0+b3JpZ19jYXJycCk7CisJCWJvYXJkcC0+b3JpZ19jYXJycCA9IE5VTEw7CisJCWlmIChib2FyZHAtPm9yaWdfcmVxcCkgeworCQkJa2ZyZWUoYm9hcmRwLT5vcmlnX3JlcXApOworCQkJYm9hcmRwLT5vcmlnX3JlcXAgPSBib2FyZHAtPmFkdl9yZXFwID0gTlVMTDsKKwkJfQorCQl3aGlsZSAoKHNncCA9IGJvYXJkcC0+YWR2X3NnYmxrcCkgIT0gTlVMTCkgeworCQkJYm9hcmRwLT5hZHZfc2dibGtwID0gc2dwLT5uZXh0X3NnYmxrcDsKKwkJCWtmcmVlKHNncCk7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlBU0NfQVNTRVJUKGJvYXJkcC0+cHJ0YnVmICE9IE5VTEwpOworCWtmcmVlKGJvYXJkcC0+cHJ0YnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7CisJQVNDX0RCRygxLCAiYWR2YW5zeXNfcmVsZWFzZTogZW5kXG4iKTsKKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19QQ0kKIC8qIFBDSSBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFkdmFuc3lzX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0gewotCXsgUENJX1ZFTkRPUl9JRF9BU1AsIFBDSV9ERVZJQ0VfSURfQVNQXzEyMDBBLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9BU1AsIFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MCwKLQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfQVNQLCBQQ0lfREVWSUNFX0lEX0FTUF9BQlA5NDBVLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9BU1AsIFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MFVXLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9BU1AsIFBDSV9ERVZJQ0VfSURfMzhDMDgwMF9SRVYxLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9BU1AsIFBDSV9ERVZJQ0VfSURfMzhDMTYwMF9SRVYxLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAotCXsgfQorCXtQQ0lfVkVORE9SX0lEX0FTUCwgUENJX0RFVklDRV9JRF9BU1BfMTIwMEEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0FTUCwgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9BU1AsIFBDSV9ERVZJQ0VfSURfQVNQX0FCUDk0MFUsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0FTUCwgUENJX0RFVklDRV9JRF9BU1BfQUJQOTQwVVcsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0FTUCwgUENJX0RFVklDRV9JRF8zOEMwODAwX1JFVjEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0FTUCwgUENJX0RFVklDRV9JRF8zOEMxNjAwX1JFVjEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXt9CiB9OworCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWR2YW5zeXNfcGNpX3RibCk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKaW5kZXggMjg2YWI4MzEuLmEwNTVhOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwpAQCAtMjI4NCw5ICsyMjg0LDEyIEBACiAJaWYgKHBlcmlvZCA8IDgpCiAJCXBlcmlvZCA9IDg7CiAJaWYgKHBlcmlvZCA8IDEwKSB7Ci0JCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0RUX1JFUTsKLQkJaWYgKHBlcmlvZCA9PSA4KQotCQkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfSVVfUkVROworCQlpZiAoc3BpX21heF93aWR0aChzdGFyZ2V0KSkgeworCQkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROworCQkJaWYgKHBlcmlvZCA9PSA4KQorCQkJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0lVX1JFUTsKKwkJfSBlbHNlCisJCQlwZXJpb2QgPSAxMDsKIAl9CiAKIAlkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROwpAQCAtMjM2NSw3ICsyMzY4LDcgQEAKIAkJcHJpbnRmKCIlczogJXMgRFRcbiIsIGFoZF9uYW1lKGFoZCksIAogCQkgICAgICAgZHQgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwogI2VuZGlmCi0JaWYgKGR0KSB7CisJaWYgKGR0ICYmIHNwaV9tYXhfd2lkdGgoc3RhcmdldCkpIHsKIAkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROwogCQlpZiAoIXdpZHRoKQogCQkJYWhkX2xpbnV4X3NldF93aWR0aChzdGFyZ2V0LCAxKTsKQEAgLTI0NDcsNyArMjQ1MCw3IEBACiAJCSAgICAgICBpdSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CiAjZW5kaWYKIAotCWlmIChpdSkgeworCWlmIChpdSAmJiBzcGlfbWF4X3dpZHRoKHN0YXJnZXQpKSB7CiAJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX0lVX1JFUTsKIAkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROyAvKiBJVSByZXF1aXJlcyBEVCAqLwogCX0KQEAgLTI0ODcsNyArMjQ5MCw3IEBACiAJCSAgICAgICByZHN0cm0gID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKICNlbmRpZgogCi0JaWYgKHJkc3RybSkKKwlpZiAocmRzdHJtICYmIHNwaV9tYXhfd2lkdGgoc3RhcmdldCkpCiAJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JEX1NUUk07CiAKIAlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCkBAIC0yNTIzLDcgKzI1MjYsNyBAQAogCQkgICAgICAgd3JmbG93ID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKICNlbmRpZgogCi0JaWYgKHdyZmxvdykKKwlpZiAod3JmbG93ICYmIHNwaV9tYXhfd2lkdGgoc3RhcmdldCkpCiAJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1dSX0ZMT1c7CiAKIAlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCkBAIC0yNTY3LDcgKzI1NzAsNyBAQAogCQkgICAgICAgcnRpID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKICNlbmRpZgogCi0JaWYgKHJ0aSkKKwlpZiAocnRpICYmIHNwaV9tYXhfd2lkdGgoc3RhcmdldCkpCiAJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1JUSTsKIAogCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKQEAgLTI2MDMsNyArMjYwNiw3IEBACiAJCSAgICAgICBwY29tcCA/ICJFbmFibGUiIDogIkRpc2FibGUiKTsKICNlbmRpZgogCi0JaWYgKHBjb21wKSB7CisJaWYgKHBjb21wICYmIHNwaV9tYXhfd2lkdGgoc3RhcmdldCkpIHsKIAkJdWludDhfdCBwcmVjb21wOwogCiAJCWlmIChhaGQtPnVuaXQgPCBBUlJBWV9TSVpFKGFpYzc5eHhfaW9jZWxsX2luZm8pKSB7CkBAIC0yNjQ3LDcgKzI2NTAsNyBAQAogCXVuc2lnbmVkIGludCBkdCA9IHBwcl9vcHRpb25zICYgTVNHX0VYVF9QUFJfRFRfUkVROwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoaG9sZCkKKwlpZiAoaG9sZCAmJiBzcGlfbWF4X3dpZHRoKHN0YXJnZXQpKQogCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9IT0xEX01DUzsKIAogCWFoZF9jb21waWxlX2RldmluZm8oJmRldmluZm8sIHNob3N0LT50aGlzX2lkLCBzdGFyZ2V0LT5pZCwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCmluZGV4IDE4MDNhYjYuLjJlOWMzOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwpAQCAtMjMxNyw4ICsyMzE3LDEzIEBACiAKIAlpZiAocGVyaW9kIDwgOSkKIAkJcGVyaW9kID0gOTsJLyogMTIuNW5zIGlzIG91ciBtaW5pbXVtICovCi0JaWYgKHBlcmlvZCA9PSA5KQotCQlwcHJfb3B0aW9ucyB8PSBNU0dfRVhUX1BQUl9EVF9SRVE7CisJaWYgKHBlcmlvZCA9PSA5KSB7CisJCWlmIChzcGlfbWF4X3dpZHRoKHN0YXJnZXQpKQorCQkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROworCQllbHNlCisJCQkvKiBuZWVkIHdpZGUgZm9yIERUIGFuZCBuZWVkIERUIGZvciAxMi41IG5zICovCisJCQlwZXJpb2QgPSAxMDsKKwl9CiAKIAlhaGNfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCiAJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOwpAQCAtMjM4MSw3ICsyMzg2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBhaGNfc3luY3JhdGUgKnN5bmNyYXRlOwogCi0JaWYgKGR0KSB7CisJaWYgKGR0ICYmIHNwaV9tYXhfd2lkdGgoc3RhcmdldCkpIHsKIAkJcHByX29wdGlvbnMgfD0gTVNHX0VYVF9QUFJfRFRfUkVROwogCQlpZiAoIXdpZHRoKQogCQkJYWhjX2xpbnV4X3NldF93aWR0aChzdGFyZ2V0LCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9pbml0LmMKaW5kZXggYWIwMGFlYy4uNjNiY2RlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9pbml0LmMKQEAgLTU4Niw3ICs1ODYsNyBAQAogCQlnb3RvIEVycjsKIAl9CiAJYXNkX2hhLT5wY2lkZXYgPSBkZXY7Ci0JYXNkX2hhLT5zYXNfaGEucGNpZGV2ID0gYXNkX2hhLT5wY2lkZXY7CisJYXNkX2hhLT5zYXNfaGEuZGV2ID0gJmFzZF9oYS0+cGNpZGV2LT5kZXY7CiAJYXNkX2hhLT5zYXNfaGEubGxkZF9oYSA9IGFzZF9oYTsKIAogCWFzZF9oYS0+bmFtZSA9IGFzZF9kZXYtPm5hbWU7CkBAIC02MDUsOCArNjA1LDYgQEAKIAkJZ290byBFcnJfZnJlZTsKIAl9CiAKLQotCiAJZXJyID0gYXNkX2Rldi0+c2V0dXAoYXNkX2hhKTsKIAlpZiAoZXJyKQogCQlnb3RvIEVycl9mcmVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCmluZGV4IDc4MjlhYjEuLmEyMTQ1NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKQEAgLTIyMTYsMTEgKzIyMTYsMTMgQEAKIAogc3RhdGljIGludCBpc2NzaV90Y3Bfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKKwlibGtfcXVldWVfYm91bmNlX2xpbWl0KHNkZXYtPnJlcXVlc3RfcXVldWUsIEJMS19CT1VOQ0VfQU5ZKTsKIAlibGtfcXVldWVfZG1hX2FsaWdubWVudChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAwKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaXNjc2lfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSAiaVNDU0kgSW5pdGlhdG9yIG92ZXIgVENQL0lQIiwKIAkucXVldWVjb21tYW5kICAgICAgICAgICA9IGlzY3NpX3F1ZXVlY29tbWFuZCwKIAkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gaXNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwppbmRleCA0ZDg1Y2UxLi41NjA2ZDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwpAQCAtNTk2LDkgKzU5NiwxNiBAQAogCW5vcC0+Y21kc24gPSBjcHVfdG9fYmUzMihzZXNzaW9uLT5jbWRzbik7CiAJaWYgKGhkci0+aXR0ICE9IFJFU0VSVkVEX0lUVCkgewogCQloZHItPml0dCA9IGJ1aWxkX2l0dChtdGFzay0+aXR0LCBjb25uLT5pZCwgc2Vzc2lvbi0+YWdlKTsKKwkJLyoKKwkJICogVE9ETzogV2UgYWx3YXlzIHVzZSBpbW1lZGlhdGUsIHNvIHdlIG5ldmVyIGhpdCB0aGlzLgorCQkgKiBJZiB3ZSBzdGFydCB0byBzZW5kIHRtZnMgb3Igbm9wcyBhcyBub24taW1tZWRpYXRlIHRoZW4KKwkJICogd2Ugc2hvdWxkIHN0YXJ0IGNoZWNraW5nIHRoZSBjbWRzbiBudW1iZXJzIGZvciBtZ210IHRhc2tzLgorCQkgKi8KIAkJaWYgKGNvbm4tPmNfc3RhZ2UgPT0gSVNDU0lfQ09OTl9TVEFSVEVEICYmCi0JCSAgICAhKGhkci0+b3Bjb2RlICYgSVNDU0lfT1BfSU1NRURJQVRFKSkKKwkJICAgICEoaGRyLT5vcGNvZGUgJiBJU0NTSV9PUF9JTU1FRElBVEUpKSB7CisJCQlzZXNzaW9uLT5xdWV1ZWRfY21kc24rKzsKIAkJCXNlc3Npb24tPmNtZHNuKys7CisJCX0KIAl9CiAKIAlpZiAoc2Vzc2lvbi0+dHQtPmluaXRfbWdtdF90YXNrKQpAQCAtNjQxLDkgKzY0OCwxMSBAQAogCS8qCiAJICogQ2hlY2sgZm9yIGlTQ1NJIHdpbmRvdyBhbmQgdGFrZSBjYXJlIG9mIENtZFNOIHdyYXAtYXJvdW5kCiAJICovCi0JaWYgKCFpc2NzaV9zbmFfbHRlKHNlc3Npb24tPmNtZHNuLCBzZXNzaW9uLT5tYXhfY21kc24pKSB7Ci0JCWRlYnVnX3Njc2koImlTQ1NJIENtZFNOIGNsb3NlZC4gTWF4Q21kU04gJXUgQ21kU04gJXVcbiIsCi0JCQkgICBzZXNzaW9uLT5tYXhfY21kc24sIHNlc3Npb24tPmNtZHNuKTsKKwlpZiAoIWlzY3NpX3NuYV9sdGUoc2Vzc2lvbi0+cXVldWVkX2NtZHNuLCBzZXNzaW9uLT5tYXhfY21kc24pKSB7CisJCWRlYnVnX3Njc2koImlTQ1NJIENtZFNOIGNsb3NlZC4gRXhwQ21kU24gJXUgTWF4Q21kU04gJXUgIgorCQkJICAgIkNtZFNOICV1LyV1XG4iLCBzZXNzaW9uLT5leHBfY21kc24sCisJCQkgICBzZXNzaW9uLT5tYXhfY21kc24sIHNlc3Npb24tPmNtZHNuLAorCQkJICAgc2Vzc2lvbi0+cXVldWVkX2NtZHNuKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCXJldHVybiAwOwpAQCAtNzIyLDExICs3MzEsNiBAQAogCiAJLyogcHJvY2VzcyBjb21tYW5kIHF1ZXVlICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25uLT54bWl0cXVldWUpKSB7Ci0JCXJjID0gaXNjc2lfY2hlY2tfY21kc25fd2luZG93X2Nsb3NlZChjb25uKTsKLQkJaWYgKHJjKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KIAkJLyoKIAkJICogaXNjc2kgdGNwIG1heSByZWFkZCB0aGUgdGFzayB0byB0aGUgeG1pdHF1ZXVlIHRvIHNlbmQKIAkJICogd3JpdGUgZGF0YQpAQCAtODM0LDEyICs4MzgsNiBAQAogCQlnb3RvIGZhdWx0OwogCX0KIAotCS8qCi0JICogV2UgY2hlY2sgdGhpcyBoZXJlIGFuZCBpbiBkYXRhIHhtaXQsIGJlY2F1c2UgaWYgd2UgZ2V0IHRvIHRoZSBwb2ludAotCSAqIHRoYXQgdGhpcyBjaGVjayBpcyBoaXR0aW5nIHRoZSB3aW5kb3cgdGhlbiB3ZSBoYXZlIGVub3VnaCBJTyBpbgotCSAqIGZsaWdodCBhbmQgZW5vdWdoIElPIHdhaXRpbmcgdG8gYmUgdHJhbnNtaXR0ZWQgaXQgaXMgYmV0dGVyCi0JICogdG8gbGV0IHRoZSBzY3NpL2Jsb2NrIGxheWVyIHF1ZXVlIHVwLgotCSAqLwogCWlmIChpc2NzaV9jaGVja19jbWRzbl93aW5kb3dfY2xvc2VkKGNvbm4pKSB7CiAJCXJlYXNvbiA9IEZBSUxVUkVfV0lORE9XX0NMT1NFRDsKIAkJZ290byByZWplY3Q7CkBAIC04NTAsNiArODQ4LDggQEAKIAkJcmVhc29uID0gRkFJTFVSRV9PT007CiAJCWdvdG8gcmVqZWN0OwogCX0KKwlzZXNzaW9uLT5xdWV1ZWRfY21kc24rKzsKKwogCXNjLT5TQ3AucGhhc2UgPSBzZXNzaW9uLT5hZ2U7CiAJc2MtPlNDcC5wdHIgPSAoY2hhciAqKWN0YXNrOwogCkBAIC0xMTQwLDcgKzExNDAsMTMgQEAKIAlpZiAoIXNjKQogCQlyZXR1cm47CiAKLQlpZiAoY3Rhc2stPnN0YXRlICE9IElTQ1NJX1RBU0tfUEVORElORykKKwlpZiAoY3Rhc2stPnN0YXRlID09IElTQ1NJX1RBU0tfUEVORElORykKKwkJLyoKKwkJICogY21kIG5ldmVyIG1hZGUgaXQgdG8gdGhlIHhtaXQgdGhyZWFkLCBzbyB3ZSBzaG91bGQgbm90IGNvdW50CisJCSAqIHRoZSBjbWQgaW4gdGhlIHNlcXVlbmNpbmcKKwkJICovCisJCWNvbm4tPnNlc3Npb24tPnF1ZXVlZF9jbWRzbi0tOworCWVsc2UKIAkJY29ubi0+c2Vzc2lvbi0+dHQtPmNsZWFudXBfY21kX3Rhc2soY29ubiwgY3Rhc2spOwogCWlzY3NpX2N0YXNrX210YXNrX2NsZWFudXAoY3Rhc2spOwogCkBAIC0xMzkyLDcgKzEzOTgsNyBAQAogCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU1RBVEVfRlJFRTsKIAlzZXNzaW9uLT5tZ210cG9vbF9tYXggPSBJU0NTSV9NR01UX0NNRFNfTUFYOwogCXNlc3Npb24tPmNtZHNfbWF4ID0gY21kc19tYXg7Ci0Jc2Vzc2lvbi0+Y21kc24gPSBpbml0aWFsX2NtZHNuOworCXNlc3Npb24tPnF1ZXVlZF9jbWRzbiA9IHNlc3Npb24tPmNtZHNuID0gaW5pdGlhbF9jbWRzbjsKIAlzZXNzaW9uLT5leHBfY21kc24gPSBpbml0aWFsX2NtZHNuICsgMTsKIAlzZXNzaW9uLT5tYXhfY21kc24gPSBpbml0aWFsX2NtZHNuICsgMTsKIAlzZXNzaW9uLT5tYXhfcjJ0ID0gMTsKQEAgLTE0NzMsNiArMTQ3OSw3IEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9ob3N0ZGF0YShzaG9zdC0+aG9zdGRhdGEpOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gY2xzX3Nlc3Npb24tPnRyYW5zcG9ydC0+b3duZXI7CiAKKwlpc2NzaV91bmJsb2NrX3Nlc3Npb24oY2xzX3Nlc3Npb24pOwogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCiAJaXNjc2lfcG9vbF9mcmVlKCZzZXNzaW9uLT5tZ210cG9vbCwgKHZvaWQqKilzZXNzaW9uLT5tZ210X2NtZHMpOwpAQCAtMTYxNSwxMSArMTYyMiw4IEBACiAJa2ZyZWUoY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzKTsKIAlfX2tmaWZvX3B1dChzZXNzaW9uLT5tZ210cG9vbC5xdWV1ZSwgKHZvaWQqKSZjb25uLT5sb2dpbl9tdGFzaywKIAkJICAgIHNpemVvZih2b2lkKikpOwotCWlmIChzZXNzaW9uLT5sZWFkY29ubiA9PSBjb25uKSB7CisJaWYgKHNlc3Npb24tPmxlYWRjb25uID09IGNvbm4pCiAJCXNlc3Npb24tPmxlYWRjb25uID0gTlVMTDsKLQkJLyogbm8gY29ubmVjdGlvbnMgZXhpdHMuLiByZXNldCBzZXF1ZW5jaW5nICovCi0JCXNlc3Npb24tPmNtZHNuID0gc2Vzc2lvbi0+bWF4X2NtZHNuID0gc2Vzc2lvbi0+ZXhwX2NtZHNuID0gMTsKLQl9CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCiAJa2ZpZm9fZnJlZShjb25uLT5tZ210cXVldWUpOwpAQCAtMTY0OSw2ICsxNjUzLDcgQEAKIAlzcGluX2xvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCWNvbm4tPmNfc3RhZ2UgPSBJU0NTSV9DT05OX1NUQVJURUQ7CiAJc2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9MT0dHRURfSU47CisJc2Vzc2lvbi0+cXVldWVkX2NtZHNuID0gc2Vzc2lvbi0+Y21kc247CiAKIAlzd2l0Y2goY29ubi0+c3RvcF9zdGFnZSkgewogCWNhc2UgU1RPUF9DT05OX1JFQ09WRVI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCmluZGV4IGNlZDJkZTMuLjVlNTczZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2F0YS5jCkBAIC0zODIsNyArMzgyLDcgQEAKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCiAJYXRhX2hvc3RfaW5pdCgmZm91bmRfZGV2LT5zYXRhX2Rldi5hdGFfaG9zdCwKLQkJICAgICAgJmhhLT5wY2lkZXYtPmRldiwKKwkJICAgICAgaGEtPmRldiwKIAkJICAgICAgc2F0YV9wb3J0X2luZm8uZmxhZ3MsCiAJCSAgICAgICZzYXNfc2F0YV9vcHMpOwogCWFwID0gYXRhX3Nhc19wb3J0X2FsbG9jKCZmb3VuZF9kZXYtPnNhdGFfZGV2LmF0YV9ob3N0LApAQCAtNDQ4LDEwICs0NDgsMTAgQEAKICAqIEB0YXNrOiB0aGUgdGFzayB0byBiZSBleGVjdXRlZAogICogQGJ1ZmZlcjogcG9pbnRlciB0byBidWZmZXIgdG8gZG8gSS9PCiAgKiBAc2l6ZTogc2l6ZSBvZiBAYnVmZmVyCi0gKiBAcGNpX2RtYV9kaXI6IFBDSV9ETUFfLi4uCisgKiBAZG1hX2RpcjogRE1BIGRpcmVjdGlvbi4gIERNQV94eHgKICAqLwogc3RhdGljIGludCBzYXNfZXhlY3V0ZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaywgdm9pZCAqYnVmZmVyLCBpbnQgc2l6ZSwKLQkJCSAgICBpbnQgcGNpX2RtYV9kaXIpCisJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcikKIHsKIAlpbnQgcmVzID0gMDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNjYXR0ZXIgPSBOVUxMOwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJc3RydWN0IHNhc19pbnRlcm5hbCAqaSA9CiAJCXRvX3Nhc19pbnRlcm5hbCh0YXNrLT5kZXYtPnBvcnQtPmhhLT5jb3JlLnNob3N0LT50cmFuc3BvcnR0KTsKIAotCWlmIChwY2lfZG1hX2RpciAhPSBQQ0lfRE1BX05PTkUpIHsKKwlpZiAoZG1hX2RpciAhPSBETUFfTk9ORSkgewogCQlzY2F0dGVyID0ga3phbGxvYyhzaXplb2YoKnNjYXR0ZXIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzY2F0dGVyKQogCQkJZ290byBvdXQ7CkBAIC00NzQsMTEgKzQ3NCwxMSBAQAogCXRhc2stPnNjYXR0ZXIgPSBzY2F0dGVyOwogCXRhc2stPm51bV9zY2F0dGVyID0gbnVtX3NjYXR0ZXI7CiAJdGFzay0+dG90YWxfeGZlcl9sZW4gPSBzaXplOwotCXRhc2stPmRhdGFfZGlyID0gcGNpX2RtYV9kaXI7CisJdGFzay0+ZGF0YV9kaXIgPSBkbWFfZGlyOwogCXRhc2stPnRhc2tfZG9uZSA9IHNhc19kaXNjX3Rhc2tfZG9uZTsKLQlpZiAocGNpX2RtYV9kaXIgIT0gUENJX0RNQV9OT05FICYmCisJaWYgKGRtYV9kaXIgIT0gRE1BX05PTkUgJiYKIAkgICAgc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSkgewotCQl0YXNrLT5udW1fc2NhdHRlciA9IHBjaV9tYXBfc2codGFzay0+ZGV2LT5wb3J0LT5oYS0+cGNpZGV2LAorCQl0YXNrLT5udW1fc2NhdHRlciA9IGRtYV9tYXBfc2codGFzay0+ZGV2LT5wb3J0LT5oYS0+ZGV2LAogCQkJCQkgICAgICAgdGFzay0+c2NhdHRlciwKIAkJCQkJICAgICAgIHRhc2stPm51bV9zY2F0dGVyLAogCQkJCQkgICAgICAgdGFzay0+ZGF0YV9kaXIpOwpAQCAtNTY1LDkgKzU2NSw5IEBACiAJCX0KIAl9CiBleF9lcnI6Ci0JaWYgKHBjaV9kbWFfZGlyICE9IFBDSV9ETUFfTk9ORSkgeworCWlmIChkbWFfZGlyICE9IERNQV9OT05FKSB7CiAJCWlmIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKQotCQkJcGNpX3VubWFwX3NnKHRhc2stPmRldi0+cG9ydC0+aGEtPnBjaWRldiwKKwkJCWRtYV91bm1hcF9zZyh0YXNrLT5kZXYtPnBvcnQtPmhhLT5kZXYsCiAJCQkJICAgICB0YXNrLT5zY2F0dGVyLCB0YXNrLT5udW1fc2NhdHRlciwKIAkJCQkgICAgIHRhc2stPmRhdGFfZGlyKTsKIAkJa2ZyZWUoc2NhdHRlcik7CkBAIC02MjgsMTEgKzYyOCwxMSBAQAogICogQGZlYXR1cmVzOiB0aGUgZmVhdHVyZXMgcmVnaXN0ZXIKICAqIEBidWZmZXI6IHBvaW50ZXIgdG8gYnVmZmVyIHRvIGRvIEkvTwogICogQHNpemU6IHNpemUgb2YgQGJ1ZmZlcgotICogQHBjaV9kbWFfZGlyOiBQQ0lfRE1BXy4uLgorICogQGRtYV9kaXI6IERNQSBkaXJlY3Rpb24uICBETUFfeHh4CiAgKi8KIHN0YXRpYyBpbnQgc2FzX2lzc3VlX2F0YV9jbWQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTggY29tbWFuZCwKIAkJCSAgICAgdTggZmVhdHVyZXMsIHZvaWQgKmJ1ZmZlciwgaW50IHNpemUsCi0JCQkgICAgIGludCBwY2lfZG1hX2RpcikKKwkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcikKIHsKIAlpbnQgcmVzID0gMDsKIAlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7CkBAIC02NTIsNyArNjUyLDcgQEAKIAl0YXNrLT5hdGFfdGFzay5maXMuZGV2aWNlID0gZDJoX2Zpcy0+ZGV2aWNlOwogCXRhc2stPmF0YV90YXNrLnJldHJ5X2NvdW50ID0gMTsKIAotCXJlcyA9IHNhc19leGVjdXRlX3Rhc2sodGFzaywgYnVmZmVyLCBzaXplLCBwY2lfZG1hX2Rpcik7CisJcmVzID0gc2FzX2V4ZWN1dGVfdGFzayh0YXNrLCBidWZmZXIsIHNpemUsIGRtYV9kaXIpOwogCiAJc2FzX2ZyZWVfdGFzayh0YXNrKTsKIG91dDoKQEAgLTcwNyw3ICs3MDcsNyBAQAogCX0KIAogCXJlcyA9IHNhc19pc3N1ZV9hdGFfY21kKGRldiwgY29tbWFuZCwgMCwgaWRlbnRpZnlfeCwgNTEyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJRE1BX0ZST01fREVWSUNFKTsKIAlpZiAocmVzKQogCQlnb3RvIG91dF9lcnI7CiAKQEAgLTcyMCwxMyArNzIwLDEzIEBACiAJCQlnb3RvIGNvbnQxOwogCQlyZXMgPSBzYXNfaXNzdWVfYXRhX2NtZChkZXYsIEFUQV9TRVRfRkVBVFVSRVMsCiAJCQkJCUFUQV9GRUFUVVJFX1BVUF9TVEJZX1NQSU5fVVAsCi0JCQkJCU5VTEwsIDAsIFBDSV9ETUFfTk9ORSk7CisJCQkJCU5VTEwsIDAsIERNQV9OT05FKTsKIAkJaWYgKHJlcykKIAkJCWdvdG8gY29udDE7CiAKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDUqSFopOyAvKiBNb3JlIHRpbWU/ICovCiAJCXJlcyA9IHNhc19pc3N1ZV9hdGFfY21kKGRldiwgY29tbWFuZCwgMCwgaWRlbnRpZnlfeCwgNTEyLAotCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCQlETUFfRlJPTV9ERVZJQ0UpOwogCQlpZiAocmVzKQogCQkJZ290byBvdXRfZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCmluZGV4IDZhYzlmNjEuLjdlZjBhZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYwpAQCAtMjIsNyArMjIsNiBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgpAQCAtMTcwLDcgKzE2OSw3IEBACiAJCWlmIChyZXMpIHsKIAkJCXByaW50aygic2FzOiBkcml2ZXIgb24gcGNpZGV2ICVzIGNhbm5vdCBoYW5kbGUgIgogCQkJICAgICAgICJkZXZpY2UgJWxseCwgZXJyb3I6JWRcbiIsCi0JCQkgICAgICAgcGNpX25hbWUoc2FzX2hhLT5wY2lkZXYpLAorCQkJICAgICAgIHNhc19oYS0+ZGV2LT5idXNfaWQsCiAJCQkgICAgICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksIHJlcyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kdW1wLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kdW1wLmMKaW5kZXggZjEyNDZkMi4uYmYzNGEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZHVtcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2R1bXAuYwpAQCAtNTYsNyArNTYsNyBAQAogCiB2b2lkIHNhc19kcHJpbnRfaGFlKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEsIGVudW0gaGFfZXZlbnQgaGUpCiB7Ci0JU0FTX0RQUklOVEsoImhhICVzOiAlcyBldmVudFxuIiwgcGNpX25hbWUoc2FzX2hhLT5wY2lkZXYpLAorCVNBU19EUFJJTlRLKCJoYSAlczogJXMgZXZlbnRcbiIsIHNhc19oYS0+ZGV2LT5idXNfaWQsCiAJCSAgICBzYXNfaGFlX3N0cltoZV0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwppbmRleCBiNTAwZjBjLi44NzI3NDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKQEAgLTUwNywxNCArNTA3LDIxIEBACiBpbnQgc2FzX3NtcF9nZXRfcGh5X2V2ZW50cyhzdHJ1Y3Qgc2FzX3BoeSAqcGh5KQogewogCWludCByZXM7CisJdTggKnJlcTsKKwl1OCAqcmVzcDsKIAlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkgPSBkZXZfdG9fcnBoeShwaHktPmRldi5wYXJlbnQpOwogCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzYXNfZmluZF9kZXZfYnlfcnBoeShycGh5KTsKLQl1OCAqcmVxID0gYWxsb2Nfc21wX3JlcShSUEVMX1JFUV9TSVpFKTsKLQl1OCAqcmVzcCA9IGt6YWxsb2MoUlBFTF9SRVNQX1NJWkUsIEdGUF9LRVJORUwpOwogCi0JaWYgKCFyZXNwKQorCXJlcSA9IGFsbG9jX3NtcF9yZXEoUlBFTF9SRVFfU0laRSk7CisJaWYgKCFyZXEpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcmVzcCA9IGFsbG9jX3NtcF9yZXNwKFJQRUxfUkVTUF9TSVpFKTsKKwlpZiAoIXJlc3ApIHsKKwkJa2ZyZWUocmVxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmVxWzFdID0gU01QX1JFUE9SVF9QSFlfRVJSX0xPRzsKIAlyZXFbOV0gPSBwaHktPm51bWJlcjsKIApAQCAtMTg3OSw3ICsxODg2LDcgQEAKIAkJICAgIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldjsKLQlpbnQgcmV0LCB0eXBlID0gcnBoeS0+aWRlbnRpZnkuZGV2aWNlX3R5cGU7CisJaW50IHJldCwgdHlwZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnNwID0gcmVxLT5uZXh0X3JxOwogCiAJaWYgKCFyc3ApIHsKQEAgLTE4ODgsMTIgKzE4OTUsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogc2VlbXMgYWljOTR4eCBkb2Vzbid0IHN1cHBvcnQgKi8KKwkvKiBubyBycGh5IG1lYW5zIG5vIHNtcCB0YXJnZXQgc3VwcG9ydCAoaWUgYWljOTR4eCBob3N0KSAqLwogCWlmICghcnBoeSkgewogCQlwcmludGsoIiVzOiBjYW4gd2Ugc2VuZCBhIHNtcCByZXF1ZXN0IHRvIGEgaG9zdD9cbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJdHlwZSA9IHJwaHktPmlkZW50aWZ5LmRldmljZV90eXBlOwogCiAJaWYgKHR5cGUgIT0gU0FTX0VER0VfRVhQQU5ERVJfREVWSUNFICYmCiAJICAgIHR5cGUgIT0gU0FTX0ZBTk9VVF9FWFBBTkRFUl9ERVZJQ0UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IDE2MTJmOTIuLjBmMmE5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtOTEsMTggKzkxLDIwIEBACiB7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlzaXplID0gaGEtPm52cmFtX3NpemU7CisJY2hhcgkJKm52cmFtX2NhY2hlID0gaGEtPm52cmFtOwogCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG9mZiAhPSAwKQorCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBvZmYgPiBzaXplIHx8IGNvdW50ID09IDApCiAJCXJldHVybiAwOworCWlmIChvZmYgKyBjb3VudCA+IHNpemUpIHsKKwkJc2l6ZSAtPSBvZmY7CisJCWNvdW50ID0gc2l6ZTsKKwl9CiAKLQkvKiBSZWFkIE5WUkFNLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKGhhLCAodWludDhfdCAqKWJ1ZiwgaGEtPm52cmFtX2Jhc2UsCi0JICAgIGhhLT5udnJhbV9zaXplKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCS8qIFJlYWQgTlZSQU0gZGF0YSBmcm9tIGNhY2hlLiAqLworCW1lbWNweShidWYsICZudnJhbV9jYWNoZVtvZmZdLCBjb3VudCk7CiAKLQlyZXR1cm4gaGEtPm52cmFtX3NpemU7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMTQ0LDYgKzE0Niw4IEBACiAJLyogV3JpdGUgTlZSQU0uICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJaGEtPmlzcF9vcHMtPndyaXRlX252cmFtKGhhLCAodWludDhfdCAqKWJ1ZiwgaGEtPm52cmFtX2Jhc2UsIGNvdW50KTsKKwloYS0+aXNwX29wcy0+cmVhZF9udnJhbShoYSwgKHVpbnQ4X3QgKikmaGEtPm52cmFtLCBoYS0+bnZyYW1fYmFzZSwKKwkgICAgY291bnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTI5OCwxOCArMzAyLDIwIEBACiB7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhID0gdG9fcWxhX2hvc3QoZGV2X3RvX3Nob3N0KGNvbnRhaW5lcl9vZihrb2JqLAogCSAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICAgICAgICBzaXplID0gaGEtPnZwZF9zaXplOworCWNoYXIgICAgICAgICAgKnZwZF9jYWNoZSA9IGhhLT52cGQ7CiAKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDApCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IG9mZiA+IHNpemUgfHwgY291bnQgPT0gMCkKIAkJcmV0dXJuIDA7CisJaWYgKG9mZiArIGNvdW50ID4gc2l6ZSkgeworCQlzaXplIC09IG9mZjsKKwkJY291bnQgPSBzaXplOworCX0KIAotCS8qIFJlYWQgTlZSQU0uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JaGEtPmlzcF9vcHMtPnJlYWRfbnZyYW0oaGEsICh1aW50OF90ICopYnVmLCBoYS0+dnBkX2Jhc2UsCi0JICAgIGhhLT52cGRfc2l6ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkvKiBSZWFkIE5WUkFNIGRhdGEgZnJvbSBjYWNoZS4gKi8KKwltZW1jcHkoYnVmLCAmdnBkX2NhY2hlW29mZl0sIGNvdW50KTsKIAotCXJldHVybiBoYS0+dnBkX3NpemU7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMzI3LDYgKzMzMyw3IEBACiAJLyogV3JpdGUgTlZSQU0uICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJaGEtPmlzcF9vcHMtPndyaXRlX252cmFtKGhhLCAodWludDhfdCAqKWJ1ZiwgaGEtPnZwZF9iYXNlLCBjb3VudCk7CisJaGEtPmlzcF9vcHMtPnJlYWRfbnZyYW0oaGEsICh1aW50OF90ICopaGEtPnZwZCwgaGEtPnZwZF9iYXNlLCBjb3VudCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCAwYzlmMzZjLi4yN2FlM2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0yMzQwLDEwICsyMzQwLDE0IEBACiAJdWludDhfdAkJc2VyaWFsMjsKIAogCS8qIE5WUkFNIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworI2RlZmluZSBNQVhfTlZSQU1fU0laRQk0MDk2CisjZGVmaW5lIFZQRF9PRkZTRVQJTUFYX05WUkFNX1NJWkUgLyAyCiAJdWludDE2X3QJbnZyYW1fc2l6ZTsKIAl1aW50MTZfdAludnJhbV9iYXNlOworCXZvaWQJCSpudnJhbTsKIAl1aW50MTZfdAl2cGRfc2l6ZTsKIAl1aW50MTZfdAl2cGRfYmFzZTsKKwl2b2lkCQkqdnBkOwogCiAJdWludDE2X3QJbG9vcF9yZXNldF9kZWxheTsKIAl1aW50OF90CQlyZXRyeV9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDVlYzc5OGMuLjM3NGFiZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtMTQ2MSw4ICsxNDYxLDggQEAKIAl1aW50MTZfdCAgICAgICAgY250OwogCXVpbnQ4X3QgICAgICAgICAqZHB0cjEsICpkcHRyMjsKIAlpbml0X2NiX3QgICAgICAgKmljYiA9IGhhLT5pbml0X2NiOwotCW52cmFtX3QgICAgICAgICAqbnYgPSAobnZyYW1fdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7Ci0JdWludDhfdCAgICAgICAgICpwdHIgPSAodWludDhfdCAqKWhhLT5yZXF1ZXN0X3Jpbmc7CisJbnZyYW1fdCAgICAgICAgICpudiA9IGhhLT5udnJhbTsKKwl1aW50OF90ICAgICAgICAgKnB0ciA9IGhhLT5udnJhbTsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CkBAIC0xNDgwLDggKzE0ODAsNyBAQAogCQljaGtzdW0gKz0gKnB0cisrOwogCiAJREVCVUc1KHByaW50aygic2NzaSglbGQpOiBDb250ZW50cyBvZiBOVlJBTVxuIiwgaGEtPmhvc3Rfbm8pKTsKLQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWhhLT5yZXF1ZXN0X3JpbmcsCi0JICAgIGhhLT5udnJhbV9zaXplKSk7CisJREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpKTsKIAogCS8qIEJhZCBOVlJBTSBkYXRhLCBzZXQgZGVmYXVsdHMgcGFyYW1ldGVycy4gKi8KIAlpZiAoY2hrc3VtIHx8IG52LT5pZFswXSAhPSAnSScgfHwgbnYtPmlkWzFdICE9ICdTJyB8fApAQCAtMzUwMCw3ICszNDk5LDcgQEAKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlpY2IgPSAoc3RydWN0IGluaXRfY2JfMjR4eCAqKWhhLT5pbml0X2NiOwotCW52ID0gKHN0cnVjdCBudnJhbV8yNHh4ICopaGEtPnJlcXVlc3RfcmluZzsKKwludiA9IGhhLT5udnJhbTsKIAogCS8qIERldGVybWluZSBOVlJBTSBzdGFydGluZyBhZGRyZXNzLiAqLwogCWhhLT5udnJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBudnJhbV8yNHh4KTsKQEAgLTM1MTIsNyArMzUxMSwxMiBAQAogCQloYS0+dnBkX2Jhc2UgPSBGQV9OVlJBTV9WUEQxX0FERFI7CiAJfQogCi0JLyogR2V0IE5WUkFNIGRhdGEgYW5kIGNhbGN1bGF0ZSBjaGVja3N1bS4gKi8KKwkvKiBHZXQgVlBEIGRhdGEgaW50byBjYWNoZSAqLworCWhhLT52cGQgPSBoYS0+bnZyYW0gKyBWUERfT0ZGU0VUOworCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKGhhLCAodWludDhfdCAqKWhhLT52cGQsCisJICAgIGhhLT5udnJhbV9iYXNlIC0gRkFfTlZSQU1fRlVOQzBfQUREUiwgRkFfTlZSQU1fVlBEX1NJWkUgKiA0KTsKKworCS8qIEdldCBOVlJBTSBkYXRhIGludG8gY2FjaGUgYW5kIGNhbGN1bGF0ZSBjaGVja3N1bS4gKi8KIAlkcHRyID0gKHVpbnQzMl90ICopbnY7CiAJaGEtPmlzcF9vcHMtPnJlYWRfbnZyYW0oaGEsICh1aW50OF90ICopZHB0ciwgaGEtPm52cmFtX2Jhc2UsCiAJICAgIGhhLT5udnJhbV9zaXplKTsKQEAgLTM1MjAsOCArMzUyNCw3IEBACiAJCWNoa3N1bSArPSBsZTMyX3RvX2NwdSgqZHB0cisrKTsKIAogCURFQlVHNShwcmludGsoInNjc2koJWxkKTogQ29udGVudHMgb2YgTlZSQU1cbiIsIGhhLT5ob3N0X25vKSk7Ci0JREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiloYS0+cmVxdWVzdF9yaW5nLAotCSAgICBoYS0+bnZyYW1fc2l6ZSkpOworCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKSk7CiAKIAkvKiBCYWQgTlZSQU0gZGF0YSwgc2V0IGRlZmF1bHRzIHBhcmFtZXRlcnMuICovCiAJaWYgKGNoa3N1bSB8fCBudi0+aWRbMF0gIT0gJ0knIHx8IG52LT5pZFsxXSAhPSAnUycgfHwgbnYtPmlkWzJdICE9ICdQJwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IGI4ZjIyNmEuLjUwNTM5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTEwNjgsNyArMTA2OCw3IEBACiAJCQkgKiB2YWx1ZXMuCiAJCQkgKi8KIAkJCWlmIChyZXNpZCAmJgotCQkJICAgICgodW5zaWduZWQpKGNwLT5yZXF1ZXN0X2J1ZmZsZW4gLSByZXNpZCkgPAorCQkJICAgICgodW5zaWduZWQpKHNjc2lfYnVmZmxlbihjcCkgLSByZXNpZCkgPAogCQkJICAgICBjcC0+dW5kZXJmbG93KSkgewogCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCQkJICAgICJzY3NpKCVsZDolZDolZDolZCk6IE1pZC1sYXllciB1bmRlcmZsb3cgIgpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKIAkJCQkgICAgImVycm9yIHN0YXR1cy5cbiIsIGhhLT5ob3N0X25vLAogCQkJCSAgICBjcC0+ZGV2aWNlLT5jaGFubmVsLCBjcC0+ZGV2aWNlLT5pZCwKIAkJCQkgICAgY3AtPmRldmljZS0+bHVuLCByZXNpZCwKLQkJCQkgICAgY3AtPnJlcXVlc3RfYnVmZmxlbikpOworCQkJCSAgICBzY3NpX2J1ZmZsZW4oY3ApKSk7CiAKIAkJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgbHNjc2lfc3RhdHVzOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCmluZGV4IDE5YzQ0ZjAuLmUyZWE3MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKQEAgLTE1NCw2ICsxNTQsOSBAQAogCXsiRU1DIiwgICJJbnZpc3RhIiwgIioiLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9MQVJHRUxVTn0sCiAJeyJFTUMiLCAiU1lNTUVUUklYIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU4gfCBCTElTVF9GT1JDRUxVTn0sCiAJeyJFTVVMRVgiLCAiTUQyMS9TMiAgICAgRVNESSIsIE5VTEwsIEJMSVNUX1NJTkdMRUxVTn0sCisJeyJlYXN5UkFJRCIsICIxNlAiLCBOVUxMLCBCTElTVF9OT1JFUE9SVExVTn0sCisJeyJlYXN5UkFJRCIsICJYNlAiLCBOVUxMLCBCTElTVF9OT1JFUE9SVExVTn0sCisJeyJlYXN5UkFJRCIsICJGOCIsIE5VTEwsIEJMSVNUX05PUkVQT1JUTFVOfSwKIAl7IkZTQyIsICJDZW50cmljU3RvciIsICIqIiwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfTEFSR0VMVU59LAogCXsiR2VuZXJpYyIsICJVU0IgU0QgUmVhZGVyIiwgIjEuMDAiLCBCTElTVF9GT1JDRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAogCXsiR2VuZXJpYyIsICJVU0IgU3RvcmFnZS1TTUMiLCAiMDE4MCIsIEJMSVNUX0ZPUkNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IGRhNjNjNTQuLjIxYzA3NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC02NTQsNyArNjU0LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2VuZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHVwdG9kYXRlLAogCQkJCQkgIGludCBieXRlcywgaW50IHJlcXVldWUpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gY21kLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjbWQtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gY21kLT5yZXF1ZXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTgxOCw3ICs4MTgsNyBAQAogewogCWludCByZXN1bHQgPSBjbWQtPnJlc3VsdDsKIAlpbnQgdGhpc19jb3VudCA9IGNtZC0+cmVxdWVzdF9idWZmbGVuOwotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNtZC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gY21kLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CiAJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKIAlpbnQgY2xlYXJfZXJyb3JzID0gMTsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogCXJldHVybiBCTEtQUkVQX0tJTEw7CiB9CiAKLXN0YXRpYyBpbnQgc2NzaV9pc3N1ZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAorc3RhdGljIGludCBzY3NpX2lzc3VlX2ZsdXNoX2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKIAkJCSAgICAgICBzZWN0b3JfdCAqZXJyb3Jfc2VjdG9yKQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKQEAgLTEzNDAsNyArMTM0MCw3IEBACiAvKgogICogS2lsbCBhIHJlcXVlc3QgZm9yIGEgZGVhZCBkZXZpY2UKICAqLwotc3RhdGljIHZvaWQgc2NzaV9raWxsX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgcmVxdWVzdF9xdWV1ZV90ICpxKQorc3RhdGljIHZvaWQgc2NzaV9raWxsX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcmVxLT5zcGVjaWFsOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGNtZC0+ZGV2aWNlOwpAQCAtMjExOSw3ICsyMTE5LDcgQEAKIGludAogc2NzaV9pbnRlcm5hbF9kZXZpY2VfYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHNkZXYtPnJlcXVlc3RfcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IDA7CiAKQEAgLTIxNTksNyArMjE1OSw3IEBACiBpbnQKIHNjc2lfaW50ZXJuYWxfZGV2aWNlX3VuYmxvY2soc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IHNkZXYtPnJlcXVlc3RfcXVldWU7IAorCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2Rldi0+cmVxdWVzdF9xdWV1ZTsgCiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA0MjRkNTU3Li5lMjFjNzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtODE0LDcgKzgxNCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgc2RfcHJlcGFyZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3N0YXRpYyB2b2lkIHNkX3ByZXBhcmVfZmx1c2goc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKIAlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKQEAgLTEyODUsNyArMTI4NSw3IEBACiAJCSAqLwogCQlpbnQgaGFyZF9zZWN0b3IgPSBzZWN0b3Jfc2l6ZTsKIAkJc2VjdG9yX3Qgc3ogPSAoc2RrcC0+Y2FwYWNpdHkvMikgKiAoaGFyZF9zZWN0b3IvMjU2KTsKLQkJcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZSA9IHNkcC0+cmVxdWVzdF9xdWV1ZTsKKwkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlID0gc2RwLT5yZXF1ZXN0X3F1ZXVlOwogCQlzZWN0b3JfdCBtYiA9IHN6OwogCiAJCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHF1ZXVlLCBoYXJkX3NlY3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuYyBiL2RyaXZlcnMvc2NzaS9zci5jCmluZGV4IGU3YjZhN2YuLjkwMmViMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zci5jCkBAIC02MjQsNyArNjI0LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJaW50IHRoZV9yZXN1bHQsIHJldHJpZXMgPSAzOwogCWludCBzZWN0b3Jfc2l6ZTsKLQlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIAogCWJ1ZmZlciA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5jCmluZGV4IDE1YTUxNDUuLjNkYjIyMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1fZ2x1ZS5jCkBAIC0yMDMzLDcgKzIwMzMsNyBAQAogCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzg3NSwKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAogCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzE1MTAsCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwgLyogbmV3ICovCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAgUENJX0NMQVNTX1NUT1JBR0VfU0NTSTw8OCwgIDB4ZmZmZjAwLCAwVUwgfSwgLyogbmV3ICovCiAJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfNTNDODk1QSwKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAogCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzg3NUEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwppbmRleCBjYWQ0MjZjLi5hYWQ0MDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX2xlZ2FjeS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKQEAgLTQwMSw5ICs0MDAsOSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlKQorc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG02OGtfc2VyaWFsCSppbmZvID0gKHN0cnVjdCBtNjhrX3NlcmlhbCAqKSBwcml2YXRlOworCXN0cnVjdCBtNjhrX3NlcmlhbAkqaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbTY4a19zZXJpYWwsIHRxdWV1ZSk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAkKIAl0dHkgPSBpbmZvLT50dHk7CkBAIC00MjUsOSArNDI0LDkgQEAKICAqIAlkb19zZXJpYWxfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiByc19oYW5ndXAoKQogICogCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3NlcmlhbF9oYW5ndXAodm9pZCAqcHJpdmF0ZSkKK3N0YXRpYyB2b2lkIGRvX3NlcmlhbF9oYW5ndXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBtNjhrX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbTY4a19zZXJpYWwgKikgcHJpdmF0ZTsKKwlzdHJ1Y3QgbTY4a19zZXJpYWwJKmluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG02OGtfc2VyaWFsLCB0cXVldWVfaGFuZ3VwKTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCQogCXR0eSA9IGluZm8tPnR0eTsKQEAgLTEzMjQsNTkgKzEzMjMsNiBAQAogCXByaW50aygiTUM2ODMyOCBzZXJpYWwgZHJpdmVyIHZlcnNpb24gMS4wMFxuIik7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1fTEVHQUNZCi0vKiBTZXJpYWwgUG93ZXIgbWFuYWdlbWVudAotICogIFRoZSBjb25zb2xlIChjdXJyZW50bHkgZml4ZWQgYXQgbGluZSAwKSBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgcG93ZXIKLSAqICBtYW5hZ2VtZW50IGJlY2F1c2UgdGhlIGtlcm5lbCBpcyBzbyBjaGF0dHkuIFRoZSBjb25zb2xlIHdpbGwgYmUgCi0gKiAgZXhwbGljaXRseSBkaXNhYmxlZCBteSBvdXIgcG93ZXIgbWFuYWdlciBhcyB0aGUgbGFzdCBtaW51dGUsIHNvIHdlIHdvbid0Ci0gKiAgbWVzcyB3aXRoIGl0IGhlcmUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcG1fZGV2ICpzZXJpYWxfcG1bTlJfUE9SVFNdOwotCi1zdGF0aWMgaW50IHNlcmlhbF9wbV9jYWxsYmFjayhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCByZXF1ZXN0LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtNjhrX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbTY4a19zZXJpYWwgKilkZXYtPmRhdGE7Ci0KLQlpZihpbmZvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCS8qIHNwZWNpYWwgY2FzZSBmb3IgbGluZSAwIC0gcG0gcmVzdG9yZXMgaXQgKi8KLQlpZihpbmZvLT5saW5lID09IDApCi0JCXJldHVybiAwOyAKLQotCXN3aXRjaCAocmVxdWVzdCkgewotCWNhc2UgUE1fU1VTUEVORDoKLQkJc2h1dGRvd24oaW5mbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQTV9SRVNVTUU6Ci0JCXN0YXJ0dXAoaW5mbyk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBzaHV0ZG93bl9jb25zb2xlKHZvaWQpCi17Ci0Jc3RydWN0IG02OGtfc2VyaWFsICppbmZvID0gJm02OGtfc29mdFswXTsKLQotCS8qIEhBQ0s6IHdhaXQgYSBiaXQgZm9yIGFueSBwZW5kaW5nIHByaW50aydzIHRvIGJlIGR1bXBlZCAqLwotCXsKLQkJaW50IGkgPSAxMDAwMDsKLQkJd2hpbGUoaS0tKTsKLQl9Ci0KLQlzaHV0ZG93bihpbmZvKTsKLX0KLQotdm9pZCBzdGFydHVwX2NvbnNvbGUodm9pZCkKLXsKLQlzdHJ1Y3QgbTY4a19zZXJpYWwgKmluZm8gPSAmbTY4a19zb2Z0WzBdOwotCXN0YXJ0dXAoaW5mbyk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNX0xFR0FDWSAqLwotCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgcnNfb3BzID0gewogCS5vcGVuID0gcnNfb3BlbiwKIAkuY2xvc2UgPSByc19jbG9zZSwKQEAgLTE0NDQsOCArMTM5MCw4IEBACiAJICAgIGluZm8tPmV2ZW50ID0gMDsKIAkgICAgaW5mby0+Y291bnQgPSAwOwogCSAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOwotCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7Ci0JICAgIElOSVRfV09SSygmaW5mby0+dHF1ZXVlX2hhbmd1cCwgZG9fc2VyaWFsX2hhbmd1cCwgaW5mbyk7CisJICAgIElOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50KTsKKwkgICAgSU5JVF9XT1JLKCZpbmZvLT50cXVldWVfaGFuZ3VwLCBkb19zZXJpYWxfaGFuZ3VwKTsKIAkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKIAkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CiAJICAgIGluZm8tPmxpbmUgPSBpOwpAQCAtMTQ2NywxMSArMTQxMyw2IEBACiAJCQkgICAgSVJRX0ZMR19TVEQsCiAJCQkgICAgIk02ODMyOF9VQVJUIiwgTlVMTCkpCiAgICAgICAgICAgICAgICAgcGFuaWMoIlVuYWJsZSB0byBhdHRhY2ggNjgzMjggc2VyaWFsIGludGVycnVwdFxuIik7Ci0jaWZkZWYgQ09ORklHX1BNX0xFR0FDWQotCSAgICBzZXJpYWxfcG1baV0gPSBwbV9yZWdpc3RlcihQTV9TWVNfREVWLCBQTV9TWVNfQ09NLCBzZXJpYWxfcG1fY2FsbGJhY2spOwotCSAgICBpZiAoc2VyaWFsX3BtW2ldKQotCQkgICAgc2VyaWFsX3BtW2ldLT5kYXRhID0gaW5mbzsKLSNlbmRpZgogCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggMGIzZWMzOC4uMmY1YTVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMjY1MCw4ICsyNjUwLDkgQEAKIAkJcmV0ID0gc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHBvcnQgYXQgaW5kZXggJWQgIgotCQkJCSIoSU8lbHggTUVNJWx4IElSUSVkKTogJWRcbiIsIGksCi0JCQkJcC0+aW9iYXNlLCBwLT5tYXBiYXNlLCBwLT5pcnEsIHJldCk7CisJCQkJIihJTyVseCBNRU0lbGx4IElSUSVkKTogJWRcbiIsIGksCisJCQkJcC0+aW9iYXNlLCAodW5zaWduZWQgbG9uZyBsb25nKXAtPm1hcGJhc2UsCisJCQkJcC0+aXJxLCByZXQpOwogCQl9CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jCmluZGV4IDk0N2MyMDUuLjE1MGNhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMKQEAgLTE1MSw4ICsxNTEsOSBAQAogI2Vsc2UKIAkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgNjQpOwogCQlpZiAoIXBvcnQtPm1lbWJhc2UpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkbid0IGlvcmVtYXAgMHglbHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBwb3J0LT5tYXBiYXNlKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkbid0IGlvcmVtYXAgMHglbGx4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvcnQtPm1hcGJhc2UpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KICNlbmRpZgpAQCAtMTc1LDkgKzE3NiwxMCBAQAogCQkJZGV2aWNlLT5iYXVkKTsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJFYXJseSBzZXJpYWwgY29uc29sZSBhdCAlcyAweCVseCAob3B0aW9ucyAnJXMnKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJFYXJseSBzZXJpYWwgY29uc29sZSBhdCAlcyAweCVsbHggKG9wdGlvbnMgJyVzJylcbiIsCiAJCW1taW8gPyAiTU1JTyIgOiAiSS9PIHBvcnQiLAotCQltbWlvID8gcG9ydC0+bWFwYmFzZSA6ICh1bnNpZ25lZCBsb25nKSBwb3J0LT5pb2Jhc2UsCisJCW1taW8gPyAodW5zaWduZWQgbG9uZyBsb25nKSBwb3J0LT5tYXBiYXNlCisJICAgICAgICAgICAgIDogKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9ydC0+aW9iYXNlLAogCQlkZXZpY2UtPm9wdGlvbnMpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggOWM1NzQ4Ni4uMDMwYTYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC02MjYsNyArNjI2LDcgQEAKIAl0bXAuaHViNgkgICAgPSBwb3J0LT5odWI2OwogCXRtcC5pb190eXBlICAgICAgICAgPSBwb3J0LT5pb3R5cGU7CiAJdG1wLmlvbWVtX3JlZ19zaGlmdCA9IHBvcnQtPnJlZ3NoaWZ0OwotCXRtcC5pb21lbV9iYXNlICAgICAgPSAodm9pZCAqKXBvcnQtPm1hcGJhc2U7CisJdG1wLmlvbWVtX2Jhc2UgICAgICA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcG9ydC0+bWFwYmFzZTsKIAogCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTY2NiwxMCArMTY2NiwxMSBAQAogCQlyZXR1cm4gMDsKIAogCW1taW8gPSBwb3J0LT5pb3R5cGUgPj0gVVBJT19NRU07Ci0JcmV0ID0gc3ByaW50ZihidWYsICIlZDogdWFydDolcyAlcyUwOGxYIGlycTolZCIsCisJcmV0ID0gc3ByaW50ZihidWYsICIlZDogdWFydDolcyAlcyUwOGxsWCBpcnE6JWQiLAogCQkJcG9ydC0+bGluZSwgdWFydF90eXBlKHBvcnQpLAogCQkJbW1pbyA/ICJtbWlvOjB4IiA6ICJwb3J0OiIsCi0JCQltbWlvID8gcG9ydC0+bWFwYmFzZSA6ICh1bnNpZ25lZCBsb25nKSBwb3J0LT5pb2Jhc2UsCisJCQltbWlvID8gKHVuc2lnbmVkIGxvbmcgbG9uZylwb3J0LT5tYXBiYXNlCisJCSAgICAgICAgICAgICA6ICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcnQtPmlvYmFzZSwKIAkJCXBvcnQtPmlycSk7CiAKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1VOS05PV04pIHsKQEAgLTIwNjksNyArMjA3MCw3IEBACiAJY2FzZSBVUElPX1RTSToKIAljYXNlIFVQSU9fRFdBUEI6CiAJCXNucHJpbnRmKGFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSwKLQkJCSAiTU1JTyAweCVseCIsIHBvcnQtPm1hcGJhc2UpOworCQkJICJNTUlPIDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9ydC0+bWFwYmFzZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXN0cmxjcHkoYWRkcmVzcywgIip1bmtub3duKiIsIHNpemVvZihhZGRyZXNzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCA3MDcxZmY4Li41Y2Y0ODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc3BpLmg+CisjaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9yZWdzLXNwaS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3NwaS5oPgogCiBzdHJ1Y3QgczNjMjR4eF9zcGkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQppbmRleCBiZWZmZjVmLi5hYzQ5YjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQpAQCAtNDgsNiArNDgsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9URVNUKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IpKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVVNTNzIwKQkrPSBtaXNjLworb2JqLSQoQ09ORklHX1VTQl9JT1dBUlJJT1IpCSs9IG1pc2MvCiAKIG9iai0kKENPTkZJR19VU0JfQVRNKQkJKz0gYXRtLwogb2JqLSQoQ09ORklHX1VTQl9TUEVFRFRPVUNIKQkrPSBhdG0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDI1ZjYzZjEuLmI2YmQwNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0xOCw5ICsxOCwxNyBAQAogI2luY2x1ZGUgImhjZC5oIgkvKiBmb3IgdXNiY29yZSBpbnRlcm5hbHMgKi8KICNpbmNsdWRlICJ1c2IuaCIKIAorc3RydWN0IGFwaV9jb250ZXh0IHsKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCWludAkJCXN0YXR1czsKK307CisKIHN0YXRpYyB2b2lkIHVzYl9hcGlfYmxvY2tpbmdfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JY29tcGxldGUoKHN0cnVjdCBjb21wbGV0aW9uICopdXJiLT5jb250ZXh0KTsKKwlzdHJ1Y3QgYXBpX2NvbnRleHQgKmN0eCA9IHVyYi0+Y29udGV4dDsKKworCWN0eC0+c3RhdHVzID0gdXJiLT5zdGF0dXM7CisJY29tcGxldGUoJmN0eC0+ZG9uZSk7CiB9CiAKIApAQCAtMzIsMjAgKzQwLDIxIEBACiAgKi8KIHN0YXRpYyBpbnQgdXNiX3N0YXJ0X3dhaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHRpbWVvdXQsIGludCAqYWN0dWFsX2xlbmd0aCkKIHsgCi0Jc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwlzdHJ1Y3QgYXBpX2NvbnRleHQgY3R4OwogCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwogCWludCByZXR2YWw7Ci0JaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JaW5pdF9jb21wbGV0aW9uKCZkb25lKTsgCQotCXVyYi0+Y29udGV4dCA9ICZkb25lOworCWluaXRfY29tcGxldGlvbigmY3R4LmRvbmUpOworCXVyYi0+Y29udGV4dCA9ICZjdHg7CiAJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9OT0lPKTsKIAlpZiAodW5saWtlbHkocmV0dmFsKSkKIAkJZ290byBvdXQ7CiAKIAlleHBpcmUgPSB0aW1lb3V0ID8gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkb25lLCBleHBpcmUpKSB7CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC5kb25lLCBleHBpcmUpKSB7CisJCXVzYl9raWxsX3VyYih1cmIpOworCQlyZXR2YWwgPSAoY3R4LnN0YXR1cyA9PSAtRU5PRU5UID8gLUVUSU1FRE9VVCA6IGN0eC5zdGF0dXMpOwogCiAJCWRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsCiAJCQkiJXMgdGltZWQgb3V0IG9uIGVwJWQlcyBsZW49JWQvJWRcbiIsCkBAIC01NCwxMSArNjMsOCBAQAogCQkJdXNiX3BpcGVpbih1cmItPnBpcGUpID8gImluIiA6ICJvdXQiLAogCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQotCQl1c2Jfa2lsbF91cmIodXJiKTsKLQkJcmV0dmFsID0gc3RhdHVzID09IC1FTk9FTlQgPyAtRVRJTUVET1VUIDogc3RhdHVzOwogCX0gZWxzZQotCQlyZXR2YWwgPSBzdGF0dXM7CisJCXJldHZhbCA9IGN0eC5zdGF0dXM7CiBvdXQ6CiAJaWYgKGFjdHVhbF9sZW5ndGgpCiAJCSphY3R1YWxfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwpAQCAtNDExLDE1ICs0MTcsMjIgQEAKIAkJICogU29tZSBzeXN0ZW1zIG5lZWQgdG8gcmV2ZXJ0IHRvIFBJTyB3aGVuIERNQSBpcyB0ZW1wb3JhcmlseQogCQkgKiB1bmF2YWlsYWJsZS4gIEZvciB0aGVpciBzYWtlcywgYm90aCB0cmFuc2Zlcl9idWZmZXIgYW5kCiAJCSAqIHRyYW5zZmVyX2RtYSBhcmUgc2V0IHdoZW4gcG9zc2libGUuICBIb3dldmVyIHRoaXMgY2FuIG9ubHkKLQkJICogd29yayBvbiBzeXN0ZW1zIHdpdGhvdXQgSElHSE1FTSwgc2luY2UgRE1BIGJ1ZmZlcnMgbG9jYXRlZAotCQkgKiBpbiBoaWdoIG1lbW9yeSBhcmUgbm90IGRpcmVjdGx5IGFkZHJlc3NhYmxlIGJ5IHRoZSBDUFUgZm9yCi0JCSAqIFBJTyAuLi4gc28gd2hlbiBISUdITUVNIGlzIGluIHVzZSwgdHJhbnNmZXJfYnVmZmVyIGlzIE5VTEwKKwkJICogd29yayBvbiBzeXN0ZW1zIHdpdGhvdXQ6CisJCSAqCisJCSAqICAtIEhJR0hNRU0sIHNpbmNlIERNQSBidWZmZXJzIGxvY2F0ZWQgaW4gaGlnaCBtZW1vcnkgYXJlCisJCSAqICAgIG5vdCBkaXJlY3RseSBhZGRyZXNzYWJsZSBieSB0aGUgQ1BVIGZvciBQSU87CisJCSAqCisJCSAqICAtIElPTU1VLCBzaW5jZSBkbWFfbWFwX3NnKCkgaXMgYWxsb3dlZCB0byB1c2UgYW4gSU9NTVUgdG8KKwkJICogICAgbWFrZSB2aXJ0dWFsbHkgZGlzY29udGlndW91cyBidWZmZXJzIGJlICJkbWEtY29udGlndW91cyIKKwkJICogICAgc28gdGhhdCBQSU8gYW5kIERNQSBuZWVkIGRpZmVyZW50IG51bWJlcnMgb2YgVVJCcy4KKwkJICoKKwkJICogU28gd2hlbiBISUdITUVNIG9yIElPTU1VIGFyZSBpbiB1c2UsIHRyYW5zZmVyX2J1ZmZlciBpcyBOVUxMCiAJCSAqIHRvIHByZXZlbnQgc3RhbGUgcG9pbnRlcnMgYW5kIHRvIGhlbHAgc3BvdCBidWdzLgogCQkgKi8KIAkJaWYgKGRtYSkgewogCQkJaW8tPnVyYnMgW2ldLT50cmFuc2Zlcl9kbWEgPSBzZ19kbWFfYWRkcmVzcyAoc2cgKyBpKTsKIAkJCWxlbiA9IHNnX2RtYV9sZW4gKHNnICsgaSk7Ci0jaWZkZWYgQ09ORklHX0hJR0hNRU0KKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNKSB8fCBkZWZpbmVkKENPTkZJR19JT01NVSkKIAkJCWlvLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwogI2Vsc2UKIAkJCWlvLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMKaW5kZXggYWEyMWIzOC4uYjc5MTdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3F1aXJrcy5jCkBAIC0zMCwxOCArMzAsNDAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfcXVpcmtfbGlzdFtdID0gewogCS8qIEhQIDUzMDAvNTM3MEMgc2Nhbm5lciAqLwogCXsgVVNCX0RFVklDRSgweDAzZjAsIDB4MDcwMSksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19TVFJJTkdfRkVUQ0hfMjU1IH0sCisJLyogQWNlciBQZXJpcGhlcmFscyBJbmMuIChub3cgQmVuUSBDb3JwLikgUHJpc2EgNjQwQlUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNGE1LCAweDIwN2UpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfTk9fQVVUT1NVU1BFTkQgfSwKIAkvKiBCZW5xIFMyVyAzMzAwVSAqLwogCXsgVVNCX0RFVklDRSgweDA0YTUsIDB4MjBiMCksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAorCS8qIENhbm9uLCBJbmMuIENhbm9TY2FuIE4xMjQwVS9MaURFMzAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNGE5LCAweDIyMGUpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfTk9fQVVUT1NVU1BFTkQgfSwKKwkvKiBDYW5vbiwgSW5jLiBDYW5vU2NhbiBONjUwVS9ONjU2VSAqLworCXsgVVNCX0RFVklDRSgweDA0YTksIDB4MjIwNiksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAorCS8qIENhbm9uLCBJbmMuIENhbm9TY2FuIDEyMjBVICovCisJeyBVU0JfREVWSUNFKDB4MDRhOSwgMHgyMjA3KSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0FVVE9TVVNQRU5EIH0sCisJLyogQ2Fub24sIEluYy4gQ2Fub1NjYW4gTjY3MFUvTjY3NlUvTGlERSAyMCAqLworCXsgVVNCX0RFVklDRSgweDA0YTksIDB4MjIwZCksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAorCS8qIG9sZCBDYW5ub24gc2Nhbm5lciAqLworCXsgVVNCX0RFVklDRSgweDA0YTksIDB4MjIyMCksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAogCS8qIFNlaWtvIEVwc29uIENvcnAuIFBlcmZlY3Rpb24gMTIwMCAqLwogCXsgVVNCX0RFVklDRSgweDA0YjgsIDB4MDEwNCksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAorCS8qIFNlaWtvIEVwc29uIENvcnAuIFBlcmZlY3Rpb24gNjYwICovCisJeyBVU0JfREVWSUNFKDB4MDRiOCwgMHgwMTE0KSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0FVVE9TVVNQRU5EIH0sCisJLyogRXBzb24gUGVyZmVjdGlvbiAxMjYwIFBob3RvICovCisJeyBVU0JfREVWSUNFKDB4MDRiOCwgMHgwMTFkKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0FVVE9TVVNQRU5EIH0sCiAJLyogU2Vpa28gRXBzb24gQ29ycCAtIFBlcmZlY3Rpb24gMTY3MCAqLwogCXsgVVNCX0RFVklDRSgweDA0YjgsIDB4MDExZiksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAorCS8qIEVQU09OIFBlcmZlY3Rpb24gMjQ4MCAqLworCXsgVVNCX0RFVklDRSgweDA0YjgsIDB4MDEyMSksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAorCS8qIFNlaWtvIEVwc29uIENvcnAuKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNGI4LCAweDAxMjIpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfTk9fQVVUT1NVU1BFTkQgfSwKIAkvKiBTYW1zdW5nIE1MLTI1MTAgU2VyaWVzIHByaW50ZXIgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNGU4LCAweDMyN2UpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfTk9fQVVUT1NVU1BFTkQgfSwKIAkvKiBFbHNhIE1pY3JvTGluayA1NmsgKFYuMjUwKSAqLwogCXsgVVNCX0RFVklDRSgweDA1Y2MsIDB4MjI2NyksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAogCS8qIFVsdGltYSBFbGVjdHJvbmljcyBDb3JwLiovCiAJeyBVU0JfREVWSUNFKDB4MDVkOCwgMHg0MDA1KSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0FVVE9TVVNQRU5EIH0sCisJLyogQWdmYSBTbmFwc2NhbjEyMTJ1ICovCisJeyBVU0JfREVWSUNFKDB4MDZiZCwgMHgyMDYxKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0FVVE9TVVNQRU5EIH0sCiAJLyogVW1heCBbaGV4XSBBc3RyYSAzNDAwVSAqLwogCXsgVVNCX0RFVklDRSgweDE2MDYsIDB4MDA2MCksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19OT19BVVRPU1VTUEVORCB9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnLmMKaW5kZXggZDE4OTAxYi4uYzY3NjBhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWcuYwpAQCAtNTAsNyArNTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGZpbGwgYnVmZmVyIGZyb20gc3JjW10gdW50aWwgbnVsbCBkZXNjcmlwdG9yIHB0ciAqLwotCWZvciAoOyAwICE9ICpzcmM7IHNyYysrKSB7CisJZm9yICg7IE5VTEwgIT0gKnNyYzsgc3JjKyspIHsKIAkJdW5zaWduZWQJCWxlbiA9ICgqc3JjKS0+Ykxlbmd0aDsKIAogCQlpZiAobGVuID4gYnVmbGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKaW5kZXggNjA0MjM2NC4uM2FhNDZjZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYwpAQCAtNzEsNyArNzEsNyBAQAogCXUxNgkJbWF4OwogCiAJLyogZW5kcG9pbnQgYWxyZWFkeSBjbGFpbWVkPyAqLwotCWlmICgwICE9IGVwLT5kcml2ZXJfZGF0YSkKKwlpZiAoTlVMTCAhPSBlcC0+ZHJpdmVyX2RhdGEpCiAJCXJldHVybiAwOwogCiAJLyogb25seSBzdXBwb3J0IGVwMCBmb3IgcG9ydGFibGUgQ09OVFJPTCB0cmFmZmljICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IGEzMzc2NzM5Li41OTNlMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtMTcyMyw3ICsxNzIzLDggQEAKIAkJc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBybmRpc19wYWNrZXRfbXNnX3R5cGUpOwogCXNpemUgLT0gc2l6ZSAlIGRldi0+b3V0X2VwLT5tYXhwYWNrZXQ7CiAKLQlpZiAoKHNrYiA9IGFsbG9jX3NrYiAoc2l6ZSArIE5FVF9JUF9BTElHTiwgZ2ZwX2ZsYWdzKSkgPT0gMCkgeworCXNrYiA9IGFsbG9jX3NrYihzaXplICsgTkVUX0lQX0FMSUdOLCBnZnBfZmxhZ3MpOworCWlmIChza2IgPT0gTlVMTCkgewogCQlERUJVRyAoZGV2LCAibm8gcnggc2tiXG4iKTsKIAkJZ290byBlbm9tZW07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCBlNjA3NDVmZi4uMTczMDA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKQEAgLTk2NCw3ICs5NjQsNyBAQAogCX0KIAlpZiAobGVuID4gc2l6ZW9mIChkZXYtPnJidWYpKQogCQlyZXEtPmJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAocmVxLT5idWYgPT0gMCkgeworCWlmIChyZXEtPmJ1ZiA9PSBOVUxMKSB7CiAJCXJlcS0+YnVmID0gZGV2LT5yYnVmOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzk0LDcgKzEzOTQsNyBAQAogCWRldi0+c2V0dXBfYWJvcnQgPSAwOwogCWlmIChkZXYtPnN0YXRlID09IFNUQVRFX0RFVl9VTkNPTk5FQ1RFRCkgewogI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX0RVQUxTUEVFRAotCQlpZiAoZ2FkZ2V0LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCAmJiBkZXYtPmhzX2NvbmZpZyA9PSAwKSB7CisJCWlmIChnYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIICYmIGRldi0+aHNfY29uZmlnID09IE5VTEwpIHsKIAkJCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOwogCQkJRVJST1IgKGRldiwgIm5vIGhpZ2ggc3BlZWQgY29uZmlnPz9cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYwppbmRleCA3MDBkZGE4Li40YjI3ZDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMKQEAgLTEyOTksNyArMTI5OSw3IEBACiAJcmVxLT5yZXEuYWN0dWFsID0gMDsKIAlyZXEtPnJlcS5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CiAKLQlpZiAoZXAtPmRlc2MgPT0gMCkJLyogY29udHJvbCAqLworCWlmIChlcC0+ZGVzYyA9PSBOVUxMKQkvKiBjb250cm9sICovCiAJCXN0YXJ0X2VwMChlcCwgcmVxKTsKIAllbHNlIHsKIAkJaWYgKHJlcXVlc3QgJiYgIWVwLT5idXN5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggNjNiOTUyMS4uNzJiNGViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC05Myw4ICs5Myw2IEBACiBzdGF0aWMgY29uc3QgY2hhciBlcDBuYW1lIFtdID0gImVwMCI7CiAKIAotLy8gI2RlZmluZQlESVNBQkxFX1RFU1RfTU9ERQotCiAjaWZkZWYgQ09ORklHX0FSQ0hfSVhQNFhYCiAKIC8qIGNwdS1zcGVjaWZpYyByZWdpc3RlciBhZGRyZXNzZXMgYXJlIGNvbXBpbGVkIGluIHRvIHRoaXMgY29kZSAqLwpAQCAtMTEzLDE3ICsxMTEsNiBAQAogI2RlZmluZSBTSVpFX1NUUgkiIgogI2VuZGlmCiAKLSNpZmRlZiBESVNBQkxFX1RFU1RfTU9ERQotLyogKG1vZGUgPT0gMCkgPT0gbm8gdW5kb2N1bWVudGVkIGNoaXAgdHdlYWtzCi0gKiAobW9kZSAmIDEpICA9PSBkb3VibGUgYnVmZmVyIGJ1bGsgSU4KLSAqIChtb2RlICYgMikgID09IGRvdWJsZSBidWZmZXIgYnVsayBPVVQKLSAqIC4uLiBzbyBtb2RlID0gMyAob3IgNywgMTUsIGV0YykgZG9lcyBpdCBmb3IgYm90aAotICovCi1zdGF0aWMgdXNob3J0IGZpZm9fbW9kZSA9IDA7Ci1tb2R1bGVfcGFyYW0oZmlmb19tb2RlLCB1c2hvcnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyAoZmlmb19tb2RlLCAicHhhMnh4IHVkYyBmaWZvIG1vZGUiKTsKLSNlbmRpZgotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCWVuZHBvaW50IHJlbGF0ZWQgcGFydHMgb2YgdGhlIGFwaSB0byB0aGUgdXNiIGNvbnRyb2xsZXIgaGFyZHdhcmUsCiAgKgl1c2VkIGJ5IGdhZGdldCBkcml2ZXI7IGFuZCB0aGUgaW5uZXIgdGFsa2VyLXRvLWhhcmR3YXJlIGNvcmUuCkBAIC0xMjUyLDIzICsxMjM5LDYgQEAKIAkJVURDX1JFUzIgPSAweDAwOwogCX0KIAotI2lmZGVmCURJU0FCTEVfVEVTVF9NT0RFCi0JLyogInRlc3QgbW9kZSIgc2VlbXMgdG8gaGF2ZSBiZWNvbWUgdGhlIGRlZmF1bHQgaW4gbGF0ZXIgY2hpcAotCSAqIHJldnMsIHByZXZlbnRpbmcgZG91YmxlIGJ1ZmZlcmluZyAoYW5kIGludmFsaWRhdGluZyBkb2NzKS4KLQkgKiB0aGlzIEVYUEVSSU1FTlQgZW5hYmxlcyBpdCBmb3IgYnVsayBlbmRwb2ludHMgYnkgdHdlYWtpbmcKLQkgKiB1bmRlZmluZWQvcmVzZXJ2ZWQgcmVnaXN0ZXIgYml0cyAodGhhdCBvdGhlciBkcml2ZXJzIGNsZWFyKS4KLQkgKiBCZWxjYXJyYSBjb2RlIGNvbW1lbnRzIG5vdGVkIHRoaXMgdXNhZ2UuCi0JICovCi0JaWYgKGZpZm9fbW9kZSAmIDEpIHsJLyogSU4gZW5kcG9pbnRzICovCi0JCVVEQ19SRVMxIHw9IFVTSVIwX0lSMXxVU0lSMF9JUjY7Ci0JCVVEQ19SRVMyIHw9IFVTSVIxX0lSMTE7Ci0JfQotCWlmIChmaWZvX21vZGUgJiAyKSB7CS8qIE9VVCBlbmRwb2ludHMgKi8KLQkJVURDX1JFUzEgfD0gVVNJUjBfSVIyfFVTSVIwX0lSNzsKLQkJVURDX1JFUzIgfD0gVVNJUjFfSVIxMjsKLQl9Ci0jZW5kaWYKLQogCS8qIGVuYWJsZSBzdXNwZW5kL3Jlc3VtZSBhbmQgcmVzZXQgaXJxcyAqLwogCXVkY19jbGVhcl9tYXNrX1VEQ0NSKFVEQ0NSX1NSTSB8IFVEQ0NSX1JFTSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCmluZGV4IGEyZTZlM2ZjLi5mY2ZlODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKQEAgLTY1Myw3ICs2NTMsOCBAQAogCQkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZSAoZXAsIGQpOwogCQkJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCQkJZXAtPmRyaXZlcl9kYXRhID0gZGV2OwotCQkJCWlmIChzb3VyY2Vfc2lua19zdGFydF9lcCAoZXAsIGdmcF9mbGFncykgIT0gMCkgeworCQkJCWlmIChzb3VyY2Vfc2lua19zdGFydF9lcChlcCwgZ2ZwX2ZsYWdzKQorCQkJCQkJIT0gTlVMTCkgewogCQkJCQlkZXYtPmluX2VwID0gZXA7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KQEAgLTY2Nyw3ICs2NjgsOCBAQAogCQkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZSAoZXAsIGQpOwogCQkJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCQkJZXAtPmRyaXZlcl9kYXRhID0gZGV2OwotCQkJCWlmIChzb3VyY2Vfc2lua19zdGFydF9lcCAoZXAsIGdmcF9mbGFncykgIT0gMCkgeworCQkJCWlmIChzb3VyY2Vfc2lua19zdGFydF9lcChlcCwgZ2ZwX2ZsYWdzKQorCQkJCQkJIT0gTlVMTCkgewogCQkJCQlkZXYtPm91dF9lcCA9IGVwOwogCQkJCQljb250aW51ZTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKaW5kZXggZTgzMWNiNy4uMzNmNmVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAotCWlmICgoIXBvcnQtPnR0eSkgfHwgKCFwb3J0LT50dHktPnRlcm1pb3MpKSB7CisJaWYgKCFwb3J0LT50dHkgfHwgIXBvcnQtPnR0eS0+dGVybWlvcykgewogCQlkYmcoIiVzIC0gbm8gdHR5IHN0cnVjdHVyZXMiLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CiAJfQpAQCAtNTI2LDUwICs1MjYsMzUgQEAKIAkJcmV0dXJuOwogCX0KIAljZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQotCS8qIENoZWNrIHRoYXQgdGhleSByZWFsbHkgd2FudCB1cyB0byBjaGFuZ2Ugc29tZXRoaW5nICovCi0JaWYgKG9sZF90ZXJtaW9zKSB7Ci0JCWlmICgoY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpICYmCi0JCQkJKFJFTEVWQU5UX0lGTEFHKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZykKLQkJCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7Ci0JCQlkYmcoIiVzIC0gbm90aGluZyB0byBjaGFuZ2UuLi4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJb2xkX2NmbGFnID0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWc7Ci0JfQorCW9sZF9jZmxhZyA9IG9sZF90ZXJtaW9zLT5jX2NmbGFnOworCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpOwogCiAJLyogSWYgdGhlIGJhdWQgcmF0ZSBpcyB0byBiZSB1cGRhdGVkKi8KLQlpZiAoKGNmbGFnICYgQ0JBVUQpICE9IChvbGRfY2ZsYWcgJiBDQkFVRCkpIHsKLQkJc3dpdGNoIChjZmxhZyAmIENCQVVEKSB7Ci0JCQkvKgotCQkJICogVGhlIGJhdWQgcmF0ZXMgd2hpY2ggYXJlIGNvbW1lbnRlZCBvdXQgYmVsb3cKLQkJCSAqIGFwcGVhciB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZQotCQkJICogYnV0IGFyZSBub24tc3RhbmRhcmQKLQkJCSAqLwotCQkJY2FzZSBCMDoJYmF1ZCA9IDA7CWJyZWFrOwotCQkJY2FzZSBCNjAwOgliYXVkID0gNjAwOwlicmVhazsKLQkJCWNhc2UgQjEyMDA6CWJhdWQgPSAxMjAwOwlicmVhazsKLQkJCWNhc2UgQjE4MDA6CWJhdWQgPSAxODAwOwlicmVhazsKLQkJCWNhc2UgQjI0MDA6CWJhdWQgPSAyNDAwOwlicmVhazsKLQkJCWNhc2UgQjQ4MDA6CWJhdWQgPSA0ODAwOwlicmVhazsKLQkJCS8qY2FzZSBCNzIwMDoJYmF1ZCA9IDcyMDA7CWJyZWFrOyovCi0JCQljYXNlIEI5NjAwOgliYXVkID0gOTYwMDsJYnJlYWs7Ci0JCQkvKmFzZSBCMTQ0MDA6CWJhdWQgPSAxNDQwMDsJYnJlYWs7Ki8KLQkJCWNhc2UgQjE5MjAwOgliYXVkID0gMTkyMDA7CWJyZWFrOwotCQkJLypjYXNlIEIyODgwMDoJYmF1ZCA9IDI4ODAwOwlicmVhazsqLwotCQkJY2FzZSBCMzg0MDA6CWJhdWQgPSAzODQwMDsJYnJlYWs7Ci0JCQkvKmNhc2UgQjU1ODU0OgliYXVkID0gNTUwNTQ7CWJyZWFrOyovCi0JCQljYXNlIEI1NzYwMDoJYmF1ZCA9IDU3NjAwOwlicmVhazsKLQkJCWNhc2UgQjExNTIwMDoJYmF1ZCA9IDExNTIwMDsJYnJlYWs7Ci0JCQkvKmNhc2UgQjEyNzExNzoJYmF1ZCA9IDEyNzExNzsJYnJlYWs7Ki8KLQkJCWNhc2UgQjIzMDQwMDoJYmF1ZCA9IDIzMDQwMDsJYnJlYWs7Ci0JCQljYXNlIEI0NjA4MDA6CWJhdWQgPSA0NjA4MDA7CWJyZWFrOwotCQkJY2FzZSBCOTIxNjAwOgliYXVkID0gOTIxNjAwOwlicmVhazsKLQkJCS8qY2FzZSBCMzY4NjQwMDoJYmF1ZCA9IDM2ODY0MDA7CWJyZWFrOyovCisJaWYgKGJhdWQgIT0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKG9sZF90ZXJtaW9zKSkgeworCQlzd2l0Y2ggKGJhdWQpIHsKKwkJCWNhc2UgMDoKKwkJCWNhc2UgNjAwOgorCQkJY2FzZSAxMjAwOgorCQkJY2FzZSAxODAwOgorCQkJY2FzZSAyNDAwOgorCQkJY2FzZSA0ODAwOgorCQkJY2FzZSA3MjAwOgorCQkJY2FzZSA5NjAwOgorCQkJY2FzZSAxNDQwMDoKKwkJCWNhc2UgMTkyMDA6CisJCQljYXNlIDI4ODAwOgorCQkJY2FzZSAzODQwMDoKKwkJCWNhc2UgNTU4NTQ6CisJCQljYXNlIDU3NjAwOgorCQkJY2FzZSAxMTUyMDA6CisJCQljYXNlIDEyNzExNzoKKwkJCWNhc2UgMjMwNDAwOgorCQkJY2FzZSA0NjA4MDA6CisJCQljYXNlIDkyMTYwMDoKKwkJCWNhc2UgMzY4NjQwMDoKKwkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiY3AyMTAxIGRyaXZlciBkb2VzIG5vdCAiCi0JCQkJCSJzdXBwb3J0IHRoZSBiYXVkcmF0ZSByZXF1ZXN0ZWRcbiIpOworCQkJCWJhdWQgPSA5NjAwOwogCQkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwppbmRleCA5NzZmNTRlLi5kYWIyZTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCkBAIC00MzMsMzggKzQzMywzOCBAQAogCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAotc3RhdGljIHZvaWQgZGlnaV93YWtldXBfd3JpdGUoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKTsKK3N0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgZGlnaV93YWtldXBfd3JpdGVfbG9jayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotc3RhdGljIGludCBkaWdpX3dyaXRlX29vYl9jb21tYW5kKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50LCBpbnQgaW50ZXJydXB0aWJsZSApOwotc3RhdGljIGludCBkaWdpX3dyaXRlX2luYl9jb21tYW5kKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgKTsKLXN0YXRpYyBpbnQgZGlnaV9zZXRfbW9kZW1fc2lnbmFscyggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQl1bnNpZ25lZCBpbnQgbW9kZW1fc2lnbmFscywgaW50IGludGVycnVwdGlibGUgKTsKLXN0YXRpYyBpbnQgZGlnaV90cmFuc21pdF9pZGxlKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCXVuc2lnbmVkIGxvbmcgdGltZW91dCApOworc3RhdGljIGludCBkaWdpX3dyaXRlX29vYl9jb21tYW5kKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQsIGludCBpbnRlcnJ1cHRpYmxlKTsKK3N0YXRpYyBpbnQgZGlnaV93cml0ZV9pbmJfY29tbWFuZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworc3RhdGljIGludCBkaWdpX3NldF9tb2RlbV9zaWduYWxzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgaW50IG1vZGVtX3NpZ25hbHMsIGludCBpbnRlcnJ1cHRpYmxlKTsKK3N0YXRpYyBpbnQgZGlnaV90cmFuc21pdF9pZGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIHN0YXRpYyB2b2lkIGRpZ2lfcnhfdGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgZGlnaV9yeF91bnRocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIGRpZ2lfc2V0X3Rlcm1pb3MoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIAotCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MgKTsKLXN0YXRpYyB2b2lkIGRpZ2lfYnJlYWtfY3RsKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUgKTsKLXN0YXRpYyBpbnQgZGlnaV9pb2N0bCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKLXN0YXRpYyBpbnQgZGlnaV90aW9jbWdldCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUgKTsKLXN0YXRpYyBpbnQgZGlnaV90aW9jbXNldCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyICk7Ci1zdGF0aWMgaW50IGRpZ2lfd3JpdGUoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50ICk7Ci1zdGF0aWMgdm9pZCBkaWdpX3dyaXRlX2J1bGtfY2FsbGJhY2soIHN0cnVjdCB1cmIgKnVyYiApOwotc3RhdGljIGludCBkaWdpX3dyaXRlX3Jvb20oIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKTsKLXN0YXRpYyBpbnQgZGlnaV9jaGFyc19pbl9idWZmZXIoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKTsKLXN0YXRpYyBpbnQgZGlnaV9vcGVuKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCApOwotc3RhdGljIHZvaWQgZGlnaV9jbG9zZSggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHAgKTsKLXN0YXRpYyBpbnQgZGlnaV9zdGFydHVwX2RldmljZSggc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCApOwotc3RhdGljIGludCBkaWdpX3N0YXJ0dXAoIHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgKTsKLXN0YXRpYyB2b2lkIGRpZ2lfc2h1dGRvd24oIHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgKTsKLXN0YXRpYyB2b2lkIGRpZ2lfcmVhZF9idWxrX2NhbGxiYWNrKCBzdHJ1Y3QgdXJiICp1cmIgKTsKLXN0YXRpYyBpbnQgZGlnaV9yZWFkX2luYl9jYWxsYmFjayggc3RydWN0IHVyYiAqdXJiICk7Ci1zdGF0aWMgaW50IGRpZ2lfcmVhZF9vb2JfY2FsbGJhY2soIHN0cnVjdCB1cmIgKnVyYiApOworc3RhdGljIHZvaWQgZGlnaV9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOworc3RhdGljIHZvaWQgZGlnaV9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKK3N0YXRpYyBpbnQgZGlnaV9pb2N0bChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGRpZ2lfdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBkaWdpX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CitzdGF0aWMgaW50IGRpZ2lfd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgZGlnaV93cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgaW50IGRpZ2lfd3JpdGVfcm9vbShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgZGlnaV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CitzdGF0aWMgaW50IGRpZ2lfb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBkaWdpX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBpbnQgZGlnaV9zdGFydHVwX2RldmljZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyBpbnQgZGlnaV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOworc3RhdGljIHZvaWQgZGlnaV9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyB2b2lkIGRpZ2lfcmVhZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgaW50IGRpZ2lfcmVhZF9pbmJfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyBpbnQgZGlnaV9yZWFkX29vYl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOwogCiAKIC8qIFN0YXRpY3MgKi8KQEAgLTU3Niw5ICs1NzYsOSBAQAogKiAgd2l0aCB0aGUgZXF1aXZhbGVudCBjb2RlLgogKi8KIAotc3RhdGljIGlubGluZSBsb25nIGNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKK3N0YXRpYyBsb25nIGNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKIAl3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgbG9uZyB0aW1lb3V0LAotCXNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQorCXNwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKQEAgLTYwMCwxOCArNjAwLDE2IEBACiAKIHN0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlX2xvY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRpZ2lfcG9ydCwgZHBfd2FrZXVwX3dvcmspOworCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRpZ2lfcG9ydCwgZHBfd2FrZXVwX3dvcmspOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBwcml2LT5kcF9wb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQotCXNwaW5fbG9ja19pcnFzYXZlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCWRpZ2lfd2FrZXVwX3dyaXRlKCBwb3J0ICk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJZGlnaV93YWtldXBfd3JpdGUocG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ICkKK3N0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJdHR5X3dha2V1cChwb3J0LT50dHkpOwogfQpAQCAtNjI4LDggKzYyNiw4IEBACiAqICByZXR1cm5lZCBieSB1c2Jfc3VibWl0X3VyYi4KICovCiAKLXN0YXRpYyBpbnQgZGlnaV93cml0ZV9vb2JfY29tbWFuZCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQl1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCwgaW50IGludGVycnVwdGlibGUgKQorc3RhdGljIGludCBkaWdpX3dyaXRlX29vYl9jb21tYW5kKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQsIGludCBpbnRlcnJ1cHRpYmxlKQogewogCiAJaW50IHJldCA9IDA7CkBAIC02MzgsNDkgKzYzNiwzNyBAQAogCXN0cnVjdCBkaWdpX3BvcnQgKm9vYl9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKG9vYl9wb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAorCWRiZygiZGlnaV93cml0ZV9vb2JfY29tbWFuZDogVE9QOiBwb3J0PSVkLCBjb3VudD0lZCIsIG9vYl9wcml2LT5kcF9wb3J0X251bSwgY291bnQpOwogCi1kYmcoICJkaWdpX3dyaXRlX29vYl9jb21tYW5kOiBUT1A6IHBvcnQ9JWQsIGNvdW50PSVkIiwgb29iX3ByaXYtPmRwX3BvcnRfbnVtLCBjb3VudCApOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCi0Jd2hpbGUoIGNvdW50ID4gMCApIHsKLQotCQl3aGlsZSggb29iX3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUwotCQl8fCBvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSApIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCXdoaWxlKGNvdW50ID4gMCkgeworCQl3aGlsZShvb2JfcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTCisJCQl8fCBvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgewogCQkJY29uZF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dF9pcnFyZXN0b3JlKAogCQkJCSZvb2JfcG9ydC0+d3JpdGVfd2FpdCwgRElHSV9SRVRSWV9USU1FT1VULAotCQkJCSZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCQkJaWYoIGludGVycnVwdGlibGUgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgKSB7Ci0JCQkJcmV0dXJuKCAtRUlOVFIgKTsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCAmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwkJCQkmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCQkJaWYgKGludGVycnVwdGlibGUgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJCX0KIAogCQkvKiBsZW4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQsIHNvIGNvbW1hbmRzIGFyZSBub3Qgc3BsaXQgKi8KLQkJbGVuID0gbWluKGNvdW50LCBvb2JfcG9ydC0+YnVsa19vdXRfc2l6ZSApOwotCQlpZiggbGVuID4gNCApCisJCWxlbiA9IG1pbihjb3VudCwgb29iX3BvcnQtPmJ1bGtfb3V0X3NpemUpOworCQlpZiAobGVuID4gNCkKIAkJCWxlbiAmPSB+MzsKLQotCQltZW1jcHkoIG9vYl9wb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgYnVmLCBsZW4gKTsKKwkJbWVtY3B5KG9vYl9wb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgYnVmLCBsZW4pOwogCQlvb2JfcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuOwogCQlvb2JfcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQotCQlpZiggKHJldD11c2Jfc3VibWl0X3VyYihvb2JfcG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKSkgPT0gMCApIHsKKwkJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihvb2JfcG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKSkgPT0gMCkgewogCQkJb29iX3ByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgPSAxOwogCQkJY291bnQgLT0gbGVuOwogCQkJYnVmICs9IGxlbjsKIAkJfQotCiAJfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0KLQlpZiggcmV0ICkgewotCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCIsIF9fRlVOQ1RJT05fXywKLQkJCXJldCApOwotCX0KLQotCXJldHVybiggcmV0ICk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkIiwgX19GVU5DVElPTl9fLCByZXQpOworCXJldHVybiByZXQ7CiAKIH0KIApAQCAtNjk3LDYzICs2ODMsNTggQEAKICogIGVycm9yIHJldHVybmVkIGJ5IGRpZ2lfd3JpdGUuCiAqLwogCi1zdGF0aWMgaW50IGRpZ2lfd3JpdGVfaW5iX2NvbW1hbmQoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCApCitzdGF0aWMgaW50IGRpZ2lfd3JpdGVfaW5iX2NvbW1hbmQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwl1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQogewotCiAJaW50IHJldCA9IDA7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAorCWRiZygiZGlnaV93cml0ZV9pbmJfY29tbWFuZDogVE9QOiBwb3J0PSVkLCBjb3VudD0lZCIsCisJCXByaXYtPmRwX3BvcnRfbnVtLCBjb3VudCk7CiAKLWRiZyggImRpZ2lfd3JpdGVfaW5iX2NvbW1hbmQ6IFRPUDogcG9ydD0lZCwgY291bnQ9JWQiLCBwcml2LT5kcF9wb3J0X251bSwKLWNvdW50ICk7Ci0KLQlpZiggdGltZW91dCApCisJaWYgKHRpbWVvdXQpCiAJCXRpbWVvdXQgKz0gamlmZmllczsKIAllbHNlCiAJCXRpbWVvdXQgPSBVTE9OR19NQVg7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKLQotCXdoaWxlKCBjb3VudCA+IDAgJiYgcmV0ID09IDAgKSB7Ci0KLQkJd2hpbGUoIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKLQkJfHwgcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJd2hpbGUoY291bnQgPiAwICYmIHJldCA9PSAwKSB7CisJCXdoaWxlKChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKKwkJCXx8IHByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCQljb25kX3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0X2lycXJlc3RvcmUoCiAJCQkJJnBvcnQtPndyaXRlX3dhaXQsIERJR0lfUkVUUllfVElNRU9VVCwKLQkJCQkmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCQkJaWYoIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICkgewotCQkJCXJldHVybiggLUVJTlRSICk7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwkJCQkmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAkJfQogCiAJCS8qIGxlbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgc21hbGwgZW5vdWdoIHRvICovCiAJCS8qIGd1YXJhbnRlZSB0aGUgd3JpdGUgd2lsbCBzZW5kIGJ1ZmZlcmVkIGRhdGEgZmlyc3QsICovCiAJCS8qIHNvIGNvbW1hbmRzIGFyZSBpbiBvcmRlciB3aXRoIGRhdGEgYW5kIG5vdCBzcGxpdCAqLwotCQlsZW4gPSBtaW4oY291bnQsIHBvcnQtPmJ1bGtfb3V0X3NpemUtMi1wcml2LT5kcF9vdXRfYnVmX2xlbiApOwotCQlpZiggbGVuID4gNCApCisJCWxlbiA9IG1pbihjb3VudCwgcG9ydC0+YnVsa19vdXRfc2l6ZS0yLXByaXYtPmRwX291dF9idWZfbGVuKTsKKwkJaWYgKGxlbiA+IDQpCiAJCQlsZW4gJj0gfjM7CiAKIAkJLyogd3JpdGUgYW55IGJ1ZmZlcmVkIGRhdGEgZmlyc3QgKi8KLQkJaWYoIHByaXYtPmRwX291dF9idWZfbGVuID4gMCApIHsKKwkJaWYgKHByaXYtPmRwX291dF9idWZfbGVuID4gMCkgewogCQkJZGF0YVswXSA9IERJR0lfQ01EX1NFTkRfREFUQTsKIAkJCWRhdGFbMV0gPSBwcml2LT5kcF9vdXRfYnVmX2xlbjsKLQkJCW1lbWNweSggZGF0YSsyLCBwcml2LT5kcF9vdXRfYnVmLAotCQkJCXByaXYtPmRwX291dF9idWZfbGVuICk7Ci0JCQltZW1jcHkoIGRhdGErMitwcml2LT5kcF9vdXRfYnVmX2xlbiwgYnVmLCBsZW4gKTsKKwkJCW1lbWNweShkYXRhICsgMiwgcHJpdi0+ZHBfb3V0X2J1ZiwKKwkJCQlwcml2LT5kcF9vdXRfYnVmX2xlbik7CisJCQltZW1jcHkoZGF0YSArIDIgKyBwcml2LT5kcF9vdXRfYnVmX2xlbiwgYnVmLCBsZW4pOwogCQkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoCi0JCQkJPSBwcml2LT5kcF9vdXRfYnVmX2xlbisyK2xlbjsKKwkJCQk9IHByaXYtPmRwX291dF9idWZfbGVuICsgMiArIGxlbjsKIAkJfSBlbHNlIHsKLQkJCW1lbWNweSggZGF0YSwgYnVmLCBsZW4gKTsKKwkJCW1lbWNweShkYXRhLCBidWYsIGxlbik7CiAJCQlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW47CiAJCX0KIAkJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAotCQlpZiggKHJldD11c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpKSA9PSAwICkgeworCQlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQykpID09IDApIHsKIAkJCXByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgPSAxOwogCQkJcHJpdi0+ZHBfb3V0X2J1Zl9sZW4gPSAwOwogCQkJY291bnQgLT0gbGVuOwpAQCAtNzYxLDE2ICs3NDIsMTIgQEAKIAkJfQogCiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKLQotCWlmKCByZXQgKSB7Ci0JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwgX19GVU5DVElPTl9fLAotCQlyZXQsIHByaXYtPmRwX3BvcnRfbnVtICk7Ci0JfQotCi0JcmV0dXJuKCByZXQgKTsKLQorCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwKKwkJCV9fRlVOQ1RJT05fXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC03ODQsOCArNzYxLDggQEAKICogIHJldHVybmVkIGJ5IHVzYl9zdWJtaXRfdXJiLgogKi8KIAotc3RhdGljIGludCBkaWdpX3NldF9tb2RlbV9zaWduYWxzKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCXVuc2lnbmVkIGludCBtb2RlbV9zaWduYWxzLCBpbnQgaW50ZXJydXB0aWJsZSApCitzdGF0aWMgaW50IGRpZ2lfc2V0X21vZGVtX3NpZ25hbHMoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwl1bnNpZ25lZCBpbnQgbW9kZW1fc2lnbmFscywgaW50IGludGVycnVwdGlibGUpCiB7CiAKIAlpbnQgcmV0OwpAQCAtNzk2LDYwICs3NzMsNDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCi1kYmcoICJkaWdpX3NldF9tb2RlbV9zaWduYWxzOiBUT1A6IHBvcnQ9JWQsIG1vZGVtX3NpZ25hbHM9MHgleCIsCi1wb3J0X3ByaXYtPmRwX3BvcnRfbnVtLCBtb2RlbV9zaWduYWxzICk7CisJZGJnKCJkaWdpX3NldF9tb2RlbV9zaWduYWxzOiBUT1A6IHBvcnQ9JWQsIG1vZGVtX3NpZ25hbHM9MHgleCIsCisJCXBvcnRfcHJpdi0+ZHBfcG9ydF9udW0sIG1vZGVtX3NpZ25hbHMpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCXNwaW5fbG9jayggJnBvcnRfcHJpdi0+ZHBfcG9ydF9sb2NrICk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnBvcnRfcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAotCXdoaWxlKCBvb2JfcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTCi0JfHwgb29iX3ByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgKSB7Ci0JCXNwaW5fdW5sb2NrKCAmcG9ydF9wcml2LT5kcF9wb3J0X2xvY2sgKTsKKwl3aGlsZShvb2JfcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8IG9vYl9wcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CisJCXNwaW5fdW5sb2NrKCZwb3J0X3ByaXYtPmRwX3BvcnRfbG9jayk7CiAJCWNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKIAkJCSZvb2JfcG9ydC0+d3JpdGVfd2FpdCwgRElHSV9SRVRSWV9USU1FT1VULAotCQkJJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0JCWlmKCBpbnRlcnJ1cHRpYmxlICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICkgewotCQkJcmV0dXJuKCAtRUlOVFIgKTsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSggJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0JCXNwaW5fbG9jayggJnBvcnRfcHJpdi0+ZHBfcG9ydF9sb2NrICk7CisJCQkmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCQlpZiAoaW50ZXJydXB0aWJsZSAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9jaygmcG9ydF9wcml2LT5kcF9wb3J0X2xvY2spOwogCX0KLQogCWRhdGFbMF0gPSBESUdJX0NNRF9TRVRfRFRSX1NJR05BTDsKIAlkYXRhWzFdID0gcG9ydF9wcml2LT5kcF9wb3J0X251bTsKLQlkYXRhWzJdID0gKG1vZGVtX3NpZ25hbHMmVElPQ01fRFRSKSA/Ci0JCURJR0lfRFRSX0FDVElWRSA6IERJR0lfRFRSX0lOQUNUSVZFOworCWRhdGFbMl0gPSAobW9kZW1fc2lnbmFscyZUSU9DTV9EVFIpID8gRElHSV9EVFJfQUNUSVZFIDogRElHSV9EVFJfSU5BQ1RJVkU7CiAJZGF0YVszXSA9IDA7Ci0KIAlkYXRhWzRdID0gRElHSV9DTURfU0VUX1JUU19TSUdOQUw7CiAJZGF0YVs1XSA9IHBvcnRfcHJpdi0+ZHBfcG9ydF9udW07Ci0JZGF0YVs2XSA9IChtb2RlbV9zaWduYWxzJlRJT0NNX1JUUykgPwotCQlESUdJX1JUU19BQ1RJVkUgOiBESUdJX1JUU19JTkFDVElWRTsKKwlkYXRhWzZdID0gKG1vZGVtX3NpZ25hbHMmVElPQ01fUlRTKSA/IERJR0lfUlRTX0FDVElWRSA6IERJR0lfUlRTX0lOQUNUSVZFOwogCWRhdGFbN10gPSAwOwogCiAJb29iX3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDg7CiAJb29iX3BvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKLQlpZiggKHJldD11c2Jfc3VibWl0X3VyYihvb2JfcG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKSkgPT0gMCApIHsKKwlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKG9vYl9wb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpKSA9PSAwKSB7CiAJCW9vYl9wcml2LT5kcF93cml0ZV91cmJfaW5fdXNlID0gMTsKIAkJcG9ydF9wcml2LT5kcF9tb2RlbV9zaWduYWxzID0KIAkJCShwb3J0X3ByaXYtPmRwX21vZGVtX3NpZ25hbHMmfihUSU9DTV9EVFJ8VElPQ01fUlRTKSkKIAkJCXwgKG1vZGVtX3NpZ25hbHMmKFRJT0NNX0RUUnxUSU9DTV9SVFMpKTsKIAl9Ci0KLQlzcGluX3VubG9jayggJnBvcnRfcHJpdi0+ZHBfcG9ydF9sb2NrICk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0KLQlpZiggcmV0ICkgewotCQllcnIoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQsIHJldD0lZCIsIF9fRlVOQ1RJT05fXywKLQkJcmV0ICk7Ci0JfQotCi0JcmV0dXJuKCByZXQgKTsKLQorCXNwaW5fdW5sb2NrKCZwb3J0X3ByaXYtPmRwX3BvcnRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkIiwgX19GVU5DVElPTl9fLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKLQogLyoKICogIERpZ2kgVHJhbnNtaXQgSWRsZQogKgpAQCAtODYyLDIwMyArODI2LDE4MiBAQAogKiAgcG9ydCBhdCBhIHRpbWUsIHNvIGl0cyBvay4KICovCiAKLXN0YXRpYyBpbnQgZGlnaV90cmFuc21pdF9pZGxlKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCXVuc2lnbmVkIGxvbmcgdGltZW91dCApCitzdGF0aWMgaW50IGRpZ2lfdHJhbnNtaXRfaWRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciBidWZbMl07CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXByaXYtPmRwX3RyYW5zbWl0X2lkbGUgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAKIAlidWZbMF0gPSBESUdJX0NNRF9UUkFOU01JVF9JRExFOwogCWJ1ZlsxXSA9IDA7CiAKIAl0aW1lb3V0ICs9IGppZmZpZXM7CiAKLQlpZiggKHJldD1kaWdpX3dyaXRlX2luYl9jb21tYW5kKCBwb3J0LCBidWYsIDIsIHRpbWVvdXQtamlmZmllcyApKSAhPSAwICkKLQkJcmV0dXJuKCByZXQgKTsKKwlpZiAoKHJldCA9IGRpZ2lfd3JpdGVfaW5iX2NvbW1hbmQocG9ydCwgYnVmLCAyLCB0aW1lb3V0IC0gamlmZmllcykpICE9IDApCisJCXJldHVybiByZXQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSggdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIXByaXYtPmRwX3RyYW5zbWl0X2lkbGUgKSB7CisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIXByaXYtPmRwX3RyYW5zbWl0X2lkbGUpIHsKIAkJY29uZF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dF9pcnFyZXN0b3JlKAogCQkJJnByaXYtPmRwX3RyYW5zbWl0X2lkbGVfd2FpdCwgRElHSV9SRVRSWV9USU1FT1VULAotCQkJJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKLQkJaWYoIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICkgewotCQkJcmV0dXJuKCAtRUlOVFIgKTsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwkJCSZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCX0KLQogCXByaXYtPmRwX3RyYW5zbWl0X2lkbGUgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0KLQlyZXR1cm4oIDAgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKIAogfQogCiAKLXN0YXRpYyB2b2lkIGRpZ2lfcnhfdGhyb3R0bGUoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKQorc3RhdGljIHZvaWQgZGlnaV9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewotCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAKLWRiZyggImRpZ2lfcnhfdGhyb3R0bGU6IFRPUDogcG9ydD0lZCIsIHByaXYtPmRwX3BvcnRfbnVtICk7CisJZGJnKCJkaWdpX3J4X3Rocm90dGxlOiBUT1A6IHBvcnQ9JWQiLCBwcml2LT5kcF9wb3J0X251bSk7CiAKIAkvKiBzdG9wIHJlY2VpdmluZyBjaGFyYWN0ZXJzIGJ5IG5vdCByZXN1Ym1pdHRpbmcgdGhlIHJlYWQgdXJiICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXByaXYtPmRwX3Rocm90dGxlZCA9IDE7CiAJcHJpdi0+ZHBfdGhyb3R0bGVfcmVzdGFydCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKLQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogfQogCiAKLXN0YXRpYyB2b2lkIGRpZ2lfcnhfdW50aHJvdHRsZSggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCApCitzdGF0aWMgdm9pZCBkaWdpX3J4X3VudGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKLQogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotZGJnKCAiZGlnaV9yeF91bnRocm90dGxlOiBUT1A6IHBvcnQ9JWQiLCBwcml2LT5kcF9wb3J0X251bSApOworCWRiZygiZGlnaV9yeF91bnRocm90dGxlOiBUT1A6IHBvcnQ9JWQiLCBwcml2LT5kcF9wb3J0X251bSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAKIAkvKiB0dXJuIHRocm90dGxlIG9mZiAqLwogCXByaXYtPmRwX3Rocm90dGxlZCA9IDA7CiAJcHJpdi0+ZHBfdGhyb3R0bGVfcmVzdGFydCA9IDA7CiAKIAkvKiByZXN0YXJ0IHJlYWQgY2hhaW4gKi8KLQlpZiggcHJpdi0+ZHBfdGhyb3R0bGVfcmVzdGFydCApIHsKKwlpZiAocHJpdi0+ZHBfdGhyb3R0bGVfcmVzdGFydCkgewogCQlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JCXJldCA9IHVzYl9zdWJtaXRfdXJiKCBwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyApOworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAotCWlmKCByZXQgKSB7Ci0JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwgX19GVU5DVElPTl9fLAotCQkJcmV0LCBwcml2LT5kcF9wb3J0X251bSApOwotCX0KLQorCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwKKwkJCV9fRlVOQ1RJT05fXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CiB9CiAKIAotc3RhdGljIHZvaWQgZGlnaV9zZXRfdGVybWlvcyggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgCi0Jc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyApCitzdGF0aWMgdm9pZCBkaWdpX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXVuc2lnbmVkIGludCBpZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKLQl1bnNpZ25lZCBpbnQgY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKKwl1bnNpZ25lZCBpbnQgaWZsYWcgPSB0dHktPnRlcm1pb3MtPmNfaWZsYWc7CisJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCXVuc2lnbmVkIGludCBvbGRfaWZsYWcgPSBvbGRfdGVybWlvcy0+Y19pZmxhZzsKIAl1bnNpZ25lZCBpbnQgb2xkX2NmbGFnID0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWc7CiAJdW5zaWduZWQgY2hhciBidWZbMzJdOwogCXVuc2lnbmVkIGludCBtb2RlbV9zaWduYWxzOwogCWludCBhcmcscmV0OwogCWludCBpID0gMDsKKwlzcGVlZF90IGJhdWQ7CiAKLQotZGJnKCAiZGlnaV9zZXRfdGVybWlvczogVE9QOiBwb3J0PSVkLCBpZmxhZz0weCV4LCBvbGRfaWZsYWc9MHgleCwgY2ZsYWc9MHgleCwgb2xkX2NmbGFnPTB4JXgiLCBwcml2LT5kcF9wb3J0X251bSwgaWZsYWcsIG9sZF9pZmxhZywgY2ZsYWcsIG9sZF9jZmxhZyApOworCWRiZygiZGlnaV9zZXRfdGVybWlvczogVE9QOiBwb3J0PSVkLCBpZmxhZz0weCV4LCBvbGRfaWZsYWc9MHgleCwgY2ZsYWc9MHgleCwgb2xkX2NmbGFnPTB4JXgiLCBwcml2LT5kcF9wb3J0X251bSwgaWZsYWcsIG9sZF9pZmxhZywgY2ZsYWcsIG9sZF9jZmxhZyk7CiAKIAkvKiBzZXQgYmF1ZCByYXRlICovCi0JaWYoIChjZmxhZyZDQkFVRCkgIT0gKG9sZF9jZmxhZyZDQkFVRCkgKSB7Ci0KKwlpZiAoKGJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpKSAhPSB0dHlfdGVybWlvc19iYXVkX3JhdGUob2xkX3Rlcm1pb3MpKSB7CiAJCWFyZyA9IC0xOwogCiAJCS8qIHJlYXNzZXJ0IERUUiBhbmQgKG1heWJlKSBSVFMgb24gdHJhbnNpdGlvbiBmcm9tIEIwICovCi0JCWlmKCAob2xkX2NmbGFnJkNCQVVEKSA9PSBCMCApIHsKKwkJaWYgKChvbGRfY2ZsYWcmQ0JBVUQpID09IEIwKSB7CiAJCQkvKiBkb24ndCBzZXQgUlRTIGlmIHVzaW5nIGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLwogCQkJLyogYW5kIHRocm90dGxpbmcgaW5wdXQgKi8KIAkJCW1vZGVtX3NpZ25hbHMgPSBUSU9DTV9EVFI7Ci0JCQlpZiggIShwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fAotCQkJIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZwb3J0LT50dHktPmZsYWdzKSApIHsKKwkJCWlmICghKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHx8CisJCQkgICAgIXRlc3RfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSkKIAkJCQltb2RlbV9zaWduYWxzIHw9IFRJT0NNX1JUUzsKLQkJCX0KLQkJCWRpZ2lfc2V0X21vZGVtX3NpZ25hbHMoIHBvcnQsIG1vZGVtX3NpZ25hbHMsIDEgKTsKKwkJCWRpZ2lfc2V0X21vZGVtX3NpZ25hbHMocG9ydCwgbW9kZW1fc2lnbmFscywgMSk7CiAJCX0KLQotCQlzd2l0Y2goIChjZmxhZyZDQkFVRCkgKSB7CisJCXN3aXRjaCAoYmF1ZCkgewogCQkJLyogZHJvcCBEVFIgYW5kIFJUUyBvbiB0cmFuc2l0aW9uIHRvIEIwICovCi0JCWNhc2UgQjA6IGRpZ2lfc2V0X21vZGVtX3NpZ25hbHMoIHBvcnQsIDAsIDEgKTsgYnJlYWs7Ci0JCWNhc2UgQjUwOiBhcmcgPSBESUdJX0JBVURfNTA7IGJyZWFrOwotCQljYXNlIEI3NTogYXJnID0gRElHSV9CQVVEXzc1OyBicmVhazsKLQkJY2FzZSBCMTEwOiBhcmcgPSBESUdJX0JBVURfMTEwOyBicmVhazsKLQkJY2FzZSBCMTUwOiBhcmcgPSBESUdJX0JBVURfMTUwOyBicmVhazsKLQkJY2FzZSBCMjAwOiBhcmcgPSBESUdJX0JBVURfMjAwOyBicmVhazsKLQkJY2FzZSBCMzAwOiBhcmcgPSBESUdJX0JBVURfMzAwOyBicmVhazsKLQkJY2FzZSBCNjAwOiBhcmcgPSBESUdJX0JBVURfNjAwOyBicmVhazsKLQkJY2FzZSBCMTIwMDogYXJnID0gRElHSV9CQVVEXzEyMDA7IGJyZWFrOwotCQljYXNlIEIxODAwOiBhcmcgPSBESUdJX0JBVURfMTgwMDsgYnJlYWs7Ci0JCWNhc2UgQjI0MDA6IGFyZyA9IERJR0lfQkFVRF8yNDAwOyBicmVhazsKLQkJY2FzZSBCNDgwMDogYXJnID0gRElHSV9CQVVEXzQ4MDA7IGJyZWFrOwotCQljYXNlIEI5NjAwOiBhcmcgPSBESUdJX0JBVURfOTYwMDsgYnJlYWs7Ci0JCWNhc2UgQjE5MjAwOiBhcmcgPSBESUdJX0JBVURfMTkyMDA7IGJyZWFrOwotCQljYXNlIEIzODQwMDogYXJnID0gRElHSV9CQVVEXzM4NDAwOyBicmVhazsKLQkJY2FzZSBCNTc2MDA6IGFyZyA9IERJR0lfQkFVRF81NzYwMDsgYnJlYWs7Ci0JCWNhc2UgQjExNTIwMDogYXJnID0gRElHSV9CQVVEXzExNTIwMDsgYnJlYWs7Ci0JCWNhc2UgQjIzMDQwMDogYXJnID0gRElHSV9CQVVEXzIzMDQwMDsgYnJlYWs7Ci0JCWNhc2UgQjQ2MDgwMDogYXJnID0gRElHSV9CQVVEXzQ2MDgwMDsgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkYmcoICJkaWdpX3NldF90ZXJtaW9zOiBjYW4ndCBoYW5kbGUgYmF1ZCByYXRlIDB4JXgiLAotCQkJCShjZmxhZyZDQkFVRCkgKTsKLQkJCWJyZWFrOworCQkJY2FzZSAwOiBkaWdpX3NldF9tb2RlbV9zaWduYWxzKHBvcnQsIDAsIDEpOyBicmVhazsKKwkJCWNhc2UgNTA6IGFyZyA9IERJR0lfQkFVRF81MDsgYnJlYWs7CisJCQljYXNlIDc1OiBhcmcgPSBESUdJX0JBVURfNzU7IGJyZWFrOworCQkJY2FzZSAxMTA6IGFyZyA9IERJR0lfQkFVRF8xMTA7IGJyZWFrOworCQkJY2FzZSAxNTA6IGFyZyA9IERJR0lfQkFVRF8xNTA7IGJyZWFrOworCQkJY2FzZSAyMDA6IGFyZyA9IERJR0lfQkFVRF8yMDA7IGJyZWFrOworCQkJY2FzZSAzMDA6IGFyZyA9IERJR0lfQkFVRF8zMDA7IGJyZWFrOworCQkJY2FzZSA2MDA6IGFyZyA9IERJR0lfQkFVRF82MDA7IGJyZWFrOworCQkJY2FzZSAxMjAwOiBhcmcgPSBESUdJX0JBVURfMTIwMDsgYnJlYWs7CisJCQljYXNlIDE4MDA6IGFyZyA9IERJR0lfQkFVRF8xODAwOyBicmVhazsKKwkJCWNhc2UgMjQwMDogYXJnID0gRElHSV9CQVVEXzI0MDA7IGJyZWFrOworCQkJY2FzZSA0ODAwOiBhcmcgPSBESUdJX0JBVURfNDgwMDsgYnJlYWs7CisJCQljYXNlIDk2MDA6IGFyZyA9IERJR0lfQkFVRF85NjAwOyBicmVhazsKKwkJCWNhc2UgMTkyMDA6IGFyZyA9IERJR0lfQkFVRF8xOTIwMDsgYnJlYWs7CisJCQljYXNlIDM4NDAwOiBhcmcgPSBESUdJX0JBVURfMzg0MDA7IGJyZWFrOworCQkJY2FzZSA1NzYwMDogYXJnID0gRElHSV9CQVVEXzU3NjAwOyBicmVhazsKKwkJCWNhc2UgMTE1MjAwOiBhcmcgPSBESUdJX0JBVURfMTE1MjAwOyBicmVhazsKKwkJCWNhc2UgMjMwNDAwOiBhcmcgPSBESUdJX0JBVURfMjMwNDAwOyBicmVhazsKKwkJCWNhc2UgNDYwODAwOiBhcmcgPSBESUdJX0JBVURfNDYwODAwOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYXJnID0gRElHSV9CQVVEXzk2MDA7CisJCQkJYmF1ZCA9IDk2MDA7CisJCQkJYnJlYWs7CiAJCX0KLQotCQlpZiggYXJnICE9IC0xICkgeworCQlpZiAoYXJnICE9IC0xKSB7CiAJCQlidWZbaSsrXSA9IERJR0lfQ01EX1NFVF9CQVVEX1JBVEU7CiAJCQlidWZbaSsrXSA9IHByaXYtPmRwX3BvcnRfbnVtOwogCQkJYnVmW2krK10gPSBhcmc7CiAJCQlidWZbaSsrXSA9IDA7CiAJCX0KLQogCX0KLQogCS8qIHNldCBwYXJpdHkgKi8KLQlpZiggKGNmbGFnJihQQVJFTkJ8UEFST0REKSkgIT0gKG9sZF9jZmxhZyYoUEFSRU5CfFBBUk9ERCkpICkgewotCi0JCWlmKCAoY2ZsYWcmUEFSRU5CKSApIHsKLQkJCWlmKCAoY2ZsYWcmUEFST0REKSApCisJaWYgKChjZmxhZyYoUEFSRU5CfFBBUk9ERCkpICE9IChvbGRfY2ZsYWcmKFBBUkVOQnxQQVJPREQpKSkgeworCQlpZiAoY2ZsYWcmUEFSRU5CKSB7CisJCQlpZiAoY2ZsYWcmUEFST0REKQogCQkJCWFyZyA9IERJR0lfUEFSSVRZX09ERDsKIAkJCWVsc2UKIAkJCQlhcmcgPSBESUdJX1BBUklUWV9FVkVOOwogCQl9IGVsc2UgewogCQkJYXJnID0gRElHSV9QQVJJVFlfTk9ORTsKIAkJfQotCiAJCWJ1ZltpKytdID0gRElHSV9DTURfU0VUX1BBUklUWTsKIAkJYnVmW2krK10gPSBwcml2LT5kcF9wb3J0X251bTsKIAkJYnVmW2krK10gPSBhcmc7CiAJCWJ1ZltpKytdID0gMDsKLQogCX0KLQogCS8qIHNldCB3b3JkIHNpemUgKi8KLQlpZiggKGNmbGFnJkNTSVpFKSAhPSAob2xkX2NmbGFnJkNTSVpFKSApIHsKLQorCWlmICgoY2ZsYWcmQ1NJWkUpICE9IChvbGRfY2ZsYWcmQ1NJWkUpKSB7CiAJCWFyZyA9IC0xOwotCi0JCXN3aXRjaCggKGNmbGFnJkNTSVpFKSApIHsKKwkJc3dpdGNoIChjZmxhZyZDU0laRSkgewogCQljYXNlIENTNTogYXJnID0gRElHSV9XT1JEX1NJWkVfNTsgYnJlYWs7CiAJCWNhc2UgQ1M2OiBhcmcgPSBESUdJX1dPUkRfU0laRV82OyBicmVhazsKIAkJY2FzZSBDUzc6IGFyZyA9IERJR0lfV09SRF9TSVpFXzc7IGJyZWFrOwogCQljYXNlIENTODogYXJnID0gRElHSV9XT1JEX1NJWkVfODsgYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkYmcoICJkaWdpX3NldF90ZXJtaW9zOiBjYW4ndCBoYW5kbGUgd29yZCBzaXplICVkIiwKLQkJCQkoY2ZsYWcmQ1NJWkUpICk7CisJCQlkYmcoImRpZ2lfc2V0X3Rlcm1pb3M6IGNhbid0IGhhbmRsZSB3b3JkIHNpemUgJWQiLAorCQkJCShjZmxhZyZDU0laRSkpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiggYXJnICE9IC0xICkgeworCQlpZiAoYXJnICE9IC0xKSB7CiAJCQlidWZbaSsrXSA9IERJR0lfQ01EX1NFVF9XT1JEX1NJWkU7CiAJCQlidWZbaSsrXSA9IHByaXYtPmRwX3BvcnRfbnVtOwogCQkJYnVmW2krK10gPSBhcmc7CkBAIC0xMDY4LDkgKzEwMTEsOSBAQAogCX0KIAogCS8qIHNldCBzdG9wIGJpdHMgKi8KLQlpZiggKGNmbGFnJkNTVE9QQikgIT0gKG9sZF9jZmxhZyZDU1RPUEIpICkgeworCWlmICgoY2ZsYWcmQ1NUT1BCKSAhPSAob2xkX2NmbGFnJkNTVE9QQikpIHsKIAotCQlpZiggKGNmbGFnJkNTVE9QQikgKQorCQlpZiAoKGNmbGFnJkNTVE9QQikpCiAJCQlhcmcgPSBESUdJX1NUT1BfQklUU18yOwogCQllbHNlCiAJCQlhcmcgPSBESUdJX1NUT1BfQklUU18xOwpAQCAtMTA4MywxOCArMTAyNiwxNSBAQAogCX0KIAogCS8qIHNldCBpbnB1dCBmbG93IGNvbnRyb2wgKi8KLQlpZiggKGlmbGFnJklYT0ZGKSAhPSAob2xkX2lmbGFnJklYT0ZGKQotCXx8IChjZmxhZyZDUlRTQ1RTKSAhPSAob2xkX2NmbGFnJkNSVFNDVFMpICkgewotCisJaWYgKChpZmxhZyZJWE9GRikgIT0gKG9sZF9pZmxhZyZJWE9GRikKKwkgICAgfHwgKGNmbGFnJkNSVFNDVFMpICE9IChvbGRfY2ZsYWcmQ1JUU0NUUykpIHsKIAkJYXJnID0gMDsKLQotCQlpZiggKGlmbGFnJklYT0ZGKSApCisJCWlmIChpZmxhZyZJWE9GRikKIAkJCWFyZyB8PSBESUdJX0lOUFVUX0ZMT1dfQ09OVFJPTF9YT05fWE9GRjsKIAkJZWxzZQogCQkJYXJnICY9IH5ESUdJX0lOUFVUX0ZMT1dfQ09OVFJPTF9YT05fWE9GRjsKIAotCQlpZiggKGNmbGFnJkNSVFNDVFMpICkgewotCisJCWlmIChjZmxhZyZDUlRTQ1RTKSB7CiAJCQlhcmcgfD0gRElHSV9JTlBVVF9GTE9XX0NPTlRST0xfUlRTOwogCiAJCQkvKiBPbiBVU0ItNCBpdCBpcyBuZWNlc3NhcnkgdG8gYXNzZXJ0IFJUUyBwcmlvciAqLwpAQCAtMTEwNyw0MyArMTA0NywzNyBAQAogCQl9IGVsc2UgewogCQkJYXJnICY9IH5ESUdJX0lOUFVUX0ZMT1dfQ09OVFJPTF9SVFM7CiAJCX0KLQogCQlidWZbaSsrXSA9IERJR0lfQ01EX1NFVF9JTlBVVF9GTE9XX0NPTlRST0w7CiAJCWJ1ZltpKytdID0gcHJpdi0+ZHBfcG9ydF9udW07CiAJCWJ1ZltpKytdID0gYXJnOwogCQlidWZbaSsrXSA9IDA7Ci0KIAl9CiAKIAkvKiBzZXQgb3V0cHV0IGZsb3cgY29udHJvbCAqLwotCWlmKCAoaWZsYWcmSVhPTikgIT0gKG9sZF9pZmxhZyZJWE9OKQotCXx8IChjZmxhZyZDUlRTQ1RTKSAhPSAob2xkX2NmbGFnJkNSVFNDVFMpICkgewotCisJaWYgKChpZmxhZyZJWE9OKSAhPSAob2xkX2lmbGFnJklYT04pCisJICAgIHx8IChjZmxhZyZDUlRTQ1RTKSAhPSAob2xkX2NmbGFnJkNSVFNDVFMpKSB7CiAJCWFyZyA9IDA7Ci0KLQkJaWYoIChpZmxhZyZJWE9OKSApCisJCWlmIChpZmxhZyZJWE9OKQogCQkJYXJnIHw9IERJR0lfT1VUUFVUX0ZMT1dfQ09OVFJPTF9YT05fWE9GRjsKIAkJZWxzZQogCQkJYXJnICY9IH5ESUdJX09VVFBVVF9GTE9XX0NPTlRST0xfWE9OX1hPRkY7CiAKLQkJaWYoIChjZmxhZyZDUlRTQ1RTKSApIHsKKwkJaWYgKGNmbGFnJkNSVFNDVFMpIHsKIAkJCWFyZyB8PSBESUdJX09VVFBVVF9GTE9XX0NPTlRST0xfQ1RTOwogCQl9IGVsc2UgewogCQkJYXJnICY9IH5ESUdJX09VVFBVVF9GTE9XX0NPTlRST0xfQ1RTOwotCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CiAJCX0KIAogCQlidWZbaSsrXSA9IERJR0lfQ01EX1NFVF9PVVRQVVRfRkxPV19DT05UUk9MOwogCQlidWZbaSsrXSA9IHByaXYtPmRwX3BvcnRfbnVtOwogCQlidWZbaSsrXSA9IGFyZzsKIAkJYnVmW2krK10gPSAwOwotCiAJfQogCiAJLyogc2V0IHJlY2VpdmUgZW5hYmxlL2Rpc2FibGUgKi8KLQlpZiggKGNmbGFnJkNSRUFEKSAhPSAob2xkX2NmbGFnJkNSRUFEKSApIHsKLQotCQlpZiggKGNmbGFnJkNSRUFEKSApCisJaWYgKChjZmxhZyZDUkVBRCkgIT0gKG9sZF9jZmxhZyZDUkVBRCkpIHsKKwkJaWYgKGNmbGFnJkNSRUFEKQogCQkJYXJnID0gRElHSV9FTkFCTEU7CiAJCWVsc2UKIAkJCWFyZyA9IERJR0lfRElTQUJMRTsKQEAgLTExNTIsMzIgKzEwODYsMjYgQEAKIAkJYnVmW2krK10gPSBwcml2LT5kcF9wb3J0X251bTsKIAkJYnVmW2krK10gPSBhcmc7CiAJCWJ1ZltpKytdID0gMDsKLQogCX0KLQotCWlmKCAocmV0PWRpZ2lfd3JpdGVfb29iX2NvbW1hbmQoIHBvcnQsIGJ1ZiwgaSwgMSApKSAhPSAwICkKLQkJZGJnKCAiZGlnaV9zZXRfdGVybWlvczogd3JpdGUgb29iIGZhaWxlZCwgcmV0PSVkIiwgcmV0ICk7CisJaWYgKChyZXQgPSBkaWdpX3dyaXRlX29vYl9jb21tYW5kKHBvcnQsIGJ1ZiwgaSwgMSkpICE9IDApCisJCWRiZygiZGlnaV9zZXRfdGVybWlvczogd3JpdGUgb29iIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKIAogfQogCiAKLXN0YXRpYyB2b2lkIGRpZ2lfYnJlYWtfY3RsKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUgKQorc3RhdGljIHZvaWQgZGlnaV9icmVha19jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQogewotCiAJdW5zaWduZWQgY2hhciBidWZbNF07CiAKLQogCWJ1ZlswXSA9IERJR0lfQ01EX0JSRUFLX0NPTlRST0w7CiAJYnVmWzFdID0gMjsJCQkJLyogbGVuZ3RoICovCiAJYnVmWzJdID0gYnJlYWtfc3RhdGUgPyAxIDogMDsKIAlidWZbM10gPSAwOwkJCQkvKiBwYWQgKi8KLQotCWRpZ2lfd3JpdGVfaW5iX2NvbW1hbmQoIHBvcnQsIGJ1ZiwgNCwgMCApOwotCisJZGlnaV93cml0ZV9pbmJfY29tbWFuZChwb3J0LCBidWYsIDQsIDApOwogfQogCiAKLXN0YXRpYyBpbnQgZGlnaV90aW9jbWdldCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUgKQorc3RhdGljIGludCBkaWdpX3Rpb2NtZ2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgaW50IHZhbDsKQEAgLTExODUsMTUgKzExMTMsMTUgQEAKIAogCWRiZygiJXM6IFRPUDogcG9ydD0lZCIsIF9fRlVOQ1RJT05fXywgcHJpdi0+ZHBfcG9ydF9udW0pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXZhbCA9IHByaXYtPmRwX21vZGVtX3NpZ25hbHM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gdmFsOwogfQogCiAKLXN0YXRpYyBpbnQgZGlnaV90aW9jbXNldCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyICkKK3N0YXRpYyBpbnQgZGlnaV90aW9jbXNldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtMTIwMSw0MSArMTEyOSwzNCBAQAogCiAJZGJnKCIlczogVE9QOiBwb3J0PSVkIiwgX19GVU5DVElPTl9fLCBwcml2LT5kcF9wb3J0X251bSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJdmFsID0gKHByaXYtPmRwX21vZGVtX3NpZ25hbHMgJiB+Y2xlYXIpIHwgc2V0OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0JcmV0dXJuIGRpZ2lfc2V0X21vZGVtX3NpZ25hbHMoIHBvcnQsIHZhbCwgMSApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCXJldHVybiBkaWdpX3NldF9tb2RlbV9zaWduYWxzKHBvcnQsIHZhbCwgMSk7CiB9CiAKIAotc3RhdGljIGludCBkaWdpX2lvY3RsKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitzdGF0aWMgaW50IGRpZ2lfaW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0KIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCi1kYmcoICJkaWdpX2lvY3RsOiBUT1A6IHBvcnQ9JWQsIGNtZD0weCV4IiwgcHJpdi0+ZHBfcG9ydF9udW0sIGNtZCApOworCWRiZygiZGlnaV9pb2N0bDogVE9QOiBwb3J0PSVkLCBjbWQ9MHgleCIsIHByaXYtPmRwX3BvcnRfbnVtLCBjbWQpOwogCiAJc3dpdGNoIChjbWQpIHsKLQogCWNhc2UgVElPQ01JV0FJVDoKIAkJLyogd2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpKi8KIAkJLyogVE9ETyAqLwotCQlyZXR1cm4oIDAgKTsKLQorCQlyZXR1cm4gMDsKIAljYXNlIFRJT0NHSUNPVU5UOgogCQkvKiByZXR1cm4gY291bnQgb2YgbW9kZW1saW5lIHRyYW5zaXRpb25zICovCiAJCS8qIFRPRE8gKi8KIAkJcmV0dXJuIDA7Ci0KIAl9Ci0KLQlyZXR1cm4oIC1FTk9JT0NUTENNRCApOworCXJldHVybiAtRU5PSU9DVExDTUQ7CiAKIH0KIAotCi1zdGF0aWMgaW50IGRpZ2lfd3JpdGUoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50ICkKK3N0YXRpYyBpbnQgZGlnaV93cml0ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAogCWludCByZXQsZGF0YV9sZW4sbmV3X2xlbjsKQEAgLTEyNDMsMzUgKzExNjQsMjkgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQotZGJnKCAiZGlnaV93cml0ZTogVE9QOiBwb3J0PSVkLCBjb3VudD0lZCwgaW5faW50ZXJydXB0PSVsZCIsCi1wcml2LT5kcF9wb3J0X251bSwgY291bnQsIGluX2ludGVycnVwdCgpICk7CisJZGJnKCJkaWdpX3dyaXRlOiBUT1A6IHBvcnQ9JWQsIGNvdW50PSVkLCBpbl9pbnRlcnJ1cHQ9JWxkIiwKKwkJcHJpdi0+ZHBfcG9ydF9udW0sIGNvdW50LCBpbl9pbnRlcnJ1cHQoKSk7CiAKIAkvKiBjb3B5IHVzZXIgZGF0YSAod2hpY2ggY2FuIHNsZWVwKSBiZWZvcmUgZ2V0dGluZyBzcGluIGxvY2sgKi8KLQljb3VudCA9IG1pbiggY291bnQsIHBvcnQtPmJ1bGtfb3V0X3NpemUtMiApOwotCWNvdW50ID0gbWluKCA2NCwgY291bnQpOworCWNvdW50ID0gbWluKGNvdW50LCBwb3J0LT5idWxrX291dF9zaXplLTIpOworCWNvdW50ID0gbWluKDY0LCBjb3VudCk7CiAKIAkvKiBiZSBzdXJlIG9ubHkgb25lIHdyaXRlIHByb2NlZWRzIGF0IGEgdGltZSAqLwogCS8qIHRoZXJlIGFyZSByYWNlcyBvbiB0aGUgcG9ydCBwcml2YXRlIGJ1ZmZlciAqLwogCS8qIGFuZCByYWNlcyB0byBjaGVjayB3cml0ZV91cmItPnN0YXR1cyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAogCS8qIHdhaXQgZm9yIHVyYiBzdGF0dXMgY2xlYXIgdG8gc3VibWl0IGFub3RoZXIgdXJiICovCi0JaWYoIHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUwotCXx8IHByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgKSB7Ci0KKwlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8IHByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKIAkJLyogYnVmZmVyIGRhdGEgaWYgY291bnQgaXMgMSAocHJvYmFibHkgcHV0X2NoYXIpIGlmIHBvc3NpYmxlICovCi0JCWlmKCBjb3VudCA9PSAxICYmIHByaXYtPmRwX291dF9idWZfbGVuIDwgRElHSV9PVVRfQlVGX1NJWkUgKSB7CisJCWlmIChjb3VudCA9PSAxICYmIHByaXYtPmRwX291dF9idWZfbGVuIDwgRElHSV9PVVRfQlVGX1NJWkUpIHsKIAkJCXByaXYtPmRwX291dF9idWZbcHJpdi0+ZHBfb3V0X2J1Zl9sZW4rK10gPSAqYnVmOwogCQkJbmV3X2xlbiA9IDE7CiAJCX0gZWxzZSB7CiAJCQluZXdfbGVuID0gMDsKIAkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0KLQkJcmV0dXJuKCBuZXdfbGVuICk7Ci0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBuZXdfbGVuOwogCX0KIAogCS8qIGFsbG93IHNwYWNlIGZvciBhbnkgYnVmZmVyZWQgZGF0YSBhbmQgZm9yIG5ldyBkYXRhLCB1cCB0byAqLwpAQCAtMTI3OSw5ICsxMTk0LDkgQEAKIAluZXdfbGVuID0gbWluKGNvdW50LCBwb3J0LT5idWxrX291dF9zaXplLTItcHJpdi0+ZHBfb3V0X2J1Zl9sZW4pOwogCWRhdGFfbGVuID0gbmV3X2xlbiArIHByaXYtPmRwX291dF9idWZfbGVuOwogCi0JaWYoIGRhdGFfbGVuID09IDAgKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0JCXJldHVybiggMCApOworCWlmIChkYXRhX2xlbiA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKIAl9CiAKIAlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBkYXRhX2xlbisyOwpAQCAtMTI5MSwzMiArMTIwNiwyOSBAQAogCSpkYXRhKysgPSBkYXRhX2xlbjsKIAogCS8qIGNvcHkgaW4gYnVmZmVyZWQgZGF0YSBmaXJzdCAqLwotCW1lbWNweSggZGF0YSwgcHJpdi0+ZHBfb3V0X2J1ZiwgcHJpdi0+ZHBfb3V0X2J1Zl9sZW4gKTsKKwltZW1jcHkoZGF0YSwgcHJpdi0+ZHBfb3V0X2J1ZiwgcHJpdi0+ZHBfb3V0X2J1Zl9sZW4pOwogCWRhdGEgKz0gcHJpdi0+ZHBfb3V0X2J1Zl9sZW47CiAKIAkvKiBjb3B5IGluIG5ldyBkYXRhICovCi0JbWVtY3B5KCBkYXRhLCBidWYsIG5ld19sZW4gKTsKKwltZW1jcHkoZGF0YSwgYnVmLCBuZXdfbGVuKTsKIAotCWlmKCAocmV0PXVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQykpID09IDAgKSB7CisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpKSA9PSAwKSB7CiAJCXByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgPSAxOwogCQlyZXQgPSBuZXdfbGVuOwogCQlwcml2LT5kcF9vdXRfYnVmX2xlbiA9IDA7CiAJfQogCiAJLyogcmV0dXJuIGxlbmd0aCBvZiBuZXcgZGF0YSB3cml0dGVuLCBvciBlcnJvciAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0JaWYoIHJldCA8IDAgKSB7Ci0JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwgX19GVU5DVElPTl9fLAotCQkJcmV0LCBwcml2LT5kcF9wb3J0X251bSApOwotCX0KLQotZGJnKCAiZGlnaV93cml0ZTogcmV0dXJuaW5nICVkIiwgcmV0ICk7Ci0JcmV0dXJuKCByZXQgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKKwlpZiAocmV0IDwgMCkKKwkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLAorCQkJX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKKwlkYmcoImRpZ2lfd3JpdGU6IHJldHVybmluZyAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIAogfSAKIAotCi1zdGF0aWMgdm9pZCBkaWdpX3dyaXRlX2J1bGtfY2FsbGJhY2soIHN0cnVjdCB1cmIgKnVyYiApCitzdGF0aWMgdm9pZCBkaWdpX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwpAQCAtMTMyNiwxNTMgKzEyMzgsMTM2IEBACiAJaW50IHJldCA9IDA7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0KLQlkYmcoImRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjazogVE9QLCB1cmIgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKwlkYmcoImRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjazogVE9QLCB1cmItPnN0YXR1cz0lZCIsIHN0YXR1cyk7CiAKIAkvKiBwb3J0IGFuZCBzZXJpYWwgc2FuaXR5IGNoZWNrICovCi0JaWYoIHBvcnQgPT0gTlVMTCB8fCAocHJpdj11c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwgKSB7CisJaWYgKHBvcnQgPT0gTlVMTCB8fCAocHJpdj11c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwpIHsKIAkJZXJyKCIlczogcG9ydCBvciBwb3J0LT5wcml2YXRlIGlzIE5VTEwsIHN0YXR1cz0lZCIsCiAJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwotCWlmKCBzZXJpYWwgPT0gTlVMTCB8fCAoc2VyaWFsX3ByaXY9dXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpKSA9PSBOVUxMICkgeworCWlmIChzZXJpYWwgPT0gTlVMTCB8fCAoc2VyaWFsX3ByaXY9dXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpKSA9PSBOVUxMKSB7CiAJCWVycigiJXM6IHNlcmlhbCBvciBzZXJpYWwtPnByaXZhdGUgaXMgTlVMTCwgc3RhdHVzPSVkIiwKIAkJICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGhhbmRsZSBvb2IgY2FsbGJhY2sgKi8KLQlpZiggcHJpdi0+ZHBfcG9ydF9udW0gPT0gc2VyaWFsX3ByaXYtPmRzX29vYl9wb3J0X251bSApIHsKLQkJZGJnKCAiZGlnaV93cml0ZV9idWxrX2NhbGxiYWNrOiBvb2IgY2FsbGJhY2siICk7Ci0JCXNwaW5fbG9jayggJnByaXYtPmRwX3BvcnRfbG9jayApOworCWlmIChwcml2LT5kcF9wb3J0X251bSA9PSBzZXJpYWxfcHJpdi0+ZHNfb29iX3BvcnRfbnVtKSB7CisJCWRiZygiZGlnaV93cml0ZV9idWxrX2NhbGxiYWNrOiBvb2IgY2FsbGJhY2siKTsKKwkJc3Bpbl9sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCQlwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlID0gMDsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmcG9ydC0+d3JpdGVfd2FpdCApOwotCQlzcGluX3VubG9jayggJnByaXYtPmRwX3BvcnRfbG9jayApOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPndyaXRlX3dhaXQpOworCQlzcGluX3VubG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHRyeSB0byBzZW5kIGFueSBidWZmZXJlZCBkYXRhIG9uIHRoaXMgcG9ydCwgaWYgaXQgaXMgb3BlbiAqLwotCXNwaW5fbG9jayggJnByaXYtPmRwX3BvcnRfbG9jayApOworCXNwaW5fbG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAlwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlID0gMDsKLQlpZiggcG9ydC0+b3Blbl9jb3VudCAmJiBwb3J0LT53cml0ZV91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MKLQkmJiBwcml2LT5kcF9vdXRfYnVmX2xlbiA+IDAgKSB7Ci0KKwlpZiAocG9ydC0+b3Blbl9jb3VudCAmJiBwb3J0LT53cml0ZV91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MKKwkgICAgJiYgcHJpdi0+ZHBfb3V0X2J1Zl9sZW4gPiAwKSB7CiAJCSooKHVuc2lnbmVkIGNoYXIgKikocG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpKQogCQkJPSAodW5zaWduZWQgY2hhcilESUdJX0NNRF9TRU5EX0RBVEE7CiAJCSooKHVuc2lnbmVkIGNoYXIgKikocG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpKzEpCiAJCQk9ICh1bnNpZ25lZCBjaGFyKXByaXYtPmRwX291dF9idWZfbGVuOwotCi0JCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aAotCQkJPSBwcml2LT5kcF9vdXRfYnVmX2xlbisyOworCQlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwcml2LT5kcF9vdXRfYnVmX2xlbisyOwogCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwotCi0JCW1lbWNweSggcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIrMiwgcHJpdi0+ZHBfb3V0X2J1ZiwKLQkJCXByaXYtPmRwX291dF9idWZfbGVuICk7Ci0KLQkJaWYoIChyZXQ9dXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKSkgPT0gMCApIHsKKwkJbWVtY3B5KHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKzIsIHByaXYtPmRwX291dF9idWYsCisJCQlwcml2LT5kcF9vdXRfYnVmX2xlbik7CisJCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKSkgPT0gMCkgewogCQkJcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSA9IDE7CiAJCQlwcml2LT5kcF9vdXRfYnVmX2xlbiA9IDA7CiAJCX0KLQogCX0KLQogCS8qIHdha2UgdXAgcHJvY2Vzc2VzIHNsZWVwaW5nIG9uIHdyaXRlcyBpbW1lZGlhdGVseSAqLwotCWRpZ2lfd2FrZXVwX3dyaXRlKCBwb3J0ICk7Ci0KKwlkaWdpX3dha2V1cF93cml0ZShwb3J0KTsKIAkvKiBhbHNvIHF1ZXVlIHVwIGEgd2FrZXVwIGF0IHNjaGVkdWxlciB0aW1lLCBpbiBjYXNlIHdlICovCiAJLyogbG9zdCB0aGUgcmFjZSBpbiB3cml0ZV9jaGFuKCkuICovCiAJc2NoZWR1bGVfd29yaygmcHJpdi0+ZHBfd2FrZXVwX3dvcmspOwogCi0Jc3Bpbl91bmxvY2soICZwcml2LT5kcF9wb3J0X2xvY2sgKTsKLQotCWlmKCByZXQgKSB7Ci0JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwgX19GVU5DVElPTl9fLAotCQkJcmV0LCBwcml2LT5kcF9wb3J0X251bSApOwotCX0KLQorCXNwaW5fdW5sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOworCWlmIChyZXQpCisJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwKKwkJCV9fRlVOQ1RJT05fXywgcmV0LCBwcml2LT5kcF9wb3J0X251bSk7CiB9CiAKLQotc3RhdGljIGludCBkaWdpX3dyaXRlX3Jvb20oIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKQorc3RhdGljIGludCBkaWdpX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAogCWludCByb29tOwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKLQotCWlmKCBwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKLQl8fCBwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlICkKKwlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8IHByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpCiAJCXJvb20gPSAwOwogCWVsc2UKIAkJcm9vbSA9IHBvcnQtPmJ1bGtfb3V0X3NpemUgLSAyIC0gcHJpdi0+ZHBfb3V0X2J1Zl9sZW47CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCi1kYmcoICJkaWdpX3dyaXRlX3Jvb206IHBvcnQ9JWQsIHJvb209JWQiLCBwcml2LT5kcF9wb3J0X251bSwgcm9vbSApOwotCXJldHVybiggcm9vbSApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOworCWRiZygiZGlnaV93cml0ZV9yb29tOiBwb3J0PSVkLCByb29tPSVkIiwgcHJpdi0+ZHBfcG9ydF9udW0sIHJvb20pOworCXJldHVybiByb29tOwogCiB9CiAKLQotc3RhdGljIGludCBkaWdpX2NoYXJzX2luX2J1ZmZlciggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCApCitzdGF0aWMgaW50IGRpZ2lfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAKLQlpZiggcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTCi0JfHwgcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSApIHsKLWRiZyggImRpZ2lfY2hhcnNfaW5fYnVmZmVyOiBwb3J0PSVkLCBjaGFycz0lZCIsIHByaXYtPmRwX3BvcnRfbnVtLCBwb3J0LT5idWxrX291dF9zaXplIC0gMiApOwotCQkvKiByZXR1cm4oIHBvcnQtPmJ1bGtfb3V0X3NpemUgLSAyICk7ICovCi0JCXJldHVybiggMjU2ICk7CisJaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUworCSAgICB8fCBwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CisJCWRiZygiZGlnaV9jaGFyc19pbl9idWZmZXI6IHBvcnQ9JWQsIGNoYXJzPSVkIiwKKwkJCXByaXYtPmRwX3BvcnRfbnVtLCBwb3J0LT5idWxrX291dF9zaXplIC0gMik7CisJCS8qIHJldHVybihwb3J0LT5idWxrX291dF9zaXplIC0gMik7ICovCisJCXJldHVybiAyNTY7CiAJfSBlbHNlIHsKLWRiZyggImRpZ2lfY2hhcnNfaW5fYnVmZmVyOiBwb3J0PSVkLCBjaGFycz0lZCIsIHByaXYtPmRwX3BvcnRfbnVtLCBwcml2LT5kcF9vdXRfYnVmX2xlbiApOwotCQlyZXR1cm4oIHByaXYtPmRwX291dF9idWZfbGVuICk7CisJCWRiZygiZGlnaV9jaGFyc19pbl9idWZmZXI6IHBvcnQ9JWQsIGNoYXJzPSVkIiwKKwkJCXByaXYtPmRwX3BvcnRfbnVtLCBwcml2LT5kcF9vdXRfYnVmX2xlbik7CisJCXJldHVybiBwcml2LT5kcF9vdXRfYnVmX2xlbjsKIAl9CiAKIH0KIAogCi1zdGF0aWMgaW50IGRpZ2lfb3Blbiggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHAgKQorc3RhdGljIGludCBkaWdpX29wZW4oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0KIAlpbnQgcmV0OwogCXVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCBrdGVybWlvcyBub3RfdGVybWlvczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAotCi1kYmcoICJkaWdpX29wZW46IFRPUDogcG9ydD0lZCwgb3Blbl9jb3VudD0lZCIsIHByaXYtPmRwX3BvcnRfbnVtLCBwb3J0LT5vcGVuX2NvdW50ICk7CisJZGJnKCJkaWdpX29wZW46IFRPUDogcG9ydD0lZCwgb3Blbl9jb3VudD0lZCIsCisJCXByaXYtPmRwX3BvcnRfbnVtLCBwb3J0LT5vcGVuX2NvdW50KTsKIAogCS8qIGJlIHN1cmUgdGhlIGRldmljZSBpcyBzdGFydGVkIHVwICovCi0JaWYoIGRpZ2lfc3RhcnR1cF9kZXZpY2UoIHBvcnQtPnNlcmlhbCApICE9IDAgKQotCQlyZXR1cm4oIC1FTlhJTyApOworCWlmIChkaWdpX3N0YXJ0dXBfZGV2aWNlKHBvcnQtPnNlcmlhbCkgIT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAogCS8qIGRvbid0IHdhaXQgb24gYSBjbG9zZSBpbiBwcm9ncmVzcyBmb3Igbm9uLWJsb2NraW5nIG9wZW5zICovCi0JaWYoIHByaXYtPmRwX2luX2Nsb3NlICYmIChmaWxwLT5mX2ZsYWdzJihPX05ERUxBWXxPX05PTkJMT0NLKSkgPT0gMCApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKLQkJcmV0dXJuKCAtRUFHQUlOICk7CisJaWYgKHByaXYtPmRwX2luX2Nsb3NlICYmIChmaWxwLT5mX2ZsYWdzJihPX05ERUxBWXxPX05PTkJMT0NLKSkgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CiAJfQogCiAJLyogd2FpdCBmb3IgYSBjbG9zZSBpbiBwcm9ncmVzcyB0byBmaW5pc2ggKi8KLQl3aGlsZSggcHJpdi0+ZHBfaW5fY2xvc2UgKSB7CisJd2hpbGUocHJpdi0+ZHBfaW5fY2xvc2UpIHsKIAkJY29uZF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dF9pcnFyZXN0b3JlKAogCQkJJnByaXYtPmRwX2Nsb3NlX3dhaXQsIERJR0lfUkVUUllfVElNRU9VVCwKLQkJCSZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7Ci0JCWlmKCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSApIHsKLQkJCXJldHVybiggLUVJTlRSICk7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoICZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzICk7CisJCQkmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRUlOVFI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogIAogCS8qIHJlYWQgbW9kZW0gc2lnbmFscyBhdXRvbWF0aWNhbGx5IHdoZW5ldmVyIHRoZXkgY2hhbmdlICovCiAJYnVmWzBdID0gRElHSV9DTURfUkVBRF9JTlBVVF9TSUdOQUxTOwpAQCAtMTQ4NiwyMyArMTM4MSwyMiBAQAogCWJ1Zls2XSA9IERJR0lfRkxVU0hfVFggfCBESUdJX0ZMVVNIX1JYOwogCWJ1Zls3XSA9IDA7CiAKLQlpZiggKHJldD1kaWdpX3dyaXRlX29vYl9jb21tYW5kKCBwb3J0LCBidWYsIDgsIDEgKSkgIT0gMCApCi0JCWRiZyggImRpZ2lfb3Blbjogd3JpdGUgb29iIGZhaWxlZCwgcmV0PSVkIiwgcmV0ICk7CisJaWYgKChyZXQgPSBkaWdpX3dyaXRlX29vYl9jb21tYW5kKHBvcnQsIGJ1ZiwgOCwgMSkpICE9IDApCisJCWRiZygiZGlnaV9vcGVuOiB3cml0ZSBvb2IgZmFpbGVkLCByZXQ9JWQiLCByZXQpOwogCiAJLyogc2V0IHRlcm1pb3Mgc2V0dGluZ3MgKi8KIAlub3RfdGVybWlvcy5jX2NmbGFnID0gfnBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlub3RfdGVybWlvcy5jX2lmbGFnID0gfnBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKLQlkaWdpX3NldF90ZXJtaW9zKCBwb3J0LCAmbm90X3Rlcm1pb3MgKTsKKwlkaWdpX3NldF90ZXJtaW9zKHBvcnQsICZub3RfdGVybWlvcyk7CiAKIAkvKiBzZXQgRFRSIGFuZCBSVFMgKi8KLQlkaWdpX3NldF9tb2RlbV9zaWduYWxzKCBwb3J0LCBUSU9DTV9EVFJ8VElPQ01fUlRTLCAxICk7CisJZGlnaV9zZXRfbW9kZW1fc2lnbmFscyhwb3J0LCBUSU9DTV9EVFJ8VElPQ01fUlRTLCAxKTsKIAotCXJldHVybiggMCApOwotCisJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIHZvaWQgZGlnaV9jbG9zZSggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHAgKQorc3RhdGljIHZvaWQgZGlnaV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlpbnQgcmV0OwpAQCAtMTUxMSw0MCArMTQwNSwzNyBAQAogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQotZGJnKCAiZGlnaV9jbG9zZTogVE9QOiBwb3J0PSVkLCBvcGVuX2NvdW50PSVkIiwgcHJpdi0+ZHBfcG9ydF9udW0sIHBvcnQtPm9wZW5fY291bnQgKTsKLQorCWRiZygiZGlnaV9jbG9zZTogVE9QOiBwb3J0PSVkLCBvcGVuX2NvdW50PSVkIiwKKwkJcHJpdi0+ZHBfcG9ydF9udW0sIHBvcnQtPm9wZW5fY291bnQpOwogCiAJLyogaWYgZGlzY29ubmVjdGVkLCBqdXN0IGNsZWFyIGZsYWdzICovCiAJaWYgKCF1c2JfZ2V0X2ludGZkYXRhKHBvcnQtPnNlcmlhbC0+aW50ZXJmYWNlKSkKIAkJZ290byBleGl0OwogCiAJLyogZG8gY2xlYW51cCBvbmx5IGFmdGVyIGZpbmFsIGNsb3NlIG9uIHRoaXMgcG9ydCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlwcml2LT5kcF9pbl9jbG9zZSA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAogCS8qIHRlbGwgbGluZSBkaXNjaXBsaW5lIHRvIHByb2Nlc3Mgb25seSBYT04vWE9GRiAqLwogCXR0eS0+Y2xvc2luZyA9IDE7CiAKIAkvKiB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4gKi8KLQlpZiggKGZpbHAtPmZfZmxhZ3MmKE9fTkRFTEFZfE9fTk9OQkxPQ0spKSA9PSAwICkgewotCQl0dHlfd2FpdF91bnRpbF9zZW50KCB0dHksIERJR0lfQ0xPU0VfVElNRU9VVCApOwotCX0KKwlpZiAoKGZpbHAtPmZfZmxhZ3MmKE9fTkRFTEFZfE9fTk9OQkxPQ0spKSA9PSAwKQorCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgRElHSV9DTE9TRV9USU1FT1VUKTsKIAogCS8qIGZsdXNoIGRyaXZlciBhbmQgbGluZSBkaXNjaXBsaW5lIGJ1ZmZlcnMgKi8KLQlpZiggdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlciApCi0JCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIoIHR0eSApOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CiAKIAlpZiAocG9ydC0+c2VyaWFsLT5kZXYpIHsKIAkJLyogd2FpdCBmb3IgdHJhbnNtaXQgaWRsZSAqLwotCQlpZiggKGZpbHAtPmZfZmxhZ3MmKE9fTkRFTEFZfE9fTk9OQkxPQ0spKSA9PSAwICkgewotCQkJZGlnaV90cmFuc21pdF9pZGxlKCBwb3J0LCBESUdJX0NMT1NFX1RJTUVPVVQgKTsKKwkJaWYgKChmaWxwLT5mX2ZsYWdzJihPX05ERUxBWXxPX05PTkJMT0NLKSkgPT0gMCkgeworCQkJZGlnaV90cmFuc21pdF9pZGxlKHBvcnQsIERJR0lfQ0xPU0VfVElNRU9VVCk7CiAJCX0KLQogCQkvKiBkcm9wIERUUiBhbmQgUlRTICovCi0JCWRpZ2lfc2V0X21vZGVtX3NpZ25hbHMoIHBvcnQsIDAsIDAgKTsKKwkJZGlnaV9zZXRfbW9kZW1fc2lnbmFscyhwb3J0LCAwLCAwKTsKIAogCQkvKiBkaXNhYmxlIGlucHV0IGZsb3cgY29udHJvbCAqLwogCQlidWZbMF0gPSBESUdJX0NNRF9TRVRfSU5QVVRfRkxPV19DT05UUk9MOwpAQCAtMTU3Niw4ICsxNDY3LDggQEAKIAkJYnVmWzE4XSA9IERJR0lfRkxVU0hfVFggfCBESUdJX0ZMVVNIX1JYOwogCQlidWZbMTldID0gMDsKIAotCQlpZiggKHJldD1kaWdpX3dyaXRlX29vYl9jb21tYW5kKCBwb3J0LCBidWYsIDIwLCAwICkpICE9IDAgKQotCQkJZGJnKCAiZGlnaV9jbG9zZTogd3JpdGUgb29iIGZhaWxlZCwgcmV0PSVkIiwgcmV0ICk7CisJCWlmICgocmV0ID0gZGlnaV93cml0ZV9vb2JfY29tbWFuZChwb3J0LCBidWYsIDIwLCAwKSkgIT0gMCkKKwkJCWRiZygiZGlnaV9jbG9zZTogd3JpdGUgb29iIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKIAogCQkvKiB3YWl0IGZvciBmaW5hbCBjb21tYW5kcyBvbiBvb2IgcG9ydCB0byBjb21wbGV0ZSAqLwogCQlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPmRwX2ZsdXNoX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtMTU4NywxNyArMTQ3OCwxNCBAQAogCQkvKiBzaHV0ZG93biBhbnkgb3V0c3RhbmRpbmcgYnVsayB3cml0ZXMgKi8KIAkJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJfQotCiAJdHR5LT5jbG9zaW5nID0gMDsKLQogZXhpdDoKLQlzcGluX2xvY2tfaXJxc2F2ZSggJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MgKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSA9IDA7CiAJcHJpdi0+ZHBfaW5fY2xvc2UgPSAwOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSggJnByaXYtPmRwX2Nsb3NlX3dhaXQgKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwotCi1kYmcoICJkaWdpX2Nsb3NlOiBkb25lIiApOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZHBfY2xvc2Vfd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CisJZGJnKCJkaWdpX2Nsb3NlOiBkb25lIik7CiB9CiAKIApAQCAtMTYwOCwxNTUgKzE0OTYsMTM2IEBACiAqICB1cmJzIGluaXRpYWxpemVkLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG5vbi16ZXJvIGVycm9yIG90aGVyd2lzZS4KICovCiAKLXN0YXRpYyBpbnQgZGlnaV9zdGFydHVwX2RldmljZSggc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCApCitzdGF0aWMgaW50IGRpZ2lfc3RhcnR1cF9kZXZpY2Uoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQogCWludCBpLHJldCA9IDA7CiAJc3RydWN0IGRpZ2lfc2VyaWFsICpzZXJpYWxfcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCi0KIAkvKiBiZSBzdXJlIHRoaXMgaGFwcGVucyBleGFjdGx5IG9uY2UgKi8KLQlzcGluX2xvY2soICZzZXJpYWxfcHJpdi0+ZHNfc2VyaWFsX2xvY2sgKTsKLQlpZiggc2VyaWFsX3ByaXYtPmRzX2RldmljZV9zdGFydGVkICkgewotCQlzcGluX3VubG9jayggJnNlcmlhbF9wcml2LT5kc19zZXJpYWxfbG9jayApOwotCQlyZXR1cm4oIDAgKTsKKwlzcGluX2xvY2soJnNlcmlhbF9wcml2LT5kc19zZXJpYWxfbG9jayk7CisJaWYgKHNlcmlhbF9wcml2LT5kc19kZXZpY2Vfc3RhcnRlZCkgeworCQlzcGluX3VubG9jaygmc2VyaWFsX3ByaXYtPmRzX3NlcmlhbF9sb2NrKTsKKwkJcmV0dXJuIDA7CiAJfQogCXNlcmlhbF9wcml2LT5kc19kZXZpY2Vfc3RhcnRlZCA9IDE7Ci0Jc3Bpbl91bmxvY2soICZzZXJpYWxfcHJpdi0+ZHNfc2VyaWFsX2xvY2sgKTsKKwlzcGluX3VubG9jaygmc2VyaWFsX3ByaXYtPmRzX3NlcmlhbF9sb2NrKTsKIAogCS8qIHN0YXJ0IHJlYWRpbmcgZnJvbSBlYWNoIGJ1bGsgaW4gZW5kcG9pbnQgZm9yIHRoZSBkZXZpY2UgKi8KIAkvKiBzZXQgVVNCX0RJU0FCTEVfU1BEIGZsYWcgZm9yIHdyaXRlIGJ1bGsgdXJicyAqLwotCWZvciggaT0wOyBpPHNlcmlhbC0+dHlwZS0+bnVtX3BvcnRzKzE7IGkrKyApIHsKLQorCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPnR5cGUtPm51bV9wb3J0cyArIDE7IGkrKykgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwotCiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0KLQkJaWYoIChyZXQ9dXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpKSAhPSAwICkgewotCQkJZXJyKCIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkLCByZXQ9JWQsIHBvcnQ9JWQiLCBfX0ZVTkNUSU9OX18sCi0JCQlyZXQsIGkgKTsKKwkJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCkpICE9IDApIHsKKwkJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCwgcmV0PSVkLCBwb3J0PSVkIiwKKwkJCQkJX19GVU5DVElPTl9fLCByZXQsIGkpOwogCQkJYnJlYWs7CiAJCX0KLQogCX0KLQotCXJldHVybiggcmV0ICk7Ci0KKwlyZXR1cm4gcmV0OwogfQogCiAKLXN0YXRpYyBpbnQgZGlnaV9zdGFydHVwKCBzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsICkKK3N0YXRpYyBpbnQgZGlnaV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAKIAlpbnQgaTsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2OwogCXN0cnVjdCBkaWdpX3NlcmlhbCAqc2VyaWFsX3ByaXY7CiAKLQotZGJnKCAiZGlnaV9zdGFydHVwOiBUT1AiICk7CisJZGJnKCJkaWdpX3N0YXJ0dXA6IFRPUCIpOwogCiAJLyogYWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhbGwgcG9ydHMgKi8KIAkvKiBudW1iZXIgb2YgcmVndWxhciBwb3J0cyArIDEgZm9yIHRoZSBvdXQtb2YtYmFuZCBwb3J0ICovCi0JZm9yKCBpPTA7IGk8c2VyaWFsLT50eXBlLT5udW1fcG9ydHMrMTsgaSsrICkgewotCisJZm9yKGkgPSAwOyBpIDwgc2VyaWFsLT50eXBlLT5udW1fcG9ydHMgKyAxOyBpKyspIHsKIAkJLyogYWxsb2NhdGUgcG9ydCBwcml2YXRlIHN0cnVjdHVyZSAqLwotCQlwcml2ID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBkaWdpX3BvcnQpLAotCQkJR0ZQX0tFUk5FTCApOwotCQlpZiggcHJpdiA9PSAoc3RydWN0IGRpZ2lfcG9ydCAqKTAgKSB7Ci0JCQl3aGlsZSggLS1pID49IDAgKQotCQkJCWtmcmVlKCB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKSApOwotCQkJcmV0dXJuKCAxICk7CQkJLyogZXJyb3IgKi8KKwkJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWdpX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHByaXYgPT0gTlVMTCkgeworCQkJd2hpbGUgKC0taSA+PSAwKQorCQkJCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pKTsKKwkJCXJldHVybiAxOwkJCS8qIGVycm9yICovCiAJCX0KIAogCQkvKiBpbml0aWFsaXplIHBvcnQgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQkJc3Bpbl9sb2NrX2luaXQoICZwcml2LT5kcF9wb3J0X2xvY2sgKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmRwX3BvcnRfbG9jayk7CiAJCXByaXYtPmRwX3BvcnRfbnVtID0gaTsKIAkJcHJpdi0+ZHBfb3V0X2J1Zl9sZW4gPSAwOwogCQlwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJcHJpdi0+ZHBfbW9kZW1fc2lnbmFscyA9IDA7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoICZwcml2LT5kcF9tb2RlbV9jaGFuZ2Vfd2FpdCApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5kcF9tb2RlbV9jaGFuZ2Vfd2FpdCk7CiAJCXByaXYtPmRwX3RyYW5zbWl0X2lkbGUgPSAwOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmcHJpdi0+ZHBfdHJhbnNtaXRfaWRsZV93YWl0ICk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRwX3RyYW5zbWl0X2lkbGVfd2FpdCk7CiAJCXByaXYtPmRwX3Rocm90dGxlZCA9IDA7CiAJCXByaXYtPmRwX3Rocm90dGxlX3Jlc3RhcnQgPSAwOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmcHJpdi0+ZHBfZmx1c2hfd2FpdCApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5kcF9mbHVzaF93YWl0KTsKIAkJcHJpdi0+ZHBfaW5fY2xvc2UgPSAwOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmcHJpdi0+ZHBfY2xvc2Vfd2FpdCApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5kcF9jbG9zZV93YWl0KTsKIAkJSU5JVF9XT1JLKCZwcml2LT5kcF93YWtldXBfd29yaywgZGlnaV93YWtldXBfd3JpdGVfbG9jayk7CiAJCXByaXYtPmRwX3BvcnQgPSBzZXJpYWwtPnBvcnRbaV07Ci0KIAkJLyogaW5pdGlhbGl6ZSB3cml0ZSB3YWl0IHF1ZXVlIGZvciB0aGlzIHBvcnQgKi8KLQkJaW5pdF93YWl0cXVldWVfaGVhZCggJnNlcmlhbC0+cG9ydFtpXS0+d3JpdGVfd2FpdCApOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJpYWwtPnBvcnRbaV0tPndyaXRlX3dhaXQpOwogCiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0sIHByaXYpOwogCX0KIAogCS8qIGFsbG9jYXRlIHNlcmlhbCBwcml2YXRlIHN0cnVjdHVyZSAqLwotCXNlcmlhbF9wcml2ID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBkaWdpX3NlcmlhbCksCi0JCUdGUF9LRVJORUwgKTsKLQlpZiggc2VyaWFsX3ByaXYgPT0gKHN0cnVjdCBkaWdpX3NlcmlhbCAqKTAgKSB7Ci0JCWZvciggaT0wOyBpPHNlcmlhbC0+dHlwZS0+bnVtX3BvcnRzKzE7IGkrKyApCi0JCQlrZnJlZSggdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSkgKTsKLQkJcmV0dXJuKCAxICk7CQkJLyogZXJyb3IgKi8KKwlzZXJpYWxfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWdpX3NlcmlhbCksIEdGUF9LRVJORUwpOworCWlmIChzZXJpYWxfcHJpdiA9PSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPnR5cGUtPm51bV9wb3J0cyArIDE7IGkrKykKKwkJCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pKTsKKwkJcmV0dXJuIDE7CQkJLyogZXJyb3IgKi8KIAl9CiAKIAkvKiBpbml0aWFsaXplIHNlcmlhbCBwcml2YXRlIHN0cnVjdHVyZSAqLwotCXNwaW5fbG9ja19pbml0KCAmc2VyaWFsX3ByaXYtPmRzX3NlcmlhbF9sb2NrICk7CisJc3Bpbl9sb2NrX2luaXQoJnNlcmlhbF9wcml2LT5kc19zZXJpYWxfbG9jayk7CiAJc2VyaWFsX3ByaXYtPmRzX29vYl9wb3J0X251bSA9IHNlcmlhbC0+dHlwZS0+bnVtX3BvcnRzOwogCXNlcmlhbF9wcml2LT5kc19vb2JfcG9ydCA9IHNlcmlhbC0+cG9ydFtzZXJpYWxfcHJpdi0+ZHNfb29iX3BvcnRfbnVtXTsKIAlzZXJpYWxfcHJpdi0+ZHNfZGV2aWNlX3N0YXJ0ZWQgPSAwOwogCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBzZXJpYWxfcHJpdik7CiAKLQlyZXR1cm4oIDAgKTsKLQorCXJldHVybiAwOwogfQogCiAKLXN0YXRpYyB2b2lkIGRpZ2lfc2h1dGRvd24oIHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgKQorc3RhdGljIHZvaWQgZGlnaV9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewotCiAJaW50IGk7Ci0KLQotZGJnKCAiZGlnaV9zaHV0ZG93bjogVE9QLCBpbl9pbnRlcnJ1cHQoKT0lbGQiLCBpbl9pbnRlcnJ1cHQoKSApOworCWRiZygiZGlnaV9zaHV0ZG93bjogVE9QLCBpbl9pbnRlcnJ1cHQoKT0lbGQiLCBpbl9pbnRlcnJ1cHQoKSk7CiAKIAkvKiBzdG9wIHJlYWRzIGFuZCB3cml0ZXMgb24gYWxsIHBvcnRzICovCi0JZm9yKCBpPTA7IGk8c2VyaWFsLT50eXBlLT5udW1fcG9ydHMrMTsgaSsrICkgeworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPnR5cGUtPm51bV9wb3J0cyArIDE7IGkrKykgewogCQl1c2Jfa2lsbF91cmIoc2VyaWFsLT5wb3J0W2ldLT5yZWFkX3VyYik7CiAJCXVzYl9raWxsX3VyYihzZXJpYWwtPnBvcnRbaV0tPndyaXRlX3VyYik7CiAJfQogCiAJLyogZnJlZSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGFsbCBwb3J0cyAqLwogCS8qIG51bWJlciBvZiByZWd1bGFyIHBvcnRzICsgMSBmb3IgdGhlIG91dC1vZi1iYW5kIHBvcnQgKi8KLQlmb3IoIGk9MDsgaTxzZXJpYWwtPnR5cGUtPm51bV9wb3J0cysxOyBpKysgKQotCQlrZnJlZSggdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSkgKTsKLQlrZnJlZSggdXNiX2dldF9zZXJpYWxfZGF0YShzZXJpYWwpICk7CisJZm9yKGkgPSAwOyBpIDwgc2VyaWFsLT50eXBlLT5udW1fcG9ydHMgKyAxOyBpKyspCisJCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0pKTsKKwlrZnJlZSh1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCkpOwogfQogCiAKLXN0YXRpYyB2b2lkIGRpZ2lfcmVhZF9idWxrX2NhbGxiYWNrKCBzdHJ1Y3QgdXJiICp1cmIgKQorc3RhdGljIHZvaWQgZGlnaV9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXY7CiAJc3RydWN0IGRpZ2lfc2VyaWFsICpzZXJpYWxfcHJpdjsKIAlpbnQgcmV0OwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCi1kYmcoICJkaWdpX3JlYWRfYnVsa19jYWxsYmFjazogVE9QIiApOworCWRiZygiZGlnaV9yZWFkX2J1bGtfY2FsbGJhY2s6IFRPUCIpOwogCiAJLyogcG9ydCBzYW5pdHkgY2hlY2ssIGRvIG5vdCByZXN1Ym1pdCBpZiBwb3J0IGlzIG5vdCB2YWxpZCAqLwotCWlmKCBwb3J0ID09IE5VTEwgfHwgKHByaXY9dXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpKSA9PSBOVUxMICkgeworCWlmIChwb3J0ID09IE5VTEwgfHwgKHByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwpIHsKIAkJZXJyKCIlczogcG9ydCBvciBwb3J0LT5wcml2YXRlIGlzIE5VTEwsIHN0YXR1cz0lZCIsCiAJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9Ci0JaWYoIHBvcnQtPnNlcmlhbCA9PSBOVUxMCi0JfHwgKHNlcmlhbF9wcml2PXVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKSkgPT0gTlVMTCApIHsKKwlpZiAocG9ydC0+c2VyaWFsID09IE5VTEwgfHwKKwkJKHNlcmlhbF9wcml2PXVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKSkgPT0gTlVMTCkgewogCQllcnIoIiVzOiBzZXJpYWwgaXMgYmFkIG9yIHNlcmlhbC0+cHJpdmF0ZSBpcyBOVUxMLCBzdGF0dXM9JWQiLAotCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNzY4LDI0ICsxNjM3LDIzIEBACiAJfQogCiAJLyogaGFuZGxlIG9vYiBvciBpbmIgY2FsbGJhY2ssIGRvIG5vdCByZXN1Ym1pdCBpZiBlcnJvciAqLwotCWlmKCBwcml2LT5kcF9wb3J0X251bSA9PSBzZXJpYWxfcHJpdi0+ZHNfb29iX3BvcnRfbnVtICkgewotCQlpZiggZGlnaV9yZWFkX29vYl9jYWxsYmFjayggdXJiICkgIT0gMCApCisJaWYgKHByaXYtPmRwX3BvcnRfbnVtID09IHNlcmlhbF9wcml2LT5kc19vb2JfcG9ydF9udW0pIHsKKwkJaWYgKGRpZ2lfcmVhZF9vb2JfY2FsbGJhY2sodXJiKSAhPSAwKQogCQkJcmV0dXJuOwogCX0gZWxzZSB7Ci0JCWlmKCBkaWdpX3JlYWRfaW5iX2NhbGxiYWNrKCB1cmIgKSAhPSAwICkKKwkJaWYgKGRpZ2lfcmVhZF9pbmJfY2FsbGJhY2sodXJiKSAhPSAwKQogCQkJcmV0dXJuOwogCX0KIAogCS8qIGNvbnRpbnVlIHJlYWQgKi8KIAl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwotCWlmKCAocmV0PXVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDAgKSB7Ci0JCWVycigiJXM6IGZhaWxlZCByZXN1Ym1pdHRpbmcgdXJiLCByZXQ9JWQsIHBvcnQ9JWQiLCBfX0ZVTkNUSU9OX18sCi0JCQlyZXQsIHByaXYtPmRwX3BvcnRfbnVtICk7CisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSAhPSAwKSB7CisJCWVycigiJXM6IGZhaWxlZCByZXN1Ym1pdHRpbmcgdXJiLCByZXQ9JWQsIHBvcnQ9JWQiLAorCQkgICAgX19GVU5DVElPTl9fLCByZXQsIHByaXYtPmRwX3BvcnRfbnVtKTsKIAl9CiAKIH0KIAotCiAvKiAKICogIERpZ2kgUmVhZCBJTkIgQ2FsbGJhY2sKICoKQEAgLTE3OTYsNyArMTY2NCw3IEBACiAqICB0aHJvdHRsZWQsIGFuZCAtMSBpZiB0aGUgc2FuaXR5IGNoZWNrcyBmYWlsZWQuCiAqLwogCi1zdGF0aWMgaW50IGRpZ2lfcmVhZF9pbmJfY2FsbGJhY2soIHN0cnVjdCB1cmIgKnVyYiApCitzdGF0aWMgaW50IGRpZ2lfcmVhZF9pbmJfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwpAQCAtMTgxMiw3MiArMTY4MCw2NyBAQAogCiAJLyogZG8gbm90IHByb2Nlc3MgY2FsbGJhY2tzIG9uIGNsb3NlZCBwb3J0cyAqLwogCS8qIGJ1dCBkbyBjb250aW51ZSB0aGUgcmVhZCBjaGFpbiAqLwotCWlmKCBwb3J0LT5vcGVuX2NvdW50ID09IDAgKQotCQlyZXR1cm4oIDAgKTsKKwlpZiAocG9ydC0+b3Blbl9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKIAogCS8qIHNob3J0L211bHRpcGxlIHBhY2tldCBjaGVjayAqLwotCWlmKCB1cmItPmFjdHVhbF9sZW5ndGggIT0gbGVuICsgMiApIHsKLQkJZXJyKCIlczogSU5DT01QTEVURSBPUiBNVUxUSVBMRSBQQUNLRVQsIHVyYiBzdGF0dXM9JWQsICIKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IGxlbiArIDIpIHsKKyAgICAgCQllcnIoIiVzOiBJTkNPTVBMRVRFIE9SIE1VTFRJUExFIFBBQ0tFVCwgdXJiLT5zdGF0dXM9JWQsICIKIAkJICAgICJwb3J0PSVkLCBvcGNvZGU9JWQsIGxlbj0lZCwgYWN0dWFsX2xlbmd0aD0lZCwgIgotCQkgICAgInBvcnRfc3RhdHVzPSVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMsIHByaXYtPmRwX3BvcnRfbnVtLAorCQkgICAgInN0YXR1cz0lZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzLCBwcml2LT5kcF9wb3J0X251bSwKIAkJICAgIG9wY29kZSwgbGVuLCB1cmItPmFjdHVhbF9sZW5ndGgsIHBvcnRfc3RhdHVzKTsKLQkJcmV0dXJuKCAtMSApOworCQlyZXR1cm4gLTE7CiAJfQogCi0Jc3Bpbl9sb2NrKCAmcHJpdi0+ZHBfcG9ydF9sb2NrICk7CisJc3Bpbl9sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCiAJLyogY2hlY2sgZm9yIHRocm90dGxlOyBpZiBzZXQsIGRvIG5vdCByZXN1Ym1pdCByZWFkIHVyYiAqLwogCS8qIGluZGljYXRlIHRoZSByZWFkIGNoYWluIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBvbiB1bnRocm90dGxlICovCiAJdGhyb3R0bGVkID0gcHJpdi0+ZHBfdGhyb3R0bGVkOwotCWlmKCB0aHJvdHRsZWQgKQorCWlmICh0aHJvdHRsZWQpCiAJCXByaXYtPmRwX3Rocm90dGxlX3Jlc3RhcnQgPSAxOwogCiAJLyogcmVjZWl2ZSBkYXRhICovCi0JaWYoIG9wY29kZSA9PSBESUdJX0NNRF9SRUNFSVZFX0RBVEEgKSB7Ci0KKwlpZiAob3Bjb2RlID09IERJR0lfQ01EX1JFQ0VJVkVfREFUQSkgewogCQkvKiBnZXQgZmxhZyBmcm9tIHBvcnRfc3RhdHVzICovCiAJCWZsYWcgPSAwOwogCiAJCS8qIG92ZXJydW4gaXMgc3BlY2lhbCwgbm90IGFzc29jaWF0ZWQgd2l0aCBhIGNoYXIgKi8KLQkJaWYgKHBvcnRfc3RhdHVzICYgRElHSV9PVkVSUlVOX0VSUk9SKSB7Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhciggdHR5LCAwLCBUVFlfT1ZFUlJVTiApOwotCQl9CisJCWlmIChwb3J0X3N0YXR1cyAmIERJR0lfT1ZFUlJVTl9FUlJPUikKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCiAJCS8qIGJyZWFrIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwYXJpdHksICovCiAJCS8qIHdoaWNoIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBmcmFtaW5nIGVycm9ycyAqLwotCQlpZiAocG9ydF9zdGF0dXMgJiBESUdJX0JSRUFLX0VSUk9SKSB7CisJCWlmIChwb3J0X3N0YXR1cyAmIERJR0lfQlJFQUtfRVJST1IpCiAJCQlmbGFnID0gVFRZX0JSRUFLOwotCQl9IGVsc2UgaWYgKHBvcnRfc3RhdHVzICYgRElHSV9QQVJJVFlfRVJST1IpIHsKKwkJZWxzZSBpZiAocG9ydF9zdGF0dXMgJiBESUdJX1BBUklUWV9FUlJPUikKIAkJCWZsYWcgPSBUVFlfUEFSSVRZOwotCQl9IGVsc2UgaWYgKHBvcnRfc3RhdHVzICYgRElHSV9GUkFNSU5HX0VSUk9SKSB7CisJCWVsc2UgaWYgKHBvcnRfc3RhdHVzICYgRElHSV9GUkFNSU5HX0VSUk9SKQogCQkJZmxhZyA9IFRUWV9GUkFNRTsKLQkJfQogCiAJCS8qIGRhdGEgbGVuZ3RoIGlzIGxlbi0xIChvbmUgYnl0ZSBvZiBsZW4gaXMgcG9ydF9zdGF0dXMpICovCiAJCS0tbGVuOwogCiAJCWxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuKTsKLQkJaWYoIGxlbiA+IDAgKSB7CisJCWlmIChsZW4gPiAwKSB7CiAJCQkvKiBIb3QgcGF0aCAqLwotCQkJaWYoZmxhZyA9PSBUVFlfTk9STUFMKQorCQkJaWYgKGZsYWcgPT0gVFRZX05PUk1BTCkKIAkJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgbGVuKTsKIAkJCWVsc2UgewogCQkJCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQogCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbaV0sIGZsYWcpOwogCQkJfQotCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goIHR0eSApOworCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJfQogCX0KKwlzcGluX3VubG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAotCXNwaW5fdW5sb2NrKCAmcHJpdi0+ZHBfcG9ydF9sb2NrICk7CisJaWYgKG9wY29kZSA9PSBESUdJX0NNRF9SRUNFSVZFX0RJU0FCTEUpCisJCWRiZygiJXM6IGdvdCBSRUNFSVZFX0RJU0FCTEUiLCBfX0ZVTkNUSU9OX18pOworCWVsc2UgaWYgKG9wY29kZSAhPSBESUdJX0NNRF9SRUNFSVZFX0RBVEEpCisJCWRiZygiJXM6IHVua25vd24gb3Bjb2RlOiAlZCIsIF9fRlVOQ1RJT05fXywgb3Bjb2RlKTsKIAotCWlmKCBvcGNvZGUgPT0gRElHSV9DTURfUkVDRUlWRV9ESVNBQkxFICkgewotCQlkYmcoIiVzOiBnb3QgUkVDRUlWRV9ESVNBQkxFIiwgX19GVU5DVElPTl9fICk7Ci0JfSBlbHNlIGlmKCBvcGNvZGUgIT0gRElHSV9DTURfUkVDRUlWRV9EQVRBICkgewotCQlkYmcoIiVzOiB1bmtub3duIG9wY29kZTogJWQiLCBfX0ZVTkNUSU9OX18sIG9wY29kZSApOwotCX0KLQotCXJldHVybiggdGhyb3R0bGVkID8gMSA6IDAgKTsKKwlyZXR1cm4odGhyb3R0bGVkID8gMSA6IDApOwogCiB9CiAKQEAgLTE4OTEsNyArMTc1NCw3IEBACiAqICAtMSBpZiB0aGUgc2FuaXR5IGNoZWNrcyBmYWlsZWQuCiAqLwogCi1zdGF0aWMgaW50IGRpZ2lfcmVhZF9vb2JfY2FsbGJhY2soIHN0cnVjdCB1cmIgKnVyYiApCitzdGF0aWMgaW50IGRpZ2lfcmVhZF9vb2JfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwpAQCAtMTkwMCw4NyArMTc2Myw3NSBAQAogCWludCBvcGNvZGUsIGxpbmUsIHN0YXR1cywgdmFsOwogCWludCBpOwogCi0KLWRiZyggImRpZ2lfcmVhZF9vb2JfY2FsbGJhY2s6IHBvcnQ9JWQsIGxlbj0lZCIsIHByaXYtPmRwX3BvcnRfbnVtLAotdXJiLT5hY3R1YWxfbGVuZ3RoICk7CisJZGJnKCJkaWdpX3JlYWRfb29iX2NhbGxiYWNrOiBwb3J0PSVkLCBsZW49JWQiLAorCQkJcHJpdi0+ZHBfcG9ydF9udW0sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAkvKiBoYW5kbGUgZWFjaCBvb2IgY29tbWFuZCAqLwotCWZvciggaT0wOyBpPHVyYi0+YWN0dWFsX2xlbmd0aC0zOyApIHsKLQorCWZvcihpID0gMDsgaSA8IHVyYi0+YWN0dWFsX2xlbmd0aCAtIDM7KSB7CiAJCW9wY29kZSA9ICgodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKVtpKytdOwogCQlsaW5lID0gKCh1bnNpZ25lZCBjaGFyICopdXJiLT50cmFuc2Zlcl9idWZmZXIpW2krK107CiAJCXN0YXR1cyA9ICgodW5zaWduZWQgY2hhciAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyKVtpKytdOwogCQl2YWwgPSAoKHVuc2lnbmVkIGNoYXIgKil1cmItPnRyYW5zZmVyX2J1ZmZlcilbaSsrXTsKIAotZGJnKCAiZGlnaV9yZWFkX29vYl9jYWxsYmFjazogb3Bjb2RlPSVkLCBsaW5lPSVkLCBzdGF0dXM9JWQsIHZhbD0lZCIsCi1vcGNvZGUsIGxpbmUsIHN0YXR1cywgdmFsICk7CisJCWRiZygiZGlnaV9yZWFkX29vYl9jYWxsYmFjazogb3Bjb2RlPSVkLCBsaW5lPSVkLCBzdGF0dXM9JWQsIHZhbD0lZCIsCisJCQlvcGNvZGUsIGxpbmUsIHN0YXR1cywgdmFsKTsKIAotCQlpZiggc3RhdHVzICE9IDAgfHwgbGluZSA+PSBzZXJpYWwtPnR5cGUtPm51bV9wb3J0cyApCisJCWlmIChzdGF0dXMgIT0gMCB8fCBsaW5lID49IHNlcmlhbC0+dHlwZS0+bnVtX3BvcnRzKQogCQkJY29udGludWU7CiAKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtsaW5lXTsKIAotCQlpZiAoKHByaXY9dXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpKSA9PSBOVUxMICkKKwkJaWYgKChwcml2PXVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSkgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAotCQlpZiggb3Bjb2RlID09IERJR0lfQ01EX1JFQURfSU5QVVRfU0lHTkFMUyApIHsKLQotCQkJc3Bpbl9sb2NrKCAmcHJpdi0+ZHBfcG9ydF9sb2NrICk7Ci0KKwkJaWYgKG9wY29kZSA9PSBESUdJX0NNRF9SRUFEX0lOUFVUX1NJR05BTFMpIHsKKwkJCXNwaW5fbG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAkJCS8qIGNvbnZlcnQgZnJvbSBkaWdpIGZsYWdzIHRvIHRlcm1pb3ggZmxhZ3MgKi8KLQkJCWlmKCB2YWwgJiBESUdJX1JFQURfSU5QVVRfU0lHTkFMU19DVFMgKSB7CisJCQlpZiAodmFsICYgRElHSV9SRUFEX0lOUFVUX1NJR05BTFNfQ1RTKSB7CiAJCQkJcHJpdi0+ZHBfbW9kZW1fc2lnbmFscyB8PSBUSU9DTV9DVFM7CiAJCQkJLyogcG9ydCBtdXN0IGJlIG9wZW4gdG8gdXNlIHR0eSBzdHJ1Y3QgKi8KLQkJCQlpZiggcG9ydC0+b3Blbl9jb3VudAotCQkJCSYmIHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgKSB7CisJCQkJaWYgKHBvcnQtPm9wZW5fY291bnQKKwkJCQkJJiYgcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgewogCQkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAwOwotCQkJCQlkaWdpX3dha2V1cF93cml0ZSggcG9ydCApOworCQkJCQlkaWdpX3dha2V1cF93cml0ZShwb3J0KTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXByaXYtPmRwX21vZGVtX3NpZ25hbHMgJj0gflRJT0NNX0NUUzsKIAkJCQkvKiBwb3J0IG11c3QgYmUgb3BlbiB0byB1c2UgdHR5IHN0cnVjdCAqLwotCQkJCWlmKCBwb3J0LT5vcGVuX2NvdW50Ci0JCQkJJiYgcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUyApIHsKKwkJCQlpZiAocG9ydC0+b3Blbl9jb3VudAorCQkJCQkmJiBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CiAJCQkJfQogCQkJfQotCQkJaWYoIHZhbCAmIERJR0lfUkVBRF9JTlBVVF9TSUdOQUxTX0RTUiApCisJCQlpZiAodmFsICYgRElHSV9SRUFEX0lOUFVUX1NJR05BTFNfRFNSKQogCQkJCXByaXYtPmRwX21vZGVtX3NpZ25hbHMgfD0gVElPQ01fRFNSOwogCQkJZWxzZQogCQkJCXByaXYtPmRwX21vZGVtX3NpZ25hbHMgJj0gflRJT0NNX0RTUjsKLQkJCWlmKCB2YWwgJiBESUdJX1JFQURfSU5QVVRfU0lHTkFMU19SSSApCisJCQlpZiAodmFsICYgRElHSV9SRUFEX0lOUFVUX1NJR05BTFNfUkkpCiAJCQkJcHJpdi0+ZHBfbW9kZW1fc2lnbmFscyB8PSBUSU9DTV9SSTsKIAkJCWVsc2UKIAkJCQlwcml2LT5kcF9tb2RlbV9zaWduYWxzICY9IH5USU9DTV9SSTsKLQkJCWlmKCB2YWwgJiBESUdJX1JFQURfSU5QVVRfU0lHTkFMU19EQ0QgKQorCQkJaWYgKHZhbCAmIERJR0lfUkVBRF9JTlBVVF9TSUdOQUxTX0RDRCkKIAkJCQlwcml2LT5kcF9tb2RlbV9zaWduYWxzIHw9IFRJT0NNX0NEOwogCQkJZWxzZQogCQkJCXByaXYtPmRwX21vZGVtX3NpZ25hbHMgJj0gflRJT0NNX0NEOwogCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoICZwcml2LT5kcF9tb2RlbV9jaGFuZ2Vfd2FpdCApOwotCQkJc3Bpbl91bmxvY2soICZwcml2LT5kcF9wb3J0X2xvY2sgKTsKLQotCQl9IGVsc2UgaWYoIG9wY29kZSA9PSBESUdJX0NNRF9UUkFOU01JVF9JRExFICkgewotCi0JCQlzcGluX2xvY2soICZwcml2LT5kcF9wb3J0X2xvY2sgKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZHBfbW9kZW1fY2hhbmdlX3dhaXQpOworCQkJc3Bpbl91bmxvY2soJnByaXYtPmRwX3BvcnRfbG9jayk7CisJCX0gZWxzZSBpZiAob3Bjb2RlID09IERJR0lfQ01EX1RSQU5TTUlUX0lETEUpIHsKKwkJCXNwaW5fbG9jaygmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAkJCXByaXYtPmRwX3RyYW5zbWl0X2lkbGUgPSAxOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmcHJpdi0+ZHBfdHJhbnNtaXRfaWRsZV93YWl0ICk7Ci0JCQlzcGluX3VubG9jayggJnByaXYtPmRwX3BvcnRfbG9jayApOwotCi0JCX0gZWxzZSBpZiggb3Bjb2RlID09IERJR0lfQ01EX0lGTFVTSF9GSUZPICkgewotCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoICZwcml2LT5kcF9mbHVzaF93YWl0ICk7Ci0KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZHBfdHJhbnNtaXRfaWRsZV93YWl0KTsKKwkJCXNwaW5fdW5sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOworCQl9IGVsc2UgaWYgKG9wY29kZSA9PSBESUdJX0NNRF9JRkxVU0hfRklGTykgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kcF9mbHVzaF93YWl0KTsKIAkJfQotCiAJfQotCi0JcmV0dXJuKCAwICk7CisJcmV0dXJuIDA7CiAKIH0KIAotCi1zdGF0aWMgaW50IF9faW5pdCBkaWdpX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkaWdpX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmRpZ2lfYWNjZWxlcG9ydF8yX2RldmljZSk7CkBAIC0yMDAyLDEyICsxODUzLDExIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgZGlnaV9leGl0ICh2b2lkKQogewotCXVzYl9kZXJlZ2lzdGVyICgmZGlnaV9kcml2ZXIpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmRpZ2lfYWNjZWxlcG9ydF8yX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZGlnaV9hY2NlbGVwb3J0XzRfZGV2aWNlKTsKKwl1c2JfZGVyZWdpc3RlcigmZGlnaV9kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZGlnaV9hY2NlbGVwb3J0XzJfZGV2aWNlKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmRpZ2lfYWNjZWxlcG9ydF80X2RldmljZSk7CiB9CiAKIApAQCAtMjAxNSw4ICsxODY1LDggQEAKIG1vZHVsZV9leGl0KGRpZ2lfZXhpdCk7CiAKIAotTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOwotTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYwppbmRleCBkZDQyZjU3Li4yZWNiMWQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTIzNjYsOSArMjM2Niw4IEBACiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBjaGFyIG51bWJlciA9IGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyIC0gZWRnZV9wb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOwogCi0JaWYgKCghZWRnZV9zZXJpYWwtPmlzX2VwaWMpIHx8Ci0JICAgICgoZWRnZV9zZXJpYWwtPmlzX2VwaWMpICYmCi0JICAgICAoIWVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUFNldEJhdWRSYXRlKSkpIHsKKwlpZiAoZWRnZV9zZXJpYWwtPmlzX2VwaWMgJiYKKwkgICAgIWVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUFNldEJhdWRSYXRlKSB7CiAJCWRiZygiU2VuZENtZFdyaXRlQmF1ZFJhdGUgLSBOT1QgU2V0dGluZyBiYXVkIHJhdGUgZm9yIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwKIAkJICAgIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyLCBiYXVkUmF0ZSk7CiAJCXJldHVybiAwOwpAQCAtMjQ2MSwxOCArMjQ2MCwxNiBAQAogCiAJZGJnKCIlcyAtIHdyaXRlIHRvICVzIHJlZ2lzdGVyIDB4JTAyeCIsIChyZWdOdW0gPT0gTUNSKSA/ICJNQ1IiIDogIkxDUiIsIF9fRlVOQ1RJT05fXywgcmVnVmFsdWUpOwogCi0JaWYgKCghZWRnZV9zZXJpYWwtPmlzX2VwaWMpIHx8Ci0JICAgICgoZWRnZV9zZXJpYWwtPmlzX2VwaWMpICYmCi0JICAgICAoIWVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUFdyaXRlTUNSKSAmJgotCSAgICAgKHJlZ051bSA9PSBNQ1IpKSkgeworCWlmIChlZGdlX3NlcmlhbC0+aXNfZXBpYyAmJgorCSAgICAhZWRnZV9zZXJpYWwtPmVwaWNfZGVzY3JpcHRvci5TdXBwb3J0cy5JT1NQV3JpdGVNQ1IgJiYKKwkgICAgcmVnTnVtID09IE1DUikgewogCQlkYmcoIlNlbmRDbWRXcml0ZVVhcnRSZWcgLSBOb3Qgd3JpdGluZyB0byBNQ1IgUmVnaXN0ZXIiKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCghZWRnZV9zZXJpYWwtPmlzX2VwaWMpIHx8Ci0JICAgICgoZWRnZV9zZXJpYWwtPmlzX2VwaWMpICYmCi0JICAgICAoIWVkZ2Vfc2VyaWFsLT5lcGljX2Rlc2NyaXB0b3IuU3VwcG9ydHMuSU9TUFdyaXRlTENSKSAmJgotCSAgICAgKHJlZ051bSA9PSBMQ1IpKSkgeworCWlmIChlZGdlX3NlcmlhbC0+aXNfZXBpYyAmJgorCSAgICAhZWRnZV9zZXJpYWwtPmVwaWNfZGVzY3JpcHRvci5TdXBwb3J0cy5JT1NQV3JpdGVMQ1IgJiYKKwkgICAgcmVnTnVtID09IExDUikgewogCQlkYmcgKCJTZW5kQ21kV3JpdGVVYXJ0UmVnIC0gTm90IHdyaXRpbmcgdG8gTENSIFJlZ2lzdGVyIik7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKaW5kZXggMmEzZmFiYy4uZTA4YzliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKQEAgLTE4NCwyMSArMTg0LDIxIEBACiAgKiB3ZSBkbyBub3Qga25vdyBob3cgdG8gc3VwcG9ydC4gV2UgaWdub3JlIHRoZW0gZm9yIHRoZSBtb21lbnQuCiAgKiBYWFggUmF0ZS1saW1pdCB0aGUgZXJyb3IgbWVzc2FnZSwgaXQncyB1c2VyIHRyaWdnZXJhYmxlLgogICovCi1zdGF0aWMgaW50IG1jdF91MjMyX2NhbGN1bGF0ZV9iYXVkX3JhdGUoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgaW50IHZhbHVlKQorc3RhdGljIGludCBtY3RfdTIzMl9jYWxjdWxhdGVfYmF1ZF9yYXRlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHNwZWVkX3QgdmFsdWUpCiB7CiAJaWYgKGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gTUNUX1UyMzJfU0lURUNPTV9QSUQKIAkgIHx8IGxlMTZfdG9fY3B1KHNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gTUNUX1UyMzJfQkVMS0lOX0Y1VTEwOV9QSUQpIHsKIAkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlICAgIEIzMDA6IHJldHVybiAweDAxOwotCQljYXNlICAgIEI2MDA6IHJldHVybiAweDAyOyAvKiB0aGlzIG9uZSBub3QgdGVzdGVkICovCi0JCWNhc2UgICBCMTIwMDogcmV0dXJuIDB4MDM7Ci0JCWNhc2UgICBCMjQwMDogcmV0dXJuIDB4MDQ7Ci0JCWNhc2UgICBCNDgwMDogcmV0dXJuIDB4MDY7Ci0JCWNhc2UgICBCOTYwMDogcmV0dXJuIDB4MDg7Ci0JCWNhc2UgIEIxOTIwMDogcmV0dXJuIDB4MDk7Ci0JCWNhc2UgIEIzODQwMDogcmV0dXJuIDB4MGE7Ci0JCWNhc2UgIEI1NzYwMDogcmV0dXJuIDB4MGI7Ci0JCWNhc2UgQjExNTIwMDogcmV0dXJuIDB4MGM7CisJCWNhc2UgICAgMzAwOiByZXR1cm4gMHgwMTsKKwkJY2FzZSAgICA2MDA6IHJldHVybiAweDAyOyAvKiB0aGlzIG9uZSBub3QgdGVzdGVkICovCisJCWNhc2UgICAxMjAwOiByZXR1cm4gMHgwMzsKKwkJY2FzZSAgIDI0MDA6IHJldHVybiAweDA0OworCQljYXNlICAgNDgwMDogcmV0dXJuIDB4MDY7CisJCWNhc2UgICA5NjAwOiByZXR1cm4gMHgwODsKKwkJY2FzZSAgMTkyMDA6IHJldHVybiAweDA5OworCQljYXNlICAzODQwMDogcmV0dXJuIDB4MGE7CisJCWNhc2UgIDU3NjAwOiByZXR1cm4gMHgwYjsKKwkJY2FzZSAxMTUyMDA6IHJldHVybiAweDBjOwogCQlkZWZhdWx0OgogCQkJZXJyKCJNQ1QgVVNCLVJTMjMyOiB1bnN1cHBvcnRlZCBiYXVkcmF0ZSByZXF1ZXN0IDB4JXgsIgogCQkJICAgICIgdXNpbmcgZGVmYXVsdCBvZiBCOTYwMCIsIHZhbHVlKTsKQEAgLTIwNiwyNyArMjA2LDI3IEBACiAJCX0KIAl9IGVsc2UgewogCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgICAgQjMwMDogdmFsdWUgPSAgICAgMzAwOyBicmVhazsKLQkJY2FzZSAgICBCNjAwOiB2YWx1ZSA9ICAgICA2MDA7IGJyZWFrOwotCQljYXNlICAgQjEyMDA6IHZhbHVlID0gICAgMTIwMDsgYnJlYWs7Ci0JCWNhc2UgICBCMjQwMDogdmFsdWUgPSAgICAyNDAwOyBicmVhazsKLQkJY2FzZSAgIEI0ODAwOiB2YWx1ZSA9ICAgIDQ4MDA7IGJyZWFrOwotCQljYXNlICAgQjk2MDA6IHZhbHVlID0gICAgOTYwMDsgYnJlYWs7Ci0JCWNhc2UgIEIxOTIwMDogdmFsdWUgPSAgIDE5MjAwOyBicmVhazsKLQkJY2FzZSAgQjM4NDAwOiB2YWx1ZSA9ICAgMzg0MDA7IGJyZWFrOwotCQljYXNlICBCNTc2MDA6IHZhbHVlID0gICA1NzYwMDsgYnJlYWs7Ci0JCWNhc2UgQjExNTIwMDogdmFsdWUgPSAgMTE1MjAwOyBicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycigiTUNUIFVTQi1SUzIzMjogdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgcmVxdWVzdCAweCV4LCIKLQkJCSAgICAiIHVzaW5nIGRlZmF1bHQgb2YgQjk2MDAiLCB2YWx1ZSk7Ci0JCQl2YWx1ZSA9IDk2MDA7CisJCQljYXNlIDMwMDogYnJlYWs7CisJCQljYXNlIDYwMDogYnJlYWs7CisJCQljYXNlIDEyMDA6IGJyZWFrOworCQkJY2FzZSAyNDAwOiBicmVhazsKKwkJCWNhc2UgNDgwMDogYnJlYWs7CisJCQljYXNlIDk2MDA6IGJyZWFrOworCQkJY2FzZSAxOTIwMDogYnJlYWs7CisJCQljYXNlIDM4NDAwOiBicmVhazsKKwkJCWNhc2UgNTc2MDA6IGJyZWFrOworCQkJY2FzZSAxMTUyMDA6IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnIoIk1DVCBVU0ItUlMyMzI6IHVuc3VwcG9ydGVkIGJhdWRyYXRlIHJlcXVlc3QgMHgleCwiCisJCQkJICAgICIgdXNpbmcgZGVmYXVsdCBvZiBCOTYwMCIsIHZhbHVlKTsKKwkJCQl2YWx1ZSA9IDk2MDA7CiAJCX0KIAkJcmV0dXJuIDExNTIwMC92YWx1ZTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgbWN0X3UyMzJfc2V0X2JhdWRfcmF0ZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCSAgaW50IHZhbHVlKQorCQkJCSAgc3BlZWRfdCB2YWx1ZSkKIHsKIAlfX2xlMzIgZGl2aXNvcjsKICAgICAgICAgaW50IHJjOwpAQCAtNjM0LDcgKzYzNCw3IEBACiAJCW1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHNlcmlhbCwgY29udHJvbF9zdGF0ZSk7CiAJfQogCi0JbWN0X3UyMzJfc2V0X2JhdWRfcmF0ZShzZXJpYWwsIHBvcnQsIGNmbGFnICYgQ0JBVUQpOworCW1jdF91MjMyX3NldF9iYXVkX3JhdGUoc2VyaWFsLCBwb3J0LCB0dHlfZ2V0X2JhdWRfcmF0ZShwb3J0LT50dHkpKTsKIAogCWlmICgoY2ZsYWcgJiBDQkFVRCkgPT0gQjAgKSB7CiAJCWRiZygiJXM6IGJhdWQgaXMgQjAiLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuaAppbmRleCBhNjFiYWM4Li5hYWUxMGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuaApAQCAtNzksNyArNzksNyBAQAogICogYW5kICJJbnRlbCBzb2x1dGlvbiIuIFRoZXkgYXJlIHRoZSByZWd1bGFyIE1DVCBhbmQgIlNpdGVjb20iIGZvciB1cy4KICAqIFRoaXMgaXMgcG9pbnRsZXNzIHRvIGRvY3VtZW50IGluIHRoZSBoZWFkZXIsIHNlZSB0aGUgY29kZSBmb3IgdGhlIGJpdHMuCiAgKi8KLXN0YXRpYyBpbnQgbWN0X3UyMzJfY2FsY3VsYXRlX2JhdWRfcmF0ZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBtY3RfdTIzMl9jYWxjdWxhdGVfYmF1ZF9yYXRlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIHNwZWVkX3QgdmFsdWUpOwogCiAvKgogICogTGluZSBDb250cm9sIFJlZ2lzdGVyIChMQ1IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKaW5kZXggMDc5NGNjZC4uMGJiOGRlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwpAQCAtNDUsNyArNDUsNyBAQAogCURFVklDRV9JTlNUQUxMRVIgPQkyLAogfTsKIAotaW50IHNpZXJyYV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIF9fdTE2IHN3aVN0YXRlKQorc3RhdGljIGludCBzaWVycmFfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBfX3UxNiBzd2lTdGF0ZSkKIHsKIAlpbnQgcmVzdWx0OwogCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzIiwgIlNFVCBQT1dFUiBTVEFURSIpOwpAQCAtNjAsNyArNjAsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBzaWVycmFfc2V0X21zX21vZGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIF9fdTE2IGVTb2NNb2RlKQorc3RhdGljIGludCBzaWVycmFfc2V0X21zX21vZGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIF9fdTE2IGVTb2NNb2RlKQogewogCWludCByZXN1bHQ7CiAJZGV2X2RiZygmdWRldi0+ZGV2LCAiJXMiLCAiREVWSUNFIE1PREUgU1dJVENIIik7CkBAIC03NSw3ICs3NSw4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IHNpZXJyYV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgc2llcnJhX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKaW5kZXggYTM2NjU2NS4uOWJmMDFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCkBAIC02MCwxOSArNjAsMTkgQEAKIAogc3RhdGljIGludCBkZWJ1ZzsKIHN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsX3RhYmxlW1NFUklBTF9UVFlfTUlOT1JTXTsJLyogaW5pdGlhbGx5IGFsbCBOVUxMICovCi1zdGF0aWMgc3BpbmxvY2tfdCB0YWJsZV9sb2NrOworc3RhdGljIERFRklORV9NVVRFWCh0YWJsZV9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQodXNiX3NlcmlhbF9kcml2ZXJfbGlzdCk7CiAKIHN0cnVjdCB1c2Jfc2VyaWFsICp1c2Jfc2VyaWFsX2dldF9ieV9pbmRleCh1bnNpZ25lZCBpbmRleCkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOwogCi0Jc3Bpbl9sb2NrKCZ0YWJsZV9sb2NrKTsKKwltdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKIAlzZXJpYWwgPSBzZXJpYWxfdGFibGVbaW5kZXhdOwogCiAJaWYgKHNlcmlhbCkKIAkJa3JlZl9nZXQoJnNlcmlhbC0+a3JlZik7Ci0Jc3Bpbl91bmxvY2soJnRhYmxlX2xvY2spOworCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CiAJcmV0dXJuIHNlcmlhbDsKIH0KIApAQCAtODQsNyArODQsNyBAQAogCWRiZygiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIG51bV9wb3J0cyk7CiAKIAkqbWlub3IgPSAwOwotCXNwaW5fbG9jaygmdGFibGVfbG9jayk7CisJbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IFNFUklBTF9UVFlfTUlOT1JTOyArK2kpIHsKIAkJaWYgKHNlcmlhbF90YWJsZVtpXSkKIAkJCWNvbnRpbnVlOwpAQCAtMTA2LDEwICsxMDYsMTAgQEAKIAkJCXNlcmlhbF90YWJsZVtpXSA9IHNlcmlhbDsKIAkJCXNlcmlhbC0+cG9ydFtqKytdLT5udW1iZXIgPSBpOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKIAkJcmV0dXJuIHNlcmlhbDsKIAl9Ci0Jc3Bpbl91bmxvY2soJnRhYmxlX2xvY2spOworCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE3Miw5ICsxNzIsOSBAQAogCiB2b2lkIHVzYl9zZXJpYWxfcHV0KHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0Jc3Bpbl9sb2NrKCZ0YWJsZV9sb2NrKTsKKwltdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKIAlrcmVmX3B1dCgmc2VyaWFsLT5rcmVmLCBkZXN0cm95X3NlcmlhbCk7Ci0Jc3Bpbl91bmxvY2soJnRhYmxlX2xvY2spOworCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA3NywxNiArMTA3NywxNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJaW50IGksIHIgPSAwOwogCi0JaWYgKHNlcmlhbCkgewotCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewotCQkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKLQkJCWlmIChwb3J0KQotCQkJCWtpbGxfdHJhZmZpYyhwb3J0KTsKLQkJfQorCWlmICghc2VyaWFsKSAvKiBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJaWYgKHBvcnQpCisJCQlraWxsX3RyYWZmaWMocG9ydCk7CiAJfQogCiAJaWYgKHNlcmlhbC0+dHlwZS0+c3VzcGVuZCkKLQkJc2VyaWFsLT50eXBlLT5zdXNwZW5kKHNlcmlhbCwgbWVzc2FnZSk7CisJCXIgPSBzZXJpYWwtPnR5cGUtPnN1c3BlbmQoc2VyaWFsLCBtZXNzYWdlKTsKIAogCXJldHVybiByOwogfQpAQCAtMTEyOCw3ICsxMTI5LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBJbml0aWFsaXplIG91ciBnbG9iYWwgZGF0YSAqLwotCXNwaW5fbG9ja19pbml0KCZ0YWJsZV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgU0VSSUFMX1RUWV9NSU5PUlM7ICsraSkgewogCQlzZXJpYWxfdGFibGVbaV0gPSBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IGE2MjRlNzIuLmQ4ZDAwOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMzIwLDYgKzMyMCwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0NBUEFDSVRZKSwKIAorLyogUmVwb3J0ZWQgYnkgTWlsaW5ldnNreSBEbWl0cnkgPG5pYW0ubmlhbUBnbWFpbC5jb20+ICovCitVTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDA5LCAweDAxMDAsIDB4MDEwMCwKKwkJIk5JS09OIiwKKwkJIk5JS09OIERTQyBENTAiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfRklYX0NBUEFDSVRZKSwKKwogLyogUmVwb3J0ZWQgYnkgQW5kcmVhcyBCb2NraG9sZCA8YW5kcmVhc0Bib2NraW9ubGluZS5kZT4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MDUsIDB4MDEwMCwgMHgwMTAwLAogCQkiTklLT04iLApAQCAtMTM1Nyw2ICsxMzY0LDIwIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAogCisvKiBKZXJlbXkgS2F0eiA8a2F0empAcmVkaGF0LmNvbT46CisgKiBUaGUgQmxhY2tiZXJyeSBQZWFybCBjYW4gcnVuIGluIHR3byBtb2RlczsgYSB1c2Itc3RvcmFnZSBvbmx5IG1vZGUKKyAqIGFuZCBhIG1vZGUgdGhhdCBhbGxvd3MgYWNjZXNzIHZpYSBtYXNzIHN0b3JhZ2UgYW5kIHRvIGl0cyBkYXRhYmFzZS4KKyAqIFRoZSBiZXJyeV9jaGFyZ2UgbW9kdWxlIHdpbGwgc2V0IHRoZSBkZXZpY2UgdG8gZHVhbCBtb2RlIGFuZCB0aHVzIHdlCisgKiBzaG91bGQgaWdub3JlIGl0cyBuYXRpdmUgbW9kZSBpZiB0aGF0IG1vZHVsZSBpcyBidWlsdAorICovCisjaWZkZWYgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UKK1VOVVNVQUxfREVWKCAgMHgwZmNhLCAweDAwMDYsIDB4MDAwMSwgMHgwMDAxLAorCQkiUklNIiwKKwkJIkJsYWNrYmVycnkgUGVhcmwiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfSUdOT1JFX0RFVklDRSApLAorI2VuZGlmCisKIC8qIFJlcG9ydGVkIGJ5IE1pY2hhZWwgU3RhdHRtYW5uIDxtaWNoYWVsQHN0YXR0bWFubi5jb20+ICovCiBVTlVTVUFMX0RFViggIDB4MGZjZSwgMHhkMDA4LCAweDAwMDAsIDB4MDAwMCwKIAkJIlNvbnkgRXJpY3Nzb24iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9LY29uZmlnCmluZGV4IDU2NGNjOWIuLmE3MjMxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTE1NzEsNyArMTU3MSwxNCBAQAogCiBjb25maWcgRkJfQVUxMTAwCiAJYm9vbCAiQXUxMTAwIExDRCBEcml2ZXIiCi0JZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBFWFBFUklNRU5UQUwgJiYgUENJICYmIE1JUFMgJiYgTUlQU19QQjExMDA9eQorCWRlcGVuZHMgb24gKEZCID0geSkgJiYgTUlQUyAmJiBTT0NfQVUxMTAwCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGZyYW1lYnVmZmVyIGRyaXZlciBmb3IgdGhlIEFNRCBBdTExMDAgU09DLiAgSXQgY2FuIGRyaXZlCisJICB2YXJpb3VzIHBhbmVscyBhbmQgQ1JUcyBieSBwYXNzaW5nIGluIGtlcm5lbCBjbWQgbGluZSBvcHRpb24KKwkgIGF1MTEwMGZiOnBhbmVsPTxuYW1lPi4KIAogY29uZmlnIEZCX0FVMTIwMAogCWJvb2wgIkF1MTIwMCBMQ0QgRHJpdmVyIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9idzIuYyBiL2RyaXZlcnMvdmlkZW8vYncyLmMKaW5kZXggYjBiMmU0MC4uNzE4YjlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9idzIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2J3Mi5jCkBAIC0yNzksOTAgKzI3OSw5MSBAQAogCX0KIH0KIAotc3RydWN0IGFsbF9pbmZvIHsKLQlzdHJ1Y3QgZmJfaW5mbyBpbmZvOwotCXN0cnVjdCBidzJfcGFyIHBhcjsKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJ3Ml9pbml0X29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJ3Ml9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwotCXN0cnVjdCBhbGxfaW5mbyAqYWxsOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBidzJfcGFyICpwYXI7CiAJaW50IGxpbmVieXRlcywgZXJyOwogCi0JYWxsID0ga3phbGxvYyhzaXplb2YoKmFsbCksIEdGUF9LRVJORUwpOwotCWlmICghYWxsKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBidzJfcGFyKSwgJm9wLT5kZXYpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmFsbC0+cGFyLmxvY2spOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOwogCi0JYWxsLT5wYXIucGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JYWxsLT5wYXIud2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisJc3Bpbl9sb2NrX2luaXQoJnBhci0+bG9jayk7CiAKLQlzYnVzZmJfZmlsbF92YXIoJmFsbC0+aW5mby52YXIsIGRwLT5ub2RlLCAxKTsKKwlwYXItPnBoeXNiYXNlID0gb3AtPnJlc291cmNlWzBdLnN0YXJ0OworCXBhci0+d2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisKKwlzYnVzZmJfZmlsbF92YXIoJmluZm8tPnZhciwgZHAtPm5vZGUsIDEpOwogCWxpbmVieXRlcyA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImxpbmVieXRlcyIsCi0JCQkJCSAgYWxsLT5pbmZvLnZhci54cmVzKTsKKwkJCQkJICBpbmZvLT52YXIueHJlcyk7CiAKLQlhbGwtPmluZm8udmFyLnJlZC5sZW5ndGggPSBhbGwtPmluZm8udmFyLmdyZWVuLmxlbmd0aCA9Ci0JCWFsbC0+aW5mby52YXIuYmx1ZS5sZW5ndGggPSBhbGwtPmluZm8udmFyLmJpdHNfcGVyX3BpeGVsOwotCWFsbC0+aW5mby52YXIucmVkLm9mZnNldCA9IGFsbC0+aW5mby52YXIuZ3JlZW4ub2Zmc2V0ID0KLQkJYWxsLT5pbmZvLnZhci5ibHVlLm9mZnNldCA9IDA7CisJaW5mby0+dmFyLnJlZC5sZW5ndGggPSBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoID0KKwkJaW5mby0+dmFyLmJsdWUubGVuZ3RoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCWluZm8tPnZhci5yZWQub2Zmc2V0ID0gaW5mby0+dmFyLmdyZWVuLm9mZnNldCA9CisJCWluZm8tPnZhci5ibHVlLm9mZnNldCA9IDA7CiAKLQlhbGwtPnBhci5yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCBCV1RXT19SRUdJU1RFUl9PRkZTRVQsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBidzJfcmVncyksICJidzIgcmVncyIpOworCXBhci0+cmVncyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQldUV09fUkVHSVNURVJfT0ZGU0VULAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYncyX3JlZ3MpLCAiYncyIHJlZ3MiKTsKKwlpZiAoIXBhci0+cmVncykKKwkJZ290byBvdXRfcmVsZWFzZV9mYjsKIAogCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkcCwgIndpZHRoIiwgTlVMTCkpCi0JCWJ3Ml9kb19kZWZhdWx0X21vZGUoJmFsbC0+cGFyLCAmYWxsLT5pbmZvLCAmbGluZWJ5dGVzKTsKKwkJYncyX2RvX2RlZmF1bHRfbW9kZShwYXIsIGluZm8sICZsaW5lYnl0ZXMpOwogCi0JYWxsLT5wYXIuZmJzaXplID0gUEFHRV9BTElHTihsaW5lYnl0ZXMgKiBhbGwtPmluZm8udmFyLnlyZXMpOworCXBhci0+ZmJzaXplID0gUEFHRV9BTElHTihsaW5lYnl0ZXMgKiBpbmZvLT52YXIueXJlcyk7CiAKLQlhbGwtPmluZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKLQlhbGwtPmluZm8uZmJvcHMgPSAmYncyX29wczsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCWluZm8tPmZib3BzID0gJmJ3Ml9vcHM7CiAKLQlhbGwtPmluZm8uc2NyZWVuX2Jhc2UgPQotCQlvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsIGFsbC0+cGFyLmZic2l6ZSwgImJ3MiByYW0iKTsKLQlhbGwtPmluZm8ucGFyID0gJmFsbC0+cGFyOworCWluZm8tPnNjcmVlbl9iYXNlID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJCSAgICAgICBwYXItPmZic2l6ZSwgImJ3MiByYW0iKTsKKwlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKQorCQlnb3RvIG91dF91bm1hcF9yZWdzOwogCi0JYncyX2JsYW5rKDAsICZhbGwtPmluZm8pOworCWJ3Ml9ibGFuaygwLCBpbmZvKTsKIAotCWJ3Ml9pbml0X2ZpeCgmYWxsLT5pbmZvLCBsaW5lYnl0ZXMpOworCWJ3Ml9pbml0X2ZpeChpbmZvLCBsaW5lYnl0ZXMpOwogCi0JZXJyPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmYWxsLT5pbmZvKTsKLQlpZiAoZXJyIDwgMCkgewotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5yZWdzLCBzaXplb2Yoc3RydWN0IGJ3Ml9yZWdzKSk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwKLQkJCSAgIGFsbC0+aW5mby5zY3JlZW5fYmFzZSwgYWxsLT5wYXIuZmJzaXplKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3VubWFwX3NjcmVlbjsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgYWxsKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGluZm8pOwogCiAJcHJpbnRrKCIlczogYnd0d28gYXQgJWx4OiVseFxuIiwKLQkgICAgICAgZHAtPmZ1bGxfbmFtZSwKLQkgICAgICAgYWxsLT5wYXIud2hpY2hfaW8sIGFsbC0+cGFyLnBoeXNiYXNlKTsKKwkgICAgICAgZHAtPmZ1bGxfbmFtZSwgcGFyLT53aGljaF9pbywgcGFyLT5waHlzYmFzZSk7CiAKIAlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBfX2RldmluaXQgYncyX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqb3AgPSB0b19vZl9kZXZpY2UoJmRldi0+ZGV2KTsKK291dF91bm1hcF9zY3JlZW46CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBpbmZvLT5zY3JlZW5fYmFzZSwgcGFyLT5mYnNpemUpOwogCi0JcmV0dXJuIGJ3Ml9pbml0X29uZShvcCk7CitvdXRfdW5tYXBfcmVnczoKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHBhci0+cmVncywgc2l6ZW9mKHN0cnVjdCBidzJfcmVncykpOworCitvdXRfcmVsZWFzZV9mYjoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGJ3Ml9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGFsbF9pbmZvICphbGwgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3QgYncyX3BhciAqcGFyID0gaW5mby0+cGFyOwogCi0JdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmYWxsLT5pbmZvKTsKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwogCi0Jb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBhbGwtPnBhci5yZWdzLCBzaXplb2Yoc3RydWN0IGJ3Ml9yZWdzKSk7Ci0Jb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBhbGwtPmluZm8uc2NyZWVuX2Jhc2UsIGFsbC0+cGFyLmZic2l6ZSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwYXItPnJlZ3MsIHNpemVvZihzdHJ1Y3QgYncyX3JlZ3MpKTsKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGluZm8tPnNjcmVlbl9iYXNlLCBwYXItPmZic2l6ZSk7CiAKLQlrZnJlZShhbGwpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NnMTQuYyBiL2RyaXZlcnMvdmlkZW8vY2cxNC5jCmluZGV4IGIwNzFiYjYuLjQxZjZkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2cxNC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2cxNC5jCkBAIC00NDgsODEgKzQ0OCw3OSBAQAogCXsgLnNpemUgPSAwIH0KIH07CiAKLXN0cnVjdCBhbGxfaW5mbyB7Ci0Jc3RydWN0IGZiX2luZm8gaW5mbzsKLQlzdHJ1Y3QgY2cxNF9wYXIgcGFyOwotfTsKLQotc3RhdGljIHZvaWQgY2cxNF91bm1hcF9yZWdzKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBzdHJ1Y3QgYWxsX2luZm8gKmFsbCkKK3N0YXRpYyB2b2lkIGNnMTRfdW5tYXBfcmVncyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICAgc3RydWN0IGNnMTRfcGFyICpwYXIpCiB7Ci0JaWYgKGFsbC0+cGFyLnJlZ3MpCisJaWYgKHBhci0+cmVncykKIAkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLAotCQkJICAgYWxsLT5wYXIucmVncywgc2l6ZW9mKHN0cnVjdCBjZzE0X3JlZ3MpKTsKLQlpZiAoYWxsLT5wYXIuY2x1dCkKKwkJCSAgIHBhci0+cmVncywgc2l6ZW9mKHN0cnVjdCBjZzE0X3JlZ3MpKTsKKwlpZiAocGFyLT5jbHV0KQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5jbHV0LCBzaXplb2Yoc3RydWN0IGNnMTRfY2x1dCkpOwotCWlmIChhbGwtPnBhci5jdXJzb3IpCisJCQkgICBwYXItPmNsdXQsIHNpemVvZihzdHJ1Y3QgY2cxNF9jbHV0KSk7CisJaWYgKHBhci0+Y3Vyc29yKQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5jdXJzb3IsIHNpemVvZihzdHJ1Y3QgY2cxNF9jdXJzb3IpKTsKLQlpZiAoYWxsLT5pbmZvLnNjcmVlbl9iYXNlKQorCQkJICAgcGFyLT5jdXJzb3IsIHNpemVvZihzdHJ1Y3QgY2cxNF9jdXJzb3IpKTsKKwlpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCiAJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwKLQkJCSAgIGFsbC0+aW5mby5zY3JlZW5fYmFzZSwgYWxsLT5wYXIuZmJzaXplKTsKKwkJCSAgIGluZm8tPnNjcmVlbl9iYXNlLCBwYXItPmZic2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNnMTRfaW5pdF9vbmUoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjZzE0X3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPm5vZGU7Ci0Jc3RydWN0IGFsbF9pbmZvICphbGw7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGNnMTRfcGFyICpwYXI7CiAJaW50IGlzXzhtYiwgbGluZWJ5dGVzLCBpLCBlcnI7CiAKLQlhbGwgPSBremFsbG9jKHNpemVvZigqYWxsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhbGwpCi0JCXJldHVybiAtRU5PTUVNOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGNnMTRfcGFyKSwgJm9wLT5kZXYpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmFsbC0+cGFyLmxvY2spOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOwogCi0Jc2J1c2ZiX2ZpbGxfdmFyKCZhbGwtPmluZm8udmFyLCBkcC0+bm9kZSwgOCk7Ci0JYWxsLT5pbmZvLnZhci5yZWQubGVuZ3RoID0gODsKLQlhbGwtPmluZm8udmFyLmdyZWVuLmxlbmd0aCA9IDg7Ci0JYWxsLT5pbmZvLnZhci5ibHVlLmxlbmd0aCA9IDg7CisJc3Bpbl9sb2NrX2luaXQoJnBhci0+bG9jayk7CisKKwlzYnVzZmJfZmlsbF92YXIoJmluZm8tPnZhciwgZHAtPm5vZGUsIDgpOworCWluZm8tPnZhci5yZWQubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA4OwogCiAJbGluZWJ5dGVzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibGluZWJ5dGVzIiwKLQkJCQkJICBhbGwtPmluZm8udmFyLnhyZXMpOwotCWFsbC0+cGFyLmZic2l6ZSA9IFBBR0VfQUxJR04obGluZWJ5dGVzICogYWxsLT5pbmZvLnZhci55cmVzKTsKKwkJCQkJICBpbmZvLT52YXIueHJlcyk7CisJcGFyLT5mYnNpemUgPSBQQUdFX0FMSUdOKGxpbmVieXRlcyAqIGluZm8tPnZhci55cmVzKTsKIAogCWlmICghc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJzYnVzIikgfHwKIAkgICAgIXN0cmNtcChkcC0+cGFyZW50LT5uYW1lLCAic2JpIikpIHsKLQkJYWxsLT5wYXIucGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JCWFsbC0+cGFyLmlvc3BhY2UgPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisJCXBhci0+cGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJCXBhci0+aW9zcGFjZSA9IG9wLT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfQklUUzsKIAl9IGVsc2UgewotCQlhbGwtPnBhci5waHlzYmFzZSA9IG9wLT5yZXNvdXJjZVsxXS5zdGFydDsKLQkJYWxsLT5wYXIuaW9zcGFjZSA9IG9wLT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfQklUUzsKKwkJcGFyLT5waHlzYmFzZSA9IG9wLT5yZXNvdXJjZVsxXS5zdGFydDsKKwkJcGFyLT5pb3NwYWNlID0gb3AtPnJlc291cmNlWzBdLmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTOwogCX0KIAotCWFsbC0+cGFyLnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBjZzE0X3JlZ3MpLCAiY2cxNCByZWdzIik7Ci0JYWxsLT5wYXIuY2x1dCA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0cxNF9DTFVUMSwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGNnMTRfY2x1dCksICJjZzE0IGNsdXQiKTsKLQlhbGwtPnBhci5jdXJzb3IgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHMTRfQ1VSU09SUkVHUywKLQkJCQkgICBzaXplb2Yoc3RydWN0IGNnMTRfY3Vyc29yKSwgImNnMTQgY3Vyc29yIik7CisJcGFyLT5yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY2cxNF9yZWdzKSwgImNnMTQgcmVncyIpOworCXBhci0+Y2x1dCA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0cxNF9DTFVUMSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNnMTRfY2x1dCksICJjZzE0IGNsdXQiKTsKKwlwYXItPmN1cnNvciA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0cxNF9DVVJTT1JSRUdTLAorCQkJCSBzaXplb2Yoc3RydWN0IGNnMTRfY3Vyc29yKSwgImNnMTQgY3Vyc29yIik7CiAKLQlhbGwtPmluZm8uc2NyZWVuX2Jhc2UgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMV0sIDAsCi0JCQkJCSAgIGFsbC0+cGFyLmZic2l6ZSwgImNnMTQgcmFtIik7CisJaW5mby0+c2NyZWVuX2Jhc2UgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMV0sIDAsCisJCQkJICAgICAgIHBhci0+ZmJzaXplLCAiY2cxNCByYW0iKTsKIAotCWlmICghYWxsLT5wYXIucmVncyB8fCAhYWxsLT5wYXIuY2x1dCB8fCAhYWxsLT5wYXIuY3Vyc29yIHx8Ci0JICAgICFhbGwtPmluZm8uc2NyZWVuX2Jhc2UpCi0JCWNnMTRfdW5tYXBfcmVncyhvcCwgYWxsKTsKKwlpZiAoIXBhci0+cmVncyB8fCAhcGFyLT5jbHV0IHx8ICFwYXItPmN1cnNvciB8fCAhaW5mby0+c2NyZWVuX2Jhc2UpCisJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAKIAlpc184bWIgPSAoKChvcC0+cmVzb3VyY2VbMV0uZW5kIC0gb3AtPnJlc291cmNlWzFdLnN0YXJ0KSArIDEpID09CiAJCSAgKDggKiAxMDI0ICogMTAyNCkpOwogCi0JQlVJTERfQlVHX09OKHNpemVvZihhbGwtPnBhci5tbWFwX21hcCkgIT0gc2l6ZW9mKF9fY2cxNF9tbWFwX21hcCkpOworCUJVSUxEX0JVR19PTihzaXplb2YocGFyLT5tbWFwX21hcCkgIT0gc2l6ZW9mKF9fY2cxNF9tbWFwX21hcCkpOwogCQkKLQltZW1jcHkoJmFsbC0+cGFyLm1tYXBfbWFwLCAmX19jZzE0X21tYXBfbWFwLAotCSAgICAgICBzaXplb2YoYWxsLT5wYXIubW1hcF9tYXApKTsKKwltZW1jcHkoJnBhci0+bW1hcF9tYXAsICZfX2NnMTRfbW1hcF9tYXAsIHNpemVvZihwYXItPm1tYXBfbWFwKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ0cxNF9NTUFQX0VOVFJJRVM7IGkrKykgewotCQlzdHJ1Y3Qgc2J1c19tbWFwX21hcCAqbWFwID0gJmFsbC0+cGFyLm1tYXBfbWFwW2ldOworCQlzdHJ1Y3Qgc2J1c19tbWFwX21hcCAqbWFwID0gJnBhci0+bW1hcF9tYXBbaV07CiAKIAkJaWYgKCFtYXAtPnNpemUpCiAJCQlicmVhazsKQEAgLTUzNiw1OSArNTM0LDU1IEBACiAJCQltYXAtPnNpemUgKj0gMjsKIAl9CiAKLQlhbGwtPnBhci5tb2RlID0gTURJXzhfUElYOwotCWFsbC0+cGFyLnJhbXNpemUgPSAoaXNfOG1iID8gMHg4MDAwMDAgOiAweDQwMDAwMCk7CisJcGFyLT5tb2RlID0gTURJXzhfUElYOworCXBhci0+cmFtc2l6ZSA9IChpc184bWIgPyAweDgwMDAwMCA6IDB4NDAwMDAwKTsKIAotCWFsbC0+aW5mby5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsKLQlhbGwtPmluZm8uZmJvcHMgPSAmY2cxNF9vcHM7Ci0JYWxsLT5pbmZvLnBhciA9ICZhbGwtPnBhcjsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsKKwlpbmZvLT5mYm9wcyA9ICZjZzE0X29wczsKIAotCV9fY2cxNF9yZXNldCgmYWxsLT5wYXIpOworCV9fY2cxNF9yZXNldChwYXIpOwogCi0JaWYgKGZiX2FsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwLCAyNTYsIDApKSB7Ci0JCWNnMTRfdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWZiX3NldF9jbWFwKCZhbGwtPmluZm8uY21hcCwgJmFsbC0+aW5mbyk7CisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkpCisJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAKLQljZzE0X2luaXRfZml4KCZhbGwtPmluZm8sIGxpbmVieXRlcywgZHApOworCWZiX3NldF9jbWFwKCZpbmZvLT5jbWFwLCBpbmZvKTsKIAotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOwotCQljZzE0X3VubWFwX3JlZ3Mob3AsIGFsbCk7Ci0JCWtmcmVlKGFsbCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWNnMTRfaW5pdF9maXgoaW5mbywgbGluZWJ5dGVzLCBkcCk7CiAKLQlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGFsbCk7CisJZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2RlYWxsb2NfY21hcDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgaW5mbyk7CiAKIAlwcmludGsoIiVzOiBjZ2ZvdXJ0ZWVuIGF0ICVseDolbHgsICVkTUJcbiIsCiAJICAgICAgIGRwLT5mdWxsX25hbWUsCi0JICAgICAgIGFsbC0+cGFyLmlvc3BhY2UsIGFsbC0+cGFyLnBoeXNiYXNlLAotCSAgICAgICBhbGwtPnBhci5yYW1zaXplID4+IDIwKTsKKwkgICAgICAgcGFyLT5pb3NwYWNlLCBwYXItPnBoeXNiYXNlLAorCSAgICAgICBwYXItPnJhbXNpemUgPj4gMjApOwogCiAJcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNnMTRfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHRvX29mX2RldmljZSgmZGV2LT5kZXYpOworb3V0X2RlYWxsb2NfY21hcDoKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCi0JcmV0dXJuIGNnMTRfaW5pdF9vbmUob3ApOworb3V0X3VubWFwX3JlZ3M6CisJY2cxNF91bm1hcF9yZWdzKG9wLCBpbmZvLCBwYXIpOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGNnMTRfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXN0cnVjdCBhbGxfaW5mbyAqYWxsID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGNnMTRfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAotCWNnMTRfdW5tYXBfcmVncyhvcCwgYWxsKTsKKwljZzE0X3VubWFwX3JlZ3Mob3AsIGluZm8sIHBhcik7CiAKLQlrZnJlZShhbGwpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NnMy5jIGIvZHJpdmVycy92aWRlby9jZzMuYwppbmRleCBmMDQyNDI4Li41NzQxYjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NnMy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2czLmMKQEAgLTM1MywxMDQgKzM1MywxMDIgQEAKIAl9CiB9CiAKLXN0cnVjdCBhbGxfaW5mbyB7Ci0Jc3RydWN0IGZiX2luZm8gaW5mbzsKLQlzdHJ1Y3QgY2czX3BhciBwYXI7Ci19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjZzNfaW5pdF9vbmUoc3RydWN0IG9mX2RldmljZSAqb3ApCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwotCXN0cnVjdCBhbGxfaW5mbyAqYWxsOwotCWludCBsaW5lYnl0ZXMsIGVycjsKLQotCWFsbCA9IGt6YWxsb2Moc2l6ZW9mKCphbGwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFsbCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaW5pdCgmYWxsLT5wYXIubG9jayk7Ci0KLQlhbGwtPnBhci5waHlzYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKLQlhbGwtPnBhci53aGljaF9pbyA9IG9wLT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfQklUUzsKLQotCXNidXNmYl9maWxsX3ZhcigmYWxsLT5pbmZvLnZhciwgZHAtPm5vZGUsIDgpOwotCWFsbC0+aW5mby52YXIucmVkLmxlbmd0aCA9IDg7Ci0JYWxsLT5pbmZvLnZhci5ncmVlbi5sZW5ndGggPSA4OwotCWFsbC0+aW5mby52YXIuYmx1ZS5sZW5ndGggPSA4OwotCWlmICghc3RyY21wKGRwLT5uYW1lLCAiY2dSREkiKSkKLQkJYWxsLT5wYXIuZmxhZ3MgfD0gQ0czX0ZMQUdfUkRJOwotCWlmIChhbGwtPnBhci5mbGFncyAmIENHM19GTEFHX1JESSkKLQkJY2czX3JkaV9tYXliZV9maXh1cF92YXIoJmFsbC0+aW5mby52YXIsIGRwKTsKLQotCWxpbmVieXRlcyA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImxpbmVieXRlcyIsCi0JCQkJCSAgYWxsLT5pbmZvLnZhci54cmVzKTsKLQlhbGwtPnBhci5mYnNpemUgPSBQQUdFX0FMSUdOKGxpbmVieXRlcyAqIGFsbC0+aW5mby52YXIueXJlcyk7Ci0KLQlhbGwtPnBhci5yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCBDRzNfUkVHU19PRkZTRVQsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBjZzNfcmVncyksICJjZzMgcmVncyIpOwotCi0JYWxsLT5pbmZvLmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7Ci0JYWxsLT5pbmZvLmZib3BzID0gJmNnM19vcHM7Ci0JYWxsLT5pbmZvLnNjcmVlbl9iYXNlID0KLQkJb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCBDRzNfUkFNX09GRlNFVCwKLQkJCSAgIGFsbC0+cGFyLmZic2l6ZSwgImNnMyByYW0iKTsKLQlhbGwtPmluZm8ucGFyID0gJmFsbC0+cGFyOwotCi0JY2czX2JsYW5rKDAsICZhbGwtPmluZm8pOwotCi0JaWYgKCFvZl9maW5kX3Byb3BlcnR5KGRwLCAid2lkdGgiLCBOVUxMKSkKLQkJY2czX2RvX2RlZmF1bHRfbW9kZSgmYWxsLT5wYXIpOwotCi0JaWYgKGZiX2FsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwLCAyNTYsIDApKSB7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwKLQkJCSAgIGFsbC0+cGFyLnJlZ3MsIHNpemVvZihzdHJ1Y3QgY2czX3JlZ3MpKTsKLQkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLAotCQkJICAgYWxsLT5pbmZvLnNjcmVlbl9iYXNlLCBhbGwtPnBhci5mYnNpemUpOwotCQlrZnJlZShhbGwpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZmJfc2V0X2NtYXAoJmFsbC0+aW5mby5jbWFwLCAmYWxsLT5pbmZvKTsKLQotCWNnM19pbml0X2ZpeCgmYWxsLT5pbmZvLCBsaW5lYnl0ZXMsIGRwKTsKLQotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOwotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5yZWdzLCBzaXplb2Yoc3RydWN0IGNnM19yZWdzKSk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwKLQkJCSAgIGFsbC0+aW5mby5zY3JlZW5fYmFzZSwgYWxsLT5wYXIuZmJzaXplKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGFsbCk7Ci0KLQlwcmludGsoIiVzOiBjZzMgYXQgJWx4OiVseFxuIiwKLQkgICAgICAgZHAtPmZ1bGxfbmFtZSwgYWxsLT5wYXIud2hpY2hfaW8sIGFsbC0+cGFyLnBoeXNiYXNlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjZzNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LAorc3RhdGljIGludCBfX2RldmluaXQgY2czX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gdG9fb2ZfZGV2aWNlKCZkZXYtPmRldik7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBjZzNfcGFyICpwYXI7CisJaW50IGxpbmVieXRlcywgZXJyOwogCi0JcmV0dXJuIGNnM19pbml0X29uZShvcCk7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgY2czX3BhciksICZvcC0+ZGV2KTsKKworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOworCisJc3Bpbl9sb2NrX2luaXQoJnBhci0+bG9jayk7CisKKwlwYXItPnBoeXNiYXNlID0gb3AtPnJlc291cmNlWzBdLnN0YXJ0OworCXBhci0+d2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisKKwlzYnVzZmJfZmlsbF92YXIoJmluZm8tPnZhciwgZHAtPm5vZGUsIDgpOworCWluZm8tPnZhci5yZWQubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA4OworCWlmICghc3RyY21wKGRwLT5uYW1lLCAiY2dSREkiKSkKKwkJcGFyLT5mbGFncyB8PSBDRzNfRkxBR19SREk7CisJaWYgKHBhci0+ZmxhZ3MgJiBDRzNfRkxBR19SREkpCisJCWNnM19yZGlfbWF5YmVfZml4dXBfdmFyKCZpbmZvLT52YXIsIGRwKTsKKworCWxpbmVieXRlcyA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImxpbmVieXRlcyIsCisJCQkJCSAgaW5mby0+dmFyLnhyZXMpOworCXBhci0+ZmJzaXplID0gUEFHRV9BTElHTihsaW5lYnl0ZXMgKiBpbmZvLT52YXIueXJlcyk7CisKKwlwYXItPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHM19SRUdTX09GRlNFVCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNnM19yZWdzKSwgImNnMyByZWdzIik7CisJaWYgKCFwYXItPnJlZ3MpCisJCWdvdG8gb3V0X3JlbGVhc2VfZmI7CisKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCWluZm8tPmZib3BzID0gJmNnM19vcHM7CisJaW5mby0+c2NyZWVuX2Jhc2UgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHM19SQU1fT0ZGU0VULAorCQkJCSAgICAgICBwYXItPmZic2l6ZSwgImNnMyByYW0iKTsKKwlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKQorCQlnb3RvIG91dF91bm1hcF9yZWdzOworCisJY2czX2JsYW5rKDAsIGluZm8pOworCisJaWYgKCFvZl9maW5kX3Byb3BlcnR5KGRwLCAid2lkdGgiLCBOVUxMKSkKKwkJY2czX2RvX2RlZmF1bHRfbW9kZShwYXIpOworCisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkpCisJCWdvdG8gb3V0X3VubWFwX3NjcmVlbjsKKworCWZiX3NldF9jbWFwKCZpbmZvLT5jbWFwLCBpbmZvKTsKKworCWNnM19pbml0X2ZpeChpbmZvLCBsaW5lYnl0ZXMsIGRwKTsKKworCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9kZWFsbG9jX2NtYXA7CisKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGluZm8pOworCisJcHJpbnRrKCIlczogY2czIGF0ICVseDolbHhcbiIsCisJICAgICAgIGRwLT5mdWxsX25hbWUsIHBhci0+d2hpY2hfaW8sIHBhci0+cGh5c2Jhc2UpOworCisJcmV0dXJuIDA7CisKK291dF9kZWFsbG9jX2NtYXA6CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKworb3V0X3VubWFwX3NjcmVlbjoKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGluZm8tPnNjcmVlbl9iYXNlLCBwYXItPmZic2l6ZSk7CisKK291dF91bm1hcF9yZWdzOgorCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcGFyLT5yZWdzLCBzaXplb2Yoc3RydWN0IGNnM19yZWdzKSk7CisKK291dF9yZWxlYXNlX2ZiOgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgY2czX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKLQlzdHJ1Y3QgYWxsX2luZm8gKmFsbCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBjZzNfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAotCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5wYXIucmVncywgc2l6ZW9mKHN0cnVjdCBjZzNfcmVncykpOwotCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5pbmZvLnNjcmVlbl9iYXNlLCBhbGwtPnBhci5mYnNpemUpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcGFyLT5yZWdzLCBzaXplb2Yoc3RydWN0IGNnM19yZWdzKSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBpbmZvLT5zY3JlZW5fYmFzZSwgcGFyLT5mYnNpemUpOwogCi0Ja2ZyZWUoYWxsKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCiAJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jZzYuYyBiL2RyaXZlcnMvdmlkZW8vY2c2LmMKaW5kZXggNGRhZDIzYS4uODdjNzQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jZzYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NnNi5jCkBAIC02NTMsMTM1ICs2NTMsMTIwIEBACiAJc2J1c193cml0ZWwoaW5mby0+dmFyLnlyZXMgLSAxLCAmZmJjLT5jbGlwbWF4eSk7CiB9CiAKLXN0cnVjdCBhbGxfaW5mbyB7Ci0Jc3RydWN0IGZiX2luZm8gaW5mbzsKLQlzdHJ1Y3QgY2c2X3BhciBwYXI7Ci19OwotCi1zdGF0aWMgdm9pZCBjZzZfdW5tYXBfcmVncyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgc3RydWN0IGFsbF9pbmZvICphbGwpCitzdGF0aWMgdm9pZCBjZzZfdW5tYXBfcmVncyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgY2c2X3BhciAqcGFyKQogewotCWlmIChhbGwtPnBhci5mYmMpCi0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5wYXIuZmJjLCA0MDk2KTsKLQlpZiAoYWxsLT5wYXIudGVjKQotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci50ZWMsIHNpemVvZihzdHJ1Y3QgY2c2X3RlYykpOwotCWlmIChhbGwtPnBhci50aGMpCi0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwKLQkJCSAgIGFsbC0+cGFyLnRoYywgc2l6ZW9mKHN0cnVjdCBjZzZfdGhjKSk7Ci0JaWYgKGFsbC0+cGFyLmJ0KQotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5idCwgc2l6ZW9mKHN0cnVjdCBidF9yZWdzKSk7Ci0JaWYgKGFsbC0+cGFyLmZoYykKLQkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLAotCQkJICAgYWxsLT5wYXIuZmhjLCBzaXplb2YodTMyKSk7CisJaWYgKHBhci0+ZmJjKQorCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHBhci0+ZmJjLCA0MDk2KTsKKwlpZiAocGFyLT50ZWMpCisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcGFyLT50ZWMsIHNpemVvZihzdHJ1Y3QgY2c2X3RlYykpOworCWlmIChwYXItPnRoYykKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwYXItPnRoYywgc2l6ZW9mKHN0cnVjdCBjZzZfdGhjKSk7CisJaWYgKHBhci0+YnQpCisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcGFyLT5idCwgc2l6ZW9mKHN0cnVjdCBidF9yZWdzKSk7CisJaWYgKHBhci0+ZmhjKQorCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHBhci0+ZmhjLCBzaXplb2YodTMyKSk7CiAKLQlpZiAoYWxsLT5pbmZvLnNjcmVlbl9iYXNlKQotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPmluZm8uc2NyZWVuX2Jhc2UsIGFsbC0+cGFyLmZic2l6ZSk7CisJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQorCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGluZm8tPnNjcmVlbl9iYXNlLCBwYXItPmZic2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNnNl9pbml0X29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNnNl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwotCXN0cnVjdCBhbGxfaW5mbyAqYWxsOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBjZzZfcGFyICpwYXI7CiAJaW50IGxpbmVieXRlcywgZXJyOwogCi0JYWxsID0ga3phbGxvYyhzaXplb2YoKmFsbCksIEdGUF9LRVJORUwpOwotCWlmICghYWxsKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZzZfcGFyKSwgJm9wLT5kZXYpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmFsbC0+cGFyLmxvY2spOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOwogCi0JYWxsLT5wYXIucGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JYWxsLT5wYXIud2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisJc3Bpbl9sb2NrX2luaXQoJnBhci0+bG9jayk7CiAKLQlzYnVzZmJfZmlsbF92YXIoJmFsbC0+aW5mby52YXIsIGRwLT5ub2RlLCA4KTsKLQlhbGwtPmluZm8udmFyLnJlZC5sZW5ndGggPSA4OwotCWFsbC0+aW5mby52YXIuZ3JlZW4ubGVuZ3RoID0gODsKLQlhbGwtPmluZm8udmFyLmJsdWUubGVuZ3RoID0gODsKKwlwYXItPnBoeXNiYXNlID0gb3AtPnJlc291cmNlWzBdLnN0YXJ0OworCXBhci0+d2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisKKwlzYnVzZmJfZmlsbF92YXIoJmluZm8tPnZhciwgZHAtPm5vZGUsIDgpOworCWluZm8tPnZhci5yZWQubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA4OwogCiAJbGluZWJ5dGVzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibGluZWJ5dGVzIiwKLQkJCQkJICBhbGwtPmluZm8udmFyLnhyZXMpOwotCWFsbC0+cGFyLmZic2l6ZSA9IFBBR0VfQUxJR04obGluZWJ5dGVzICogYWxsLT5pbmZvLnZhci55cmVzKTsKKwkJCQkJICBpbmZvLT52YXIueHJlcyk7CisJcGFyLT5mYnNpemUgPSBQQUdFX0FMSUdOKGxpbmVieXRlcyAqIGluZm8tPnZhci55cmVzKTsKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShkcCwgImRibGJ1ZiIsIE5VTEwpKQotCQlhbGwtPnBhci5mYnNpemUgKj0gNDsKKwkJcGFyLT5mYnNpemUgKj0gNDsKIAotCWFsbC0+cGFyLmZiYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0c2X0ZCQ19PRkZTRVQsCisJcGFyLT5mYmMgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHNl9GQkNfT0ZGU0VULAogCQkJCSAgNDA5NiwgImNnc2l4IGZiYyIpOwotCWFsbC0+cGFyLnRlYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0c2X1RFQ19PRkZTRVQsCisJcGFyLT50ZWMgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHNl9URUNfT0ZGU0VULAogCQkJCSAgc2l6ZW9mKHN0cnVjdCBjZzZfdGVjKSwgImNnc2l4IHRlYyIpOwotCWFsbC0+cGFyLnRoYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0c2X1RIQ19PRkZTRVQsCisJcGFyLT50aGMgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHNl9USENfT0ZGU0VULAogCQkJCSAgc2l6ZW9mKHN0cnVjdCBjZzZfdGhjKSwgImNnc2l4IHRoYyIpOwotCWFsbC0+cGFyLmJ0ID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCBDRzZfQlJPT0tUUkVFX09GRlNFVCwKKwlwYXItPmJ0ID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCBDRzZfQlJPT0tUUkVFX09GRlNFVCwKIAkJCQkgc2l6ZW9mKHN0cnVjdCBidF9yZWdzKSwgImNnc2l4IGRhYyIpOwotCWFsbC0+cGFyLmZoYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0c2X0ZIQ19PRkZTRVQsCisJcGFyLT5maGMgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIENHNl9GSENfT0ZGU0VULAogCQkJCSAgc2l6ZW9mKHUzMiksICJjZ3NpeCBmaGMiKTsKIAotCWFsbC0+aW5mby5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIHwKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfCBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVDsKLQlhbGwtPmluZm8uZmJvcHMgPSAmY2c2X29wczsKKwlpbmZvLT5mYm9wcyA9ICZjZzZfb3BzOwogCi0JYWxsLT5pbmZvLnNjcmVlbl9iYXNlID0gIG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0c2X1JBTV9PRkZTRVQsCi0JCQkJCSAgICBhbGwtPnBhci5mYnNpemUsICJjZ3NpeCByYW0iKTsKLQlpZiAoIWFsbC0+cGFyLmZiYyB8fCAhYWxsLT5wYXIudGVjIHx8ICFhbGwtPnBhci50aGMgfHwKLQkgICAgIWFsbC0+cGFyLmJ0IHx8ICFhbGwtPnBhci5maGMgfHwgIWFsbC0+aW5mby5zY3JlZW5fYmFzZSkgewotCQljZzZfdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWluZm8tPnNjcmVlbl9iYXNlID0gIG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgQ0c2X1JBTV9PRkZTRVQsCisJCQkJCSAgICBwYXItPmZic2l6ZSwgImNnc2l4IHJhbSIpOworCWlmICghcGFyLT5mYmMgfHwgIXBhci0+dGVjIHx8ICFwYXItPnRoYyB8fAorCSAgICAhcGFyLT5idCB8fCAhcGFyLT5maGMgfHwgIWluZm8tPnNjcmVlbl9iYXNlKQorCQlnb3RvIG91dF91bm1hcF9yZWdzOwogCi0JYWxsLT5pbmZvLnBhciA9ICZhbGwtPnBhcjsKKwlpbmZvLT52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKIAotCWFsbC0+aW5mby52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKKwljZzZfYnRfaW5pdChwYXIpOworCWNnNl9jaGlwX2luaXQoaW5mbyk7CisJY2c2X2JsYW5rKDAsIGluZm8pOwogCi0JY2c2X2J0X2luaXQoJmFsbC0+cGFyKTsKLQljZzZfY2hpcF9pbml0KCZhbGwtPmluZm8pOwotCWNnNl9ibGFuaygwLCAmYWxsLT5pbmZvKTsKKwlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSkKKwkJZ290byBvdXRfdW5tYXBfcmVnczsKIAotCWlmIChmYl9hbGxvY19jbWFwKCZhbGwtPmluZm8uY21hcCwgMjU2LCAwKSkgewotCQljZzZfdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWZiX3NldF9jbWFwKCZpbmZvLT5jbWFwLCBpbmZvKTsKKwljZzZfaW5pdF9maXgoaW5mbywgbGluZWJ5dGVzKTsKIAotCWZiX3NldF9jbWFwKCZhbGwtPmluZm8uY21hcCwgJmFsbC0+aW5mbyk7Ci0JY2c2X2luaXRfZml4KCZhbGwtPmluZm8sIGxpbmVieXRlcyk7CisJZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2RlYWxsb2NfY21hcDsKIAotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWNnNl91bm1hcF9yZWdzKG9wLCBhbGwpOwotCQlmYl9kZWFsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGFsbCk7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBpbmZvKTsKIAogCXByaW50aygiJXM6IENHc2l4IFslc10gYXQgJWx4OiVseFxuIiwKLQkgICAgICAgZHAtPmZ1bGxfbmFtZSwKLQkgICAgICAgYWxsLT5pbmZvLmZpeC5pZCwKLQkgICAgICAgYWxsLT5wYXIud2hpY2hfaW8sIGFsbC0+cGFyLnBoeXNiYXNlKTsKKwkgICAgICAgZHAtPmZ1bGxfbmFtZSwgaW5mby0+Zml4LmlkLAorCSAgICAgICBwYXItPndoaWNoX2lvLCBwYXItPnBoeXNiYXNlKTsKIAogCXJldHVybiAwOwotfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjZzZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IHRvX29mX2RldmljZSgmZGV2LT5kZXYpOworb3V0X2RlYWxsb2NfY21hcDoKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCi0JcmV0dXJuIGNnNl9pbml0X29uZShvcCk7CitvdXRfdW5tYXBfcmVnczoKKwljZzZfdW5tYXBfcmVncyhvcCwgaW5mbywgcGFyKTsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBjZzZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewotCXN0cnVjdCBhbGxfaW5mbyAqYWxsID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGNnNl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAotCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoJmFsbC0+aW5mbyk7Ci0JZmJfZGVhbGxvY19jbWFwKCZhbGwtPmluZm8uY21hcCk7CisJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCi0JY2c2X3VubWFwX3JlZ3Mob3AsIGFsbCk7CisJY2c2X3VubWFwX3JlZ3Mob3AsIGluZm8sIHBhcik7CiAKLQlrZnJlZShhbGwpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCmluZGV4IGY0OGU4YzUuLjY3OTZiYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KQEAgLTQ1OCw3ICs0NTksNyBAQAogCiAJaWYgKHN0YXRlLmV2ZW50ID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKIAkJcmV0dXJuIDA7Ci0JaWYgKHN0YXRlLmV2ZW50ICE9IFBNX1NVU1BFTkRfTUVNKQorCWlmIChzdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9TVVNQRU5EKQogCQlnb3RvIGRvbmU7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZmYi5jIGIvZHJpdmVycy92aWRlby9mZmIuYwppbmRleCAzZjZjOThmLi40YjUyMGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmZiLmMKQEAgLTM3MSw2ICszNzEsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWZic2l6ZTsKIAogCWludAkJCWJvYXJkX3R5cGU7CisKKwl1MzIJCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiB9OwogCiBzdGF0aWMgdm9pZCBGRkJGaWZvKHN0cnVjdCBmZmJfcGFyICpwYXIsIGludCBuKQpAQCAtOTAwLDc1ICs5MDIsNjcgQEAKIAlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9TVU5fQ1JFQVRPUjsKIH0KIAotc3RydWN0IGFsbF9pbmZvIHsKLQlzdHJ1Y3QgZmJfaW5mbyBpbmZvOwotCXN0cnVjdCBmZmJfcGFyIHBhcjsKLQl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwotfTsKLQotc3RhdGljIGludCBmZmJfaW5pdF9vbmUoc3RydWN0IG9mX2RldmljZSAqb3ApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmZmJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKIAlzdHJ1Y3QgZmZiX2ZiYyBfX2lvbWVtICpmYmM7CiAJc3RydWN0IGZmYl9kYWMgX19pb21lbSAqZGFjOwotCXN0cnVjdCBhbGxfaW5mbyAqYWxsOwotCWludCBlcnI7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGZmYl9wYXIgKnBhcjsKIAl1MzIgZGFjX3BudW0sIGRhY19yZXYsIGRhY19tcmV2OworCWludCBlcnI7CiAKLQlhbGwgPSBremFsbG9jKHNpemVvZigqYWxsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhbGwpCi0JCXJldHVybiAtRU5PTUVNOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGZmYl9wYXIpLCAmb3AtPmRldik7CiAKLQlzcGluX2xvY2tfaW5pdCgmYWxsLT5wYXIubG9jayk7Ci0JYWxsLT5wYXIuZmJjID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzJdLCAwLAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSwgImZmYiBmYmMiKTsKLQlpZiAoIWFsbC0+cGFyLmZiYykgewotCQlrZnJlZShhbGwpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWluZm8pCisJCWdvdG8gb3V0X2VycjsKIAotCWFsbC0+cGFyLmRhYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVsxXSwgMCwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgZmZiX2RhYyksICJmZmIgZGFjIik7Ci0JaWYgKCFhbGwtPnBhci5kYWMpIHsKLQkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLAotCQkJICAgYWxsLT5wYXIuZmJjLCBzaXplb2Yoc3RydWN0IGZmYl9mYmMpKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCXBhciA9IGluZm8tPnBhcjsKIAotCWFsbC0+cGFyLnJvcF9jYWNoZSA9IEZGQl9ST1BfTkVXOwotCWFsbC0+cGFyLnBoeXNiYXNlID0gb3AtPnJlc291cmNlWzBdLnN0YXJ0OworCXNwaW5fbG9ja19pbml0KCZwYXItPmxvY2spOworCXBhci0+ZmJjID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzJdLCAwLAorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSwgImZmYiBmYmMiKTsKKwlpZiAoIXBhci0+ZmJjKQorCQlnb3RvIG91dF9yZWxlYXNlX2ZiOworCisJcGFyLT5kYWMgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMV0sIDAsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGZmYl9kYWMpLCAiZmZiIGRhYyIpOworCWlmICghcGFyLT5kYWMpCisJCWdvdG8gb3V0X3VubWFwX2ZiYzsKKworCXBhci0+cm9wX2NhY2hlID0gRkZCX1JPUF9ORVc7CisJcGFyLT5waHlzYmFzZSA9IG9wLT5yZXNvdXJjZVswXS5zdGFydDsKIAogCS8qIERvbid0IG1lbnRpb24gY29weWFyZWEsIHNvIFNDUk9MTF9SRURSQVcgaXMgYWx3YXlzCiAJICogdXNlZC4gIEl0IGlzIHRoZSBmYXN0ZXN0IG9uIHRoaXMgY2hpcC4KIAkgKi8KLQlhbGwtPmluZm8uZmxhZ3MgPSAoRkJJTkZPX0RFRkFVTFQgfAotCQkJICAgLyogRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfCAqLwotCQkJICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAotCQkJICAgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUKTsKLQlhbGwtPmluZm8uZmJvcHMgPSAmZmZiX29wczsKLQlhbGwtPmluZm8uc2NyZWVuX2Jhc2UgPSAoY2hhciAqKSBhbGwtPnBhci5waHlzYmFzZSArIEZGQl9ERkIyNF9QT0ZGOwotCWFsbC0+aW5mby5wYXIgPSAmYWxsLT5wYXI7Ci0JYWxsLT5pbmZvLnBzZXVkb19wYWxldHRlID0gYWxsLT5wc2V1ZG9fcGFsZXR0ZTsKKwlpbmZvLT5mbGFncyA9IChGQklORk9fREVGQVVMVCB8CisJCSAgICAgICAvKiBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8ICovCisJCSAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCB8CisJCSAgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQpOwogCi0Jc2J1c2ZiX2ZpbGxfdmFyKCZhbGwtPmluZm8udmFyLCBkcC0+bm9kZSwgMzIpOwotCWFsbC0+cGFyLmZic2l6ZSA9IFBBR0VfQUxJR04oYWxsLT5pbmZvLnZhci54cmVzICoKLQkJCQkgICAgIGFsbC0+aW5mby52YXIueXJlcyAqCi0JCQkJICAgICA0KTsKLQlmZmJfZml4dXBfdmFyX3JnYigmYWxsLT5pbmZvLnZhcik7CisJaW5mby0+ZmJvcHMgPSAmZmZiX29wczsKIAotCWFsbC0+aW5mby52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyICopIHBhci0+cGh5c2Jhc2UgKyBGRkJfREZCMjRfUE9GRjsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cHNldWRvX3BhbGV0dGU7CisKKwlzYnVzZmJfZmlsbF92YXIoJmluZm8tPnZhciwgZHAtPm5vZGUsIDMyKTsKKwlwYXItPmZic2l6ZSA9IFBBR0VfQUxJR04oaW5mby0+dmFyLnhyZXMgKiBpbmZvLT52YXIueXJlcyAqIDQpOworCWZmYl9maXh1cF92YXJfcmdiKCZpbmZvLT52YXIpOworCisJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gRkJfQUNDRUxGX1RFWFQ7CiAKIAlpZiAoIXN0cmNtcChkcC0+bmFtZSwgIlNVTlcsYWZiIikpCi0JCWFsbC0+cGFyLmZsYWdzIHw9IEZGQl9GTEFHX0FGQjsKKwkJcGFyLT5mbGFncyB8PSBGRkJfRkxBR19BRkI7CiAKLQlhbGwtPnBhci5ib2FyZF90eXBlID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiYm9hcmRfdHlwZSIsIDApOworCXBhci0+Ym9hcmRfdHlwZSA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImJvYXJkX3R5cGUiLCAwKTsKIAotCWZiYyA9IGFsbC0+cGFyLmZiYzsKKwlmYmMgPSBwYXItPmZiYzsKIAlpZiAoKHVwYV9yZWFkbCgmZmJjLT51Y3NyKSAmIEZGQl9VQ1NSX0FMTF9FUlJPUlMpICE9IDApCiAJCXVwYV93cml0ZWwoRkZCX1VDU1JfQUxMX0VSUk9SUywgJmZiYy0+dWNzcik7CiAKLQlkYWMgPSBhbGwtPnBhci5kYWM7CisJZGFjID0gcGFyLT5kYWM7CiAJdXBhX3dyaXRlbChGRkJfREFDX0RJRCwgJmRhYy0+dHlwZSk7CiAJZGFjX3BudW0gPSB1cGFfcmVhZGwoJmRhYy0+dmFsdWUpOwogCWRhY19yZXYgPSAoZGFjX3BudW0gJiBGRkJfREFDX0RJRF9SRVYpID4+IEZGQl9EQUNfRElEX1JFVl9TSElGVDsKQEAgLTk4NSw3NiArOTc5LDcwIEBACiAJICogY3Vyc29yIGxvZ2ljLiAgV2UgaWRlbnRpZnkgUGFjaWZpY2EgMSBhcyBub3QgUGFjaWZpY2EgMiwgdGhlCiAJICogbGF0dGVyIGhhdmluZyBhIHBhcnQgbnVtYmVyIHZhbHVlIG9mIDB4MjM2ZS4KIAkgKi8KLQlpZiAoKGFsbC0+cGFyLmZsYWdzICYgRkZCX0ZMQUdfQUZCKSB8fCBkYWNfcG51bSA9PSAweDIzNmUpIHsKLQkJYWxsLT5wYXIuZmxhZ3MgJj0gfkZGQl9GTEFHX0lOVkNVUlNPUjsKKwlpZiAoKHBhci0+ZmxhZ3MgJiBGRkJfRkxBR19BRkIpIHx8IGRhY19wbnVtID09IDB4MjM2ZSkgeworCQlwYXItPmZsYWdzICY9IH5GRkJfRkxBR19JTlZDVVJTT1I7CiAJfSBlbHNlIHsKIAkJaWYgKGRhY19tcmV2IDwgMykKLQkJCWFsbC0+cGFyLmZsYWdzIHw9IEZGQl9GTEFHX0lOVkNVUlNPUjsKKwkJCXBhci0+ZmxhZ3MgfD0gRkZCX0ZMQUdfSU5WQ1VSU09SOwogCX0KIAotCWZmYl9zd2l0Y2hfZnJvbV9ncmFwaCgmYWxsLT5wYXIpOworCWZmYl9zd2l0Y2hfZnJvbV9ncmFwaChwYXIpOwogCiAJLyogVW5ibGFuayBpdCBqdXN0IHRvIGJlIHN1cmUuICBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZQogCSAqIEZGQi9BRkIgY2FyZHMgaW4gdGhlIHN5c3RlbSwgb3IgaXQgaXMgbm90IHRoZSBPQlAKIAkgKiBjaG9zZW4gY29uc29sZSwgaXQgd2lsbCBoYXZlIHZpZGVvIG91dHB1dHMgb2ZmIGluCiAJICogdGhlIERBQy4KIAkgKi8KLQlmZmJfYmxhbmsoMCwgJmFsbC0+aW5mbyk7CisJZmZiX2JsYW5rKDAsIGluZm8pOwogCi0JaWYgKGZiX2FsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwLCAyNTYsIDApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmZiOiBDb3VsZCBub3QgYWxsb2NhdGUgY29sb3IgbWFwLlxuIik7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsyXSwKLQkJCSAgIGFsbC0+cGFyLmZiYywgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwKLQkJCSAgIGFsbC0+cGFyLmRhYywgc2l6ZW9mKHN0cnVjdCBmZmJfZGFjKSk7Ci0JCWtmcmVlKGFsbCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSkKKwkJZ290byBvdXRfdW5tYXBfZGFjOwogCi0JZmZiX2luaXRfZml4KCZhbGwtPmluZm8pOworCWZmYl9pbml0X2ZpeChpbmZvKTsKIAotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmZiOiBDb3VsZCBub3QgcmVnaXN0ZXIgZnJhbWVidWZmZXIuXG4iKTsKLQkJZmJfZGVhbGxvY19jbWFwKCZhbGwtPmluZm8uY21hcCk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsyXSwKLQkJCSAgIGFsbC0+cGFyLmZiYywgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsxXSwKLQkJCSAgIGFsbC0+cGFyLmRhYywgc2l6ZW9mKHN0cnVjdCBmZmJfZGFjKSk7Ci0JCWtmcmVlKGFsbCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9kZWFsbG9jX2NtYXA7CiAKLQlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGFsbCk7CisJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBpbmZvKTsKIAogCXByaW50aygiJXM6ICVzIGF0ICUwMTZseCwgdHlwZSAlZCwgIgogCSAgICAgICAiREFDIHBudW1bJXhdIHJldlslZF0gbWFudWZfcmV2WyVkXVxuIiwKIAkgICAgICAgZHAtPmZ1bGxfbmFtZSwKLQkgICAgICAgKChhbGwtPnBhci5mbGFncyAmIEZGQl9GTEFHX0FGQikgPyAiQUZCIiA6ICJGRkIiKSwKLQkgICAgICAgYWxsLT5wYXIucGh5c2Jhc2UsIGFsbC0+cGFyLmJvYXJkX3R5cGUsCisJICAgICAgICgocGFyLT5mbGFncyAmIEZGQl9GTEFHX0FGQikgPyAiQUZCIiA6ICJGRkIiKSwKKwkgICAgICAgcGFyLT5waHlzYmFzZSwgcGFyLT5ib2FyZF90eXBlLAogCSAgICAgICBkYWNfcG51bSwgZGFjX3JldiwgZGFjX21yZXYpOwogCiAJcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGZmYl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQotewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gdG9fb2ZfZGV2aWNlKCZkZXYtPmRldik7CitvdXRfZGVhbGxvY19jbWFwOgorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAKLQlyZXR1cm4gZmZiX2luaXRfb25lKG9wKTsKK291dF91bm1hcF9kYWM6CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBwYXItPmZiYywgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSk7CisKK291dF91bm1hcF9mYmM6CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBwYXItPmZiYywgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSk7CisKK291dF9yZWxlYXNlX2ZiOgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgZmZiX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKLQlzdHJ1Y3QgYWxsX2luZm8gKmFsbCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBmZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAotCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsyXSwgYWxsLT5wYXIuZmJjLCBzaXplb2Yoc3RydWN0IGZmYl9mYmMpKTsKLQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMV0sIGFsbC0+cGFyLmRhYywgc2l6ZW9mKHN0cnVjdCBmZmJfZGFjKSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBwYXItPmZiYywgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzFdLCBwYXItPmRhYywgc2l6ZW9mKHN0cnVjdCBmZmJfZGFjKSk7CiAKLQlrZnJlZShhbGwpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CiAKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xlby5jIGIvZHJpdmVycy92aWRlby9sZW8uYwppbmRleCBhMDM4YWE1Li40NWI5YTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xlby5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbGVvLmMKQEAgLTUyNSwxMzAgKzUyNSwxMjMgQEAKIAl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwogfQogCi1zdHJ1Y3QgYWxsX2luZm8gewotCXN0cnVjdCBmYl9pbmZvIGluZm87Ci0Jc3RydWN0IGxlb19wYXIgcGFyOwotfTsKLQotc3RhdGljIHZvaWQgbGVvX3VubWFwX3JlZ3Moc3RydWN0IG9mX2RldmljZSAqb3AsIHN0cnVjdCBhbGxfaW5mbyAqYWxsKQorc3RhdGljIHZvaWQgbGVvX3VubWFwX3JlZ3Moc3RydWN0IG9mX2RldmljZSAqb3AsIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGxlb19wYXIgKnBhcikKIHsKLQlpZiAoYWxsLT5wYXIubGNfc3MwX3VzcikKLQkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBhbGwtPnBhci5sY19zczBfdXNyLCAweDEwMDApOwotCWlmIChhbGwtPnBhci5sZF9zczApCi0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5wYXIubGRfc3MwLCAweDEwMDApOwotCWlmIChhbGwtPnBhci5sZF9zczEpCi0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5wYXIubGRfc3MxLCAweDEwMDApOwotCWlmIChhbGwtPnBhci5seF9rcm4pCi0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5wYXIubHhfa3JuLCAweDEwMDApOwotCWlmIChhbGwtPnBhci5jdXJzb3IpCisJaWYgKHBhci0+bGNfc3MwX3VzcikKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwYXItPmxjX3NzMF91c3IsIDB4MTAwMCk7CisJaWYgKHBhci0+bGRfc3MwKQorCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIHBhci0+bGRfc3MwLCAweDEwMDApOworCWlmIChwYXItPmxkX3NzMSkKKwkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwYXItPmxkX3NzMSwgMHgxMDAwKTsKKwlpZiAocGFyLT5seF9rcm4pCisJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcGFyLT5seF9rcm4sIDB4MTAwMCk7CisJaWYgKHBhci0+Y3Vyc29yKQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5jdXJzb3IsIHNpemVvZihzdHJ1Y3QgbGVvX2N1cnNvcikpOwotCWlmIChhbGwtPmluZm8uc2NyZWVuX2Jhc2UpCi0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5pbmZvLnNjcmVlbl9iYXNlLCAweDgwMDAwMCk7CisJCQkgICBwYXItPmN1cnNvciwgc2l6ZW9mKHN0cnVjdCBsZW9fY3Vyc29yKSk7CisJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQorCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sIGluZm8tPnNjcmVlbl9iYXNlLCAweDgwMDAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGxlb19pbml0X29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxlb19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwotCXN0cnVjdCBhbGxfaW5mbyAqYWxsOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBsZW9fcGFyICpwYXI7CiAJaW50IGxpbmVieXRlcywgZXJyOwogCi0JYWxsID0ga3phbGxvYyhzaXplb2YoKmFsbCksIEdGUF9LRVJORUwpOwotCWlmICghYWxsKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZW9fcGFyKSwgJm9wLT5kZXYpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmFsbC0+cGFyLmxvY2spOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOwogCi0JYWxsLT5wYXIucGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JYWxsLT5wYXIud2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMF0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisJc3Bpbl9sb2NrX2luaXQoJnBhci0+bG9jayk7CiAKLQlzYnVzZmJfZmlsbF92YXIoJmFsbC0+aW5mby52YXIsIGRwLT5ub2RlLCAzMik7Ci0JbGVvX2ZpeHVwX3Zhcl9yZ2IoJmFsbC0+aW5mby52YXIpOworCXBhci0+cGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJcGFyLT53aGljaF9pbyA9IG9wLT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfQklUUzsKKworCXNidXNmYl9maWxsX3ZhcigmaW5mby0+dmFyLCBkcC0+bm9kZSwgMzIpOworCWxlb19maXh1cF92YXJfcmdiKCZpbmZvLT52YXIpOwogCiAJbGluZWJ5dGVzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibGluZWJ5dGVzIiwKLQkJCQkJICBhbGwtPmluZm8udmFyLnhyZXMpOwotCWFsbC0+cGFyLmZic2l6ZSA9IFBBR0VfQUxJR04obGluZWJ5dGVzICogYWxsLT5pbmZvLnZhci55cmVzKTsKKwkJCQkJICBpbmZvLT52YXIueHJlcyk7CisJcGFyLT5mYnNpemUgPSBQQUdFX0FMSUdOKGxpbmVieXRlcyAqIGluZm8tPnZhci55cmVzKTsKIAotCWFsbC0+cGFyLmxjX3NzMF91c3IgPQorCXBhci0+bGNfc3MwX3VzciA9CiAJCW9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgTEVPX09GRl9MQ19TUzBfVVNSLAogCQkJICAgMHgxMDAwLCAibGVvbGMgc3MwdXNyIik7Ci0JYWxsLT5wYXIubGRfc3MwID0KKwlwYXItPmxkX3NzMCA9CiAJCW9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgTEVPX09GRl9MRF9TUzAsCiAJCQkgICAweDEwMDAsICJsZW9sZCBzczAiKTsKLQlhbGwtPnBhci5sZF9zczEgPQorCXBhci0+bGRfc3MxID0KIAkJb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCBMRU9fT0ZGX0xEX1NTMSwKIAkJCSAgIDB4MTAwMCwgImxlb2xkIHNzMSIpOwotCWFsbC0+cGFyLmx4X2tybiA9CisJcGFyLT5seF9rcm4gPQogCQlvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIExFT19PRkZfTFhfS1JOLAogCQkJICAgMHgxMDAwLCAibGVvbHgga3JuIik7Ci0JYWxsLT5wYXIuY3Vyc29yID0KKwlwYXItPmN1cnNvciA9CiAJCW9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgTEVPX09GRl9MWF9DVVJTT1IsCiAJCQkgICBzaXplb2Yoc3RydWN0IGxlb19jdXJzb3IpLCAibGVvbHggY3Vyc29yIik7Ci0JYWxsLT5pbmZvLnNjcmVlbl9iYXNlID0gCisJaW5mby0+c2NyZWVuX2Jhc2UgPQogCQlvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIExFT19PRkZfU1MwLAogCQkJICAgMHg4MDAwMDAsICJsZW8gcmFtIik7Ci0JaWYgKCFhbGwtPnBhci5sY19zczBfdXNyIHx8Ci0JICAgICFhbGwtPnBhci5sZF9zczAgfHwKLQkgICAgIWFsbC0+cGFyLmxkX3NzMSB8fAotCSAgICAhYWxsLT5wYXIubHhfa3JuIHx8Ci0JICAgICFhbGwtPnBhci5jdXJzb3IgfHwKLQkgICAgIWFsbC0+aW5mby5zY3JlZW5fYmFzZSkgewotCQlsZW9fdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmICghcGFyLT5sY19zczBfdXNyIHx8CisJICAgICFwYXItPmxkX3NzMCB8fAorCSAgICAhcGFyLT5sZF9zczEgfHwKKwkgICAgIXBhci0+bHhfa3JuIHx8CisJICAgICFwYXItPmN1cnNvciB8fAorCSAgICAhaW5mby0+c2NyZWVuX2Jhc2UpCisJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAKLQlhbGwtPmluZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX1lQQU47Ci0JYWxsLT5pbmZvLmZib3BzID0gJmxlb19vcHM7Ci0JYWxsLT5pbmZvLnBhciA9ICZhbGwtPnBhcjsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsKKwlpbmZvLT5mYm9wcyA9ICZsZW9fb3BzOwogCi0JbGVvX2luaXRfd2lkcygmYWxsLT5pbmZvKTsKLQlsZW9faW5pdF9odygmYWxsLT5pbmZvKTsKKwlsZW9faW5pdF93aWRzKGluZm8pOworCWxlb19pbml0X2h3KGluZm8pOwogCi0JbGVvX2JsYW5rKDAsICZhbGwtPmluZm8pOworCWxlb19ibGFuaygwLCBpbmZvKTsKIAotCWlmIChmYl9hbGxvY19jbWFwKCZhbGwtPmluZm8uY21hcCwgMjU2LCAwKSkgewotCQlsZW9fdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07OwotCX0KKwlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSkKKwkJZ290byBvdXRfdW5tYXBfcmVnczsKIAotCWxlb19pbml0X2ZpeCgmYWxsLT5pbmZvLCBkcCk7CisJbGVvX2luaXRfZml4KGluZm8sIGRwKTsKIAotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOwotCQlsZW9fdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2RlYWxsb2NfY21hcDsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgYWxsKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGluZm8pOwogCiAJcHJpbnRrKCIlczogbGVvIGF0ICVseDolbHhcbiIsCiAJICAgICAgIGRwLT5mdWxsX25hbWUsCi0JICAgICAgIGFsbC0+cGFyLndoaWNoX2lvLCBhbGwtPnBhci5waHlzYmFzZSk7CisJICAgICAgIHBhci0+d2hpY2hfaW8sIHBhci0+cGh5c2Jhc2UpOwogCiAJcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGxlb19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQotewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gdG9fb2ZfZGV2aWNlKCZkZXYtPmRldik7CitvdXRfZGVhbGxvY19jbWFwOgorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAKLQlyZXR1cm4gbGVvX2luaXRfb25lKG9wKTsKK291dF91bm1hcF9yZWdzOgorCWxlb191bm1hcF9yZWdzKG9wLCBpbmZvLCBwYXIpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgbGVvX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKLQlzdHJ1Y3QgYWxsX2luZm8gKmFsbCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBsZW9fcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAotCWxlb191bm1hcF9yZWdzKG9wLCBhbGwpOworCWxlb191bm1hcF9yZWdzKG9wLCBpbmZvLCBwYXIpOwogCi0Ja2ZyZWUoYWxsKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCiAJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wOTEwMC5jIGIvZHJpdmVycy92aWRlby9wOTEwMC5jCmluZGV4IDYzN2I3OGIuLjU4NDk2MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcDkxMDAuYworKysgYi9kcml2ZXJzL3ZpZGVvL3A5MTAwLmMKQEAgLTI1NSwxMDcgKzI1NSw5NSBAQAogCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX1NVTl9DR1RIUkVFOwogfQogCi1zdHJ1Y3QgYWxsX2luZm8gewotCXN0cnVjdCBmYl9pbmZvIGluZm87Ci0Jc3RydWN0IHA5MTAwX3BhciBwYXI7Ci19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwOTEwMF9pbml0X29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHA5MTAwX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb3AtPm5vZGU7Ci0Jc3RydWN0IGFsbF9pbmZvICphbGw7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IHA5MTAwX3BhciAqcGFyOwogCWludCBsaW5lYnl0ZXMsIGVycjsKIAotCWFsbCA9IGt6YWxsb2Moc2l6ZW9mKCphbGwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFsbCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgcDkxMDBfcGFyKSwgJm9wLT5kZXYpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmFsbC0+cGFyLmxvY2spOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOworCisJc3Bpbl9sb2NrX2luaXQoJnBhci0+bG9jayk7CiAKIAkvKiBUaGlzIGlzIHRoZSBmcmFtZWJ1ZmZlciBhbmQgdGhlIG9ubHkgcmVzb3VyY2UgYXBwcyBjYW4gbW1hcC4gICovCi0JYWxsLT5wYXIucGh5c2Jhc2UgPSBvcC0+cmVzb3VyY2VbMl0uc3RhcnQ7Ci0JYWxsLT5wYXIud2hpY2hfaW8gPSBvcC0+cmVzb3VyY2VbMl0uZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFM7CisJcGFyLT5waHlzYmFzZSA9IG9wLT5yZXNvdXJjZVsyXS5zdGFydDsKKwlwYXItPndoaWNoX2lvID0gb3AtPnJlc291cmNlWzJdLmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTOwogCi0Jc2J1c2ZiX2ZpbGxfdmFyKCZhbGwtPmluZm8udmFyLCBkcC0+bm9kZSwgOCk7Ci0JYWxsLT5pbmZvLnZhci5yZWQubGVuZ3RoID0gODsKLQlhbGwtPmluZm8udmFyLmdyZWVuLmxlbmd0aCA9IDg7Ci0JYWxsLT5pbmZvLnZhci5ibHVlLmxlbmd0aCA9IDg7CisJc2J1c2ZiX2ZpbGxfdmFyKCZpbmZvLT52YXIsIGRwLT5ub2RlLCA4KTsKKwlpbmZvLT52YXIucmVkLmxlbmd0aCA9IDg7CisJaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9IDg7CisJaW5mby0+dmFyLmJsdWUubGVuZ3RoID0gODsKIAotCWxpbmVieXRlcyA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImxpbmVieXRlcyIsCi0JCQkJCSAgYWxsLT5pbmZvLnZhci54cmVzKTsKLQlhbGwtPnBhci5mYnNpemUgPSBQQUdFX0FMSUdOKGxpbmVieXRlcyAqIGFsbC0+aW5mby52YXIueXJlcyk7CisJbGluZWJ5dGVzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibGluZWJ5dGVzIiwgaW5mby0+dmFyLnhyZXMpOworCXBhci0+ZmJzaXplID0gUEFHRV9BTElHTihsaW5lYnl0ZXMgKiBpbmZvLT52YXIueXJlcyk7CiAKLQlhbGwtPnBhci5yZWdzID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzBdLCAwLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgcDkxMDBfcmVncyksICJwOTEwMCByZWdzIik7Ci0JaWYgKCFhbGwtPnBhci5yZWdzKSB7Ci0JCWtmcmVlKGFsbCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlwYXItPnJlZ3MgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMF0sIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwOTEwMF9yZWdzKSwgInA5MTAwIHJlZ3MiKTsKKwlpZiAoIXBhci0+cmVncykKKwkJZ290byBvdXRfcmVsZWFzZV9mYjsKIAotCWFsbC0+aW5mby5mbGFncyA9IEZCSU5GT19ERUZBVUxUOwotCWFsbC0+aW5mby5mYm9wcyA9ICZwOTEwMF9vcHM7Ci0JYWxsLT5pbmZvLnNjcmVlbl9iYXNlID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzJdLCAwLAotCQkJCQkgICBhbGwtPnBhci5mYnNpemUsICJwOTEwMCByYW0iKTsKLQlpZiAoIWFsbC0+aW5mby5zY3JlZW5fYmFzZSkgewotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPnBhci5yZWdzLCBzaXplb2Yoc3RydWN0IHA5MTAwX3JlZ3MpKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWFsbC0+aW5mby5wYXIgPSAmYWxsLT5wYXI7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKKwlpbmZvLT5mYm9wcyA9ICZwOTEwMF9vcHM7CisJaW5mby0+c2NyZWVuX2Jhc2UgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbMl0sIDAsCisJCQkJICAgICAgIHBhci0+ZmJzaXplLCAicDkxMDAgcmFtIik7CisJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkKKwkJZ290byBvdXRfdW5tYXBfcmVnczsKIAotCXA5MTAwX2JsYW5rKDAsICZhbGwtPmluZm8pOworCXA5MTAwX2JsYW5rKDAsIGluZm8pOwogCi0JaWYgKGZiX2FsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwLCAyNTYsIDApKSB7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwKLQkJCSAgIGFsbC0+cGFyLnJlZ3MsIHNpemVvZihzdHJ1Y3QgcDkxMDBfcmVncykpOwotCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMl0sCi0JCQkgICBhbGwtPmluZm8uc2NyZWVuX2Jhc2UsIGFsbC0+cGFyLmZic2l6ZSk7Ci0JCWtmcmVlKGFsbCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKSkKKwkJZ290byBvdXRfdW5tYXBfc2NyZWVuOwogCi0JcDkxMDBfaW5pdF9maXgoJmFsbC0+aW5mbywgbGluZWJ5dGVzLCBkcCk7CisJcDkxMDBfaW5pdF9maXgoaW5mbywgbGluZWJ5dGVzLCBkcCk7CiAKLQllcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmYWxsLT5pbmZvKTsKLQlpZiAoZXJyIDwgMCkgewotCQlmYl9kZWFsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwKTsKLQkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLAotCQkJICAgYWxsLT5wYXIucmVncywgc2l6ZW9mKHN0cnVjdCBwOTEwMF9yZWdzKSk7Ci0JCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsyXSwKLQkJCSAgIGFsbC0+aW5mby5zY3JlZW5fYmFzZSwgYWxsLT5wYXIuZmJzaXplKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JZmJfc2V0X2NtYXAoJmFsbC0+aW5mby5jbWFwLCAmYWxsLT5pbmZvKTsKKwllcnIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZGVhbGxvY19jbWFwOwogCi0JZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBhbGwpOworCWZiX3NldF9jbWFwKCZpbmZvLT5jbWFwLCBpbmZvKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgaW5mbyk7CiAKIAlwcmludGsoIiVzOiBwOTEwMCBhdCAlbHg6JWx4XG4iLAogCSAgICAgICBkcC0+ZnVsbF9uYW1lLAotCSAgICAgICBhbGwtPnBhci53aGljaF9pbywgYWxsLT5wYXIucGh5c2Jhc2UpOworCSAgICAgICBwYXItPndoaWNoX2lvLCBwYXItPnBoeXNiYXNlKTsKIAogCXJldHVybiAwOwotfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwOTEwMF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQotewotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gdG9fb2ZfZGV2aWNlKCZkZXYtPmRldik7CitvdXRfZGVhbGxvY19jbWFwOgorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CiAKLQlyZXR1cm4gcDkxMDBfaW5pdF9vbmUob3ApOworb3V0X3VubWFwX3NjcmVlbjoKKwlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMl0sIGluZm8tPnNjcmVlbl9iYXNlLCBwYXItPmZic2l6ZSk7CisKK291dF91bm1hcF9yZWdzOgorCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgcGFyLT5yZWdzLCBzaXplb2Yoc3RydWN0IHA5MTAwX3JlZ3MpKTsKKworb3V0X3JlbGVhc2VfZmI6CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKworb3V0X2VycjoKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBwOTEwMF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7Ci0Jc3RydWN0IGFsbF9pbmZvICphbGwgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKKwlzdHJ1Y3QgcDkxMDBfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAotCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVswXSwgYWxsLT5wYXIucmVncywgc2l6ZW9mKHN0cnVjdCBwOTEwMF9yZWdzKSk7Ci0Jb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzJdLCBhbGwtPmluZm8uc2NyZWVuX2Jhc2UsIGFsbC0+cGFyLmZic2l6ZSk7CisJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzBdLCBwYXItPnJlZ3MsIHNpemVvZihzdHJ1Y3QgcDkxMDBfcmVncykpOworCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVsyXSwgaW5mby0+c2NyZWVuX2Jhc2UsIHBhci0+ZmJzaXplKTsKIAotCWtmcmVlKGFsbCk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2J1c2xpYi5jIGIvZHJpdmVycy92aWRlby9zYnVzbGliLmMKaW5kZXggMzRlZjg1OS4uOTYzYTQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zYnVzbGliLmMKKysrIGIvZHJpdmVycy92aWRlby9zYnVzbGliLmMKQEAgLTE5MCwxNyArMTkwLDYgQEAKIEVYUE9SVF9TWU1CT0woc2J1c2ZiX2lvY3RsX2hlbHBlcik7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgIGZiY21hcDMyIHsKLQlpbnQgICAgICAgICAgICAgaW5kZXg7ICAgICAgICAgIC8qIGZpcnN0IGVsZW1lbnQgKDAgb3JpZ2luKSAqLwotCWludCAgICAgICAgICAgICBjb3VudDsKLQl1MzIJCXJlZDsKLQl1MzIJCWdyZWVuOwotCXUzMgkJYmx1ZTsKLX07Ci0KLSNkZWZpbmUgRkJJT1BVVENNQVAzMglfSU9XKCdGJywgMywgc3RydWN0IGZiY21hcDMyKQotI2RlZmluZSBGQklPR0VUQ01BUDMyCV9JT1coJ0YnLCA0LCBzdHJ1Y3QgZmJjbWFwMzIpCi0KIHN0YXRpYyBpbnQgZmJpb2dldHB1dGNtYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBmYmNtYXAzMiBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CkBAIC0yMjMsMjAgKzIxMiw2IEBACiAJCQkodW5zaWduZWQgbG9uZylwKTsKIH0KIAotc3RydWN0IGZiY3Vyc29yMzIgewotCXNob3J0IHNldDsJCS8qIHdoYXQgdG8gc2V0LCBjaG9vc2UgZnJvbSB0aGUgbGlzdCBhYm92ZSAqLwotCXNob3J0IGVuYWJsZTsJCS8qIGN1cnNvciBvbi9vZmYgKi8KLQlzdHJ1Y3QgZmJjdXJwb3MgcG9zOwkvKiBjdXJzb3IgcG9zaXRpb24gKi8KLQlzdHJ1Y3QgZmJjdXJwb3MgaG90OwkvKiBjdXJzb3IgaG90IHNwb3QgKi8KLQlzdHJ1Y3QgZmJjbWFwMzIgY21hcDsJLyogY29sb3IgbWFwIGluZm8gKi8KLQlzdHJ1Y3QgZmJjdXJwb3Mgc2l6ZTsJLyogY3Vyc29yIGJpdCBtYXAgc2l6ZSAqLwotCXUzMglpbWFnZTsJCS8qIGN1cnNvciBpbWFnZSBiaXRzICovCi0JdTMyCW1hc2s7CQkvKiBjdXJzb3IgbWFzayBiaXRzICovCi19OwotCi0jZGVmaW5lIEZCSU9TQ1VSU09SMzIJX0lPVygnRicsIDI0LCBzdHJ1Y3QgZmJjdXJzb3IzMikKLSNkZWZpbmUgRkJJT0dDVVJTT1IzMglfSU9XKCdGJywgMjUsIHN0cnVjdCBmYmN1cnNvcjMyKQotCiBzdGF0aWMgaW50IGZiaW9nc2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZiY3Vyc29yIF9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90Y3guYyBiL2RyaXZlcnMvdmlkZW8vdGN4LmMKaW5kZXggNWE5OTY2OS4uZTVhOWRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90Y3guYworKysgYi9kcml2ZXJzL3ZpZGVvL3RjeC5jCkBAIC0zNDUsODggKzM0NSw4MiBAQAogCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX1NVTl9UQ1g7CiB9CiAKLXN0cnVjdCBhbGxfaW5mbyB7Ci0Jc3RydWN0IGZiX2luZm8gaW5mbzsKLQlzdHJ1Y3QgdGN4X3BhciBwYXI7Ci19OwotCi1zdGF0aWMgdm9pZCB0Y3hfdW5tYXBfcmVncyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgc3RydWN0IGFsbF9pbmZvICphbGwpCitzdGF0aWMgdm9pZCB0Y3hfdW5tYXBfcmVncyhzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgdGN4X3BhciAqcGFyKQogewotCWlmIChhbGwtPnBhci50ZWMpCisJaWYgKHBhci0+dGVjKQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbN10sCi0JCQkgICBhbGwtPnBhci50ZWMsIHNpemVvZihzdHJ1Y3QgdGN4X3RlYykpOwotCWlmIChhbGwtPnBhci50aGMpCisJCQkgICBwYXItPnRlYywgc2l6ZW9mKHN0cnVjdCB0Y3hfdGVjKSk7CisJaWYgKHBhci0+dGhjKQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbOV0sCi0JCQkgICBhbGwtPnBhci50aGMsIHNpemVvZihzdHJ1Y3QgdGN4X3RoYykpOwotCWlmIChhbGwtPnBhci5idCkKKwkJCSAgIHBhci0+dGhjLCBzaXplb2Yoc3RydWN0IHRjeF90aGMpKTsKKwlpZiAocGFyLT5idCkKIAkJb2ZfaW91bm1hcCgmb3AtPnJlc291cmNlWzhdLAotCQkJICAgYWxsLT5wYXIuYnQsIHNpemVvZihzdHJ1Y3QgYnRfcmVncykpOwotCWlmIChhbGwtPnBhci5jcGxhbmUpCisJCQkgICBwYXItPmJ0LCBzaXplb2Yoc3RydWN0IGJ0X3JlZ3MpKTsKKwlpZiAocGFyLT5jcGxhbmUpCiAJCW9mX2lvdW5tYXAoJm9wLT5yZXNvdXJjZVs0XSwKLQkJCSAgIGFsbC0+cGFyLmNwbGFuZSwgYWxsLT5wYXIuZmJzaXplICogc2l6ZW9mKHUzMikpOwotCWlmIChhbGwtPmluZm8uc2NyZWVuX2Jhc2UpCisJCQkgICBwYXItPmNwbGFuZSwgcGFyLT5mYnNpemUgKiBzaXplb2YodTMyKSk7CisJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQogCQlvZl9pb3VubWFwKCZvcC0+cmVzb3VyY2VbMF0sCi0JCQkgICBhbGwtPmluZm8uc2NyZWVuX2Jhc2UsIGFsbC0+cGFyLmZic2l6ZSk7CisJCQkgICBpbmZvLT5zY3JlZW5fYmFzZSwgcGFyLT5mYnNpemUpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0Y3hfaW5pdF9vbmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwotCXN0cnVjdCBhbGxfaW5mbyAqYWxsOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCB0Y3hfcGFyICpwYXI7CiAJaW50IGxpbmVieXRlcywgaSwgZXJyOwogCi0JYWxsID0ga3phbGxvYyhzaXplb2YoKmFsbCksIEdGUF9LRVJORUwpOwotCWlmICghYWxsKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCB0Y3hfcGFyKSwgJm9wLT5kZXYpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmFsbC0+cGFyLmxvY2spOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFpbmZvKQorCQlnb3RvIG91dF9lcnI7CisJcGFyID0gaW5mby0+cGFyOwogCi0JYWxsLT5wYXIubG93ZGVwdGggPQorCXNwaW5fbG9ja19pbml0KCZwYXItPmxvY2spOworCisJcGFyLT5sb3dkZXB0aCA9CiAJCShvZl9maW5kX3Byb3BlcnR5KGRwLCAidGN4LTgtYml0IiwgTlVMTCkgIT0gTlVMTCk7CiAKLQlzYnVzZmJfZmlsbF92YXIoJmFsbC0+aW5mby52YXIsIGRwLT5ub2RlLCA4KTsKLQlhbGwtPmluZm8udmFyLnJlZC5sZW5ndGggPSA4OwotCWFsbC0+aW5mby52YXIuZ3JlZW4ubGVuZ3RoID0gODsKLQlhbGwtPmluZm8udmFyLmJsdWUubGVuZ3RoID0gODsKKwlzYnVzZmJfZmlsbF92YXIoJmluZm8tPnZhciwgZHAtPm5vZGUsIDgpOworCWluZm8tPnZhci5yZWQubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoID0gODsKKwlpbmZvLT52YXIuYmx1ZS5sZW5ndGggPSA4OwogCiAJbGluZWJ5dGVzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAibGluZWJ5dGVzIiwKLQkJCQkJICBhbGwtPmluZm8udmFyLnhyZXMpOwotCWFsbC0+cGFyLmZic2l6ZSA9IFBBR0VfQUxJR04obGluZWJ5dGVzICogYWxsLT5pbmZvLnZhci55cmVzKTsKKwkJCQkJICBpbmZvLT52YXIueHJlcyk7CisJcGFyLT5mYnNpemUgPSBQQUdFX0FMSUdOKGxpbmVieXRlcyAqIGluZm8tPnZhci55cmVzKTsKIAotCWFsbC0+cGFyLnRlYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVs3XSwgMCwKKwlwYXItPnRlYyA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVs3XSwgMCwKIAkJCQkgIHNpemVvZihzdHJ1Y3QgdGN4X3RlYyksICJ0Y3ggdGVjIik7Ci0JYWxsLT5wYXIudGhjID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzldLCAwLAorCXBhci0+dGhjID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzldLCAwLAogCQkJCSAgc2l6ZW9mKHN0cnVjdCB0Y3hfdGhjKSwgInRjeCB0aGMiKTsKLQlhbGwtPnBhci5idCA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVs4XSwgMCwKKwlwYXItPmJ0ID0gb2ZfaW9yZW1hcCgmb3AtPnJlc291cmNlWzhdLCAwLAogCQkJCSBzaXplb2Yoc3RydWN0IGJ0X3JlZ3MpLCAidGN4IGRhYyIpOwotCWFsbC0+aW5mby5zY3JlZW5fYmFzZSA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKLQkJCQkJICAgYWxsLT5wYXIuZmJzaXplLCAidGN4IHJhbSIpOwotCWlmICghYWxsLT5wYXIudGVjIHx8ICFhbGwtPnBhci50aGMgfHwKLQkgICAgIWFsbC0+cGFyLmJ0IHx8ICFhbGwtPmluZm8uc2NyZWVuX2Jhc2UpIHsKLQkJdGN4X3VubWFwX3JlZ3Mob3AsIGFsbCk7Ci0JCWtmcmVlKGFsbCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpbmZvLT5zY3JlZW5fYmFzZSA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkJICAgcGFyLT5mYnNpemUsICJ0Y3ggcmFtIik7CisJaWYgKCFwYXItPnRlYyB8fCAhcGFyLT50aGMgfHwKKwkgICAgIXBhci0+YnQgfHwgIWluZm8tPnNjcmVlbl9iYXNlKQorCQlnb3RvIG91dF91bm1hcF9yZWdzOwogCi0JbWVtY3B5KCZhbGwtPnBhci5tbWFwX21hcCwgJl9fdGN4X21tYXBfbWFwLCBzaXplb2YoYWxsLT5wYXIubW1hcF9tYXApKTsKLQlpZiAoIWFsbC0+cGFyLmxvd2RlcHRoKSB7Ci0JCWFsbC0+cGFyLmNwbGFuZSA9IG9mX2lvcmVtYXAoJm9wLT5yZXNvdXJjZVs0XSwgMCwKLQkJCQkJICAgICBhbGwtPnBhci5mYnNpemUgKiBzaXplb2YodTMyKSwKKwltZW1jcHkoJnBhci0+bW1hcF9tYXAsICZfX3RjeF9tbWFwX21hcCwgc2l6ZW9mKHBhci0+bW1hcF9tYXApKTsKKwlpZiAoIXBhci0+bG93ZGVwdGgpIHsKKwkJcGFyLT5jcGxhbmUgPSBvZl9pb3JlbWFwKCZvcC0+cmVzb3VyY2VbNF0sIDAsCisJCQkJCSAgICAgcGFyLT5mYnNpemUgKiBzaXplb2YodTMyKSwKIAkJCQkJICAgICAidGN4IGNwbGFuZSIpOwotCQlpZiAoIWFsbC0+cGFyLmNwbGFuZSkgewotCQkJdGN4X3VubWFwX3JlZ3Mob3AsIGFsbCk7Ci0JCQlrZnJlZShhbGwpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKwkJaWYgKCFwYXItPmNwbGFuZSkKKwkJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAJfSBlbHNlIHsKLQkJYWxsLT5wYXIubW1hcF9tYXBbMV0uc2l6ZSA9IFNCVVNfTU1BUF9FTVBUWTsKLQkJYWxsLT5wYXIubW1hcF9tYXBbNF0uc2l6ZSA9IFNCVVNfTU1BUF9FTVBUWTsKLQkJYWxsLT5wYXIubW1hcF9tYXBbNV0uc2l6ZSA9IFNCVVNfTU1BUF9FTVBUWTsKLQkJYWxsLT5wYXIubW1hcF9tYXBbNl0uc2l6ZSA9IFNCVVNfTU1BUF9FTVBUWTsKKwkJcGFyLT5tbWFwX21hcFsxXS5zaXplID0gU0JVU19NTUFQX0VNUFRZOworCQlwYXItPm1tYXBfbWFwWzRdLnNpemUgPSBTQlVTX01NQVBfRU1QVFk7CisJCXBhci0+bW1hcF9tYXBbNV0uc2l6ZSA9IFNCVVNfTU1BUF9FTVBUWTsKKwkJcGFyLT5tbWFwX21hcFs2XS5zaXplID0gU0JVU19NTUFQX0VNUFRZOwogCX0KIAotCWFsbC0+cGFyLnBoeXNiYXNlID0gMDsKLQlhbGwtPnBhci53aGljaF9pbyA9IG9wLT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfQklUUzsKKwlwYXItPnBoeXNiYXNlID0gMDsKKwlwYXItPndoaWNoX2lvID0gb3AtPnJlc291cmNlWzBdLmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTOwogCiAJZm9yIChpID0gMDsgaSA8IFRDWF9NTUFQX0VOVFJJRVM7IGkrKykgewogCQlpbnQgajsKQEAgLTQ0NCw1MyArNDM4LDU0IEBACiAJCQlqID0gaTsKIAkJCWJyZWFrOwogCQl9OwotCQlhbGwtPnBhci5tbWFwX21hcFtpXS5wb2ZmID0gb3AtPnJlc291cmNlW2pdLnN0YXJ0OworCQlwYXItPm1tYXBfbWFwW2ldLnBvZmYgPSBvcC0+cmVzb3VyY2Vbal0uc3RhcnQ7CiAJfQogCi0JYWxsLT5pbmZvLmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7Ci0JYWxsLT5pbmZvLmZib3BzID0gJnRjeF9vcHM7Ci0JYWxsLT5pbmZvLnBhciA9ICZhbGwtPnBhcjsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCWluZm8tPmZib3BzID0gJnRjeF9vcHM7CiAKIAkvKiBJbml0aWFsaXplIGJyb29rdHJlZSBEQUMuICovCi0Jc2J1c193cml0ZWwoMHgwNCA8PCAyNCwgJmFsbC0+cGFyLmJ0LT5hZGRyKTsgICAgICAgICAvKiBjb2xvciBwbGFuZXMgKi8KLQlzYnVzX3dyaXRlbCgweGZmIDw8IDI0LCAmYWxsLT5wYXIuYnQtPmNvbnRyb2wpOwotCXNidXNfd3JpdGVsKDB4MDUgPDwgMjQsICZhbGwtPnBhci5idC0+YWRkcik7Ci0Jc2J1c193cml0ZWwoMHgwMCA8PCAyNCwgJmFsbC0+cGFyLmJ0LT5jb250cm9sKTsKLQlzYnVzX3dyaXRlbCgweDA2IDw8IDI0LCAmYWxsLT5wYXIuYnQtPmFkZHIpOyAgICAgICAgIC8qIG92ZXJsYXkgcGxhbmUgKi8KLQlzYnVzX3dyaXRlbCgweDczIDw8IDI0LCAmYWxsLT5wYXIuYnQtPmNvbnRyb2wpOwotCXNidXNfd3JpdGVsKDB4MDcgPDwgMjQsICZhbGwtPnBhci5idC0+YWRkcik7Ci0Jc2J1c193cml0ZWwoMHgwMCA8PCAyNCwgJmFsbC0+cGFyLmJ0LT5jb250cm9sKTsKKwlzYnVzX3dyaXRlbCgweDA0IDw8IDI0LCAmcGFyLT5idC0+YWRkcik7ICAgICAgICAgLyogY29sb3IgcGxhbmVzICovCisJc2J1c193cml0ZWwoMHhmZiA8PCAyNCwgJnBhci0+YnQtPmNvbnRyb2wpOworCXNidXNfd3JpdGVsKDB4MDUgPDwgMjQsICZwYXItPmJ0LT5hZGRyKTsKKwlzYnVzX3dyaXRlbCgweDAwIDw8IDI0LCAmcGFyLT5idC0+Y29udHJvbCk7CisJc2J1c193cml0ZWwoMHgwNiA8PCAyNCwgJnBhci0+YnQtPmFkZHIpOyAgICAgICAgIC8qIG92ZXJsYXkgcGxhbmUgKi8KKwlzYnVzX3dyaXRlbCgweDczIDw8IDI0LCAmcGFyLT5idC0+Y29udHJvbCk7CisJc2J1c193cml0ZWwoMHgwNyA8PCAyNCwgJnBhci0+YnQtPmFkZHIpOworCXNidXNfd3JpdGVsKDB4MDAgPDwgMjQsICZwYXItPmJ0LT5jb250cm9sKTsKIAotCXRjeF9yZXNldCgmYWxsLT5pbmZvKTsKKwl0Y3hfcmVzZXQoaW5mbyk7CiAKLQl0Y3hfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgJmFsbC0+aW5mbyk7CisJdGN4X2JsYW5rKEZCX0JMQU5LX1VOQkxBTkssIGluZm8pOwogCi0JaWYgKGZiX2FsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwLCAyNTYsIDApKSB7Ci0JCXRjeF91bm1hcF9yZWdzKG9wLCBhbGwpOwotCQlrZnJlZShhbGwpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkpCisJCWdvdG8gb3V0X3VubWFwX3JlZ3M7CiAKLQlmYl9zZXRfY21hcCgmYWxsLT5pbmZvLmNtYXAsICZhbGwtPmluZm8pOwotCXRjeF9pbml0X2ZpeCgmYWxsLT5pbmZvLCBsaW5lYnl0ZXMpOworCWZiX3NldF9jbWFwKCZpbmZvLT5jbWFwLCBpbmZvKTsKKwl0Y3hfaW5pdF9maXgoaW5mbywgbGluZWJ5dGVzKTsKIAotCWVyciA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOwotCQl0Y3hfdW5tYXBfcmVncyhvcCwgYWxsKTsKLQkJa2ZyZWUoYWxsKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZXJyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2RlYWxsb2NfY21hcDsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgYWxsKTsKKwlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIGluZm8pOwogCiAJcHJpbnRrKCIlczogVENYIGF0ICVseDolbHgsICVzXG4iLAogCSAgICAgICBkcC0+ZnVsbF9uYW1lLAotCSAgICAgICBhbGwtPnBhci53aGljaF9pbywKKwkgICAgICAgcGFyLT53aGljaF9pbywKIAkgICAgICAgb3AtPnJlc291cmNlWzBdLnN0YXJ0LAotCSAgICAgICBhbGwtPnBhci5sb3dkZXB0aCA/ICI4LWJpdCBvbmx5IiA6ICIyNC1iaXQgZGVwdGgiKTsKKwkgICAgICAgcGFyLT5sb3dkZXB0aCA/ICI4LWJpdCBvbmx5IiA6ICIyNC1iaXQgZGVwdGgiKTsKIAogCXJldHVybiAwOworCitvdXRfZGVhbGxvY19jbWFwOgorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisKK291dF91bm1hcF9yZWdzOgorCXRjeF91bm1hcF9yZWdzKG9wLCBpbmZvLCBwYXIpOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHRjeF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQpAQCAtNTAyLDE0ICs0OTcsMTUgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgdGN4X3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKIHsKLQlzdHJ1Y3QgYWxsX2luZm8gKmFsbCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCB0Y3hfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKLQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZhbGwtPmluZm8pOwotCWZiX2RlYWxsb2NfY21hcCgmYWxsLT5pbmZvLmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKIAotCXRjeF91bm1hcF9yZWdzKG9wLCBhbGwpOworCXRjeF91bm1hcF9yZWdzKG9wLCBpbmZvLCBwYXIpOwogCi0Ja2ZyZWUoYWxsKTsKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCiAJZGV2X3NldF9kcnZkYXRhKCZvcC0+ZGV2LCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90Z2FmYi5jIGIvZHJpdmVycy92aWRlby90Z2FmYi5jCmluZGV4IDg5ZmFjYjcuLmQyOTJhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdGdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKQEAgLTg0OSw3ICs4NDksNyBAQAogCXUzMiAqcGFsZXR0ZSA9ICgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpOwogCXVuc2lnbmVkIGxvbmcgcG9zLCBsaW5lX2xlbmd0aCwgaSwgajsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotCXZvaWQgKnJlZ3NfYmFzZSwgKmZiX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpyZWdzX2Jhc2UsICpmYl9iYXNlOwogCiAJZHggPSBpbWFnZS0+ZHg7CiAJZHkgPSBpbWFnZS0+ZHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMxd20uYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jCmluZGV4IDc2M2JjNzMuLjRiNjk2NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczF3bS5jCkBAIC04NSw3ICs4NSw3IEBACiB9OwogCiBzdHJ1Y3QgZHMxd21fZGF0YSB7Ci0Jdm9pZAkJKm1hcDsKKwl2b2lkCQlfX2lvbWVtICptYXA7CiAJaW50CQlidXNfc2hpZnQ7IC8qICMgb2Ygc2hpZnRzIHRvIGNhbGMgcmVnaXN0ZXIgb2Zmc2V0cyAqLwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IGRzMXdtX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCmluZGV4IDllOTQzZmIuLjIyN2Q1M2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC03ODIsOCArNzgyLDggQEAKIAkJbXNnLT51LndhdGNoLnZlYyA9IHNwbGl0KGJvZHksIG1zZy0+aGRyLmxlbiwKIAkJCQkJICZtc2ctPnUud2F0Y2gudmVjX3NpemUpOwogCQlpZiAoSVNfRVJSKG1zZy0+dS53YXRjaC52ZWMpKSB7Ci0JCQlrZnJlZShtc2cpOwogCQkJZXJyID0gUFRSX0VSUihtc2ctPnUud2F0Y2gudmVjKTsKKwkJCWtmcmVlKG1zZyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDBkMmMyZDMuLjI5YTQ0YzEgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0yMzAsNyArMjMwLDcgQEAKIAl9CiB9CiAKLWlubGluZSBpbnQgYmlvX3BoeXNfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pCitpbmxpbmUgaW50IGJpb19waHlzX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaWYgKHVubGlrZWx5KCFiaW9fZmxhZ2dlZChiaW8sIEJJT19TRUdfVkFMSUQpKSkKIAkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgYmlvKTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogCXJldHVybiBiaW8tPmJpX3BoeXNfc2VnbWVudHM7CiB9CiAKLWlubGluZSBpbnQgYmlvX2h3X3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQoraW5saW5lIGludCBiaW9faHdfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlpZiAodW5saWtlbHkoIWJpb19mbGFnZ2VkKGJpbywgQklPX1NFR19WQUxJRCkpKQogCQlibGtfcmVjb3VudF9zZWdtZW50cyhxLCBiaW8pOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAgKi8KIHZvaWQgX19iaW9fY2xvbmUoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgYmlvICpiaW9fc3JjKQogewotCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJpb19zcmMtPmJpX2JkZXYpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoYmlvX3NyYy0+YmlfYmRldik7CiAKIAltZW1jcHkoYmlvLT5iaV9pb192ZWMsIGJpb19zcmMtPmJpX2lvX3ZlYywKIAkJYmlvX3NyYy0+YmlfbWF4X3ZlY3MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpKTsKQEAgLTMwMyw3ICszMDMsNyBAQAogICovCiBpbnQgYmlvX2dldF9ucl92ZWNzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gYmRldl9nZXRfcXVldWUoYmRldik7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAlpbnQgbnJfcGFnZXM7CiAKIAlucl9wYWdlcyA9ICgocS0+bWF4X3NlY3RvcnMgPDwgOSkgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJcmV0dXJuIG5yX3BhZ2VzOwogfQogCi1zdGF0aWMgaW50IF9fYmlvX2FkZF9wYWdlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZQorc3RhdGljIGludCBfX2Jpb19hZGRfcGFnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZQogCQkJICAqcGFnZSwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IG9mZnNldCwKIAkJCSAgdW5zaWduZWQgc2hvcnQgbWF4X3NlY3RvcnMpCiB7CkBAIC00MjUsNyArNDI1LDcgQEAKICAqICAgICAgc21hbGxlciB0aGFuIFBBR0VfU0laRSwgc28gaXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIGFkZCBhIHNpbmdsZQogICogICAgICBwYWdlIHRvIGFuIGVtcHR5IGJpby4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IFJFUV9QQyBiaW9zLgogICovCi1pbnQgYmlvX2FkZF9wY19wYWdlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK2ludCBiaW9fYWRkX3BjX3BhZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCSAgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXJldHVybiBfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2UsIGxlbiwgb2Zmc2V0LCBxLT5tYXhfaHdfc2VjdG9ycyk7CkBAIC01MjMsNyArNTIzLDcgQEAKICAqCXRvL2Zyb20ga2VybmVsIHBhZ2VzIGFzIG5lY2Vzc2FyeS4gTXVzdCBiZSBwYWlyZWQgd2l0aAogICoJY2FsbCBiaW9fdW5jb3B5X3VzZXIoKSBvbiBpbyBjb21wbGV0aW9uLgogICovCi1zdHJ1Y3QgYmlvICpiaW9fY29weV91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgbG9uZyB1YWRkciwKK3N0cnVjdCBiaW8gKmJpb19jb3B5X3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGxvbmcgdWFkZHIsCiAJCQkgIHVuc2lnbmVkIGludCBsZW4sIGludCB3cml0ZV90b192bSkKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9ICh1YWRkciArIGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CkBAIC02MDAsNyArNjAwLDcgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi1zdGF0aWMgc3RydWN0IGJpbyAqX19iaW9fbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqcSwKK3N0YXRpYyBzdHJ1Y3QgYmlvICpfX2Jpb19tYXBfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCQkgICAgICBzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwKIAkJCQkgICAgICBpbnQgd3JpdGVfdG9fdm0pCkBAIC03MTIsNyArNzEyLDcgQEAKIAogLyoqCiAgKgliaW9fbWFwX3VzZXIJLQltYXAgdXNlciBhZGRyZXNzIGludG8gYmlvCi0gKglAcTogdGhlIHJlcXVlc3RfcXVldWVfdCBmb3IgdGhlIGJpbworICoJQHE6IHRoZSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSBmb3IgdGhlIGJpbwogICoJQGJkZXY6IGRlc3RpbmF0aW9uIGJsb2NrIGRldmljZQogICoJQHVhZGRyOiBzdGFydCBvZiB1c2VyIGFkZHJlc3MKICAqCUBsZW46IGxlbmd0aCBpbiBieXRlcwpAQCAtNzIxLDcgKzcyMSw3IEBACiAgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCiAgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgogICovCi1zdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorc3RydWN0IGJpbyAqYmlvX21hcF91c2VyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCB3cml0ZV90b192bSkKIHsKIAlzdHJ1Y3Qgc2dfaW92ZWMgaW92OwpAQCAtNzM0LDcgKzczNCw3IEBACiAKIC8qKgogICoJYmlvX21hcF91c2VyX2lvdiAtIG1hcCB1c2VyIHNnX2lvdmVjIHRhYmxlIGludG8gYmlvCi0gKglAcTogdGhlIHJlcXVlc3RfcXVldWVfdCBmb3IgdGhlIGJpbworICoJQHE6IHRoZSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSBmb3IgdGhlIGJpbwogICoJQGJkZXY6IGRlc3RpbmF0aW9uIGJsb2NrIGRldmljZQogICoJQGlvdjoJdGhlIGlvdmVjLgogICoJQGlvdl9jb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBpb3ZlYwpAQCAtNzQzLDcgKzc0Myw3IEBACiAgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCiAgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgogICovCi1zdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKK3N0cnVjdCBiaW8gKmJpb19tYXBfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkgICAgIHN0cnVjdCBzZ19pb3ZlYyAqaW92LCBpbnQgaW92X2NvdW50LAogCQkJICAgICBpbnQgd3JpdGVfdG9fdm0pCiB7CkBAIC04MDgsNyArODA4LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IGJpbyAqX19iaW9fbWFwX2tlcm4ocmVxdWVzdF9xdWV1ZV90ICpxLCB2b2lkICpkYXRhLAorc3RhdGljIHN0cnVjdCBiaW8gKl9fYmlvX21hcF9rZXJuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB2b2lkICpkYXRhLAogCQkJCSAgdW5zaWduZWQgaW50IGxlbiwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBrYWRkciA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CkBAIC04NDcsNyArODQ3LDcgQEAKIAogLyoqCiAgKgliaW9fbWFwX2tlcm4JLQltYXAga2VybmVsIGFkZHJlc3MgaW50byBiaW8KLSAqCUBxOiB0aGUgcmVxdWVzdF9xdWV1ZV90IGZvciB0aGUgYmlvCisgKglAcTogdGhlIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIGZvciB0aGUgYmlvCiAgKglAZGF0YTogcG9pbnRlciB0byBidWZmZXIgdG8gbWFwCiAgKglAbGVuOiBsZW5ndGggaW4gYnl0ZXMKICAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBmbGFncyBmb3IgYmlvIGFsbG9jYXRpb24KQEAgLTg1NSw3ICs4NTUsNyBAQAogICoJTWFwIHRoZSBrZXJuZWwgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCiAgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgogICovCi1zdHJ1Y3QgYmlvICpiaW9fbWFwX2tlcm4ocmVxdWVzdF9xdWV1ZV90ICpxLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLAorc3RydWN0IGJpbyAqYmlvX21hcF9rZXJuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLAogCQkJIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCBiaW8gKmJpbzsKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggZTQ0MGE3Yi4uMmJjMTQyOCAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTExNSw2ICsxMTUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9kdmIvdmlkZW8uaD4KICNpbmNsdWRlIDxsaW51eC9scC5oPgogCisjaWZkZWYgQ09ORklHX1NQQVJDCisjaW5jbHVkZSA8YXNtL2ZiaW8uaD4KKyNlbmRpZgorCiBzdGF0aWMgaW50IGRvX2lvY3RsMzJfcG9pbnRlcih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmYpCiB7CkBAIC0zNDkzLDYgKzM0OTcsMjIgQEAKIAogLyogbG9vcCAqLwogSUdOT1JFX0lPQ1RMKExPT1BfQ0xSX0ZEKQorCisjaWZkZWYgQ09ORklHX1NQQVJDCisvKiBTcGFyYyBmcmFtZWJ1ZmZlcnMsIGhhbmRsZWQgaW4gc2J1c2ZiX2NvbXBhdF9pb2N0bCgpICovCitJR05PUkVfSU9DVEwoRkJJT0dUWVBFKQorSUdOT1JFX0lPQ1RMKEZCSU9TQVRUUikKK0lHTk9SRV9JT0NUTChGQklPR0FUVFIpCitJR05PUkVfSU9DVEwoRkJJT1NWSURFTykKK0lHTk9SRV9JT0NUTChGQklPR1ZJREVPKQorSUdOT1JFX0lPQ1RMKEZCSU9TQ1VSUE9TKQorSUdOT1JFX0lPQ1RMKEZCSU9HQ1VSUE9TKQorSUdOT1JFX0lPQ1RMKEZCSU9HQ1VSTUFYKQorSUdOT1JFX0lPQ1RMKEZCSU9QVVRDTUFQMzIpCitJR05PUkVfSU9DVEwoRkJJT0dFVENNQVAzMikKK0lHTk9SRV9JT0NUTChGQklPU0NVUlNPUjMyKQorSUdOT1JFX0lPQ1RMKEZCSU9HQ1VSU09SMzIpCisjZW5kaWYKIH07CiAKICNkZWZpbmUgSU9DVExfSEFTSFNJWkUgMjU2CmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwppbmRleCBjMTIwOGY1Li43OTJjYmY1IDEwMDY0NAotLS0gYS9mcy9kY29va2llcy5jCisrKyBiL2ZzL2Rjb29raWVzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Rjb29raWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA2ODU3OWEwLi42MzlhMzJjIDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC01ODAsNyArNTgwLDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSA8IGZpcnN0X2Jsb2NrIHx8Ci0JCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSArIHNiaS0+c19pdGJfcGVyX2dyb3VwID4KKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4KIAkJICAgIGxhc3RfYmxvY2spCiAJCXsKIAkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19kZXNjcmlwdG9ycyIsCmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggZjA2MTRlMy4uMjJjZmRkNiAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMTIyMSw3ICsxMjIxLDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSA8IGZpcnN0X2Jsb2NrIHx8Ci0JCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSArIHNiaS0+c19pdGJfcGVyX2dyb3VwID4KKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4KIAkJICAgIGxhc3RfYmxvY2spCiAJCXsKIAkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19kZXNjcmlwdG9ycyIsCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggNzVhZGJiNi4uNDU1MGI4MyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMTI4Myw3ICsxMjgzLDcgQEAKIAkJfQogCQlpbm9kZV90YWJsZSA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCk7CiAJCWlmIChpbm9kZV90YWJsZSA8IGZpcnN0X2Jsb2NrIHx8Ci0JCSAgICBpbm9kZV90YWJsZSArIHNiaS0+c19pdGJfcGVyX2dyb3VwID4gbGFzdF9ibG9jaykKKwkJICAgIGlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4gbGFzdF9ibG9jaykKIAkJewogCQkJZXh0NF9lcnJvciAoc2IsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzIiwKIAkJCQkgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAlZCIKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y2xvY2suYyBiL2ZzL2xvY2tkL3N2Y2xvY2suYwppbmRleCBiM2VmYTQ1Li5hMjFlNGJjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNsb2NrLmMKKysrIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCkBAIC0zMzUsMTAgKzMzNSwxMCBAQAogLyoKICAqIERlZmVycmVkIGxvY2sgcmVxdWVzdCBoYW5kbGluZyBmb3Igbm9uLWJsb2NraW5nIGxvY2sKICAqLwotc3RhdGljIHUzMgorc3RhdGljIF9fYmUzMgogbmxtc3ZjX2RlZmVyX2xvY2tfcnFzdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2Jsb2NrICpibG9jaykKIHsKLQl1MzIgc3RhdHVzID0gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKKwlfX2JlMzIgc3RhdHVzID0gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKIAogCWJsb2NrLT5iX2ZsYWdzIHw9IEJfUVVFVUVEOwogCkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJCXN0YXR1cyA9IG5sbV9kcm9wX3JlcGx5OwogCX0KIAlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX2RlZmVyX2xvY2tfcnFzdCBibG9jayAlcCBmbGFncyAlZCBzdGF0dXMgJWRcbiIsCi0JCWJsb2NrLCBibG9jay0+Yl9mbGFncywgc3RhdHVzKTsKKwkJYmxvY2ssIGJsb2NrLT5iX2ZsYWdzLCBudG9obChzdGF0dXMpKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczR4ZHIuYyBiL2ZzL25mc2QvbmZzNHhkci5jCmluZGV4IGIzZDU1YzYuLjhlZjA5NjQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHhkci5jCisrKyBiL2ZzL25mc2QvbmZzNHhkci5jCkBAIC0yNDUwLDcgKzI0NTAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX3NlY2luZm8oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLAorbmZzZDRfZW5jb2RlX3NlY2luZm8oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLAogCQkgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvICpzZWNpbmZvKQogewogCWludCBpID0gMDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCA1NzI3Y2QxLi5jNDAzNGY2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC0yMTUzLDcgKzIxNTMsNyBAQAogCXNyYyA9IGJ1Zi0+b3BzLT5tYXAocGlwZSwgYnVmLCAxKTsKIAlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CiAJbWVtY3B5KGRzdCArIG9mZnNldCwgc3JjICsgYnVmLT5vZmZzZXQsIGNvdW50KTsKLQlrdW5tYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwlrdW5tYXBfYXRvbWljKGRzdCwgS01fVVNFUjEpOwogCWJ1Zi0+b3BzLT51bm1hcChwaXBlLCBidWYsIHNyYyk7CiAKIAljb3BpZWQgPSBvY2ZzMl93cml0ZV9lbmQoZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBzZC0+cG9zLCBjb3VudCwgY291bnQsCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggYTZiMDU0ZS4uZTI3YzIwNSAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtNDAzLDcgKzQwMyw3IEBACiAJaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT5mYWxsb2NhdGUpCiAJCXJldCA9IGlub2RlLT5pX29wLT5mYWxsb2NhdGUoaW5vZGUsIG1vZGUsIG9mZnNldCwgbGVuKTsKIAllbHNlCi0JCXJldCA9IC1FTk9TWVM7CisJCXJldCA9IC1FT1BOT1RTVVBQOwogCiBvdXRfZnB1dDoKIAlmcHV0KGZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9tc2Rvcy5jIGIvZnMvcGFydGl0aW9ucy9tc2Rvcy5jCmluZGV4IDRjY2VjNGMuLjU1NjdlYzAgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbXNkb3MuYworKysgYi9mcy9wYXJ0aXRpb25zL21zZG9zLmMKQEAgLTIwMyw2ICsyMDMsNyBAQAogCVNlY3RvciBzZWN0OwogCXN0cnVjdCBzb2xhcmlzX3g4Nl92dG9jICp2OwogCWludCBpOworCXNob3J0IG1heF9ucGFydHM7CiAKIAl2ID0gKHN0cnVjdCBzb2xhcmlzX3g4Nl92dG9jICopcmVhZF9kZXZfc2VjdG9yKGJkZXYsIG9mZnNldCsxLCAmc2VjdCk7CiAJaWYgKCF2KQpAQCAtMjE4LDcgKzIxOSw5IEBACiAJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOwogCQlyZXR1cm47CiAJfQotCWZvciAoaT0wOyBpPFNPTEFSSVNfWDg2X05VTVNMSUNFICYmIHN0YXRlLT5uZXh0PHN0YXRlLT5saW1pdDsgaSsrKSB7CisJLyogRW5zdXJlIHdlIGNhbiBoYW5kbGUgcHJldmlvdXMgY2FzZSBvZiBWVE9DIHdpdGggOCBlbnRyaWVzIGdyYWNlZnVsbHkgKi8KKwltYXhfbnBhcnRzID0gbGUxNl90b19jcHUgKHYtPnZfbnBhcnRzKSA+IDggPyBTT0xBUklTX1g4Nl9OVU1TTElDRSA6IDg7CisJZm9yIChpPTA7IGk8bWF4X25wYXJ0cyAmJiBzdGF0ZS0+bmV4dDxzdGF0ZS0+bGltaXQ7IGkrKykgewogCQlzdHJ1Y3Qgc29sYXJpc194ODZfc2xpY2UgKnMgPSAmdi0+dl9zbGljZVtpXTsKIAkJaWYgKHMtPnNfc2l6ZSA9PSAwKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL3N1bi5jIGIvZnMvcGFydGl0aW9ucy9zdW4uYwppbmRleCAxMjNmOGI0Li43OTQxMThkIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL3N1bi5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvc3VuLmMKQEAgLTE5LDM0ICsxOSw0NyBAQAogCVNlY3RvciBzZWN0OwogCXN0cnVjdCBzdW5fZGlza2xhYmVsIHsKIAkJdW5zaWduZWQgY2hhciBpbmZvWzEyOF07ICAgLyogSW5mb3JtYXRpdmUgdGV4dCBzdHJpbmcgKi8KLQkJdW5zaWduZWQgY2hhciBzcGFyZTBbMTRdOwotCQlzdHJ1Y3Qgc3VuX2luZm8gewotCQkJdW5zaWduZWQgY2hhciBzcGFyZTE7Ci0JCQl1bnNpZ25lZCBjaGFyIGlkOwotCQkJdW5zaWduZWQgY2hhciBzcGFyZTI7Ci0JCQl1bnNpZ25lZCBjaGFyIGZsYWdzOwotCQl9IGluZm9zWzhdOwotCQl1bnNpZ25lZCBjaGFyIHNwYXJlWzI0Nl07ICAvKiBCb290IGluZm9ybWF0aW9uIGV0Yy4gKi8KKwkJc3RydWN0IHN1bl92dG9jIHsKKwkJICAgIF9fYmUzMiB2ZXJzaW9uOyAgICAgLyogTGF5b3V0IHZlcnNpb24gKi8KKwkJICAgIGNoYXIgICB2b2x1bWVbOF07ICAgLyogVm9sdW1lIG5hbWUgKi8KKwkJICAgIF9fYmUxNiBucGFydHM7ICAgICAgLyogTnVtYmVyIG9mIHBhcnRpdGlvbnMgKi8KKwkJICAgIHN0cnVjdCBzdW5faW5mbyB7ICAgICAgICAgICAvKiBQYXJ0aXRpb24gaGRycywgc2VjIDIgKi8KKwkJCV9fYmUxNiBpZDsKKwkJCV9fYmUxNiBmbGFnczsKKwkJICAgIH0gaW5mb3NbOF07CisJCSAgICBfX2JlMTYgcGFkZGluZzsgICAgIC8qIEFsaWdubWVudCBwYWRkaW5nICovCisJCSAgICBfX2JlMzIgYm9vdGluZm9bM107ICAvKiBJbmZvIG5lZWRlZCBieSBtYm9vdCAqLworCQkgICAgX19iZTMyIHNhbml0eTsgICAgICAgLyogVG8gdmVyaWZ5IHZ0b2Mgc2FuaXR5ICovCisJCSAgICBfX2JlMzIgcmVzZXJ2ZWRbMTBdOyAvKiBGcmVlIHNwYWNlICovCisJCSAgICBfX2JlMzIgdGltZXN0YW1wWzhdOyAvKiBQYXJ0aXRpb24gdGltZXN0YW1wICovCisJCX0gdnRvYzsKKwkJX19iZTMyIHdyaXRlX3JlaW5zdHJ1Y3Q7IC8qIHNlY3RvcnMgdG8gc2tpcCwgd3JpdGVzICovCisJCV9fYmUzMiByZWFkX3JlaW5zdHJ1Y3Q7ICAvKiBzZWN0b3JzIHRvIHNraXAsIHJlYWRzICovCisJCXVuc2lnbmVkIGNoYXIgc3BhcmVbMTQ4XTsgLyogUGFkZGluZyAqLwogCQlfX2JlMTYgcnNwZWVkOyAgICAgLyogRGlzayByb3RhdGlvbmFsIHNwZWVkICovCiAJCV9fYmUxNiBwY3lsY291bnQ7ICAvKiBQaHlzaWNhbCBjeWxpbmRlciBjb3VudCAqLwogCQlfX2JlMTYgc3BhcmVjeWw7ICAgLyogZXh0cmEgc2VjdHMgcGVyIGN5bGluZGVyICovCi0JCXVuc2lnbmVkIGNoYXIgc3BhcmUyWzRdOyAgIC8qIE1vcmUgbWFnaWMuLi4gKi8KKwkJX19iZTE2IG9iczE7ICAgICAgIC8qIGdhcDEgKi8KKwkJX19iZTE2IG9iczI7ICAgICAgIC8qIGdhcDIgKi8KIAkJX19iZTE2IGlsZmFjdDsgICAgIC8qIEludGVybGVhdmUgZmFjdG9yICovCiAJCV9fYmUxNiBuY3lsOyAgICAgICAvKiBEYXRhIGN5bGluZGVyIGNvdW50ICovCiAJCV9fYmUxNiBuYWN5bDsgICAgICAvKiBBbHQuIGN5bGluZGVyIGNvdW50ICovCiAJCV9fYmUxNiBudHJrczsgICAgICAvKiBUcmFja3MgcGVyIGN5bGluZGVyICovCiAJCV9fYmUxNiBuc2VjdDsgICAgICAvKiBTZWN0b3JzIHBlciB0cmFjayAqLwotCQl1bnNpZ25lZCBjaGFyIHNwYXJlM1s0XTsgICAvKiBFdmVuIG1vcmUgbWFnaWMuLi4gKi8KKwkJX19iZTE2IG9iczM7ICAgICAgIC8qIGJoZWFkIC0gTGFiZWwgaGVhZCBvZmZzZXQgKi8KKwkJX19iZTE2IG9iczQ7ICAgICAgIC8qIHBwYXJ0IC0gUGh5c2ljYWwgUGFydGl0aW9uICovCiAJCXN0cnVjdCBzdW5fcGFydGl0aW9uIHsKIAkJCV9fYmUzMiBzdGFydF9jeWxpbmRlcjsKIAkJCV9fYmUzMiBudW1fc2VjdG9yczsKIAkJfSBwYXJ0aXRpb25zWzhdOwogCQlfX2JlMTYgbWFnaWM7ICAgICAgLyogTWFnaWMgbnVtYmVyICovCiAJCV9fYmUxNiBjc3VtOyAgICAgICAvKiBMYWJlbCB4b3InZCBjaGVja3N1bSAqLwotCX0gKiBsYWJlbDsJCQorCX0gKiBsYWJlbDsKIAlzdHJ1Y3Qgc3VuX3BhcnRpdGlvbiAqcDsKIAl1bnNpZ25lZCBsb25nIHNwYzsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CisJaW50IHVzZV92dG9jOworCWludCBucGFydHM7CiAKIAlsYWJlbCA9IChzdHJ1Y3Qgc3VuX2Rpc2tsYWJlbCAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CiAJaWYgKCFsYWJlbCkKQEAgLTcwLDkgKzgzLDIyIEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIEFsbCBTdW4gZGlza3MgaGF2ZSA4IHBhcnRpdGlvbiBlbnRyaWVzICovCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB1c2UgdGhlIFZUT0MgdGFibGUgKi8KKwl1c2VfdnRvYyA9ICgoYmUzMl90b19jcHUobGFiZWwtPnZ0b2Muc2FuaXR5KSA9PSBTVU5fVlRPQ19TQU5JVFkpICYmCisJCSAgICAoYmUzMl90b19jcHUobGFiZWwtPnZ0b2MudmVyc2lvbikgPT0gMSkgJiYKKwkJICAgIChiZTE2X3RvX2NwdShsYWJlbC0+dnRvYy5ucGFydHMpIDw9IDgpKTsKKworCS8qIFVzZSA4IHBhcnRpdGlvbiBlbnRyaWVzIGlmIG5vdCBzcGVjaWZpZWQgaW4gdmFsaWRhdGVkIFZUT0MgKi8KKwlucGFydHMgPSAodXNlX3Z0b2MpID8gYmUxNl90b19jcHUobGFiZWwtPnZ0b2MubnBhcnRzKSA6IDg7CisKKwkvKgorCSAqIFNvIHRoYXQgb2xkIExpbnV4LVN1biBwYXJ0aXRpb25zIGNvbnRpbnVlIHRvIHdvcmssCisJICogYWxvdyB0aGUgVlRPQyB0byBiZSB1c2VkIHVuZGVyIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlvbiAuLi4KKwkgKi8KKwl1c2VfdnRvYyA9IHVzZV92dG9jIHx8ICEobGFiZWwtPnZ0b2Muc2FuaXR5IHwKKwkJCQkgbGFiZWwtPnZ0b2MudmVyc2lvbiB8IGxhYmVsLT52dG9jLm5wYXJ0cyk7CiAJc3BjID0gYmUxNl90b19jcHUobGFiZWwtPm50cmtzKSAqIGJlMTZfdG9fY3B1KGxhYmVsLT5uc2VjdCk7Ci0JZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcCsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5wYXJ0czsgaSsrLCBwKyspIHsKIAkJdW5zaWduZWQgbG9uZyBzdF9zZWN0b3I7CiAJCXVuc2lnbmVkIGludCBudW1fc2VjdG9yczsKIApAQCAtODEsMTAgKzEwNywxMiBAQAogCQlpZiAobnVtX3NlY3RvcnMpIHsKIAkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIHN0X3NlY3RvciwgbnVtX3NlY3RvcnMpOwogCQkJc3RhdGUtPnBhcnRzW3Nsb3RdLmZsYWdzID0gMDsKLQkJCWlmIChsYWJlbC0+aW5mb3NbaV0uaWQgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCi0JCQkJc3RhdGUtPnBhcnRzW3Nsb3RdLmZsYWdzIHw9IEFERFBBUlRfRkxBR19SQUlEOwotCQkJaWYgKGxhYmVsLT5pbmZvc1tpXS5pZCA9PSBTVU5fV0hPTEVfRElTSykKLQkJCQlzdGF0ZS0+cGFydHNbc2xvdF0uZmxhZ3MgfD0gQUREUEFSVF9GTEFHX1dIT0xFRElTSzsKKwkJCWlmICh1c2VfdnRvYykgeworCQkJCWlmIChiZTE2X3RvX2NwdShsYWJlbC0+dnRvYy5pbmZvc1tpXS5pZCkgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisJCQkJCXN0YXRlLT5wYXJ0c1tzbG90XS5mbGFncyB8PSBBRERQQVJUX0ZMQUdfUkFJRDsKKwkJCQllbHNlIGlmIChiZTE2X3RvX2NwdShsYWJlbC0+dnRvYy5pbmZvc1tpXS5pZCkgPT0gU1VOX1dIT0xFX0RJU0spCisJCQkJCXN0YXRlLT5wYXJ0c1tzbG90XS5mbGFncyB8PSBBRERQQVJUX0ZMQUdfV0hPTEVESVNLOworCQkJfQogCQl9CiAJCXNsb3QrKzsKIAl9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL3N1bi5oIGIvZnMvcGFydGl0aW9ucy9zdW4uaAppbmRleCBiMWIxOWZkLi43Zjg2NGQxIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL3N1bi5oCisrKyBiL2ZzL3BhcnRpdGlvbnMvc3VuLmgKQEAgLTMsNSArMyw2IEBACiAgKi8KIAogI2RlZmluZSBTVU5fTEFCRUxfTUFHSUMgICAgICAgICAgMHhEQUJFCisjZGVmaW5lIFNVTl9WVE9DX1NBTklUWSAgICAgICAgICAweDYwMERERUVFCiAKIGludCBzdW5fcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IGQwMDc4MzAuLjZiM2Q5MWEgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCiAvKioKICAqIGdlbmVyaWNfcGlwZV9idWZfY29uZmlybSAtIHZlcmlmeSBjb250ZW50cyBvZiB0aGUgcGlwZSBidWZmZXIKLSAqIEBwaXBlOgl0aGUgcGlwZSB0aGF0IHRoZSBidWZmZXIgYmVsb25ncyB0bworICogQGluZm86CXRoZSBwaXBlIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvCiAgKiBAYnVmOgl0aGUgYnVmZmVyIHRvIGNvbmZpcm0KICAqCiAgKiBEZXNjcmlwdGlvbjoKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCA5NGUyYzFhLi5hNWIwZGZkIDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC0zODYsNiArMzg2LDE5IEBACiAJLnJlbGVhc2UJPSBwcm9jX3JlZ19yZWxlYXNlLAogfTsKIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcmVnX2ZpbGVfb3BzX25vX2NvbXBhdCA9IHsKKwkubGxzZWVrCQk9IHByb2NfcmVnX2xsc2VlaywKKwkucmVhZAkJPSBwcm9jX3JlZ19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3JlZ193cml0ZSwKKwkucG9sbAkJPSBwcm9jX3JlZ19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IHByb2NfcmVnX3VubG9ja2VkX2lvY3RsLAorCS5tbWFwCQk9IHByb2NfcmVnX21tYXAsCisJLm9wZW4JCT0gcHJvY19yZWdfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfcmVnX3JlbGVhc2UsCit9OworI2VuZGlmCisKIHN0cnVjdCBpbm9kZSAqcHJvY19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubywKIAkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewpAQCAtNDEzLDggKzQyNiwxNSBAQAogCQlpZiAoZGUtPnByb2NfaW9wcykKIAkJCWlub2RlLT5pX29wID0gZGUtPnByb2NfaW9wczsKIAkJaWYgKGRlLT5wcm9jX2ZvcHMpIHsKLQkJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotCQkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3JlZ19maWxlX29wczsKKwkJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQkJCWlmICghZGUtPnByb2NfZm9wcy0+Y29tcGF0X2lvY3RsKQorCQkJCQlpbm9kZS0+aV9mb3AgPQorCQkJCQkJJnByb2NfcmVnX2ZpbGVfb3BzX25vX2NvbXBhdDsKKwkJCQllbHNlCisjZW5kaWYKKwkJCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfcmVnX2ZpbGVfb3BzOworCQkJfQogCQkJZWxzZQogCQkJCWlub2RlLT5pX2ZvcCA9IGRlLT5wcm9jX2ZvcHM7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3F1b3RhLmMgYi9mcy9xdW90YS5jCmluZGV4IGU2NTc3YWMuLjk5YjI0YjUgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhLmMKKysrIGIvZnMvcXVvdGEuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkKKyNpZiBkZWZpbmVkKENPTkZJR19DT01QQVRfRk9SX1U2NF9BTElHTk1FTlQpCiAvKgogICogVGhpcyBjb2RlIHdvcmtzIG9ubHkgZm9yIDMyIGJpdCBxdW90YSB0b29scyBvdmVyIDY0IGJpdCBPUyAoeDg2XzY0LCBpYTY0KQogICogYW5kIGlzIG5lY2Vzc2FyeSBkdWUgdG8gYWxpZ25tZW50IHByb2JsZW1zLgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3RyZWUuYyBiL2ZzL3JlaXNlcmZzL3N0cmVlLmMKaW5kZXggYjZmMTI1OS4uOTgxMDI3ZCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3RyZWUuYworKysgYi9mcy9yZWlzZXJmcy9zdHJlZS5jCkBAIC0xMDQyLDcgKzEwNDIsOCBAQAogCQlwb3MgPSBJX1VORk1fTlVNKCZzX2loKTsKIAogCQl3aGlsZSAobGVfaWhfa19vZmZzZXQgKCZzX2loKSArIChwb3MgLSAxKSAqIGJsa19zaXplID4gbl9uZXdfZmlsZV9sZW5ndGgpIHsKLQkJICAgIF9fdTMyICp1bmZtLCBibG9jazsKKwkJICAgIF9fbGUzMiAqdW5mbTsKKwkJICAgIF9fdTMyIGJsb2NrOwogCiAJCSAgICAvKiBFYWNoIHVuZm9ybWF0dGVkIGJsb2NrIGRlbGV0aW9uIG1heSBpbnZvbHZlIG9uZSBhZGRpdGlvbmFsCiAJCSAgICAgKiBiaXRtYXAgYmxvY2sgaW50byB0aGUgdHJhbnNhY3Rpb24sIHRoZXJlYnkgdGhlIGluaXRpYWwKQEAgLTEwNTIsNyArMTA1Myw3IEBACiAJCQlicmVhazsKIAkJICAgIH0KIAotCQkgICAgdW5mbSA9IChfX3UzMiAqKUJfSV9QSVRFTShwX3NfYmgsICZzX2loKSArIHBvcyAtIDE7CisJCSAgICB1bmZtID0gKF9fbGUzMiAqKUJfSV9QSVRFTShwX3NfYmgsICZzX2loKSArIHBvcyAtIDE7CiAJCSAgICBibG9jayA9IGdldF9ibG9ja19udW0odW5mbSwgMCk7CiAKIAkJICAgIGlmIChibG9jayAhPSAwKSB7CmRpZmYgLS1naXQgYS9mcy9zaWduYWxmZC5jIGIvZnMvc2lnbmFsZmQuYwppbmRleCAzYjA3ZjI2Li43Yjk0MWFiIDEwMDY0NAotLS0gYS9mcy9zaWduYWxmZC5jCisrKyBiL2ZzL3NpZ25hbGZkLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogCiAJaWYgKHNpemVtYXNrICE9IHNpemVvZihzaWdzZXRfdCkgfHwKIAkgICAgY29weV9mcm9tX3VzZXIoJnNpZ21hc2ssIHVzZXJfbWFzaywgc2l6ZW9mKHNpZ21hc2spKSkKLQkJcmV0dXJuIGVycm9yID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJc2lnZGVsc2V0bWFzaygmc2lnbWFzaywgc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpOwogCXNpZ25vdHNldCgmc2lnbWFzayk7CiAKZGlmZiAtLWdpdCBhL2ZzL3NwbGljZS5jIGIvZnMvc3BsaWNlLmMKaW5kZXggMGEwOTczMi4uYzAxMGE3MiAxMDA2NDQKLS0tIGEvZnMvc3BsaWNlLmMKKysrIGIvZnMvc3BsaWNlLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICogQHNwZDoJZGF0YSB0byBmaWxsCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgICBAc3BkIGNvbnRhaW5zIGEgbWFwIG9mIHBhZ2VzIGFuZCBsZW4vb2Zmc2V0IHR1cHBsZXMsIGEgbG9uZyB3aXRoCisgKiAgICBAc3BkIGNvbnRhaW5zIGEgbWFwIG9mIHBhZ2VzIGFuZCBsZW4vb2Zmc2V0IHR1cGxlcywgYWxvbmcgd2l0aAogICogICAgdGhlIHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBwYWdlcy4gVGhpcwogICogICAgZnVuY3Rpb24gd2lsbCBsaW5rIHRoYXQgZGF0YSB0byB0aGUgcGlwZS4KICAqCkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogICogRGVzY3JpcHRpb246CiAgKiAgICBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGhlbHBlciB0byBzcGxpY2UgZGlyZWN0bHkgYmV0d2VlbiB0d28KICAqICAgIHBvaW50cywgd2l0aG91dCByZXF1aXJpbmcgYW4gZXhwbGljaXQgcGlwZS4gSW50ZXJuYWxseSBhbiBhbGxvY2F0ZWQKLSAqICAgIHBpcGUgaXMgY2FjaGVkIGluIHRoZSBwcm9jZXNzLCBhbmQgcmV1c2VkIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mCisgKiAgICBwaXBlIGlzIGNhY2hlZCBpbiB0aGUgcHJvY2VzcywgYW5kIHJldXNlZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mCiAgKiAgICB0aGF0IHByb2Nlc3MuCiAgKgogICovCmRpZmYgLS1naXQgYS9mcy90aW1lcmZkLmMgYi9mcy90aW1lcmZkLmMKaW5kZXggYWY5ZWNhNS4uNjE5ODNmMyAxMDA2NDQKLS0tIGEvZnMvdGltZXJmZC5jCisrKyBiL2ZzL3RpbWVyZmQuYwpAQCAtOTUsNyArOTUsNyBAQAogewogCXN0cnVjdCB0aW1lcmZkX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgcmVzOwotCXUzMiB0aWNrcyA9IDA7CisJdTY0IHRpY2tzID0gMDsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCWlmIChjb3VudCA8IHNpemVvZih0aWNrcykpCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJCSAqIGNhbGxiYWNrIHRvIGF2b2lkIERvUyBhdHRhY2tzIHNwZWNpZnlpbmcgYSB2ZXJ5CiAJCQkgKiBzaG9ydCB0aW1lciBwZXJpb2QuCiAJCQkgKi8KLQkJCXRpY2tzID0gKHUzMikKKwkJCXRpY2tzID0gKHU2NCkKIAkJCQlocnRpbWVyX2ZvcndhcmQoJmN0eC0+dG1yLAogCQkJCQkJaHJ0aW1lcl9jYl9nZXRfdGltZSgmY3R4LT50bXIpLAogCQkJCQkJY3R4LT50aW50dik7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPndxaC5sb2NrKTsKIAlpZiAodGlja3MpCi0JCXJlcyA9IHB1dF91c2VyKHRpY2tzLCBidWYpID8gLUVGQVVMVDogc2l6ZW9mKHRpY2tzKTsKKwkJcmVzID0gcHV0X3VzZXIodGlja3MsICh1NjQgX191c2VyICopIGJ1ZikgPyAtRUZBVUxUOiBzaXplb2YodGlja3MpOwogCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwppbmRleCAxNDFjZjE1Li40MjMxOWQ3IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAlsb25nIGNvdW50LAogCWxvbmcgKndyaXR0ZW4pCiB7Ci0JY29tcGF0X3hmc19pbm9ncnBfdCAqcDMyID0gdWJ1ZmZlcjsKKwljb21wYXRfeGZzX2lub2dycF90IF9fdXNlciAqcDMyID0gdWJ1ZmZlcjsKIAlsb25nIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJY2FzZSBYRlNfSU9DX0ZTSU5VTUJFUlNfMzI6CiAJCWNtZCA9IF9OQVRJVkVfSU9DKGNtZCwgc3RydWN0IHhmc19mc29wX2J1bGtyZXEpOwogCQlyZXR1cm4geGZzX2lvY19idWxrc3RhdF9jb21wYXQoWEZTX0JIVlRPSShWTkhFQUQodnApKS0+aV9tb3VudCwKLQkJCQljbWQsICh2b2lkKilhcmcpOworCQkJCWNtZCwgKHZvaWQgX191c2VyKilhcmcpOwogCWNhc2UgWEZTX0lPQ19GRF9UT19IQU5ETEVfMzI6CiAJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFXzMyOgogCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0ZTSEFORExFXzMyOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAppbmRleCA1ZTNkY2YzLi4zZDBmZWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaApAQCAtMTMxLDcgKzEzMSw3IEBACiBzdHJ1Y3QgYWNwaV9kcml2ZXIgewogCWNoYXIgbmFtZVs4MF07CiAJY2hhciBjbGFzc1s4MF07Ci0JY2hhciAqaWRzOwkJLyogU3VwcG9ydGVkIEhhcmR3YXJlIElEcyAqLworCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWRzOyAvKiBTdXBwb3J0ZWQgSGFyZHdhcmUgSURzICovCiAJc3RydWN0IGFjcGlfZGV2aWNlX29wcyBvcHM7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJ2OwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwpAQCAtMzQxLDcgKzM0MSw4IEBACiBpbnQgYWNwaV9idXNfdHJpbShzdHJ1Y3QgYWNwaV9kZXZpY2UgKnN0YXJ0LCBpbnQgcm1kZXZpY2UpOwogaW50IGFjcGlfYnVzX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIGFjcGlfc3RhdHVzIGFjcGlfYnVzX2dldF9lamQoYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX2hhbmRsZSAqIGVqZCk7Ci1pbnQgYWNwaV9tYXRjaF9pZHMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmlkcyk7CitpbnQgYWNwaV9tYXRjaF9kZXZpY2VfaWRzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQkJICBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkcyk7CiBpbnQgYWNwaV9jcmVhdGVfZGlyKHN0cnVjdCBhY3BpX2RldmljZSAqKTsKIHZvaWQgYWNwaV9yZW1vdmVfZGlyKHN0cnVjdCBhY3BpX2RldmljZSAqKTsKIApAQCAtMzY1LDYgKzM2NiwxNyBAQAogYWNwaV9oYW5kbGUgYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKICNkZWZpbmUgREVWSUNFX0FDUElfSEFORExFKGRldikgKChhY3BpX2hhbmRsZSkoKGRldiktPmFyY2hkYXRhLmFjcGlfaGFuZGxlKSkKIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAoraW50IGFjcGlfcG1fZGV2aWNlX3NsZWVwX3N0YXRlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQgKik7CisjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCitzdGF0aWMgaW5saW5lIGludCBhY3BpX3BtX2RldmljZV9zbGVlcF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkLCBpbnQgdywgaW50ICpwKQoreworCWlmIChwKQorCQkqcCA9IEFDUElfU1RBVEVfRDA7CisJcmV0dXJuIEFDUElfU1RBVEVfRDM7Cit9CisjZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUCAqLworCiAjZW5kaWYJCQkJLyogQ09ORklHX0FDUEkgKi8KIAogI2VuZGlmIC8qX19BQ1BJX0JVU19IX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IDU1MzUxNTkuLjIwMmFjYjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTM0LDE2ICszNCwyMSBAQAogI2RlZmluZSBBQ1BJX0JVU19DT01QT05FTlQJCTB4MDAwMTAwMDAKICNkZWZpbmUgQUNQSV9TWVNURU1fQ09NUE9ORU5UCQkweDAyMDAwMDAwCiAKLS8qIF9ISUQgZGVmaW5pdGlvbnMgKi8KKy8qCisgKiBfSElEIGRlZmluaXRpb25zCisgKiBISURzIG11c3QgY29uZm9ybSB0byBBQ1BJIHNwZWMoNi4xLjQpCisgKiBMaW51eCBzcGVjaWZpYyBISURzIGRvIG5vdCBhcHBseSB0byB0aGlzIGFuZCBiZWdpbiB3aXRoIExOWDoKKyAqLwogCi0jZGVmaW5lIEFDUElfUE9XRVJfSElECQkJInBvd2VyX3Jlc291cmNlIgorI2RlZmluZSBBQ1BJX1BPV0VSX0hJRAkJCSJMTlhQT1dFUiIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfSElECQkiQUNQSTAwMDciCi0jZGVmaW5lIEFDUElfU1lTVEVNX0hJRAkJCSJhY3BpX3N5c3RlbSIKLSNkZWZpbmUgQUNQSV9USEVSTUFMX0hJRAkJInRoZXJtYWwiCi0jZGVmaW5lIEFDUElfQlVUVE9OX0hJRF9QT1dFUkYJCSJidXR0b25fcG93ZXIiCi0jZGVmaW5lIEFDUElfQlVUVE9OX0hJRF9TTEVFUEYJCSJidXR0b25fc2xlZXAiCi0jZGVmaW5lIEFDUElfVklERU9fSElECQkJInZpZGVvIgotI2RlZmluZSBBQ1BJX0JBWV9ISUQJCQkiYmF5IgorI2RlZmluZSBBQ1BJX1NZU1RFTV9ISUQJCQkiTE5YU1lTVE0iCisjZGVmaW5lIEFDUElfVEhFUk1BTF9ISUQJCSJMTlhUSEVSTSIKKyNkZWZpbmUgQUNQSV9CVVRUT05fSElEX1BPV0VSRgkJIkxOWFBXUkJOIgorI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGCQkiTE5YU0xQQk4iCisjZGVmaW5lIEFDUElfVklERU9fSElECQkJIkxOWFZJREVPIgorI2RlZmluZSBBQ1BJX0JBWV9ISUQJCQkiTE5YSU9CQVkiCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDUsNyArMTUwLDcgQEAKICNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAogZXh0ZXJuIGludCBhY3BpX3NsZWVwX2luaXQodm9pZCk7CiAjZWxzZQotI2RlZmluZSBhY3BpX3NsZWVwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfc2xlZXBfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAogI2VuZGlmIC8qX19BQ1BJX0RSSVZFUlNfSF9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IGZlOGFiYzIuLmU3M2EzODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtODA5LDcgKzgwOSw3IEBACiAKIC8qIENvbW1vbiBzdHJpbmcgdmVyc2lvbiBvZiBkZXZpY2UgSElEcyBhbmQgVUlEcyAqLwogCi1zdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeworc3RydWN0IGFjcGljYV9kZXZpY2VfaWQgewogCWNoYXIgdmFsdWVbQUNQSV9ERVZJQ0VfSURfTEVOR1RIXTsKIH07CiAKQEAgLTg1OSw4ICs4NTksOCBAQAogCXUzMiB2YWxpZDsJCS8qIEluZGljYXRlcyB3aGljaCBmaWVsZHMgYmVsb3cgYXJlIHZhbGlkICovCiAJdTMyIGN1cnJlbnRfc3RhdHVzOwkvKiBfU1RBIHZhbHVlICovCiAJYWNwaV9pbnRlZ2VyIGFkZHJlc3M7CS8qIF9BRFIgdmFsdWUgaWYgYW55ICovCi0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkIGhhcmR3YXJlX2lkOwkvKiBfSElEIHZhbHVlIGlmIGFueSAqLwotCXN0cnVjdCBhY3BpX2RldmljZV9pZCB1bmlxdWVfaWQ7CS8qIF9VSUQgdmFsdWUgaWYgYW55ICovCisJc3RydWN0IGFjcGljYV9kZXZpY2VfaWQgaGFyZHdhcmVfaWQ7CS8qIF9ISUQgdmFsdWUgaWYgYW55ICovCisJc3RydWN0IGFjcGljYV9kZXZpY2VfaWQgdW5pcXVlX2lkOwkvKiBfVUlEIHZhbHVlIGlmIGFueSAqLwogCXU4IGhpZ2hlc3RfZHN0YXRlc1s0XTsJLyogX3N4X2QgdmFsdWVzOiAweEZGIGluZGljYXRlcyBub3QgdmFsaWQgKi8KIAlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgY29tcGF0aWJpbGl0eV9pZDsJLyogTGlzdCBvZiBfQ0lEcyBpZiBhbnkgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaAppbmRleCBhODdlZjFjLi5hMjkxODU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKQEAgLTM1NCw3ICszNTQsNyBAQAogCiBhY3BpX3N0YXR1cwogYWNwaV91dF9leGVjdXRlX0hJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCi0JCSAgICBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmhpZCk7CisJCSAgICBzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCAqaGlkKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfdXRfZXhlY3V0ZV9DSUQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLApAQCAtMzY2LDcgKzM2Niw3IEBACiAKIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2V4ZWN1dGVfVUlEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKLQkJICAgIHN0cnVjdCBhY3BpX2RldmljZV9pZCAqdWlkKTsKKwkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICp1aWQpOwogCiBhY3BpX3N0YXR1cwogYWNwaV91dF9leGVjdXRlX3N4ZHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLCB1OCAqIGhpZ2hlc3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9iaXRvcHMuaAppbmRleCAzYTBjYmViLi45ZTcxMjAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9iaXRvcHMuaApAQCAtMzI0LDcgKzMyNCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0LCBhLCByOwogCi0JdCA9IF9fa2VybmVsX2NtcGJnZSAoeCwgMHgwMTAxMDEwMTAxMDEwMTAxKTsKKwl0ID0gX19rZXJuZWxfY21wYmdlICh4LCAweDAxMDEwMTAxMDEwMTAxMDFVTCk7CiAJYSA9IF9fZmxzbTFfdGFiW3RdOwogCXQgPSBfX2tlcm5lbF9leHRibCAoeCwgYSk7CiAJciA9IGEqOCArIF9fZmxzbTFfdGFiW3RdICsgKHggIT0gMCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1teGMvdW5jb21wcmVzcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbXhjL3VuY29tcHJlc3MuaAppbmRleCBlYzU3ODdkLi40MmNjMGNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1teGMvdW5jb21wcmVzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW14Yy91bmNvbXByZXNzLmgKQEAgLTI2LDcgKzI2LDYgQEAKICNkZWZpbmUgX19NWENfQk9PVF9VTkNPTVBSRVNTCiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKICNkZWZpbmUgVUFSVCh4KSAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKHNlcmlhbF9wb3J0ICsgKHgpKSkKIApAQCAtNjIsNyArNjEsNyBAQAogCX0KIAogCXdoaWxlICghKFVBUlQoVVNSMikgJiBVU1IyX1RYRkUpKQotCQljcHVfcmVsYXgoKTsKKwkJYmFycmllcigpOwogCiAJVUFSVChUWFIpID0gY2g7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL21haWxib3guaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbWFpbGJveC5oCmluZGV4IDRiZjA5MDkuLjdjYmVkOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbWFpbGJveC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbWFpbGJveC5oCkBAIC0zNyw3ICszNyw3IEBACiAKIHN0cnVjdCBvbWFwX21ib3hfcXVldWUgewogCXNwaW5sb2NrX3QJCWxvY2s7Ci0JcmVxdWVzdF9xdWV1ZV90CQkqcXVldWU7CisJc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCWludAkoKmNhbGxiYWNrKSh2b2lkICopOwogCXN0cnVjdCBvbWFwX21ib3gJKm1ib3g7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1hcm0vdW5hbGlnbmVkLmgKaW5kZXggNzk1YjllNS4uODQzMWY2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3VuYWxpZ25lZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS91bmFsaWduZWQuaApAQCAtNjAsMjQgKzYwLDI0IEBACiAJCV9fZ2V0X3VuYWxpZ25lZF80X2JlKChfX3ArNCkpKQogCiAjZGVmaW5lIF9fZ2V0X3VuYWxpZ25lZF9sZShwdHIpCQkJCQkJXAotCSh7CQkJCQkJCQlcCisJKChfX2ZvcmNlIHR5cGVvZigqKHB0cikpKSh7CQkJCQlcCiAJCWNvbnN0IF9fdTggKl9fcCA9IChjb25zdCBfX3U4ICopKHB0cik7CQkJXAogCQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoc2l6ZW9mKCoocHRyKSkgPT0gMSwgKl9fcCwJXAogCQkgIF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YoKihwdHIpKSA9PSAyLCBfX2dldF91bmFsaWduZWRfMl9sZShfX3ApLAlcCiAJCSAgX19idWlsdGluX2Nob29zZV9leHByKHNpemVvZigqKHB0cikpID09IDQsIF9fZ2V0X3VuYWxpZ25lZF80X2xlKF9fcCksCVwKIAkJICBfX2J1aWx0aW5fY2hvb3NlX2V4cHIoc2l6ZW9mKCoocHRyKSkgPT0gOCwgX19nZXRfdW5hbGlnbmVkXzhfbGUoX19wKSwJXAogCQkgICAgKHZvaWQpX19idWdfdW5hbGlnbmVkX3goX19wKSkpKSk7CQkJXAotCX0pCisJfSkpCiAKICNkZWZpbmUgX19nZXRfdW5hbGlnbmVkX2JlKHB0cikJCQkJCQlcCi0JKHsJCQkJCQkJCVwKKwkoKF9fZm9yY2UgdHlwZW9mKCoocHRyKSkpKHsJCQkJCVwKIAkJY29uc3QgX191OCAqX19wID0gKGNvbnN0IF9fdTggKikocHRyKTsJCQlcCiAJCV9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YoKihwdHIpKSA9PSAxLCAqX19wLAlcCiAJCSAgX19idWlsdGluX2Nob29zZV9leHByKHNpemVvZigqKHB0cikpID09IDIsIF9fZ2V0X3VuYWxpZ25lZF8yX2JlKF9fcCksCVwKIAkJICBfX2J1aWx0aW5fY2hvb3NlX2V4cHIoc2l6ZW9mKCoocHRyKSkgPT0gNCwgX19nZXRfdW5hbGlnbmVkXzRfYmUoX19wKSwJXAogCQkgIF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YoKihwdHIpKSA9PSA4LCBfX2dldF91bmFsaWduZWRfOF9iZShfX3ApLAlcCiAJCSAgICAodm9pZClfX2J1Z191bmFsaWduZWRfeChfX3ApKSkpKTsJCQlcCi0JfSkKKwl9KSkKIAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW5hbGlnbmVkXzJfbGUoX191MzIgX192LCByZWdpc3RlciBfX3U4ICpfX3ApCkBAIC0xMzEsMTUgKzEzMSwxNiBAQAogICovCiAjZGVmaW5lIF9fcHV0X3VuYWxpZ25lZF9sZSh2YWwscHRyKQkJCQkJXAogCSh7CQkJCQkJCVwKKwkJKHZvaWQpc2l6ZW9mKCoocHRyKSA9ICh2YWwpKTsJCQlcCiAJCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQlcCiAJCWNhc2UgMToJCQkJCQlcCiAJCQkqKHB0cikgPSAodmFsKTsJCQkJXAogCQkJYnJlYWs7CQkJCQlcCi0JCWNhc2UgMjogX19wdXRfdW5hbGlnbmVkXzJfbGUoKHZhbCksKF9fdTggKikocHRyKSk7CVwKKwkJY2FzZSAyOiBfX3B1dF91bmFsaWduZWRfMl9sZSgoX19mb3JjZSB1MTYpKHZhbCksKF9fdTggKikocHRyKSk7CVwKIAkJCWJyZWFrOwkJCQkJXAotCQljYXNlIDQ6CV9fcHV0X3VuYWxpZ25lZF80X2xlKCh2YWwpLChfX3U4ICopKHB0cikpOwlcCisJCWNhc2UgNDoJX19wdXRfdW5hbGlnbmVkXzRfbGUoKF9fZm9yY2UgdTMyKSh2YWwpLChfX3U4ICopKHB0cikpOwlcCiAJCQlicmVhazsJCQkJCVwKLQkJY2FzZSA4OglfX3B1dF91bmFsaWduZWRfOF9sZSgodmFsKSwoX191OCAqKShwdHIpKTsgXAorCQljYXNlIDg6CV9fcHV0X3VuYWxpZ25lZF84X2xlKChfX2ZvcmNlIHU2NCkodmFsKSwoX191OCAqKShwdHIpKTsgXAogCQkJYnJlYWs7CQkJCQlcCiAJCWRlZmF1bHQ6IF9fYnVnX3VuYWxpZ25lZF94KHB0cik7CQlcCiAJCQlicmVhazsJCQkJCVwKQEAgLTE0OSwxNSArMTUwLDE2IEBACiAKICNkZWZpbmUgX19wdXRfdW5hbGlnbmVkX2JlKHZhbCxwdHIpCQkJCQlcCiAJKHsJCQkJCQkJXAorCQkodm9pZClzaXplb2YoKihwdHIpID0gKHZhbCkpOwkJCVwKIAkJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCVwKIAkJY2FzZSAxOgkJCQkJCVwKIAkJCSoocHRyKSA9ICh2YWwpOwkJCQlcCiAJCQlicmVhazsJCQkJCVwKLQkJY2FzZSAyOiBfX3B1dF91bmFsaWduZWRfMl9iZSgodmFsKSwoX191OCAqKShwdHIpKTsJXAorCQljYXNlIDI6IF9fcHV0X3VuYWxpZ25lZF8yX2JlKChfX2ZvcmNlIHUxNikodmFsKSwoX191OCAqKShwdHIpKTsJXAogCQkJYnJlYWs7CQkJCQlcCi0JCWNhc2UgNDoJX19wdXRfdW5hbGlnbmVkXzRfYmUoKHZhbCksKF9fdTggKikocHRyKSk7CVwKKwkJY2FzZSA0OglfX3B1dF91bmFsaWduZWRfNF9iZSgoX19mb3JjZSB1MzIpKHZhbCksKF9fdTggKikocHRyKSk7CVwKIAkJCWJyZWFrOwkJCQkJXAotCQljYXNlIDg6CV9fcHV0X3VuYWxpZ25lZF84X2JlKCh2YWwpLChfX3U4ICopKHB0cikpOyBcCisJCWNhc2UgODoJX19wdXRfdW5hbGlnbmVkXzhfYmUoKF9fZm9yY2UgdTY0KSh2YWwpLChfX3U4ICopKHB0cikpOyBcCiAJCQlicmVhazsJCQkJCVwKIAkJZGVmYXVsdDogX19idWdfdW5hbGlnbmVkX3gocHRyKTsJCVwKIAkJCWJyZWFrOwkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vYmZpbi1nbG9iYWwuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2JmaW4tZ2xvYmFsLmgKaW5kZXggYzRkNmNiYi4uYTk3MDc4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vYmZpbi1nbG9iYWwuaAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9iZmluLWdsb2JhbC5oCkBAIC02MSw2ICs2MSw3IEBACiBleHRlcm4gaW50IHJlYWRfaWxvYyh2b2lkKTsKIGV4dGVybiBpbnQgYmZpbl9jb25zb2xlX2luaXQodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGxvd2VyX3RvX2lycTE0KHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF9leGNlcHRpb25fdmVjdG9ycyh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfZG1hKHZvaWQpOwogZXh0ZXJuIHZvaWQgcHJvZ3JhbV9JQVIodm9pZCk7CiBleHRlcm4gdm9pZCBldnQxNF9zb2Z0aXJxKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9jZGVmQkY1NHhfYmFzZS5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9jZGVmQkY1NHhfYmFzZS5oCmluZGV4IDk4ZDM1YTkuLmNkZjI5ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvY2RlZkJGNTR4X2Jhc2UuaAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2NkZWZCRjU0eF9iYXNlLmgKQEAgLTI0Miw2ICsyNDIsMzkgQEAKICNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfUkNWX0RBVEExNigpCQliZmluX3JlYWQxNihUV0kwX1JDVl9EQVRBMTYpCiAjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9SQ1ZfREFUQTE2KHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX1JDVl9EQVRBMTYsIHZhbCkKIAorI2RlZmluZSBiZmluX3JlYWRfVFdJX0NMS0RJVigpCQkJYmZpbl9yZWFkMTYoVFdJMF9DTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX0NMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoVFdJMF9DTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSV9DT05UUk9MKCkJCQliZmluX3JlYWQxNihUV0kwX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFRXSTBfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX1NMQVZFX0NUUkwoKQkJYmZpbl9yZWFkMTYoVFdJMF9TTEFWRV9DVFJMKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSV9TTEFWRV9DVFJMKHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX1NMQVZFX0NUUkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSV9TTEFWRV9TVEFUKCkJCWJmaW5fcmVhZDE2KFRXSTBfU0xBVkVfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0lfU0xBVkVfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMF9TTEFWRV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0lfU0xBVkVfQUREUigpCQliZmluX3JlYWQxNihUV0kwX1NMQVZFX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX1NMQVZFX0FERFIodmFsKQkJYmZpbl93cml0ZTE2KFRXSTBfU0xBVkVfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX01BU1RFUl9DVEwoKQkJYmZpbl9yZWFkMTYoVFdJMF9NQVNURVJfQ1RSTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0lfTUFTVEVSX0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMF9NQVNURVJfQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX01BU1RFUl9TVEFUKCkJCWJmaW5fcmVhZDE2KFRXSTBfTUFTVEVSX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX01BU1RFUl9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX01BU1RFUl9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0lfTUFTVEVSX0FERFIoKQkJYmZpbl9yZWFkMTYoVFdJMF9NQVNURVJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0lfTUFTVEVSX0FERFIodmFsKQkJYmZpbl93cml0ZTE2KFRXSTBfTUFTVEVSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSV9JTlRfU1RBVCgpCQliZmluX3JlYWQxNihUV0kwX0lOVF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSV9JTlRfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMF9JTlRfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX0lOVF9NQVNLKCkJCWJmaW5fcmVhZDE2KFRXSTBfSU5UX01BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX0lOVF9NQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX0lOVF9NQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0lfRklGT19DVEwoKQkJYmZpbl9yZWFkMTYoVFdJMF9GSUZPX0NUUkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX0ZJRk9fQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX0ZJRk9fQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX0ZJRk9fU1RBVCgpCQliZmluX3JlYWQxNihUV0kwX0ZJRk9fU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0lfRklGT19TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX0ZJRk9fU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX1hNVF9EQVRBOCgpCQliZmluX3JlYWQxNihUV0kwX1hNVF9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0lfWE1UX0RBVEE4KHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX1hNVF9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJX1hNVF9EQVRBMTYoKQkJYmZpbl9yZWFkMTYoVFdJMF9YTVRfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSV9YTVRfREFUQTE2KHZhbCkJCWJmaW5fd3JpdGUxNihUV0kwX1hNVF9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSV9SQ1ZfREFUQTgoKQkJYmZpbl9yZWFkMTYoVFdJMF9SQ1ZfREFUQTgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJX1JDVl9EQVRBOCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMF9SQ1ZfREFUQTgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSV9SQ1ZfREFUQTE2KCkJCWJmaW5fcmVhZDE2KFRXSTBfUkNWX0RBVEExNikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0lfUkNWX0RBVEExNih2YWwpCQliZmluX3dyaXRlMTYoVFdJMF9SQ1ZfREFUQTE2LCB2YWwpCisKIC8qIFNQT1JUMCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGZpbGUgYmVjYXVzZSBpdCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBBRFNQLUJGNTQyIGFuZCBBRFNQLUJGNTQ0IGJmaW5fcmVhZF8oKXJvY2Vzc29ycyAqLwogCiAvKiBTUE9SVDEgUmVnaXN0ZXJzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2lycS5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9pcnEuaAppbmRleCAwYjMzMjViLi5lNTQ4ZDNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvaXJxLmgKQEAgLTExMiw2ICsxMTIsNyBAQAogI2RlZmluZSBJUlFfQVRBUElfVFgJQkZJTl9JUlEoNDQpCS8qIEFUQVBJIFRYIChETUExMSkgSW50ZXJydXB0ICovCiAjZGVmaW5lIElSUV9UV0kwCUJGSU5fSVJRKDQ1KQkvKiBUV0kwIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfVFdJMQlCRklOX0lSUSg0NikJLyogVFdJMSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1RXSQkJSVJRX1RXSTAJLyogVFdJIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfQ0FOMF9SWAlCRklOX0lSUSg0NykJLyogQ0FOMCBSZWNlaXZlIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfQ0FOMF9UWAlCRklOX0lSUSg0OCkJLyogQ0FOMCBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX01ETUFTMglCRklOX0lSUSg0OSkJLyogTURNQSBTdHJlYW0gMiBJbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvY2RlZkJGNTYxLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2NkZWZCRjU2MS5oCmluZGV4IDFhOGVjOWUuLjZlODdhYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvY2RlZkJGNTYxLmgKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU2MS9jZGVmQkY1NjEuaApAQCAtODEsNiArODEsMTIgQEAKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCx2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9DSElQSUQoKSAgICAgICAgICAgICAgICAgICBiZmluX3JlYWQzMihDSElQSUQpCiAKKy8qIEZvciBNTVIncyB0aGF0IGFyZSByZXNlcnZlZCBvbiBDb3JlIEIsIHNldCB1cCBkZWZpbmVzIHRvIGJldHRlciBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwb3J0cyAqLworI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKSAgICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkX1NJQ0FfU1dSU1QoKQorI2RlZmluZSBiZmluX3dyaXRlX1NXUlNUKCkgICAgICAgICAgICAgICAgICAgYmZpbl93cml0ZV9TSUNBX1NXUlNUKCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NZU0NSKCkgICAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZF9TSUNBX1NZU0NSKCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TWVNDUigpICAgICAgICAgICAgICAgICAgIGJmaW5fd3JpdGVfU0lDQV9TWVNDUigpCisKIC8qIFN5c3RlbSBSZXNldCBhbmQgSW50ZXJydXB0IENvbnRyb2xsZXIgcmVnaXN0ZXJzIGZvciBjb3JlIEEgKDB4RkZDMCAwMTAwLTB4RkZDMCAwMUZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfU0lDQV9TV1JTVCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoU0lDQV9TV1JTVCkKICNkZWZpbmUgYmZpbl93cml0ZV9TSUNBX1NXUlNUKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihTSUNBX1NXUlNULHZhbCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvZGVmQkY1NjEuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvZGVmQkY1NjEuaAppbmRleCA4OTE1MGVjLi4wZjJkYzZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2RlZkJGNTYxLmgKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU2MS9kZWZCRjU2MS5oCkBAIC01Miw2ICs1MiwxMCBAQAogI2RlZmluZSBQTExfTE9DS0NOVCAgICAgICAgICAgIDB4RkZDMDAwMTAJLyogUExMIExvY2sgQ291bnQgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KICNkZWZpbmUgQ0hJUElEICAgICAgICAgICAgICAgICAweEZGQzAwMDE0ICAgICAgIC8qIENoaXAgSUQgUmVnaXN0ZXIgKi8KIAorLyogRm9yIE1NUidzIHRoYXQgYXJlIHJlc2VydmVkIG9uIENvcmUgQiwgc2V0IHVwIGRlZmluZXMgdG8gYmV0dGVyIGludGVncmF0ZSB3aXRoIG90aGVyIHBvcnRzICovCisjZGVmaW5lIFNXUlNUICAgICAgICAgICAgICAgICAgIFNJQ0FfU1dSU1QKKyNkZWZpbmUgU1lTQ1IgICAgICAgICAgICAgICAgICAgU0lDQV9TWVNDUgorCiAvKiBTeXN0ZW0gUmVzZXQgYW5kIEludGVycnVwdCBDb250cm9sbGVyIHJlZ2lzdGVycyBmb3IgY29yZSBBICgweEZGQzAgMDEwMC0weEZGQzAgMDFGRikgKi8KICNkZWZpbmUgU0lDQV9TV1JTVCAgICAgICAgICAgICAgMHhGRkMwMDEwMAkvKiBTb2Z0d2FyZSBSZXNldCByZWdpc3RlciAqLwogI2RlZmluZSBTSUNBX1NZU0NSICAgICAgICAgICAgICAweEZGQzAwMTA0CS8qIFN5c3RlbSBSZXNldCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vdGhyZWFkX2luZm8uaAppbmRleCBmYThmMDhjLi4zNGQzYzJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3RocmVhZF9pbmZvLmgKQEAgLTM5LDYgKzM5LDExIEBACiAgKi8KICNkZWZpbmUgQUxJR05fUEFHRV9NQVNLICAgICAgICAgMHhmZmZmZTAwMAogCisvKgorICogU2l6ZSBvZiBrZXJuZWwgc3RhY2sgZm9yIGVhY2ggcHJvY2Vzcy4gVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YgMi4uLgorICovCisjZGVmaW5lIFRIUkVBRF9TSVpFCQk4MTkyCS8qIDIgcGFnZXMgKi8KKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIG1tX3NlZ21lbnRfdDsKQEAgLTc2LDExICs4MSw2IEBACiAjZGVmaW5lIGluaXRfdGhyZWFkX2luZm8JKGluaXRfdGhyZWFkX3VuaW9uLnRocmVhZF9pbmZvKQogI2RlZmluZSBpbml0X3N0YWNrCQkoaW5pdF90aHJlYWRfdW5pb24uc3RhY2spCiAKLS8qCi0gKiBTaXplIG9mIGtlcm5lbCBzdGFjayBmb3IgZWFjaCBwcm9jZXNzLiBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiAyLi4uCi0gKi8KLSNkZWZpbmUgVEhSRUFEX1NJWkUJCTgxOTIJLyogMiBwYWdlcyAqLwotCiAvKiBIb3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQpAQCAtOTQsNyArOTQsNyBAQAogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7CiAgICAgICBfX2FzbV9fKCIlMCA9IHNwOyI6ICI9JmQiKHRpKToKIAkpOwotCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKChsb25nKXRpICYgfjgxOTFVTCk7CisJcmV0dXJuIChzdHJ1Y3QgdGhyZWFkX2luZm8gKikoKGxvbmcpdGkgJiB+KChsb25nKVRIUkVBRF9TSVpFLTEpKTsKIH0KIAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oIGIvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKaW5kZXggNDQ5ZjNmMi4uMTI1MTc5YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oCkBAIC0xMjEsMTkgKzEyMSw2IEBACiB9CiBleHRlcm4gaW50IGFjcGlfaXJxX2JhbGFuY2Vfc2V0KGNoYXIgKnN0cik7CiAKLSNlbHNlCS8qICFDT05GSUdfQUNQSSAqLwotCi0jZGVmaW5lIGFjcGlfbGFwaWMgMAotI2RlZmluZSBhY3BpX2lvYXBpYyAwCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9ub2lycV9zZXQodm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kaXNhYmxlX3BjaSh2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2FjcGkodm9pZCkgeyB9Ci0KLSNlbmRpZgkvKiAhQ09ORklHX0FDUEkgKi8KLQotCi0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKLQogLyogcm91dGluZXMgZm9yIHNhdmluZy9yZXN0b3Jpbmcga2VybmVsIHN0YXRlICovCiBleHRlcm4gaW50IGFjcGlfc2F2ZV9zdGF0ZV9tZW0odm9pZCk7CiBleHRlcm4gdm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpOwpAQCAtMTQzLDcgKzEzMCwxNSBAQAogLyogZWFybHkgaW5pdGlhbGl6YXRpb24gcm91dGluZSAqLwogZXh0ZXJuIHZvaWQgYWNwaV9yZXNlcnZlX2Jvb3RtZW0odm9pZCk7CiAKLSNlbmRpZiAvKkNPTkZJR19BQ1BJX1NMRUVQKi8KKyNlbHNlCS8qICFDT05GSUdfQUNQSSAqLworCisjZGVmaW5lIGFjcGlfbGFwaWMgMAorI2RlZmluZSBhY3BpX2lvYXBpYyAwCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9ub2lycV9zZXQodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kaXNhYmxlX3BjaSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2FjcGkodm9pZCkgeyB9CisKKyNlbmRpZgkvKiAhQ09ORklHX0FDUEkgKi8KIAogI2RlZmluZSBBUkNIX0hBU19QT1dFUl9JTklUCTEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9ib290cGFyYW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvYm9vdHBhcmFtLmgKaW5kZXggNDI3ZDg2NS4uYjkxYjAxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9ib290cGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2Jvb3RwYXJhbS5oCkBAIC00LDggKzQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgotI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8bGludXgvZWRkLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CiAjaW5jbHVkZSA8dmlkZW8vZWRpZC5oPgogCiBzdHJ1Y3Qgc2V0dXBfaGVhZGVyIHsKQEAgLTQ4LDkgKzQ5LDkgQEAKIAl1MzIgX3BhZDE7CiAJdTMyIGVmaV9zeXN0YWI7CiAJdTMyIGVmaV9tZW1kZXNjX3NpemU7Ci0JdTMyIGVmaV9tZW1kZWNfdmVyc2lvbjsKKwl1MzIgZWZpX21lbWRlc2NfdmVyc2lvbjsKIAl1MzIgZWZpX21lbW1hcDsKLQl1MzIgZmlfbWVtbWFwX3NpemU7CisJdTMyIGVmaV9tZW1tYXBfc2l6ZTsKIAl1MzIgX3BhZDJbMl07CiB9OwogCkBAIC01OSw3ICs2MCw3IEBACiAJc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOwkJCS8qIDB4MDAwICovCiAJc3RydWN0IGFwbV9iaW9zX2luZm8gYXBtX2Jpb3NfaW5mbzsJCS8qIDB4MDQwICovCiAJdTggIF9wYWQyWzEyXTsJCQkJCS8qIDB4MDU0ICovCi0JdTMyIHNwZWVkc3RlcF9pbmZvWzRdOwkJCQkvKiAweDA2MCAqLworCXN0cnVjdCBpc3RfaW5mbyBpc3RfaW5mbzsJCQkvKiAweDA2MCAqLwogCXU4ICBfcGFkM1sxNl07CQkJCQkvKiAweDA3MCAqLwogCXU4ICBoZDBfaW5mb1sxNl07CS8qIG9ic29sZXRlISAqLwkJLyogMHgwODAgKi8KIAl1OCAgaGQxX2luZm9bMTZdOwkvKiBvYnNvbGV0ZSEgKi8JCS8qIDB4MDkwICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2U4MjAuaCBiL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oCmluZGV4IDQzMTE0YzguLmNmNjdkYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oCkBAIC00Nyw3ICs0Nyw3IEBACiBleHRlcm4gdm9pZCBsaW1pdF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIHByaW50X21lbW9yeV9tYXAoY2hhciAqd2hvKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQorI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19ISUJFUk5BVElPTikKIGV4dGVybiB2b2lkIGU4MjBfbWFya19ub3NhdmVfcmVnaW9ucyh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZTgyMF9tYXJrX25vc2F2ZV9yZWdpb25zKHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lzdC5oIGIvaW5jbHVkZS9hc20taTM4Ni9pc3QuaAppbmRleCBkMTNkMWU2Li5lZjIwMDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lzdC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaXN0LmgKQEAgLTE5LDExICsxOSwxMyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogc3RydWN0IGlzdF9pbmZvIHsKLQl1bnNpZ25lZCBsb25nCXNpZ25hdHVyZTsKLQl1bnNpZ25lZCBsb25nCWNvbW1hbmQ7Ci0JdW5zaWduZWQgbG9uZwlldmVudDsKLQl1bnNpZ25lZCBsb25nCXBlcmZfbGV2ZWw7CisJdTMyIHNpZ25hdHVyZTsKKwl1MzIgY29tbWFuZDsKKwl1MzIgZXZlbnQ7CisJdTMyIHBlcmZfbGV2ZWw7CiB9OwogCiBleHRlcm4gc3RydWN0IGlzdF9pbmZvIGlzdF9pbmZvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zdXNwZW5kLmggYi9pbmNsdWRlL2FzbS1pMzg2L3N1c3BlbmQuaAppbmRleCA4ZGJhYWZlLi5hMjUyMDczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3N1c3BlbmQuaApAQCAtMjEsNyArMjEsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmV0dXJuX2FkZHJlc3M7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfZWlwOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfZXNwOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfZWJwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAppbmRleCA1YjUyNjM1Li40OTczMGZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaApAQCAtMTAwLDYgKzEwMCwxMSBAQAogaW50IGFjcGlfcmVxdWVzdF92ZWN0b3IgKHUzMiBpbnRfdHlwZSk7CiBpbnQgYWNwaV9nc2lfdG9faXJxICh1MzIgZ3NpLCB1bnNpZ25lZCBpbnQgKmlycSk7CiAKKy8qIHJvdXRpbmVzIGZvciBzYXZpbmcvcmVzdG9yaW5nIGtlcm5lbCBzdGF0ZSAqLworZXh0ZXJuIGludCBhY3BpX3NhdmVfc3RhdGVfbWVtKHZvaWQpOworZXh0ZXJuIHZvaWQgYWNwaV9yZXN0b3JlX3N0YXRlX21lbSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFjcGlfd2FrZXVwX2FkZHJlc3M7CisKIC8qCiAgKiBSZWNvcmQgdGhlIGNwZWkgb3ZlcnJpZGUgZmxhZyBhbmQgY3VycmVudCBsb2dpY2FsIGNwdS4gVGhpcyBpcwogICogdXNlZnVsIGZvciBDUFUgcmVtb3ZhbC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaWEzMi5oIGIvaW5jbHVkZS9hc20taWE2NC9pYTMyLmgKaW5kZXggNWZmOGQ3NC4uMjM5MGVlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pYTMyLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pYTMyLmgKQEAgLTI3LDExICsyNywxMiBAQAogZXh0ZXJuIGludCBpYTMyX3NldHVwX2ZyYW1lMSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQkJICAgICAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogI2lmIFBBR0VfU0hJRlQgPiBJQTMyX1BBR0VfU0hJRlQKLWV4dGVybiBpbnQgaWEzMl9jb3B5X3BhcnRpYWxfcGFnZV9saXN0IChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBpYTMyX2Ryb3BfcGFydGlhbF9wYWdlX2xpc3QgKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiBpbnQgaWEzMl9jb3B5X2lhNjRfcGFydGlhbF9wYWdlX2xpc3Qoc3RydWN0IHRhc2tfc3RydWN0ICosCisJCQkJCXVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgaWEzMl9kcm9wX2lhNjRfcGFydGlhbF9wYWdlX2xpc3Qoc3RydWN0IHRhc2tfc3RydWN0ICopOwogI2Vsc2UKLSMgZGVmaW5lIGlhMzJfY29weV9wYXJ0aWFsX3BhZ2VfbGlzdChhMSwgYTIpCTAKLSMgZGVmaW5lIGlhMzJfZHJvcF9wYXJ0aWFsX3BhZ2VfbGlzdChhMSkJZG8geyA7IH0gd2hpbGUgKDApCisjIGRlZmluZSBpYTMyX2NvcHlfaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdChhMSwgYTIpCTAKKyMgZGVmaW5lIGlhMzJfZHJvcF9pYTY0X3BhcnRpYWxfcGFnZV9saXN0KGExKQlkbyB7IDsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjLmggYi9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaAppbmRleCBjYTMzZWIxLi41Y2Y4YmYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaApAQCAtMjc1LDYgKzI3NSw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgaWE2NF9tYWNoaW5lX3ZlY3RvciBpYTY0X212OwogZXh0ZXJuIHZvaWQgbWFjaHZlY19pbml0IChjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIG1hY2h2ZWNfaW5pdF9mcm9tX2NtZGxpbmUoY29uc3QgY2hhciAqY21kbGluZSk7CiAKICMgZWxzZQogIyAgZXJyb3IgVW5rbm93biBjb25maWd1cmF0aW9uLiAgVXBkYXRlIGFzbS1pYTY0L21hY2h2ZWMuaC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCmluZGV4IDYyNTFjNzY0Li5iZTNiMGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmgKQEAgLTIyMCw3ICsyMjAsNyBAQAogCiAjZGVmaW5lIFRMU19TSVpFIChHRFRfRU5UUllfVExTX0VOVFJJRVMgKiA4KQogCi1zdHJ1Y3QgcGFydGlhbF9wYWdlX2xpc3Q7CitzdHJ1Y3QgaWE2NF9wYXJ0aWFsX3BhZ2VfbGlzdDsKICNlbmRpZgogCiBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAlfX3U2NCBmZHI7CQkJLyogSUEzMiBmcCBleGNlcHQuIGRhdGEgcmVnICovCiAJX191NjQgb2xkX2sxOwkJCS8qIG9sZCB2YWx1ZSBvZiBhci5rMSAqLwogCV9fdTY0IG9sZF9pb2I7CQkJLyogb2xkIElPQmFzZSB2YWx1ZSAqLwotCXN0cnVjdCBwYXJ0aWFsX3BhZ2VfbGlzdCAqcHBsOwkvKiBwYXJ0aWFsIHBhZ2UgbGlzdCBmb3IgNEsgcGFnZSBzaXplIGlzc3VlICovCisJc3RydWN0IGlhNjRfcGFydGlhbF9wYWdlX2xpc3QgKnBwbDsgLyogcGFydGlhbCBwYWdlIGxpc3QgZm9yIDRLIHBhZ2Ugc2l6ZSBpc3N1ZSAqLwogICAgICAgICAvKiBjYWNoZWQgVExTIGRlc2NyaXB0b3JzLiAqLwogCXN0cnVjdCBkZXNjX3N0cnVjdCB0bHNfYXJyYXlbR0RUX0VOVFJZX1RMU19FTlRSSUVTXTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbXAuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc21wLmgKaW5kZXggYzYwMDI0OS4uNjMxNGIyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NtcC5oCkBAIC0xMTYsNyArMTE2LDYgQEAKIGV4dGVybiBpbnQgX19jcHVfZGlzYWJsZSAodm9pZCk7CiBleHRlcm4gdm9pZCBfX2NwdV9kaWUgKHVuc2lnbmVkIGludCBjcHUpOwogZXh0ZXJuIHZvaWQgY3B1X2RpZSAodm9pZCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Ci1leHRlcm4gaW50IF9fY3B1X3VwICh1bnNpZ25lZCBpbnQgY3B1KTsKIGV4dGVybiB2b2lkIF9faW5pdCBzbXBfYnVpbGRfY3B1X21hcCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgX19pbml0IGluaXRfc21wX2NvbmZpZyAodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3Jhd19pby5oIGIvaW5jbHVkZS9hc20tbTY4ay9yYXdfaW8uaAppbmRleCA5MWM2MjNmLi5kOWViOTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3Jhd19pby5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcmF3X2lvLmgKQEAgLTM2LDE1ICszNiwxNSBAQAogI2RlZmluZSBpbl9iZTMyKGFkZHIpIFwKICAgICAoeyB1MzIgX192ID0gKCooX19mb3JjZSB2b2xhdGlsZSB1MzIgKikgKGFkZHIpKTsgX192OyB9KQogI2RlZmluZSBpbl9sZTE2KGFkZHIpIFwKLSAgICAoeyB1MTYgX192ID0gbGUxNl90b19jcHUoKihfX2ZvcmNlIHZvbGF0aWxlIHUxNiAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTE2IF9fdiA9IGxlMTZfdG9fY3B1KCooX19mb3JjZSB2b2xhdGlsZSBfX2xlMTYgKikgKGFkZHIpKTsgX192OyB9KQogI2RlZmluZSBpbl9sZTMyKGFkZHIpIFwKLSAgICAoeyB1MzIgX192ID0gbGUzMl90b19jcHUoKihfX2ZvcmNlIHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpOyBfX3Y7IH0pCisgICAgKHsgdTMyIF9fdiA9IGxlMzJfdG9fY3B1KCooX19mb3JjZSB2b2xhdGlsZSBfX2xlMzIgKikgKGFkZHIpKTsgX192OyB9KQogCiAjZGVmaW5lIG91dF84KGFkZHIsYikgKHZvaWQpKCgqKF9fZm9yY2Ugdm9sYXRpbGUgdTggKikgKGFkZHIpKSA9IChiKSkKICNkZWZpbmUgb3V0X2JlMTYoYWRkcix3KSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1MTYgKikgKGFkZHIpKSA9ICh3KSkKICNkZWZpbmUgb3V0X2JlMzIoYWRkcixsKSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1MzIgKikgKGFkZHIpKSA9IChsKSkKLSNkZWZpbmUgb3V0X2xlMTYoYWRkcix3KSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSB1MTYgKikgKGFkZHIpKSA9IGNwdV90b19sZTE2KHcpKQotI2RlZmluZSBvdXRfbGUzMihhZGRyLGwpICh2b2lkKSgoKihfX2ZvcmNlIHZvbGF0aWxlIHUzMiAqKSAoYWRkcikpID0gY3B1X3RvX2xlMzIobCkpCisjZGVmaW5lIG91dF9sZTE2KGFkZHIsdykgKHZvaWQpKCgqKF9fZm9yY2Ugdm9sYXRpbGUgX19sZTE2ICopIChhZGRyKSkgPSBjcHVfdG9fbGUxNih3KSkKKyNkZWZpbmUgb3V0X2xlMzIoYWRkcixsKSAodm9pZCkoKCooX19mb3JjZSB2b2xhdGlsZSBfX2xlMzIgKikgKGFkZHIpKSA9IGNwdV90b19sZTMyKGwpKQogCiAjZGVmaW5lIHJhd19pbmIgaW5fOAogI2RlZmluZSByYXdfaW53IGluX2JlMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N5c3RlbS5oCmluZGV4IDE5ODg3OGIuLmNhYTliMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zeXN0ZW0uaApAQCAtNDYsNiArNDYsMjIgQEAKIH0gd2hpbGUgKDApCiAKIAorLyoKKyAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCisgKiBOb3QgcmVhbGx5IHJlcXVpcmVkIG9uIG02OGsuLi4KKyAqLworI2RlZmluZSBub3AoKQkJZG8geyBhc20gdm9sYXRpbGUgKCJub3AiKTsgYmFycmllcigpOyB9IHdoaWxlICgwKQorI2RlZmluZSBtYigpCQliYXJyaWVyKCkKKyNkZWZpbmUgcm1iKCkJCWJhcnJpZXIoKQorI2RlZmluZSB3bWIoKQkJYmFycmllcigpCisjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJKCh2b2lkKTApCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKQkoeyAodmFyKSA9ICh2YWx1ZSk7IHdtYigpOyB9KQorCisjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJKCh2b2lkKTApCisKIC8qIGludGVycnVwdCBjb250cm9sLi4gKi8KICNpZiAwCiAjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKSBhc20gdm9sYXRpbGUgKCJhbmRpdyAlMCwlJXNyIjogOiAiaSIgKEFMTE9XSU5UKSA6ICJtZW1vcnkiKQpAQCAtNzAsMjMgKzg2LDYgQEAKIC8qIEZvciBzcGlubG9ja3MgZXRjICovCiAjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpCSh7IGxvY2FsX3NhdmVfZmxhZ3MoeCk7IGxvY2FsX2lycV9kaXNhYmxlKCk7IH0pCiAKLS8qCi0gKiBGb3JjZSBzdHJpY3QgQ1BVIG9yZGVyaW5nLgotICogTm90IHJlYWxseSByZXF1aXJlZCBvbiBtNjhrLi4uCi0gKi8KLSNkZWZpbmUgbm9wKCkJCWRvIHsgYXNtIHZvbGF0aWxlICgibm9wIik7IGJhcnJpZXIoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWIoKQkJYmFycmllcigpCi0jZGVmaW5lIHJtYigpCQliYXJyaWVyKCkKLSNkZWZpbmUgd21iKCkJCWJhcnJpZXIoKQotI2RlZmluZSByZWFkX2JhcnJpZXJfZGVwZW5kcygpCSgodm9pZCkwKQotI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkJKHsgKHZhcikgPSAodmFsdWUpOyB3bWIoKTsgfSkKLQotI2RlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3JtYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfd21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCSgodm9pZCkwKQotCi0KICNkZWZpbmUgeGNoZyhwdHIseCkgKChfX3R5cGVvZl9fKCoocHRyKSkpX194Y2hnKCh1bnNpZ25lZCBsb25nKSh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkpCiAKIHN0cnVjdCBfX3hjaGdfZHVtbXkgeyB1bnNpZ25lZCBsb25nIGFbMTAwXTsgfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9oYXJkaXJxLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaGFyZGlycS5oCmluZGV4IDk4MDA3NWIuLmJmYWQyODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9oYXJkaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2hhcmRpcnEuaApAQCAtMjIsNCArMjIsNiBAQAogIyBlcnJvciBIQVJESVJRX0JJVFMgaXMgdG9vIGxvdyEKICNlbmRpZgogCit2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpOworCiAjZW5kaWYgLyogX19NNjhLX0hBUkRJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2h3X2lycS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2h3X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWM5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaHdfaXJxLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fTTY4S05PTU1VX0hXX0lSUV9IX18KKyNkZWZpbmUgX19NNjhLTk9NTVVfSFdfSVJRX0hfXworCisjZW5kaWYgLyogX19NNjhLTk9NTVVfSFdfSVJRX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmgKaW5kZXggNmNlMjhmOC4uNzA4ZDc4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCkBAIC0xLDUzICsxLDIxIEBACiAjaWZuZGVmIF9NNjhLTk9NTVVfTUFDSERFUF9ICiAjZGVmaW5lIF9NNjhLTk9NTVVfTUFDSERFUF9ICiAKLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi1zdHJ1Y3QgcHRfcmVnczsKLXN0cnVjdCBrYmRfcmVwZWF0Owotc3RydWN0IG1rdGltZTsKLXN0cnVjdCBod2Nsa190aW1lOwotc3RydWN0IGdlbmRpc2s7Ci1zdHJ1Y3QgYnVmZmVyX2hlYWQ7Ci0KLWV4dGVybiB2b2lkICgqbWFjaF9zY2hlZF9pbml0KSAoaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpOwotLyogbWFjaGluZSBkZXBlbmRlbnQga2V5Ym9hcmQgZnVuY3Rpb25zICovCi1leHRlcm4gaW50ICgqbWFjaF9rZXliX2luaXQpICh2b2lkKTsKLWV4dGVybiBpbnQgKCptYWNoX2tiZHJhdGUpIChzdHJ1Y3Qga2JkX3JlcGVhdCAqKTsKLWV4dGVybiB2b2lkICgqbWFjaF9rYmRfbGVkcykgKHVuc2lnbmVkIGludCk7Ci0vKiBtYWNoaW5lIGRlcGVuZGVudCBpcnEgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWV4dGVybiBpcnFfaGFuZGxlcl90IG1hY2hfZGVmYXVsdF9oYW5kbGVyOwotZXh0ZXJuIGludCAoKm1hY2hfcmVxdWVzdF9pcnEpICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwotZXh0ZXJuIHZvaWQgKCptYWNoX2ZyZWVfaXJxKSAodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkICgqbWFjaF9nZXRfbW9kZWwpIChjaGFyICptb2RlbCk7Ci1leHRlcm4gaW50ICgqbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCkgKGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gaW50ICgqbWFjaF9nZXRfaXJxX2xpc3QpIChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOwotZXh0ZXJuIHZvaWQgKCptYWNoX3Byb2Nlc3NfaW50KSAoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK2V4dGVybiB2b2lkICgqbWFjaF9zY2hlZF9pbml0KSAoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IHRpbWVyIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpKHZvaWQpOwogZXh0ZXJuIHZvaWQgKCptYWNoX2dldHRvZCkoaW50ICp5ZWFyLCBpbnQgKm1vbiwgaW50ICpkYXksIGludCAqaG91ciwKIAkJCSAgIGludCAqbWluLCBpbnQgKnNlYyk7Ci1leHRlcm4gaW50ICgqbWFjaF9od2NsaykoaW50LCBzdHJ1Y3QgaHdjbGtfdGltZSopOwogZXh0ZXJuIGludCAoKm1hY2hfc2V0X2Nsb2NrX21tc3MpKHVuc2lnbmVkIGxvbmcpOworCisvKiBtYWNoaW5lIGRlcGVuZGVudCBwb3dlciBvZmYgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCAoKm1hY2hfcmVzZXQpKCB2b2lkICk7CiBleHRlcm4gdm9pZCAoKm1hY2hfaGFsdCkoIHZvaWQgKTsKIGV4dGVybiB2b2lkICgqbWFjaF9wb3dlcl9vZmYpKCB2b2lkICk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyAoKm1hY2hfaGRfaW5pdCkgKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgKCptYWNoX2hkX3NldHVwKShjaGFyICosIGludCAqKTsKLWV4dGVybiBsb25nIG1hY2hfbWF4X2RtYV9hZGRyZXNzOwotZXh0ZXJuIHZvaWQgKCptYWNoX2Zsb3BweV9lamVjdCkodm9pZCk7Ci1leHRlcm4gdm9pZCAoKm1hY2hfaGVhcnRiZWF0KSAoaW50KTsKLWV4dGVybiB2b2lkICgqbWFjaF9sMl9mbHVzaCkgKGludCk7Ci1leHRlcm4gaW50IG1hY2hfc3lzcnFfa2V5OwotZXh0ZXJuIGludCBtYWNoX3N5c3JxX3NoaWZ0X3N0YXRlOwotZXh0ZXJuIGludCBtYWNoX3N5c3JxX3NoaWZ0X21hc2s7Ci1leHRlcm4gY2hhciAqbWFjaF9zeXNycV94bGF0ZTsKIAogZXh0ZXJuIHZvaWQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kLCBpbnQgbGVuKTsKIGV4dGVybiB2b2lkICgqbWFjaF90aWNrKSh2b2lkKTsKLWV4dGVybiB2b2lkICgqbWFjaF90cmFwX2luaXQpKHZvaWQpOwogCiAjZW5kaWYgLyogX002OEtOT01NVV9NQUNIREVQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZkbWEuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZkbWEuaAppbmRleCBlYTcyOWU4Li43MDVjNTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZmRtYS5oCkBAIC0xMzMsNyArMTMzLDcgQEAKICNkZWZpbmUgTUNGRE1BX0RJUl9BU0NFTiAgICAgMHgwODAwIC8qIEFkZHJlc3MgU2VxdWVuY2UgQ29tcGxldGUgKENvbXBsZXRpb24pIGludGVycnVwdCBlbmFibGUgKi8KICNkZWZpbmUgTUNGRE1BX0RJUl9URUVOICAgICAgMHgwMjAwIC8qIFRyYW5zZmVyIEVycm9yIGludGVycnVwdCBlbmFibGUgKi8KICNkZWZpbmUgTUNGRE1BX0RJUl9UQ0VOICAgICAgMHgwMTAwIC8qIFRyYW5zZmVyIENvbXBsZXRlIChhIGJ1cyB0cmFuc2ZlciwgdGhhdCBpcykgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBNQ0ZETUFfRElSX0lOViAgICAgICAweDEwMDAgLyogSW52YWxpZCBDb21iaW5hdGlvbiAqLworI2RlZmluZSBNQ0ZETUFfRElSX0lOViAgICAgICAweDAwMTAgLyogSW52YWxpZCBDb21iaW5hdGlvbiAqLwogI2RlZmluZSBNQ0ZETUFfRElSX0FTQyAgICAgICAweDAwMDggLyogQWRkcmVzcyBTZXF1ZW5jZSBDb21wbGV0ZSAoRE1BIENvbXBsZXRpb24pICovCiAjZGVmaW5lIE1DRkRNQV9ESVJfVEUgICAgICAgIDB4MDAwMiAvKiBUcmFuc2ZlciBFcnJvciAqLwogI2RlZmluZSBNQ0ZETUFfRElSX1RDICAgICAgICAweDAwMDEgLyogVHJhbnNmZXIgQ29tcGxldGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zeXN0ZW0uaAppbmRleCA1ZTVlZDE4Li41ZGE0M2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3N5c3RlbS5oCkBAIC0yOTYsNyArMjk2LDcgQEAKICh7CQkJCQkJXAogCXVuc2lnbmVkIGNoYXIgdm9sYXRpbGUgKnJlc2V0OwkJXAogCWFzbSgibW92ZS53CSMweDI3MDAsICVzciIpOwkJXAotCXJlc2V0ID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShNQ0ZfSVBTQkFSICsgMHgxMTAwMDApKTsJXAorCXJlc2V0ID0gKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKE1DRl9JUFNCQVIgKyAweDExMDAwMCkpOwlcCiAJd2hpbGUoMSkJCQkJXAogCSpyZXNldCB8PSAoMHgwMSA8PCA3KTtcCiB9KQpAQCAtMzE4LDcgKzMxOCw3IEBACiAoewkJCQkJXAogCXVuc2lnbmVkIGNoYXIgdm9sYXRpbGUgKnJlc2V0OwlcCiAJYXNtKCJtb3ZlLncgICAgICMweDI3MDAsICVzciIpOwlcCi0JcmVzZXQgPSAoKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKE1DRl9JUFNCQVIgKyAweEEwMDAwKSk7CVwKKwlyZXNldCA9ICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShNQ0ZfSVBTQkFSICsgMHhBMDAwMCkpOwlcCiAJd2hpbGUoMSkJCQlcCiAJCSpyZXNldCB8PSAweDgwOwkJXAogfSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS90aW1leC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3RpbWV4LmgKaW5kZXggODUwNjk5OS4uMTA5MDUwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3RpbWV4LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3RpbWV4LmgKQEAgLTEgKzEsMjMgQEAKLSNpbmNsdWRlIDxhc20tbTY4ay90aW1leC5oPgorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLW02OGtub21tdS90aW1leC5oCisgKgorICogbTY4a25vbW11IGFyY2hpdGVjdHVyZSB0aW1leCBzcGVjaWZpY2F0aW9ucworICovCisjaWZuZGVmIF9BU01fTTY4S05PTU1VX1RJTUVYX0gKKyNkZWZpbmUgX0FTTV9NNjhLTk9NTVVfVElNRVhfSAorCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQlNQ0ZfQ0xLCisjZWxzZQorI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTE5MzE4MCAvKiBVbmRlcmx5aW5nIEhaICovCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGN5Y2xlc190OworCitzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2VkYWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZWRhYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzE5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2VkYWMuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIEFTTV9FREFDX0gKKyNkZWZpbmUgQVNNX0VEQUNfSAorCisvKiBFQ0MgYXRvbWljLCBETUEsIFNNUCBhbmQgaW50ZXJydXB0IHNhZmUgc2NydWIgZnVuY3Rpb24gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zY3J1Yih2b2lkICp2YSwgdTMyIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyAqdmlydF9hZGRyID0gdmE7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7IGkrKywgdmlydF9hZGRyKyspIHsKKworCQkvKgorCQkgKiBWZXJ5IGNhcmVmdWxseSByZWFkIGFuZCB3cml0ZSB0byBtZW1vcnkgYXRvbWljYWxseQorCQkgKiBzbyB3ZSBhcmUgaW50ZXJydXB0LCBETUEgYW5kIFNNUCBzYWZlLgorCQkgKgorCQkgKiBJbnRlbDogYXNtKCJsb2NrOyBhZGRsICQwLCAlMCI6OiJtIigqdmlydF9hZGRyKSk7CisJCSAqLworCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgICAgICAuc2V0ICAgIG1pcHMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIjE6ICAgICBsbCAgICAgICUwLCAlMSAgICAgICAgICAjIGF0b21pY19hZGQgICAgICAgICAgICBcbiIKKwkJIiAgICAgICBsbCAgICAgICUwLCAlMSAgICAgICAgICAjIGF0b21pY19hZGQgICAgICAgICAgICBcbiIKKwkJIiAgICAgICBhZGR1ICAgICUwLCAkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgICBzYyAgICAgICUwLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgICBiZXF6ICAgICUwLCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgICAuc2V0ICAgIG1pcHMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiAiPSZyIiAodGVtcCksICI9bSIgKCp2aXJ0X2FkZHIpCisJCTogIm0iICgqdmlydF9hZGRyKSk7CisKKwl9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy93YXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvd2FyLmgKaW5kZXggOWRlNTJhNS4uMjg4M2NjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy93YXIuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3dhci5oCkBAIC0xODgsNyArMTg4LDYgQEAKICNkZWZpbmUgSUNBQ0hFX1JFRklMTFNfV09SS0FST1VORF9XQVIJMQogI2VuZGlmCiAKLQogLyoKICAqIE9uIHRoZSBSMTAwMDAgdXB0byB2ZXJzaW9uIDIuNiAobm90IHN1cmUgYWJvdXQgMi43KSB0aGVyZSBpcyBhIGJ1ZyB0aGF0CiAgKiBtYXkgY2F1c2UgbGwgLyBzYyBhbmQgbGxkIC8gc2NkIHNlcXVlbmNlcyB0byBleGVjdXRlIG5vbi1hdG9taWNhbGx5LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9idWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYnVnLmgKaW5kZXggZjZmYTM5NC4uYTI0OGI4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Zy5oCkBAIC03OSw3ICs3OSw3IEBACiAJCV9FTUlUX0JVR19FTlRSWQkJCQkJXAogCQk6IDogImkiIChfX0ZJTEVfXyksICJpIiAoX19MSU5FX18pLCAiaSIgKDApLAlcCiAJCSAgImkiIChzaXplb2Yoc3RydWN0IGJ1Z19lbnRyeSkpLAkJXAotCQkgICJyIiAoKGxvbmcpKHgpKSk7CQkJCVwKKwkJICAiciIgKChfX2ZvcmNlIGxvbmcpKHgpKSk7CQkJXAogCX0JCQkJCQkJXAogfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2UuaAppbmRleCAxMGM1MWY0Li4yMzZhOTIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2UuaApAQCAtMTkwLDcgKzE5MCw2IEBACiBleHRlcm4gaW50IHBhZ2VfaXNfcmFtKHVuc2lnbmVkIGxvbmcgcGZuKTsKIAogc3RydWN0IHZtX2FyZWFfc3RydWN0OwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFyY2hfdm1hX25hbWUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCmluZGV4IGU3MmMyYTYuLmU5MDk3NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCkBAIC00NSwxMCArNDUsMTcgQEAKIAkgKiAgIG9uIEZyZWVzY2FsZSBQQ0ktZSBjb250cm9sbGVycyBzaW5jZSB0aGV5IHVzZWQgdGhlIFBDSV9QUklNQVJZX0JVUwogCSAqICAgdG8gZGV0ZXJtaW5lIHdoaWNoIGJ1cyBudW1iZXIgdG8gbWF0Y2ggb24gd2hlbiBnZW5lcmF0aW5nIHR5cGUwCiAJICogICBjb25maWcgY3ljbGVzCisJICogIE5PX1BDSUVfTElOSyAtIHRoZSBGcmVlc2NhbGUgUENJLWUgY29udHJvbGxlcnMgaGF2ZSBpc3N1ZXMgd2l0aAorCSAqICAgaGFuZ2luZyBpZiB3ZSBkb24ndCBoYXZlIGxpbmsgYW5kIHRyeSB0byBkbyBjb25maWcgY3ljbGVzIHRvCisJICogICBhbnl0aGluZyBidXQgdGhlIFBIQi4gIE9ubHkgYWxsb3cgdGFsa2luZyB0byB0aGUgUEhCIGlmIHRoaXMgaXMKKwkgKiAgIHNldC4KKwkgKiAgQklHX0VORElBTiAtIGNmZ19hZGRyIGlzIGEgYmlnIGVuZGlhbiByZWdpc3RlcgogCSAqLwogI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9TRVRfQ0ZHX1RZUEUJCSgweDAwMDAwMDAxKQogI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9FWFRfUkVHCQkoMHgwMDAwMDAwMikKICNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMJKDB4MDAwMDAwMDQpCisjZGVmaW5lIFBQQ19JTkRJUkVDVF9UWVBFX05PX1BDSUVfTElOSwkJKDB4MDAwMDAwMDgpCisjZGVmaW5lIFBQQ19JTkRJUkVDVF9UWVBFX0JJR19FTkRJQU4JCSgweDAwMDAwMDEwKQogCXUzMiBpbmRpcmVjdF90eXBlOwogCiAJLyogQ3VycmVudGx5LCB3ZSBsaW1pdCBvdXJzZWx2ZXMgdG8gMSBJTyByYW5nZSBhbmQgMyBtZW0KQEAgLTY0LDYgKzcxLDE0IEBACiAJcmV0dXJuIGJ1cy0+c3lzZGF0YTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNhX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpCit7CisJLyogTm8gc3BlY2lmaWMgSVNBIGhhbmRsaW5nIG9uIHBwYzMyIGF0IHRoaXMgc3RhZ2UsIGl0CisJICogYWxsIGdvZXMgdGhyb3VnaCBQQ0kKKwkgKi8KKwlyZXR1cm4gMDsKK30KKwogLyogVGhlc2UgYXJlIHVzZWQgZm9yIGNvbmZpZyBhY2Nlc3MgYmVmb3JlIGFsbCB0aGUgUENJIHByb2JpbmcKICAgIGhhcyBiZWVuIGRvbmUuICovCiBpbnQgZWFybHlfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCkBAIC03OSwxMSArOTQsMTQgQEAKIGludCBlYXJseV93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAogCQkJICAgICBpbnQgd2hlcmUsIHUzMiB2YWwpOwogCi1leHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAotCQkJICAgICAgIHZvaWQgX19pb21lbSAqY2ZnX2FkZHIsIHZvaWQgX19pb21lbSAqY2ZnX2RhdGEpOworZXh0ZXJuIGludCBlYXJseV9maW5kX2NhcGFiaWxpdHkoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLAorCQkJCSBpbnQgZGV2X2ZuLCBpbnQgY2FwKTsKKwogZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKLQkJCSAgICAgICB1MzIgY2ZnX2FkZHIsIHUzMiBjZmdfZGF0YSk7CisJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEsIHUzMiBmbGFncyk7CiBleHRlcm4gdm9pZCBzZXR1cF9ncmFja2xlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CitleHRlcm4gdm9pZCBfX2luaXQgdXBkYXRlX2JyaWRnZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIAogI2Vsc2UKIApAQCAtMjMxLDYgKzI0OSwxMyBAQAogCiBleHRlcm4gdm9pZCBpc2FfYnJpZGdlX2ZpbmRfZWFybHkoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKIAorc3RhdGljIGlubGluZSBpbnQgaXNhX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpCit7CisJLyogQ2hlY2sgaWYgYWRkcmVzcyBoaXRzIHRoZSByZXNlcnZlZCBsZWdhY3kgSU8gcmFuZ2UgKi8KKwl1bnNpZ25lZCBsb25nIGVhID0gKHVuc2lnbmVkIGxvbmcpYWRkcmVzczsKKwlyZXR1cm4gZWEgPj0gSVNBX0lPX0JBU0UgJiYgZWEgPCBJU0FfSU9fRU5EOworfQorCiBleHRlcm4gaW50IHBjaWJpb3NfdW5tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBleHRlcm4gaW50IHBjaWJpb3NfbWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCkBAIC0yNjEsMTEgKzI4NiwxNiBAQAogcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKICNpZmRlZiBDT05GSUdfUENJCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7CitleHRlcm4gaW50IHBjaWJpb3NfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcyk7CiAjZWxzZQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQogewogCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IHBjaWJpb3NfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjX2FzbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKaW5kZXggZmEwODNkOC4uNjUzMjU3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGNfYXNtLmgKQEAgLTE4MSw2ICsxODEsMTggQEAKIAkudHlwZSBHTFVFKC4sbmFtZSksQGZ1bmN0aW9uOyBcCiBHTFVFKC4sbmFtZSk6CiAKKyNkZWZpbmUgX0lOSVRfU1RBVElDKG5hbWUpIFwKKwkuc2VjdGlvbiAiLnRleHQuaW5pdC5yZWZvayI7IFwKKwkuYWxpZ24gMiA7IFwKKwkuc2VjdGlvbiAiLm9wZCIsImF3IjsgXAorbmFtZTogXAorCS5xdWFkIEdMVUUoLixuYW1lKTsgXAorCS5xdWFkIC5UT0MuQHRvY2Jhc2U7IFwKKwkucXVhZCAwOyBcCisJLnByZXZpb3VzOyBcCisJLnR5cGUgR0xVRSguLG5hbWUpLEBmdW5jdGlvbjsgXAorR0xVRSguLG5hbWUpOgorCiAjZWxzZSAvKiAzMi1iaXQgKi8KIAogI2RlZmluZSBfR0xPQkFMKG4pCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCmluZGV4IDAxMTdiNTQuLjNhMDk3NWUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmgKQEAgLTgwLDYgKzgwLDExIEBACiBleHRlcm4gc3RydWN0IHZpb19kZXYgKnZpb19maW5kX25vZGUoc3RydWN0IGRldmljZV9ub2RlICp2bm9kZSk7CiBleHRlcm4gaW50IHZpb19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgdmlvX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB2aW9fZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2aW9fZHJpdmVyICp0b192aW9fZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Njd2Rldi5oIGIvaW5jbHVkZS9hc20tczM5MC9jY3dkZXYuaAppbmRleCA0YzJlMTcxLi4xYWVkYTI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2Njd2Rldi5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKQEAgLTE2NSwxMSArMTY1LDYgQEAKIGV4dGVybiBpbnQgY2N3X2RldmljZV9oYWx0KHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBjY3dfZGV2aWNlX2NsZWFyKHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogCi1leHRlcm4gaW50IF9fZGVwcmVjYXRlZCByZWFkX2Rldl9jaGFycyhzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqKmJ1ZmZlciwgaW50IGxlbmd0aCk7Ci1leHRlcm4gaW50IF9fZGVwcmVjYXRlZCByZWFkX2NvbmZfZGF0YShzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqKmJ1ZmZlciwgaW50ICpsZW5ndGgpOwotZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgcmVhZF9jb25mX2RhdGFfbHBtKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICoqYnVmZmVyLAotCQkJICAgICAgaW50ICpsZW5ndGgsIF9fdTggbHBtKTsKLQogZXh0ZXJuIGludCBjY3dfZGV2aWNlX3NldF9vbmxpbmUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOwogZXh0ZXJuIGludCBjY3dfZGV2aWNlX3NldF9vZmZsaW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zMzkwX2V4dC5oIGIvaW5jbHVkZS9hc20tczM5MC9zMzkwX2V4dC5oCmluZGV4IGRmOWIxMDEuLjFlNzIzNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvczM5MF9leHQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3MzOTBfZXh0LmgKQEAgLTEwLDYgKzEwLDggQEAKICAqICAgICAgICAgICAgICAgTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQogICovCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiB0eXBlZGVmIHZvaWQgKCpleHRfaW50X2hhbmRsZXJfdCkoX191MTYgY29kZSk7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oIGIvaW5jbHVkZS9hc20tczM5MC9zbXAuaAppbmRleCA3NmU0MjRmLi4wNzcwOGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc21wLmgKQEAgLTM2LDggKzM2LDcgQEAKIGV4dGVybiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmX3NtcCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgc21wX3NldHVwX2NwdV9wb3NzaWJsZV9tYXAodm9pZCk7Ci1leHRlcm4gaW50IHNtcF9jYWxsX2Z1bmN0aW9uX29uKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCi0JCQkJaW50IG5vbmF0b21pYywgaW50IHdhaXQsIGludCBjcHUpOworCiAjZGVmaW5lIE5PX1BST0NfSUQJCTB4RkYJCS8qIE5vIHByb2Nlc3NvciBtYWdpYyBtYXJrZXIgKi8KIAogLyoKQEAgLTk2LDE0ICs5NSw2IEBACiAjZW5kaWYKIAogI2lmbmRlZiBDT05GSUdfU01QCi1zdGF0aWMgaW5saW5lIGludAotc21wX2NhbGxfZnVuY3Rpb25fb24odm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywKLQkJICAgICBpbnQgbm9uYXRvbWljLCBpbnQgd2FpdCwgaW50IGNwdSkKLXsKLQlmdW5jKGluZm8pOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQogewogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMvbWFjaGluZSBjaGVja3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oCmluZGV4IDc5MGMxYzUuLmYwNGFjYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaApAQCAtMjUxLDcgKzI1MSw3IEBACiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTEKICNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTIKICNkZWZpbmUgX19OUl91dGltZXMJCTMxMwotLyogTnVtYmVyIDMxNCBpcyByZXNlcnZlZCBmb3IgbmV3IHN5c19mYWxsb2NhdGUgKi8KKyNkZWZpbmUgX19OUl9mYWxsb2NhdGUJCTMxNAogI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJMzE1CiAjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTMxNgogI2RlZmluZSBfX05SX3RpbWVyZmQJCTMxNwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tc2g2NC9kbWEtbWFwcGluZy5oCmluZGV4IGM3YzBmMDUuLmQ1MDVmMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2RtYS1tYXBwaW5nLmgKQEAgLTUxLDExICs1MSwxMSBAQAogewogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCkKIAlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKLQkJcmV0dXJuIHZpcnRfdG9fYnVzKHB0cik7CisJCXJldHVybiB2aXJ0X3RvX3BoeXMocHRyKTsKICNlbmRpZgogCWRtYV9jYWNoZV9zeW5jKGRldiwgcHRyLCBzaXplLCBkaXIpOwogCi0JcmV0dXJuIHZpcnRfdG9fYnVzKHB0cik7CisJcmV0dXJuIHZpcnRfdG9fcGh5cyhwdHIpOwogfQogCiAjZGVmaW5lIGRtYV91bm1hcF9zaW5nbGUoZGV2LCBhZGRyLCBzaXplLCBkaXIpCWRvIHsgfSB3aGlsZSAoMCkKQEAgLTk4LDcgKzk4LDcgQEAKIAlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKIAkJcmV0dXJuOwogI2VuZGlmCi0JZG1hX2NhY2hlX3N5bmMoZGV2LCBidXNfdG9fdmlydChkbWFfaGFuZGxlKSwgc2l6ZSwgZGlyKTsKKwlkbWFfY2FjaGVfc3luYyhkZXYsIHBoeXNfdG9fdmlydChkbWFfaGFuZGxlKSwgc2l6ZSwgZGlyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9yYW5nZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKIAkJcmV0dXJuOwogI2VuZGlmCi0JZG1hX2NhY2hlX3N5bmMoZGV2LCBidXNfdG9fdmlydChkbWFfaGFuZGxlKSArIG9mZnNldCwgc2l6ZSwgZGlyKTsKKwlkbWFfY2FjaGVfc3luYyhkZXYsIHBoeXNfdG9fdmlydChkbWFfaGFuZGxlKSArIG9mZnNldCwgc2l6ZSwgZGlyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvaW8uaCBiL2luY2x1ZGUvYXNtLXNoNjQvaW8uaAppbmRleCAxNGQ4ZTdiLi4xZjM3YjY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9pby5oCkBAIC0zMSwxMCArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9tYXAuaD4KIAotI2RlZmluZSB2aXJ0X3RvX2J1cyB2aXJ0X3RvX3BoeXMKLSNkZWZpbmUgYnVzX3RvX3ZpcnQgcGh5c190b192aXJ0Ci0jZGVmaW5lIHBhZ2VfdG9fYnVzIHBhZ2VfdG9fcGh5cwotCiAvKgogICogTm90aGluZyBvdmVybHkgc3BlY2lhbCBoZXJlLi4gaW5zdGVhZCBvZiBkb2luZyB0aGUgc2FtZSB0aGluZwogICogb3ZlciBhbmQgb3ZlciBhZ2Fpbiwgd2UganVzdCBkZWZpbmUgYSBzZXQgb2Ygc2g2NF9pbi9vdXQgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2RldmljZS5oCmluZGV4IDRhNTZkODQuLmMwYTc3ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2RldmljZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2RldmljZS5oCkBAIC0xMCw2ICsxMCwxMCBAQAogc3RydWN0IG9mX2RldmljZTsKIAogc3RydWN0IGRldl9hcmNoZGF0YSB7CisJdm9pZAkJCSppb21tdTsKKwl2b2lkCQkJKnN0YzsKKwl2b2lkCQkJKmhvc3RfY29udHJvbGxlcjsKKwogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqcHJvbV9ub2RlOwogCXN0cnVjdCBvZl9kZXZpY2UJKm9wOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvZmxvcHB5LmgKaW5kZXggOTA3M2M4NC4uMjhjZTJiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZmxvcHB5LmgKQEAgLTEwMSw2ICsxMDEsMjkgQEAKICNkZWZpbmUgQ1JPU1NfNjRLQihhLHMpICgwKQogCiAvKiBSb3V0aW5lcyB1bmlxdWUgdG8gZWFjaCBjb250cm9sbGVyIHR5cGUgb24gYSBTdW4uICovCitzdGF0aWMgdm9pZCBzdW5fc2V0X2Rvcih1bnNpZ25lZCBjaGFyIHZhbHVlLCBpbnQgZmRjXzgyMDc3KQoreworCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGMpIHsKKwkJdW5zaWduZWQgaW50IGJpdHMgPSAwOworCQlpZiAodmFsdWUgJiAweDEwKQorCQkJYml0cyB8PSBBVVhJT19GTFBZX0RTRUw7CisJCWlmICgodmFsdWUgJiAweDgwKSA9PSAwKQorCQkJYml0cyB8PSBBVVhJT19GTFBZX0VKQ1Q7CisJCXNldF9hdXhpbyhiaXRzLCAofmJpdHMpICYgKEFVWElPX0ZMUFlfRFNFTHxBVVhJT19GTFBZX0VKQ1QpKTsKKwl9CisJaWYgKGZkY184MjA3NykgeworCQlzdW5fZmRjLT5kb3JfODIwNzcgPSB2YWx1ZTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN1bl9yZWFkX2Rpcih2b2lkKQoreworCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGMpCisJCXJldHVybiAoZ2V0X2F1eGlvKCkgJiBBVVhJT19GTFBZX0RDSEcpID8gMHg4MCA6IDA7CisJZWxzZQorCQlyZXR1cm4gc3VuX2ZkYy0+ZGlyXzgyMDc3OworfQorCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzdW5fODIwNzJfZmRfaW5iKGludCBwb3J0KQogewogCXVkZWxheSg1KTsKQEAgLTExMyw3ICsxMzYsNyBAQAogCWNhc2UgNTogLyogRkRfREFUQSAqLwogCQlyZXR1cm4gc3VuX2ZkYy0+ZGF0YV84MjA3MjsKIAljYXNlIDc6IC8qIEZEX0RJUiAqLwotCQlyZXR1cm4gKGdldF9hdXhpbygpICYgQVVYSU9fRkxQWV9EQ0hHKT8gMHg4MDogMDsKKwkJcmV0dXJuIHN1bl9yZWFkX2RpcigpOwogCX07CiAJcGFuaWMoInN1bl84MjA3Ml9mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KQEAgLTEyNiwyMCArMTQ5LDcgQEAKIAkJcHJpbnRrKCJmbG9wcHk6IEFza2VkIHRvIHdyaXRlIHRvIHVua25vd24gcG9ydCAlZFxuIiwgcG9ydCk7CiAJCXBhbmljKCJmbG9wcHk6IFBvcnQgYm9saXhlZC4iKTsKIAljYXNlIDI6IC8qIEZEX0RPUiAqLwotCQkvKiBPaCBnZWVzZSwgODIwNzIgb24gdGhlIFN1biBoYXMgbm8gRE9SIHJlZ2lzdGVyLAotCQkgKiB0aGUgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIEFVWElPCi0JCSAqIEkvTyByZWdpc3Rlci4gIFNvIHdlIG11c3QgZW11bGF0ZSB0aGUgYmVoYXZpb3IuCi0JCSAqCi0JCSAqIEFTU1VNUFRJT05TOiAgVGhlcmUgd2lsbCBvbmx5IGV2ZXIgYmUgb25lIGZsb3BweQotCQkgKiAgICAgICAgICAgICAgIGRyaXZlIGF0dGFjaGVkIHRvIGEgU3VuIGNvbnRyb2xsZXIKLQkJICogICAgICAgICAgICAgICBhbmQgaXQgd2lsbCBiZSBhdCBkcml2ZSB6ZXJvLgotCQkgKi8KLQkJewotCQkJdW5zaWduZWQgYml0cyA9IDA7Ci0JCQlpZiAodmFsdWUgJiAweDEwKSBiaXRzIHw9IEFVWElPX0ZMUFlfRFNFTDsKLQkJCWlmICgodmFsdWUgJiAweDgwKSA9PSAwKSBiaXRzIHw9IEFVWElPX0ZMUFlfRUpDVDsKLQkJCXNldF9hdXhpbyhiaXRzLCAofmJpdHMpICYgKEFVWElPX0ZMUFlfRFNFTHxBVVhJT19GTFBZX0VKQ1QpKTsKLQkJfQorCQlzdW5fc2V0X2Rvcih2YWx1ZSwgMCk7CiAJCWJyZWFrOwogCWNhc2UgNTogLyogRkRfREFUQSAqLwogCQlzdW5fZmRjLT5kYXRhXzgyMDcyID0gdmFsdWU7CkBAIC0xNjEsMTUgKzE3MSwyMiBAQAogCWRlZmF1bHQ6CiAJCXByaW50aygiZmxvcHB5OiBBc2tlZCB0byByZWFkIHVua25vd24gcG9ydCAlZFxuIiwgcG9ydCk7CiAJCXBhbmljKCJmbG9wcHk6IFBvcnQgYm9saXhlZC4iKTsKKwljYXNlIDA6IC8qIEZEX1NUQVRVU18wICovCisJCXJldHVybiBzdW5fZmRjLT5zdGF0dXMxXzgyMDc3OworCWNhc2UgMTogLyogRkRfU1RBVFVTXzEgKi8KKwkJcmV0dXJuIHN1bl9mZGMtPnN0YXR1czJfODIwNzc7CisJY2FzZSAyOiAvKiBGRF9ET1IgKi8KKwkJcmV0dXJuIHN1bl9mZGMtPmRvcl84MjA3NzsKKwljYXNlIDM6IC8qIEZEX1REUiAqLworCQlyZXR1cm4gc3VuX2ZkYy0+dGFwZWN0bF84MjA3NzsKIAljYXNlIDQ6IC8qIEZEX1NUQVRVUyAqLwogCQlyZXR1cm4gc3VuX2ZkYy0+c3RhdHVzXzgyMDc3ICYgflNUQVRVU19ETUE7CiAJY2FzZSA1OiAvKiBGRF9EQVRBICovCiAJCXJldHVybiBzdW5fZmRjLT5kYXRhXzgyMDc3OwogCWNhc2UgNzogLyogRkRfRElSICovCi0JCS8qIFhYWDogSXMgRENMIG9uIDB4ODAgaW4gc3VuNG0/ICovCi0JCXJldHVybiBzdW5fZmRjLT5kaXJfODIwNzc7CisJCXJldHVybiBzdW5fcmVhZF9kaXIoKTsKIAl9OwotCXBhbmljKCJzdW5fODIwNzJfZmRfaW5iOiBIb3cgZGlkIEkgZ2V0IGhlcmU/Iik7CisJcGFuaWMoInN1bl84MjA3N19mZF9pbmI6IEhvdyBkaWQgSSBnZXQgaGVyZT8iKTsKIH0KIAogc3RhdGljIHZvaWQgc3VuXzgyMDc3X2ZkX291dGIodW5zaWduZWQgY2hhciB2YWx1ZSwgaW50IHBvcnQpCkBAIC0xODAsOCArMTk3LDcgQEAKIAkJcHJpbnRrKCJmbG9wcHk6IEFza2VkIHRvIHdyaXRlIHRvIHVua25vd24gcG9ydCAlZFxuIiwgcG9ydCk7CiAJCXBhbmljKCJmbG9wcHk6IFBvcnQgYm9saXhlZC4iKTsKIAljYXNlIDI6IC8qIEZEX0RPUiAqLwotCQkvKiBIYXBwaWx5LCB0aGUgODIwNzcgaGFzIGEgcmVhbCBET1IgcmVnaXN0ZXIuICovCi0JCXN1bl9mZGMtPmRvcl84MjA3NyA9IHZhbHVlOworCQlzdW5fc2V0X2Rvcih2YWx1ZSwgMSk7CiAJCWJyZWFrOwogCWNhc2UgNTogLyogRkRfREFUQSAqLwogCQlzdW5fZmRjLT5kYXRhXzgyMDc3ID0gdmFsdWU7CkBAIC0xOTIsNiArMjA4LDkgQEAKIAljYXNlIDQ6IC8qIEZEX1NUQVRVUyAqLwogCQlzdW5fZmRjLT5zdGF0dXNfODIwNzcgPSB2YWx1ZTsKIAkJYnJlYWs7CisJY2FzZSAzOiAvKiBGRF9URFIgKi8KKwkJc3VuX2ZkYy0+dGFwZWN0bF84MjA3NyA9IHZhbHVlOworCQlicmVhazsKIAl9OwogCXJldHVybjsKIH0KQEAgLTMzMiwxNiArMzUxLDE3IEBACiAJCWdvdG8gbm9fc3VuX2ZkYzsKIAl9CiAKLSAgICAgICAgaWYoc3BhcmNfY3B1X21vZGVsID09IHN1bjRjKSB7Ci0gICAgICAgICAgICAgICAgc3VuX2Zkb3BzLmZkX2luYiA9IHN1bl84MjA3Ml9mZF9pbmI7Ci0gICAgICAgICAgICAgICAgc3VuX2Zkb3BzLmZkX291dGIgPSBzdW5fODIwNzJfZmRfb3V0YjsKLSAgICAgICAgICAgICAgICBmZGNfc3RhdHVzID0gJnN1bl9mZGMtPnN0YXR1c184MjA3MjsKLSAgICAgICAgICAgICAgICAvKiBwcmludGsoIkFVWElPIEAweCVseFxuIiwgYXV4aW9fcmVnaXN0ZXIpOyAqLyAvKiBQMyAqLwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1bl9mZG9wcy5mZF9pbmIgPSBzdW5fODIwNzdfZmRfaW5iOwotICAgICAgICAgICAgICAgIHN1bl9mZG9wcy5mZF9vdXRiID0gc3VuXzgyMDc3X2ZkX291dGI7Ci0gICAgICAgICAgICAgICAgZmRjX3N0YXR1cyA9ICZzdW5fZmRjLT5zdGF0dXNfODIwNzc7Ci0gICAgICAgICAgICAgICAgLyogcHJpbnRrKCJET1IgQDB4JXBcbiIsICZzdW5fZmRjLT5kb3JfODIwNzcpOyAqLyAvKiBQMyAqLworCXN1bl9mZG9wcy5mZF9pbmIgPSBzdW5fODIwNzdfZmRfaW5iOworCXN1bl9mZG9wcy5mZF9vdXRiID0gc3VuXzgyMDc3X2ZkX291dGI7CisJZmRjX3N0YXR1cyA9ICZzdW5fZmRjLT5zdGF0dXNfODIwNzc7CisKKwlpZiAoc3VuX2ZkYy0+ZG9yXzgyMDc3ID09IDB4ODApIHsKKwkJc3VuX2ZkYy0+ZG9yXzgyMDc3ID0gMHgwMjsKKwkJaWYgKHN1bl9mZGMtPmRvcl84MjA3NyA9PSAweDgwKSB7CisJCQlzdW5fZmRvcHMuZmRfaW5iID0gc3VuXzgyMDcyX2ZkX2luYjsKKwkJCXN1bl9mZG9wcy5mZF9vdXRiID0gc3VuXzgyMDcyX2ZkX291dGI7CisJCQlmZGNfc3RhdHVzID0gJnN1bl9mZGMtPnN0YXR1c184MjA3MjsKKwkJfQogCX0KIAogCS8qIFN1Y2Nlc3MuLi4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZG1hLW1hcHBpbmcuaAppbmRleCBjNThlYzE2Li4wYTEwMDY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kbWEtbWFwcGluZy5oCkBAIC0xLDMwNyArMSwxMzQgQEAKICNpZm5kZWYgX0FTTV9TUEFSQzY0X0RNQV9NQVBQSU5HX0gKICNkZWZpbmUgX0FTTV9TUEFSQzY0X0RNQV9NQVBQSU5HX0gKIAotCi0jaWZkZWYgQ09ORklHX1BDSQotCi0vKiB3ZSBpbXBsZW1lbnQgdGhlIEFQSSBiZWxvdyBpbiB0ZXJtcyBvZiB0aGUgZXhpc3RpbmcgUENJIG9uZSwKLSAqIHNvIGluY2x1ZGUgaXQgKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLS8qIG5lZWQgc3RydWN0IHBhZ2UgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKLSNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjZGVmaW5lIERNQV9FUlJPUl9DT0RFCSh+KGRtYV9hZGRyX3QpMHgwKQogCi1zdGF0aWMgaW5saW5lIGludAotZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQotewotCUJVR19PTihkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKTsKK3N0cnVjdCBkbWFfb3BzIHsKKwl2b2lkICooKmFsbG9jX2NvaGVyZW50KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpOworCXZvaWQgKCpmcmVlX2NvaGVyZW50KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICAgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisJZG1hX2FkZHJfdCAoKm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqY3B1X2FkZHIsCisJCQkJIHNpemVfdCBzaXplLAorCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXZvaWQgKCp1bm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCSAgICAgc2l6ZV90IHNpemUsCisJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJaW50ICgqbWFwX3NnKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwl2b2lkICgqdW5tYXBfc2cpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSBpbnQgbmh3ZW50cmllcywKKwkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXZvaWQgKCpzeW5jX3NpbmdsZV9mb3JfY3B1KShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJdm9pZCAoKnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwl2b2lkICgqc3luY19zZ19mb3JfY3B1KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5lbGVtcywKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXZvaWQgKCpzeW5jX3NnX2Zvcl9kZXZpY2UpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgICBpbnQgbmVsZW1zLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Cit9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkbWFfb3BzICpkbWFfb3BzOwogCi0JcmV0dXJuIHBjaV9kbWFfc3VwcG9ydGVkKHRvX3BjaV9kZXYoZGV2KSwgbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1kbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCi17Ci0JQlVHX09OKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpOwotCi0JcmV0dXJuIHBjaV9zZXRfZG1hX21hc2sodG9fcGNpX2RldihkZXYpLCBkbWFfbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqCi1kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwKLQkJICAgZ2ZwX3QgZmxhZykKLXsKLQlCVUdfT04oZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSk7Ci0KLQlyZXR1cm4gcGNpX2lvbW11X29wcy0+YWxsb2NfY29uc2lzdGVudCh0b19wY2lfZGV2KGRldiksIHNpemUsIGRtYV9oYW5kbGUsIGZsYWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAotCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQotewotCUJVR19PTihkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKTsKLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQodG9fcGNpX2RldihkZXYpLCBzaXplLCBjcHVfYWRkciwgZG1hX2hhbmRsZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAotZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjcHVfYWRkciwgc2l6ZV90IHNpemUsCi0JICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlCVUdfT04oZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSk7Ci0KLQlyZXR1cm4gcGNpX21hcF9zaW5nbGUodG9fcGNpX2RldihkZXYpLCBjcHVfYWRkciwgc2l6ZSwgKGludClkaXJlY3Rpb24pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKLQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlCVUdfT04oZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSk7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKHRvX3BjaV9kZXYoZGV2KSwgZG1hX2FkZHIsIHNpemUsIChpbnQpZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIGlubGluZSBkbWFfYWRkcl90Ci1kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlCVUdfT04oZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSk7Ci0KLQlyZXR1cm4gcGNpX21hcF9wYWdlKHRvX3BjaV9kZXYoZGV2KSwgcGFnZSwgb2Zmc2V0LCBzaXplLCAoaW50KWRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKLQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCUJVR19PTihkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKTsKLQotCXBjaV91bm1hcF9wYWdlKHRvX3BjaV9kZXYoZGV2KSwgZG1hX2FkZHJlc3MsIHNpemUsIChpbnQpZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCi0JICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCUJVR19PTihkZXYtPmJ1cyAhPSAmcGNpX2J1c190eXBlKTsKLQotCXJldHVybiBwY2lfbWFwX3NnKHRvX3BjaV9kZXYoZGV2KSwgc2csIG5lbnRzLCAoaW50KWRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5od2VudHJpZXMsCi0JICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JQlVHX09OKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpOwotCi0JcGNpX3VubWFwX3NnKHRvX3BjaV9kZXYoZGV2KSwgc2csIG5od2VudHJpZXMsIChpbnQpZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCi0JCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JQlVHX09OKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpOwotCi0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRvX3BjaV9kZXYoZGV2KSwgZG1hX2hhbmRsZSwKLQkJCQkgICAgc2l6ZSwgKGludClkaXJlY3Rpb24pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlCVUdfT04oZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSk7Ci0KLQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodG9fcGNpX2RldihkZXYpLCBkbWFfaGFuZGxlLAotCQkJCSAgICAgICBzaXplLCAoaW50KWRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JQlVHX09OKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpOwotCi0JcGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUodG9fcGNpX2RldihkZXYpLCBzZywgbmVsZW1zLCAoaW50KWRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JQlVHX09OKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpOwotCi0JcGNpX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2UodG9fcGNpX2RldihkZXYpLCBzZywgbmVsZW1zLCAoaW50KWRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1kbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGRtYV9hZGRyKQotewotCXJldHVybiBwY2lfZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHIpOwotfQotCi0jZWxzZQotCi1zdHJ1Y3QgZGV2aWNlOwotc3RydWN0IHBhZ2U7Ci1zdHJ1Y3Qgc2NhdHRlcmxpc3Q7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCi17Ci0JQlVHKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1kbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCi17Ci0JQlVHKCk7Ci0JcmV0dXJuIDA7Ci19CitleHRlcm4gaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CitleHRlcm4gaW50IGRtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBkbWFfbWFzayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKKwkJCQkgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKIHsKLQlCVUcoKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZG1hX29wcy0+YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCSAgICAgICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQorCQkJCSAgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlCVUcoKTsKKwlkbWFfb3BzLT5mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOwogfQogCi1zdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKLWRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqY3B1X2FkZHIsIHNpemVfdCBzaXplLAotCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjcHVfYWRkciwKKwkJCQkJc2l6ZV90IHNpemUsCisJCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlCVUcoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKLQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCQkgICAgc2l6ZV90IHNpemUsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlCVUcoKTsKKwlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIGlubGluZSBkbWFfYWRkcl90Ci1kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCUJVRygpOwotCXJldHVybiAwOworCXJldHVybiBkbWFfb3BzLT5tYXBfc2luZ2xlKGRldiwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LAorCQkJCSAgIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKLQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcmVzcywKKwkJCQkgIHNpemVfdCBzaXplLAorCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCUJVRygpOworCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyZXNzLCBzaXplLCBkaXJlY3Rpb24pOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIGludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JQlVHKCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGRtYV9vcHMtPm1hcF9zZyhkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmh3ZW50cmllcywKLQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCUJVRygpOworCWRtYV9vcHMtPnVubWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlCVUcoKTsKKwlkbWFfb3BzLT5zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCi0JCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJCSAgICAgIHNpemVfdCBzaXplLAorCQkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JQlVHKCk7CisJZG1hX29wcy0+c3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGRtYV9oYW5kbGUsIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCisJCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlCVUcoKTsKKwlkbWFfb3BzLT5zeW5jX3NnX2Zvcl9jcHUoZGV2LCBzZywgbmVsZW1zLCBkaXJlY3Rpb24pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAotCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCisJCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCUJVRygpOworCWRtYV9vcHMtPnN5bmNfc2dfZm9yX2RldmljZShkZXYsIHNnLCBuZWxlbXMsIGRpcmVjdGlvbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1kbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIGlubGluZSBpbnQgZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKLQlCVUcoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gKGRtYV9hZGRyID09IERNQV9FUlJPUl9DT0RFKTsKIH0KIAotI2VuZGlmIC8qIFBDSSAqLwotCi0KLS8qIE5vdyBmb3IgdGhlIEFQSSBleHRlbnNpb25zIG92ZXIgdGhlIHBjaV8gb25lICovCi0KICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQogI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQogI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKQkoMSkKIAotc3RhdGljIGlubGluZSBpbnQKLWRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCi17Ci0JLyogbm8gZWFzeSB3YXkgdG8gZ2V0IGNhY2hlIHNpemUgb24gYWxsIHByb2Nlc3NvcnMsIHNvIHJldHVybgotCSAqIHRoZSBtYXhpbXVtIHBvc3NpYmxlLCB0byBiZSBzYWZlICovCi0JcmV0dXJuICgxIDw8IElOVEVSTk9ERV9DQUNIRV9TSElGVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCi0JCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JLyoganVzdCBzeW5jIGV2ZXJ5dGhpbmcsIHRoYXQncyBhbGwgdGhlIHBjaSBBUEkgY2FuIGRvICovCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBkbWFfaGFuZGxlLCBvZmZzZXQrc2l6ZSwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JLyoganVzdCBzeW5jIGV2ZXJ5dGhpbmcsIHRoYXQncyBhbGwgdGhlIHBjaSBBUEkgY2FuIGRvICovCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlLCBvZmZzZXQrc2l6ZSwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1kbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKLQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCS8qIGNvdWxkIGRlZmluZSB0aGlzIGluIHRlcm1zIG9mIHRoZSBkbWFfY2FjaGUgLi4uIG9wZXJhdGlvbnMsCi0JICogYnV0IGlmIHlvdSBnZXQgdGhpcyBvbiBhIHBsYXRmb3JtLCB5b3Ugc2hvdWxkIGNvbnZlcnQgdGhlIHBsYXRmb3JtCi0JICogdG8gdXNpbmcgdGhlIGdlbmVyaWMgZGV2aWNlIERNQSBBUEkgKi8KLQlCVUcoKTsKLX0KLQogI2VuZGlmIC8qIF9BU01fU1BBUkM2NF9ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiaW8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmJpby5oCmluZGV4IDUwMDAyNmQuLmI5MjE1YTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmJpby5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmJpby5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0xJTlVYX0ZCSU9fSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBDb25zdGFudHMgdXNlZCBmb3IgZmJpbyBTdW5PUyBjb21wYXRpYmlsaXR5ICovCiAvKiAoQykgMTk5NiBNaWd1ZWwgZGUgSWNhemEgKi8KQEAgLTI5OSw0ICszMDAsMzEgQEAKICNkZWZpbmUgTEVPX0xEX0dCTF9NQVAgICAgICAgICAweDAxMDA5MDAwCiAjZGVmaW5lIExFT19VTksyX01BUCAgICAgICAgICAgMHgwMTAwYTAwMAogCisjaWZkZWYgX19LRVJORUxfXworc3RydWN0ICBmYmNtYXAzMiB7CisJaW50ICAgICAgICAgICAgIGluZGV4OyAgICAgICAgICAvKiBmaXJzdCBlbGVtZW50ICgwIG9yaWdpbikgKi8KKwlpbnQgICAgICAgICAgICAgY291bnQ7CisJdTMyCQlyZWQ7CisJdTMyCQlncmVlbjsKKwl1MzIJCWJsdWU7Cit9OworCisjZGVmaW5lIEZCSU9QVVRDTUFQMzIJX0lPVygnRicsIDMsIHN0cnVjdCBmYmNtYXAzMikKKyNkZWZpbmUgRkJJT0dFVENNQVAzMglfSU9XKCdGJywgNCwgc3RydWN0IGZiY21hcDMyKQorCitzdHJ1Y3QgZmJjdXJzb3IzMiB7CisJc2hvcnQgc2V0OwkJLyogd2hhdCB0byBzZXQsIGNob29zZSBmcm9tIHRoZSBsaXN0IGFib3ZlICovCisJc2hvcnQgZW5hYmxlOwkJLyogY3Vyc29yIG9uL29mZiAqLworCXN0cnVjdCBmYmN1cnBvcyBwb3M7CS8qIGN1cnNvciBwb3NpdGlvbiAqLworCXN0cnVjdCBmYmN1cnBvcyBob3Q7CS8qIGN1cnNvciBob3Qgc3BvdCAqLworCXN0cnVjdCBmYmNtYXAzMiBjbWFwOwkvKiBjb2xvciBtYXAgaW5mbyAqLworCXN0cnVjdCBmYmN1cnBvcyBzaXplOwkvKiBjdXJzb3IgYml0IG1hcCBzaXplICovCisJdTMyCWltYWdlOwkJLyogY3Vyc29yIGltYWdlIGJpdHMgKi8KKwl1MzIJbWFzazsJCS8qIGN1cnNvciBtYXNrIGJpdHMgKi8KK307CisKKyNkZWZpbmUgRkJJT1NDVVJTT1IzMglfSU9XKCdGJywgMjQsIHN0cnVjdCBmYmN1cnNvcjMyKQorI2RlZmluZSBGQklPR0NVUlNPUjMyCV9JT1coJ0YnLCAyNSwgc3RydWN0IGZiY3Vyc29yMzIpCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fTElOVVhfRkJJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaAppbmRleCA0YWEwOTI1Li4xNzgzMjM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmxvcHB5LmgKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IGZsb3BweS5oLHYgMS4zMiAyMDAxLzEwLzI2IDE3OjU5OjM2IGRhdmVtIEV4cCAkCi0gKiBhc20tc3BhcmM2NC9mbG9wcHkuaDogU3BhcmMgc3BlY2lmaWMgcGFydHMgb2YgdGhlIEZsb3BweSBkcml2ZXIuCisvKiBmbG9wcHkuaDogU3BhcmMgc3BlY2lmaWMgcGFydHMgb2YgdGhlIEZsb3BweSBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTcgSmFrdWIgSmVsaW5layAoampAc3Vuc2l0ZS5tZmYuY3VuaS5jeikKICAqCiAgKiBVbHRyYS9QQ0kgc3VwcG9ydCBhZGRlZDogU2VwIDE5OTcgIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQpAQCAtMTEsNiArMTAsNyBAQAogI2RlZmluZSBfX0FTTV9TUEFSQzY0X0ZMT1BQWV9ICiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2lvbW11LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lvbW11LmgKaW5kZXggMGIxODEzZi4uOWVhYzY2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaW9tbXUuaApAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogaW9tbXUuaCx2IDEuMTAgMjAwMS8wMy8wOCAwOTo1NTo1NiBkYXZlbSBFeHAgJAotICogaW9tbXUuaDogRGVmaW5pdGlvbnMgZm9yIHRoZSBzdW41IElPTU1VLgorLyogaW9tbXUuaDogRGVmaW5pdGlvbnMgZm9yIHRoZSBzdW41IElPTU1VLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAjaWZuZGVmIF9TUEFSQzY0X0lPTU1VX0gKICNkZWZpbmUgX1NQQVJDNjRfSU9NTVVfSApAQCAtMzMsNiArMzIsNyBAQAogCXVuc2lnbmVkIGxvbmcJCWlvbW11X3RzYmJhc2U7CiAJdW5zaWduZWQgbG9uZwkJaW9tbXVfZmx1c2g7CiAJdW5zaWduZWQgbG9uZwkJaW9tbXVfZmx1c2hpbnY7CisJdW5zaWduZWQgbG9uZwkJaW9tbXVfdGFnczsKIAl1bnNpZ25lZCBsb25nCQlpb21tdV9jdHhmbHVzaDsKIAl1bnNpZ25lZCBsb25nCQl3cml0ZV9jb21wbGV0ZV9yZWc7CiAJdW5zaWduZWQgbG9uZwkJZHVtbXlfcGFnZTsKQEAgLTU0LDQgKzU0LDcgQEAKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nCV9fZmx1c2hmbGFnX2J1ZlsoNjQrKDY0LTEpKSAvIHNpemVvZihsb25nKV07CiB9OwogCi0jZW5kaWYgLyogIShfU1BBUkNfSU9NTVVfSCkgKi8KK2V4dGVybiBpbnQgaW9tbXVfdGFibGVfaW5pdChzdHJ1Y3QgaW9tbXUgKmlvbW11LCBpbnQgdHNic2l6ZSwKKwkJCSAgICB1MzIgZG1hX29mZnNldCwgdTMyIGRtYV9hZGRyX21hc2spOworCisjZW5kaWYgLyogIShfU1BBUkM2NF9JT01NVV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJwb3J0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaAppbmRleCA2MDBhZmU1Li44MTE2ZThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaApAQCAtMTE3LDcgKzExNyw3IEBACiAJaWYgKCFzdHJjbXAocGFyZW50LT5uYW1lLCAiZG1hIikpIHsKIAkJcCA9IHBhcnBvcnRfcGNfcHJvYmVfcG9ydChiYXNlLCBiYXNlICsgMHg0MDAsCiAJCQkJCSAgb3AtPmlycXNbMF0sIFBBUlBPUlRfRE1BX05PRklGTywKLQkJCQkJICBvcC0+ZGV2LnBhcmVudCk7CisJCQkJCSAgb3AtPmRldi5wYXJlbnQtPnBhcmVudCk7CiAJCWlmICghcCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIHApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKaW5kZXggZTExYWMxMC4uMTM5M2U1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCkBAIC0zLDggKzMsNyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKIC8qIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBsb2dpYyBpbiBwY2lfc2Nhbl9idXMgZm9yIHNraXBwaW5nCiAgKiBhbHJlYWR5LWNvbmZpZ3VyZWQgYnVzIG51bWJlcnMgLSB0byBiZSB1c2VkIGZvciBidWdneSBCSU9TZXMKQEAgLTMwLDgwICsyOSw0MiBAQAogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CiAKLS8qIER5bmFtaWMgRE1BIG1hcHBpbmcgc3R1ZmYuCi0gKi8KLQogLyogVGhlIFBDSSBhZGRyZXNzIHNwYWNlIGRvZXMgbm90IGVxdWFsIHRoZSBwaHlzaWNhbCBtZW1vcnkKICAqIGFkZHJlc3Mgc3BhY2UuICBUaGUgbmV0d29ya2luZyBhbmQgYmxvY2sgZGV2aWNlIGxheWVycyB1c2UKICAqIHRoaXMgYm9vbGVhbiBmb3IgYm91bmNlIGJ1ZmZlciBkZWNpc2lvbnMuCiAgKi8KICNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUwkoMCkKIAotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgotCi1zdHJ1Y3QgcGNpX2RldjsKLQotc3RydWN0IHBjaV9pb21tdV9vcHMgewotCXZvaWQgKigqYWxsb2NfY29uc2lzdGVudCkoc3RydWN0IHBjaV9kZXYgKiwgc2l6ZV90LCBkbWFfYWRkcl90ICosIGdmcF90KTsKLQl2b2lkICgqZnJlZV9jb25zaXN0ZW50KShzdHJ1Y3QgcGNpX2RldiAqLCBzaXplX3QsIHZvaWQgKiwgZG1hX2FkZHJfdCk7Ci0JZG1hX2FkZHJfdCAoKm1hcF9zaW5nbGUpKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOwotCXZvaWQgKCp1bm1hcF9zaW5nbGUpKHN0cnVjdCBwY2lfZGV2ICosIGRtYV9hZGRyX3QsIHNpemVfdCwgaW50KTsKLQlpbnQgKCptYXBfc2cpKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7Ci0Jdm9pZCAoKnVubWFwX3NnKShzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LCBpbnQpOwotCXZvaWQgKCpkbWFfc3luY19zaW5nbGVfZm9yX2NwdSkoc3RydWN0IHBjaV9kZXYgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LCBpbnQpOwotCXZvaWQgKCpkbWFfc3luY19zZ19mb3JfY3B1KShzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LCBpbnQpOwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lfaW9tbXVfb3BzICpwY2lfaW9tbXVfb3BzOwotCi0vKiBBbGxvY2F0ZSBhbmQgbWFwIGtlcm5lbCBidWZmZXIgdXNpbmcgY29uc2lzdGVudCBtb2RlIERNQSBmb3IgYSBkZXZpY2UuCi0gKiBod2RldiBzaG91bGQgYmUgdmFsaWQgc3RydWN0IHBjaV9kZXYgcG9pbnRlciBmb3IgUENJIGRldmljZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGNpX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqcGNpX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplLAorCQkJCQkgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSkKIHsKLQlyZXR1cm4gcGNpX2lvbW11X29wcy0+YWxsb2NfY29uc2lzdGVudChod2Rldiwgc2l6ZSwgZG1hX2hhbmRsZSwgR0ZQX0FUT01JQyk7CisJcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBHRlBfQVRPTUlDKTsKIH0KIAotLyogRnJlZSBhbmQgdW5tYXAgYSBjb25zaXN0ZW50IERNQSBidWZmZXIuCi0gKiBjcHVfYWRkciBpcyB3aGF0IHdhcyByZXR1cm5lZCBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50LAotICogc2l6ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoYXQgYXMgcGFzc2VkIGludG8gcGNpX2FsbG9jX2NvbnNpc3RlbnQsCi0gKiBhbmQgbGlrZXdpc2UgZG1hX2FkZHIgbXVzdCBiZSB0aGUgc2FtZSBhcyB3aGF0ICpkbWFfYWRkcnAgd2FzIHNldCB0by4KLSAqCi0gKiBSZWZlcmVuY2VzIHRvIHRoZSBtZW1vcnkgYW5kIG1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCBjcHVfYWRkci9kbWFfYWRkcgotICogcGFzdCB0aGlzIGNhbGwgYXJlIGlsbGVnYWwuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICpod2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCiB7Ci0JcmV0dXJuIHBjaV9pb21tdV9vcHMtPmZyZWVfY29uc2lzdGVudChod2Rldiwgc2l6ZSwgdmFkZHIsIGRtYV9oYW5kbGUpOworCXJldHVybiBkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7CiB9CiAKLS8qIE1hcCBhIHNpbmdsZSBidWZmZXIgb2YgdGhlIGluZGljYXRlZCBzaXplIGZvciBETUEgaW4gc3RyZWFtaW5nIG1vZGUuCi0gKiBUaGUgMzItYml0IGJ1cyBhZGRyZXNzIHRvIHVzZSBpcyByZXR1cm5lZC4KLSAqCi0gKiBPbmNlIHRoZSBkZXZpY2UgaXMgZ2l2ZW4gdGhlIGRtYSBhZGRyZXNzLCB0aGUgZGV2aWNlIG93bnMgdGhpcyBtZW1vcnkKLSAqIHVudGlsIGVpdGhlciBwY2lfdW5tYXBfc2luZ2xlIG9yIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSBpcyBwZXJmb3JtZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBwY2lfbWFwX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGNpX21hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKnB0ciwKKwkJCQkJc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCiB7Ci0JcmV0dXJuIHBjaV9pb21tdV9vcHMtPm1hcF9zaW5nbGUoaHdkZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlyZXR1cm4gZG1hX21hcF9zaW5nbGUoJnBkZXYtPmRldiwgcHRyLCBzaXplLAorCQkJICAgICAgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOwogfQogCi0vKiBVbm1hcCBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24uICBUaGUgZG1hX2FkZHIgYW5kIHNpemUKLSAqIG11c3QgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgZm9yIGluIGEgcHJldmlvdXMgcGNpX21hcF9zaW5nbGUgY2FsbC4gIEFsbAotICogb3RoZXIgdXNhZ2VzIGFyZSB1bmRlZmluZWQuCi0gKgotICogQWZ0ZXIgdGhpcyBjYWxsLCByZWFkcyBieSB0aGUgY3B1IHRvIHRoZSBidWZmZXIgYXJlIGd1YXJhbnRlZWQgdG8gc2VlCi0gKiB3aGF0ZXZlciB0aGUgZGV2aWNlIHdyb3RlIHRoZXJlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX3VubWFwX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSB2b2lkIHBjaV91bm1hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkJICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQogewotCXBjaV9pb21tdV9vcHMtPnVubWFwX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJZG1hX3VubWFwX3NpbmdsZSgmcGRldi0+ZGV2LCBkbWFfYWRkciwgc2l6ZSwKKwkJCSAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7CiB9CiAKLS8qIE5vIGhpZ2htZW0gb24gc3BhcmM2NCwgcGx1cyB3ZSBoYXZlIGFuIElPTU1VLCBzbyBtYXBwaW5nIHBhZ2VzIGlzIGVhc3kuICovCiAjZGVmaW5lIHBjaV9tYXBfcGFnZShkZXYsIHBhZ2UsIG9mZiwgc2l6ZSwgZGlyKSBcCiAJcGNpX21hcF9zaW5nbGUoZGV2LCAocGFnZV9hZGRyZXNzKHBhZ2UpICsgKG9mZikpLCBzaXplLCBkaXIpCi0jZGVmaW5lIHBjaV91bm1hcF9wYWdlKGRldixhZGRyLHN6LGRpcikgcGNpX3VubWFwX3NpbmdsZShkZXYsYWRkcixzeixkaXIpCisjZGVmaW5lIHBjaV91bm1hcF9wYWdlKGRldixhZGRyLHN6LGRpcikgXAorCXBjaV91bm1hcF9zaW5nbGUoZGV2LGFkZHIsc3osZGlyKQogCiAvKiBwY2lfdW5tYXBfe3NpbmdsZSxwYWdlfSBpcyBub3QgYSBub3AsIHRodXMuLi4gKi8KICNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihBRERSX05BTUUpCVwKQEAgLTExOSw3NSArODAsNDggQEAKICNkZWZpbmUgcGNpX3VubWFwX2xlbl9zZXQoUFRSLCBMRU5fTkFNRSwgVkFMKQkJXAogCSgoKFBUUiktPkxFTl9OQU1FKSA9IChWQUwpKQogCi0vKiBNYXAgYSBzZXQgb2YgYnVmZmVycyBkZXNjcmliZWQgYnkgc2NhdHRlcmxpc3QgaW4gc3RyZWFtaW5nCi0gKiBtb2RlIGZvciBETUEuICBUaGlzIGlzIHRoZSBzY2F0dGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZQotICogYWJvdmUgcGNpX21hcF9zaW5nbGUgaW50ZXJmYWNlLiAgSGVyZSB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdAotICogZWxlbWVudHMgYXJlIGVhY2ggdGFnZ2VkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGRtYSBhZGRyZXNzCi0gKiBhbmQgbGVuZ3RoLiAgVGhleSBhcmUgb2J0YWluZWQgdmlhIHNnX2RtYV97YWRkcmVzcyxsZW5ndGh9KFNHKS4KLSAqCi0gKiBOT1RFOiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgYWJsZSB0byB1c2UgYSBzbWFsbGVyIG51bWJlciBvZgotICogICAgICAgRE1BIGFkZHJlc3MvbGVuZ3RoIHBhaXJzIHRoYW4gdGhlcmUgYXJlIFNHIHRhYmxlIGVsZW1lbnRzLgotICogICAgICAgKGZvciBleGFtcGxlIHZpYSB2aXJ0dWFsIG1hcHBpbmcgY2FwYWJpbGl0aWVzKQotICogICAgICAgVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkZHIvbGVuZ3RoIHBhaXJzIGFjdHVhbGx5Ci0gKiAgICAgICB1c2VkLCBhdCBtb3N0IG5lbnRzLgotICoKLSAqIERldmljZSBvd25lcnNoaXAgaXNzdWVzIGFzIG1lbnRpb25lZCBhYm92ZSBmb3IgcGNpX21hcF9zaW5nbGUgYXJlCi0gKiB0aGUgc2FtZSBoZXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludCBwY2lfbWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSBpbnQgcGNpX21hcF9zZyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQogewotCXJldHVybiBwY2lfaW9tbXVfb3BzLT5tYXBfc2coaHdkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKKwlyZXR1cm4gZG1hX21hcF9zZygmcGRldi0+ZGV2LCBzZywgbmVudHMsCisJCQkgIChlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbikgZGlyZWN0aW9uKTsKIH0KIAotLyogVW5tYXAgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucy4KLSAqIEFnYWluLCBjcHUgcmVhZCBydWxlcyBjb25jZXJuaW5nIGNhbGxzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIGZvcgotICogcGNpX3VubWFwX3NpbmdsZSgpIGFib3ZlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX3VubWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5od2VudHMsIGludCBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3VubWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCWludCBuZW50cywgaW50IGRpcmVjdGlvbikKIHsKLQlwY2lfaW9tbXVfb3BzLT51bm1hcF9zZyhod2Rldiwgc2csIG5od2VudHMsIGRpcmVjdGlvbik7CisJZG1hX3VubWFwX3NnKCZwZGV2LT5kZXYsIHNnLCBuZW50cywKKwkJICAgICAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7CiB9CiAKLS8qIE1ha2UgcGh5c2ljYWwgbWVtb3J5IGNvbnNpc3RlbnQgZm9yIGEgc2luZ2xlCi0gKiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24gYWZ0ZXIgYSB0cmFuc2Zlci4KLSAqCi0gKiBJZiB5b3UgcGVyZm9ybSBhIHBjaV9tYXBfc2luZ2xlKCkgYnV0IHdpc2ggdG8gaW50ZXJyb2dhdGUgdGhlCi0gKiBidWZmZXIgdXNpbmcgdGhlIGNwdSwgeWV0IGRvIG5vdCB3aXNoIHRvIHRlYXJkb3duIHRoZSBQQ0kgZG1hCi0gKiBtYXBwaW5nLCB5b3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGRvaW5nIHNvLiAgQXQgdGhlCi0gKiBuZXh0IHBvaW50IHlvdSBnaXZlIHRoZSBQQ0kgZG1hIGFkZHJlc3MgYmFjayB0byB0aGUgY2FyZCwgeW91Ci0gKiBtdXN0IGZpcnN0IHBlcmZvcm0gYSBwY2lfZG1hX3N5bmNfZm9yX2RldmljZSwgYW5kIHRoZW4gdGhlCi0gKiBkZXZpY2UgYWdhaW4gb3ducyB0aGUgYnVmZmVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBwY2lfZGV2ICpod2RldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKLQlwY2lfaW9tbXVfb3BzLT5kbWFfc3luY19zaW5nbGVfZm9yX2NwdShod2RldiwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgmcGRldi0+ZGV2LCBkbWFfaGFuZGxlLCBzaXplLAorCQkJCShlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbikgZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1wY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCQkgICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkJICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJCQkgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQogewogCS8qIE5vIGZsdXNoaW5nIG5lZWRlZCB0byBzeW5jIGNwdSB3cml0ZXMgdG8gdGhlIGRldmljZS4gICovCi0JQlVHX09OKGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpOwogfQogCi0vKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNldCBvZiBzdHJlYW1pbmcKLSAqIG1vZGUgRE1BIHRyYW5zbGF0aW9ucyBhZnRlciBhIHRyYW5zZmVyLgotICoKLSAqIFRoZSBzYW1lIGFzIHBjaV9kbWFfc3luY19zaW5nbGVfKiBidXQgZm9yIGEgc2NhdHRlci1nYXRoZXIgbGlzdCwKLSAqIHNhbWUgcnVsZXMgYW5kIHVzYWdlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCQkgICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pCiB7Ci0JcGNpX2lvbW11X29wcy0+ZG1hX3N5bmNfc2dfZm9yX2NwdShod2Rldiwgc2csIG5lbGVtcywgZGlyZWN0aW9uKTsKKwlkbWFfc3luY19zZ19mb3JfY3B1KCZwZGV2LT5kZXYsIHNnLCBuZW50cywKKwkJCSAgICAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcGNpX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkJICAgICAgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKIHsKIAkvKiBObyBmbHVzaGluZyBuZWVkZWQgdG8gc3luYyBjcHUgd3JpdGVzIHRvIHRoZSBkZXZpY2UuICAqLwotCUJVR19PTihkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKTsKIH0KIAogLyogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIFBDSSBkZXZpY2UgRE1BIGFkZHJlc3MgbWFzayBjYW4KQEAgLTIwNiwxMSArMTQwLDkgQEAKICNkZWZpbmUgUENJNjRfUkVRVUlSRURfTUFTSwkofihkbWE2NF9hZGRyX3QpMCkKICNkZWZpbmUgUENJNjRfQUREUl9CQVNFCQkweGZmZmMwMDAwMDAwMDAwMDBVTAogCi0jZGVmaW5lIFBDSV9ETUFfRVJST1JfQ09ERQkofihkbWFfYWRkcl90KTB4MCkKLQogc3RhdGljIGlubGluZSBpbnQgcGNpX2RtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7Ci0JcmV0dXJuIChkbWFfYWRkciA9PSBQQ0lfRE1BX0VSUk9SX0NPREUpOworCXJldHVybiBkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcik7CiB9CiAKICNpZmRlZiBDT05GSUdfUENJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NidXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2J1cy5oCmluZGV4IDdlZmQ0OWQuLjAxNTFjYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2J1cy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2J1cy5oCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBzYnVzLmgsdiAxLjE0IDIwMDAvMDIvMTggMTM6NTA6NTUgZGF2ZW0gRXhwICQKLSAqIHNidXMuaDogRGVmaW5lcyBmb3IgdGhlIFN1biBTQnVzLgorLyogc2J1cy5oOiBEZWZpbmVzIGZvciB0aGUgU3VuIFNCdXMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2lmbmRlZiBfU1BBUkM2NF9TQlVTX0gKQEAgLTY5LDcgKzY4LDYgQEAKIC8qIFRoaXMgc3RydWN0IGRlc2NyaWJlcyB0aGUgU0J1cyhzKSBmb3VuZCBvbiB0aGlzIG1hY2hpbmUuICovCiBzdHJ1Y3Qgc2J1c19idXMgewogCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7Ci0Jdm9pZAkJCSppb21tdTsJCS8qIE9wYXF1ZSBJT01NVSBjb29raWUJKi8KIAlzdHJ1Y3Qgc2J1c19kZXYJCSpkZXZpY2VzOwkvKiBUcmVlIG9mIFNCVVMgZGV2aWNlcwkqLwogCXN0cnVjdCBzYnVzX2J1cwkJKm5leHQ7CQkvKiBOZXh0IFNCVVMgaW4gc3lzdGVtCSovCiAJaW50CQkJcHJvbV9ub2RlOyAgICAgIC8qIE9CUCBub2RlIG9mIFNCVVMJKi8KQEAgLTEwMiw5ICsxMDAsMTggQEAKIGV4dGVybiB2b2lkIHNidXNfc2V0X3NidXM2NChzdHJ1Y3Qgc2J1c19kZXYgKiwgaW50KTsKIGV4dGVybiB2b2lkIHNidXNfZmlsbF9kZXZpY2VfaXJxKHN0cnVjdCBzYnVzX2RldiAqKTsKIAotLyogVGhlc2UgeWllbGQgSU9NTVUgbWFwcGluZ3MgaW4gY29uc2lzdGVudCBtb2RlLiAqLwotZXh0ZXJuIHZvaWQgKnNidXNfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3Qgc2J1c19kZXYgKiwgc2l6ZV90LCBkbWFfYWRkcl90ICpkbWFfYWRkcnApOwotZXh0ZXJuIHZvaWQgc2J1c19mcmVlX2NvbnNpc3RlbnQoc3RydWN0IHNidXNfZGV2ICosIHNpemVfdCwgdm9pZCAqLCBkbWFfYWRkcl90KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc2J1c19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBzYnVzX2RldiAqc2RldiAsIHNpemVfdCBzaXplLAorCQkJCQkgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpCit7CisJcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudCgmc2Rldi0+b2ZkZXYuZGV2LCBzaXplLAorCQkJCSAgZG1hX2hhbmRsZSwgR0ZQX0FUT01JQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHNpemVfdCBzaXplLAorCQkJCQl2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCXJldHVybiBkbWFfZnJlZV9jb2hlcmVudCgmc2Rldi0+b2ZkZXYuZGV2LCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7Cit9CiAKICNkZWZpbmUgU0JVU19ETUFfQklESVJFQ1RJT05BTAlETUFfQklESVJFQ1RJT05BTAogI2RlZmluZSBTQlVTX0RNQV9UT0RFVklDRQlETUFfVE9fREVWSUNFCkBAIC0xMTIsMTggKzExOSw2NyBAQAogI2RlZmluZQlTQlVTX0RNQV9OT05FCQlETUFfTk9ORQogCiAvKiBBbGwgdGhlIHJlc3QgdXNlIHN0cmVhbWluZyBtb2RlIG1hcHBpbmdzLiAqLwotZXh0ZXJuIGRtYV9hZGRyX3Qgc2J1c19tYXBfc2luZ2xlKHN0cnVjdCBzYnVzX2RldiAqLCB2b2lkICosIHNpemVfdCwgaW50KTsKLWV4dGVybiB2b2lkIHNidXNfdW5tYXBfc2luZ2xlKHN0cnVjdCBzYnVzX2RldiAqLCBkbWFfYWRkcl90LCBzaXplX3QsIGludCk7Ci1leHRlcm4gaW50IHNidXNfbWFwX3NnKHN0cnVjdCBzYnVzX2RldiAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LCBpbnQpOwotZXh0ZXJuIHZvaWQgc2J1c191bm1hcF9zZyhzdHJ1Y3Qgc2J1c19kZXYgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwgaW50KTsKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBzYnVzX21hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCB2b2lkICpwdHIsCisJCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwlyZXR1cm4gZG1hX21hcF9zaW5nbGUoJnNkZXYtPm9mZGV2LmRldiwgcHRyLCBzaXplLAorCQkJICAgICAgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2J1c191bm1hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LAorCQkJCSAgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCQkJICAgICBpbnQgZGlyZWN0aW9uKQoreworCWRtYV91bm1hcF9zaW5nbGUoJnNkZXYtPm9mZGV2LmRldiwgZG1hX2FkZHIsIHNpemUsCisJCQkgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYnVzX21hcF9zZyhzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pCit7CisJcmV0dXJuIGRtYV9tYXBfc2coJnNkZXYtPm9mZGV2LmRldiwgc2csIG5lbnRzLAorCQkJICAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX3VubWFwX3NnKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQoreworCWRtYV91bm1hcF9zZygmc2Rldi0+b2ZkZXYuZGV2LCBzZywgbmVudHMsCisJCSAgICAgKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOworfQogCiAvKiBGaW5hbGx5LCBhbGxvdyBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24gb2Ygc3RyZWFtYWJsZSBtYXBwaW5ncy4gKi8KLWV4dGVybiB2b2lkIHNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICosIGRtYV9hZGRyX3QsIHNpemVfdCwgaW50KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBzYnVzX2RldiAqc2RldiwKKwkJCQkJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZzZGV2LT5vZmRldi5kZXYsIGRtYV9oYW5kbGUsIHNpemUsCisJCQkJKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKSBkaXJlY3Rpb24pOworfQogI2RlZmluZSBzYnVzX2RtYV9zeW5jX3NpbmdsZSBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1Ci1leHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqLCBkbWFfYWRkcl90LCBzaXplX3QsIGludCk7Ci1leHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBzYnVzX2RldiAqc2RldiwKKwkJCQkJCSAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkJCSAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCS8qIE5vIGZsdXNoaW5nIG5lZWRlZCB0byBzeW5jIGNwdSB3cml0ZXMgdG8gdGhlIGRldmljZS4gICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IHNidXNfZGV2ICpzZGV2LAorCQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkJICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbikKK3sKKwlkbWFfc3luY19zZ19mb3JfY3B1KCZzZGV2LT5vZmRldi5kZXYsIHNnLCBuZW50cywKKwkJCSAgICAoZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pIGRpcmVjdGlvbik7Cit9CiAjZGVmaW5lIHNidXNfZG1hX3N5bmNfc2cgc2J1c19kbWFfc3luY19zZ19mb3JfY3B1Ci1leHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHNidXNfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHNidXNfZGV2ICpzZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkJICAgICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbikKK3sKKwkvKiBObyBmbHVzaGluZyBuZWVkZWQgdG8gc3luYyBjcHUgd3JpdGVzIHRvIHRoZSBkZXZpY2UuICAqLworfQogCiBleHRlcm4gdm9pZCBzYnVzX2FyY2hfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3Qgc2J1c19idXMgKik7CiBleHRlcm4gdm9pZCBzYnVzX3NldHVwX2lvbW11KHN0cnVjdCBzYnVzX2J1cyAqLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAppbmRleCAxZGE4ZjQ5Li45ODE3MzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKQEAgLTEwOCw2ICsxMDgsMTUgQEAKIH0KIGV4dGVybiBpbnQgYWNwaV9pcnFfYmFsYW5jZV9zZXQoY2hhciAqc3RyKTsKIAorLyogcm91dGluZXMgZm9yIHNhdmluZy9yZXN0b3Jpbmcga2VybmVsIHN0YXRlICovCitleHRlcm4gaW50IGFjcGlfc2F2ZV9zdGF0ZV9tZW0odm9pZCk7CitleHRlcm4gdm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBhY3BpX3dha2V1cF9hZGRyZXNzOworCisvKiBlYXJseSBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCitleHRlcm4gdm9pZCBhY3BpX3Jlc2VydmVfYm9vdG1lbSh2b2lkKTsKKwogI2Vsc2UJLyogIUNPTkZJR19BQ1BJICovCiAKICNkZWZpbmUgYWNwaV9sYXBpYyAwCkBAIC0xMjEsMTkgKzEzMCw2IEBACiBleHRlcm4gaW50IGFjcGlfc2Nhbl9ub2Rlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAjZGVmaW5lIE5SX05PREVfTUVNQkxLUyAoTUFYX05VTU5PREVTKjIpCiAKLSNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAotCi0vKiByb3V0aW5lcyBmb3Igc2F2aW5nL3Jlc3RvcmluZyBrZXJuZWwgc3RhdGUgKi8KLWV4dGVybiBpbnQgYWNwaV9zYXZlX3N0YXRlX21lbSh2b2lkKTsKLWV4dGVybiB2b2lkIGFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0odm9pZCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGFjcGlfd2FrZXVwX2FkZHJlc3M7Ci0KLS8qIGVhcmx5IGluaXRpYWxpemF0aW9uIHJvdXRpbmUgKi8KLWV4dGVybiB2b2lkIGFjcGlfcmVzZXJ2ZV9ib290bWVtKHZvaWQpOwotCi0jZW5kaWYgLypDT05GSUdfQUNQSV9TTEVFUCovCi0KIGV4dGVybiBpbnQgYWNwaV9kaXNhYmxlZDsKIGV4dGVybiBpbnQgYWNwaV9wY2lfZGlzYWJsZWQ7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pc3QuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzg4NTdlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lzdC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20taTM4Ni9pc3QuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zdXNwZW5kLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3VzcGVuZC5oCmluZGV4IDljM2Y4ZGUuLmI4OTdlOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zdXNwZW5kLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3N1c3BlbmQuaApAQCAtNDQsNyArNDQsNiBAQAogCiBleHRlcm4gdm9pZCBmaXhfcHJvY2Vzc29yX2NvbnRleHQodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcmlwOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcnNwOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcmJwOwpAQCAtNTQsNCArNTMsMyBAQAogCiAvKiByb3V0aW5lcyBmb3Igc2F2aW5nL3Jlc3RvcmluZyBrZXJuZWwgc3RhdGUgKi8KIGV4dGVybiBpbnQgYWNwaV9zYXZlX3N0YXRlX21lbSh2b2lkKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKaW5kZXggOWRmMzBiOS4uZjRjZTg3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCkBAIC0xMDAsNyArMTAwLDcgQEAKIAljYXNlIDg6ICBfX2dldF91c2VyX3goOCxfX3JldF9ndSxfX3ZhbF9ndSxwdHIpOyBicmVhazsJCVwKIAlkZWZhdWx0OiBfX2dldF91c2VyX2JhZCgpOyBicmVhazsJCQkJXAogCX0JCQkJCQkJCVwKLQkoeCkgPSAodHlwZW9mKCoocHRyKSkpX192YWxfZ3U7CQkJCVwKKwkoeCkgPSAoX19mb3JjZSB0eXBlb2YoKihwdHIpKSlfX3ZhbF9ndTsJCQkJXAogCV9fcmV0X2d1OwkJCQkJCQlcCiB9KQogCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlpbnQgX19ndV9lcnI7CQkJCQkJXAogCXVuc2lnbmVkIGxvbmcgX19ndV92YWw7CQkJCQlcCiAJX19nZXRfdXNlcl9zaXplKF9fZ3VfdmFsLChwdHIpLChzaXplKSxfX2d1X2Vycik7CVwKLQkoeCkgPSAodHlwZW9mKCoocHRyKSkpX19ndV92YWw7CQkJXAorCSh4KSA9IChfX2ZvcmNlIHR5cGVvZigqKHB0cikpKV9fZ3VfdmFsOwkJCVwKIAlfX2d1X2VycjsJCQkJCQlcCiB9KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW8uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCmluZGV4IDMxZmZjM2YuLjBmYWE2MTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IGQ1NjgwY2QuLmJmNWUwMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0zMyw2ICszMyw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KIAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXBtX2Jpb3MuaCBiL2luY2x1ZGUvbGludXgvYXBtX2Jpb3MuaAppbmRleCAyOTBhZWYzLi41ZjkyMWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FwbV9iaW9zLmgKKysrIGIvaW5jbHVkZS9saW51eC9hcG1fYmlvcy5oCkBAIC0yMSwyMCArMjEsMjIgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNkZWZpbmUgQVBNX0NTCQkoR0RUX0VOVFJZX0FQTUJJT1NfQkFTRSAqIDgpCiAjZGVmaW5lIEFQTV9DU18xNgkoQVBNX0NTICsgOCkKICNkZWZpbmUgQVBNX0RTCQkoQVBNX0NTXzE2ICsgOCkKIAogc3RydWN0IGFwbV9iaW9zX2luZm8gewotCXVuc2lnbmVkIHNob3J0CXZlcnNpb247Ci0JdW5zaWduZWQgc2hvcnQJY3NlZzsKLQl1bnNpZ25lZCBsb25nCW9mZnNldDsKLQl1bnNpZ25lZCBzaG9ydAljc2VnXzE2OwotCXVuc2lnbmVkIHNob3J0CWRzZWc7Ci0JdW5zaWduZWQgc2hvcnQJZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQJY3NlZ19sZW47Ci0JdW5zaWduZWQgc2hvcnQJY3NlZ18xNl9sZW47Ci0JdW5zaWduZWQgc2hvcnQJZHNlZ19sZW47CisJdTE2CXZlcnNpb247CisJdTE2CWNzZWc7CisJdTMyCW9mZnNldDsKKwl1MTYJY3NlZ18xNjsKKwl1MTYJZHNlZzsKKwl1MTYJZmxhZ3M7CisJdTE2CWNzZWdfbGVuOworCXUxNgljc2VnXzE2X2xlbjsKKwl1MTYJZHNlZ19sZW47CiB9OwogCiAvKiBSZXN1bHRzIG9mIEFQTSBJbnN0YWxsYXRpb24gQ2hlY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDY5NWUzNDkuLmIxMjZjNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMzcsNyArMzcsNyBAQAogc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZDsKIAogc3RydWN0IHJlcXVlc3RfcXVldWU7Ci10eXBlZGVmIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHJlcXVlc3RfcXVldWVfdDsKK3R5cGVkZWYgc3RydWN0IHJlcXVlc3RfcXVldWUgcmVxdWVzdF9xdWV1ZV90IF9fZGVwcmVjYXRlZDsKIHN0cnVjdCBlbGV2YXRvcl9xdWV1ZTsKIHR5cGVkZWYgc3RydWN0IGVsZXZhdG9yX3F1ZXVlIGVsZXZhdG9yX3Q7CiBzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgZG9uZWxpc3Q7CiAKLQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl1bnNpZ25lZCBpbnQgY21kX2ZsYWdzOwogCWVudW0gcnFfY21kX3R5cGVfYml0cyBjbWRfdHlwZTsKQEAgLTMzNywxNSArMzM3LDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9lbGV2YXRvci5oPgogCi10eXBlZGVmIHZvaWQgKHJlcXVlc3RfZm5fcHJvYykgKHJlcXVlc3RfcXVldWVfdCAqcSk7Ci10eXBlZGVmIGludCAobWFrZV9yZXF1ZXN0X2ZuKSAocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwotdHlwZWRlZiBpbnQgKHByZXBfcnFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci10eXBlZGVmIHZvaWQgKHVucGx1Z19mbikgKHJlcXVlc3RfcXVldWVfdCAqKTsKK3R5cGVkZWYgdm9pZCAocmVxdWVzdF9mbl9wcm9jKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwordHlwZWRlZiBpbnQgKG1ha2VfcmVxdWVzdF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwordHlwZWRlZiBpbnQgKHByZXBfcnFfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3R5cGVkZWYgdm9pZCAodW5wbHVnX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiAKIHN0cnVjdCBiaW9fdmVjOwotdHlwZWRlZiBpbnQgKG1lcmdlX2J2ZWNfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvX3ZlYyAqKTsKLXR5cGVkZWYgaW50IChpc3N1ZV9mbHVzaF9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLCBzZWN0b3JfdCAqKTsKLXR5cGVkZWYgdm9pZCAocHJlcGFyZV9mbHVzaF9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3R5cGVkZWYgaW50IChtZXJnZV9idmVjX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvX3ZlYyAqKTsKK3R5cGVkZWYgaW50IChpc3N1ZV9mbHVzaF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBnZW5kaXNrICosIHNlY3Rvcl90ICopOwordHlwZWRlZiB2b2lkIChwcmVwYXJlX2ZsdXNoX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiB0eXBlZGVmIHZvaWQgKHNvZnRpcnFfZG9uZV9mbikoc3RydWN0IHJlcXVlc3QgKik7CiAKIGVudW0gYmxrX3F1ZXVlX3N0YXRlIHsKQEAgLTQ4Myw4ICs0ODMsOCBAQAogI2RlZmluZSBRVUVVRV9GTEFHX0NMVVNURVIJMAkvKiBjbHVzdGVyIHNldmVyYWwgc2VnbWVudHMgaW50byAxICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfUVVFVUVECTEJLyogdXNlcyBnZW5lcmljIHRhZyBxdWV1ZWluZyAqLwogI2RlZmluZSBRVUVVRV9GTEFHX1NUT1BQRUQJMgkvKiBxdWV1ZSBpcyBzdG9wcGVkICovCi0jZGVmaW5lCVFVRVVFX0ZMQUdfUkVBREZVTEwJMwkvKiB3cml0ZSBxdWV1ZSBoYXMgYmVlbiBmaWxsZWQgKi8KLSNkZWZpbmUgUVVFVUVfRkxBR19XUklURUZVTEwJNAkvKiByZWFkIHF1ZXVlIGhhcyBiZWVuIGZpbGxlZCAqLworI2RlZmluZQlRVUVVRV9GTEFHX1JFQURGVUxMCTMJLyogcmVhZCBxdWV1ZSBoYXMgYmVlbiBmaWxsZWQgKi8KKyNkZWZpbmUgUVVFVUVfRkxBR19XUklURUZVTEwJNAkvKiB3cml0ZSBxdWV1ZSBoYXMgYmVlbiBmaWxsZWQgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19ERUFECQk1CS8qIHF1ZXVlIGJlaW5nIHRvcm4gZG93biAqLwogI2RlZmluZSBRVUVVRV9GTEFHX1JFRU5URVIJNgkvKiBSZS1lbnRyYW5jeSBhdm9pZGFuY2UgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19QTFVHR0VECTcJLyogcXVldWUgaXMgcGx1Z2dlZCAqLwpAQCAtNjI2LDEzICs2MjYsMTMgQEAKIAogI2lmZGVmIENPTkZJR19CT1VOQ0UKIGV4dGVybiBpbnQgaW5pdF9lbWVyZ2VuY3lfaXNhX3Bvb2wodm9pZCk7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfYm91bmNlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqKmJpbyk7CitleHRlcm4gdm9pZCBibGtfcXVldWVfYm91bmNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICoqYmlvKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBpbml0X2VtZXJnZW5jeV9pc2FfcG9vbCh2b2lkKQogewogCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSB2b2lkIGJsa19xdWV1ZV9ib3VuY2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICoqYmlvKQorc3RhdGljIGlubGluZSB2b2lkIGJsa19xdWV1ZV9ib3VuY2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKipiaW8pCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwpAQCAtNjQ2LDE0ICs2NDYsMTQgQEAKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRldik7CiBleHRlcm4gdm9pZCBnZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIHZvaWQgYmxrX3B1dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICopOwotZXh0ZXJuIHZvaWQgX19ibGtfcHV0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIHZvaWQgX19ibGtfcHV0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gdm9pZCBibGtfZW5kX3N5bmNfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IpOwotZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICpibGtfZ2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIGludCwgZ2ZwX3QpOwotZXh0ZXJuIHZvaWQgYmxrX2luc2VydF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiB2b2lkIGJsa19wbHVnX2RldmljZShyZXF1ZXN0X3F1ZXVlX3QgKik7Ci1leHRlcm4gaW50IGJsa19yZW1vdmVfcGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKik7Ci1leHRlcm4gdm9pZCBibGtfcmVjb3VudF9zZWdtZW50cyhyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGJpbyAqKTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX2dldF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCwgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgYmxrX2luc2VydF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosIGludCwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIGJsa19yZXF1ZXVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gdm9pZCBibGtfcGx1Z19kZXZpY2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CitleHRlcm4gaW50IGJsa19yZW1vdmVfcGx1ZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKK2V4dGVybiB2b2lkIGJsa19yZWNvdW50X3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBiaW8gKik7CiBleHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosCiAJCQkgIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHNnX3Njc2lfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKQEAgLTY2MiwxNCArNjYyLDE1IEBACiAvKgogICogVGVtcG9yYXJ5IGV4cG9ydCwgdW50aWwgU0NTSSBnZXRzIGZpeGVkIHVwLgogICovCi1leHRlcm4gaW50IGxsX2JhY2tfbWVyZ2VfZm4ocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBiaW8gKik7CitleHRlcm4gaW50IGxsX2JhY2tfbWVyZ2VfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwKKwkJc3RydWN0IGJpbyAqKTsKIAogLyoKICAqIEEgcXVldWUgaGFzIGp1c3QgZXhpdHRlZCBjb25nZXN0aW9uLiAgTm90ZSB0aGlzIGluIHRoZSBnbG9iYWwgY291bnRlciBvZgogICogY29uZ2VzdGVkIHF1ZXVlcywgYW5kIHdha2UgdXAgYW55b25lIHdobyB3YXMgd2FpdGluZyBmb3IgcmVxdWVzdHMgdG8gYmUKICAqIHB1dCBiYWNrLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYmxrX2NsZWFyX3F1ZXVlX2Nvbmdlc3RlZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBibGtfY2xlYXJfcXVldWVfY29uZ2VzdGVkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgcncpCiB7CiAJY2xlYXJfYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgcncpOwogfQpAQCAtNjc4LDI5ICs2NzksMjkgQEAKICAqIEEgcXVldWUgaGFzIGp1c3QgZW50ZXJlZCBjb25nZXN0aW9uLiAgRmxhZyB0aGF0IGluIHRoZSBxdWV1ZSdzIFZNLXZpc2libGUKICAqIHN0YXRlIGZsYWdzIGFuZCBpbmNyZW1lbnQgdGhlIGdsb2JhbCBnb3VudGVyIG9mIGNvbmdlc3RlZCBxdWV1ZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBibGtfc2V0X3F1ZXVlX2Nvbmdlc3RlZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKK3N0YXRpYyBpbmxpbmUgdm9pZCBibGtfc2V0X3F1ZXVlX2Nvbmdlc3RlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgaW50IHJ3KQogewogCXNldF9iZGlfY29uZ2VzdGVkKCZxLT5iYWNraW5nX2Rldl9pbmZvLCBydyk7CiB9CiAKLWV4dGVybiB2b2lkIGJsa19zdGFydF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpOwotZXh0ZXJuIHZvaWQgYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKK2V4dGVybiB2b2lkIGJsa19zdGFydF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CitleHRlcm4gdm9pZCBibGtfc3RvcF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiBleHRlcm4gdm9pZCBibGtfc3luY19xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7Ci1leHRlcm4gdm9pZCBfX2Jsa19zdG9wX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSk7Ci1leHRlcm4gdm9pZCBibGtfcnVuX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqKTsKLWV4dGVybiB2b2lkIGJsa19zdGFydF9xdWV1ZWluZyhyZXF1ZXN0X3F1ZXVlX3QgKik7Ci1leHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBfX2Jsa19zdG9wX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK2V4dGVybiB2b2lkIGJsa19ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CitleHRlcm4gdm9pZCBibGtfc3RhcnRfcXVldWVpbmcoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CitleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkIF9fdXNlciAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqKTsKLWV4dGVybiBpbnQgYmxrX3JxX21hcF9rZXJuKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkICosIHVuc2lnbmVkIGludCwgZ2ZwX3QpOwotZXh0ZXJuIGludCBibGtfcnFfbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLAorZXh0ZXJuIGludCBibGtfcnFfbWFwX2tlcm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCAqLCB1bnNpZ25lZCBpbnQsIGdmcF90KTsKK2V4dGVybiBpbnQgYmxrX3JxX21hcF91c2VyX2lvdihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLAogCQkJICAgICAgIHN0cnVjdCBzZ19pb3ZlYyAqLCBpbnQsIHVuc2lnbmVkIGludCk7Ci1leHRlcm4gaW50IGJsa19leGVjdXRlX3JxKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLAorZXh0ZXJuIGludCBibGtfZXhlY3V0ZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgZ2VuZGlzayAqLAogCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLAorZXh0ZXJuIHZvaWQgYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBnZW5kaXNrICosCiAJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHJxX2VuZF9pb19mbiAqKTsKIGV4dGVybiBpbnQgYmxrX3ZlcmlmeV9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIAotc3RhdGljIGlubGluZSByZXF1ZXN0X3F1ZXVlX3QgKmJkZXZfZ2V0X3F1ZXVlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpiZGV2X2dldF9xdWV1ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewogCXJldHVybiBiZGV2LT5iZF9kaXNrLT5xdWV1ZTsKIH0KQEAgLTc0OSw0MSArNzUwLDQxIEBACiAvKgogICogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHF1ZXVlIHByb3BlcnRpZXMKICAqLwotZXh0ZXJuIHJlcXVlc3RfcXVldWVfdCAqYmxrX2luaXRfcXVldWVfbm9kZShyZXF1ZXN0X2ZuX3Byb2MgKnJmbiwKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2luaXRfcXVldWVfbm9kZShyZXF1ZXN0X2ZuX3Byb2MgKnJmbiwKIAkJCQkJc3BpbmxvY2tfdCAqbG9jaywgaW50IG5vZGVfaWQpOwotZXh0ZXJuIHJlcXVlc3RfcXVldWVfdCAqYmxrX2luaXRfcXVldWUocmVxdWVzdF9mbl9wcm9jICosIHNwaW5sb2NrX3QgKik7Ci1leHRlcm4gdm9pZCBibGtfY2xlYW51cF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKik7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBtYWtlX3JlcXVlc3RfZm4gKik7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfYm91bmNlX2xpbWl0KHJlcXVlc3RfcXVldWVfdCAqLCB1NjQpOwotZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9zZWN0b3JzKHJlcXVlc3RfcXVldWVfdCAqLCB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqLCB1bnNpZ25lZCBzaG9ydCk7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqLCB1bnNpZ25lZCBzaG9ydCk7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShyZXF1ZXN0X3F1ZXVlX3QgKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHJlcXVlc3RfcXVldWVfdCAqLCB1bnNpZ25lZCBzaG9ydCk7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfc3RhY2tfbGltaXRzKHJlcXVlc3RfcXVldWVfdCAqdCwgcmVxdWVzdF9xdWV1ZV90ICpiKTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHJlcXVlc3RfcXVldWVfdCAqLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9wcmVwX3JxKHJlcXVlc3RfcXVldWVfdCAqLCBwcmVwX3JxX2ZuICpwZm4pOwotZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21lcmdlX2J2ZWMocmVxdWVzdF9xdWV1ZV90ICosIG1lcmdlX2J2ZWNfZm4gKik7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfZG1hX2FsaWdubWVudChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUocmVxdWVzdF9xdWV1ZV90ICosIHNvZnRpcnFfZG9uZV9mbiAqKTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2luaXRfcXVldWUocmVxdWVzdF9mbl9wcm9jICosIHNwaW5sb2NrX3QgKik7CitleHRlcm4gdm9pZCBibGtfY2xlYW51cF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgbWFrZV9yZXF1ZXN0X2ZuICopOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1NjQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9zZWN0b3JzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBzaG9ydCk7CitleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3N0YWNrX2xpbWl0cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqdCwgc3RydWN0IHJlcXVlc3RfcXVldWUgKmIpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBibGtfcXVldWVfcHJlcF9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBwcmVwX3JxX2ZuICpwZm4pOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21lcmdlX2J2ZWMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgbWVyZ2VfYnZlY19mbiAqKTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCk7CitleHRlcm4gdm9pZCBibGtfcXVldWVfc29mdGlycV9kb25lKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHNvZnRpcnFfZG9uZV9mbiAqKTsKIGV4dGVybiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwotZXh0ZXJuIGludCBibGtfcXVldWVfb3JkZXJlZChyZXF1ZXN0X3F1ZXVlX3QgKiwgdW5zaWduZWQsIHByZXBhcmVfZmx1c2hfZm4gKik7Ci1leHRlcm4gdm9pZCBibGtfcXVldWVfaXNzdWVfZmx1c2hfZm4ocmVxdWVzdF9xdWV1ZV90ICosIGlzc3VlX2ZsdXNoX2ZuICopOwotZXh0ZXJuIGludCBibGtfZG9fb3JkZXJlZChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiopOwotZXh0ZXJuIHVuc2lnbmVkIGJsa19vcmRlcmVkX2N1cl9zZXEocmVxdWVzdF9xdWV1ZV90ICopOworZXh0ZXJuIGludCBibGtfcXVldWVfb3JkZXJlZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCwgcHJlcGFyZV9mbHVzaF9mbiAqKTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBpc3N1ZV9mbHVzaF9mbiAqKTsKK2V4dGVybiBpbnQgYmxrX2RvX29yZGVyZWQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiopOworZXh0ZXJuIHVuc2lnbmVkIGJsa19vcmRlcmVkX2N1cl9zZXEoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiBleHRlcm4gdW5zaWduZWQgYmxrX29yZGVyZWRfcmVxX3NlcShzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiB2b2lkIGJsa19vcmRlcmVkX2NvbXBsZXRlX3NlcShyZXF1ZXN0X3F1ZXVlX3QgKiwgdW5zaWduZWQsIGludCk7CitleHRlcm4gdm9pZCBibGtfb3JkZXJlZF9jb21wbGV0ZV9zZXEoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQsIGludCk7CiAKLWV4dGVybiBpbnQgYmxrX3JxX21hcF9zZyhyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICopOworZXh0ZXJuIGludCBibGtfcnFfbWFwX3NnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqKTsKIGV4dGVybiB2b2lkIGJsa19kdW1wX3JxX2ZsYWdzKHN0cnVjdCByZXF1ZXN0ICosIGNoYXIgKik7Ci1leHRlcm4gdm9pZCBnZW5lcmljX3VucGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICopOwotZXh0ZXJuIHZvaWQgX19nZW5lcmljX3VucGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICopOworZXh0ZXJuIHZvaWQgZ2VuZXJpY191bnBsdWdfZGV2aWNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOworZXh0ZXJuIHZvaWQgX19nZW5lcmljX3VucGx1Z19kZXZpY2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiBleHRlcm4gbG9uZyBucl9ibG9ja2Rldl9wYWdlcyh2b2lkKTsKIAotaW50IGJsa19nZXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICopOwotcmVxdWVzdF9xdWV1ZV90ICpibGtfYWxsb2NfcXVldWUoZ2ZwX3QpOwotcmVxdWVzdF9xdWV1ZV90ICpibGtfYWxsb2NfcXVldWVfbm9kZShnZnBfdCwgaW50KTsKLWV4dGVybiB2b2lkIGJsa19wdXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICopOworaW50IGJsa19nZXRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2FsbG9jX3F1ZXVlKGdmcF90KTsKK3N0cnVjdCByZXF1ZXN0X3F1ZXVlICpibGtfYWxsb2NfcXVldWVfbm9kZShnZnBfdCwgaW50KTsKK2V4dGVybiB2b2lkIGJsa19wdXRfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiAKIC8qCiAgKiB0YWcgc3R1ZmYKQEAgLTc5MSwxMyArNzkyLDEzIEBACiAjZGVmaW5lIGJsa19xdWV1ZV90YWdfZGVwdGgocSkJCSgocSktPnF1ZXVlX3RhZ3MtPmJ1c3kpCiAjZGVmaW5lIGJsa19xdWV1ZV90YWdfcXVldWUocSkJCSgocSktPnF1ZXVlX3RhZ3MtPmJ1c3kgPCAocSktPnF1ZXVlX3RhZ3MtPm1heF9kZXB0aCkKICNkZWZpbmUgYmxrX3JxX3RhZ2dlZChycSkJCSgocnEpLT5jbWRfZmxhZ3MgJiBSRVFfUVVFVUVEKQotZXh0ZXJuIGludCBibGtfcXVldWVfc3RhcnRfdGFnKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX3F1ZXVlX2ZpbmRfdGFnKHJlcXVlc3RfcXVldWVfdCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2VuZF90YWcocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotZXh0ZXJuIGludCBibGtfcXVldWVfaW5pdF90YWdzKHJlcXVlc3RfcXVldWVfdCAqLCBpbnQsIHN0cnVjdCBibGtfcXVldWVfdGFnICopOwotZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2ZyZWVfdGFncyhyZXF1ZXN0X3F1ZXVlX3QgKik7Ci1leHRlcm4gaW50IGJsa19xdWV1ZV9yZXNpemVfdGFncyhyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9pbnZhbGlkYXRlX3RhZ3MocmVxdWVzdF9xdWV1ZV90ICopOworZXh0ZXJuIGludCBibGtfcXVldWVfc3RhcnRfdGFnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICpibGtfcXVldWVfZmluZF90YWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9lbmRfdGFnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIGludCBibGtfcXVldWVfaW5pdF90YWdzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCwgc3RydWN0IGJsa19xdWV1ZV90YWcgKik7CitleHRlcm4gdm9pZCBibGtfcXVldWVfZnJlZV90YWdzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOworZXh0ZXJuIGludCBibGtfcXVldWVfcmVzaXplX3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9pbnZhbGlkYXRlX3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiBleHRlcm4gc3RydWN0IGJsa19xdWV1ZV90YWcgKmJsa19pbml0X3RhZ3MoaW50KTsKIGV4dGVybiB2b2lkIGJsa19mcmVlX3RhZ3Moc3RydWN0IGJsa19xdWV1ZV90YWcgKik7CiAKQEAgLTgwOSw3ICs4MTAsNyBAQAogCXJldHVybiBicXQtPnRhZ19pbmRleFt0YWddOwogfQogCi1leHRlcm4gdm9pZCBibGtfcnFfYmlvX3ByZXAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBiaW8gKik7CitleHRlcm4gdm9pZCBibGtfcnFfYmlvX3ByZXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IGJpbyAqKTsKIGV4dGVybiBpbnQgYmxrZGV2X2lzc3VlX2ZsdXNoKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc2VjdG9yX3QgKik7CiAKICNkZWZpbmUgTUFYX1BIWVNfU0VHTUVOVFMgMTI4CkBAIC04MjEsNyArODIyLDcgQEAKIAogI2RlZmluZSBibGtkZXZfZW50cnlfdG9fcmVxdWVzdChlbnRyeSkgbGlzdF9lbnRyeSgoZW50cnkpLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KQogCi1zdGF0aWMgaW5saW5lIGludCBxdWV1ZV9oYXJkc2VjdF9zaXplKHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX2hhcmRzZWN0X3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJaW50IHJldHZhbCA9IDUxMjsKIApAQCAtODM2LDcgKzgzNyw3IEBACiAJcmV0dXJuIHF1ZXVlX2hhcmRzZWN0X3NpemUoYmRldl9nZXRfcXVldWUoYmRldikpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBxdWV1ZV9kbWFfYWxpZ25tZW50KHJlcXVlc3RfcXVldWVfdCAqcSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX2RtYV9hbGlnbm1lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJaW50IHJldHZhbCA9IDUxMTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaCBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKaW5kZXggMzY4MGZmOWEuLjkwODc0YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaApAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lPX1RSQUNFKQogZXh0ZXJuIGludCBibGtfdHJhY2VfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqLCB1bnNpZ25lZCwgY2hhciBfX3VzZXIgKik7Ci1leHRlcm4gdm9pZCBibGtfdHJhY2Vfc2h1dGRvd24ocmVxdWVzdF9xdWV1ZV90ICopOworZXh0ZXJuIHZvaWQgYmxrX3RyYWNlX3NodXRkb3duKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogZXh0ZXJuIHZvaWQgX19ibGtfYWRkX3RyYWNlKHN0cnVjdCBibGtfdHJhY2UgKiwgc2VjdG9yX3QsIGludCwgaW50LCB1MzIsIGludCwgaW50LCB2b2lkICopOwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnNnLmggYi9pbmNsdWRlL2xpbnV4L2JzZy5oCmluZGV4IGY0MTVmODkuLjEwMmRjMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnNnLmgKKysrIGIvaW5jbHVkZS9saW51eC9ic2cuaApAQCAtNTMsMTUgKzUzLDE5IEBACiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgbWlub3I7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIH07CiAKIGV4dGVybiBpbnQgYnNnX3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCBkZXZpY2UgKiwgY29uc3QgY2hhciAqKTsKIGV4dGVybiB2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogI2Vsc2UKLSNkZWZpbmUgYnNnX3JlZ2lzdGVyX3F1ZXVlKGRpc2ssIGRldiwgbmFtZSkJCSgwKQotI2RlZmluZSBic2dfdW5yZWdpc3Rlcl9xdWV1ZShkaXNrKQlkbyB7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIGludCBic2dfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiBycSwgc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSkKK3sKK30KICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCmluZGV4IDEyYTEyOTEuLjg2ZjlhM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKQEAgLTE1LDggKzE1LDggQEAKICMgZGVmaW5lIF9fYWNxdWlyZSh4KQlfX2NvbnRleHRfXyh4LDEpCiAjIGRlZmluZSBfX3JlbGVhc2UoeCkJX19jb250ZXh0X18oeCwtMSkKICMgZGVmaW5lIF9fY29uZF9sb2NrKHgsYykJKChjKSA/ICh7IF9fYWNxdWlyZSh4KTsgMTsgfSkgOiAwKQotZXh0ZXJuIHZvaWQgX19jaGtfdXNlcl9wdHIoY29uc3Qgdm9pZCBfX3VzZXIgKik7Ci1leHRlcm4gdm9pZCBfX2Noa19pb19wdHIoY29uc3Qgdm9pZCBfX2lvbWVtICopOworZXh0ZXJuIHZvaWQgX19jaGtfdXNlcl9wdHIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX3VzZXIgKik7CitleHRlcm4gdm9pZCBfX2Noa19pb19wdHIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICopOwogI2Vsc2UKICMgZGVmaW5lIF9fdXNlcgogIyBkZWZpbmUgX19rZXJuZWwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGQ5ZjBhNTcuLjNhMzhkMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtNTUxLDYgKzU1MSw5IEBACiAvKiBkcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYyAqLwogZXh0ZXJuIHZvaWQgZGV2aWNlX3NodXRkb3duKHZvaWQpOwogCisvKiBkcml2ZXJzL2Jhc2Uvc3lzLmMgKi8KK2V4dGVybiB2b2lkIHN5c2Rldl9zaHV0ZG93bih2b2lkKTsKKwogCiAvKiBkcml2ZXJzL2Jhc2UvZmlybXdhcmUuYyAqLwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZmlybXdhcmVfcmVnaXN0ZXIoc3RydWN0IGtzZXQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oIGIvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaAppbmRleCA5M2U0YzNhLi41MDgzOWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oCisrKyBiL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNlbHNlCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmggYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKaW5kZXggZTg4ZmNiYy4uZThmNDIxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaApAQCAtNSwyOSArNSwyOSBAQAogCiAjaWZkZWYgQ09ORklHX0JMT0NLCiAKLXR5cGVkZWYgaW50IChlbGV2YXRvcl9tZXJnZV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKiwKK3R5cGVkZWYgaW50IChlbGV2YXRvcl9tZXJnZV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICoqLAogCQkJCSBzdHJ1Y3QgYmlvICopOwogCi10eXBlZGVmIHZvaWQgKGVsZXZhdG9yX21lcmdlX3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3R5cGVkZWYgdm9pZCAoZWxldmF0b3JfbWVyZ2VfcmVxX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKLXR5cGVkZWYgdm9pZCAoZWxldmF0b3JfbWVyZ2VkX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGludCk7Cit0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX21lcmdlZF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiAKLXR5cGVkZWYgaW50IChlbGV2YXRvcl9hbGxvd19tZXJnZV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3QgYmlvICopOwordHlwZWRlZiBpbnQgKGVsZXZhdG9yX2FsbG93X21lcmdlX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IGJpbyAqKTsKIAotdHlwZWRlZiBpbnQgKGVsZXZhdG9yX2Rpc3BhdGNoX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIGludCk7Cit0eXBlZGVmIGludCAoZWxldmF0b3JfZGlzcGF0Y2hfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBpbnQpOwogCi10eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2FkZF9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci10eXBlZGVmIGludCAoZWxldmF0b3JfcXVldWVfZW1wdHlfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKik7Ci10eXBlZGVmIHN0cnVjdCByZXF1ZXN0ICooZWxldmF0b3JfcmVxdWVzdF9saXN0X2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9jb21wbGV0ZWRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotdHlwZWRlZiBpbnQgKGVsZXZhdG9yX21heV9xdWV1ZV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBpbnQpOwordHlwZWRlZiB2b2lkIChlbGV2YXRvcl9hZGRfcmVxX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7Cit0eXBlZGVmIGludCAoZWxldmF0b3JfcXVldWVfZW1wdHlfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKK3R5cGVkZWYgc3RydWN0IHJlcXVlc3QgKihlbGV2YXRvcl9yZXF1ZXN0X2xpc3RfZm4pIChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK3R5cGVkZWYgdm9pZCAoZWxldmF0b3JfY29tcGxldGVkX3JlcV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwordHlwZWRlZiBpbnQgKGVsZXZhdG9yX21heV9xdWV1ZV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCk7CiAKLXR5cGVkZWYgaW50IChlbGV2YXRvcl9zZXRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGdmcF90KTsKK3R5cGVkZWYgaW50IChlbGV2YXRvcl9zZXRfcmVxX2ZuKSAoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgZ2ZwX3QpOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9wdXRfcmVxX2ZuKSAoc3RydWN0IHJlcXVlc3QgKik7Ci10eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2FjdGl2YXRlX3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLXR5cGVkZWYgdm9pZCAoZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Cit0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2FjdGl2YXRlX3JlcV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwordHlwZWRlZiB2b2lkIChlbGV2YXRvcl9kZWFjdGl2YXRlX3JlcV9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogCi10eXBlZGVmIHZvaWQgKihlbGV2YXRvcl9pbml0X2ZuKSAocmVxdWVzdF9xdWV1ZV90ICopOwordHlwZWRlZiB2b2lkICooZWxldmF0b3JfaW5pdF9mbikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9leGl0X2ZuKSAoZWxldmF0b3JfdCAqKTsKIAogc3RydWN0IGVsZXZhdG9yX29wcwpAQCAtOTQsMjcgKzk0LDI3IEBACiAvKgogICogYmxvY2sgZWxldmF0b3IgaW50ZXJmYWNlCiAgKi8KLWV4dGVybiB2b2lkIGVsdl9kaXNwYXRjaF9zb3J0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiB2b2lkIGVsdl9kaXNwYXRjaF9hZGRfdGFpbChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci1leHRlcm4gdm9pZCBlbHZfYWRkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGludCwgaW50KTsKLWV4dGVybiB2b2lkIF9fZWx2X2FkZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBlbHZfaW5zZXJ0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwotZXh0ZXJuIGludCBlbHZfbWVyZ2UocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICoqLCBzdHJ1Y3QgYmlvICopOwotZXh0ZXJuIHZvaWQgZWx2X21lcmdlX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLAorZXh0ZXJuIHZvaWQgZWx2X2Rpc3BhdGNoX3NvcnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gdm9pZCBlbHZfZGlzcGF0Y2hfYWRkX3RhaWwoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gdm9pZCBlbHZfYWRkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgX19lbHZfYWRkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgZWx2X2luc2VydChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOworZXh0ZXJuIGludCBlbHZfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiosIHN0cnVjdCBiaW8gKik7CitleHRlcm4gdm9pZCBlbHZfbWVyZ2VfcmVxdWVzdHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwKIAkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiB2b2lkIGVsdl9tZXJnZWRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKLWV4dGVybiB2b2lkIGVsdl9kZXF1ZXVlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotZXh0ZXJuIHZvaWQgZWx2X3JlcXVldWVfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci1leHRlcm4gaW50IGVsdl9xdWV1ZV9lbXB0eShyZXF1ZXN0X3F1ZXVlX3QgKik7CitleHRlcm4gdm9pZCBlbHZfbWVyZ2VkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIGVsdl9kZXF1ZXVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gdm9pZCBlbHZfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIGludCBlbHZfcXVldWVfZW1wdHkoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiBleHRlcm4gc3RydWN0IHJlcXVlc3QgKmVsdl9uZXh0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwotZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICplbHZfZm9ybWVyX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICplbHZfbGF0dGVyX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotZXh0ZXJuIGludCBlbHZfcmVnaXN0ZXJfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKLWV4dGVybiB2b2lkIGVsdl91bnJlZ2lzdGVyX3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSk7Ci1leHRlcm4gaW50IGVsdl9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICosIGludCk7Ci1leHRlcm4gdm9pZCBlbHZfY29tcGxldGVkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotZXh0ZXJuIGludCBlbHZfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGdmcF90KTsKLWV4dGVybiB2b2lkIGVsdl9wdXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gc3RydWN0IHJlcXVlc3QgKmVsdl9mb3JtZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqZWx2X2xhdHRlcl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIGludCBlbHZfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworZXh0ZXJuIHZvaWQgZWx2X3VucmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworZXh0ZXJuIGludCBlbHZfbWF5X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGludCk7CitleHRlcm4gdm9pZCBlbHZfY29tcGxldGVkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CitleHRlcm4gaW50IGVsdl9zZXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBnZnBfdCk7CitleHRlcm4gdm9pZCBlbHZfcHV0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKIC8qCiAgKiBpbyBzY2hlZHVsZXIgcmVnaXN0cmF0aW9uCkBAIC0xMjUsMTggKzEyNSwxOCBAQAogLyoKICAqIGlvIHNjaGVkdWxlciBzeXNmcyBzd2l0Y2hpbmcKICAqLwotZXh0ZXJuIHNzaXplX3QgZWx2X2lvc2NoZWRfc2hvdyhyZXF1ZXN0X3F1ZXVlX3QgKiwgY2hhciAqKTsKLWV4dGVybiBzc2l6ZV90IGVsdl9pb3NjaGVkX3N0b3JlKHJlcXVlc3RfcXVldWVfdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gc3NpemVfdCBlbHZfaW9zY2hlZF9zaG93KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGNoYXIgKik7CitleHRlcm4gc3NpemVfdCBlbHZfaW9zY2hlZF9zdG9yZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiAKLWV4dGVybiBpbnQgZWxldmF0b3JfaW5pdChyZXF1ZXN0X3F1ZXVlX3QgKiwgY2hhciAqKTsKK2V4dGVybiBpbnQgZWxldmF0b3JfaW5pdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBjaGFyICopOwogZXh0ZXJuIHZvaWQgZWxldmF0b3JfZXhpdChlbGV2YXRvcl90ICopOwogZXh0ZXJuIGludCBlbHZfcnFfbWVyZ2Vfb2soc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IGJpbyAqKTsKIAogLyoKICAqIEhlbHBlciBmdW5jdGlvbnMuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqZWx2X3JiX2Zvcm1lcl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqZWx2X3JiX2xhdHRlcl9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqZWx2X3JiX2Zvcm1lcl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOworZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICplbHZfcmJfbGF0dGVyX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKIC8qCiAgKiByYiBzdXBwb3J0IGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnJlZXplci5oIGIvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKaW5kZXggYzhlMDJkZS4uZWZkZWQwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKQEAgLTUsNyArNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAvKgogICogQ2hlY2sgaWYgYSBwcm9jZXNzIGhhcyBiZWVuIGZyb3plbgogICovCkBAIC0xMjYsNyArMTI2LDcgQEAKIAljdXJyZW50LT5mbGFncyAmPSB+UEZfTk9GUkVFWkU7CiB9CiAKLSNlbHNlCisjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCiBzdGF0aWMgaW5saW5lIGludCBmcm96ZW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBmcmVlemluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXplX2ZsYWcoc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7fQpAQCAtMTQzLDYgKzE0Myw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplcl9jb3VudCh2b2lkKSB7fQogc3RhdGljIGlubGluZSBpbnQgZnJlZXplcl9zaG91bGRfc2tpcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXphYmxlKHZvaWQpIHt9Ci0jZW5kaWYKKyNlbmRpZiAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKICNlbmRpZgkvKiBGUkVFWkVSX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2VuaGQuaCBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaAppbmRleCA5NzU2ZmMxLi5hNDdiODAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZW5oZC5oCkBAIC0yNjQsNyArMjY0LDcgQEAKIAogI2lmZGVmIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04KIAotI2RlZmluZSBTT0xBUklTX1g4Nl9OVU1TTElDRQk4CisjZGVmaW5lIFNPTEFSSVNfWDg2X05VTVNMSUNFCTE2CiAjZGVmaW5lIFNPTEFSSVNfWDg2X1ZUT0NfU0FORQkoMHg2MDBEREVFRVVMKQogCiBzdHJ1Y3Qgc29sYXJpc194ODZfc2xpY2UgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCA0OWI3MDUzLi5lNmE3MWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX0xJTlVYX0hVR0VUTEJfSAogI2RlZmluZSBfTElOVVhfSFVHRVRMQl9ICiAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkZS5oIGIvaW5jbHVkZS9saW51eC9pZGUuaAppbmRleCA1ZjVkYWFkLi5kNzFkMDEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRlLmgKQEAgLTU1NSw3ICs1NTUsNyBAQAogCWNoYXIJCW5hbWVbNF07CS8qIGRyaXZlIG5hbWUsIHN1Y2ggYXMgImhkYSIgKi8KICAgICAgICAgY2hhciAgICAgICAgICAgIGRyaXZlcl9yZXFbMTBdOwkvKiByZXF1ZXN0cyBzcGVjaWZpYyBkcml2ZXIgKi8KIAotCXJlcXVlc3RfcXVldWVfdAkJKnF1ZXVlOwkvKiByZXF1ZXN0IHF1ZXVlICovCisJc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwkvKiByZXF1ZXN0IHF1ZXVlICovCiAKIAlzdHJ1Y3QgcmVxdWVzdAkJKnJxOwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KIAlzdHJ1Y3QgaWRlX2RyaXZlX3MgCSpuZXh0OwkvKiBjaXJjdWxhciBsaXN0IG9mIGh3Z3JvdXAgZHJpdmVzICovCkBAIC0xMjA2LDcgKzEyMDYsNyBAQAogZXh0ZXJuIGludCBpZGVfc3Bpbl93YWl0X2h3Z3JvdXAoaWRlX2RyaXZlX3QgKik7CiBleHRlcm4gdm9pZCBpZGVfdGltZXJfZXhwaXJ5KHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGlycXJldHVybl90IGlkZV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci1leHRlcm4gdm9pZCBkb19pZGVfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKik7CitleHRlcm4gdm9pZCBkb19pZGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIAogdm9pZCBpZGVfaW5pdF9kaXNrKHN0cnVjdCBnZW5kaXNrICosIGlkZV9kcml2ZV90ICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAppbmRleCAwYTNjMmViLi41NTIzZjE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKQEAgLTExLDggKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgotI2luY2x1ZGUgPGxpbnV4L2JvdHRvbV9oYWxmLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC05Nyw2ICs5NSw4IEBACiAJCSAgICAgICB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICosIHZvaWQgKik7CiBleHRlcm4gdm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQsIHZvaWQgKik7CiAKK3N0cnVjdCBkZXZpY2U7CisKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGRldm1fcmVxdWVzdF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXJxLAogCQkJICAgIGlycV9oYW5kbGVyX3QgaGFuZGxlciwgdW5zaWduZWQgbG9uZyBpcnFmbGFncywKIAkJCSAgICBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rb2JqZWN0LmggYi9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaAppbmRleCBhYTJmZTIyLi45NDk3MDZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaApAQCAtNTYsNiArNTYsOSBAQAogCUtPQkpfTUFYCiB9OwogCisvKiBUaGUgbGlzdCBvZiBzdHJpbmdzIGRlZmluaW5nIHRoZSB2YWxpZCBrb2JqZWN0IGFjdGlvbnMgYXMgc3BlY2lmaWVkIGFib3ZlICovCitleHRlcm4gY29uc3QgY2hhciAqa29iamVjdF9hY3Rpb25zW107CisKIHN0cnVjdCBrb2JqZWN0IHsKIAljb25zdCBjaGFyCQkqIGtfbmFtZTsKIAljaGFyCQkJbmFtZVtLT0JKX05BTUVfTEVOXTsKQEAgLTEwOCw5ICsxMTEsMTUgQEAKIAlzdHJ1Y3QgYXR0cmlidXRlCSoqIGRlZmF1bHRfYXR0cnM7CiB9OwogCitzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzIHsKKwlpbnQgKCpmaWx0ZXIpKHN0cnVjdCBrc2V0ICprc2V0LCBzdHJ1Y3Qga29iamVjdCAqa29iaik7CisJY29uc3QgY2hhciAqKCpuYW1lKShzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmopOworCWludCAoKnVldmVudCkoc3RydWN0IGtzZXQgKmtzZXQsIHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICoqZW52cCwKKwkJCWludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOworfTsKIAotLyoqCi0gKglrc2V0IC0gYSBzZXQgb2Yga29iamVjdHMgb2YgYSBzcGVjaWZpYyB0eXBlLCBiZWxvbmdpbmcKKy8qCisgKglzdHJ1Y3Qga3NldCAtIGEgc2V0IG9mIGtvYmplY3RzIG9mIGEgc3BlY2lmaWMgdHlwZSwgYmVsb25naW5nCiAgKgl0byBhIHNwZWNpZmljIHN1YnN5c3RlbS4KICAqCiAgKglBbGwga29iamVjdHMgb2YgYSBrc2V0IHNob3VsZCBiZSBlbWJlZGRlZCBpbiBhbiBpZGVudGljYWwgCkBAIC0xMjYsMTMgKzEzNSw2IEBACiAgKglzdXByZXNzIHRoZSBldmVudCBnZW5lcmF0aW9uIG9yIGFkZCBzdWJzeXN0ZW0gc3BlY2lmaWMKICAqCXZhcmlhYmxlcyBjYXJyaWVkIHdpdGggdGhlIGV2ZW50LgogICovCi1zdHJ1Y3Qga3NldF91ZXZlbnRfb3BzIHsKLQlpbnQgKCpmaWx0ZXIpKHN0cnVjdCBrc2V0ICprc2V0LCBzdHJ1Y3Qga29iamVjdCAqa29iaik7Ci0JY29uc3QgY2hhciAqKCpuYW1lKShzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmopOwotCWludCAoKnVldmVudCkoc3RydWN0IGtzZXQgKmtzZXQsIHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICoqZW52cCwKLQkJCWludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOwotfTsKLQogc3RydWN0IGtzZXQgewogCXN0cnVjdCBrb2JqX3R5cGUJKiBrdHlwZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CkBAIC0xNzMsNyArMTc1LDcgQEAKIGV4dGVybiBzdHJ1Y3Qga29iamVjdCAqIGtzZXRfZmluZF9vYmooc3RydWN0IGtzZXQgKiwgY29uc3QgY2hhciAqKTsKIAogCi0vKioKKy8qCiAgKiBVc2UgdGhpcyB3aGVuIGluaXRpYWxpemluZyBhbiBlbWJlZGRlZCBrc2V0IHdpdGggbm8gb3RoZXIgCiAgKiBmaWVsZHMgdG8gaW5pdGlhbGl6ZS4KICAqLwpAQCAtMTk4LDcgKzIwMCw3IEBACiAvKiBUaGUgZ2xvYmFsIC9zeXMvaHlwZXJ2aXNvci8gc3Vic3lzdGVtICAqLwogZXh0ZXJuIHN0cnVjdCBrc2V0IGh5cGVydmlzb3Jfc3Vic3lzOwogCi0vKioKKy8qCiAgKiBIZWxwZXJzIGZvciBzZXR0aW5nIHRoZSBrc2V0IG9mIHJlZ2lzdGVyZWQgb2JqZWN0cy4KICAqIE9mdGVuLCBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJlbG9uZ3MgdG8gYSBrc2V0IGVtYmVkZGVkIGluIGEgCiAgKiBzdWJzeXN0ZW0uIFRoZXNlIGRvIG5vIG1hZ2ljLCBqdXN0IG1ha2UgdGhlIHJlc3VsdGluZyBjb2RlCkBAIC0yMzMsNyArMjM1LDcgQEAKIC8qKgogICoJc3Vic3lzX3NldF9rc2V0KG9iaixzdWJzeXMpIC0gc2V0IGtzZXQgZm9yIHN1YnN5c3RlbQogICoJQG9iajoJCXB0ciB0byBzb21lIG9iamVjdCB0eXBlLgotICoJQHN1YnN5czoJYSBzdWJzeXN0ZW0gb2JqZWN0IChub3QgYSBwdHIpLgorICoJQF9zdWJzeXM6CWEgc3Vic3lzdGVtIG9iamVjdCAobm90IGEgcHRyKS4KICAqCiAgKglDYW4gYmUgdXNlZCBmb3IgYW55IG9iamVjdCB0eXBlIHdpdGggYW4gZW1iZWRkZWQgLT5zdWJzeXMuCiAgKglTZXRzIHRoZSBrc2V0IG9mIEBvYmoncyBrb2JqZWN0IHRvIEBzdWJzeXMua3NldC4gVGhpcyBtYWtlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZ3Vlc3QuaCBiL2luY2x1ZGUvbGludXgvbGd1ZXN0LmgKaW5kZXggNTAwYWFjZS4uMTU3YWQ2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZ3Vlc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xndWVzdC5oCkBAIC0xNyw3ICsxNyw2IEBACiAjZGVmaW5lIExIQ0FMTF9UUwkJOAogI2RlZmluZSBMSENBTExfU0VUX0NMT0NLRVZFTlQJOQogI2RlZmluZSBMSENBTExfSEFMVAkJMTAKLSNkZWZpbmUgTEhDQUxMX0dFVF9XQUxMQ0xPQ0sJMTEKICNkZWZpbmUgTEhDQUxMX0JJTkRfRE1BCQkxMgogI2RlZmluZSBMSENBTExfU0VORF9ETUEJCTEzCiAjZGVmaW5lIExIQ0FMTF9TRVRfUFRFCQkxNApAQCAtMjcsMTggKzI2LDM4IEBACiAjZGVmaW5lIExHX0NMT0NLX01JTl9ERUxUQQkxMDBVTAogI2RlZmluZSBMR19DTE9DS19NQVhfREVMVEEJVUxPTkdfTUFYCiAKKy8qRzowMzEgRmlyc3QsIGhvdyBkb2VzIG91ciBHdWVzdCBjb250YWN0IHRoZSBIb3N0IHRvIGFzayBmb3IgcHJpdmlsZWdlZAorICogb3BlcmF0aW9ucz8gIFRoZXJlIGFyZSB0d28gd2F5czogdGhlIGRpcmVjdCB3YXkgaXMgdG8gbWFrZSBhICJoeXBlcmNhbGwiLAorICogdG8gbWFrZSByZXF1ZXN0cyBvZiB0aGUgSG9zdCBJdHNlbGYuCisgKgorICogT3VyIGh5cGVyY2FsbCBtZWNoYW5pc20gdXNlcyB0aGUgaGlnaGVzdCB1bnVzZWQgdHJhcCBjb2RlICh0cmFwcyAzMiBhbmQKKyAqIGFib3ZlIGFyZSB1c2VkIGJ5IHJlYWwgaGFyZHdhcmUgaW50ZXJydXB0cykuICBTZXZlbnRlZW4gaHlwZXJjYWxscyBhcmUKKyAqIGF2YWlsYWJsZTogdGhlIGh5cGVyY2FsbCBudW1iZXIgaXMgcHV0IGluIHRoZSAlZWF4IHJlZ2lzdGVyLCBhbmQgdGhlCisgKiBhcmd1bWVudHMgKHdoZW4gcmVxdWlyZWQpIGFyZSBwbGFjZWQgaW4gJWVkeCwgJWVieCBhbmQgJWVjeC4gIElmIGEgcmV0dXJuCisgKiB2YWx1ZSBtYWtlcyBzZW5zZSwgaXQncyByZXR1cm5lZCBpbiAlZWF4LgorICoKKyAqIEdyb3NzbHkgaW52YWxpZCBjYWxscyByZXN1bHQgaW4gU3VkZGVuIERlYXRoIGF0IHRoZSBoYW5kcyBvZiB0aGUgdmVuZ2VmdWwKKyAqIEhvc3QsIHJhdGhlciB0aGFuIHJldHVybmluZyBmYWlsdXJlLiAgVGhpcyByZWZsZWN0cyBXaW5zdG9uIENodXJjaGlsbCdzCisgKiBkZWZpbml0aW9uIG9mIGEgZ2VudGxlbWFuOiAic29tZW9uZSB3aG8gaXMgb25seSBydWRlIGludGVudGlvbmFsbHkiLiAqLwogI2RlZmluZSBMR1VFU1RfVFJBUF9FTlRSWSAweDFGCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogaGNhbGwodW5zaWduZWQgbG9uZyBjYWxsLAogICAgICAgdW5zaWduZWQgbG9uZyBhcmcxLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMykKIHsKKwkvKiAiaW50IiBpcyB0aGUgSW50ZWwgaW5zdHJ1Y3Rpb24gdG8gdHJpZ2dlciBhIHRyYXAuICovCiAJYXNtIHZvbGF0aWxlKCJpbnQgJCIgX19zdHJpbmdpZnkoTEdVRVNUX1RSQVBfRU5UUlkpCisJCSAgICAgICAvKiBUaGUgY2FsbCBpcyBpbiAlZWF4IChha2EgImEiKSwgYW5kIGNhbiBiZSByZXBsYWNlZCAqLwogCQkgICAgIDogIj1hIihjYWxsKQorCQkgICAgICAgLyogVGhlIG90aGVyIGFyZ3VtZW50cyBhcmUgaW4gJWVheCwgJWVkeCwgJWVieCAmICVlY3ggKi8KIAkJICAgICA6ICJhIihjYWxsKSwgImQiKGFyZzEpLCAiYiIoYXJnMiksICJjIihhcmczKQorCQkgICAgICAgLyogIm1lbW9yeSIgbWVhbnMgdGhpcyBtaWdodCB3cml0ZSBzb21ld2hlcmUgaW4gbWVtb3J5LgorCQkJKiBUaGlzIGlzbid0IHRydWUgZm9yIGFsbCBjYWxscywgYnV0IGl0J3Mgc2FmZSB0byB0ZWxsCisJCQkqIGdjYyB0aGF0IGl0IG1pZ2h0IGhhcHBlbiBzbyBpdCBkb2Vzbid0IGdldCBjbGV2ZXIuICovCiAJCSAgICAgOiAibWVtb3J5Iik7CiAJcmV0dXJuIGNhbGw7CiB9CisvKjoqLwogCiB2b2lkIGFzeW5jX2hjYWxsKHVuc2lnbmVkIGxvbmcgY2FsbCwKIAkJIHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyLCB1bnNpZ25lZCBsb25nIGFyZzMpOwpAQCAtNTIsMzEgKzcxLDQzIEBACiAJdTMyIGVheCwgZWR4LCBlYngsIGVjeDsKIH07CiAKLS8qIEFsbCB0aGUgZ29vZCBzdHVmZiBoYXBwZW5zIGhlcmU6IGd1ZXN0IHJlZ2lzdGVycyBpdCB3aXRoIExHVUVTVF9JTklUICovCisvKkc6MDMyIFRoZSBzZWNvbmQgbWV0aG9kIG9mIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgSG9zdCBpcyB0byB2aWEgInN0cnVjdAorICogbGd1ZXN0X2RhdGEiLiAgVGhlIEd1ZXN0J3MgdmVyeSBmaXJzdCBoeXBlcmNhbGwgaXMgdG8gdGVsbCB0aGUgSG9zdCB3aGVyZQorICogdGhpcyBpcywgYW5kIHRoZW4gdGhlIEd1ZXN0IGFuZCBIb3N0IGJvdGggcHVibGlzaCBpbmZvcm1hdGlvbiBpbiBpdC4gOiovCiBzdHJ1Y3QgbGd1ZXN0X2RhdGEKIHsKLS8qIEZpZWxkcyB3aGljaCBjaGFuZ2UgZHVyaW5nIHJ1bm5pbmc6ICovCi0JLyogNTEyID09IGVuYWJsZWQgKHNhbWUgYXMgZWZsYWdzKSAqLworCS8qIDUxMiA9PSBlbmFibGVkIChzYW1lIGFzIGVmbGFncyBpbiBub3JtYWwgaGFyZHdhcmUpLiAgVGhlIEd1ZXN0CisJICogY2hhbmdlcyBpbnRlcnJ1cHRzIHNvIG9mdGVuIHRoYXQgYSBoeXBlcmNhbGwgaXMgdG9vIHNsb3cuICovCiAJdW5zaWduZWQgaW50IGlycV9lbmFibGVkOwotCS8qIEludGVycnVwdHMgYmxvY2tlZCBieSBndWVzdC4gKi8KKwkvKiBGaW5lLWdyYWluZWQgaW50ZXJydXB0IGRpc2FibGluZyBieSB0aGUgR3Vlc3QgKi8KIAlERUNMQVJFX0JJVE1BUChibG9ja2VkX2ludGVycnVwdHMsIExHVUVTVF9JUlFTKTsKIAotCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBwYWdlIGZhdWx0LiAqLworCS8qIFRoZSBIb3N0IHdyaXRlcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsYXN0IHBhZ2UgZmF1bHQgaGVyZSwKKwkgKiB3aGljaCBzYXZlcyB0aGUgR3Vlc3QgYSBoeXBlcmNhbGwuICBDUjIgaXMgdGhlIG5hdGl2ZSByZWdpc3RlciB3aGVyZQorCSAqIHRoaXMgYWRkcmVzcyB3b3VsZCBub3JtYWxseSBiZSBmb3VuZC4gKi8KIAl1bnNpZ25lZCBsb25nIGNyMjsKIAotCS8qIEFzeW5jIGh5cGVyY2FsbCByaW5nLiAgMHhGRiA9PSBkb25lLCAwID09IHBlbmRpbmcuICovCisJLyogV2FsbGNsb2NrIHRpbWUgc2V0IGJ5IHRoZSBIb3N0LiAqLworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJLyogQXN5bmMgaHlwZXJjYWxsIHJpbmcuICBJbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyBoeXBlcmNhbGxzLCB3ZSBjYW4KKwkgKiBwbGFjZSB0aGVtIGluIGhlcmUgZm9yIHByb2Nlc3NpbmcgdGhlIG5leHQgdGltZSB0aGUgSG9zdCB3YW50cy4KKwkgKiBUaGlzIGJhdGNoaW5nIGNhbiBiZSBxdWl0ZSBlZmZpY2llbnQuICovCisKKwkvKiAweEZGID09IGRvbmUgKHNldCBieSBIb3N0KSwgMCA9PSBwZW5kaW5nIChzZXQgYnkgR3Vlc3QpLiAqLwogCXU4IGhjYWxsX3N0YXR1c1tMSENBTExfUklOR19TSVpFXTsKKwkvKiBUaGUgYWN0dWFsIHJlZ2lzdGVycyBmb3IgdGhlIGh5cGVyY2FsbHMuICovCiAJc3RydWN0IGhjYWxsX3JpbmcgaGNhbGxzW0xIQ0FMTF9SSU5HX1NJWkVdOwogCi0vKiBGaWVsZHMgaW5pdGlhbGl6ZWQgYnkgdGhlIGh5cGVydmlzb3IgYXQgYm9vdDogKi8KKy8qIEZpZWxkcyBpbml0aWFsaXplZCBieSB0aGUgSG9zdCBhdCBib290OiAqLwogCS8qIE1lbW9yeSBub3QgdG8gdHJ5IHRvIGFjY2VzcyAqLwogCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV9tZW07Ci0JLyogSUQgb2YgdGhpcyBndWVzdCAodXNlZCBieSBuZXR3b3JrIGRyaXZlciB0byBzZXQgZXRoZXJuZXQgYWRkcmVzcykgKi8KKwkvKiBJRCBvZiB0aGlzIEd1ZXN0ICh1c2VkIGJ5IG5ldHdvcmsgZHJpdmVyIHRvIHNldCBldGhlcm5ldCBhZGRyZXNzKSAqLwogCXUxNiBndWVzdGlkOwogCS8qIEtIeiBmb3IgdGhlIFRTQyBjbG9jay4gKi8KIAl1MzIgdHNjX2toejsKIAotLyogRmllbGRzIGluaXRpYWxpemVkIGJ5IHRoZSBndWVzdCBhdCBib290OiAqLworLyogRmllbGRzIGluaXRpYWxpemVkIGJ5IHRoZSBHdWVzdCBhdCBib290OiAqLwogCS8qIEluc3RydWN0aW9uIHJhbmdlIHRvIHN1cHByZXNzIGludGVycnVwdHMgZXZlbiBpZiBlbmFibGVkICovCiAJdW5zaWduZWQgbG9uZyBub2lycV9zdGFydCwgbm9pcnFfZW5kOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGd1ZXN0X2J1cy5oIGIvaW5jbHVkZS9saW51eC9sZ3Vlc3RfYnVzLmgKaW5kZXggYzliNGUwNWYuLmQyNzg1M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGd1ZXN0X2J1cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGd1ZXN0X2J1cy5oCkBAIC0xNSwxMSArMTUsMTQgQEAKIAl2b2lkICpwcml2YXRlOwogfTsKIAotLyogQnkgY29udmVudGlvbiwgZWFjaCBkZXZpY2UgY2FuIHVzZSBpcnEgaW5kZXgrMSBpZiBpdCB3YW50cyB0by4gKi8KKy8qRDozODAgU2luY2UgaW50ZXJydXB0IG51bWJlcnMgYXJlIGFyYml0cmFyeSwgd2UgdXNlIGEgY29udmVudGlvbjogZWFjaCBkZXZpY2UKKyAqIGNhbiB1c2UgdGhlIGludGVycnVwdCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBpdHMgaW5kZXguICBUaGUgKzEgaXMgYmVjYXVzZQorICogaW50ZXJydXB0IDAgaXMgbm90IHVzYWJsZSAoaXQncyBhY3R1YWxseSB0aGUgdGltZXIgaW50ZXJydXB0KS4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGxnZGV2X2lycShjb25zdCBzdHJ1Y3QgbGd1ZXN0X2RldmljZSAqZGV2KQogewogCXJldHVybiBkZXYtPmluZGV4ICsgMTsKIH0KKy8qOiovCiAKIC8qIGRtYSBhcmdzIG11c3Qgbm90IGJlIHZtYWxsb2NlZCEgKi8KIHZvaWQgbGd1ZXN0X3NlbmRfZG1hKHVuc2lnbmVkIGxvbmcga2V5LCBzdHJ1Y3QgbGd1ZXN0X2RtYSAqZG1hKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGd1ZXN0X2xhdW5jaGVyLmggYi9pbmNsdWRlL2xpbnV4L2xndWVzdF9sYXVuY2hlci5oCmluZGV4IDBiYTQxNGEuLjY0MTY3MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGd1ZXN0X2xhdW5jaGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9sZ3Vlc3RfbGF1bmNoZXIuaApAQCAtOSwxNCArOSw0NSBAQAogLyogSG93IG1hbnkgZGV2aWNlcz8gIEFzc3VtZSBlYWNoIG9uZSB3YW50cyB1cCB0byB0d28gZG1hIGFycmF5cyBwZXIgZGV2aWNlLiAqLwogI2RlZmluZSBMR1VFU1RfTUFYX0RFVklDRVMgKExHVUVTVF9NQVhfRE1BLzIpCiAKKy8qRDoyMDAKKyAqIExndWVzdCBJL08KKyAqCisgKiBUaGUgbGd1ZXN0IEkvTyBtZWNoYW5pc20gaXMgdGhlIG9ubHkgd2F5IEd1ZXN0cyBjYW4gdGFsayB0byBkZXZpY2VzLiAgVGhlcmUKKyAqIGFyZSB0d28gaHlwZXJjYWxscyBpbnZvbHZlZDogU0VORF9ETUEgZm9yIG91dHB1dCBhbmQgQklORF9ETUEgZm9yIGlucHV0LiAgSW4KKyAqIGVhY2ggY2FzZSwgInN0cnVjdCBsZ3Vlc3RfZG1hIiBkZXNjcmliZXMgdGhlIGJ1ZmZlcjogdGhpcyBjb250YWlucyAxNgorICogYWRkci9sZW4gcGFpcnMsIGFuZCBpZiB0aGVyZSBhcmUgZmV3ZXIgYnVmZmVyIGVsZW1lbnRzIHRoZSBsZW4gYXJyYXkgaXMKKyAqIHRlcm1pbmF0ZWQgd2l0aCBhIDAuCisgKgorICogSS9PIGlzIG9yZ2FuaXplZCBieSBrZXlzOiBCSU5EX0RNQSBhdHRhY2hlcyBidWZmZXJzIHRvIGEgcGFydGljdWxhciBrZXksIGFuZAorICogU0VORF9ETUEgdHJhbnNmZXJzIHRvIGJ1ZmZlcnMgYm91bmQgdG8gcGFydGljdWxhciBrZXkuICBCeSBjb252ZW50aW9uLCBrZXlzCisgKiBjb3JyZXNwb25kIHRvIGEgcGh5c2ljYWwgYWRkcmVzcyB3aXRoaW4gdGhlIGRldmljZSdzIHBhZ2UuICBUaGlzIG1lYW5zIHRoYXQKKyAqIGRldmljZXMgd2lsbCBuZXZlciBhY2NpZGVudGFsbHkgZW5kIHVwIHdpdGggdGhlIHNhbWUga2V5cywgYW5kIGFsbG93cyB0aGUKKyAqIEhvc3QgdXNlIFRoZSBGdXRleCBUcmljayAoYXMgd2UnbGwgc2VlIGxhdGVyIGluIG91ciBqb3VybmV5KS4KKyAqCisgKiBTRU5EX0RNQSBzaW1wbHkgaW5kaWNhdGVzIGEga2V5IHRvIHNlbmQgdG8sIGFuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKyAqICJzdHJ1Y3QgbGd1ZXN0X2RtYSIgdG8gc2VuZC4gIFRoZSBIb3N0IHdpbGwgd3JpdGUgdGhlIG51bWJlciBvZiBieXRlcworICogdHJhbnNmZXJyZWQgaW50byB0aGUgInN0cnVjdCBsZ3Vlc3RfZG1hIidzIHVzZWRfbGVuIG1lbWJlci4KKyAqCisgKiBCSU5EX0RNQSBpbmRpY2F0ZXMgYSBrZXkgdG8gYmluZCB0bywgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mICJzdHJ1Y3QKKyAqIGxndWVzdF9kbWEicyByZWFkeSBmb3IgcmVjZWl2aW5nLCB0aGUgc2l6ZSBvZiB0aGF0IGFycmF5LCBhbmQgYW4gaW50ZXJydXB0CisgKiB0byB0cmlnZ2VyIHdoZW4gZGF0YSBpcyByZWNlaXZlZC4gIFRoZSBIb3N0IHdpbGwgb25seSBhbGxvdyB0cmFuc2ZlcnMgaW50bworICogYnVmZmVycyB3aXRoIGEgdXNlZF9sZW4gb2YgemVybzogaXQgdGhlbiBzZXRzIHVzZWRfbGVuIHRvIHRoZSBudW1iZXIgb2YKKyAqIGJ5dGVzIHRyYW5zZmVycmVkIGFuZCB0cmlnZ2VycyB0aGUgaW50ZXJydXB0IGZvciB0aGUgR3Vlc3QgdG8gcHJvY2VzcyB0aGUKKyAqIG5ldyBpbnB1dC4gKi8KIHN0cnVjdCBsZ3Vlc3RfZG1hCiB7Ci0JLyogMCBpZiBmcmVlIHRvIGJlIHVzZWQsIGZpbGxlZCBieSBoeXBlcnZpc29yLiAqLworCS8qIDAgaWYgZnJlZSB0byBiZSB1c2VkLCBmaWxsZWQgYnkgdGhlIEhvc3QuICovCiAgCXUzMiB1c2VkX2xlbjsKIAl1bnNpZ25lZCBsb25nIGFkZHJbTEdVRVNUX01BWF9ETUFfU0VDVElPTlNdOwogCXUxNiBsZW5bTEdVRVNUX01BWF9ETUFfU0VDVElPTlNdOwogfTsKKy8qOiovCiAKKy8qRDo0NjAgVGhpcyBpcyB0aGUgbGF5b3V0IG9mIGEgYmxvY2sgZGV2aWNlIG1lbW9yeSBwYWdlLiAgVGhlIExhdW5jaGVyIHNldHMgdXAKKyAqIHRoZSBudW1fc2VjdG9ycyBpbml0aWFsbHkgdG8gdGVsbCB0aGUgR3Vlc3QgdGhlIHNpemUgb2YgdGhlIGRpc2suICBUaGUgR3Vlc3QKKyAqIHB1dHMgdGhlIHR5cGUsIHNlY3RvciBhbmQgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0IGluIHRoZSBmaXJzdCB0aHJlZSBmaWVsZHMsCisgKiB0aGVuIERNQXMgdG8gdGhlIEhvc3QuICBUaGUgSG9zdCBwcm9jZXNzZXMgdGhlIHJlcXVlc3QsIHNldHMgdXAgdGhlIHJlc3VsdCwKKyAqIHRoZW4gRE1BcyBiYWNrIHRvIHRoZSBHdWVzdC4gKi8KIHN0cnVjdCBsZ3Vlc3RfYmxvY2tfcGFnZQogewogCS8qIDAgaXMgYSByZWFkLCAxIGlzIGEgd3JpdGUuICovCkBAIC0yOCwyNyArNTksNDcgQEAKIAl1MzIgbnVtX3NlY3RvcnM7IC8qIERpc2sgbGVuZ3RoID0gbnVtX3NlY3RvcnMgKiA1MTIgKi8KIH07CiAKLS8qIFRoZXJlIGlzIGEgc2hhcmVkIHBhZ2Ugb2YgdGhlc2UuICovCisvKkQ6NTIwIFRoZSBuZXR3b3JrIGRldmljZSBpcyBiYXNpY2FsbHkgYSBtZW1vcnkgcGFnZSB3aGVyZSBhbGwgdGhlIEd1ZXN0cyBvbgorICogdGhlIG5ldHdvcmsgcHVibGlzaCB0aGVpciBNQUMgKGV0aGVybmV0KSBhZGRyZXNzZXM6IGl0J3MgYW4gYXJyYXkgb2YgInN0cnVjdAorICogbGd1ZXN0X25ldCI6ICovCiBzdHJ1Y3QgbGd1ZXN0X25ldAogewogCS8qIFNpbXBseSB0aGUgbWFjIGFkZHJlc3MgKHdpdGggbXVsdGljYXN0IGJpdCBtZWFuaW5nIHByb21pc2MpLiAqLwogCXVuc2lnbmVkIGNoYXIgbWFjWzZdOwogfTsKKy8qOiovCiAKIC8qIFdoZXJlIHRoZSBIb3N0IGV4cGVjdHMgdGhlIEd1ZXN0IHRvIFNFTkRfRE1BIGNvbnNvbGUgb3V0cHV0IHRvLiAqLwogI2RlZmluZSBMR1VFU1RfQ09OU09MRV9ETUFfS0VZIDAKIAotLyogV2UgaGF2ZSBhIHBhZ2Ugb2YgdGhlc2UgZGVzY3JpcHRvcnMgaW4gdGhlIGxndWVzdF9kZXZpY2UgcGFnZS4gKi8KKy8qRDowMTAKKyAqIERyaXZlcnMKKyAqCisgKiBUaGUgR3Vlc3QgbmVlZHMgZGV2aWNlcyB0byBkbyBhbnl0aGluZyB1c2VmdWwuICBTaW5jZSB3ZSBkb24ndCBsZXQgaXQgdG91Y2gKKyAqIHJlYWwgZGV2aWNlcyAodGhpbmsgb2YgdGhlIGRhbWFnZSBpdCBjb3VsZCBkbyEpIHdlIHByb3ZpZGUgdmlydHVhbCBkZXZpY2VzLgorICogV2UgY291bGQgZW11bGF0ZSBhIFBDSSBidXMgd2l0aCB2YXJpb3VzIGRldmljZXMgb24gaXQsIGJ1dCB0aGF0IGlzIGEgZmFpcmx5CisgKiBjb21wbGV4IGJ1cmRlbiBmb3IgdGhlIEhvc3QgYW5kIHN1Ym9wdGltYWwgZm9yIHRoZSBHdWVzdCwgc28gd2UgaGF2ZSBvdXIgb3duCisgKiAibGd1ZXN0IiBidXMgYW5kIHNpbXBsZSBkcml2ZXJzLgorICoKKyAqIERldmljZXMgYXJlIGRlc2NyaWJlZCBieSBhbiBhcnJheSBvZiBMR1VFU1RfTUFYX0RFVklDRVMgb2YgdGhlc2Ugc3RydWN0cywKKyAqIHBsYWNlZCBieSB0aGUgTGF1bmNoZXIganVzdCBhYm92ZSB0aGUgdG9wIG9mIHBoeXNpY2FsIG1lbW9yeToKKyAqLwogc3RydWN0IGxndWVzdF9kZXZpY2VfZGVzYyB7CisJLyogVGhlIGRldmljZSB0eXBlOiBjb25zb2xlLCBuZXR3b3JrLCBkaXNrIGV0Yy4gKi8KIAl1MTYgdHlwZTsKICNkZWZpbmUgTEdVRVNUX0RFVklDRV9UX0NPTlNPTEUJMQogI2RlZmluZSBMR1VFU1RfREVWSUNFX1RfTkVUCTIKICNkZWZpbmUgTEdVRVNUX0RFVklDRV9UX0JMT0NLCTMKIAorCS8qIFRoZSBzcGVjaWZpYyBmZWF0dXJlcyBvZiB0aGlzIGRldmljZTogdGhlc2UgZGVwZW5kcyBvbiBkZXZpY2UgdHlwZQorCSAqIGV4Y2VwdCBmb3IgTEdVRVNUX0RFVklDRV9GX1JBTkRPTU5FU1MuICovCiAJdTE2IGZlYXR1cmVzOwogI2RlZmluZSBMR1VFU1RfTkVUX0ZfTk9DU1VNCQkweDQwMDAgLyogRG9uJ3QgYm90aGVyIGNoZWNrc3VtbWluZyAqLwogI2RlZmluZSBMR1VFU1RfREVWSUNFX0ZfUkFORE9NTkVTUwkweDgwMDAgLyogSVJRIGlzIGZhaXJseSByYW5kb20gKi8KIAorCS8qIFRoaXMgaXMgaG93IHRoZSBHdWVzdCByZXBvcnRzIHN0YXR1cyBvZiB0aGUgZGV2aWNlOiB0aGUgSG9zdCBjYW4gc2V0CisJICogTEdVRVNUX0RFVklDRV9TX1JFTU9WRUQgdG8gaW5kaWNhdGUgcmVtb3ZhbCwgYnV0IHRoZSByZXN0IGFyZSBvbmx5CisJICogZXZlciBtYW5pcHVsYXRlZCBieSB0aGUgR3Vlc3QsIGFuZCBvbmx5IGV2ZXIgc2V0LiAqLwogCXUxNiBzdGF0dXM7CiAvKiAyNTYgYW5kIGFib3ZlIGFyZSBkZXZpY2Ugc3BlY2lmaWMuICovCiAjZGVmaW5lIExHVUVTVF9ERVZJQ0VfU19BQ0tOT1dMRURHRQkxIC8qIFdlIGhhdmUgc2VlbiBkZXZpY2UuICovCkBAIC01OCw5ICsxMDksMTIgQEAKICNkZWZpbmUgTEdVRVNUX0RFVklDRV9TX1JFTU9WRURfQUNLCTE2IC8qIERyaXZlciBoYXMgYmVlbiB0b2xkLiAqLwogI2RlZmluZSBMR1VFU1RfREVWSUNFX1NfRkFJTEVECQkxMjggLyogU29tZXRoaW5nIGFjdHVhbGx5IGZhaWxlZCAqLwogCisJLyogRWFjaCBkZXZpY2UgZXhpc3RzIHNvbWV3aGVyZSBpbiBHdWVzdCBwaHlzaWNhbCBtZW1vcnksIG92ZXIgc29tZQorCSAqIG51bWJlciBvZiBwYWdlcy4gKi8KIAl1MTYgbnVtX3BhZ2VzOwogCXUzMiBwZm47CiB9OworLyo6Ki8KIAogLyogV3JpdGUgY29tbWFuZCBmaXJzdCB3b3JkIGlzIGEgcmVxdWVzdC4gKi8KIGVudW0gbGd1ZXN0X3JlcQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggOWFhNmMxMC4uNDE5NzhhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC0yMTYsNiArMjE2LDggQEAKIAlBVEFfSE9TVF9TSU1QTEVYCT0gKDEgPDwgMCksCS8qIEhvc3QgaXMgc2ltcGxleCwgb25lIERNQSBjaGFubmVsIHBlciBob3N0IG9ubHkgKi8KIAlBVEFfSE9TVF9TVEFSVEVECT0gKDEgPDwgMSksCS8qIEhvc3Qgc3RhcnRlZCAqLwogCisJLyogYml0cyAyNDozMSBvZiBob3N0LT5mbGFncyBhcmUgcmVzZXJ2ZWQgZm9yIExMRCBzcGVjaWZpYyBmbGFncyAqLworCiAJLyogdmFyaW91cyBsZW5ndGhzIG9mIHRpbWUgKi8KIAlBVEFfVE1PVVRfQk9PVAkJPSAzMCAqIEhaLAkvKiBoZXVyaXN0aWMgKi8KIAlBVEFfVE1PVVRfQk9PVF9RVUlDSwk9IDcgKiBIWiwJLyogaGV1cmlzdGljICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvb3AuaCBiL2luY2x1ZGUvbGludXgvbG9vcC5oCmluZGV4IDBiOTliMzEuLjI2YTBhMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9vcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9vcC5oCkBAIC02Myw3ICs2Myw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0CSpsb190aHJlYWQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJbG9fZXZlbnQ7CiAKLQlyZXF1ZXN0X3F1ZXVlX3QJCSpsb19xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZQkqbG9fcXVldWU7CiAJc3RydWN0IGdlbmRpc2sJCSpsb19kaXNrOwogCXN0cnVjdCBsaXN0X2hlYWQJbG9fbGlzdDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYzQ1NmMzYS4uNjU1MDk0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW9fdHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CkBAIC0xOCw3ICsxNyw5IEBACiAKIHN0cnVjdCBtZW1wb2xpY3k7CiBzdHJ1Y3QgYW5vbl92bWE7CitzdHJ1Y3QgZmlsZV9yYV9zdGF0ZTsKIHN0cnVjdCB1c2VyX3N0cnVjdDsKK3N0cnVjdCB3cml0ZWJhY2tfY29udHJvbDsKIAogI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNICAgICAgICAgIC8qIERvbid0IHVzZSBtYXBucnMsIGRvIGl0IHByb3Blcmx5ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbWFwbnI7CkBAIC04NjEsMzggKzg2Miw3IEBACiBleHRlcm4gdm9pZCByZWdpc3Rlcl9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKIAotLyoKLSAqIFNvbWUgc2hhcmVkIG1hcHBpZ25zIHdpbGwgd2FudCB0aGUgcGFnZXMgbWFya2VkIHJlYWQtb25seQotICogdG8gdHJhY2sgd3JpdGUgZXZlbnRzLiBJZiBzbywgd2UnbGwgZG93bmdyYWRlIHZtX3BhZ2VfcHJvdAotICogdG8gdGhlIHByaXZhdGUgdmVyc2lvbiAodXNpbmcgcHJvdGVjdGlvbl9tYXBbXSB3aXRob3V0IHRoZQotICogVk1fU0hBUkVEIGJpdCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHZtYV93YW50c193cml0ZW5vdGlmeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQl1bnNpZ25lZCBpbnQgdm1fZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOwotCi0JLyogSWYgaXQgd2FzIHByaXZhdGUgb3Igbm9uLXdyaXRhYmxlLCB0aGUgd3JpdGUgYml0IGlzIGFscmVhZHkgY2xlYXIgKi8KLQlpZiAoKHZtX2ZsYWdzICYgKFZNX1dSSVRFfFZNX1NIQVJFRCkpICE9ICgoVk1fV1JJVEV8Vk1fU0hBUkVEKSkpCi0JCXJldHVybiAwOwotCi0JLyogVGhlIGJhY2tlciB3aXNoZXMgdG8ga25vdyB3aGVuIHBhZ2VzIGFyZSBmaXJzdCB3cml0dGVuIHRvPyAqLwotCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+cGFnZV9ta3dyaXRlKQotCQlyZXR1cm4gMTsKLQotCS8qIFRoZSBvcGVuIHJvdXRpbmUgZGlkIHNvbWV0aGluZyB0byB0aGUgcHJvdGVjdGlvbnMgYWxyZWFkeT8gKi8KLQlpZiAocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgIT0KLQkgICAgcGdwcm90X3ZhbChwcm90ZWN0aW9uX21hcFt2bV9mbGFncyAmCi0JCSAgICAoVk1fUkVBRHxWTV9XUklURXxWTV9FWEVDfFZNX1NIQVJFRCldKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBTcGVjaWFsdHkgbWFwcGluZz8gKi8KLQlpZiAodm1fZmxhZ3MgJiAoVk1fUEZOTUFQfFZNX0lOU0VSVFBBR0UpKQotCQlyZXR1cm4gMDsKLQotCS8qIENhbiB0aGUgbWFwcGluZyB0cmFjayB0aGUgZGlydHkgcGFnZXM/ICovCi0JcmV0dXJuIHZtYS0+dm1fZmlsZSAmJiB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZyAmJgotCQltYXBwaW5nX2NhcF9hY2NvdW50X2RpcnR5KHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nKTsKLX0KK2ludCB2bWFfd2FudHNfd3JpdGVub3RpZnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBleHRlcm4gcHRlX3QgKkZBU1RDQUxMKGdldF9sb2NrZWRfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHNwaW5sb2NrX3QgKipwdGwpKTsKIApAQCAtMTI0Niw3ICsxMjE2LDcgQEAKIGV4dGVybiBpbnQgcmFuZG9taXplX3ZhX3NwYWNlOwogI2VuZGlmCiAKLV9fYXR0cmlidXRlX18oKHdlYWspKSBjb25zdCBjaGFyICphcmNoX3ZtYV9uYW1lKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK2NvbnN0IGNoYXIgKiBhcmNoX3ZtYV9uYW1lKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfTU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCmluZGV4IDA0YmJlMTJmLi42M2E4MGVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCkBAIC05OSw3ICs5OSw3IEBACiBzdHJ1Y3QgbW1jX2hvc3Q7CiBzdHJ1Y3QgbW1jX2NhcmQ7CiAKLWV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19yZXF1ZXN0ICopOworZXh0ZXJuIHZvaWQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19yZXF1ZXN0ICopOwogZXh0ZXJuIGludCBtbWNfd2FpdF9mb3JfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKiwgaW50KTsKIGV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY2FyZCAqLAogCXN0cnVjdCBtbWNfY29tbWFuZCAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaCBiL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKaW5kZXggYWYwNGE1NS4uMmFkYThlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCkBAIC0xNTksNiArMTU5LDEyIEBACiAKICNkZWZpbmUgQVBfREVWSUNFX0lEX01BVENIX0RFVklDRV9UWVBFCQkweDAxCiAKKyNkZWZpbmUgQUNQSV9JRF9MRU4JOQorCitzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeworCV9fdTggaWRbQUNQSV9JRF9MRU5dOworCWtlcm5lbF91bG9uZ190IGRyaXZlcl9kYXRhOworfTsKIAogI2RlZmluZSBQTlBfSURfTEVOCTgKICNkZWZpbmUgUE5QX01BWF9ERVZJQ0VTCTgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmgKaW5kZXggOTBhZThiNC4uMzdlOTMzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmgKQEAgLTUsOCArNSw4IEBACiAKIHN0cnVjdCB4dF9jb25ubGltaXRfaW5mbyB7CiAJdW5pb24gewotCQl1X2ludDMyX3QgdjRfbWFzazsKLQkJdV9pbnQzMl90IHY2X21hc2tbNF07CisJCV9fYmUzMiB2NF9tYXNrOworCQlfX2JlMzIgdjZfbWFza1s0XTsKIAl9OwogCXVuc2lnbmVkIGludCBsaW1pdCwgaW52ZXJzZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggNWU4NGYyZS4uZDhmOGEzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC01MzQsNiArNTM0LDcgQEAKIAogaW50IF9fbXVzdF9jaGVjayBwY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBfX211c3RfY2hlY2sgcGNpX2VuYWJsZV9kZXZpY2VfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzayk7CitpbnQgX19tdXN0X2NoZWNrIF9fcGNpX3JlZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqKTsKIGludCBfX211c3RfY2hlY2sgcGNpbV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIHZvaWQgcGNpbV9waW5fZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBjYmFiYjljLi42OWQ2ODExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMTIyNSw2ICsxMjI1LDEwIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNSAgICAgICAgICAgICAgMHgwNTRECiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNiAgICAgICAgICAgICAgMHgwNTRFCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNyAgICAgICAgICAgICAgMHgwNTRGCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yOCAgICAgICAgICAgICAgMHgwN0RDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yOSAgICAgICAgICAgICAgMHgwN0RECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zMCAgICAgICAgICAgICAgMHgwN0RFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zMSAgICAgICAgICAgICAgMHgwN0RGCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2N19JREUgICAgICAgMHgwNTYwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A3M19JREUgICAgICAgMHgwNTZDCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A3N19JREUgICAgICAgMHgwNzU5CkBAIC0xOTcyLDYgKzE5NzYsOCBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0VORQkJMHgxNTI0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5FX0NCNzEyX1NECTB4MDU1MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VORV9DQjcxMl9TRF8yCTB4MDU1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VORV9DQjcxNF9TRAkweDA3NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTkVfQ0I3MTRfU0RfMgkweDA3NTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9FTkVfMTIxMQkJMHgxMjExCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5FXzEyMjUJCTB4MTIyNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VORV8xNDEwCQkweDE0MTAKQEAgLTIwNzUsNiArMjA4MSwyMyBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RESSAgICAgICAgICAgICAgIDB4MTkyRQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RESV9FSENJICAgICAgICAgIDB4MDEwMQogCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRlJFRVNDQUxFCQkweDE5NTcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NUEM4NTQ4RQkJMHgwMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODU0OAkJMHgwMDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODU0M0UJCTB4MDAxNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg1NDMJCTB4MDAxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg1NDdFCQkweDAwMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NUEM4NTQ1RQkJMHgwMDE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODU0NQkJMHgwMDFhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODU2OEUJCTB4MDAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg1NjgJCTB4MDAyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg1NjdFCQkweDAwMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NUEM4NTY3CQkweDAwMjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NUEM4NTQ0RQkJMHgwMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODU0NAkJMHgwMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODY0MQkJMHg3MDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTVBDODY0MUQJCTB4NzAxMQorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUEFTRU1JCQkweDE5NTkKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUVEFOU0lDCQkweDE5NjkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCBhZDNjYzJlLi40OGI3MWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCiAvKgogICogUG93ZXIgbWFuYWdlbWVudCByZXF1ZXN0cy4uLiB0aGVzZSBhcmUgcGFzc2VkIHRvIHBtX3NlbmRfYWxsKCkgYW5kIGZyaWVuZHMuCkBAIC0xNjUsNiArMTY2LDcgQEAKIAlpbnQgKCpmaW5pc2gpKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSk7CiB9OwogCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKIGV4dGVybiBzdHJ1Y3QgcG1fb3BzICpwbV9vcHM7CiAKIC8qKgpAQCAtMTkzLDYgKzE5NSwxMiBAQAogZXh0ZXJuIHZvaWQgYXJjaF9zdXNwZW5kX2VuYWJsZV9pcnFzKHZvaWQpOwogCiBleHRlcm4gaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKKyNlbHNlIC8qICFDT05GSUdfU1VTUEVORCAqLworI2RlZmluZSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtCU5VTEwKKworc3RhdGljIGlubGluZSB2b2lkIHBtX3NldF9vcHMoc3RydWN0IHBtX29wcyAqcG1fb3BzKSB7fQorc3RhdGljIGlubGluZSBpbnQgcG1fc3VzcGVuZChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KKyNlbmRpZiAvKiAhQ09ORklHX1NVU1BFTkQgKi8KIAogLyoKICAqIERldmljZSBwb3dlciBtYW5hZ2VtZW50CkBAIC0yNjYsNyArMjc0LDcgQEAKIHN0cnVjdCBkZXZfcG1faW5mbyB7CiAJcG1fbWVzc2FnZV90CQlwb3dlcl9zdGF0ZTsKIAl1bnNpZ25lZAkJY2FuX3dha2V1cDoxOwotI2lmZGVmCUNPTkZJR19QTQorI2lmZGVmCUNPTkZJR19QTV9TTEVFUAogCXVuc2lnbmVkCQlzaG91bGRfd2FrZXVwOjE7CiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKICNlbmRpZgpAQCAtMjc2LDcgKzI4NCw3IEBACiBleHRlcm4gdm9pZCBkZXZpY2VfcG93ZXJfdXAodm9pZCk7CiBleHRlcm4gdm9pZCBkZXZpY2VfcmVzdW1lKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBleHRlcm4gaW50IGRldmljZV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50IGRldmljZV9wcmVwYXJlX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKTsKIApAQCAtMzA2LDcgKzMxNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbHNlIC8qICFDT05GSUdfUE0gKi8KKyNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgZGV2aWNlX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQogewpAQCAtMzIzLDcgKzMzMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIAogLyogY2hhbmdlcyB0byBkZXZpY2VfbWF5X3dha2V1cCB0YWtlIGVmZmVjdCBvbiB0aGUgbmV4dCBwbSBzdGF0ZSBjaGFuZ2UuCiAgKiBieSBkZWZhdWx0LCBkZXZpY2VzIHNob3VsZCB3YWtldXAgaWYgdGhleSBjYW4uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BucC5oIGIvaW5jbHVkZS9saW51eC9wbnAuaAppbmRleCAyYTE4OTdlLi4xNmI0NmFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BucC5oCisrKyBiL2luY2x1ZGUvbGludXgvcG5wLmgKQEAgLTEsNyArMSw2IEBACiAvKgogICogTGludXggUGx1ZyBhbmQgUGxheSBTdXBwb3J0CiAgKiBDb3B5cmlnaHQgYnkgQWRhbSBCZWxheSA8YW1ieDFAbmVvLnJyLmNvbT4KLSAqCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfUE5QX0gKQEAgLTIzLDcgKzIyLDYgQEAKIHN0cnVjdCBwbnBfcHJvdG9jb2w7CiBzdHJ1Y3QgcG5wX2RldjsKIAotCiAvKgogICogUmVzb3VyY2UgTWFuYWdlbWVudAogICovCkBAIC03MywzNyArNzEsMzcgQEAKICNkZWZpbmUgUE5QX1BPUlRfRkxBR19GSVhFRAkoMTw8MSkKIAogc3RydWN0IHBucF9wb3J0IHsKLQl1bnNpZ25lZCBzaG9ydCBtaW47CQkvKiBtaW4gYmFzZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBtYXg7CQkvKiBtYXggYmFzZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBjaGFyIGFsaWduOwkJLyogYWxpZ24gYm91bmRhcnkgKi8KLQl1bnNpZ25lZCBjaGFyIHNpemU7CQkvKiBzaXplIG9mIHJhbmdlICovCi0JdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHBvcnQgZmxhZ3MgKi8KLQl1bnNpZ25lZCBjaGFyIHBhZDsJCS8qIHBhZCAqLwotCXN0cnVjdCBwbnBfcG9ydCAqbmV4dDsJCS8qIG5leHQgcG9ydCAqLworCXVuc2lnbmVkIHNob3J0IG1pbjsJLyogbWluIGJhc2UgbnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQgbWF4OwkvKiBtYXggYmFzZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGFsaWduOwkvKiBhbGlnbiBib3VuZGFyeSAqLworCXVuc2lnbmVkIGNoYXIgc2l6ZTsJLyogc2l6ZSBvZiByYW5nZSAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIHBvcnQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZDsJLyogcGFkICovCisJc3RydWN0IHBucF9wb3J0ICpuZXh0OwkvKiBuZXh0IHBvcnQgKi8KIH07CiAKICNkZWZpbmUgUE5QX0lSUV9OUiAyNTYKIHN0cnVjdCBwbnBfaXJxIHsKLQlERUNMQVJFX0JJVE1BUChtYXAsIFBOUF9JUlFfTlIpOyAvKiBiaXRtYWtzIGZvciBJUlEgbGluZXMgKi8KLQl1bnNpZ25lZCBjaGFyIGZsYWdzOwkJLyogSVJRIGZsYWdzICovCi0JdW5zaWduZWQgY2hhciBwYWQ7CQkvKiBwYWQgKi8KLQlzdHJ1Y3QgcG5wX2lycSAqbmV4dDsJCS8qIG5leHQgSVJRICovCisJREVDTEFSRV9CSVRNQVAobWFwLCBQTlBfSVJRX05SKTsJLyogYml0bWFzayBmb3IgSVJRIGxpbmVzICovCisJdW5zaWduZWQgY2hhciBmbGFnczsJLyogSVJRIGZsYWdzICovCisJdW5zaWduZWQgY2hhciBwYWQ7CS8qIHBhZCAqLworCXN0cnVjdCBwbnBfaXJxICpuZXh0OwkvKiBuZXh0IElSUSAqLwogfTsKIAogc3RydWN0IHBucF9kbWEgewotCXVuc2lnbmVkIGNoYXIgbWFwOwkJLyogYml0bWFzayBmb3IgRE1BIGNoYW5uZWxzICovCi0JdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIERNQSBmbGFncyAqLwotCXN0cnVjdCBwbnBfZG1hICpuZXh0OwkJLyogbmV4dCBwb3J0ICovCisJdW5zaWduZWQgY2hhciBtYXA7CS8qIGJpdG1hc2sgZm9yIERNQSBjaGFubmVscyAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIERNQSBmbGFncyAqLworCXN0cnVjdCBwbnBfZG1hICpuZXh0OwkvKiBuZXh0IHBvcnQgKi8KIH07CiAKIHN0cnVjdCBwbnBfbWVtIHsKLQl1bnNpZ25lZCBpbnQgbWluOwkJLyogbWluIGJhc2UgbnVtYmVyICovCi0JdW5zaWduZWQgaW50IG1heDsJCS8qIG1heCBiYXNlIG51bWJlciAqLwotCXVuc2lnbmVkIGludCBhbGlnbjsJCS8qIGFsaWduIGJvdW5kYXJ5ICovCi0JdW5zaWduZWQgaW50IHNpemU7CQkvKiBzaXplIG9mIHJhbmdlICovCi0JdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIG1lbW9yeSBmbGFncyAqLwotCXVuc2lnbmVkIGNoYXIgcGFkOwkJLyogcGFkICovCi0Jc3RydWN0IHBucF9tZW0gKm5leHQ7CQkvKiBuZXh0IG1lbW9yeSByZXNvdXJjZSAqLworCXVuc2lnbmVkIGludCBtaW47CS8qIG1pbiBiYXNlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBtYXg7CS8qIG1heCBiYXNlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBhbGlnbjsJLyogYWxpZ24gYm91bmRhcnkgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogc2l6ZSBvZiByYW5nZSAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIG1lbW9yeSBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgcGFkOwkvKiBwYWQgKi8KKwlzdHJ1Y3QgcG5wX21lbSAqbmV4dDsJLyogbmV4dCBtZW1vcnkgcmVzb3VyY2UgKi8KIH07CiAKICNkZWZpbmUgUE5QX1JFU19QUklPUklUWV9QUkVGRVJSRUQJMApAQCAtMTI3LDcgKzEyNSw2IEBACiAJc3RydWN0IHJlc291cmNlIGlycV9yZXNvdXJjZVtQTlBfTUFYX0lSUV07CiB9OwogCi0KIC8qCiAgKiBEZXZpY2UgTWFuYWdlbW50CiAgKi8KQEAgLTEzOSwxNCArMTM2LDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwcm90b2NvbF9saXN0OwkvKiBub2RlIGluIHByb3RvY29sJ3MgbGlzdCBvZiBjYXJkcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlczsJLyogZGV2aWNlcyBhdHRhY2hlZCB0byB0aGUgY2FyZCAqLwogCi0Jc3RydWN0IHBucF9wcm90b2NvbCAqIHByb3RvY29sOwotCXN0cnVjdCBwbnBfaWQgKiBpZDsJCS8qIGNvbnRhaW5zIHN1cHBvcnRlZCBFSVNBIElEcyovCisJc3RydWN0IHBucF9wcm90b2NvbCAqcHJvdG9jb2w7CisJc3RydWN0IHBucF9pZCAqaWQ7CQkvKiBjb250YWlucyBzdXBwb3J0ZWQgRUlTQSBJRHMgKi8KIAogCWNoYXIgbmFtZVtQTlBfTkFNRV9MRU5dOwkvKiBjb250YWlucyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgKi8KLQl1bnNpZ25lZCBjaGFyCXBucHZlcjsJCS8qIFBsdWcgJiBQbGF5IHZlcnNpb24gKi8KLQl1bnNpZ25lZCBjaGFyCXByb2R1Y3R2ZXI7CS8qIHByb2R1Y3QgdmVyc2lvbiAqLwotCXVuc2lnbmVkIGludAlzZXJpYWw7CQkvKiBzZXJpYWwgbnVtYmVyICovCi0JdW5zaWduZWQgY2hhcgljaGVja3N1bTsJLyogaWYgemVybyAtIGNoZWNrc3VtIHBhc3NlZCAqLworCXVuc2lnbmVkIGNoYXIgcG5wdmVyOwkJLyogUGx1ZyAmIFBsYXkgdmVyc2lvbiAqLworCXVuc2lnbmVkIGNoYXIgcHJvZHVjdHZlcjsJLyogcHJvZHVjdCB2ZXJzaW9uICovCisJdW5zaWduZWQgaW50IHNlcmlhbDsJCS8qIHNlcmlhbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOwkJLyogaWYgemVybyAtIGNoZWNrc3VtIHBhc3NlZCAqLwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY2RpcjsJLyogZGlyZWN0b3J5IGVudHJ5IGluIC9wcm9jL2J1cy9pc2FwbnAgKi8KIH07CiAKQEAgLTE1OSwxOCArMTU2LDE4IEBACiAJKGNhcmQpID0gZ2xvYmFsX3RvX3BucF9jYXJkKChjYXJkKS0+Z2xvYmFsX2xpc3QubmV4dCkpCiAKIHN0cnVjdCBwbnBfY2FyZF9saW5rIHsKLQlzdHJ1Y3QgcG5wX2NhcmQgKiBjYXJkOwotCXN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKiBkcml2ZXI7Ci0Jdm9pZCAqIGRyaXZlcl9kYXRhOworCXN0cnVjdCBwbnBfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7CiAJcG1fbWVzc2FnZV90IHBtX3N0YXRlOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkICpwbnBfZ2V0X2NhcmRfZHJ2ZGF0YSAoc3RydWN0IHBucF9jYXJkX2xpbmsgKnBjYXJkKQorc3RhdGljIGlubGluZSB2b2lkICpwbnBfZ2V0X2NhcmRfZHJ2ZGF0YShzdHJ1Y3QgcG5wX2NhcmRfbGluayAqcGNhcmQpCiB7CiAJcmV0dXJuIHBjYXJkLT5kcml2ZXJfZGF0YTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBucF9zZXRfY2FyZF9kcnZkYXRhIChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqcGNhcmQsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW5saW5lIHZvaWQgcG5wX3NldF9jYXJkX2RydmRhdGEoc3RydWN0IHBucF9jYXJkX2xpbmsgKnBjYXJkLCB2b2lkICpkYXRhKQogewogCXBjYXJkLT5kcml2ZXJfZGF0YSA9IGRhdGE7CiB9CkBAIC0xODYsMjIgKzE4MywyMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgY2FyZF9saXN0OwkvKiBub2RlIGluIGNhcmQncyBsaXN0IG9mIGRldmljZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHJkZXZfbGlzdDsJLyogbm9kZSBpbiBjYXJkcyBsaXN0IG9mIHJlcXVlc3RlZCBkZXZpY2VzICovCiAKLQlzdHJ1Y3QgcG5wX3Byb3RvY29sICogcHJvdG9jb2w7Ci0Jc3RydWN0IHBucF9jYXJkICogY2FyZDsJCS8qIGNhcmQgdGhlIGRldmljZSBpcyBhdHRhY2hlZCB0bywgbm9uZSBpZiBOVUxMICovCi0Jc3RydWN0IHBucF9kcml2ZXIgKiBkcml2ZXI7Ci0Jc3RydWN0IHBucF9jYXJkX2xpbmsgKiBjYXJkX2xpbms7CisJc3RydWN0IHBucF9wcm90b2NvbCAqcHJvdG9jb2w7CisJc3RydWN0IHBucF9jYXJkICpjYXJkOwkvKiBjYXJkIHRoZSBkZXZpY2UgaXMgYXR0YWNoZWQgdG8sIG5vbmUgaWYgTlVMTCAqLworCXN0cnVjdCBwbnBfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmRfbGluazsKIAotCXN0cnVjdCBwbnBfaWQJKiBpZDsJLyogc3VwcG9ydGVkIEVJU0EgSURzKi8KKwlzdHJ1Y3QgcG5wX2lkICppZDsJCS8qIHN1cHBvcnRlZCBFSVNBIElEcyAqLwogCiAJaW50IGFjdGl2ZTsKIAlpbnQgY2FwYWJpbGl0aWVzOwotCXN0cnVjdCBwbnBfb3B0aW9uICogaW5kZXBlbmRlbnQ7Ci0Jc3RydWN0IHBucF9vcHRpb24gKiBkZXBlbmRlbnQ7CisJc3RydWN0IHBucF9vcHRpb24gKmluZGVwZW5kZW50OworCXN0cnVjdCBwbnBfb3B0aW9uICpkZXBlbmRlbnQ7CiAJc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSByZXM7CiAKIAljaGFyIG5hbWVbUE5QX05BTUVfTEVOXTsJLyogY29udGFpbnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lICovCi0JdW5zaWduZWQgc2hvcnQJcmVnczsJCS8qIElTQVBuUDogc3VwcG9ydGVkIHJlZ2lzdGVycyAqLwotCWludCAJCWZsYWdzOwkJLyogdXNlZCBieSBwcm90b2NvbHMgKi8KKwl1bnNpZ25lZCBzaG9ydCByZWdzOwkJLyogSVNBUG5QOiBzdXBwb3J0ZWQgcmVnaXN0ZXJzICovCisJaW50IGZsYWdzOwkJCS8qIHVzZWQgYnkgcHJvdG9jb2xzICovCiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jZW50OwkvKiBkZXZpY2UgZW50cnkgaW4gL3Byb2MvYnVzL2lzYXBucCAqLwogCXZvaWQgKmRhdGE7CiB9OwpAQCAtMjIwLDE5ICsyMTcsMTkgQEAKIAkoZGV2KSA9IGNhcmRfdG9fcG5wX2RldigoZGV2KS0+Y2FyZF9saXN0Lm5leHQpKQogI2RlZmluZSBwbnBfZGV2X25hbWUoZGV2KSAoZGV2KS0+bmFtZQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnBucF9nZXRfZHJ2ZGF0YSAoc3RydWN0IHBucF9kZXYgKnBkZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgKnBucF9nZXRfZHJ2ZGF0YShzdHJ1Y3QgcG5wX2RldiAqcGRldikKIHsKIAlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX3NldF9kcnZkYXRhIChzdHJ1Y3QgcG5wX2RldiAqcGRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbnBfc2V0X2RydmRhdGEoc3RydWN0IHBucF9kZXYgKnBkZXYsIHZvaWQgKmRhdGEpCiB7CiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRhdGEpOwogfQogCiBzdHJ1Y3QgcG5wX2ZpeHVwIHsKIAljaGFyIGlkWzddOwotCXZvaWQgKCpxdWlya19mdW5jdGlvbikoc3RydWN0IHBucF9kZXYgKmRldik7CS8qIGZpeHVwIGZ1bmN0aW9uICovCisJdm9pZCAoKnF1aXJrX2Z1bmN0aW9uKSAoc3RydWN0IHBucF9kZXYgKiBkZXYpOwkvKiBmaXh1cCBmdW5jdGlvbiAqLwogfTsKIAogLyogY29uZmlnIHBhcmFtZXRlcnMgKi8KQEAgLTI2OSw3ICsyNjYsNiBAQAogI2RlZmluZSBwbnBfZGV2aWNlX2lzX3BucGJpb3MoZGV2KSAwCiAjZW5kaWYKIAotCiAvKiBzdGF0dXMgKi8KICNkZWZpbmUgUE5QX1JFQURZCQkweDAwMDAKICNkZWZpbmUgUE5QX0FUVEFDSEVECQkweDAwMDEKQEAgLTI4NywxNyArMjgzLDE3IEBACiAKIHN0cnVjdCBwbnBfaWQgewogCWNoYXIgaWRbUE5QX0lEX0xFTl07Ci0Jc3RydWN0IHBucF9pZCAqIG5leHQ7CisJc3RydWN0IHBucF9pZCAqbmV4dDsKIH07CiAKIHN0cnVjdCBwbnBfZHJpdmVyIHsKLQljaGFyICogbmFtZTsKKwljaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICppZF90YWJsZTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JaW50ICAoKnByb2JlKSAgKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpOworCWludCAoKnByb2JlKSAoc3RydWN0IHBucF9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCk7CiAJdm9pZCAoKnJlbW92ZSkgKHN0cnVjdCBwbnBfZGV2ICpkZXYpOwotCWludCAgKCpzdXNwZW5kKSAoc3RydWN0IHBucF9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQlpbnQgICgqcmVzdW1lKSAoc3RydWN0IHBucF9kZXYgKmRldik7CisJaW50ICgqc3VzcGVuZCkgKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKSAoc3RydWN0IHBucF9kZXYgKmRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOwogfTsKIApAQCAtMzA1LDEzICszMDEsMTQgQEAKIAogc3RydWN0IHBucF9jYXJkX2RyaXZlciB7CiAJc3RydWN0IGxpc3RfaGVhZCBnbG9iYWxfbGlzdDsKLQljaGFyICogbmFtZTsKKwljaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmlkX3RhYmxlOwogCXVuc2lnbmVkIGludCBmbGFnczsKLQlpbnQgICgqcHJvYmUpICAoc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQsIGNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmNhcmRfaWQpOworCWludCAoKnByb2JlKSAoc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmNhcmRfaWQpOwogCXZvaWQgKCpyZW1vdmUpIChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2FyZCk7Ci0JaW50ICAoKnN1c3BlbmQpIChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQlpbnQgICgqcmVzdW1lKSAoc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQpOworCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2FyZCk7CiAJc3RydWN0IHBucF9kcml2ZXIgbGluazsKIH07CiAKQEAgLTMyMSwyNSArMzE4LDI4IEBACiAjZGVmaW5lIFBOUF9EUklWRVJfUkVTX0RPX05PVF9DSEFOR0UJMHgwMDAxCS8qIGRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UgKi8KICNkZWZpbmUgUE5QX0RSSVZFUl9SRVNfRElTQUJMRQkJMHgwMDAzCS8qIGVuc3VyZSB0aGUgZGV2aWNlIGlzIGRpc2FibGVkICovCiAKLQogLyoKICAqIFByb3RvY29sIE1hbmFnZW1lbnQKICAqLwogCiBzdHJ1Y3QgcG5wX3Byb3RvY29sIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXByb3RvY29sX2xpc3Q7Ci0JY2hhcgkJICAgICAgKiBuYW1lOworCXN0cnVjdCBsaXN0X2hlYWQgcHJvdG9jb2xfbGlzdDsKKwljaGFyICpuYW1lOwogCiAJLyogcmVzb3VyY2UgY29udHJvbCBmdW5jdGlvbnMgKi8KLQlpbnQgKCpnZXQpKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcyk7Ci0JaW50ICgqc2V0KShzdHJ1Y3QgcG5wX2RldiAqZGV2LCBzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMpOwotCWludCAoKmRpc2FibGUpKHN0cnVjdCBwbnBfZGV2ICpkZXYpOworCWludCAoKmdldCkgKHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcyk7CisJaW50ICgqc2V0KSAoc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzKTsKKwlpbnQgKCpkaXNhYmxlKSAoc3RydWN0IHBucF9kZXYgKmRldik7CisKKwkvKiBwcm90b2NvbCBzcGVjaWZpYyBzdXNwZW5kL3Jlc3VtZSAqLworCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgcG5wX2RldiAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgcG5wX2RldiAqIGRldik7CiAKIAkvKiB1c2VkIGJ5IHBucCBsYXllciBvbmx5IChsb29rIGJ1dCBkb24ndCB0b3VjaCkgKi8KLQl1bnNpZ25lZCBjaGFyCQludW1iZXI7CQkvKiBwcm90b2NvbCBudW1iZXIqLwotCXN0cnVjdCBkZXZpY2UJCWRldjsJCS8qIGxpbmsgdG8gZHJpdmVyIG1vZGVsICovCi0Jc3RydWN0IGxpc3RfaGVhZAljYXJkczsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWRldmljZXM7CisJdW5zaWduZWQgY2hhciBudW1iZXI7CS8qIHByb3RvY29sIG51bWJlciAqLworCXN0cnVjdCBkZXZpY2UgZGV2OwkvKiBsaW5rIHRvIGRyaXZlciBtb2RlbCAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2FyZHM7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOwogfTsKIAogI2RlZmluZSB0b19wbnBfcHJvdG9jb2wobikgbGlzdF9lbnRyeShuLCBzdHJ1Y3QgcG5wX3Byb3RvY29sLCBwcm90b2NvbF9saXN0KQpAQCAtMzUyLDcgKzM1Miw2IEBACiAJKGRldikgIT0gcHJvdG9jb2xfdG9fcG5wX2RldigmKHByb3RvY29sKS0+ZGV2aWNlcyk7IFwKIAkoZGV2KSA9IHByb3RvY29sX3RvX3BucF9kZXYoKGRldiktPnByb3RvY29sX2xpc3QubmV4dCkpCiAKLQogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwbnBfYnVzX3R5cGU7CiAKICNpZiBkZWZpbmVkKENPTkZJR19QTlApCkBAIC0zNzIsMjEgKzM3MSwyNSBAQAogaW50IHBucF9hZGRfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9jYXJkICpjYXJkLCBzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKIHZvaWQgcG5wX3JlbW92ZV9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKIGludCBwbnBfYWRkX2NhcmRfaWQoc3RydWN0IHBucF9pZCAqaWQsIHN0cnVjdCBwbnBfY2FyZCAqY2FyZCk7Ci1zdHJ1Y3QgcG5wX2RldiAqIHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpjbGluaywgY29uc3QgY2hhciAqIGlkLCBzdHJ1Y3QgcG5wX2RldiAqIGZyb20pOwotdm9pZCBwbnBfcmVsZWFzZV9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqIGRldik7Ci1pbnQgcG5wX3JlZ2lzdGVyX2NhcmRfZHJpdmVyKHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKiBkcnYpOwotdm9pZCBwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcihzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICogZHJ2KTsKK3N0cnVjdCBwbnBfZGV2ICpwbnBfcmVxdWVzdF9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2NhcmRfbGluayAqY2xpbmssCisJCQkJCWNvbnN0IGNoYXIgKmlkLCBzdHJ1Y3QgcG5wX2RldiAqZnJvbSk7Cit2b2lkIHBucF9yZWxlYXNlX2NhcmRfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYpOworaW50IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcihzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICpkcnYpOwordm9pZCBwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcihzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICpkcnYpOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcG5wX2NhcmRzOwogCiAvKiByZXNvdXJjZSBtYW5hZ2VtZW50ICovCi1zdHJ1Y3QgcG5wX29wdGlvbiAqIHBucF9yZWdpc3Rlcl9pbmRlcGVuZGVudF9vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldik7Ci1zdHJ1Y3QgcG5wX29wdGlvbiAqIHBucF9yZWdpc3Rlcl9kZXBlbmRlbnRfb3B0aW9uKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGludCBwcmlvcml0eSk7CitzdHJ1Y3QgcG5wX29wdGlvbiAqcG5wX3JlZ2lzdGVyX2luZGVwZW5kZW50X29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKK3N0cnVjdCBwbnBfb3B0aW9uICpwbnBfcmVnaXN0ZXJfZGVwZW5kZW50X29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2LAorCQkJCQkJIGludCBwcmlvcml0eSk7CiBpbnQgcG5wX3JlZ2lzdGVyX2lycV9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgcG5wX2lycSAqZGF0YSk7CiBpbnQgcG5wX3JlZ2lzdGVyX2RtYV9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgcG5wX2RtYSAqZGF0YSk7Ci1pbnQgcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uoc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwgc3RydWN0IHBucF9wb3J0ICpkYXRhKTsKK2ludCBwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAorCQkJICAgICAgIHN0cnVjdCBwbnBfcG9ydCAqZGF0YSk7CiBpbnQgcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLCBzdHJ1Y3QgcG5wX21lbSAqZGF0YSk7CiB2b2lkIHBucF9pbml0X3Jlc291cmNlX3RhYmxlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnRhYmxlKTsKLWludCBwbnBfbWFudWFsX2NvbmZpZ19kZXYoc3RydWN0IHBucF9kZXYgKmRldiwgc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLCBpbnQgbW9kZSk7CitpbnQgcG5wX21hbnVhbF9jb25maWdfZGV2KHN0cnVjdCBwbnBfZGV2ICpkZXYsIHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywKKwkJCSAgaW50IG1vZGUpOwogaW50IHBucF9hdXRvX2NvbmZpZ19kZXYoc3RydWN0IHBucF9kZXYgKmRldik7CiBpbnQgcG5wX3ZhbGlkYXRlX2NvbmZpZyhzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKIGludCBwbnBfc3RhcnRfZGV2KHN0cnVjdCBwbnBfZGV2ICpkZXYpOwpAQCAtMzk0LDExICszOTcsMTEgQEAKIGludCBwbnBfYWN0aXZhdGVfZGV2KHN0cnVjdCBwbnBfZGV2ICpkZXYpOwogaW50IHBucF9kaXNhYmxlX2RldihzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKIHZvaWQgcG5wX3Jlc291cmNlX2NoYW5nZShzdHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlLCByZXNvdXJjZV9zaXplX3Qgc3RhcnQsCi0JCQkJcmVzb3VyY2Vfc2l6ZV90IHNpemUpOworCQkJIHJlc291cmNlX3NpemVfdCBzaXplKTsKIAogLyogcHJvdG9jb2wgaGVscGVycyAqLwotaW50IHBucF9pc19hY3RpdmUoc3RydWN0IHBucF9kZXYgKiBkZXYpOwotaW50IGNvbXBhcmVfcG5wX2lkKHN0cnVjdCBwbnBfaWQgKiBwb3MsIGNvbnN0IGNoYXIgKiBpZCk7CitpbnQgcG5wX2lzX2FjdGl2ZShzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKK2ludCBjb21wYXJlX3BucF9pZChzdHJ1Y3QgcG5wX2lkICpwb3MsIGNvbnN0IGNoYXIgKmlkKTsKIGludCBwbnBfYWRkX2lkKHN0cnVjdCBwbnBfaWQgKmlkLCBzdHJ1Y3QgcG5wX2RldiAqZGV2KTsKIGludCBwbnBfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwbnBfZHJpdmVyICpkcnYpOwogdm9pZCBwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBucF9kcml2ZXIgKmRydik7CkBAIC00MTEsMjMgKzQxNCwyNCBAQAogc3RhdGljIGlubGluZSBpbnQgcG5wX2luaXRfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9hZGRfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9kZXZpY2VfYXR0YWNoKHN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2KSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX2RldmljZV9kZXRhY2goc3RydWN0IHBucF9kZXYgKnBucF9kZXYpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG5wX2RldmljZV9kZXRhY2goc3RydWN0IHBucF9kZXYgKnBucF9kZXYpIHsgfQorCiAjZGVmaW5lIHBucF9wbGF0Zm9ybV9kZXZpY2VzIDAKIAogLyogbXVsdGlkZXZpY2UgY2FyZCBzdXBwb3J0ICovCiBzdGF0aWMgaW5saW5lIGludCBwbnBfYWRkX2NhcmQoc3RydWN0IHBucF9jYXJkICpjYXJkKSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX3JlbW92ZV9jYXJkKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkgeyA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwbnBfcmVtb3ZlX2NhcmQoc3RydWN0IHBucF9jYXJkICpjYXJkKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9hZGRfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9jYXJkICpjYXJkLCBzdHJ1Y3QgcG5wX2RldiAqZGV2KSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX3JlbW92ZV9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIHBucF9yZW1vdmVfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikgeyB9CiBzdGF0aWMgaW5saW5lIGludCBwbnBfYWRkX2NhcmRfaWQoc3RydWN0IHBucF9pZCAqaWQsIHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkgeyByZXR1cm4gLUVOT0RFVjsgfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5wX2RldiAqIHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpjbGluaywgY29uc3QgY2hhciAqIGlkLCBzdHJ1Y3QgcG5wX2RldiAqIGZyb20pIHsgcmV0dXJuIE5VTEw7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwbnBfcmVsZWFzZV9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqIGRldikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcihzdHJ1Y3QgcG5wX2NhcmRfZHJpdmVyICogZHJ2KSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoc3RydWN0IHBucF9jYXJkX2RyaXZlciAqIGRydikgeyA7IH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBucF9kZXYgKnBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpjbGluaywgY29uc3QgY2hhciAqaWQsIHN0cnVjdCBwbnBfZGV2ICpmcm9tKSB7IHJldHVybiBOVUxMOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikgeyB9CitzdGF0aWMgaW5saW5lIGludCBwbnBfcmVnaXN0ZXJfY2FyZF9kcml2ZXIoc3RydWN0IHBucF9jYXJkX2RyaXZlciAqZHJ2KSB7IHJldHVybiAtRU5PREVWOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoc3RydWN0IHBucF9jYXJkX2RyaXZlciAqZHJ2KSB7IH0KIAogLyogcmVzb3VyY2UgbWFuYWdlbWVudCAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5wX29wdGlvbiAqIHBucF9yZWdpc3Rlcl9pbmRlcGVuZGVudF9vcHRpb24oc3RydWN0IHBucF9kZXYgKmRldikgeyByZXR1cm4gTlVMTDsgfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5wX29wdGlvbiAqIHBucF9yZWdpc3Rlcl9kZXBlbmRlbnRfb3B0aW9uKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGludCBwcmlvcml0eSkgeyByZXR1cm4gTlVMTDsgfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5wX29wdGlvbiAqcG5wX3JlZ2lzdGVyX2luZGVwZW5kZW50X29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2KSB7IHJldHVybiBOVUxMOyB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbnBfb3B0aW9uICpwbnBfcmVnaXN0ZXJfZGVwZW5kZW50X29wdGlvbihzdHJ1Y3QgcG5wX2RldiAqZGV2LCBpbnQgcHJpb3JpdHkpIHsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9yZWdpc3Rlcl9pcnFfcmVzb3VyY2Uoc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwgc3RydWN0IHBucF9pcnEgKmRhdGEpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9yZWdpc3Rlcl9kbWFfcmVzb3VyY2Uoc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwgc3RydWN0IHBucF9kbWEgKmRhdGEpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sIHN0cnVjdCBwbnBfcG9ydCAqZGF0YSkgeyByZXR1cm4gLUVOT0RFVjsgfQpAQCAtNDQwLDIwICs0NDQsMTcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHBucF9zdG9wX2RldihzdHJ1Y3QgcG5wX2RldiAqZGV2KSB7IHJldHVybiAtRU5PREVWOyB9CiBzdGF0aWMgaW5saW5lIGludCBwbnBfYWN0aXZhdGVfZGV2KHN0cnVjdCBwbnBfZGV2ICpkZXYpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBucF9kaXNhYmxlX2RldihzdHJ1Y3QgcG5wX2RldiAqZGV2KSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX3Jlc291cmNlX2NoYW5nZShzdHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsCi0JCQkJCXJlc291cmNlX3NpemVfdCBzaXplKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwbnBfcmVzb3VyY2VfY2hhbmdlKHN0cnVjdCByZXNvdXJjZSAqcmVzb3VyY2UsIHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IHNpemUpIHsgfQogCiAvKiBwcm90b2NvbCBoZWxwZXJzICovCi1zdGF0aWMgaW5saW5lIGludCBwbnBfaXNfYWN0aXZlKHN0cnVjdCBwbnBfZGV2ICogZGV2KSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBjb21wYXJlX3BucF9pZChzdHJ1Y3QgcG5wX2lkICogcG9zLCBjb25zdCBjaGFyICogaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHBucF9pc19hY3RpdmUoc3RydWN0IHBucF9kZXYgKmRldikgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9wbnBfaWQoc3RydWN0IHBucF9pZCAqcG9zLCBjb25zdCBjaGFyICppZCkgeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSBpbnQgcG5wX2FkZF9pZChzdHJ1Y3QgcG5wX2lkICppZCwgc3RydWN0IHBucF9kZXYgKmRldikgeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSBpbnQgcG5wX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcG5wX2RyaXZlciAqZHJ2KSB7IHJldHVybiAtRU5PREVWOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcG5wX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwbnBfZHJpdmVyICpkcnYpIHsgOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG5wX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwbnBfZHJpdmVyICpkcnYpIHsgfQogCiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCi0KICNkZWZpbmUgcG5wX2Vycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSICJwbnA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAjZGVmaW5lIHBucF9pbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICJwbnA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCiAjZGVmaW5lIHBucF93YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJwbnA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BucGJpb3MuaCBiL2luY2x1ZGUvbGludXgvcG5wYmlvcy5oCmluZGV4IDBhMjgyYWMuLjMyOTE5MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG5wYmlvcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcG5wYmlvcy5oCkBAIC05OSwzMiArOTksMzIgQEAKIAogI3ByYWdtYSBwYWNrKDEpCiBzdHJ1Y3QgcG5wX2Rldl9ub2RlX2luZm8gewotCV9fdTE2CW5vX25vZGVzOwotCV9fdTE2CW1heF9ub2RlX3NpemU7CisJX191MTYgbm9fbm9kZXM7CisJX191MTYgbWF4X25vZGVfc2l6ZTsKIH07CiBzdHJ1Y3QgcG5wX2RvY2tpbmdfc3RhdGlvbl9pbmZvIHsKLQlfX3UzMglsb2NhdGlvbl9pZDsKLQlfX3UzMglzZXJpYWw7Ci0JX191MTYJY2FwYWJpbGl0aWVzOworCV9fdTMyIGxvY2F0aW9uX2lkOworCV9fdTMyIHNlcmlhbDsKKwlfX3UxNiBjYXBhYmlsaXRpZXM7CiB9Owogc3RydWN0IHBucF9pc2FfY29uZmlnX3N0cnVjIHsKLQlfX3U4CXJldmlzaW9uOwotCV9fdTgJbm9fY3NuczsKLQlfX3UxNglpc2FfcmRfZGF0YV9wb3J0OwotCV9fdTE2CXJlc2VydmVkOworCV9fdTggcmV2aXNpb247CisJX191OCBub19jc25zOworCV9fdTE2IGlzYV9yZF9kYXRhX3BvcnQ7CisJX191MTYgcmVzZXJ2ZWQ7CiB9Owogc3RydWN0IGVzY2RfaW5mb19zdHJ1YyB7Ci0JX191MTYJbWluX2VzY2Rfd3JpdGVfc2l6ZTsKLQlfX3UxNgllc2NkX3NpemU7Ci0JX191MzIJbnZfc3RvcmFnZV9iYXNlOworCV9fdTE2IG1pbl9lc2NkX3dyaXRlX3NpemU7CisJX191MTYgZXNjZF9zaXplOworCV9fdTMyIG52X3N0b3JhZ2VfYmFzZTsKIH07CiBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSB7Ci0JX191MTYJc2l6ZTsKLQlfX3U4CWhhbmRsZTsKLQlfX3UzMgllaXNhX2lkOwotCV9fdTgJdHlwZV9jb2RlWzNdOwotCV9fdTE2CWZsYWdzOwotCV9fdTgJZGF0YVswXTsKKwlfX3UxNiBzaXplOworCV9fdTggaGFuZGxlOworCV9fdTMyIGVpc2FfaWQ7CisJX191OCB0eXBlX2NvZGVbM107CisJX191MTYgZmxhZ3M7CisJX191OCBkYXRhWzBdOwogfTsKICNwcmFnbWEgcGFjaygpCiAKQEAgLTEzMywyMiArMTMzLDE2IEBACiAvKiBub24tZXhwb3J0ZWQgKi8KIGV4dGVybiBzdHJ1Y3QgcG5wX2Rldl9ub2RlX2luZm8gbm9kZV9pbmZvOwogCi1leHRlcm4gaW50IHBucF9iaW9zX2Rldl9ub2RlX2luZm8gKHN0cnVjdCBwbnBfZGV2X25vZGVfaW5mbyAqZGF0YSk7Ci1leHRlcm4gaW50IHBucF9iaW9zX2dldF9kZXZfbm9kZSAodTggKm5vZGVudW0sIGNoYXIgY29uZmlnLCBzdHJ1Y3QgcG5wX2Jpb3Nfbm9kZSAqZGF0YSk7Ci1leHRlcm4gaW50IHBucF9iaW9zX3NldF9kZXZfbm9kZSAodTggbm9kZW51bSwgY2hhciBjb25maWcsIHN0cnVjdCBwbnBfYmlvc19ub2RlICpkYXRhKTsKLWV4dGVybiBpbnQgcG5wX2Jpb3NfZ2V0X3N0YXRfcmVzIChjaGFyICppbmZvKTsKLWV4dGVybiBpbnQgcG5wX2Jpb3NfaXNhcG5wX2NvbmZpZyAoc3RydWN0IHBucF9pc2FfY29uZmlnX3N0cnVjICpkYXRhKTsKLWV4dGVybiBpbnQgcG5wX2Jpb3NfZXNjZF9pbmZvIChzdHJ1Y3QgZXNjZF9pbmZvX3N0cnVjICpkYXRhKTsKLWV4dGVybiBpbnQgcG5wX2Jpb3NfcmVhZF9lc2NkIChjaGFyICpkYXRhLCB1MzIgbnZyYW1fYmFzZSk7CitleHRlcm4gaW50IHBucF9iaW9zX2Rldl9ub2RlX2luZm8oc3RydWN0IHBucF9kZXZfbm9kZV9pbmZvICpkYXRhKTsKK2V4dGVybiBpbnQgcG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKHU4ICpub2RlbnVtLCBjaGFyIGNvbmZpZywKKwkJCQkgc3RydWN0IHBucF9iaW9zX25vZGUgKmRhdGEpOworZXh0ZXJuIGludCBwbnBfYmlvc19zZXRfZGV2X25vZGUodTggbm9kZW51bSwgY2hhciBjb25maWcsCisJCQkJIHN0cnVjdCBwbnBfYmlvc19ub2RlICpkYXRhKTsKK2V4dGVybiBpbnQgcG5wX2Jpb3NfZ2V0X3N0YXRfcmVzKGNoYXIgKmluZm8pOworZXh0ZXJuIGludCBwbnBfYmlvc19pc2FwbnBfY29uZmlnKHN0cnVjdCBwbnBfaXNhX2NvbmZpZ19zdHJ1YyAqZGF0YSk7CitleHRlcm4gaW50IHBucF9iaW9zX2VzY2RfaW5mbyhzdHJ1Y3QgZXNjZF9pbmZvX3N0cnVjICpkYXRhKTsKK2V4dGVybiBpbnQgcG5wX2Jpb3NfcmVhZF9lc2NkKGNoYXIgKmRhdGEsIHUzMiBudnJhbV9iYXNlKTsKIGV4dGVybiBpbnQgcG5wX2Jpb3NfZG9ja19zdGF0aW9uX2luZm8oc3RydWN0IHBucF9kb2NraW5nX3N0YXRpb25faW5mbyAqZGF0YSk7Ci0jZGVmaW5lIG5lZWRlZCAwCi0jaWYgbmVlZGVkCi1leHRlcm4gaW50IHBucF9iaW9zX2dldF9ldmVudCAodTE2ICptZXNzYWdlKTsKLWV4dGVybiBpbnQgcG5wX2Jpb3Nfc2VuZF9tZXNzYWdlICh1MTYgbWVzc2FnZSk7Ci1leHRlcm4gaW50IHBucF9iaW9zX3NldF9zdGF0X3JlcyAoY2hhciAqaW5mbyk7Ci1leHRlcm4gaW50IHBucF9iaW9zX2FwbV9pZF90YWJsZSAoY2hhciAqdGFibGUsIHUxNiAqc2l6ZSk7Ci1leHRlcm4gaW50IHBucF9iaW9zX3dyaXRlX2VzY2QgKGNoYXIgKmRhdGEsIHUzMiBudnJhbV9iYXNlKTsKLSNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX1BOUEJJT1MgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmVlbXB0LmggYi9pbmNsdWRlL2xpbnV4L3ByZWVtcHQuaAppbmRleCBkMDkyNmQ2Li40ODQ5ODhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByZWVtcHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ByZWVtcHQuaApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2lmZGVmIENPTkZJR19ERUJVR19QUkVFTVBUCiAgIGV4dGVybiB2b2lkIGZhc3RjYWxsIGFkZF9wcmVlbXB0X2NvdW50KGludCB2YWwpOwpAQCAtNjAsNCArNjEsNDcgQEAKIAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKKworc3RydWN0IHByZWVtcHRfbm90aWZpZXI7CisKKy8qKgorICogcHJlZW1wdF9vcHMgLSBub3RpZmllcnMgY2FsbGVkIHdoZW4gYSB0YXNrIGlzIHByZWVtcHRlZCBhbmQgcmVzY2hlZHVsZWQKKyAqIEBzY2hlZF9pbjogd2UncmUgYWJvdXQgdG8gYmUgcmVzY2hlZHVsZWQ6CisgKiAgICBub3RpZmllcjogc3RydWN0IHByZWVtcHRfbm90aWZpZXIgZm9yIHRoZSB0YXNrIGJlaW5nIHNjaGVkdWxlZAorICogICAgY3B1OiAgY3B1IHdlJ3JlIHNjaGVkdWxlZCBvbgorICogQHNjaGVkX291dDogd2UndmUganVzdCBiZWVuIHByZWVtcHRlZAorICogICAgbm90aWZpZXI6IHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyIGZvciB0aGUgdGFzayBiZWluZyBwcmVlbXB0ZWQKKyAqICAgIG5leHQ6IHRoZSB0YXNrIHRoYXQncyBraWNraW5nIHVzIG91dAorICovCitzdHJ1Y3QgcHJlZW1wdF9vcHMgeworCXZvaWQgKCpzY2hlZF9pbikoc3RydWN0IHByZWVtcHRfbm90aWZpZXIgKm5vdGlmaWVyLCBpbnQgY3B1KTsKKwl2b2lkICgqc2NoZWRfb3V0KShzdHJ1Y3QgcHJlZW1wdF9ub3RpZmllciAqbm90aWZpZXIsCisJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7Cit9OworCisvKioKKyAqIHByZWVtcHRfbm90aWZpZXIgLSBrZXkgZm9yIGluc3RhbGxpbmcgcHJlZW1wdGlvbiBub3RpZmllcnMKKyAqIEBsaW5rOiBpbnRlcm5hbCB1c2UKKyAqIEBvcHM6IGRlZmluZXMgdGhlIG5vdGlmaWVyIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQKKyAqCisgKiBVc3VhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjb250YWluZXJfb2YoKS4KKyAqLworc3RydWN0IHByZWVtcHRfbm90aWZpZXIgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpbms7CisJc3RydWN0IHByZWVtcHRfb3BzICpvcHM7Cit9OworCit2b2lkIHByZWVtcHRfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IHByZWVtcHRfbm90aWZpZXIgKm5vdGlmaWVyKTsKK3ZvaWQgcHJlZW1wdF9ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVlbXB0X25vdGlmaWVyX2luaXQoc3RydWN0IHByZWVtcHRfbm90aWZpZXIgKm5vdGlmaWVyLAorCQkJCSAgICAgc3RydWN0IHByZWVtcHRfb3BzICpvcHMpCit7CisJSU5JVF9ITElTVF9OT0RFKCZub3RpZmllci0+bGluayk7CisJbm90aWZpZXItPm9wcyA9IG9wczsKK30KKworI2VuZGlmCisKICNlbmRpZiAvKiBfX0xJTlVYX1BSRUVNUFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKaW5kZXggMjhhYzYzMi4uZGNiNzI5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCkBAIC0yMjcsNyArMjI3LDcgQEAKIAl1bnNpZ25lZCBpbnQJCQlzYWZlbW9kZV9kZWxheTsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJc2FmZW1vZGVfdGltZXI7CiAJYXRvbWljX3QJCQl3cml0ZXNfcGVuZGluZzsgCi0JcmVxdWVzdF9xdWV1ZV90CQkJKnF1ZXVlOwkvKiBmb3IgcGx1Z2dpbmcgLi4uICovCisJc3RydWN0IHJlcXVlc3RfcXVldWUJCSpxdWV1ZTsJLyogZm9yIHBsdWdnaW5nIC4uLiAqLwogCiAJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9iZWhpbmQ7IC8qIG91dHN0YW5kaW5nIGFzeW5jIElPICovCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBtYXhfd3JpdGVfYmVoaW5kOyAvKiAwID0gc3luYyAqLwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJaW50IGxldmVsOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQlpbnQgKCptYWtlX3JlcXVlc3QpKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKTsKKwlpbnQgKCptYWtlX3JlcXVlc3QpKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwogCWludCAoKnJ1bikobWRkZXZfdCAqbWRkZXYpOwogCWludCAoKnN0b3ApKG1kZGV2X3QgKm1kZGV2KTsKIAl2b2lkICgqc3RhdHVzKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbWRkZXZfdCAqbWRkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCmluZGV4IDk2NWQ1YjMuLjE4MGE5ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKQEAgLTgxLDE0ICs4MSwxNiBAQAogLyogYXNzZXJ0aW9ucyBoYW5kbGluZyAqLwogCiAvKiogYWx3YXlzIGNoZWNrIGEgY29uZGl0aW9uIGFuZCBwYW5pYyBpZiBpdCdzIGZhbHNlLiAqLwotI2RlZmluZSBSQVNTRVJUKCBjb25kLCBmb3JtYXQsIGFyZ3MuLi4gKQkJCQkJXAorI2RlZmluZSBfX1JBU1NFUlQoIGNvbmQsIHNjb25kLCBmb3JtYXQsIGFyZ3MuLi4gKQkJCQkJXAogaWYoICEoIGNvbmQgKSApIAkJCQkJCQkJXAotICByZWlzZXJmc19wYW5pYyggTlVMTCwgInJlaXNlcmZzWyVpXTogYXNzZXJ0aW9uICIgI2NvbmQgIiBmYWlsZWQgYXQgIglcCisgIHJlaXNlcmZzX3BhbmljKCBOVUxMLCAicmVpc2VyZnNbJWldOiBhc3NlcnRpb24gIiBzY29uZCAiIGZhaWxlZCBhdCAiCVwKIAkJICBfX0ZJTEVfXyAiOiVpOiVzOiAiIGZvcm1hdCAiXG4iLAkJXAogCQkgIGluX2ludGVycnVwdCgpID8gLTEgOiBjdXJyZW50IC0+IHBpZCwgX19MSU5FX18gLCBfX0ZVTkNUSU9OX18gLCAjI2FyZ3MgKQogCisjZGVmaW5lIFJBU1NFUlQoY29uZCwgZm9ybWF0LCBhcmdzLi4uKSBfX1JBU1NFUlQoY29uZCwgI2NvbmQsIGZvcm1hdCwgIyNhcmdzKQorCiAjaWYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX0NIRUNLICkKLSNkZWZpbmUgUkZBTFNFKCBjb25kLCBmb3JtYXQsIGFyZ3MuLi4gKSBSQVNTRVJUKCAhKCBjb25kICksIGZvcm1hdCwgIyNhcmdzICkKKyNkZWZpbmUgUkZBTFNFKGNvbmQsIGZvcm1hdCwgYXJncy4uLikgX19SQVNTRVJUKCEoY29uZCksICIhKCIgI2NvbmQgIikiLCBmb3JtYXQsICMjYXJncykKICNlbHNlCiAjZGVmaW5lIFJGQUxTRSggY29uZCwgZm9ybWF0LCBhcmdzLi4uICkgZG8gezt9IHdoaWxlKCAwICkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDMzYjliNDguLjJlNDkwMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTY4MSw3ICs2ODEsNyBAQAogI2RlZmluZSBTQ0hFRF9MT0FEX1NISUZUCTEwCiAjZGVmaW5lIFNDSEVEX0xPQURfU0NBTEUJKDFMIDw8IFNDSEVEX0xPQURfU0hJRlQpCiAKLSNkZWZpbmUgU0NIRURfTE9BRF9TQ0FMRV9GVVpaCShTQ0hFRF9MT0FEX1NDQUxFID4+IDUpCisjZGVmaW5lIFNDSEVEX0xPQURfU0NBTEVfRlVaWgkoU0NIRURfTE9BRF9TQ0FMRSA+PiAxKQogCiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBTRF9MT0FEX0JBTEFOQ0UJCTEJLyogRG8gbG9hZCBiYWxhbmNpbmcgb24gdGhpcyBkb21haW4uICovCkBAIC03ODYsNiArNzg2LDIyIEBACiAKICNlbmRpZgkvKiBDT05GSUdfU01QICovCiAKKy8qCisgKiBBIHJ1bnF1ZXVlIGxhZGVuIHdpdGggYSBzaW5nbGUgbmljZSAwIHRhc2sgc2NvcmVzIGEgd2VpZ2h0ZWRfY3B1bG9hZCBvZgorICogU0NIRURfTE9BRF9TQ0FMRS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgYW55IGNwdSBpcyBsYWRlbiB3aXRoIGEKKyAqIHRhc2sgb2YgbmljZSAwIG9yIGVub3VnaCBsb3dlciBwcmlvcml0eSB0YXNrcyB0byBicmluZyB1cCB0aGUKKyAqIHdlaWdodGVkX2NwdWxvYWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgYWJvdmVfYmFja2dyb3VuZF9sb2FkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAod2VpZ2h0ZWRfY3B1bG9hZChjcHUpID49IFNDSEVEX0xPQURfU0NBTEUpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CiAKIHN0cnVjdCBpb19jb250ZXh0OwkJCS8qIFNlZSBibGtkZXYuaCAqLwogc3RydWN0IGNwdXNldDsKQEAgLTkzNSw2ICs5NTEsMTEgQEAKIAlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnNjaGVkX2NsYXNzOwogCXN0cnVjdCBzY2hlZF9lbnRpdHkgc2U7CiAKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKKwkvKiBsaXN0IG9mIHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyOiAqLworCXN0cnVjdCBobGlzdF9oZWFkIHByZWVtcHRfbm90aWZpZXJzOworI2VuZGlmCisKIAl1bnNpZ25lZCBzaG9ydCBpb3ByaW87CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UKIAl1bnNpZ25lZCBpbnQgYnRyYWNlX3NlcTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCA4NTE4ZmEyLi5hZmUwZjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC0yMCw3ICsyMCw3IEBACiBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgewogCXVuc2lnbmVkIGxvbmcJaW9iYXNlOwkJLyogaW8gYmFzZSBhZGRyZXNzICovCiAJdm9pZCBfX2lvbWVtCSptZW1iYXNlOwkvKiBpb3JlbWFwIGNvb2tpZSBvciBOVUxMICovCi0JdW5zaWduZWQgbG9uZwltYXBiYXNlOwkvKiByZXNvdXJjZSBiYXNlICovCisJcmVzb3VyY2Vfc2l6ZV90CW1hcGJhc2U7CS8qIHJlc291cmNlIGJhc2UgKi8KIAl1bnNpZ25lZCBpbnQJaXJxOwkJLyogaW50ZXJydXB0IG51bWJlciAqLwogCXVuc2lnbmVkIGludAl1YXJ0Y2xrOwkvKiBVQVJUIGNsb2NrIHJhdGUgKi8KIAl1bnNpZ25lZCBjaGFyCXJlZ3NoaWZ0OwkvKiByZWdpc3RlciBzaGlmdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IDc3M2Q4ZDguLjA5ZDE3YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTI4OCw3ICsyODgsNyBAQAogCWNvbnN0IHN0cnVjdCB1YXJ0X29wcwkqb3BzOwogCXVuc2lnbmVkIGludAkJY3VzdG9tX2Rpdmlzb3I7CiAJdW5zaWduZWQgaW50CQlsaW5lOwkJCS8qIHBvcnQgaW5kZXggKi8KLQl1bnNpZ25lZCBsb25nCQltYXBiYXNlOwkJLyogZm9yIGlvcmVtYXAgKi8KKwlyZXNvdXJjZV9zaXplX3QJCW1hcGJhc2U7CQkvKiBmb3IgaW9yZW1hcCAqLwogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CQkJLyogcGFyZW50IGRldmljZSAqLwogCXVuc2lnbmVkIGNoYXIJCWh1YjY7CQkJLyogdGhpcyBzaG91bGQgYmUgaW4gdGhlIDgyNTAgZHJpdmVyICovCiAJdW5zaWduZWQgY2hhcgkJdW51c2VkWzNdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAppbmRleCBlOGU2ZGEzLi4zODhjYWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaApAQCAtMjQsNyArMjQsNyBAQAogZXh0ZXJuIHZvaWQgZHJhaW5fbG9jYWxfcGFnZXModm9pZCk7CiBleHRlcm4gdm9pZCBtYXJrX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19WVF9DT05TT0xFKQorI2lmIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKSAmJiBkZWZpbmVkKENPTkZJR19WVCkgJiYgZGVmaW5lZChDT05GSUdfVlRfQ09OU09MRSkKIGV4dGVybiBpbnQgcG1fcHJlcGFyZV9jb25zb2xlKHZvaWQpOwogZXh0ZXJuIHZvaWQgcG1fcmVzdG9yZV9jb25zb2xlKHZvaWQpOwogI2Vsc2UKQEAgLTU0LDggKzU0LDcgQEAKIAl2b2lkICgqcmVzdG9yZV9jbGVhbnVwKSh2b2lkKTsKIH07CiAKLSNpZmRlZiBDT05GSUdfUE0KLSNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogLyoga2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgKi8KIGV4dGVybiB2b2lkIF9fcmVnaXN0ZXJfbm9zYXZlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGIsIHVuc2lnbmVkIGxvbmcgZSwgaW50IGttKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9ub3NhdmVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYiwgdW5zaWduZWQgbG9uZyBlKQpAQCAtNzMsMTUgKzcyLDE2IEBACiAKIGV4dGVybiB2b2lkIGhpYmVybmF0aW9uX3NldF9vcHMoc3RydWN0IGhpYmVybmF0aW9uX29wcyAqb3BzKTsKIGV4dGVybiBpbnQgaGliZXJuYXRlKHZvaWQpOwotI2Vsc2UgLyogQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgKi8KKyNlbHNlIC8qIENPTkZJR19ISUJFUk5BVElPTiAqLwogc3RhdGljIGlubGluZSBpbnQgc3dzdXNwX3BhZ2VfaXNfZm9yYmlkZGVuKHN0cnVjdCBwYWdlICpwKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgc3dzdXNwX3NldF9wYWdlX2ZyZWUoc3RydWN0IHBhZ2UgKnApIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgc3dzdXNwX3Vuc2V0X3BhZ2VfZnJlZShzdHJ1Y3QgcGFnZSAqcCkge30KIAogc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0aW9uX3NldF9vcHMoc3RydWN0IGhpYmVybmF0aW9uX29wcyAqb3BzKSB7fQogc3RhdGljIGlubGluZSBpbnQgaGliZXJuYXRlKHZvaWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KLSNlbmRpZiAvKiBDT05GSUdfU09GVFdBUkVfU1VTUEVORCAqLworI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqLwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiB2b2lkIHNhdmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpOwogdm9pZCByZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKTsKIHN0cnVjdCBzYXZlZF9jb250ZXh0OwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCXsgLm5vdGlmaWVyX2NhbGwgPSBmbiwgLnByaW9yaXR5ID0gcHJpIH07CVwKIAlyZWdpc3Rlcl9wbV9ub3RpZmllcigmZm4jI19uYik7CQkJXAogfQotI2Vsc2UgLyogQ09ORklHX1BNICovCisjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX3BtX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CkBAIC0xMTksMTIgKzExOSwxNSBAQAogfQogCiAjZGVmaW5lIHBtX25vdGlmaWVyKGZuLCBwcmkpCWRvIHsgKHZvaWQpKGZuKTsgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKyNlbmRpZiAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKLSNpZiAhZGVmaW5lZCBDT05GSUdfU09GVFdBUkVfU1VTUEVORCB8fCAhZGVmaW5lZChDT05GSUdfUE0pCisjaWZuZGVmIENPTkZJR19ISUJFUk5BVElPTgogc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX25vc2F2ZV9yZWdpb24odW5zaWduZWQgbG9uZyBiLCB1bnNpZ25lZCBsb25nIGUpCiB7CiB9CitzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfbm9zYXZlX3JlZ2lvbl9sYXRlKHVuc2lnbmVkIGxvbmcgYiwgdW5zaWduZWQgbG9uZyBlKQoreworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfU1dTVVNQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZS5oIGIvaW5jbHVkZS9saW51eC90aW1lLmgKaW5kZXggZTZhZWE1MS4uNmE1ZjUwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTk5LDE1ICs5OSwxMSBAQAogZXh0ZXJuIGludCBub19zeW5jX2Ntb3NfY2xvY2sgX19yZWFkX21vc3RseTsKIHZvaWQgdGltZWtlZXBpbmdfaW5pdCh2b2lkKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9zZWNvbmRzKHZvaWQpCi17Ci0JcmV0dXJuIHh0aW1lLnR2X3NlYzsKLX0KLQordW5zaWduZWQgbG9uZyBnZXRfc2Vjb25kcyh2b2lkKTsKIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X2tlcm5lbF90aW1lKHZvaWQpOwogCiAjZGVmaW5lIENVUlJFTlRfVElNRQkJKGN1cnJlbnRfa2VybmVsX3RpbWUoKSkKLSNkZWZpbmUgQ1VSUkVOVF9USU1FX1NFQwkoKHN0cnVjdCB0aW1lc3BlYykgeyB4dGltZS50dl9zZWMsIDAgfSkKKyNkZWZpbmUgQ1VSUkVOVF9USU1FX1NFQwkoKHN0cnVjdCB0aW1lc3BlYykgeyBnZXRfc2Vjb25kcygpLCAwIH0pCiAKIGV4dGVybiB2b2lkIGRvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpOwogZXh0ZXJuIGludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCA3YTYwOTQ2Li40ZjMzYTU4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC05NCw2ICs5NCw3IEBACiAgKiAJZW5kcG9pbnQgY29uZmlndXJhdGlvbnMuICBUaGV5IHdpbGwgYmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KICAqIEBudW1fYWx0c2V0dGluZzogbnVtYmVyIG9mIGFsdHNldHRpbmdzIGRlZmluZWQuCiAgKiBAY3VyX2FsdHNldHRpbmc6IHRoZSBjdXJyZW50IGFsdHNldHRpbmcuCisgKiBAaW50Zl9hc3NvYzogaW50ZXJmYWNlIGFzc29jaWF0aW9uIGRlc2NyaXB0b3IKICAqIEBkcml2ZXI6IHRoZSBVU0IgZHJpdmVyIHRoYXQgaXMgYm91bmQgdG8gdGhpcyBpbnRlcmZhY2UuCiAgKiBAbWlub3I6IHRoZSBtaW5vciBudW1iZXIgYXNzaWduZWQgdG8gdGhpcyBpbnRlcmZhY2UsIGlmIHRoaXMKICAqCWludGVyZmFjZSBpcyBib3VuZCB0byBhIGRyaXZlciB0aGF0IHVzZXMgdGhlIFVTQiBtYWpvciBudW1iZXIuCkBAIC0yMTMsNiArMjE0LDcgQEAKICAqIEBkZXNjOiB0aGUgZGV2aWNlJ3MgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLgogICogQHN0cmluZzogcG9pbnRlciB0byB0aGUgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGlDb25maWd1cmF0aW9uIHN0cmluZywgaWYKICAqCXByZXNlbnQgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KKyAqIEBpbnRmX2Fzc29jOiBsaXN0IG9mIGFueSBpbnRlcmZhY2UgYXNzb2NpYXRpb24gZGVzY3JpcHRvcnMgaW4gdGhpcyBjb25maWcKICAqIEBpbnRlcmZhY2U6IGFycmF5IG9mIHBvaW50ZXJzIHRvIHVzYl9pbnRlcmZhY2Ugc3RydWN0dXJlcywgb25lIGZvciBlYWNoCiAgKglpbnRlcmZhY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBUaGUgbnVtYmVyIG9mIGludGVyZmFjZXMgaXMgc3RvcmVkCiAgKglpbiBkZXNjLmJOdW1JbnRlcmZhY2VzLiAgVGhlc2UgcG9pbnRlcnMgYXJlIHZhbGlkIG9ubHkgd2hpbGUgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKaW5kZXggMDQwZGFlNS4uYzQ4ZTM5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaApAQCAtMzUsNyArMzUsNyBAQAogdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90bwogewogCS8qIEFkZCBvdGhlciBwcm90b2NvbHMgaGVyZS4gKi8KLQl1X2ludDE2X3QgYWxsOworCV9fYmUxNiBhbGw7CiAKIAlzdHJ1Y3QgewogCQlfX2JlMTYgcG9ydDsKQEAgLTczLDcgKzczLDcgQEAKIAkJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgdTM7CiAJCXVuaW9uIHsKIAkJCS8qIEFkZCBvdGhlciBwcm90b2NvbHMgaGVyZS4gKi8KLQkJCXVfaW50MTZfdCBhbGw7CisJCQlfX2JlMTYgYWxsOwogCiAJCQlzdHJ1Y3QgewogCQkJCV9fYmUxNiBwb3J0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAppbmRleCAzZjYzMWIwLi4wMDdkNDQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaApAQCAtMjEwLDYgKzIxMCw5IEBACiAJdWludDMyX3QJCWV4cF9jbWRzbjsKIAl1aW50MzJfdAkJbWF4X2NtZHNuOwogCisJLyogVGhpcyB0cmFja3MgdGhlIHJlcXMgcXVldWVkIGludG8gdGhlIGluaXRpYXRvciAqLworCXVpbnQzMl90CQlxdWV1ZWRfY21kc247CisKIAkvKiBjb25maWd1cmF0aW9uICovCiAJaW50CQkJaW5pdGlhbF9yMnRfZW47CiAJdW5zaWduZWQJCW1heF9yMnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvbGlic2FzLmggYi9pbmNsdWRlL3Njc2kvbGlic2FzLmgKaW5kZXggZGYzNjQ2MS4uOGRkYTJkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaApAQCAtMzQ4LDcgKzM0OCw3IEBACiAKIC8qIHB1YmxpYzogKi8KIAljaGFyICpzYXNfaGFfbmFtZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwkgIC8qIHNob3VsZCBiZSBzZXQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CSAgLyogc2hvdWxkIGJlIHNldCAqLwogCXN0cnVjdCBtb2R1bGUgKmxsZGRfbW9kdWxlOyAvKiBzaG91bGQgYmUgc2V0ICovCiAKIAl1OCAqc2FzX2FkZHI7CQkgIC8qIG11c3QgYmUgc2V0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2QuaCBiL2luY2x1ZGUvc2NzaS9zZC5oCmluZGV4IDUyNjE0ODguLjc4NTgzZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zZC5oCkBAIC01Nyw3ICs1Nyw3IEBACiBzdGF0aWMgdm9pZCBzZF9yZXNjYW4oc3RydWN0IGRldmljZSAqKTsKIHN0YXRpYyBpbnQgIHNkX2luaXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogc3RhdGljIGludCAgc2RfaXNzdWVfZmx1c2goc3RydWN0IGRldmljZSAqLCBzZWN0b3JfdCAqKTsKLXN0YXRpYyB2b2lkIHNkX3ByZXBhcmVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOworc3RhdGljIHZvaWQgc2RfcHJlcGFyZV9mbHVzaChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIHN0YXRpYyB2b2lkIHNkX3JlYWRfY2FwYWNpdHkoc3RydWN0IHNjc2lfZGlzayAqc2RrcCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKIHN0YXRpYyB2b2lkIHNjc2lfZGlza19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYpOwogc3RhdGljIHZvaWQgc2RfcHJpbnRfc2Vuc2VfaGRyKHN0cnVjdCBzY3NpX2Rpc2sgKiwgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vcGFnZS5oIGIvaW5jbHVkZS94ZW4vcGFnZS5oCmluZGV4IDFkZjZjMTkuLmMwYzhmY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3BhZ2UuaAorKysgYi9pbmNsdWRlL3hlbi9wYWdlLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKICNpbmNsdWRlIDx4ZW4vZmVhdHVyZXMuaD4KIApkaWZmIC0tZ2l0IGEvaW5pdC9pbml0cmFtZnMuYyBiL2luaXQvaW5pdHJhbWZzLmMKaW5kZXggMDBlZmY3YS4uMWRiMDJhMCAxMDA2NDQKLS0tIGEvaW5pdC9pbml0cmFtZnMuYworKysgYi9pbml0L2luaXRyYW1mcy5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIAogc3RhdGljIF9faW5pdGRhdGEgaW50IGRyeV9ydW47CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlYXQodW5zaWduZWQgbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgZWF0KHVuc2lnbmVkIG4pCiB7CiAJdmljdGltICs9IG47CiAJdGhpc19oZWFkZXIgKz0gbjsKZGlmZiAtLWdpdCBhL2tlcm5lbC9LY29uZmlnLnByZWVtcHQgYi9rZXJuZWwvS2NvbmZpZy5wcmVlbXB0CmluZGV4IGM2NGNlOWMuLjZiMDY2NjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9LY29uZmlnLnByZWVtcHQKKysrIGIva2VybmVsL0tjb25maWcucHJlZW1wdApAQCAtNjMsMyArNjMsNiBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3Agc3lzdGVtLgogCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCiAKK2NvbmZpZyBQUkVFTVBUX05PVElGSUVSUworCWJvb2wKKwpkaWZmIC0tZ2l0IGEva2VybmVsL2FjY3QuYyBiL2tlcm5lbC9hY2N0LmMKaW5kZXggNzBkMGQ4OC4uMjRmMGY4YiAxMDA2NDQKLS0tIGEva2VybmVsL2FjY3QuYworKysgYi9rZXJuZWwvYWNjdC5jCkBAIC00NjgsNyArNDY4LDcgQEAKIAl9CiAjZW5kaWYKIAlkb19kaXYoZWxhcHNlZCwgQUhaKTsKLQlhYy5hY19idGltZSA9IHh0aW1lLnR2X3NlYyAtIGVsYXBzZWQ7CisJYWMuYWNfYnRpbWUgPSBnZXRfc2Vjb25kcygpIC0gZWxhcHNlZDsKIAkvKiB3ZSByZWFsbHkgbmVlZCB0byBiaXRlIHRoZSBidWxsZXQgYW5kIGNoYW5nZSBsYXlvdXQgKi8KIAlhYy5hY191aWQgPSBjdXJyZW50LT51aWQ7CiAJYWMuYWNfZ2lkID0gY3VycmVudC0+Z2lkOwpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggYmRlMTEyNC4uYTc3N2QzNyAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC04MjQsMTIgKzgyNCwxNCBAQAogewogCWludCBpOwogCWxvbmcgbGVuLCByZXQ7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnAgPSAoY29uc3QgY2hhciBfX3VzZXIgKilheGktPm1tLT5hcmdfc3RhcnQ7CisJY29uc3QgY2hhciBfX3VzZXIgKnA7CiAJY2hhciAqYnVmOwogCiAJaWYgKGF4aS0+bW0gIT0gY3VycmVudC0+bW0pCiAJCXJldHVybjsgLyogZXhlY3ZlIGZhaWxlZCwgbm8gYWRkaXRpb25hbCBpbmZvICovCiAKKwlwID0gKGNvbnN0IGNoYXIgX191c2VyICopYXhpLT5tbS0+YXJnX3N0YXJ0OworCiAJZm9yIChpID0gMDsgaSA8IGF4aS0+YXJnYzsgaSsrLCBwICs9IGxlbikgewogCQlsZW4gPSBzdHJubGVuX3VzZXIocCwgTUFYX0FSR19TVFJMRU4pOwogCQkvKgpAQCAtODU1LDcgKzg1Nyw3IEBACiAJCSAqIGNvcGllZCB0aGVtIGhlcmUsIGFuZCB0aGUgbW0gaGFzbid0IGJlZW4gZXhwb3NlZCB0byB1c2VyLQogCQkgKiBzcGFjZSB5ZXQuCiAJCSAqLwotCQlpZiAoIXJldCkgeworCQlpZiAocmV0KSB7CiAJCQlXQVJOX09OKDEpOwogCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9ocnRpbWVyLmMgYi9rZXJuZWwvaHJ0aW1lci5jCmluZGV4IGViMWRkZWIuLmMyMWNhNmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ocnRpbWVyLmMKKysrIGIva2VybmVsL2hydGltZXIuYwpAQCAtMTQxLDExICsxNDEsNyBAQAogCiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLSNpZmRlZiBDT05GSUdfTk9fSFoKLQkJZ2V0bnN0aW1lb2ZkYXkoJnh0cyk7Ci0jZWxzZQotCQl4dHMgPSB4dGltZTsKLSNlbmRpZgorCQl4dHMgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CiAJCXRvbSA9IHdhbGxfdG9fbW9ub3RvbmljOwogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2RldnJlcy5jIGIva2VybmVsL2lycS9kZXZyZXMuYwppbmRleCBkOGVlMjQxLi42ZDkyMDRmMyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9kZXZyZXMuYworKysgYi9rZXJuZWwvaXJxL2RldnJlcy5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAvKgogICogRGV2aWNlIHJlc291cmNlIG1hbmFnZW1lbnQgYXdhcmUgSVJRIHJlcXVlc3QvZnJlZSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2tlcm5lbC9rbW9kLmMgYi9rZXJuZWwva21vZC5jCmluZGV4IGJlZWRiZGMuLjk4MDljYzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rbW9kLmMKKysrIGIva2VybmVsL2ttb2QuYwpAQCAtMzUxLDExICszNTEsMTEgQEAKIAogLyoqCiAgKiBjYWxsX3VzZXJtb2RlaGVscGVyX3NldHVwIC0gcHJlcGFyZSB0byBjYWxsIGEgdXNlcm1vZGUgaGVscGVyCi0gKiBAcGF0aCAtIHBhdGggdG8gdXNlcm1vZGUgZXhlY3V0YWJsZQotICogQGFyZ3YgLSBhcmcgdmVjdG9yIGZvciBwcm9jZXNzCi0gKiBAZW52cCAtIGVudmlyb25tZW50IGZvciBwcm9jZXNzCisgKiBAcGF0aDogcGF0aCB0byB1c2VybW9kZSBleGVjdXRhYmxlCisgKiBAYXJndjogYXJnIHZlY3RvciBmb3IgcHJvY2VzcworICogQGVudnA6IGVudmlyb25tZW50IGZvciBwcm9jZXNzCiAgKgotICogUmV0dXJucyBlaXRoZXIgTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUsIG9yIGEgc3VicHJvY2Vzc19pbmZvCisgKiBSZXR1cm5zIGVpdGhlciAlTlVMTCBvbiBhbGxvY2F0aW9uIGZhaWx1cmUsIG9yIGEgc3VicHJvY2Vzc19pbmZvCiAgKiBzdHJ1Y3R1cmUuICBUaGlzIHNob3VsZCBiZSBwYXNzZWQgdG8gY2FsbF91c2VybW9kZWhlbHBlcl9leGVjIHRvCiAgKiBleGVjIHRoZSBwcm9jZXNzIGFuZCBmcmVlIHRoZSBzdHJ1Y3R1cmUuCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wYXJhbXMuYyBiL2tlcm5lbC9wYXJhbXMuYwppbmRleCBlZmZiYWFlLi40ZTU3NzMyIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFyYW1zLmMKKysrIGIva2VybmVsL3BhcmFtcy5jCkBAIC01NjcsNyArNTY3LDEyIEBACiAJa29iamVjdF9zZXRfbmFtZSgmbWstPmtvYmosIG5hbWUpOwogCWtvYmplY3RfaW5pdCgmbWstPmtvYmopOwogCXJldCA9IGtvYmplY3RfYWRkKCZtay0+a29iaik7Ci0JQlVHX09OKHJldCA8IDApOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNb2R1bGUgJyVzJyBmYWlsZWQgdG8gYmUgYWRkZWQgdG8gc3lzZnMsICIKKwkJICAgICAgImVycm9yIG51bWJlciAlZFxuIiwgbmFtZSwgcmV0KTsKKwkJcHJpbnRrKEtFUk5fRVJSCSJUaGUgc3lzdGVtIHdpbGwgYmUgdW5zdGFibGUgbm93LlxuIik7CisJCXJldHVybjsKKwl9CiAJcGFyYW1fc3lzZnNfc2V0dXAobWssIGtwYXJhbSwgbnVtX3BhcmFtcywgbmFtZV9za2lwKTsKIAlrb2JqZWN0X3VldmVudCgmbWstPmtvYmosIEtPQkpfQUREKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9LY29uZmlnIGIva2VybmVsL3Bvd2VyL0tjb25maWcKaW5kZXggYzFhMTA2ZC4uNDEyODU5ZiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL0tjb25maWcKKysrIGIva2VybmVsL3Bvd2VyL0tjb25maWcKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogY29uZmlnIERJU0FCTEVfQ09OU09MRV9TVVNQRU5ECiAJYm9vbCAiS2VlcCBjb25zb2xlKHMpIGVuYWJsZWQgZHVyaW5nIHN1c3BlbmQvcmVzdW1lIChEQU5HRVJPVVMpIgotCWRlcGVuZHMgb24gUE1fREVCVUcKKwlkZXBlbmRzIG9uIFBNX0RFQlVHICYmIFBNX1NMRUVQCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCVRoaXMgb3B0aW9uIHR1cm5zIG9mZiB0aGUgY29uc29sZSBzdXNwZW5kIG1lY2hhbmlzbSB0aGF0IHByZXZlbnRzCkBAIC01Nyw3ICs1Nyw3IEBACiAKIGNvbmZpZyBQTV9UUkFDRQogCWJvb2wgIlN1c3BlbmQvcmVzdW1lIGV2ZW50IHRyYWNpbmciCi0JZGVwZW5kcyBvbiBQTV9ERUJVRyAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBQTV9ERUJVRyAmJiBYODYgJiYgUE1fU0xFRVAgJiYgRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCVRoaXMgZW5hYmxlcyBzb21lIGNoZWVzeSBjb2RlIHRvIHNhdmUgdGhlIGxhc3QgUE0gZXZlbnQgcG9pbnQgaW4gdGhlCkBAIC03Miw5ICs3MiwzNyBAQAogCUNBVVRJT046IHRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgeW91ciBtYWNoaW5lJ3MgcmVhbC10aW1lIGNsb2NrIHRvIGJlCiAJc2V0IHRvIGFuIGludmFsaWQgdGltZSBhZnRlciBhIHJlc3VtZS4KIAotY29uZmlnIFNPRlRXQVJFX1NVU1BFTkQKLQlib29sICJTb2Z0d2FyZSBTdXNwZW5kIChIaWJlcm5hdGlvbikiCi0JZGVwZW5kcyBvbiBQTSAmJiBTV0FQICYmICgoKFg4NiB8fCBQUEM2NF9TV1NVU1ApICYmICghU01QIHx8IFNVU1BFTkRfU01QKSkgfHwgKChGUlYgfHwgUFBDMzIpICYmICFTTVApKQorY29uZmlnIFNVU1BFTkRfU01QX1BPU1NJQkxFCisJYm9vbAorCWRlcGVuZHMgb24gKFg4NiAmJiAhWDg2X1ZPWUFHRVIpIHx8IChQUEM2NCAmJiAoUFBDX1BTRVJJRVMgfHwgUFBDX1BNQUMpKQorCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTVVNQRU5EX1NNUAorCWJvb2wKKwlkZXBlbmRzIG9uIFNVU1BFTkRfU01QX1BPU1NJQkxFICYmIFBNX1NMRUVQCisJc2VsZWN0IEhPVFBMVUdfQ1BVCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQTV9TTEVFUAorCWJvb2wKKwlkZXBlbmRzIG9uIFNVU1BFTkQgfHwgSElCRVJOQVRJT04KKwlkZWZhdWx0IHkKKworY29uZmlnIFNVU1BFTkQKKwlib29sICJTdXNwZW5kIHRvIFJBTSBhbmQgc3RhbmRieSIKKwlkZXBlbmRzIG9uIFBNCisJZGVwZW5kcyBvbiAhU01QIHx8IFNVU1BFTkRfU01QX1BPU1NJQkxFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgQWxsb3cgdGhlIHN5c3RlbSB0byBlbnRlciBzbGVlcCBzdGF0ZXMgaW4gd2hpY2ggbWFpbiBtZW1vcnkgaXMKKwkgIHBvd2VyZWQgYW5kIHRodXMgaXRzIGNvbnRlbnRzIGFyZSBwcmVzZXJ2ZWQsIHN1Y2ggYXMgdGhlCisJICBzdXNwZW5kLXRvLVJBTSBzdGF0ZSAoaS5lLiB0aGUgQUNQSSBTMyBzdGF0ZSkuCisKK2NvbmZpZyBISUJFUk5BVElPTgorCWJvb2wgIkhpYmVybmF0aW9uIChha2EgJ3N1c3BlbmQgdG8gZGlzaycpIgorCWRlcGVuZHMgb24gUE0gJiYgU1dBUAorCWRlcGVuZHMgb24gKChYODYgfHwgUFBDNjRfU1dTVVNQIHx8IEZSViB8fCBQUEMzMikgJiYgIVNNUCkgfHwgU1VTUEVORF9TTVBfUE9TU0lCTEUKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgdGhlIHN1c3BlbmQgdG8gZGlzayAoU1REKSBmdW5jdGlvbmFsaXR5LCB3aGljaCBpcyB1c3VhbGx5CiAJICBjYWxsZWQgImhpYmVybmF0aW9uIiBpbiB1c2VyIGludGVyZmFjZXMuICBTVEQgY2hlY2twb2ludHMgdGhlCkBAIC0xMTIsNyArMTQwLDcgQEAKIAogY29uZmlnIFBNX1NURF9QQVJUSVRJT04KIAlzdHJpbmcgIkRlZmF1bHQgcmVzdW1lIHBhcnRpdGlvbiIKLQlkZXBlbmRzIG9uIFNPRlRXQVJFX1NVU1BFTkQKKwlkZXBlbmRzIG9uIEhJQkVSTkFUSU9OCiAJZGVmYXVsdCAiIgogCS0tLWhlbHAtLS0KIAkgIFRoZSBkZWZhdWx0IHJlc3VtZSBwYXJ0aXRpb24gaXMgdGhlIHBhcnRpdGlvbiB0aGF0IHRoZSBzdXNwZW5kLQpAQCAtMTMyLDExICsxNjAsNiBAQAogCSAgc3VzcGVuZGVkIGltYWdlIHRvLiBJdCB3aWxsIHNpbXBseSBwaWNrIHRoZSBmaXJzdCBhdmFpbGFibGUgc3dhcCAKIAkgIGRldmljZS4KIAotY29uZmlnIFNVU1BFTkRfU01QCi0JYm9vbAotCWRlcGVuZHMgb24gSE9UUExVR19DUFUgJiYgKFg4NiB8fCBQUEM2NCkgJiYgUE0KLQlkZWZhdWx0IHkKLQogY29uZmlnIEFQTV9FTVVMQVRJT04KIAl0cmlzdGF0ZSAiQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCBFbXVsYXRpb24iCiAJZGVwZW5kcyBvbiBQTSAmJiBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlCmluZGV4IDM4NzI1ZjUuLmY3ZGZmZjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9NYWtlZmlsZQorKysgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKQEAgLTMsOCArMyw5IEBACiBFWFRSQV9DRkxBR1MJKz0JLURERUJVRwogZW5kaWYKIAotb2JqLXkJCQkJOj0gbWFpbi5vIHByb2Nlc3MubyBjb25zb2xlLm8KK29iai15CQkJCTo9IG1haW4ubwogb2JqLSQoQ09ORklHX1BNX0xFR0FDWSkJCSs9IHBtLm8KLW9iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzd3N1c3AubyBkaXNrLm8gc25hcHNob3QubyBzd2FwLm8gdXNlci5vCitvYmotJChDT05GSUdfUE1fU0xFRVApCQkrPSBwcm9jZXNzLm8gY29uc29sZS5vCitvYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IHN3c3VzcC5vIGRpc2subyBzbmFwc2hvdC5vIHN3YXAubyB1c2VyLm8KIAogb2JqLSQoQ09ORklHX01BR0lDX1NZU1JRKQkrPSBwb3dlcm9mZi5vCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvZGlzay5jIGIva2VybmVsL3Bvd2VyL2Rpc2suYwppbmRleCAzMjRhYzAxLi5lYjcyMjU1IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvZGlzay5jCisrKyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKQEAgLTIxNiw2ICsyMTYsNyBAQAogCQkgKiBzbGVlcCBzdGF0ZSBhZnRlciBhbGwKIAkJICovCiAJCWVycm9yID0gaGliZXJuYXRpb25fb3BzLT5wcmVwYXJlKCk7CisJCXN5c2Rldl9zaHV0ZG93bigpOwogCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSBoaWJlcm5hdGlvbl9vcHMtPmVudGVyKCk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDMyMTQ3YjUuLjM1MGI0ODUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtMjUsMTEgKzI1LDEzIEBACiAKIEJMT0NLSU5HX05PVElGSUVSX0hFQUQocG1fY2hhaW5faGVhZCk7CiAKLS8qVGhpcyBpcyBqdXN0IGFuIGFyYml0cmFyeSBudW1iZXIgKi8KLSNkZWZpbmUgRlJFRV9QQUdFX05VTUJFUiAoMTAwKQotCiBERUZJTkVfTVVURVgocG1fbXV0ZXgpOwogCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKKworLyogVGhpcyBpcyBqdXN0IGFuIGFyYml0cmFyeSBudW1iZXIgKi8KKyNkZWZpbmUgRlJFRV9QQUdFX05VTUJFUiAoMTAwKQorCiBzdHJ1Y3QgcG1fb3BzICpwbV9vcHM7CiAKIC8qKgpAQCAtMjY5LDYgKzI3MSw4IEBACiAKIEVYUE9SVF9TWU1CT0wocG1fc3VzcGVuZCk7CiAKKyNlbmRpZiAvKiBDT05GSUdfU1VTUEVORCAqLworCiBkZWNsX3N1YnN5cyhwb3dlcixOVUxMLE5VTEwpOwogCiAKQEAgLTI4NSwxNCArMjg5LDE2IEBACiAKIHN0YXRpYyBzc2l6ZV90IHN0YXRlX3Nob3coc3RydWN0IGtzZXQgKmtzZXQsIGNoYXIgKmJ1ZikKIHsKKwljaGFyICpzID0gYnVmOworI2lmZGVmIENPTkZJR19TVVNQRU5ECiAJaW50IGk7Ci0JY2hhciAqIHMgPSBidWY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUE1fU1VTUEVORF9NQVg7IGkrKykgewogCQlpZiAocG1fc3RhdGVzW2ldICYmIHZhbGlkX3N0YXRlKGkpKQogCQkJcyArPSBzcHJpbnRmKHMsIiVzICIsIHBtX3N0YXRlc1tpXSk7CiAJfQotI2lmZGVmIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5ECisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KIAlzICs9IHNwcmludGYocywgIiVzXG4iLCAiZGlzayIpOwogI2Vsc2UKIAlpZiAocyAhPSBidWYpCkBAIC0zMDQsMTEgKzMxMCwxMyBAQAogCiBzdGF0aWMgc3NpemVfdCBzdGF0ZV9zdG9yZShzdHJ1Y3Qga3NldCAqa3NldCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKIHsKKyNpZmRlZiBDT05GSUdfU1VTUEVORAogCXN1c3BlbmRfc3RhdGVfdCBzdGF0ZSA9IFBNX1NVU1BFTkRfU1RBTkRCWTsKIAljb25zdCBjaGFyICogY29uc3QgKnM7CisjZW5kaWYKIAljaGFyICpwOwotCWludCBlcnJvcjsKIAlpbnQgbGVuOworCWludCBlcnJvciA9IC1FSU5WQUw7CiAKIAlwID0gbWVtY2hyKGJ1ZiwgJ1xuJywgbik7CiAJbGVuID0gcCA/IHAgLSBidWYgOiBuOwpAQCAtMzE2LDE3ICszMjQsMTkgQEAKIAkvKiBGaXJzdCwgY2hlY2sgaWYgd2UgYXJlIHJlcXVlc3RlZCB0byBoaWJlcm5hdGUgKi8KIAlpZiAobGVuID09IDQgJiYgIXN0cm5jbXAoYnVmLCAiZGlzayIsIGxlbikpIHsKIAkJZXJyb3IgPSBoaWJlcm5hdGUoKTsKLQkJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBuOworICBnb3RvIEV4aXQ7CiAJfQogCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKIAlmb3IgKHMgPSAmcG1fc3RhdGVzW3N0YXRlXTsgc3RhdGUgPCBQTV9TVVNQRU5EX01BWDsgcysrLCBzdGF0ZSsrKSB7CiAJCWlmICgqcyAmJiBsZW4gPT0gc3RybGVuKCpzKSAmJiAhc3RybmNtcChidWYsICpzLCBsZW4pKQogCQkJYnJlYWs7CiAJfQogCWlmIChzdGF0ZSA8IFBNX1NVU1BFTkRfTUFYICYmICpzKQogCQllcnJvciA9IGVudGVyX3N0YXRlKHN0YXRlKTsKLQllbHNlCi0JCWVycm9yID0gLUVJTlZBTDsKKyNlbmRpZgorCisgRXhpdDoKIAlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IG47CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKaW5kZXggNWYyNGM3OC4uOTVmYmYyZCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmgKKysrIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKQEAgLTEzLDcgKzEzLDcgQEAKIAogCiAKLSNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogLyoKICAqIEtlZXAgc29tZSBtZW1vcnkgZnJlZSBzbyB0aGF0IEkvTyBvcGVyYXRpb25zIGNhbiBzdWNjZWVkIHdpdGhvdXQgcGFnaW5nCiAgKiBbTWlnaHQgdGhpcyBiZSBtb3JlIHRoYW4gNCBNQj9dCkBAIC0xNzYsOSArMTc2LDE3IEBACiBleHRlcm4gdm9pZCBzd3N1c3Bfc2hvd19zcGVlZChzdHJ1Y3QgdGltZXZhbCAqLCBzdHJ1Y3QgdGltZXZhbCAqLAogCQkJCXVuc2lnbmVkIGludCwgY2hhciAqKTsKIAorI2lmZGVmIENPTkZJR19TVVNQRU5ECiAvKiBrZXJuZWwvcG93ZXIvbWFpbi5jICovCi1leHRlcm4gaW50IHN1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIGV4dGVybiBpbnQgc3VzcGVuZF9kZXZpY2VzX2FuZF9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpOworI2Vsc2UgLyogIUNPTkZJR19TVVNQRU5EICovCitzdGF0aWMgaW5saW5lIGludCBzdXNwZW5kX2RldmljZXNfYW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKyNlbmRpZiAvKiAhQ09ORklHX1NVU1BFTkQgKi8KKworLyoga2VybmVsL3Bvd2VyL2NvbW1vbi5jICovCiBleHRlcm4gc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgcG1fY2hhaW5faGVhZDsKIAogc3RhdGljIGlubGluZSBpbnQgcG1fbm90aWZpZXJfY2FsbF9jaGFpbih1bnNpZ25lZCBsb25nIHZhbCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggOTNjZjI0MS4uNWM1MWQ3ZSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CiAjaW5jbHVkZSA8bGludXgvdHNhY2N0X2tlcm4uaD4KQEAgLTI2Myw4ICsyNjQsNiBAQAogCXVuc2lnbmVkIGludCBjbG9ja193YXJwcywgY2xvY2tfb3ZlcmZsb3dzOwogCXVuc2lnbmVkIGludCBjbG9ja191bnN0YWJsZV9ldmVudHM7CiAKLQlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmxvYWRfYmFsYW5jZV9jbGFzczsKLQogCWF0b21pY190IG5yX2lvd2FpdDsKIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTM4NSwxMyArMzg0LDEyIEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgbG9uZyBjcHVfY2xvY2soaW50IGNwdSkKIHsKLQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CiAJdW5zaWduZWQgbG9uZyBsb25nIG5vdzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7Ci0Jbm93ID0gcnFfY2xvY2socnEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCW5vdyA9IHJxX2Nsb2NrKGNwdV9ycShjcHUpKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAlyZXR1cm4gbm93OwogfQpAQCAtMTU5Miw2ICsxNTkwLDEwIEBACiAJSU5JVF9MSVNUX0hFQUQoJnAtPnJ1bl9saXN0KTsKIAlwLT5zZS5vbl9ycSA9IDA7CiAKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKKwlJTklUX0hMSVNUX0hFQUQoJnAtPnByZWVtcHRfbm90aWZpZXJzKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBXZSBtYXJrIHRoZSBwcm9jZXNzIGFzIHJ1bm5pbmcgaGVyZSwgYnV0IGhhdmUgbm90IGFjdHVhbGx5CiAJICogaW5zZXJ0ZWQgaXQgb250byB0aGUgcnVucXVldWUgeWV0LiBUaGlzIGd1YXJhbnRlZXMgdGhhdApAQCAtMTY3Myw2ICsxNjc1LDYzIEBACiAJdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKKworLyoqCisgKiBwcmVlbXB0X25vdGlmaWVyX3JlZ2lzdGVyIC0gdGVsbCBtZSB3aGVuIGN1cnJlbnQgaXMgYmVpbmcgYmVpbmcgcHJlZW1wdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVzY2hlZHVsZWQKKyAqLwordm9pZCBwcmVlbXB0X25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcikKK3sKKwlobGlzdF9hZGRfaGVhZCgmbm90aWZpZXItPmxpbmssICZjdXJyZW50LT5wcmVlbXB0X25vdGlmaWVycyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwcmVlbXB0X25vdGlmaWVyX3JlZ2lzdGVyKTsKKworLyoqCisgKiBwcmVlbXB0X25vdGlmaWVyX3VucmVnaXN0ZXIgLSBubyBsb25nZXIgaW50ZXJlc3RlZCBpbiBwcmVlbXB0aW9uIG5vdGlmaWNhdGlvbnMKKyAqCisgKiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBmcm9tIHdpdGhpbiBhIHByZWVtcHRpb24gbm90aWZpZXIuCisgKi8KK3ZvaWQgcHJlZW1wdF9ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcikKK3sKKwlobGlzdF9kZWwoJm5vdGlmaWVyLT5saW5rKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHByZWVtcHRfbm90aWZpZXJfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyB2b2lkIGZpcmVfc2NoZWRfaW5fcHJlZW1wdF9ub3RpZmllcnMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQoreworCXN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdGlmaWVyLCBub2RlLCAmY3Vyci0+cHJlZW1wdF9ub3RpZmllcnMsIGxpbmspCisJCW5vdGlmaWVyLT5vcHMtPnNjaGVkX2luKG5vdGlmaWVyLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworc3RhdGljIHZvaWQKK2ZpcmVfc2NoZWRfb3V0X3ByZWVtcHRfbm90aWZpZXJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwKKwkJCQkgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQoreworCXN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdGlmaWVyLCBub2RlLCAmY3Vyci0+cHJlZW1wdF9ub3RpZmllcnMsIGxpbmspCisJCW5vdGlmaWVyLT5vcHMtPnNjaGVkX291dChub3RpZmllciwgbmV4dCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIGZpcmVfc2NoZWRfaW5fcHJlZW1wdF9ub3RpZmllcnMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQoreworfQorCitzdGF0aWMgdm9pZAorZmlyZV9zY2hlZF9vdXRfcHJlZW1wdF9ub3RpZmllcnMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLAorCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7Cit9CisKKyNlbmRpZgorCiAvKioKICAqIHByZXBhcmVfdGFza19zd2l0Y2ggLSBwcmVwYXJlIHRvIHN3aXRjaCB0YXNrcwogICogQHJxOiB0aGUgcnVucXVldWUgcHJlcGFyaW5nIHRvIHN3aXRjaApAQCAtMTY4NSw4ICsxNzQ0LDExIEBACiAgKiBwcmVwYXJlX3Rhc2tfc3dpdGNoIHNldHMgdXAgbG9ja2luZyBhbmQgY2FsbHMgYXJjaGl0ZWN0dXJlIHNwZWNpZmljCiAgKiBob29rcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfdGFza19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQorc3RhdGljIGlubGluZSB2b2lkCitwcmVwYXJlX3Rhc2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKKwlmaXJlX3NjaGVkX291dF9wcmVlbXB0X25vdGlmaWVycyhwcmV2LCBuZXh0KTsKIAlwcmVwYXJlX2xvY2tfc3dpdGNoKHJxLCBuZXh0KTsKIAlwcmVwYXJlX2FyY2hfc3dpdGNoKG5leHQpOwogfQpAQCAtMTcyOCw2ICsxNzkwLDcgQEAKIAlwcmV2X3N0YXRlID0gcHJldi0+c3RhdGU7CiAJZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpOwogCWZpbmlzaF9sb2NrX3N3aXRjaChycSwgcHJldik7CisJZmlyZV9zY2hlZF9pbl9wcmVlbXB0X25vdGlmaWVycyhjdXJyZW50KTsKIAlpZiAobW0pCiAJCW1tZHJvcChtbSk7CiAJaWYgKHVubGlrZWx5KHByZXZfc3RhdGUgPT0gVEFTS19ERUFEKSkgewpAQCAtMTc2OCw3ICsxODMxLDcgQEAKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgKm9sZG1tOwogCi0JcHJlcGFyZV90YXNrX3N3aXRjaChycSwgbmV4dCk7CisJcHJlcGFyZV90YXNrX3N3aXRjaChycSwgcHJldiwgbmV4dCk7CiAJbW0gPSBuZXh0LT5tbTsKIAlvbGRtbSA9IHByZXYtPmFjdGl2ZV9tbTsKIAkvKgpAQCAtNTE0MCwxMCArNTIwMywxMjkgQEAKIAkJaWYgKCFuZXh0KQogCQkJYnJlYWs7CiAJCW1pZ3JhdGVfZGVhZChkZWFkX2NwdSwgbmV4dCk7CisKIAl9CiB9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfU1lTQ1RMKQorCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBzZF9jdGxfZGlyW10gPSB7CisJe0NUTF9VTk5VTUJFUkVELCAic2NoZWRfZG9tYWluIiwgTlVMTCwgMCwgMDc1NSwgTlVMTCwgfSwKKwl7MCx9LAorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgc2RfY3RsX3Jvb3RbXSA9IHsKKwl7Q1RMX1VOTlVNQkVSRUQsICJrZXJuZWwiLCBOVUxMLCAwLCAwNzU1LCBzZF9jdGxfZGlyLCB9LAorCXswLH0sCit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSAqc2RfYWxsb2NfY3RsX2VudHJ5KGludCBuKQoreworCXN0cnVjdCBjdGxfdGFibGUgKmVudHJ5ID0KKwkJa21hbGxvYyhuICogc2l6ZW9mKHN0cnVjdCBjdGxfdGFibGUpLCBHRlBfS0VSTkVMKTsKKworCUJVR19PTighZW50cnkpOworCW1lbXNldChlbnRyeSwgMCwgbiAqIHNpemVvZihzdHJ1Y3QgY3RsX3RhYmxlKSk7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdGFibGVfZW50cnkoc3RydWN0IGN0bF90YWJsZSAqZW50cnksIGludCBjdGxfbmFtZSwKKwkJY29uc3QgY2hhciAqcHJvY25hbWUsIHZvaWQgKmRhdGEsIGludCBtYXhsZW4sCisJCW1vZGVfdCBtb2RlLCBwcm9jX2hhbmRsZXIgKnByb2NfaGFuZGxlcikKK3sKKwllbnRyeS0+Y3RsX25hbWUgPSBjdGxfbmFtZTsKKwllbnRyeS0+cHJvY25hbWUgPSBwcm9jbmFtZTsKKwllbnRyeS0+ZGF0YSA9IGRhdGE7CisJZW50cnktPm1heGxlbiA9IG1heGxlbjsKKwllbnRyeS0+bW9kZSA9IG1vZGU7CisJZW50cnktPnByb2NfaGFuZGxlciA9IHByb2NfaGFuZGxlcjsKK30KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgKgorc2RfYWxsb2NfY3RsX2RvbWFpbl90YWJsZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeSgxNCk7CisKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzBdLCAxLCAibWluX2ludGVydmFsIiwgJnNkLT5taW5faW50ZXJ2YWwsCisJCXNpemVvZihsb25nKSwgMDY0NCwgcHJvY19kb3Vsb25ndmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVsxXSwgMiwgIm1heF9pbnRlcnZhbCIsICZzZC0+bWF4X2ludGVydmFsLAorCQlzaXplb2YobG9uZyksIDA2NDQsIHByb2NfZG91bG9uZ3ZlY19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMl0sIDMsICJidXN5X2lkeCIsICZzZC0+YnVzeV9pZHgsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVszXSwgNCwgImlkbGVfaWR4IiwgJnNkLT5pZGxlX2lkeCwKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzRdLCA1LCAibmV3aWRsZV9pZHgiLCAmc2QtPm5ld2lkbGVfaWR4LAorCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbNV0sIDYsICJ3YWtlX2lkeCIsICZzZC0+d2FrZV9pZHgsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs2XSwgNywgImZvcmtleGVjX2lkeCIsICZzZC0+Zm9ya2V4ZWNfaWR4LAorCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbN10sIDgsICJidXN5X2ZhY3RvciIsICZzZC0+YnVzeV9mYWN0b3IsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs4XSwgOSwgImltYmFsYW5jZV9wY3QiLCAmc2QtPmltYmFsYW5jZV9wY3QsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs5XSwgMTAsICJjYWNoZV9ob3RfdGltZSIsICZzZC0+Y2FjaGVfaG90X3RpbWUsCisJCXNpemVvZihsb25nIGxvbmcpLCAwNjQ0LCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzEwXSwgMTEsICJjYWNoZV9uaWNlX3RyaWVzIiwKKwkJJnNkLT5jYWNoZV9uaWNlX3RyaWVzLAorCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMTJdLCAxMywgImZsYWdzIiwgJnNkLT5mbGFncywKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKKworCXJldHVybiB0YWJsZTsKK30KKworc3RhdGljIGN0bF90YWJsZSAqc2RfYWxsb2NfY3RsX2NwdV90YWJsZShpbnQgY3B1KQoreworCXN0cnVjdCBjdGxfdGFibGUgKmVudHJ5LCAqdGFibGU7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJaW50IGRvbWFpbl9udW0gPSAwLCBpOworCWNoYXIgYnVmWzMyXTsKKworCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKQorCQlkb21haW5fbnVtKys7CisJZW50cnkgPSB0YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeShkb21haW5fbnVtICsgMSk7CisKKwlpID0gMDsKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQlzbnByaW50ZihidWYsIDMyLCAiZG9tYWluJWQiLCBpKTsKKwkJZW50cnktPmN0bF9uYW1lID0gaSArIDE7CisJCWVudHJ5LT5wcm9jbmFtZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKKwkJZW50cnktPm1vZGUgPSAwNzU1OworCQllbnRyeS0+Y2hpbGQgPSBzZF9hbGxvY19jdGxfZG9tYWluX3RhYmxlKHNkKTsKKwkJZW50cnkrKzsKKwkJaSsrOworCX0KKwlyZXR1cm4gdGFibGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc2Rfc3lzY3RsX2hlYWRlcjsKK3N0YXRpYyB2b2lkIGluaXRfc2NoZWRfZG9tYWluX3N5c2N0bCh2b2lkKQoreworCWludCBpLCBjcHVfbnVtID0gbnVtX29ubGluZV9jcHVzKCk7CisJc3RydWN0IGN0bF90YWJsZSAqZW50cnkgPSBzZF9hbGxvY19jdGxfZW50cnkoY3B1X251bSArIDEpOworCWNoYXIgYnVmWzMyXTsKKworCXNkX2N0bF9kaXJbMF0uY2hpbGQgPSBlbnRyeTsKKworCWZvciAoaSA9IDA7IGkgPCBjcHVfbnVtOyBpKyssIGVudHJ5KyspIHsKKwkJc25wcmludGYoYnVmLCAzMiwgImNwdSVkIiwgaSk7CisJCWVudHJ5LT5jdGxfbmFtZSA9IGkgKyAxOworCQllbnRyeS0+cHJvY25hbWUgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7CisJCWVudHJ5LT5tb2RlID0gMDc1NTsKKwkJZW50cnktPmNoaWxkID0gc2RfYWxsb2NfY3RsX2NwdV90YWJsZShpKTsKKwl9CisJc2Rfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShzZF9jdGxfcm9vdCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaW5pdF9zY2hlZF9kb21haW5fc3lzY3RsKHZvaWQpCit7Cit9CisjZW5kaWYKKwogLyoKICAqIG1pZ3JhdGlvbl9jYWxsIC0gY2FsbGJhY2sgdGhhdCBnZXRzIHRyaWdnZXJlZCB3aGVuIGEgQ1BVIGlzIGFkZGVkLgogICogSGVyZSB3ZSBjYW4gc3RhcnQgdXAgdGhlIG5lY2Vzc2FyeSBtaWdyYXRpb24gdGhyZWFkIGZvciB0aGUgbmV3IENQVS4KQEAgLTYyNDksNiArNjQzMSw4IEBACiAJLyogWFhYOiBUaGVvcmV0aWNhbCByYWNlIGhlcmUgLSBDUFUgbWF5IGJlIGhvdHBsdWdnZWQgbm93ICovCiAJaG90Y3B1X25vdGlmaWVyKHVwZGF0ZV9zY2hlZF9kb21haW5zLCAwKTsKIAorCWluaXRfc2NoZWRfZG9tYWluX3N5c2N0bCgpOworCiAJLyogTW92ZSBpbml0IG92ZXIgdG8gYSBub24taXNvbGF0ZWQgQ1BVICovCiAJaWYgKHNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgbm9uX2lzb2xhdGVkX2NwdXMpIDwgMCkKIAkJQlVHKCk7CkBAIC02MzM1LDYgKzY1MTksMTAgQEAKIAogCXNldF9sb2FkX3dlaWdodCgmaW5pdF90YXNrKTsKIAorI2lmZGVmIENPTkZJR19QUkVFTVBUX05PVElGSUVSUworCUlOSVRfSExJU1RfSEVBRCgmaW5pdF90YXNrLnByZWVtcHRfbm90aWZpZXJzKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1NNUAogCW5yX2NwdV9pZHMgPSBoaWdoZXN0X2NwdSArIDE7CiAJb3Blbl9zb2Z0aXJxKFNDSEVEX1NPRlRJUlEsIHJ1bl9yZWJhbGFuY2VfZG9tYWlucywgTlVMTCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZGVidWcuYyBiL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jCmluZGV4IDI5ZjJjMjEuLjQyOTcwZjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jCisrKyBiL2tlcm5lbC9zY2hlZF9kZWJ1Zy5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBzeXNycV9zY2hlZF9kZWJ1Z19zaG93KHZvaWQpCitzdGF0aWMgdm9pZCBzeXNycV9zY2hlZF9kZWJ1Z19zaG93KHZvaWQpCiB7CiAJc2NoZWRfZGVidWdfc2hvdyhOVUxMLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCAwODU2MmY0Li40NDliODFiIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC04MDQsNiArODA0LDcgQEAKIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZyZWJvb3Rfbm90aWZpZXJfbGlzdCwgU1lTX1JFU1RBUlQsIGNtZCk7CiAJc3lzdGVtX3N0YXRlID0gU1lTVEVNX1JFU1RBUlQ7CiAJZGV2aWNlX3NodXRkb3duKCk7CisJc3lzZGV2X3NodXRkb3duKCk7CiB9CiAKIC8qKgpAQCAtODYwLDYgKzg2MSw3IEBACiB2b2lkIGtlcm5lbF9oYWx0KHZvaWQpCiB7CiAJa2VybmVsX3NodXRkb3duX3ByZXBhcmUoU1lTVEVNX0hBTFQpOworCXN5c2Rldl9zaHV0ZG93bigpOwogCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gaGFsdGVkLlxuIik7CiAJbWFjaGluZV9oYWx0KCk7CiB9CkBAIC04NzYsNiArODc4LDcgQEAKIAlrZXJuZWxfc2h1dGRvd25fcHJlcGFyZShTWVNURU1fUE9XRVJfT0ZGKTsKIAlpZiAocG1fcG93ZXJfb2ZmX3ByZXBhcmUpCiAJCXBtX3Bvd2VyX29mZl9wcmVwYXJlKCk7CisJc3lzZGV2X3NodXRkb3duKCk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIlBvd2VyIGRvd24uXG4iKTsKIAltYWNoaW5lX3Bvd2VyX29mZigpOwogfQpAQCAtOTUxLDcgKzk1NCw3IEBACiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLSNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgogCWNhc2UgTElOVVhfUkVCT09UX0NNRF9TV19TVVNQRU5EOgogCQl7CiAJCQlpbnQgcmV0ID0gaGliZXJuYXRlKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZGRlYmYzZi4uNzljODkxZSAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtNjg5LDcgKzY4OSw3IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKKyNpZglkZWZpbmVkKENPTkZJR19BQ1BJX1NMRUVQKSAmJiBkZWZpbmVkKENPTkZJR19YODYpCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX0FDUElfVklERU9fRkxBR1MsCiAJCS5wcm9jbmFtZQk9ICJhY3BpX3ZpZGVvX2ZsYWdzIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IDViODFkYTAuLjIyODlhOGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMjE1LDIyICsyMTUsNiBAQAogCXJldHVybiBjb3B5X3RvX3VzZXIodHhjX3AsICZ0eGMsIHNpemVvZihzdHJ1Y3QgdGltZXgpKSA/IC1FRkFVTFQgOiByZXQ7CiB9CiAKLWlubGluZSBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9rZXJuZWxfdGltZSh2b2lkKQotewotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbm93OwotICAgICAgICB1bnNpZ25lZCBsb25nIHNlcTsKLQotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7Ci0JCQotCQlub3cgPSB4dGltZTsKLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKLQotCXJldHVybiBub3c7IAotfQotCi1FWFBPUlRfU1lNQk9MKGN1cnJlbnRfa2VybmVsX3RpbWUpOwotCiAvKioKICAqIGN1cnJlbnRfZnNfdGltZSAtIFJldHVybiBGUyB0aW1lCiAgKiBAc2I6IFN1cGVyYmxvY2suCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCA4OGM4MTAyLi5hY2M0MTdiIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTQ3LDEwICs0NywyMiBAQAogc3RydWN0IHRpbWVzcGVjIHh0aW1lIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIHN0cnVjdCB0aW1lc3BlYyB3YWxsX3RvX21vbm90b25pYyBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9zbGVlcF90aW1lOwkJLyogc2Vjb25kcyAqLwotCiBFWFBPUlRfU1lNQk9MKHh0aW1lKTsKIAogCisjaWZkZWYgQ09ORklHX05PX0haCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHh0aW1lX2NhY2hlIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfeHRpbWVfY2FjaGUodTY0IG5zZWMpCit7CisJeHRpbWVfY2FjaGUgPSB4dGltZTsKKwl0aW1lc3BlY19hZGRfbnMoJnh0aW1lX2NhY2hlLCBuc2VjKTsKK30KKyNlbHNlCisjZGVmaW5lIHh0aW1lX2NhY2hlIHh0aW1lCisvKiBXZSBkbyAqbm90KiB3YW50IHRvIGV2YWx1YXRlIHRoZSBhcmd1bWVudCBmb3IgdGhpcyBjYXNlICovCisjZGVmaW5lIHVwZGF0ZV94dGltZV9jYWNoZShuKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2s7IC8qIHBvaW50ZXIgdG8gY3VycmVudCBjbG9ja3NvdXJjZSAqLwogCiAKQEAgLTQ3OCw2ICs0OTAsOCBAQAogCXh0aW1lLnR2X25zZWMgPSAoczY0KWNsb2NrLT54dGltZV9uc2VjID4+IGNsb2NrLT5zaGlmdDsKIAljbG9jay0+eHRpbWVfbnNlYyAtPSAoczY0KXh0aW1lLnR2X25zZWMgPDwgY2xvY2stPnNoaWZ0OwogCisJdXBkYXRlX3h0aW1lX2NhY2hlKGN5YzJucyhjbG9jaywgb2Zmc2V0KSk7CisKIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBuZXcgY2xvY2tzb3VyY2UgdG8gdXNlICovCiAJY2hhbmdlX2Nsb2Nrc291cmNlKCk7CiAJdXBkYXRlX3ZzeXNjYWxsKCZ4dGltZSwgY2xvY2spOwpAQCAtNTA5LDMgKzUyMywyNSBAQAogewogCXRzLT50dl9zZWMgKz0gdG90YWxfc2xlZXBfdGltZTsKIH0KKwordW5zaWduZWQgbG9uZyBnZXRfc2Vjb25kcyh2b2lkKQoreworCXJldHVybiB4dGltZV9jYWNoZS50dl9zZWM7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9zZWNvbmRzKTsKKworCitzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9rZXJuZWxfdGltZSh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJdW5zaWduZWQgbG9uZyBzZXE7CisKKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCisJCW5vdyA9IHh0aW1lX2NhY2hlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJcmV0dXJuIG5vdzsKK30KK0VYUE9SVF9TWU1CT0woY3VycmVudF9rZXJuZWxfdGltZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHNhY2N0LmMgYi9rZXJuZWwvdHNhY2N0LmMKaW5kZXggNjU4ZjYzOC4uYzEyMjEzMSAxMDA2NDQKLS0tIGEva2VybmVsL3RzYWNjdC5jCisrKyBiL2tlcm5lbC90c2FjY3QuYwpAQCAtMzksNyArMzksNyBAQAogCWFjX2V0aW1lID0gdGltZXNwZWNfdG9fbnMoJnRzKTsKIAlkb19kaXYoYWNfZXRpbWUsIE5TRUNfUEVSX1VTRUMpOwogCXN0YXRzLT5hY19ldGltZSA9IGFjX2V0aW1lOwotCXN0YXRzLT5hY19idGltZSA9IHh0aW1lLnR2X3NlYyAtIHRzLnR2X3NlYzsKKwlzdGF0cy0+YWNfYnRpbWUgPSBnZXRfc2Vjb25kcygpIC0gdHMudHZfc2VjOwogCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHRzaykpIHsKIAkJc3RhdHMtPmFjX2V4aXRjb2RlID0gdHNrLT5leGl0X2NvZGU7CiAJCWlmICh0c2stPmZsYWdzICYgUEZfRk9SS05PRVhFQykKZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCBiMThmYzJmLi4yMzk4NWEyIDEwMDY0NAotLS0gYS9saWIvZmF1bHQtaW5qZWN0LmMKKysrIGIvbGliL2ZhdWx0LWluamVjdC5jCkBAIC0xMzksMTIgKzEzOSwxNCBAQAogCSoodW5zaWduZWQgbG9uZyAqKWRhdGEgPSB2YWw7CiB9CiAKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSCiBzdGF0aWMgdm9pZCBkZWJ1Z2ZzX3VsX3NldF9NQVhfU1RBQ0tfVFJBQ0VfREVQVEgodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKIAkqKHVuc2lnbmVkIGxvbmcgKilkYXRhID0KIAkJdmFsIDwgTUFYX1NUQUNLX1RSQUNFX0RFUFRIID8KIAkJdmFsIDogTUFYX1NUQUNLX1RSQUNFX0RFUFRIOwogfQorI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIgKi8KIAogc3RhdGljIHU2NCBkZWJ1Z2ZzX3VsX2dldCh2b2lkICpkYXRhKQogewpAQCAtMTU5LDYgKzE2MSw3IEBACiAJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgbW9kZSwgcGFyZW50LCB2YWx1ZSwgJmZvcHNfdWwpOwogfQogCisjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9TVEFDS1RSQUNFX0ZJTFRFUgogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191bF9NQVhfU1RBQ0tfVFJBQ0VfREVQVEgsIGRlYnVnZnNfdWxfZ2V0LAogCQkJZGVidWdmc191bF9zZXRfTUFYX1NUQUNLX1RSQUNFX0RFUFRILCAiJWxsdVxuIik7CiAKQEAgLTE2OSw2ICsxNzIsNyBAQAogCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsCiAJCQkJICAgJmZvcHNfdWxfTUFYX1NUQUNLX1RSQUNFX0RFUFRIKTsKIH0KKyNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSICovCiAKIHN0YXRpYyB2b2lkIGRlYnVnZnNfYXRvbWljX3Rfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CmRpZmYgLS1naXQgYS9saWIva29iamVjdF91ZXZlbnQuYyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCmluZGV4IDZhODBjNzguLmRmMDI4MTQgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0X3VldmVudC5jCisrKyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC0yNSwxNCArMjUsNiBAQAogI2RlZmluZSBCVUZGRVJfU0laRQkyMDQ4CS8qIGJ1ZmZlciBmb3IgdGhlIHZhcmlhYmxlcyAqLwogI2RlZmluZSBOVU1fRU5WUAkzMgkvKiBudW1iZXIgb2YgZW52IHBvaW50ZXJzICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQotdTY0IHVldmVudF9zZXFudW07Ci1jaGFyIHVldmVudF9oZWxwZXJbVUVWRU5UX0hFTFBFUl9QQVRIX0xFTl0gPSAiL3NiaW4vaG90cGx1ZyI7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlcXVlbmNlX2xvY2spOwotI2lmIGRlZmluZWQoQ09ORklHX05FVCkKLXN0YXRpYyBzdHJ1Y3Qgc29jayAqdWV2ZW50X3NvY2s7Ci0jZW5kaWYKLQogLyogdGhlIHN0cmluZ3MgaGVyZSBtdXN0IG1hdGNoIHRoZSBlbnVtIGluIGluY2x1ZGUvbGludXgva29iamVjdC5oICovCiBjb25zdCBjaGFyICprb2JqZWN0X2FjdGlvbnNbXSA9IHsKIAkiYWRkIiwKQEAgLTQzLDYgKzM1LDE0IEBACiAJIm9mZmxpbmUiLAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpCit1NjQgdWV2ZW50X3NlcW51bTsKK2NoYXIgdWV2ZW50X2hlbHBlcltVRVZFTlRfSEVMUEVSX1BBVEhfTEVOXSA9ICIvc2Jpbi9ob3RwbHVnIjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2VxdWVuY2VfbG9jayk7CisjaWYgZGVmaW5lZChDT05GSUdfTkVUKQorc3RhdGljIHN0cnVjdCBzb2NrICp1ZXZlbnRfc29jazsKKyNlbmRpZgorCiAvKioKICAqIGtvYmplY3RfdWV2ZW50X2VudiAtIHNlbmQgYW4gdWV2ZW50IHdpdGggZW52aXJvbm1lbnRhbCBkYXRhCiAgKgpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggODYxODcyMi4uZTI0ZDM0OCAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xMTYsMTEgKzExNiwxMSBAQAogY29uZmlnIE1FTU9SWV9IT1RQTFVHCiAJYm9vbCAiQWxsb3cgZm9yIG1lbW9yeSBob3QtYWRkIgogCWRlcGVuZHMgb24gU1BBUlNFTUVNIHx8IFg4Nl82NF9BQ1BJX05VTUEKLQlkZXBlbmRzIG9uIEhPVFBMVUcgJiYgIVNPRlRXQVJFX1NVU1BFTkQgJiYgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUcKKwlkZXBlbmRzIG9uIEhPVFBMVUcgJiYgIUhJQkVSTkFUSU9OICYmIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCiAJZGVwZW5kcyBvbiAoSUE2NCB8fCBYODYgfHwgUFBDNjQgfHwgU1VQRVJIKQogCiBjb21tZW50ICJNZW1vcnkgaG90cGx1ZyBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZCIKLQlkZXBlbmRzIG9uIFNQQVJTRU1FTSAmJiBIT1RQTFVHICYmIFNPRlRXQVJFX1NVU1BFTkQKKwlkZXBlbmRzIG9uIFNQQVJTRU1FTSAmJiBIT1RQTFVHICYmIEhJQkVSTkFUSU9OCiAKIGNvbmZpZyBNRU1PUllfSE9UUExVR19TUEFSU0UKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9tbS9ib3VuY2UuYyBiL21tL2JvdW5jZS5jCmluZGV4IGFkNDAxZmMuLjE3OWZlMzggMTAwNjQ0Ci0tLSBhL21tL2JvdW5jZS5jCisrKyBiL21tL2JvdW5jZS5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19ibGtfcXVldWVfYm91bmNlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqKmJpb19vcmlnLAorc3RhdGljIHZvaWQgX19ibGtfcXVldWVfYm91bmNlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICoqYmlvX29yaWcsCiAJCQkgICAgICAgbWVtcG9vbF90ICpwb29sKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJKmJpb19vcmlnID0gYmlvOwogfQogCi12b2lkIGJsa19xdWV1ZV9ib3VuY2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICoqYmlvX29yaWcpCit2b2lkIGJsa19xdWV1ZV9ib3VuY2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKipiaW9fb3JpZykKIHsKIAltZW1wb29sX3QgKnBvb2w7CiAKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCBmMTI3OTQwLi5kN2NhNTlkIDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC04NCw2ICs4NCw3IEBACiAJCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIAkJCWZyZWVfaHVnZV9wYWdlcy0tOwogCQkJZnJlZV9odWdlX3BhZ2VzX25vZGVbbmlkXS0tOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJcmV0dXJuIHBhZ2U7CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggMzRkOGFkYS4uMzdjNzNiOSAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtNDksOSArNDksOCBAQAogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKIAogCQlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7Ci0JCWlmIChQYWdlTFJVKHBhZ2UpKSB7CisJCWlmIChQYWdlTFJVKHBhZ2UpICYmIGdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSB7CiAJCQlyZXQgPSAwOwotCQkJZ2V0X3BhZ2UocGFnZSk7CiAJCQlDbGVhclBhZ2VMUlUocGFnZSk7CiAJCQlpZiAoUGFnZUFjdGl2ZShwYWdlKSkKIAkJCQlkZWxfcGFnZV9mcm9tX2FjdGl2ZV9saXN0KHpvbmUsIHBhZ2UpOwpAQCAtNjMyLDE4ICs2MzEsMzUgQEAKIAkJCWdvdG8gdW5sb2NrOwogCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCX0KLQogCS8qCi0JICogRXN0YWJsaXNoIG1pZ3JhdGlvbiBwdGVzIG9yIHJlbW92ZSBwdGVzCisJICogQnkgdHJ5X3RvX3VubWFwKCksIHBhZ2UtPm1hcGNvdW50IGdvZXMgZG93biB0byAwIGhlcmUuIEluIHRoaXMgY2FzZSwKKwkgKiB3ZSBjYW5ub3Qgbm90aWNlIHRoYXQgYW5vbl92bWEgaXMgZnJlZWQgd2hpbGUgd2UgbWlncmF0ZXMgYSBwYWdlLgorCSAqIFRoaXMgcmN1X3JlYWRfbG9jaygpIGRlbGF5cyBmcmVlaW5nIGFub25fdm1hIHBvaW50ZXIgdW50aWwgdGhlIGVuZAorCSAqIG9mIG1pZ3JhdGlvbi4gRmlsZSBjYWNoZSBwYWdlcyBhcmUgbm8gcHJvYmxlbSBiZWNhdXNlIG9mIHBhZ2VfbG9jaygpCiAJICovCisJcmN1X3JlYWRfbG9jaygpOworCS8qCisJICogVGhpcyBpcyBhIGNvcm5lciBjYXNlIGhhbmRsaW5nLgorCSAqIFdoZW4gYSBuZXcgc3dhcC1jYWNoZSBpcyByZWFkIGludG8sIGl0IGlzIGxpbmtlZCB0byBMUlUKKwkgKiBhbmQgdHJlYXRlZCBhcyBzd2FwY2FjaGUgYnV0IGhhcyBubyBybWFwIHlldC4KKwkgKiBDYWxsaW5nIHRyeV90b191bm1hcCgpIGFnYWluc3QgYSBwYWdlLT5tYXBwaW5nPT1OVUxMIHBhZ2UgaXMKKwkgKiBCVUcuIFNvIGhhbmRsZSBpdCBoZXJlLgorCSAqLworCWlmICghcGFnZS0+bWFwcGluZykKKwkJZ290byByY3VfdW5sb2NrOworCS8qIEVzdGFibGlzaCBtaWdyYXRpb24gcHRlcyBvciByZW1vdmUgcHRlcyAqLwogCXRyeV90b191bm1hcChwYWdlLCAxKTsKKwogCWlmICghcGFnZV9tYXBwZWQocGFnZSkpCiAJCXJjID0gbW92ZV90b19uZXdfcGFnZShuZXdwYWdlLCBwYWdlKTsKIAogCWlmIChyYykKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHBhZ2UsIHBhZ2UpOworcmN1X3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogdW5sb2NrOgorCiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKIAlpZiAocmMgIT0gLUVBR0FJTikgewpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDdhZmM3YTcuLmI2NTM3MjEgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTEwMjksNiArMTAyOSw0MCBAQAogfQogRVhQT1JUX1NZTUJPTChkb19tbWFwX3Bnb2ZmKTsKIAorLyoKKyAqIFNvbWUgc2hhcmVkIG1hcHBpZ25zIHdpbGwgd2FudCB0aGUgcGFnZXMgbWFya2VkIHJlYWQtb25seQorICogdG8gdHJhY2sgd3JpdGUgZXZlbnRzLiBJZiBzbywgd2UnbGwgZG93bmdyYWRlIHZtX3BhZ2VfcHJvdAorICogdG8gdGhlIHByaXZhdGUgdmVyc2lvbiAodXNpbmcgcHJvdGVjdGlvbl9tYXBbXSB3aXRob3V0IHRoZQorICogVk1fU0hBUkVEIGJpdCkuCisgKi8KK2ludCB2bWFfd2FudHNfd3JpdGVub3RpZnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgaW50IHZtX2ZsYWdzID0gdm1hLT52bV9mbGFnczsKKworCS8qIElmIGl0IHdhcyBwcml2YXRlIG9yIG5vbi13cml0YWJsZSwgdGhlIHdyaXRlIGJpdCBpcyBhbHJlYWR5IGNsZWFyICovCisJaWYgKCh2bV9mbGFncyAmIChWTV9XUklURXxWTV9TSEFSRUQpKSAhPSAoKFZNX1dSSVRFfFZNX1NIQVJFRCkpKQorCQlyZXR1cm4gMDsKKworCS8qIFRoZSBiYWNrZXIgd2lzaGVzIHRvIGtub3cgd2hlbiBwYWdlcyBhcmUgZmlyc3Qgd3JpdHRlbiB0bz8gKi8KKwlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPnBhZ2VfbWt3cml0ZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBUaGUgb3BlbiByb3V0aW5lIGRpZCBzb21ldGhpbmcgdG8gdGhlIHByb3RlY3Rpb25zIGFscmVhZHk/ICovCisJaWYgKHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICE9CisJICAgIHBncHJvdF92YWwocHJvdGVjdGlvbl9tYXBbdm1fZmxhZ3MgJgorCQkgICAgKFZNX1JFQUR8Vk1fV1JJVEV8Vk1fRVhFQ3xWTV9TSEFSRUQpXSkpCisJCXJldHVybiAwOworCisJLyogU3BlY2lhbHR5IG1hcHBpbmc/ICovCisJaWYgKHZtX2ZsYWdzICYgKFZNX1BGTk1BUHxWTV9JTlNFUlRQQUdFKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBDYW4gdGhlIG1hcHBpbmcgdHJhY2sgdGhlIGRpcnR5IHBhZ2VzPyAqLworCXJldHVybiB2bWEtPnZtX2ZpbGUgJiYgdm1hLT52bV9maWxlLT5mX21hcHBpbmcgJiYKKwkJbWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eSh2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZyk7Cit9CisKKwogdW5zaWduZWQgbG9uZyBtbWFwX3JlZ2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCSAgdW5zaWduZWQgaW50IHZtX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHBnb2ZmLApkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggYTcwMDE0MS4uMTAzNjc2NSAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggNDA5NTRmYi4uMGJkNGQ4MiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtNzI2LDcgKzcyNiw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCiAKIHZvaWQgbWFya19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lKQogewpAQCAtNzcyLDcgKzc3Miw3IEBACiAJX19kcmFpbl9wYWdlcyhzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJCiB9Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCisjZW5kaWYgLyogQ09ORklHX0hJQkVSTkFUSU9OICovCiAKIC8qCiAgKiBGcmVlIGEgMC1vcmRlciBwYWdlCkBAIC0yNzc1LDExICsyNzc1LDExIEBACiAJaWYgKGkgPT0gLTEpCiAJCXJldHVybiAwOwogCisJcHJldl9lbmRfcGZuID0gbWluKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiwgcmFuZ2VfZW5kX3Bmbik7CisKIAkvKiBBY2NvdW50IGZvciByYW5nZXMgYmVmb3JlIHBoeXNpY2FsIG1lbW9yeSBvbiB0aGlzIG5vZGUgKi8KIAlpZiAoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuID4gcmFuZ2Vfc3RhcnRfcGZuKQotCQlob2xlX3BhZ2VzID0gZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuIC0gcmFuZ2Vfc3RhcnRfcGZuOwotCi0JcHJldl9lbmRfcGZuID0gZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuOworCQlob2xlX3BhZ2VzID0gcHJldl9lbmRfcGZuIC0gcmFuZ2Vfc3RhcnRfcGZuOwogCiAJLyogRmluZCBhbGwgaG9sZXMgZm9yIHRoZSB6b25lIHdpdGhpbiB0aGUgbm9kZSAqLwogCWZvciAoOyBpICE9IC0xOyBpID0gbmV4dF9hY3RpdmVfcmVnaW9uX2luZGV4X2luX25pZChpLCBuaWQpKSB7CmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggYmRlMjcxYy4uYTY4NDc3OCAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtMjc3Niw3ICsyNzc2LDcgQEAKIAkgKiAnbm9kZWlkJy4KIAkgKi8KIAlpZiAoIW9ianApCi0JCW9ianAgPSBrbWVtX2dldHBhZ2VzKGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCk7CisJCW9ianAgPSBrbWVtX2dldHBhZ2VzKGNhY2hlcCwgbG9jYWxfZmxhZ3MsIG5vZGVpZCk7CiAJaWYgKCFvYmpwKQogCQlnb3RvIGZhaWxlZDsKIApkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDliMmQ2MTcuLjZjNmQ3NGYgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTExMzEsNiArMTEzMSw3IEBACiAJCXNsYWJfcGFkX2NoZWNrKHMsIHBhZ2UpOwogCQlmb3JfZWFjaF9vYmplY3QocCwgcywgcGFnZV9hZGRyZXNzKHBhZ2UpKQogCQkJY2hlY2tfb2JqZWN0KHMsIHBhZ2UsIHAsIDApOworCQlDbGVhclNsYWJEZWJ1ZyhwYWdlKTsKIAl9CiAKIAltb2Rfem9uZV9wYWdlX3N0YXRlKHBhZ2Vfem9uZShwYWdlKSwKQEAgLTExNjksNyArMTE3MCw2IEBACiAKIAlhdG9taWNfbG9uZ19kZWMoJm4tPm5yX3NsYWJzKTsKIAlyZXNldF9wYWdlX21hcGNvdW50KHBhZ2UpOwotCUNsZWFyU2xhYkRlYnVnKHBhZ2UpOwogCV9fQ2xlYXJQYWdlU2xhYihwYWdlKTsKIAlmcmVlX3NsYWIocywgcGFnZSk7CiB9CkBAIC0xNjU2LDYgKzE2NTYsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQob2JqZWN0LCBzLT5vYmpzaXplKTsKIAlpZiAobGlrZWx5KHBhZ2UgPT0gcy0+Y3B1X3NsYWJbc21wX3Byb2Nlc3Nvcl9pZCgpXSAmJgogCQkJCQkJIVNsYWJEZWJ1ZyhwYWdlKSkpIHsKIAkJb2JqZWN0W3BhZ2UtPm9mZnNldF0gPSBwYWdlLT5sb2NrbGVzc19mcmVlbGlzdDsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDdmZjBhODEuLmYwNzE2NDggMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtNDI1LDcgKzQyNSw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KIC8qCiAgKiBGaW5kIHRoZSBzd2FwIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byBnaXZlbiBkZXZpY2UgKGlmIGFueSkuCiAgKgpAQCAtOTUxLDcgKzk1MSw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KIC8qCiAgKiBHZXQgdGhlIChQQUdFX1NJWkUpIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gb2Zmc2V0IG9uIHRoZSBzd2FwZGV2CiAgKiBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGluZGV4IGluIHN3YXBfaW5mbyAoc3dhcCB0eXBlKS4KQEAgLTk2Niw3ICs5NjYsNyBAQAogCXNpcyA9IHN3YXBfaW5mbyArIHN3YXBfdHlwZTsKIAlyZXR1cm4gKHNpcy0+ZmxhZ3MgJiBTV1BfV1JJVEVPSykgPyBtYXBfc3dhcF9wYWdlKHNpcywgb2Zmc2V0KSA6IDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQgKi8KKyNlbmRpZiAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KIAogLyoKICAqIEZyZWUgYWxsIG9mIGEgc3dhcGRldidzIGV4dGVudCBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvbW0vdm1zdGF0LmMgYi9tbS92bXN0YXQuYwppbmRleCBmYWRmNzkxLi5jNjRkMTY5IDEwMDY0NAotLS0gYS9tbS92bXN0YXQuYworKysgYi9tbS92bXN0YXQuYwpAQCAtMTAsNiArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbi5jIGIvbmV0LzgwMjFxL3ZsYW4uYwppbmRleCBjZGE5MzZiLi4xNTgzYzVlIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbi5jCisrKyBiL25ldC84MDIxcS92bGFuLmMKQEAgLTgxMCw2ICs4MTAsNyBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIEdFVF9WTEFOX1JFQUxERVZfTkFNRV9DTUQ6CisJCWVyciA9IDA7CiAJCXZsYW5fZGV2X2dldF9yZWFsZGV2X25hbWUoZGV2LCBhcmdzLnUuZGV2aWNlMik7CiAJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYXJncywKIAkJCQkgc2l6ZW9mKHN0cnVjdCB2bGFuX2lvY3RsX2FyZ3MpKSkgewpAQCAtODE4LDYgKzgxOSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBHRVRfVkxBTl9WSURfQ01EOgorCQllcnIgPSAwOwogCQl2bGFuX2Rldl9nZXRfdmlkKGRldiwgJnZpZCk7CiAJCWFyZ3MudS5WSUQgPSB2aWQ7CiAJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYXJncywKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwppbmRleCA0MjBiYmI5Li41YzE4NTk1IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCkBAIC0xMTIsOSArMTEyLDkgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfbGlua19sb2NhbChjb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0KQogewotCWNvbnN0IHUxNiAqYSA9IChjb25zdCB1MTYgKikgZGVzdDsKLQlzdGF0aWMgY29uc3QgdTE2ICpjb25zdCBiID0gKGNvbnN0IHUxNiAqY29uc3QgKSBicl9ncm91cF9hZGRyZXNzOwotCXN0YXRpYyBjb25zdCB1MTYgbSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoMHhmZmYwKTsKKwlfX2JlMTYgKmEgPSAoX19iZTE2ICopZGVzdDsKKwlzdGF0aWMgY29uc3QgX19iZTE2ICpiID0gKGNvbnN0IF9fYmUxNiAqKWJyX2dyb3VwX2FkZHJlc3M7CisJc3RhdGljIGNvbnN0IF9fYmUxNiBtID0gX19jb25zdGFudF9jcHVfdG9fYmUxNigweGZmZjApOwogCiAJcmV0dXJuICgoYVswXSBeIGJbMF0pIHwgKGFbMV0gXiBiWzFdKSB8ICgoYVsyXSBeIGJbMl0pICYgbSkpID09IDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggMDMxYmZhNC4uNDU3ODE1ZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtOSw3ICs5LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgpAQCAtMTk2LDEwICsxOTUsOCBAQAogCXJldCA9IGVidF9yZWdpc3Rlcl93YXRjaGVyKCZsb2cpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IG5mX2xvZ19yZWdpc3RlcihQRl9CUklER0UsICZlYnRfbG9nX2xvZ2dlcik7Ci0JaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FRVhJU1QpCi0JCWVidF91bnJlZ2lzdGVyX3dhdGNoZXIoJmxvZyk7Ci0JcmV0dXJuIHJldDsKKwluZl9sb2dfcmVnaXN0ZXIoUEZfQlJJREdFLCAmZWJ0X2xvZ19sb2dnZXIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWJ0X2xvZ19maW5pKHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwppbmRleCA5NDExZGI2Mi4uMjA0Yzk2OCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3Vsb2cuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMzA4LDEyICszMDcsOCBAQAogCWVsc2UgaWYgKChyZXQgPSBlYnRfcmVnaXN0ZXJfd2F0Y2hlcigmdWxvZykpKQogCQlzb2NrX3JlbGVhc2UoZWJ0dWxvZ25sLT5za19zb2NrZXQpOwogCi0JaWYgKG5mX2xvZ19yZWdpc3RlcihQRl9CUklER0UsICZlYnRfdWxvZ19sb2dnZXIpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYnRfdWxvZzogbm90IGxvZ2dpbmcgdmlhIHVsb2cgIgotCQkgICAgICAgInNpbmNlIHNvbWVib2R5IGVsc2UgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBQRl9CUklER0VcbiIpOwotCQkvKiB3ZSBjYW5ub3QgbWFrZSBtb2R1bGUgbG9hZCBmYWlsIGhlcmUsIHNpbmNlIG90aGVyd2lzZQotCQkgKiBlYnRhYmxlcyB1c2Vyc3BhY2Ugd291bGQgYWJvcnQgKi8KLQl9CisJaWYgKHJldCA9PSAwKQorCQluZl9sb2dfcmVnaXN0ZXIoUEZfQlJJREdFLCAmZWJ0X3Vsb2dfbG9nZ2VyKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwppbmRleCA1OTM3YWQxLi4xMjdhNWU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKQEAgLTQ3OSwxMCArNDc5LDggQEAKIAlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9sb2dfcmVnKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlyZXQgPSBuZl9sb2dfcmVnaXN0ZXIoUEZfSU5FVCwgJmlwdF9sb2dfbG9nZ2VyKTsKLQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVFWElTVCkKLQkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9sb2dfcmVnKTsKLQlyZXR1cm4gcmV0OworCW5mX2xvZ19yZWdpc3RlcihQRl9JTkVULCAmaXB0X2xvZ19sb2dnZXIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXB0X2xvZ19maW5pKHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IGU4NDhkOGQuLmRlYWIyN2YgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC03Nyw3ICs3Nyw4IEBACiBoYXNoX2J5X3NyYyhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKIAkvKiBPcmlnaW5hbCBzcmMsIHRvIGVuc3VyZSB3ZSBtYXAgaXQgY29uc2lzdGVudGx5IGlmIHBvc3MuICovCi0JcmV0dXJuIGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy51My5pcCwgdHVwbGUtPnNyYy51LmFsbCwKKwlyZXR1cm4gamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMil0dXBsZS0+c3JjLnUzLmlwLAorCQkJICAgIChfX2ZvcmNlIHUzMil0dXBsZS0+c3JjLnUuYWxsLAogCQkJICAgIHR1cGxlLT5kc3QucHJvdG9udW0sIDApICUgbmZfbmF0X2h0YWJsZV9zaXplOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IDBmNDU0MjcuLjc2ZWM1OWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCiAJCSAgID8gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51My5pcAogCQkgICA6IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMudTMuaXApOwotCXVfaW50MTZfdCBhbGwKKwlfX2JlMTYgYWxsCiAJCT0gKEhPT0syTUFOSVAoaG9va251bSkgPT0gSVBfTkFUX01BTklQX1NSQwogCQkgICA/IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudS5hbGwKIAkJICAgOiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUuYWxsKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwppbmRleCBkZjMwOTc2ZjYuLmNhNzc0ZDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTM4NSw3ICszODUsNyBAQAogCiBzdGF0aWMgaW50CiBpcDZfdG5sX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4IGlwcHJvdG8sIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCSAgICBpbnQgKnR5cGUsIGludCAqY29kZSwgaW50ICptc2csIF9fYmUzMiAqaW5mbywgaW50IG9mZnNldCkKKwkgICAgaW50ICp0eXBlLCBpbnQgKmNvZGUsIGludCAqbXNnLCBfX3UzMiAqaW5mbywgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSAoc3RydWN0IGlwdjZoZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBpcDZfdG5sICp0OwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJCWlmICgoKmNvZGUpID09IElDTVBWNl9IRFJfRklFTEQpCiAJCQl0ZWxpID0gcGFyc2VfdGx2X3RubF9lbmNfbGltKHNrYiwgc2tiLT5kYXRhKTsKIAotCQlpZiAodGVsaSAmJiB0ZWxpID09IG50b2hsKCppbmZvKSAtIDIpIHsKKwkJaWYgKHRlbGkgJiYgdGVsaSA9PSAqaW5mbyAtIDIpIHsKIAkJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnNrYi0+ZGF0YVt0ZWxpXTsKIAkJCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKIAkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJQ01QVjZfUEtUX1RPT0JJRzoKLQkJbXR1ID0gbnRvaGwoKmluZm8pIC0gb2Zmc2V0OworCQltdHUgPSAqaW5mbyAtIG9mZnNldDsKIAkJaWYgKG10dSA8IElQVjZfTUlOX01UVSkKIAkJCW10dSA9IElQVjZfTUlOX01UVTsKIAkJdC0+ZGV2LT5tdHUgPSBtdHU7CkBAIC00NzgsMTIgKzQ3OCwxMiBAQAogCiBzdGF0aWMgaW50CiBpcDRpcDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCSAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKQogewogCWludCByZWxfbXNnID0gMDsKIAlpbnQgcmVsX3R5cGUgPSB0eXBlOwogCWludCByZWxfY29kZSA9IGNvZGU7Ci0JX191MzIgcmVsX2luZm8gPSBpbmZvOworCV9fdTMyIHJlbF9pbmZvID0gbnRvaGwoaW5mbyk7CiAJaW50IGVycjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKIAlzdHJ1Y3QgaXBoZHIgKmVpcGg7CkBAIC01NjQsMTAgKzU2NCw5IEBACiAJCQlnb3RvIG91dDsKIAogCQlza2IyLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiMi0+ZHN0LCByZWxfaW5mbyk7Ci0JCXJlbF9pbmZvID0gaHRvbmwocmVsX2luZm8pOwogCX0KIAotCWljbXBfc2VuZChza2IyLCByZWxfdHlwZSwgcmVsX2NvZGUsIHJlbF9pbmZvKTsKKwlpY21wX3NlbmQoc2tiMiwgcmVsX3R5cGUsIHJlbF9jb2RlLCBodG9ubChyZWxfaW5mbykpOwogCiBvdXQ6CiAJa2ZyZWVfc2tiKHNrYjIpOwpAQCAtNTc2LDEyICs1NzUsMTIgQEAKIAogc3RhdGljIGludAogaXA2aXA2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCisJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlpbnQgcmVsX21zZyA9IDA7CiAJaW50IHJlbF90eXBlID0gdHlwZTsKIAlpbnQgcmVsX2NvZGUgPSBjb2RlOwotCV9fdTMyIHJlbF9pbmZvID0gaW5mbzsKKwlfX3UzMiByZWxfaW5mbyA9IG50b2hsKGluZm8pOwogCWludCBlcnI7CiAKIAllcnIgPSBpcDZfdG5sX2Vycihza2IsIElQUFJPVE9fSVBWNiwgb3B0LCAmcmVsX3R5cGUsICZyZWxfY29kZSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKaW5kZXggYjA1MzI3ZS4uNmFiOTkwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKQEAgLTQ5MywxMCArNDkzLDggQEAKIAlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoJmlwNnRfbG9nX3JlZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dnZXIpOwotCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRUVYSVNUKQotCQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKTsKLQlyZXR1cm4gcmV0OworCW5mX2xvZ19yZWdpc3RlcihQRl9JTkVUNiwgJmlwNnRfbG9nZ2VyKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwNnRfbG9nX2Zpbmkodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IGQ2N2ZiMWUuLmYxMGYzNjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtNjMzLDYgKzYzMyw3IEBACiAJCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNiA9PSAwKSB7CiAJCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNik7CiAJCQkJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNiA9IE5VTEw7CisJCQkJdHAtPm1kNXNpZ19pbmZvLT5hbGxvY2VkNiA9IDA7CiAKIAkJCQl0Y3BfZnJlZV9tZDVzaWdfcG9vbCgpOwogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9pdWN2LmMgYi9uZXQvaXVjdi9pdWN2LmMKaW5kZXggYWQ1MTUwYi4uOTgzMDU4ZCAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvaXVjdi5jCisrKyBiL25ldC9pdWN2L2l1Y3YuYwpAQCAtNDc5LDcgKzQ3OSw4IEBACiAJCS8qIEVuYWJsZSBhbGwgY3B1cyB3aXRoIGEgZGVjbGFyZWQgYnVmZmVyLiAqLwogCQlpZiAoY3B1X2lzc2V0KGNwdSwgaXVjdl9idWZmZXJfY3B1bWFzaykgJiYKIAkJICAgICFjcHVfaXNzZXQoY3B1LCBpdWN2X2lycV9jcHVtYXNrKSkKLQkJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfYWxsb3dfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworCQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaXVjdl9hbGxvd19jcHUsCisJCQkJCQkgTlVMTCwgMCwgMSk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIApAQCAtNDk3LDcgKzQ5OCw3IEBACiAJY3B1bWFzayA9IGl1Y3ZfaXJxX2NwdW1hc2s7CiAJY3B1X2NsZWFyKGZpcnN0X2NwdShpdWN2X2lycV9jcHVtYXNrKSwgY3B1bWFzayk7CiAJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjcHVtYXNrKQotCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X2Jsb2NrX2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaXVjdl9ibG9ja19jcHUsIE5VTEwsIDAsIDEpOwogfQogCiAvKioKQEAgLTUyMiw3ICs1MjMsNyBAQAogCXJjID0gLUVJTzsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJc21wX2NhbGxfZnVuY3Rpb25fb24oaXVjdl9kZWNsYXJlX2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaXVjdl9kZWNsYXJlX2NwdSwgTlVMTCwgMCwgMSk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIAlpZiAoY3B1c19lbXB0eShpdWN2X2J1ZmZlcl9jcHVtYXNrKSkKIAkJLyogTm8gY3B1IGNvdWxkIGRlY2xhcmUgYW4gaXVjdiBidWZmZXIuICovCkBAIC01NzgsNyArNTc5LDcgQEAKIAljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJc21wX2NhbGxfZnVuY3Rpb25fb24oaXVjdl9kZWNsYXJlX2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaXVjdl9kZWNsYXJlX2NwdSwgTlVMTCwgMCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKIAljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgpAQCAtNTg3LDEwICs1ODgsMTAgQEAKIAkJaWYgKGNwdXNfZW1wdHkoY3B1bWFzaykpCiAJCQkvKiBDYW4ndCBvZmZsaW5lIGxhc3QgSVVDViBlbmFibGVkIGNwdS4gKi8KIAkJCXJldHVybiBOT1RJRllfQkFEOwotCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X3JldHJpZXZlX2NwdSwgTlVMTCwgMCwgMSwgY3B1KTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaXVjdl9yZXRyaWV2ZV9jcHUsIE5VTEwsIDAsIDEpOwogCQlpZiAoY3B1c19lbXB0eShpdWN2X2lycV9jcHVtYXNrKSkKLQkJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfYWxsb3dfY3B1LCBOVUxMLCAwLCAxLAotCQkJCQkgICAgIGZpcnN0X2NwdShpdWN2X2J1ZmZlcl9jcHVtYXNrKSk7CisJCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZmlyc3RfY3B1KGl1Y3ZfYnVmZmVyX2NwdW1hc2spLAorCQkJCQkJIGl1Y3ZfYWxsb3dfY3B1LCBOVUxMLCAwLCAxKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBOT1RJRllfT0s7CmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCAwZjgzMDRiLi43YjBhOTVhIDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTI1NDAsNyArMjU0MCw3IEBACiAJc2VsLnByb3RvID0gcGZrZXlfcHJvdG9fdG9feGZybShzYS0+c2FkYl9hZGRyZXNzX3Byb3RvKTsKIAlzZWwuc3BvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShzYSArIDEpKS0+c2luX3BvcnQ7CiAJaWYgKHNlbC5zcG9ydCkKLQkJc2VsLnNwb3J0X21hc2sgPSB+MDsKKwkJc2VsLnNwb3J0X21hc2sgPSBodG9ucygweGZmZmYpOwogCiAJLyogc2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgaW5mbyBvZiBzZWxlY3RvciAqLwogCXNhID0gZXh0X2hkcnNbU0FEQl9FWFRfQUREUkVTU19EU1QgLSAxXSwKQEAgLTI1NDksNyArMjU0OSw3IEBACiAJc2VsLnByb3RvID0gcGZrZXlfcHJvdG9fdG9feGZybShzYS0+c2FkYl9hZGRyZXNzX3Byb3RvKTsKIAlzZWwuZHBvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShzYSArIDEpKS0+c2luX3BvcnQ7CiAJaWYgKHNlbC5kcG9ydCkKLQkJc2VsLmRwb3J0X21hc2sgPSB+MDsKKwkJc2VsLmRwb3J0X21hc2sgPSBodG9ucygweGZmZmYpOwogCiAJcnEgPSAoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QgKikocG9sICsgMSk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCBhYTA4NmM4Li4wZmUxMTg4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC03OSw3ICs3OSw4IEBACiAJYSA9IGpoYXNoMih0dXBsZS0+c3JjLnUzLmFsbCwgQVJSQVlfU0laRSh0dXBsZS0+c3JjLnUzLmFsbCksCiAJCSAgICh0dXBsZS0+c3JjLmwzbnVtIDw8IDE2KSB8IHR1cGxlLT5kc3QucHJvdG9udW0pOwogCWIgPSBqaGFzaDIodHVwbGUtPmRzdC51My5hbGwsIEFSUkFZX1NJWkUodHVwbGUtPmRzdC51My5hbGwpLAotCQkgICAodHVwbGUtPnNyYy51LmFsbCA8PCAxNikgfCB0dXBsZS0+ZHN0LnUuYWxsKTsKKwkJICAgKChfX2ZvcmNlIF9fdTE2KXR1cGxlLT5zcmMudS5hbGwgPDwgMTYpIHwKKwkJICAgIChfX2ZvcmNlIF9fdTE2KXR1cGxlLT5kc3QudS5hbGwpOwogCiAJcmV0dXJuIGpoYXNoXzJ3b3JkcyhhLCBiLCBybmQpICUgc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKaW5kZXggMWFhNjIyOS4uZWI2Njk1ZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCXJldHVybiBqaGFzaDIodHVwbGUtPmRzdC51My5hbGwsIEFSUkFZX1NJWkUodHVwbGUtPmRzdC51My5hbGwpLAogCQkgICAgICAoKCh0dXBsZS0+ZHN0LnByb3RvbnVtIF4gdHVwbGUtPnNyYy5sM251bSkgPDwgMTYpIHwKLQkJICAgICAgIHR1cGxlLT5kc3QudS5hbGwpIF4gbmZfY3RfZXhwZWN0X2hhc2hfcm5kKSAlCisJCSAgICAgICAoX19mb3JjZSBfX3UxNil0dXBsZS0+ZHN0LnUuYWxsKSBeIG5mX2N0X2V4cGVjdF9oYXNoX3JuZCkgJQogCSAgICAgICBuZl9jdF9leHBlY3RfaHNpemU7CiB9CiAKQEAgLTI1OSw4ICsyNTksOCBAQAogCX0KIAogCWlmIChzcmMpIHsKLQkJZXhwLT50dXBsZS5zcmMudS5hbGwgPSAoX19mb3JjZSB1MTYpKnNyYzsKLQkJZXhwLT5tYXNrLnNyYy51LmFsbCA9IDB4RkZGRjsKKwkJZXhwLT50dXBsZS5zcmMudS5hbGwgPSAqc3JjOworCQlleHAtPm1hc2suc3JjLnUuYWxsID0gaHRvbnMoMHhGRkZGKTsKIAl9IGVsc2UgewogCQlleHAtPnR1cGxlLnNyYy51LmFsbCA9IDA7CiAJCWV4cC0+bWFzay5zcmMudS5hbGwgPSAwOwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJCW1lbXNldCgodm9pZCAqKSZleHAtPnR1cGxlLmRzdC51MyArIGxlbiwgMHgwMCwKIAkJICAgICAgIHNpemVvZihleHAtPnR1cGxlLmRzdC51MykgLSBsZW4pOwogCi0JZXhwLT50dXBsZS5kc3QudS5hbGwgPSAoX19mb3JjZSB1MTYpKmRzdDsKKwlleHAtPnR1cGxlLmRzdC51LmFsbCA9ICpkc3Q7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9leHBlY3RfaW5pdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKaW5kZXggY2ExMGRmNC4uOTZhYTYzNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKQEAgLTM5LDcgKzM5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGVscGVyX2hhc2goY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7CiAJcmV0dXJuICgoKHR1cGxlLT5zcmMubDNudW0gPDwgOCkgfCB0dXBsZS0+ZHN0LnByb3RvbnVtKSBeCi0JCXR1cGxlLT5zcmMudS5hbGwpICUgbmZfY3RfaGVscGVyX2hzaXplOworCQkoX19mb3JjZSBfX3UxNil0dXBsZS0+c3JjLnUuYWxsKSAlIG5mX2N0X2hlbHBlcl9oc2l6ZTsKIH0KIAogc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCA4N2FkM2NjLi5lYjNmZTc0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYwppbmRleCAxM2Q5NGEwLi4yYTJmZDFhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYwppbmRleCA5M2U3NDdiLi5iOTA2YjQxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHBsaXRlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwbGl0ZS5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9jb25ubGltaXQuYwppbmRleCAzMzM1ZGQ1Li4wNmNmZjFkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmMKQEAgLTQyLDEzICs0MiwxMyBAQAogc3RhdGljIHVfaW50MzJfdCBjb25ubGltaXRfcm5kOwogc3RhdGljIGJvb2wgY29ubmxpbWl0X3JuZF9pbml0ZWQ7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvbm5saW1pdF9pcGhhc2godV9pbnQzMl90IGFkZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb25ubGltaXRfaXBoYXNoKF9fYmUzMiBhZGRyKQogewogCWlmICh1bmxpa2VseSghY29ubmxpbWl0X3JuZF9pbml0ZWQpKSB7CiAJCWdldF9yYW5kb21fYnl0ZXMoJmNvbm5saW1pdF9ybmQsIHNpemVvZihjb25ubGltaXRfcm5kKSk7CiAJCWNvbm5saW1pdF9ybmRfaW5pdGVkID0gdHJ1ZTsKIAl9Ci0JcmV0dXJuIGpoYXNoXzF3b3JkKGFkZHIsIGNvbm5saW1pdF9ybmQpICYgMHhGRjsKKwlyZXR1cm4gamhhc2hfMXdvcmQoKF9fZm9yY2UgX191MzIpYWRkciwgY29ubmxpbWl0X3JuZCkgJiAweEZGOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludApAQCAtNjYsNyArNjYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkZHItPmlwNik7ICsraSkKIAkJcmVzLmlwNltpXSA9IGFkZHItPmlwNltpXSAmIG1hc2stPmlwNltpXTsKIAotCXJldHVybiBqaGFzaDIocmVzLmlwNiwgQVJSQVlfU0laRShyZXMuaXA2KSwgY29ubmxpbWl0X3JuZCkgJiAweEZGOworCXJldHVybiBqaGFzaDIoKHUzMiAqKXJlcy5pcDYsIEFSUkFZX1NJWkUocmVzLmlwNiksIGNvbm5saW1pdF9ybmQpICYgMHhGRjsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGFscmVhZHlfY2xvc2VkKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjb25uKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwppbmRleCBmNDdjYWI3YTYuLmE0YmFiMDQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9waHlzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPiIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF91MzIuYyBiL25ldC9uZXRmaWx0ZXIveHRfdTMyLmMKaW5kZXggMDRiNjc3YS4uNzRmOWIxNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF91MzIuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3UzMi5jCkBAIC0yMSw2ICsyMSw3IEBACiAJdW5zaWduZWQgaW50IG5udW1zOwogCXVuc2lnbmVkIGludCBudmFsczsKIAl1bnNpZ25lZCBpbnQgaTsKKwlfX2JlMzIgbjsKIAl1X2ludDMyX3QgcG9zOwogCXVfaW50MzJfdCB2YWw7CiAJdV9pbnQzMl90IGF0OwpAQCAtMzgsOSArMzksOSBAQAogCQlpZiAoc2tiLT5sZW4gPCA0IHx8IHBvcyA+IHNrYi0+bGVuIC0gNCk7CiAJCQlyZXR1cm4gZmFsc2U7CiAKLQkJcmV0ICAgPSBza2JfY29weV9iaXRzKHNrYiwgcG9zLCAmdmFsLCBzaXplb2YodmFsKSk7CisJCXJldCAgID0gc2tiX2NvcHlfYml0cyhza2IsIHBvcywgJm4sIHNpemVvZihuKSk7CiAJCUJVR19PTihyZXQgPCAwKTsKLQkJdmFsICAgPSBudG9obCh2YWwpOworCQl2YWwgICA9IG50b2hsKG4pOwogCQlubnVtcyA9IGN0LT5ubnVtczsKIAogCQkvKiBJbm5lciBsb29wIHJ1bnMgb3ZlciAiJiIsICI8PCIsICI+PiIgYW5kICJAIiBvcGVyYW5kcyAqLwpAQCAtNjUsMTAgKzY2LDEwIEBACiAJCQkJICAgIHBvcyA+IHNrYi0+bGVuIC0gYXQgLSA0KQogCQkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJCQlyZXQgPSBza2JfY29weV9iaXRzKHNrYiwgYXQgKyBwb3MsICZ2YWwsCi0JCQkJCQkgICAgc2l6ZW9mKHZhbCkpOworCQkJCXJldCA9IHNrYl9jb3B5X2JpdHMoc2tiLCBhdCArIHBvcywgJm4sCisJCQkJCQkgICAgc2l6ZW9mKG4pKTsKIAkJCQlCVUdfT04ocmV0IDwgMCk7Ci0JCQkJdmFsID0gbnRvaGwodmFsKTsKKwkJCQl2YWwgPSBudG9obChuKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCBlMTQ2NTMxLi44YzExY2E0IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJfQogCiAJZXJyID0gbmV0bGlua19jaGFuZ2Vfbmdyb3VwcyhnZW5sX3NvY2ssCi0JCQkJICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiBORVRMSU5LX0dFTkVSSUMpOworCQkJCSAgICAgbWNfZ3JvdXBzX2xvbmdzICogQklUU19QRVJfTE9ORyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE5NiwxMCArMTk2LDIyIEBACiAJZ2VubF9jdHJsX2V2ZW50KENUUkxfQ01EX05FV01DQVNUX0dSUCwgZ3JwKTsKICBvdXQ6CiAJZ2VubF91bmxvY2soKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChnZW5sX3JlZ2lzdGVyX21jX2dyb3VwKTsKIAorc3RhdGljIHZvaWQgX19nZW5sX3VucmVnaXN0ZXJfbWNfZ3JvdXAoc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHksCisJCQkJICAgICAgIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCAqZ3JwKQoreworCUJVR19PTihncnAtPmZhbWlseSAhPSBmYW1pbHkpOworCW5ldGxpbmtfY2xlYXJfbXVsdGljYXN0X3VzZXJzKGdlbmxfc29jaywgZ3JwLT5pZCk7CisJY2xlYXJfYml0KGdycC0+aWQsIG1jX2dyb3Vwcyk7CisJbGlzdF9kZWwoJmdycC0+bGlzdCk7CisJZ2VubF9jdHJsX2V2ZW50KENUUkxfQ01EX0RFTE1DQVNUX0dSUCwgZ3JwKTsKKwlncnAtPmlkID0gMDsKKwlncnAtPmZhbWlseSA9IE5VTEw7Cit9CisKIC8qKgogICogZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwIC0gdW5yZWdpc3RlciBhIG11bHRpY2FzdCBncm91cAogICoKQEAgLTIxNywxNCArMjI5LDggQEAKIHZvaWQgZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwKHN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5LAogCQkJICAgICAgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwICpncnApCiB7Ci0JQlVHX09OKGdycC0+ZmFtaWx5ICE9IGZhbWlseSk7CiAJZ2VubF9sb2NrKCk7Ci0JbmV0bGlua19jbGVhcl9tdWx0aWNhc3RfdXNlcnMoZ2VubF9zb2NrLCBncnAtPmlkKTsKLQljbGVhcl9iaXQoZ3JwLT5pZCwgbWNfZ3JvdXBzKTsKLQlsaXN0X2RlbCgmZ3JwLT5saXN0KTsKLQlnZW5sX2N0cmxfZXZlbnQoQ1RSTF9DTURfREVMTUNBU1RfR1JQLCBncnApOwotCWdycC0+aWQgPSAwOwotCWdycC0+ZmFtaWx5ID0gTlVMTDsKKwlfX2dlbmxfdW5yZWdpc3Rlcl9tY19ncm91cChmYW1pbHksIGdycCk7CiAJZ2VubF91bmxvY2soKTsKIH0KIApAQCAtMjMyLDggKzIzOCwxMCBAQAogewogCXN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCAqZ3JwLCAqdG1wOwogCisJZ2VubF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGdycCwgdG1wLCAmZmFtaWx5LT5tY2FzdF9ncm91cHMsIGxpc3QpCi0JCWdlbmxfdW5yZWdpc3Rlcl9tY19ncm91cChmYW1pbHksIGdycCk7CisJCV9fZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwKGZhbWlseSwgZ3JwKTsKKwlnZW5sX3VubG9jaygpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hZl9yeHJwYy5jIGIvbmV0L3J4cnBjL2FmX3J4cnBjLmMKaW5kZXggMTZhNjhkZi4uYzU4ZmEwZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FmX3J4cnBjLmMKKysrIGIvbmV0L3J4cnBjL2FmX3J4cnBjLmMKQEAgLTc4Nyw3ICs3ODcsNyBAQAogCiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcnhycGNfc2tiX3ByaXYpID4gc2l6ZW9mKGR1bW15X3NrYi0+Y2IpKTsKIAotCXJ4cnBjX2Vwb2NoID0gaHRvbmwoeHRpbWUudHZfc2VjKTsKKwlyeHJwY19lcG9jaCA9IGh0b25sKGdldF9zZWNvbmRzKCkpOwogCiAJcmV0ID0gLUVOT01FTTsKIAlyeHJwY19jYWxsX2phciA9IGttZW1fY2FjaGVfY3JlYXRlKApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNvbm5lY3Rpb24uYyBiL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMKaW5kZXggNDgyNzUwZS4uZDY2NjdmNyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FyLWNvbm5lY3Rpb24uYworKysgYi9uZXQvcnhycGMvYXItY29ubmVjdGlvbi5jCkBAIC03MSw3ICs3MSw3IEBACiAJc3RydWN0IHJiX25vZGUgKnAsICpwYXJlbnQsICoqcHA7CiAKIAlfZW50ZXIoIiVweyV4fSwleCwlaHgsIiwKLQkgICAgICAgcngsIGtleV9zZXJpYWwoa2V5KSwgdHJhbnMtPmRlYnVnX2lkLCBudG9obChzZXJ2aWNlX2lkKSk7CisJICAgICAgIHJ4LCBrZXlfc2VyaWFsKGtleSksIHRyYW5zLT5kZWJ1Z19pZCwgbnRvaHMoc2VydmljZV9pZCkpOwogCiAJaWYgKHJ4LT50cmFucyA9PSB0cmFucyAmJiByeC0+YnVuZGxlKSB7CiAJCWF0b21pY19pbmMoJnJ4LT5idW5kbGUtPnVzYWdlKTsKQEAgLTc5MSw3ICs3OTEsNyBAQAogCiAJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksID4sIDApOwogCi0JY29ubi0+cHV0X3RpbWUgPSB4dGltZS50dl9zZWM7CisJY29ubi0+cHV0X3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT51c2FnZSkpIHsKIAkJX2RlYnVnKCJ6b21iaWUiKTsKIAkJcnhycGNfcXVldWVfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXAsIDApOwpAQCAtODM1LDcgKzgzNSw3IEBACiAKIAlfZW50ZXIoIiIpOwogCi0Jbm93ID0geHRpbWUudHZfc2VjOworCW5vdyA9IGdldF9zZWNvbmRzKCk7CiAJZWFybGllc3QgPSBVTE9OR19NQVg7CiAKIAl3cml0ZV9sb2NrX2JoKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXRyYW5zcG9ydC5jIGIvbmV0L3J4cnBjL2FyLXRyYW5zcG9ydC5jCmluZGV4IGQ0M2Q3OGYuLmJiMjgyYTYgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci10cmFuc3BvcnQuYworKysgYi9uZXQvcnhycGMvYXItdHJhbnNwb3J0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpLCA+LCAwKTsKIAotCXRyYW5zLT5wdXRfdGltZSA9IHh0aW1lLnR2X3NlYzsKKwl0cmFucy0+cHV0X3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCWlmICh1bmxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmFucy0+dXNhZ2UpKSkKIAkJX2RlYnVnKCJ6b21iaWUiKTsKIAkJLyogbGV0IHRoZSByZWFwZXIgZGV0ZXJtaW5lIHRoZSB0aW1lb3V0IHRvIGF2b2lkIGEgcmFjZSB3aXRoCkBAIC0yMTksNyArMjE5LDcgQEAKIAogCV9lbnRlcigiIik7CiAKLQlub3cgPSB4dGltZS50dl9zZWM7CisJbm93ID0gZ2V0X3NlY29uZHMoKTsKIAllYXJsaWVzdCA9IFVMT05HX01BWDsKIAogCS8qIGV4dHJhY3QgYWxsIHRoZSB0cmFuc3BvcnRzIHRoYXQgaGF2ZSBiZWVuIGRlYWQgdG9vIGxvbmcgKi8KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9yeGthZC5jIGIvbmV0L3J4cnBjL3J4a2FkLmMKaW5kZXggNWVjNzA1MS4uYWMzY2FiZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3J4a2FkLmMKKysrIGIvbmV0L3J4cnBjL3J4a2FkLmMKQEAgLTkxNiw3ICs5MTYsNyBAQAogCQlpc3N1ZSA9IGJlMzJfdG9fY3B1KHN0YW1wKTsKIAl9CiAJcCArPSA0OwotCW5vdyA9IHh0aW1lLnR2X3NlYzsKKwlub3cgPSBnZXRfc2Vjb25kcygpOwogCV9kZWJ1ZygiS0lWIElTU1VFOiAlbHggWyVseF0iLCBpc3N1ZSwgbm93KTsKIAogCS8qIGNoZWNrIHRoZSB0aWNrZXQgaXMgaW4gZGF0ZSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCmluZGV4IDQ5MDY5NzUuLmRjMmY0MWUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKQEAgLTc2OSwxMSArNzY5LDEyIEBACiAJbmV3LT5oLmZsYXZvdXIgPSAmc3ZjYXV0aG9wc19nc3M7CiAJbmV3LT5wc2V1ZG9mbGF2b3IgPSBwc2V1ZG9mbGF2b3I7CiAKKwlzdGF0ID0gMDsKIAl0ZXN0ID0gYXV0aF9kb21haW5fbG9va3VwKG5hbWUsICZuZXctPmgpOwotCWlmICh0ZXN0ICE9ICZuZXctPmgpIHsgLyogWFhYIER1cGxpY2F0ZSByZWdpc3RyYXRpb24/ICovCi0JCWF1dGhfZG9tYWluX3B1dCgmbmV3LT5oKTsKLQkJLyogZGFuZ2xpbmcgcmVmLWNvdW50Li4uICovCi0JCWdvdG8gb3V0OworCWlmICh0ZXN0ICE9ICZuZXctPmgpIHsgLyogRHVwbGljYXRlIHJlZ2lzdHJhdGlvbiAqLworCQlhdXRoX2RvbWFpbl9wdXQodGVzdCk7CisJCWtmcmVlKG5ldy0+aC5uYW1lKTsKKwkJZ290byBvdXRfZnJlZV9kb207CiAJfQogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y3NvY2suYyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCmluZGV4IDY0YjliOGMuLjEyZmY1ZGEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3Zjc29jay5jCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC0xMzEsMTMgKzEzMSwxMyBAQAogCWNhc2UgQUZfSU5FVDoKIAkJc25wcmludGYoYnVmLCBsZW4sICIldS4ldS4ldS4ldSwgcG9ydD0ldSIsCiAJCQlOSVBRVUFEKCgoc3RydWN0IHNvY2thZGRyX2luICopIGFkZHIpLT5zaW5fYWRkciksCi0JCQlodG9ucygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBhZGRyKS0+c2luX3BvcnQpKTsKKwkJCW50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luICopIGFkZHIpLT5zaW5fcG9ydCkpOwogCQlicmVhazsKIAogCWNhc2UgQUZfSU5FVDY6CiAJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXg6JXg6JXg6JXg6JXg6JXg6JXg6JXgsIHBvcnQ9JXUiLAogCQkJTklQNigoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYWRkciktPnNpbjZfYWRkciksCi0JCQlodG9ucygoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYWRkciktPnNpbjZfcG9ydCkpOworCQkJbnRvaHMoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIGFkZHIpLT5zaW42X3BvcnQpKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbXNnLmggYi9uZXQvdGlwYy9tc2cuaAppbmRleCAzNWQ1YmExLi5jZTI2NTk4IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9tc2cuaAorKysgYi9uZXQvdGlwYy9tc2cuaApAQCAtNzIsMTAgKzcyLDggQEAKIAkJCQl1MzIgcG9zLCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKIAl2YWwgPSAodmFsICYgbWFzaykgPDwgcG9zOwotCXZhbCA9IGh0b25sKHZhbCk7Ci0JbWFzayA9IGh0b25sKG1hc2sgPDwgcG9zKTsKLQltLT5oZHJbd10gJj0gfm1hc2s7Ci0JbS0+aGRyW3ddIHw9IHZhbDsKKwltLT5oZHJbd10gJj0gfmh0b25sKG1hc2sgPDwgcG9zKTsKKwltLT5oZHJbd10gfD0gaHRvbmwodmFsKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQgYi9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkCmluZGV4IDNmN2I0NTEuLjdmZDYwNTUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApAQCAtMzE1LDcgKzMxNSw3IEBACiBjbWRfbGlua19tdWx0aS15ID0gJChMRCkgJChsZF9mbGFncykgLXIgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCiAKIHF1aWV0X2NtZF9saW5rX211bHRpLW0gPSBMRCBbTV0gICRACi1jbWRfbGlua19tdWx0aS1tID0gJChMRCkgJChsZF9mbGFncykgJChMREZMQUdTX01PRFVMRSkgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCitjbWRfbGlua19tdWx0aS1tID0gJChjbWRfbGlua19tdWx0aS15KQogCiAjIFdlIHdvdWxkIHJhdGhlciBoYXZlIGEgbGlzdCBvZiBydWxlcyBsaWtlCiAjIAlmb28ubzogJChmb28tb2JqcykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdCBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAppbmRleCBjNmZjYzU5Li5kOTg4ZjVkIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CkBAIC01NiwyMyArNTYsMjQgQEAKIAogIyBTdGVwIDIpLCBpbnZva2UgbW9kcG9zdAogIyAgSW5jbHVkZXMgc3RlcCAzLDQKK21vZHBvc3QgPSBzY3JpcHRzL21vZC9tb2Rwb3N0ICAgICAgICAgICAgICAgICAgICBcCisgJChpZiAkKENPTkZJR19NT0RWRVJTSU9OUyksLW0pICAgICAgICAgICAgICAgICAgXAorICQoaWYgJChDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMKSwtYSwpICAgICAgIFwKKyAkKGlmICQoS0JVSUxEX0VYVE1PRCksLWksLW8pICQoa2VybmVsc3ltZmlsZSkgICBcCisgJChpZiAkKEtCVUlMRF9FWFRNT0QpLC1JICQobW9kdWxlc3ltZmlsZSkpICAgICAgXAorICQoaWYgJChLQlVJTERfRVhUTU9EKSwtbyAkKG1vZHVsZXN5bWZpbGUpKSAgICAgIFwKKyAkKGlmICQoS0JVSUxEX0VYVE1PRCkkKEtCVUlMRF9NT0RQT1NUX1dBUk4pLC13KQorCiBxdWlldF9jbWRfbW9kcG9zdCA9IE1PRFBPU1QgJCh3b3JkcyAkKGZpbHRlci1vdXQgdm1saW51eCBGT1JDRSwgJF4pKSBtb2R1bGVzCi0gICAgICBjbWRfbW9kcG9zdCA9IHNjcmlwdHMvbW9kL21vZHBvc3QgICAgICAgICAgICBcCi0gICAgICAgICQoaWYgJChDT05GSUdfTU9EVkVSU0lPTlMpLC1tKSAgICAgICAgICAgICBcCi0JJChpZiAkKENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwpLC1hLCkgIFwKLQkkKGlmICQoS0JVSUxEX0VYVE1PRCksLWksLW8pICQoa2VybmVsc3ltZmlsZSkgXAotCSQoaWYgJChLQlVJTERfRVhUTU9EKSwtSSAkKG1vZHVsZXN5bWZpbGUpKSBcCi0JJChpZiAkKEtCVUlMRF9FWFRNT0QpLC1vICQobW9kdWxlc3ltZmlsZSkpIFwKLQkkKGlmICQoS0JVSUxEX0VYVE1PRCkkKEtCVUlMRF9NT0RQT1NUX1dBUk4pLC13KQorICAgICAgY21kX21vZHBvc3QgPSAkKG1vZHBvc3QpIC1zCiAKIFBIT05ZICs9IF9fbW9kcG9zdAogX19tb2Rwb3N0OiAkKG1vZHVsZXM6LmtvPS5vKSBGT1JDRQogCSQoY2FsbCBjbWQsbW9kcG9zdCkgJCh3aWxkY2FyZCB2bWxpbnV4KSAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pCiAKIHF1aWV0X2NtZF9rZXJuZWwtbW9kID0gTU9EUE9TVCAkQAotICAgICAgY21kX2tlcm5lbC1tb2QgPSAkKGNtZF9tb2Rwb3N0KSAkQAorICAgICAgY21kX2tlcm5lbC1tb2QgPSAkKG1vZHBvc3QpICRACiAKLVBIT05ZICs9IHZtbGludXgKIHZtbGludXgubzogRk9SQ0UKIAkkKGNhbGwgY21kLGtlcm5lbC1tb2QpCiAKQEAgLTk3LDcgKzk4LDcgQEAKIAogIyBTdGVwIDYpLCBmaW5hbCBsaW5rIG9mIHRoZSBtb2R1bGVzCiBxdWlldF9jbWRfbGRfa29fbyA9IExEIFtNXSAgJEAKLSAgICAgIGNtZF9sZF9rb19vID0gJChMRCkgJChMREZMQUdTKSAkKExERkxBR1NfTU9EVUxFKSAtbyAkQAkJXAorICAgICAgY21kX2xkX2tvX28gPSAkKExEKSAtciAkKExERkxBR1MpICQoTERGTEFHU19NT0RVTEUpIC1vICRACQlcCiAJCQkgICQoZmlsdGVyLW91dCBGT1JDRSwkXikKIAogJChtb2R1bGVzKTogJS5rbyA6JS5vICUubW9kLm8gRk9SQ0UKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IDExOTliYWYuLjhiZTZhNDIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMzcsNiArMzcsMTQgQEAKIAogc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9IE5fKCJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIHlldC5cbiIpOwogCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJaWYgKG1lbnVfaGFzX2hlbHAobWVudSkpCisJCXJldHVybiBtZW51X2dldF9oZWxwKG1lbnUpOworCWVsc2UKKwkJcmV0dXJuIG5vaGVscF90ZXh0OworfQorCiBzdGF0aWMgdm9pZCBzdHJpcChjaGFyICpzdHIpCiB7CiAJY2hhciAqcCA9IHN0cjsKQEAgLTE3MSw3ICsxNzksNyBAQAogaW50IGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KQogewogCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKLQljb25zdCBjaGFyICpkZWYsICpoZWxwOworCWNvbnN0IGNoYXIgKmRlZjsKIAogCXdoaWxlICgxKSB7CiAJCXByaW50ZigiJSpzJXMgIiwgaW5kZW50IC0gMSwgIiIsIG1lbnUtPnByb21wdC0+dGV4dCk7CkBAIC0xODYsMTAgKzE5NCw3IEBACiAJCWNhc2UgJz8nOgogCQkJLyogcHJpbnQgaGVscCAqLwogCQkJaWYgKGxpbmVbMV0gPT0gJ1xuJykgewotCQkJCWhlbHAgPSBub2hlbHBfdGV4dDsKLQkJCQlpZiAobWVudS0+c3ltLT5oZWxwKQotCQkJCQloZWxwID0gbWVudS0+c3ltLT5oZWxwOwotCQkJCXByaW50ZigiXG4lc1xuIiwgbWVudS0+c3ltLT5oZWxwKTsKKwkJCQlwcmludGYoIlxuJXNcbiIsIGdldF9oZWxwKG1lbnUpKTsKIAkJCQlkZWYgPSBOVUxMOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjA3LDcgKzIxMiw2IEBACiAJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOwogCWludCB0eXBlOwogCXRyaXN0YXRlIG9sZHZhbCwgbmV3dmFsOwotCWNvbnN0IGNoYXIgKmhlbHA7CiAKIAl3aGlsZSAoMSkgewogCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOwpAQCAtMjMzLDcgKzIzNyw3IEBACiAJCQlwcmludGYoIi9tIik7CiAJCWlmIChvbGR2YWwgIT0geWVzICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKQogCQkJcHJpbnRmKCIveSIpOwotCQlpZiAoc3ltLT5oZWxwKQorCQlpZiAobWVudV9oYXNfaGVscChtZW51KSkKIAkJCXByaW50ZigiLz8iKTsKIAkJcHJpbnRmKCJdICIpOwogCQljb25mX2Fza3ZhbHVlKHN5bSwgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CkBAIC0yNjksMTAgKzI3Myw3IEBACiAJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKIAkJCXJldHVybiAwOwogaGVscDoKLQkJaGVscCA9IG5vaGVscF90ZXh0OwotCQlpZiAoc3ltLT5oZWxwKQotCQkJaGVscCA9IHN5bS0+aGVscDsKLQkJcHJpbnRmKCJcbiVzXG4iLCBoZWxwKTsKKwkJcHJpbnRmKCJcbiVzXG4iLCBnZXRfaGVscChtZW51KSk7CiAJfQogfQogCkBAIC0zNDIsNyArMzQzLDcgQEAKIAkJCWdvdG8gY29uZl9jaGlsZHM7CiAJCX0KIAkJcHJpbnRmKCJbMS0lZCIsIGNudCk7Ci0JCWlmIChzeW0tPmhlbHApCisJCWlmIChtZW51X2hhc19oZWxwKG1lbnUpKQogCQkJcHJpbnRmKCI/Iik7CiAJCXByaW50ZigiXTogIik7CiAJCXN3aXRjaCAoaW5wdXRfbW9kZSkgewpAQCAtMzU5LDggKzM2MCw3IEBACiAJCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKIAkJCXN0cmlwKGxpbmUpOwogCQkJaWYgKGxpbmVbMF0gPT0gJz8nKSB7Ci0JCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPwotCQkJCQltZW51LT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBnZXRfaGVscChtZW51KSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlpZiAoIWxpbmVbMF0pCkBAIC0zOTEsOCArMzkxLDcgQEAKIAkJaWYgKCFjaGlsZCkKIAkJCWNvbnRpbnVlOwogCQlpZiAobGluZVtzdHJsZW4obGluZSkgLSAxXSA9PSAnPycpIHsKLQkJCXByaW50ZigiXG4lc1xuIiwgY2hpbGQtPnN5bS0+aGVscCA/Ci0JCQkJY2hpbGQtPnN5bS0+aGVscCA6IG5vaGVscF90ZXh0KTsKKwkJCXByaW50ZigiXG4lc1xuIiwgZ2V0X2hlbHAoY2hpbGQpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN5bSwgY2hpbGQtPnN5bSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaAppbmRleCA2MDg0NTI1Li5hMTk1OTg2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZXhwci5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKQEAgLTcxLDE0ICs3MSwxMiBAQAogc3RydWN0IHN5bWJvbCB7CiAJc3RydWN0IHN5bWJvbCAqbmV4dDsKIAljaGFyICpuYW1lOwotCWNoYXIgKmhlbHA7CiAJZW51bSBzeW1ib2xfdHlwZSB0eXBlOwogCXN0cnVjdCBzeW1ib2xfdmFsdWUgY3VycjsKIAlzdHJ1Y3Qgc3ltYm9sX3ZhbHVlIGRlZls0XTsKIAl0cmlzdGF0ZSB2aXNpYmxlOwogCWludCBmbGFnczsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0Jc3RydWN0IGV4cHIgKmRlcCwgKmRlcDI7CiAJc3RydWN0IGV4cHJfdmFsdWUgcmV2X2RlcDsKIH07CiAKQEAgLTEzOSw3ICsxMzcsNyBAQAogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvbXB0OwogCXN0cnVjdCBleHByICpkZXA7CiAJdW5zaWduZWQgaW50IGZsYWdzOwotCS8vY2hhciAqaGVscDsKKwljaGFyICpoZWxwOwogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCBsaW5lbm87CiAJdm9pZCAqZGF0YTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKaW5kZXggNjFkODE2Ni4uMjYyOTA4YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTM4LDkgKzM4LDYgQEAKIHN0YXRpYyBnYm9vbGVhbiBzaG93X2RlYnVnID0gRkFMU0U7CiBzdGF0aWMgZ2Jvb2xlYW4gcmVzaXplYWJsZSA9IEZBTFNFOwogCi1zdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0KLSAgICBOXygiU29ycnksIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiB5ZXQuXG4iKTsKLQogR3RrV2lkZ2V0ICptYWluX3duZCA9IE5VTEw7CiBHdGtXaWRnZXQgKnRyZWUxX3cgPSBOVUxMOwkvLyBsZWZ0ICBmcmFtZQogR3RrV2lkZ2V0ICp0cmVlMl93ID0gTlVMTDsJLy8gcmlnaHQgZnJhbWUKQEAgLTQ2MiwxMiArNDU5LDkgQEAKIAlHdGtUZXh0SXRlciBzdGFydCwgZW5kOwogCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKIAlnY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpoZWxwID0gXyhub2hlbHBfdGV4dCk7CisJY29uc3QgY2hhciAqaGVscDsKIAotCWlmICghbWVudS0+c3ltKQotCQloZWxwID0gIiI7Ci0JZWxzZSBpZiAobWVudS0+c3ltLT5oZWxwKQotCQloZWxwID0gXyhtZW51LT5zeW0tPmhlbHApOworCWhlbHAgPSBfKG1lbnVfZ2V0X2hlbHAobWVudSkpOwogCiAJaWYgKG1lbnUtPnN5bSAmJiBtZW51LT5zeW0tPm5hbWUpCiAJCW5hbWUgPSBnX3N0cmR1cF9wcmludGYoXyhtZW51LT5zeW0tPm5hbWUpKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYyBiL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYwppbmRleCAxMWY3ZGFiLi42ZWI3MmE3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCkBAIC0xNzAsOCArMTcwLDggQEAKIAkJICAgICBtZW51LT5maWxlID09IE5VTEwgPyAiUm9vdCBNZW51IiA6IG1lbnUtPmZpbGUtPm5hbWUsCiAJCSAgICAgbWVudS0+bGluZW5vKTsKIAotCWlmIChtZW51LT5zeW0gIT0gTlVMTCAmJiBtZW51LT5zeW0tPmhlbHAgIT0gTlVMTCkKLQkJbWVzc2FnZV9fYWRkKG1lbnUtPnN5bS0+aGVscCwgbWVudS0+c3ltLT5uYW1lLAorCWlmIChtZW51LT5zeW0gIT0gTlVMTCAmJiBtZW51X2hhc19oZWxwKG1lbnUpKQorCQltZXNzYWdlX19hZGQobWVudV9nZXRfaGVscChtZW51KSwgbWVudS0+c3ltLT5uYW1lLAogCQkJICAgICBtZW51LT5maWxlID09IE5VTEwgPyAiUm9vdCBNZW51IiA6IG1lbnUtPmZpbGUtPm5hbWUsCiAJCQkgICAgIG1lbnUtPmxpbmVubyk7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaCBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAppbmRleCAxNTAzMDc3Li40ZDA5ZjZkIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCkBAIC0xNSw2ICsxNSw4IEBACiBQKG1lbnVfZ2V0X3Byb21wdCxjb25zdCBjaGFyICosKHN0cnVjdCBtZW51ICptZW51KSk7CiBQKG1lbnVfZ2V0X3Jvb3RfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOwogUChtZW51X2dldF9wYXJlbnRfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2hhc19oZWxwLGJvb2wsKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X2hlbHAsY29uc3QgY2hhciAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOwogCiAvKiBzeW1ib2wuYyAqLwogUChzeW1ib2xfaGFzaCxzdHJ1Y3Qgc3ltYm9sICosW1NZTUJPTF9IQVNIU0laRV0pOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwppbmRleCBkMmMyYTQyLi5iYzU4NTRlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtNzI1LDExICs3MjUsMTEgQEAKIAlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOwogCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKIAotCWlmIChzeW0tPmhlbHApCisJaWYgKG1lbnVfaGFzX2hlbHAobWVudSkpCiAJewogCQlpZiAoc3ltLT5uYW1lKSB7CiAJCQlzdHJfcHJpbnRmKCZoZWxwLCAiQ09ORklHXyVzOlxuXG4iLCBzeW0tPm5hbWUpOwotCQkJc3RyX2FwcGVuZCgmaGVscCwgXyhzeW0tPmhlbHApKTsKKwkJCXN0cl9hcHBlbmQoJmhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOwogCQkJc3RyX2FwcGVuZCgmaGVscCwgIlxuIik7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKaW5kZXggZjE0YWVhYy4uZjlkMGQ5MSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCkBAIC00MTcsMyArNDE3LDE1IEBACiAJcmV0dXJuIG1lbnU7CiB9CiAKK2Jvb2wgbWVudV9oYXNfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlyZXR1cm4gbWVudS0+aGVscCAhPSBOVUxMOworfQorCitjb25zdCBjaGFyICptZW51X2dldF9oZWxwKHN0cnVjdCBtZW51ICptZW51KQoreworCWlmIChtZW51LT5oZWxwKQorCQlyZXR1cm4gbWVudS0+aGVscDsKKwllbHNlCisJCXJldHVybiAiIjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwppbmRleCBmMmEyM2E5Li5lNGVlYjU5YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpAQCAtMTA0MSw3ICsxMDQxLDcgQEAKIAkJaWYgKHNob3dEZWJ1ZygpKQogCQkJZGVidWcgPSBkZWJ1Z19pbmZvKHN5bSk7CiAKLQkJaGVscCA9IHByaW50X2ZpbHRlcihfKHN5bS0+aGVscCkpOworCQloZWxwID0gcHJpbnRfZmlsdGVyKF8obWVudV9nZXRfaGVscChtZW51KSkpOwogCX0gZWxzZSBpZiAobWVudS0+cHJvbXB0KSB7CiAJCWhlYWQgKz0gIjxiaWc+PGI+IjsKIAkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhtZW51LT5wcm9tcHQtPnRleHQpKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKaW5kZXggOWEwNmI2Ny4uZWMyMWRiNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKQEAgLTE3MjIsNyArMTcyMiw3IEBACiAgIGNhc2UgODM6CiAKICAgICB7Ci0JY3VycmVudF9lbnRyeS0+c3ltLT5oZWxwID0gKHl5dnNwWzBdLnN0cmluZyk7CisJY3VycmVudF9lbnRyeS0+aGVscCA9ICh5eXZzcFswXS5zdHJpbmcpOwogO30KICAgICBicmVhazsKIApAQCAtMjI4MCwxMSArMjI4MCwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKHN5bS0+aGVscCkgewotCQlpbnQgbGVuID0gc3RybGVuKHN5bS0+aGVscCk7Ci0JCXdoaWxlIChzeW0tPmhlbHBbLS1sZW5dID09ICdcbicpCi0JCQlzeW0tPmhlbHBbbGVuXSA9IDA7Ci0JCWZwcmludGYob3V0LCAiICBoZWxwXG4lc1xuIiwgc3ltLT5oZWxwKTsKKwlpZiAobWVudS0+aGVscCkgeworCQlpbnQgbGVuID0gc3RybGVuKG1lbnUtPmhlbHApOworCQl3aGlsZSAobWVudS0+aGVscFstLWxlbl0gPT0gJ1xuJykKKwkJCW1lbnUtPmhlbHBbbGVuXSA9IDA7CisJCWZwcmludGYob3V0LCAiICBoZWxwXG4lc1xuIiwgbWVudS0+aGVscCk7CiAJfQogCWZwdXRjKCdcbicsIG91dCk7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYueSBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CmluZGV4IDkyZWIwMmIuLjc5ZGI0Y2YgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CkBAIC00MDIsNyArNDAyLDcgQEAKIAogaGVscDogaGVscF9zdGFydCBUX0hFTFBURVhUCiB7Ci0JY3VycmVudF9lbnRyeS0+c3ltLT5oZWxwID0gJDI7CisJY3VycmVudF9lbnRyeS0+aGVscCA9ICQyOwogfTsKIAogLyogZGVwZW5kcyBvcHRpb24gKi8KQEAgLTY0OSwxMSArNjQ5LDExIEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoc3ltLT5oZWxwKSB7Ci0JCWludCBsZW4gPSBzdHJsZW4oc3ltLT5oZWxwKTsKLQkJd2hpbGUgKHN5bS0+aGVscFstLWxlbl0gPT0gJ1xuJykKLQkJCXN5bS0+aGVscFtsZW5dID0gMDsKLQkJZnByaW50ZihvdXQsICIgIGhlbHBcbiVzXG4iLCBzeW0tPmhlbHApOworCWlmIChtZW51LT5oZWxwKSB7CisJCWludCBsZW4gPSBzdHJsZW4obWVudS0+aGVscCk7CisJCXdoaWxlIChtZW51LT5oZWxwWy0tbGVuXSA9PSAnXG4nKQorCQkJbWVudS0+aGVscFtsZW5dID0gMDsKKwkJZnByaW50ZihvdXQsICIgIGhlbHBcbiVzXG4iLCBtZW51LT5oZWxwKTsKIAl9CiAJZnB1dGMoJ1xuJywgb3V0KTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCBmNjQ2MzgxLi44YTA5MDIxIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0yOTAsNiArMjkwLDE0IEBACiAJcmV0dXJuIDE7CiB9CiAKKy8qIGxvb2tzIGxpa2U6ICJhY3BpOkFDUEkwMDAzIG9yIGFjcGk6UE5QMEMwQiIgb3IgImFjcGk6TE5YVklERU8iICovCitzdGF0aWMgaW50IGRvX2FjcGlfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlzcHJpbnRmKGFsaWFzLCAiYWNwaSo6JXM6IiwgaWQtPmlkKTsKKwlyZXR1cm4gMTsKK30KKwogLyogbG9va3MgbGlrZTogInBucDpkRCIgKi8KIHN0YXRpYyBpbnQgZG9fcG5wX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKQEAgLTU1MSw2ICs1NTksMTAgQEAKIAkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsCiAJCQkgc2l6ZW9mKHN0cnVjdCBzZXJpb19kZXZpY2VfaWQpLCAic2VyaW8iLAogCQkJIGRvX3NlcmlvX2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfYWNwaV9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsCisJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZV9pZCksICJhY3BpIiwKKwkJCSBkb19hY3BpX2VudHJ5LCBtb2QpOwogCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfcG5wX2RldmljZV90YWJsZSIpKQogCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwKIAkJCSBzaXplb2Yoc3RydWN0IHBucF9kZXZpY2VfaWQpLCAicG5wIiwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCA1YWI3OTE0Li5lZTU4ZGVkIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC0yMyw2ICsyMyw4IEBACiBzdGF0aWMgaW50IGFsbF92ZXJzaW9ucyA9IDA7CiAvKiBJZiB3ZSBhcmUgbW9kcG9zdGluZyBleHRlcm5hbCBtb2R1bGUgc2V0IHRvIDEgKi8KIHN0YXRpYyBpbnQgZXh0ZXJuYWxfbW9kdWxlID0gMDsKKy8qIFdhcm4gYWJvdXQgc2VjdGlvbiBtaXNtYXRjaCBpbiB2bWxpbnV4IGlmIHNldCB0byAxICovCitzdGF0aWMgaW50IHZtbGludXhfc2VjdGlvbl93YXJuaW5ncyA9IDE7CiAvKiBPbmx5IHdhcm4gYWJvdXQgdW5yZXNvbHZlZCBzeW1ib2xzICovCiBzdGF0aWMgaW50IHdhcm5fdW5yZXNvbHZlZCA9IDA7CiAvKiBIb3cgYSBzeW1ib2wgaXMgZXhwb3J0ZWQgKi8KQEAgLTU4NCwxMyArNTg2LDYxIEBACiAgICAgICAgIHJldHVybiBtZW1jbXAocyArIHNsZW4gLSBzdWJsZW4sIHN1Yiwgc3VibGVuKTsKIH0KIAorLyoKKyAqIEZ1bmN0aW9ucyB1c2VkIG9ubHkgZHVyaW5nIG1vZHVsZSBpbml0IGlzIG1hcmtlZCBfX2luaXQgYW5kIGlzIHN0b3JlZCBpbgorICogYSAuaW5pdC50ZXh0IHNlY3Rpb24uIExpa2V3aXNlIGRhdGEgaXMgbWFya2VkIF9faW5pdGRhdGEgYW5kIHN0b3JlZCBpbgorICogYSAuaW5pdC5kYXRhIHNlY3Rpb24uCisgKiBJZiB0aGlzIHNlY3Rpb24gaXMgb25lIG9mIHRoZXNlIHNlY3Rpb25zIHJldHVybiAxCisgKiBTZWUgaW5jbHVkZS9saW51eC9pbml0LmggZm9yIHRoZSBkZXRhaWxzCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zZWN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiLmluaXQiKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZiAoc3RybmNtcChuYW1lLCAiLmluaXQuIiwgc3RybGVuKCIuaW5pdC4iKSkgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbnMgdXNlZCBvbmx5IGR1cmluZyBtb2R1bGUgZXhpdCBpcyBtYXJrZWQgX19leGl0IGFuZCBpcyBzdG9yZWQgaW4KKyAqIGEgLmV4aXQudGV4dCBzZWN0aW9uLiBMaWtld2lzZSBkYXRhIGlzIG1hcmtlZCBfX2V4aXRkYXRhIGFuZCBzdG9yZWQgaW4KKyAqIGEgLmV4aXQuZGF0YSBzZWN0aW9uLgorICogSWYgdGhpcyBzZWN0aW9uIGlzIG9uZSBvZiB0aGVzZSBzZWN0aW9ucyByZXR1cm4gMQorICogU2VlIGluY2x1ZGUvbGludXgvaW5pdC5oIGZvciB0aGUgZGV0YWlscworICoqLworc3RhdGljIGludCBleGl0X3NlY3Rpb24oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIuZXhpdC50ZXh0IikgPT0gMCkKKwkJcmV0dXJuIDE7CisJaWYgKHN0cmNtcChuYW1lLCAiLmV4aXQuZGF0YSIpID09IDApCisJCXJldHVybiAxOworCXJldHVybiAwOworCit9CisKKy8qCisgKiBEYXRhIHNlY3Rpb25zIGFyZSBuYW1lZCBsaWtlIHRoaXM6CisgKiAuZGF0YSB8IC5kYXRhLnJlbCB8IC5kYXRhLnJlbC4qCisgKiBSZXR1cm4gMSBpZiB0aGUgc3BlY2lmaWVkIHNlY3Rpb24gaXMgYSBkYXRhIHNlY3Rpb24KKyAqLworc3RhdGljIGludCBkYXRhX3NlY3Rpb24oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoKHN0cmNtcChuYW1lLCAiLmRhdGEiKSA9PSAwKSB8fAorCSAgICAoc3RyY21wKG5hbWUsICIuZGF0YS5yZWwiKSA9PSAwKSB8fAorCSAgICAoc3RybmNtcChuYW1lLCAiLmRhdGEucmVsLiIsIHN0cmxlbigiLmRhdGEucmVsLiIpKSA9PSAwKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBXaGl0ZWxpc3QgdG8gYWxsb3cgY2VydGFpbiByZWZlcmVuY2VzIHRvIHBhc3Mgd2l0aCBubyB3YXJuaW5nLgogICoKICAqIFBhdHRlcm4gMDoKICAqICAgRG8gbm90IHdhcm4gaWYgZnVudGlvbi9kYXRhIGFyZSBtYXJrZWQgd2l0aCBfX2luaXRfcmVmb2svX19pbml0ZGF0YV9yZWZvay4KICAqICAgVGhlIHBhdHRlcm4gaXMgaWRlbnRpZmllZCBieToKLSAqICAgZnJvbXNlYyA9IC50ZXh0LmluaXQucmVmb2sgfCAuZGF0YS5pbml0LnJlZm9rCisgKiAgIGZyb21zZWMgPSAudGV4dC5pbml0LnJlZm9rKiB8IC5kYXRhLmluaXQucmVmb2sqCiAgKgogICogUGF0dGVybiAxOgogICogICBJZiBhIG1vZHVsZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgX19pbml0ZGF0YSBhbmQgcGVybWlzc2lvbnM9MApAQCAtNjA4LDggKzY1OCw4IEBACiAgKiAgIFRoZXNlIGZ1bmN0aW9ucyBtYXkgb2Z0ZW4gYmUgbWFya2VkIF9faW5pdCBhbmQgd2UgZG8gbm90IHdhbnQgdG8KICAqICAgd2FybiBoZXJlLgogICogICB0aGUgcGF0dGVybiBpcyBpZGVudGlmaWVkIGJ5OgotICogICB0b3NlYyAgID0gLmluaXQudGV4dCB8IC5leGl0LnRleHQgfCAuaW5pdC5kYXRhCi0gKiAgIGZyb21zZWMgPSAuZGF0YSB8IC5kYXRhLnJlbCB8IC5kYXRhLnJlbC4qCisgKiAgIHRvc2VjICAgPSBpbml0IG9yIGV4aXQgc2VjdGlvbgorICogICBmcm9tc2VjID0gZGF0YSBzZWN0aW9uCiAgKiAgIGF0c3ltID0gKmRyaXZlciwgKl90ZW1wbGF0ZSwgKl9zaHQsICpfb3BzLCAqX3Byb2JlLCAqcHJvYmVfb25lLCAqX2NvbnNvbGUsICpfdGltZXIKICAqCiAgKiBQYXR0ZXJuIDM6CkBAIC02MjUsMTIgKzY3NSwxOCBAQAogICogICBUaGlzIHBhdHRlcm4gaXMgaWRlbnRpZmllZCBieQogICogICByZWZzeW1uYW1lID0gX19pbml0X2JlZ2luLCBfc2luaXR0ZXh0LCBfZWluaXR0ZXh0CiAgKgorICogUGF0dGVybiA1OgorICogICBYdGVuc2EgdXNlcyBsaXRlcmFsIHNlY3Rpb25zIGZvciBjb25zdGFudHMgdGhhdCBhcmUgYWNjZXNzZWQgUEMtcmVsYXRpdmUuCisgKiAgIExpdGVyYWwgc2VjdGlvbnMgbWF5IHNhZmVseSByZWZlcmVuY2UgdGhlaXIgdGV4dCBzZWN0aW9ucy4KKyAqICAgKE5vdGUgdGhhdCB0aGUgbmFtZSBmb3IgdGhlIGxpdGVyYWwgc2VjdGlvbiBvbWl0cyBhbnkgdHJhaWxpbmcgJy50ZXh0JykKKyAqICAgdG9zZWMgPSA8c2VjdGlvbj5bLnRleHRdCisgKiAgIGZyb21zZWMgPSA8c2VjdGlvbj4ubGl0ZXJhbAogICoqLwogc3RhdGljIGludCBzZWNyZWZfd2hpdGVsaXN0KGNvbnN0IGNoYXIgKm1vZG5hbWUsIGNvbnN0IGNoYXIgKnRvc2VjLAogCQkJICAgIGNvbnN0IGNoYXIgKmZyb21zZWMsIGNvbnN0IGNoYXIgKmF0c3ltLAogCQkJICAgIGNvbnN0IGNoYXIgKnJlZnN5bW5hbWUpCiB7Ci0JaW50IGYxID0gMSwgZjIgPSAxOworCWludCBsZW47CiAJY29uc3QgY2hhciAqKnM7CiAJY29uc3QgY2hhciAqcGF0MnN5bVtdID0gewogCQkiZHJpdmVyIiwKQEAgLTY1MiwzNiArNzA4LDIxIEBACiAJfTsKIAogCS8qIENoZWNrIGZvciBwYXR0ZXJuIDAgKi8KLQlpZiAoKHN0cmNtcChmcm9tc2VjLCAiLnRleHQuaW5pdC5yZWZvayIpID09IDApIHx8Ci0JICAgIChzdHJjbXAoZnJvbXNlYywgIi5kYXRhLmluaXQucmVmb2siKSA9PSAwKSkKKwlpZiAoKHN0cm5jbXAoZnJvbXNlYywgIi50ZXh0LmluaXQucmVmb2siLCBzdHJsZW4oIi50ZXh0LmluaXQucmVmb2siKSkgPT0gMCkgfHwKKwkgICAgKHN0cm5jbXAoZnJvbXNlYywgIi5kYXRhLmluaXQucmVmb2siLCBzdHJsZW4oIi5kYXRhLmluaXQucmVmb2siKSkgPT0gMCkpCiAJCXJldHVybiAxOwogCiAJLyogQ2hlY2sgZm9yIHBhdHRlcm4gMSAqLwotCWlmIChzdHJjbXAodG9zZWMsICIuaW5pdC5kYXRhIikgIT0gMCkKLQkJZjEgPSAwOwotCWlmIChzdHJuY21wKGZyb21zZWMsICIuZGF0YSIsIHN0cmxlbigiLmRhdGEiKSkgIT0gMCkKLQkJZjEgPSAwOwotCWlmIChzdHJuY21wKGF0c3ltLCAiX19wYXJhbSIsIHN0cmxlbigiX19wYXJhbSIpKSAhPSAwKQotCQlmMSA9IDA7Ci0KLQlpZiAoZjEpCi0JCXJldHVybiBmMTsKKwlpZiAoKHN0cmNtcCh0b3NlYywgIi5pbml0LmRhdGEiKSA9PSAwKSAmJgorCSAgICAoc3RybmNtcChmcm9tc2VjLCAiLmRhdGEiLCBzdHJsZW4oIi5kYXRhIikpID09IDApICYmCisJICAgIChzdHJuY21wKGF0c3ltLCAiX19wYXJhbSIsIHN0cmxlbigiX19wYXJhbSIpKSA9PSAwKSkKKwkJcmV0dXJuIDE7CiAKIAkvKiBDaGVjayBmb3IgcGF0dGVybiAyICovCi0JaWYgKChzdHJjbXAodG9zZWMsICIuaW5pdC50ZXh0IikgIT0gMCkgJiYKLQkgICAgKHN0cmNtcCh0b3NlYywgIi5leGl0LnRleHQiKSAhPSAwKSAmJgotCSAgICAoc3RyY21wKHRvc2VjLCAiLmluaXQuZGF0YSIpICE9IDApKQotCQlmMiA9IDA7Ci0JaWYgKChzdHJjbXAoZnJvbXNlYywgIi5kYXRhIikgIT0gMCkgJiYKLQkgICAgKHN0cmNtcChmcm9tc2VjLCAiLmRhdGEucmVsIikgIT0gMCkgJiYKLQkgICAgKHN0cm5jbXAoZnJvbXNlYywgIi5kYXRhLnJlbC4iLCBzdHJsZW4oIi5kYXRhLnJlbC4iKSkgIT0gMCkpCi0JCWYyID0gMDsKLQotCWZvciAocyA9IHBhdDJzeW07ICpzOyBzKyspCi0JCWlmIChzdHJyY21wKGF0c3ltLCAqcykgPT0gMCkKLQkJCWYxID0gMTsKLQlpZiAoZjEgJiYgZjIpCi0JCXJldHVybiAxOworCWlmICgoaW5pdF9zZWN0aW9uKHRvc2VjKSB8fCBleGl0X3NlY3Rpb24odG9zZWMpKSAmJiBkYXRhX3NlY3Rpb24oZnJvbXNlYykpCisJCWZvciAocyA9IHBhdDJzeW07ICpzOyBzKyspCisJCQlpZiAoc3RycmNtcChhdHN5bSwgKnMpID09IDApCisJCQkJcmV0dXJuIDE7CiAKIAkvKiBDaGVjayBmb3IgcGF0dGVybiAzICovCiAJaWYgKChzdHJjbXAoZnJvbXNlYywgIi50ZXh0LmhlYWQiKSA9PSAwKSAmJgpAQCAtNjk0LDYgKzczNSwxNSBAQAogCQlpZiAoc3RyY21wKHJlZnN5bW5hbWUsICpzKSA9PSAwKQogCQkJcmV0dXJuIDE7CiAKKwkvKiBDaGVjayBmb3IgcGF0dGVybiA1ICovCisJaWYgKHN0cnJjbXAodG9zZWMsICIudGV4dCIpID09IDApCisJCWxlbiA9IHN0cmxlbih0b3NlYykgLSBzdHJsZW4oIi50ZXh0Iik7CisJZWxzZQorCQlsZW4gPSBzdHJsZW4odG9zZWMpOworCWlmICgoc3RybmNtcCh0b3NlYywgZnJvbXNlYywgbGVuKSA9PSAwKSAmJiAoc3RybGVuKGZyb21zZWMpID4gbGVuKSAmJgorCSAgICAoc3RyY21wKGZyb21zZWMgKyBsZW4sICIubGl0ZXJhbCIpID09IDApKQorCQlyZXR1cm4gMTsKKwogCXJldHVybiAwOwogfQogCkBAIC04MjIsOSArODcyLDkgQEAKIAkJcmVmc3ltbmFtZSA9IGVsZi0+c3RydGFiICsgcmVmc3ltLT5zdF9uYW1lOwogCiAJLyogY2hlY2sgd2hpdGVsaXN0IC0gd2UgbWF5IGlnbm9yZSBpdCAqLwotCWlmIChiZWZvcmUgJiYKLQkgICAgc2VjcmVmX3doaXRlbGlzdChtb2RuYW1lLCBzZWNuYW1lLCBmcm9tc2VjLAotCQkJICAgICBlbGYtPnN0cnRhYiArIGJlZm9yZS0+c3RfbmFtZSwgcmVmc3ltbmFtZSkpCisJaWYgKHNlY3JlZl93aGl0ZWxpc3QobW9kbmFtZSwgc2VjbmFtZSwgZnJvbXNlYywKKwkJCSAgICAgYmVmb3JlID8gZWxmLT5zdHJ0YWIgKyBiZWZvcmUtPnN0X25hbWUgOiAiIiwKKwkgICAgICAgICAgICAgICAgICAgICByZWZzeW1uYW1lKSkKIAkJcmV0dXJuOwogCiAJaWYgKGJlZm9yZSAmJiBhZnRlcikgewpAQCAtMTA3Nyw2ICsxMTI3LDggQEAKIAkJIi5zbXBfbG9ja3MiLAogCQkiLnN0YWIiLAogCQkiLm02OGtfZml4dXAiLAorCQkiLnh0LnByb3AiLAkJLyogeHRlbnNhIGluZm9ybWF0aW9uYWwgc2VjdGlvbiAqLworCQkiLnh0LmxpdCIsCQkvKiB4dGVuc2EgaW5mb3JtYXRpb25hbCBzZWN0aW9uICovCiAJCU5VTEwKIAl9OwogCS8qIFN0YXJ0IG9mIHNlY3Rpb24gbmFtZXMgKi8KQEAgLTExMDYsMjEgKzExNTgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIEZ1bmN0aW9ucyB1c2VkIG9ubHkgZHVyaW5nIG1vZHVsZSBpbml0IGlzIG1hcmtlZCBfX2luaXQgYW5kIGlzIHN0b3JlZCBpbgotICogYSAuaW5pdC50ZXh0IHNlY3Rpb24uIExpa2V3aXNlIGRhdGEgaXMgbWFya2VkIF9faW5pdGRhdGEgYW5kIHN0b3JlZCBpbgotICogYSAuaW5pdC5kYXRhIHNlY3Rpb24uCi0gKiBJZiB0aGlzIHNlY3Rpb24gaXMgb25lIG9mIHRoZXNlIHNlY3Rpb25zIHJldHVybiAxCi0gKiBTZWUgaW5jbHVkZS9saW51eC9pbml0LmggZm9yIHRoZSBkZXRhaWxzCi0gKiovCi1zdGF0aWMgaW50IGluaXRfc2VjdGlvbihjb25zdCBjaGFyICpuYW1lKQotewotCWlmIChzdHJjbXAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJcmV0dXJuIDE7Ci0JaWYgKHN0cm5jbXAobmFtZSwgIi5pbml0LiIsIHN0cmxlbigiLmluaXQuIikpID09IDApCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQogCiAvKgogICogSWRlbnRpZnkgc2VjdGlvbnMgZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIGEgLmluaXQgc2VjdGlvbiBpcyBPSy4KQEAgLTExNzgsMjMgKzEyMTUsNiBAQAogfQogCiAvKgotICogRnVuY3Rpb25zIHVzZWQgb25seSBkdXJpbmcgbW9kdWxlIGV4aXQgaXMgbWFya2VkIF9fZXhpdCBhbmQgaXMgc3RvcmVkIGluCi0gKiBhIC5leGl0LnRleHQgc2VjdGlvbi4gTGlrZXdpc2UgZGF0YSBpcyBtYXJrZWQgX19leGl0ZGF0YSBhbmQgc3RvcmVkIGluCi0gKiBhIC5leGl0LmRhdGEgc2VjdGlvbi4KLSAqIElmIHRoaXMgc2VjdGlvbiBpcyBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMgcmV0dXJuIDEKLSAqIFNlZSBpbmNsdWRlL2xpbnV4L2luaXQuaCBmb3IgdGhlIGRldGFpbHMKLSAqKi8KLXN0YXRpYyBpbnQgZXhpdF9zZWN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaWYgKHN0cmNtcChuYW1lLCAiLmV4aXQudGV4dCIpID09IDApCi0JCXJldHVybiAxOwotCWlmIChzdHJjbXAobmFtZSwgIi5leGl0LmRhdGEiKSA9PSAwKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLQotfQotCi0vKgogICogSWRlbnRpZnkgc2VjdGlvbnMgZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIGEgLmV4aXQgc2VjdGlvbiBpcyBPSy4KICAqLwogc3RhdGljIGludCBleGl0X3NlY3Rpb25fcmVmX29rKGNvbnN0IGNoYXIgKm5hbWUpCkBAIC0xMjU3LDggKzEyNzcsMTAgQEAKIAkJaGFuZGxlX21vZHZlcnNpb25zKG1vZCwgJmluZm8sIHN5bSwgc3ltbmFtZSk7CiAJCWhhbmRsZV9tb2RkZXZ0YWJsZShtb2QsICZpbmZvLCBzeW0sIHN5bW5hbWUpOwogCX0KLQljaGVja19zZWNfcmVmKG1vZCwgbW9kbmFtZSwgJmluZm8sIGluaXRfc2VjdGlvbiwgaW5pdF9zZWN0aW9uX3JlZl9vayk7Ci0JY2hlY2tfc2VjX3JlZihtb2QsIG1vZG5hbWUsICZpbmZvLCBleGl0X3NlY3Rpb24sIGV4aXRfc2VjdGlvbl9yZWZfb2spOworCWlmIChpc192bWxpbnV4KG1vZG5hbWUpICYmIHZtbGludXhfc2VjdGlvbl93YXJuaW5ncykgeworCQljaGVja19zZWNfcmVmKG1vZCwgbW9kbmFtZSwgJmluZm8sIGluaXRfc2VjdGlvbiwgaW5pdF9zZWN0aW9uX3JlZl9vayk7CisJCWNoZWNrX3NlY19yZWYobW9kLCBtb2RuYW1lLCAmaW5mbywgZXhpdF9zZWN0aW9uLCBleGl0X3NlY3Rpb25fcmVmX29rKTsKKwl9CiAKIAl2ZXJzaW9uID0gZ2V0X21vZGluZm8oaW5mby5tb2RpbmZvLCBpbmZvLm1vZGluZm9fbGVuLCAidmVyc2lvbiIpOwogCWlmICh2ZXJzaW9uKQpAQCAtMTYyNiw3ICsxNjQ4LDcgQEAKIAlpbnQgb3B0OwogCWludCBlcnI7CiAKLQl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaTpJOm1vOmF3IikpICE9IC0xKSB7CisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImk6STptc286YXciKSkgIT0gLTEpIHsKIAkJc3dpdGNoKG9wdCkgewogCQkJY2FzZSAnaSc6CiAJCQkJa2VybmVsX3JlYWQgPSBvcHRhcmc7CkBAIC0xNjQ0LDYgKzE2NjYsOSBAQAogCQkJY2FzZSAnYSc6CiAJCQkJYWxsX3ZlcnNpb25zID0gMTsKIAkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgorCQkJCXZtbGludXhfc2VjdGlvbl93YXJuaW5ncyA9IDA7CisJCQkJYnJlYWs7CiAJCQljYXNlICd3JzoKIAkJCQl3YXJuX3VucmVzb2x2ZWQgPSAxOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy92ZXJfbGludXggYi9zY3JpcHRzL3Zlcl9saW51eAppbmRleCA3Mjg3NmRmLi44ZjhkZjkzMSAxMDA3NTUKLS0tIGEvc2NyaXB0cy92ZXJfbGludXgKKysrIGIvc2NyaXB0cy92ZXJfbGludXgKQEAgLTY2LDggKzY2LDggQEAKICdOUj09MXtwcmludCAibmZzLXV0aWxzICAgICAgICAgICAgICIsICRORn0nCiAKIGxzIC1sIGBsZGQgL2Jpbi9zaCB8IGF3ayAnL2xpYmMve3ByaW50ICQzfSdgIHwgc2VkIFwKLS1lICdzL1wuc28kLy8nIHwgYXdrIC1GJ1suLV0nICAgJ3twcmludCAiTGludXggQyBMaWJyYXJ5ICAgICAgICAiIFwKLSQoTkYtMikiLiIkKE5GLTEpIi4iJE5GfScKKy1lICdzL1wuc28kLy8nIHwgc2VkIC1lICdzLz4vLycgfCBcCithd2sgLUYnWy4tXScgJ3twcmludCAiTGludXggQyBMaWJyYXJ5ICAgICAgICAiJChORi0xKSIuIiRORn0nCiAKIGxkZCAtdiA+IC9kZXYvbnVsbCAyPiYxICYmIGxkZCAtdiB8fCBsZGQgLS12ZXJzaW9uIHxoZWFkIC1uIDEgfCBhd2sgXAogJ05SPT0xe3ByaW50ICJEeW5hbWljIGxpbmtlciAobGRkKSAgIiwgJE5GfScKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCBiNWYwMTdmLi4wYWUwMzJmMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtMjQxNyw4ICsyNDE3LDEwIEBACiAKIAljYWNoZS0+dHlwZSA9IE5FVExCTF9DQUNIRV9UX01MUzsKIAlpZiAoZWJpdG1hcF9jcHkoJmNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFswXS5jYXQsCi0JCQkmY3R4LT5yYW5nZS5sZXZlbFswXS5jYXQpICE9IDApCisJCQkmY3R4LT5yYW5nZS5sZXZlbFswXS5jYXQpICE9IDApIHsKKwkJa2ZyZWUoY2FjaGUpOwogCQlyZXR1cm47CisJfQogCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFsxXS5jYXQuaGlnaGJpdCA9CiAJCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFswXS5jYXQuaGlnaGJpdDsKIAljYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMV0uY2F0Lm5vZGUgPQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC94ZnJtLmMgYi9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYwppbmRleCBiZDhkMWVmLi5iYTcxNWY0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJKmN0eHAgPSBjdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSArCi0JCQkgICAgICB1Y3R4LT5jdHhfbGVuLAorCQkJICAgICAgdWN0eC0+Y3R4X2xlbiArIDEsCiAJCQkgICAgICBHRlBfS0VSTkVMKTsKIAogCWlmICghY3R4KQpAQCAtMjI5LDYgKzIyOSw3IEBACiAJbWVtY3B5KGN0eC0+Y3R4X3N0ciwKIAkgICAgICAgdWN0eCsxLAogCSAgICAgICBjdHgtPmN0eF9sZW4pOworCWN0eC0+Y3R4X3N0cltjdHgtPmN0eF9sZW5dID0gMDsKIAlyYyA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKGN0eC0+Y3R4X3N0ciwKIAkJCQkgICAgIGN0eC0+Y3R4X2xlbiwKIAkJCQkgICAgICZjdHgtPmN0eF9zaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2J0ODd4LmMgYi9zb3VuZC9wY2kvYnQ4N3guYwppbmRleCA2NTIzYmEwLi4xODhjN2NmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYnQ4N3guYworKysgYi9zb3VuZC9wY2kvYnQ4N3guYwpAQCAtNzgxLDYgKzc4MSw4IEBACiAJQlRfREVWSUNFKFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OSwgMHgwMDcwLCAweDEzZWIsIDMyMDAwKSwKIAkvKiBWaWV3Y2FzdCBPc3ByZXkgMjAwICovCiAJQlRfREVWSUNFKFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OCwgMHgwMDcwLCAweGZmMDEsIDQ0MTAwKSwKKwkvKiBWaWV3Y2FzdCBPc3ByZXkgNDQwIChyYXRlIGlzIGNvbmZpZ3VyYWJsZSB2aWEgZ3BpbykgKi8KKwlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDAwNzAsIDB4ZmYwNywgMzIwMDApLAogCS8qIEFUSSBUVi1Xb25kZXIgKi8KIAlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDEwMDIsIDB4MDAwMSwgMzIwMDApLAogCS8qIExlYWR0ZWsgV2luZmFzdCB0diAyMDAweHAgZGVsdXggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LWFjOTcuYwppbmRleCAxMjlkODUxLi5kZDE0YWJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1hYzk3LmMKKysrIGIvc291bmQvc29jL3B4YS9weGEyeHgtYWM5Ny5jCkBAIC0xNjAsOSArMTYwLDkgQEAKIAlnc3JfYml0cyA9IDA7CiAjaWZkZWYgQ09ORklHX1BYQTI3eAogCS8qIFBYQTI3eCBEZXZlbG9wZXJzIE1hbnVhbCBzZWN0aW9uIDEzLjUuMi4yLjEgKi8KLQlweGFfc2V0X2NrZW4oMSA8PCAzMSwgMSk7CisJcHhhX3NldF9ja2VuKDMxLCAxKTsKIAl1ZGVsYXkoNSk7Ci0JcHhhX3NldF9ja2VuKDEgPDwgMzEsIDApOworCXB4YV9zZXRfY2tlbigzMSwgMCk7CiAJR0NSID0gR0NSX0NPTERfUlNUOwogCXVkZWxheSg1MCk7CiAjZWxzZQo=